v2: Forge Console + Open WebUI artifacts + Docker
- web/: Local chat UI (Express + WS → Codex bridge) - openwebui/: Preset, pipelines, knowledge manifest - Dockerfile + docker-compose.yml - Updated README with 3 frontend options - CLI-agnostic: works with Codex, Claude Code, Kiro, Gemini
This commit is contained in:
74
skills/epics-standards/SKILL.md
Normal file
74
skills/epics-standards/SKILL.md
Normal file
@@ -0,0 +1,74 @@
|
||||
---
|
||||
name: epics-standards
|
||||
description: Create or audit RP Jira epics and linked Aha epics against PM standards. Use when creating new RP epics, creating Aha epics for a target release, checking compliance gaps, or updating epic fields/content to align with the PM standards and Aha workflow.
|
||||
---
|
||||
|
||||
# RP Epic Standards
|
||||
|
||||
Use this skill for `RP` epic creation, Aha epic creation, and compliance audits.
|
||||
|
||||
Primary standard source:
|
||||
`https://reltio.jira.com/wiki/spaces/PM/pages/2688385025/PM+Standards+Epics`
|
||||
|
||||
Workflow source and mapping:
|
||||
- `references/aha-epic-workflow.md`
|
||||
- `references/epic-fields-checklist.md`
|
||||
|
||||
## Workflow
|
||||
|
||||
1. Open the standard page and use it as source of truth.
|
||||
2. Validate/collect required inputs (see Intake below).
|
||||
3. Create/update Jira epic and Aha epic per workflow in `references/aha-epic-workflow.md`.
|
||||
4. Link Jira and Aha (`Aha! Reference` in Jira).
|
||||
5. Audit compliance against `references/epic-fields-checklist.md`.
|
||||
6. If fields are not editable in Jira/Aha, document exact gaps and owner.
|
||||
|
||||
## Intake (Interactive)
|
||||
|
||||
If required fields are not provided in the prompt, ask concise follow-up questions before creating records.
|
||||
|
||||
Minimum required fields to ask for:
|
||||
- Jira epic key (if already created) or request to create one
|
||||
- Aha release (for example `2026.2.0.0`)
|
||||
- Epic short name (Jira/Aha title)
|
||||
- Problem Statement / Why
|
||||
- Solution / What
|
||||
- Persona / Who
|
||||
- Value Statement
|
||||
- Confidence Level
|
||||
- Product, Engineering, and UX leads
|
||||
- Execution Team
|
||||
- Required flags: Doc, Provisioning, UI/UX, Security, Training
|
||||
|
||||
Ask only for missing items. Do not proceed with creation until minimum fields are available.
|
||||
|
||||
## Epic Content Requirements
|
||||
|
||||
Ensure description includes:
|
||||
- Problem Statement / Why
|
||||
- Solution / What
|
||||
- Persona / Who
|
||||
- Value Statement
|
||||
|
||||
Keep summary short and clear for Jira readability.
|
||||
|
||||
## Aha Creation Code
|
||||
|
||||
Use the bundled script:
|
||||
- `scripts/aha_create_epic.py`
|
||||
|
||||
Example:
|
||||
```bash
|
||||
python3 skills/epics-standards/scripts/aha_create_epic.py \
|
||||
--release MDM-R-889 \
|
||||
--name "RDM PrivateLink on AWS" \
|
||||
--description "Tracks Jira epic RP-176273 (https://reltio.jira.com/browse/RP-176273)." \
|
||||
--jira-key RP-176273
|
||||
```
|
||||
|
||||
The script reads Aha credentials from `~/.mcporter/mcporter.json` (`mcpServers.aha.env`).
|
||||
|
||||
## Integration Guardrails
|
||||
|
||||
If the epic is created in Jira first, verify that Aha linkage is present (`Aha! Reference`).
|
||||
If missing, update Jira with the created Aha URL.
|
||||
4
skills/epics-standards/agents/openai.yaml
Normal file
4
skills/epics-standards/agents/openai.yaml
Normal file
@@ -0,0 +1,4 @@
|
||||
interface:
|
||||
display_name: "RP Epic Standards"
|
||||
short_description: "Create and audit RP epics for PM standards"
|
||||
default_prompt: "Use $epics-standards to create or audit linked Jira/Aha epics and ask me for any missing required fields before creating records."
|
||||
55
skills/epics-standards/references/aha-epic-workflow.md
Normal file
55
skills/epics-standards/references/aha-epic-workflow.md
Normal file
@@ -0,0 +1,55 @@
|
||||
# Aha Epic Workflow
|
||||
|
||||
This file captures the expected Aha epic lifecycle and downstream triggers.
|
||||
|
||||
## Idea Management
|
||||
|
||||
1. Customer submits idea in Aha.
|
||||
2. Check voting threshold: `5` unique orgs.
|
||||
3. PM review required (`Needs Review` -> `Reviewed`).
|
||||
4. PM decision:
|
||||
- Accept current release -> `Planned`
|
||||
- Accept next release -> `Future Consideration`
|
||||
- Exists -> `Already Exists`
|
||||
- Need more info -> `Needs More Info` + comment
|
||||
- Reject/later -> `Future Consideration` + comment
|
||||
5. Always add public customer comment after decision.
|
||||
6. Ensure epic relation:
|
||||
- Promote idea to new epic, or
|
||||
- Link idea to existing epic.
|
||||
|
||||
## Epic Creation and Management
|
||||
|
||||
When epic exists in Aha, fill mandatory fields:
|
||||
- Summary with PRD linkage
|
||||
- Release and availability (`Preview`/`GA`)
|
||||
- Confidence level (`High`/`Med`/`Low`)
|
||||
- Product type and persona
|
||||
- Execution team and initiative
|
||||
- Product lead, engineering lead, UX lead
|
||||
|
||||
Set required flags and trigger follow-ups:
|
||||
- `Doc Required = Yes` -> specify doc type and doc-team flow
|
||||
- `Provisioning = Yes` -> PCC/Olga flow
|
||||
- `UI/UX Required = Yes` -> engage UX
|
||||
- `Security Review = Yes` -> engage security
|
||||
- `Training Required = Yes` -> engage training
|
||||
|
||||
Integration:
|
||||
- Ensure Aha -> Jira Webhooks 2.0 integration path is respected.
|
||||
- Ensure Jira epic has `Aha! Reference`.
|
||||
|
||||
## Enablement Outputs
|
||||
|
||||
If applicable, drive enablement:
|
||||
- Technical enablement session (config)
|
||||
- GTM/sales enablement artifacts
|
||||
- Webinar for major highlights
|
||||
|
||||
Template links from workflow:
|
||||
- Technical Enablement Session template:
|
||||
`https://docs.google.com/presentation/d/1fCZhOUSV7McX1edmYoKBHYtKnYajykbm1U2N5aJ1j-M/edit?slide=id.g39258ed0d71_0_442`
|
||||
- Value Statements input template:
|
||||
`https://docs.google.com/document/d/1YEquYIjt8gMtGLf8EJFfvwS0f_ij1KuIfQFOjlcOEjI/edit`
|
||||
- Sales Enablement deck example:
|
||||
`https://docs.google.com/presentation/d/1mIlC3OhhQgdwcFPgJ328pm1oQl5W6y-w/edit`
|
||||
53
skills/epics-standards/references/epic-fields-checklist.md
Normal file
53
skills/epics-standards/references/epic-fields-checklist.md
Normal file
@@ -0,0 +1,53 @@
|
||||
# RP Epic Field Checklist
|
||||
|
||||
Standard page:
|
||||
`https://reltio.jira.com/wiki/spaces/PM/pages/2688385025/PM+Standards+Epics`
|
||||
|
||||
Use this checklist during epic create/update.
|
||||
|
||||
## Core fields
|
||||
|
||||
- `Summary` (short Jira shorthand)
|
||||
- `Description` (business outcome + impact)
|
||||
- `Type of Effort`
|
||||
- `Fix Version` (or `N/A` when not yet planned)
|
||||
- `Status`
|
||||
|
||||
## Product narrative fields
|
||||
|
||||
- Problem Statement / Why
|
||||
- Solution / What
|
||||
- Persona / Who
|
||||
- Value Statement
|
||||
|
||||
## Planning and delivery fields
|
||||
|
||||
- Confidence Level
|
||||
- Path to Green (required when Confidence is Medium/Low for must-have epics)
|
||||
- Availability in Release
|
||||
- Planned Release
|
||||
- T-Shirt Size
|
||||
- Tier
|
||||
- Initiative
|
||||
|
||||
## Ownership and dependencies
|
||||
|
||||
- Product Lead
|
||||
- Engineering Lead
|
||||
- UX Lead
|
||||
- Execution Team
|
||||
- Execution Team Dependency
|
||||
|
||||
## Go-to-market and governance
|
||||
|
||||
- For documentation tickets: set `Affected Documentation` to a documentation target (for example `Help Portal`) and never `No`
|
||||
- Doc Required
|
||||
- Pricing Required
|
||||
- Security Review Required
|
||||
- Does this change PCC?
|
||||
- Tags (including `Must Have` when applicable)
|
||||
- Demo Link (when available)
|
||||
|
||||
## Integration check
|
||||
|
||||
- `Aha! Reference` is present and linked through the RP integration path.
|
||||
103
skills/epics-standards/scripts/aha_create_epic.py
Normal file
103
skills/epics-standards/scripts/aha_create_epic.py
Normal file
@@ -0,0 +1,103 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Create an Aha epic in a target release using credentials from ~/.mcporter/mcporter.json.
|
||||
|
||||
Usage:
|
||||
python3 skills/epics-standards/scripts/aha_create_epic.py \
|
||||
--release MDM-R-889 \
|
||||
--name "RDM PrivateLink on AWS" \
|
||||
--description "Tracks Jira epic RP-176273 (...)" \
|
||||
--jira-key RP-176273
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import json
|
||||
import pathlib
|
||||
import sys
|
||||
import urllib.error
|
||||
import urllib.parse
|
||||
import urllib.request
|
||||
|
||||
|
||||
MCPORTER_CONFIG = pathlib.Path.home() / ".mcporter" / "mcporter.json"
|
||||
|
||||
|
||||
def load_aha_env() -> dict[str, str]:
|
||||
cfg = json.loads(MCPORTER_CONFIG.read_text())
|
||||
env = cfg["mcpServers"]["aha"]["env"]
|
||||
return {"domain": env["AHA_DOMAIN"], "token": env["AHA_API_TOKEN"]}
|
||||
|
||||
|
||||
def request(method: str, url: str, token: str, payload: dict | None = None) -> dict:
|
||||
headers = {
|
||||
"Authorization": f"Bearer {token}",
|
||||
"Accept": "application/json",
|
||||
"Content-Type": "application/json",
|
||||
}
|
||||
body = None if payload is None else json.dumps(payload).encode("utf-8")
|
||||
req = urllib.request.Request(url, data=body, headers=headers, method=method)
|
||||
with urllib.request.urlopen(req, timeout=30) as resp:
|
||||
return json.loads(resp.read().decode("utf-8"))
|
||||
|
||||
|
||||
def release_ref_from_name(domain: str, token: str, release_name: str) -> str:
|
||||
q = urllib.parse.quote(release_name)
|
||||
url = f"https://{domain}.aha.io/api/v1/releases?q={q}&per_page=200"
|
||||
data = request("GET", url, token)
|
||||
for rel in data.get("releases", []):
|
||||
if rel.get("name") == release_name:
|
||||
return rel["reference_num"]
|
||||
raise ValueError(f"Release not found by name: {release_name}")
|
||||
|
||||
|
||||
def main() -> int:
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("--release", required=True, help="Release reference (e.g. MDM-R-889) or exact release name (e.g. 2026.2.0.0)")
|
||||
parser.add_argument("--name", required=True, help="Aha epic name")
|
||||
parser.add_argument("--description", required=True, help="Aha epic description/body")
|
||||
parser.add_argument("--jira-key", required=False, help="Optional Jira key to print linking reminder")
|
||||
args = parser.parse_args()
|
||||
|
||||
try:
|
||||
aha = load_aha_env()
|
||||
release = args.release
|
||||
if not release.startswith("MDM-R-"):
|
||||
release = release_ref_from_name(aha["domain"], aha["token"], release)
|
||||
|
||||
url = f"https://{aha['domain']}.aha.io/api/v1/releases/{release}/epics"
|
||||
payload = {"epic": {"name": args.name, "description": args.description}}
|
||||
data = request("POST", url, aha["token"], payload)
|
||||
epic = data.get("epic", {})
|
||||
|
||||
print(json.dumps(
|
||||
{
|
||||
"aha_reference": epic.get("reference_num"),
|
||||
"aha_url": epic.get("url"),
|
||||
"release": release,
|
||||
"jira_key": args.jira_key,
|
||||
},
|
||||
ensure_ascii=True,
|
||||
))
|
||||
|
||||
if args.jira_key and epic.get("url"):
|
||||
print(
|
||||
f"Next: set Jira {args.jira_key} Aha! Reference = {epic['url']}",
|
||||
file=sys.stderr,
|
||||
)
|
||||
return 0
|
||||
except (KeyError, FileNotFoundError, ValueError) as exc:
|
||||
print(f"Config/input error: {exc}", file=sys.stderr)
|
||||
return 2
|
||||
except urllib.error.HTTPError as exc:
|
||||
detail = exc.read().decode("utf-8", errors="replace")
|
||||
print(f"Aha API HTTP {exc.code}: {detail}", file=sys.stderr)
|
||||
return 3
|
||||
except Exception as exc: # noqa: BLE001
|
||||
print(f"Unexpected error: {exc}", file=sys.stderr)
|
||||
return 1
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
Reference in New Issue
Block a user