ma-agents 3.13.2 → 3.14.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/README.md +3 -3
  2. package/lib/agents.js +9 -2
  3. package/lib/bmad-cache/bmb/.claude-plugin/marketplace.json +3 -3
  4. package/lib/bmad-cache/bmb/_git_preserved/index +0 -0
  5. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-b388526edf307cf56f8e65673466cff074105abf.idx +0 -0
  6. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/{pack-8f8b045fef5af6911495cf3b2a89f1ed75e120f7.pack → pack-b388526edf307cf56f8e65673466cff074105abf.pack} +0 -0
  7. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-b388526edf307cf56f8e65673466cff074105abf.rev +0 -0
  8. package/lib/bmad-cache/bmb/_git_preserved/packed-refs +1 -1
  9. package/lib/bmad-cache/bmb/_git_preserved/refs/heads/main +1 -1
  10. package/lib/bmad-cache/bmb/_git_preserved/shallow +1 -1
  11. package/lib/bmad-cache/bmb/package-lock.json +2 -2
  12. package/lib/bmad-cache/bmb/package.json +1 -1
  13. package/lib/bmad-cache/bmb/samples/bmad-agent-code-coach/scripts/wake.py +78 -0
  14. package/lib/bmad-cache/bmb/samples/bmad-agent-creative-muse/scripts/wake.py +78 -0
  15. package/lib/bmad-cache/bmb/samples/bmad-agent-sentinel/scripts/wake.py +78 -0
  16. package/lib/bmad-cache/bmb/skills/bmad-agent-builder/assets/customize-template.toml +3 -0
  17. package/lib/bmad-cache/bmb/skills/bmad-agent-builder/assets/init-sanctum-template.py +11 -5
  18. package/lib/bmad-cache/bmb/skills/bmad-agent-builder/assets/report-shell.html +1073 -0
  19. package/lib/bmad-cache/bmb/skills/bmad-agent-builder/assets/wake-template.py +78 -0
  20. package/lib/bmad-cache/bmb/skills/bmad-agent-builder/customize.toml +48 -0
  21. package/lib/bmad-cache/bmb/skills/bmad-agent-builder/scripts/count_tokens.py +78 -0
  22. package/lib/bmad-cache/bmb/skills/bmad-agent-builder/scripts/prepass.py +258 -0
  23. package/lib/bmad-cache/bmb/skills/bmad-agent-builder/scripts/process-template.py +20 -0
  24. package/lib/bmad-cache/bmb/skills/bmad-agent-builder/scripts/render_report.py +387 -0
  25. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/assets/adapter-claude-code.json +9 -0
  26. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/aggregate_benchmark.py +236 -0
  27. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/memlog.py +197 -0
  28. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/run_evals.py +513 -390
  29. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/run_triggers.py +347 -251
  30. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/tests/test_env_isolation.py +79 -0
  31. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/tests/test_trigger_detection.py +123 -0
  32. package/lib/bmad-cache/bmb/skills/bmad-module-builder/scripts/tests/test-validate-module.py +82 -4
  33. package/lib/bmad-cache/bmb/skills/bmad-module-builder/scripts/validate-module.py +55 -11
  34. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/assets/customize-template.toml +3 -5
  35. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/assets/report-shell.html +860 -0
  36. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/customize.toml +59 -0
  37. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/count_tokens.py +77 -0
  38. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/init_skill.py +132 -0
  39. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/prepass-prompt-metrics.py +186 -221
  40. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/quick_validate.py +117 -0
  41. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/render_report.py +387 -0
  42. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/tests/test_canon_sync.py +46 -0
  43. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/tests/test_count_tokens.py +180 -0
  44. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/tests/test_render_report.py +171 -0
  45. package/lib/bmad-cache/cache-manifest.json +4 -4
  46. package/lib/bmad-customize/bmm-qa.customize.yaml +3 -3
  47. package/lib/bmad-extension/.claude-plugin/marketplace.json.template +3 -2
  48. package/lib/bmad-extension/skills/bmad-dev-epic/SKILL.md +101 -0
  49. package/lib/bmad-extension/skills/bmad-dev-epic/bmad-skill-manifest.yaml +3 -0
  50. package/lib/bmad-extension/skills/bmad-dev-epic/checklist.md +44 -0
  51. package/lib/bmad-extension/skills/bmad-dev-epic/customize.toml +54 -0
  52. package/lib/bmad-extension/skills/bmad-dev-epic/references/story-pipeline.md +112 -0
  53. package/lib/bmad-extension/skills/bmad-dev-epic/steps/step-01-intake.md +59 -0
  54. package/lib/bmad-extension/skills/bmad-dev-epic/steps/step-02-plan-waves.md +56 -0
  55. package/lib/bmad-extension/skills/bmad-dev-epic/steps/step-03-epic-branch.md +35 -0
  56. package/lib/bmad-extension/skills/bmad-dev-epic/steps/step-04-run-waves.md +49 -0
  57. package/lib/bmad-extension/skills/bmad-dev-epic/steps/step-05-epic-adversarial.md +31 -0
  58. package/lib/bmad-extension/skills/bmad-dev-epic/steps/step-06-release.md +57 -0
  59. package/lib/bmad-extension/skills/bmad-dev-epic/steps/step-07-report.md +40 -0
  60. package/lib/bmad-extension/skills/ma-agent-sqa/SKILL.md +3 -3
  61. package/lib/bmad-extension/skills/ma-agent-sqa/bmad-skill-manifest.yaml +1 -1
  62. package/lib/bmad-extension/skills/module-help.csv +2 -1
  63. package/lib/bmad-extension/skills/module.yaml +1 -1
  64. package/lib/bmad-extension/skills/sqa-audit/SKILL.md +2 -2
  65. package/lib/bmad-extension/skills/sqa-ieee12207/SKILL.md +3 -3
  66. package/lib/bmad-extension/skills/sqa-requirements-quality/SKILL.md +2 -2
  67. package/lib/bmad-extension-plugin/.claude-plugin/marketplace.json +4 -3
  68. package/lib/bmad-extension-plugin/skills/bmad-dev-epic/SKILL.md +101 -0
  69. package/lib/bmad-extension-plugin/skills/bmad-dev-epic/bmad-skill-manifest.yaml +3 -0
  70. package/lib/bmad-extension-plugin/skills/bmad-dev-epic/checklist.md +44 -0
  71. package/lib/bmad-extension-plugin/skills/bmad-dev-epic/customize.toml +54 -0
  72. package/lib/bmad-extension-plugin/skills/bmad-dev-epic/references/story-pipeline.md +112 -0
  73. package/lib/bmad-extension-plugin/skills/bmad-dev-epic/steps/step-01-intake.md +59 -0
  74. package/lib/bmad-extension-plugin/skills/bmad-dev-epic/steps/step-02-plan-waves.md +56 -0
  75. package/lib/bmad-extension-plugin/skills/bmad-dev-epic/steps/step-03-epic-branch.md +35 -0
  76. package/lib/bmad-extension-plugin/skills/bmad-dev-epic/steps/step-04-run-waves.md +49 -0
  77. package/lib/bmad-extension-plugin/skills/bmad-dev-epic/steps/step-05-epic-adversarial.md +31 -0
  78. package/lib/bmad-extension-plugin/skills/bmad-dev-epic/steps/step-06-release.md +57 -0
  79. package/lib/bmad-extension-plugin/skills/bmad-dev-epic/steps/step-07-report.md +40 -0
  80. package/lib/bmad-extension-plugin/skills/ma-agent-sqa/SKILL.md +3 -3
  81. package/lib/bmad-extension-plugin/skills/ma-agent-sqa/bmad-skill-manifest.yaml +1 -1
  82. package/lib/bmad-extension-plugin/skills/module-help.csv +2 -1
  83. package/lib/bmad-extension-plugin/skills/module.yaml +1 -1
  84. package/lib/bmad-extension-plugin/skills/sqa-audit/SKILL.md +2 -2
  85. package/lib/bmad-extension-plugin/skills/sqa-ieee12207/SKILL.md +3 -3
  86. package/lib/bmad-extension-plugin/skills/sqa-requirements-quality/SKILL.md +2 -2
  87. package/lib/bmad.js +6 -1
  88. package/package.json +3 -3
  89. package/lib/.bmad-extension-plugin.build-22612-1782454014750/.claude-plugin/marketplace.json +0 -109
  90. package/lib/.bmad-extension-plugin.build-22612-1782454014750/skills/module-help.csv +0 -62
  91. package/lib/.bmad-extension-plugin.build-22612-1782454014750/skills/module.yaml +0 -20
  92. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-8f8b045fef5af6911495cf3b2a89f1ed75e120f7.idx +0 -0
  93. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-8f8b045fef5af6911495cf3b2a89f1ed75e120f7.rev +0 -0
  94. package/lib/bmad-cache/bmb/skills/bmad-agent-builder/references/sample-init-sanctum.py +0 -274
  95. package/lib/bmad-cache/bmb/skills/bmad-agent-builder/scripts/generate-html-report.py +0 -534
  96. package/lib/bmad-cache/bmb/skills/bmad-agent-builder/scripts/prepass-execution-deps.py +0 -337
  97. package/lib/bmad-cache/bmb/skills/bmad-agent-builder/scripts/prepass-prompt-metrics.py +0 -425
  98. package/lib/bmad-cache/bmb/skills/bmad-agent-builder/scripts/prepass-sanctum-architecture.py +0 -385
  99. package/lib/bmad-cache/bmb/skills/bmad-agent-builder/scripts/prepass-structure-capabilities.py +0 -482
  100. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/assets/Dockerfile +0 -29
  101. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/docker_setup.py +0 -115
  102. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/generate_report.py +0 -184
  103. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/pty_runner.py +0 -171
  104. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/utils.py +0 -260
  105. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/extract-report-json.py +0 -287
  106. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/generate-html-report.py +0 -588
  107. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/prepass-execution-deps.py +0 -288
@@ -0,0 +1,171 @@
1
+ #!/usr/bin/env python3
2
+ """Tests for scripts/render_report.py — the deterministic report renderer.
3
+
4
+ Covers: valid island injection, refusal on malformed JSON, refusal on the
5
+ placeholder subject, the --md archival rendering, and that both shipped
6
+ shells carry a parseable placeholder island.
7
+ Run with: python3 -m pytest test_render_report.py
8
+ (or plain `python3 test_render_report.py` for a lightweight self-check).
9
+ """
10
+ import json
11
+ import re
12
+ import subprocess
13
+ import sys
14
+ import tempfile
15
+ from pathlib import Path
16
+
17
+ SKILLS_DIR = Path(__file__).resolve().parents[3]
18
+ SCRIPT = SKILLS_DIR / "bmad-workflow-builder" / "scripts" / "render_report.py"
19
+ SHELLS = [
20
+ SKILLS_DIR / "bmad-workflow-builder" / "assets" / "report-shell.html",
21
+ SKILLS_DIR / "bmad-agent-builder" / "assets" / "report-shell.html",
22
+ ]
23
+ ISLAND_RE = re.compile(
24
+ r'<script[^>]*\bid="report-data"[^>]*>(.*?)</script>', re.DOTALL
25
+ )
26
+
27
+ VALID_DATA = {
28
+ "schema_version": 2,
29
+ "subject": "skills/example-skill",
30
+ "generated": "2026-06-10",
31
+ "verdict": "One ceremony section; otherwise sound.",
32
+ "grade": "good",
33
+ "summary": "Solid structure and clean wiring. The main opportunity is one over-scripted reference.",
34
+ "standards": {
35
+ "canon": "/abs/skills/bmad-workflow-builder/references/prompt-quality-canon.md",
36
+ "principles": "/abs/skills/bmad-workflow-builder/references/skill-quality-principles.md",
37
+ "scripts": "/abs/skills/bmad-workflow-builder/references/script-standards.md",
38
+ },
39
+ "themes": [
40
+ {
41
+ "title": "Scripted sequences where goals suffice",
42
+ "root_cause": "Steps are numbered without true ordering dependencies.",
43
+ "finding_ids": ["leanness-1"],
44
+ "action": "Replace ordered lists with goal sentences.",
45
+ }
46
+ ],
47
+ "strengths": ["Frontmatter and routing map are exemplary."],
48
+ "recommendations": [
49
+ {"rank": 1, "action": "De-script the finalize section.", "resolves": ["leanness-1"]}
50
+ ],
51
+ "findings": [
52
+ {
53
+ "id": "leanness-1",
54
+ "lens": "leanness",
55
+ "severity": "high",
56
+ "title": "Numbered finalize steps are decoration",
57
+ "location": "references/build-process.md:finalize",
58
+ "evidence": "No step depends on a prior step's output.",
59
+ "recommendation": "Replace with a single goal sentence.",
60
+ }
61
+ ],
62
+ }
63
+
64
+
65
+ def run_render(args):
66
+ return subprocess.run(
67
+ [sys.executable, str(SCRIPT), *[str(a) for a in args]],
68
+ capture_output=True,
69
+ text=True,
70
+ )
71
+
72
+
73
+ def test_valid_island_injection():
74
+ with tempfile.TemporaryDirectory() as tmp:
75
+ tmp = Path(tmp)
76
+ findings = tmp / "findings.json"
77
+ out = tmp / "report.html"
78
+ findings.write_text(json.dumps(VALID_DATA), encoding="utf-8")
79
+
80
+ result = run_render([findings, "--shell", SHELLS[0], "-o", out])
81
+ assert result.returncode == 0, result.stderr
82
+ html = out.read_text(encoding="utf-8")
83
+
84
+ match = ISLAND_RE.search(html)
85
+ assert match, "rendered HTML has no report-data island"
86
+ island = json.loads(match.group(1))
87
+ assert island["subject"] == "skills/example-skill"
88
+ assert island["findings"][0]["id"] == "leanness-1"
89
+ assert island["standards"]["canon"].endswith("prompt-quality-canon.md")
90
+ assert "__PLACEHOLDER__" not in match.group(1)
91
+
92
+ stdout = json.loads(result.stdout)
93
+ assert stdout["counts"] == {"critical": 0, "high": 1, "medium": 0, "low": 0}
94
+ assert stdout["grade"] == "good"
95
+
96
+
97
+ def test_refuses_bad_json():
98
+ with tempfile.TemporaryDirectory() as tmp:
99
+ tmp = Path(tmp)
100
+ findings = tmp / "findings.json"
101
+ out = tmp / "report.html"
102
+ findings.write_text("{ this is not json", encoding="utf-8")
103
+
104
+ result = run_render([findings, "--shell", SHELLS[0], "-o", out])
105
+ assert result.returncode != 0
106
+ assert "not valid JSON" in result.stderr
107
+ assert not out.exists(), "refused render must not write output"
108
+
109
+
110
+ def test_refuses_placeholder_subject():
111
+ with tempfile.TemporaryDirectory() as tmp:
112
+ tmp = Path(tmp)
113
+ findings = tmp / "findings.json"
114
+ out = tmp / "report.html"
115
+ data = dict(VALID_DATA, subject="__PLACEHOLDER__")
116
+ findings.write_text(json.dumps(data), encoding="utf-8")
117
+
118
+ result = run_render([findings, "--shell", SHELLS[0], "-o", out])
119
+ assert result.returncode != 0
120
+ assert "placeholder" in result.stderr.lower()
121
+ assert not out.exists(), "refused render must not write output"
122
+
123
+
124
+ def test_md_output():
125
+ with tempfile.TemporaryDirectory() as tmp:
126
+ tmp = Path(tmp)
127
+ findings = tmp / "findings.json"
128
+ out = tmp / "report.html"
129
+ md = tmp / "report.md"
130
+ findings.write_text(json.dumps(VALID_DATA), encoding="utf-8")
131
+
132
+ result = run_render([findings, "--shell", SHELLS[0], "-o", out, "--md", md])
133
+ assert result.returncode == 0, result.stderr
134
+ text = md.read_text(encoding="utf-8")
135
+ assert "# Analysis Report: skills/example-skill" in text
136
+ assert "**Grade: Good**" in text
137
+ assert "## Themes" in text
138
+ assert "Scripted sequences where goals suffice" in text
139
+ assert "## Strengths" in text
140
+ assert "## Recommendations" in text
141
+ assert "### High (1)" in text
142
+ assert "leanness-1" in text
143
+
144
+
145
+ def test_shipped_shells_carry_placeholder_island():
146
+ for shell in SHELLS:
147
+ match = ISLAND_RE.search(shell.read_text(encoding="utf-8"))
148
+ assert match, f"{shell} has no report-data island"
149
+ island = json.loads(match.group(1))
150
+ assert island["subject"] == "__PLACEHOLDER__", (
151
+ f"{shell} ships a non-placeholder island; a failed injection "
152
+ "would show its contents as real findings"
153
+ )
154
+ assert island["findings"] == []
155
+
156
+
157
+ def test_render_script_copies_identical():
158
+ other = SKILLS_DIR / "bmad-agent-builder" / "scripts" / "render_report.py"
159
+ assert SCRIPT.read_bytes() == other.read_bytes(), (
160
+ "render_report.py copies have drifted between the two builder skills"
161
+ )
162
+
163
+
164
+ if __name__ == "__main__":
165
+ test_valid_island_injection()
166
+ test_refuses_bad_json()
167
+ test_refuses_placeholder_subject()
168
+ test_md_output()
169
+ test_shipped_shells_carry_placeholder_island()
170
+ test_render_script_copies_identical()
171
+ print("ok: render_report tests passed")
@@ -1,6 +1,6 @@
1
1
  {
2
- "generated": "2026-06-13T15:11:45.601Z",
3
- "bmadMethodVersion": "6.8.0",
2
+ "generated": "2026-06-27T14:28:18.113Z",
3
+ "bmadMethodVersion": "6.9.0",
4
4
  "registrySchema": "package-root-v68",
5
5
  "modules": {
6
6
  "tea": {
@@ -12,8 +12,8 @@
12
12
  "bmb": {
13
13
  "url": "https://github.com/bmad-code-org/bmad-builder",
14
14
  "branch": "main",
15
- "commitSha": "7cfa7711778f04c5df56f7ae895fabc942fd920c",
16
- "clonedAt": "2026-06-13T15:11:41.069Z"
15
+ "commitSha": "e6935f2776c34ffd9b18f4ef1e334584ef10a50f",
16
+ "clonedAt": "2026-06-27T14:28:16.693Z"
17
17
  },
18
18
  "cis": {
19
19
  "url": "https://github.com/bmad-code-org/bmad-module-creative-intelligence-suite",
@@ -1,9 +1,9 @@
1
- # MA-AGENTS: Gad — Software Quality Assurance Expert
1
+ # MA-AGENTS: Gadi — Software Quality Assurance Expert
2
2
  phase: planning
3
3
  on_prem_phase_prefix: "/no_think You are in a planning phase — respond in text for questions; create files only when explicitly asked."
4
4
  agent:
5
5
  metadata:
6
- name: "Gad"
6
+ name: "Gadi"
7
7
 
8
8
  persona:
9
9
  role: "Software Quality Assurance Engineer responsible for verifying project quality across all dimensions — code, process, documentation, and delivery."
@@ -17,7 +17,7 @@ persona:
17
17
 
18
18
  menu:
19
19
  - trigger: skill:ma-agent-sqa
20
- description: "Activate Gad — Software Quality Assurance Expert"
20
+ description: "Activate Gadi — Software Quality Assurance Expert"
21
21
 
22
22
  critical_actions:
23
23
  - "Read the skills MANIFEST at {project-root}/skills/MANIFEST.yaml"
@@ -11,7 +11,7 @@
11
11
  "owner": {
12
12
  "name": "Alon Mayaffit"
13
13
  },
14
- "description": "ma-agents BMAD extension — enterprise SDLC personas (Yael, Amit, Alex, Demerzel, Gad) plus MIL-STD-498, SRE, DevOps, Cyber, ML, and SQA workflow skills.",
14
+ "description": "ma-agents BMAD extension — enterprise SDLC personas (Yael, Amit, Alex, Demerzel, Gadi) plus MIL-STD-498, SRE, DevOps, Cyber, ML, and SQA workflow skills.",
15
15
  "license": "MIT",
16
16
  "homepage": "https://github.com/mayafit/AI_Agents",
17
17
  "repository": "https://github.com/mayafit/AI_Agents",
@@ -39,7 +39,7 @@
39
39
  "roo-code",
40
40
  "kilocode"
41
41
  ],
42
- "bmad_min_version": "6.8.0",
42
+ "bmad_min_version": "6.9.0",
43
43
  "plugins": [
44
44
  {
45
45
  "name": "ma-skills",
@@ -99,6 +99,7 @@
99
99
  "./skills/ml-techspec",
100
100
  "./skills/add-sprint",
101
101
  "./skills/add-to-sprint",
102
+ "./skills/bmad-dev-epic",
102
103
  "./skills/bmad-dev-story",
103
104
  "./skills/bmad-sprint-planning",
104
105
  "./skills/bmad-sprint-status",
@@ -0,0 +1,101 @@
1
+ ---
2
+ name: bmad-dev-epic
3
+ description: 'Orchestrate a full epic end-to-end with parallel subagents — per-story create/dev/review/edge-case/fix/e2e pipeline, dependency-aware waves, configurable model tiers, an epic-level adversarial + package-integrity gate, and gated beta publish + PR. Use when the user says "run the epic", "dev epic [id]", or "orchestrate epic development".'
4
+ ---
5
+
6
+ # Epic Orchestrator Workflow
7
+
8
+ **Goal:** Drive an already-planned epic from stories to a review-ready epic PR, autonomously, by orchestrating BMAD skills across parallel subagents under a strict, repeatable process.
9
+
10
+ **Your Role:** You are the Epic Orchestrator. You do not write story code yourself — you decompose the epic into dependency-ordered waves, spawn subagents that each run a disciplined per-story pipeline, enforce a Definition of Done before any merge, run an epic-level adversarial + package-integrity gate, and stop at the two human gates (publish, PR). You are precise about git isolation, model tiers, and failure handling. No noise, no filler.
11
+
12
+ ## Conventions
13
+
14
+ - Bare paths (e.g. `checklist.md`) resolve from the skill root.
15
+ - `{skill-root}` resolves to this skill's installed directory (where `customize.toml` lives).
16
+ - `{project-root}`-prefixed paths resolve from the project working directory.
17
+ - `{skill-name}` resolves to the skill directory's basename (`bmad-dev-epic`).
18
+
19
+ ## On Activation
20
+
21
+ ### Step 1: Resolve the Workflow Block
22
+
23
+ Run: `python3 {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key workflow`
24
+
25
+ **If the script fails**, resolve the `workflow` block yourself by reading these three files in base → team → user order and applying the same structural merge rules as the resolver:
26
+
27
+ 1. `{skill-root}/customize.toml` — defaults
28
+ 2. `{project-root}/_bmad/custom/{skill-name}.toml` — team overrides
29
+ 3. `{project-root}/_bmad/custom/{skill-name}.user.toml` — personal overrides
30
+
31
+ Any missing file is skipped. Scalars override, tables deep-merge, arrays of tables keyed by `code` or `id` replace matching entries and append new entries, and all other arrays append.
32
+
33
+ ### Step 2: Execute Prepend Steps
34
+
35
+ Execute each entry in `{workflow.activation_steps_prepend}` in order before proceeding.
36
+
37
+ ### Step 3: Load Persistent Facts
38
+
39
+ Treat every entry in `{workflow.persistent_facts}` as foundational context you carry for the rest of the run. Entries prefixed `file:` are paths or globs under `{project-root}` — load the referenced contents as facts. All other entries are facts verbatim.
40
+
41
+ ### Step 4: Load Config
42
+
43
+ Load config from `{project-root}/_bmad/bmm/config.yaml` and resolve:
44
+
45
+ - `project_name`, `planning_artifacts`, `implementation_artifacts`, `user_name`
46
+ - `communication_language`, `document_output_language`, `user_skill_level`
47
+ - `date` as system-generated current datetime
48
+ - `sprint_status` = `{implementation_artifacts}/sprint-status.yaml`
49
+ - `project_context` = `**/project-context.md` (load if exists)
50
+ - CLAUDE.md / memory files (load if exist)
51
+ - ALWAYS speak in the config `{communication_language}`.
52
+
53
+ ### Step 5: Greet the User
54
+
55
+ Greet `{user_name}`, speaking in `{communication_language}`. State plainly what this skill will do (run an entire epic through parallel subagents) and that it runs unattended through dev + review, requiring your **approval at only two release gates** — before publishing the beta package and before opening the epic PR. (It will still HALT for genuine blockers, e.g. a missing/unready epic or a dependency cycle.)
56
+
57
+ ### Step 6: Execute Append Steps
58
+
59
+ Execute each entry in `{workflow.activation_steps_append}` in order.
60
+
61
+ Activation is complete. If `activation_steps_prepend` or `activation_steps_append` were non-empty, confirm every entry was executed in order before proceeding. Do not begin the main workflow until all activation steps have completed.
62
+
63
+ ## WORKFLOW ARCHITECTURE
64
+
65
+ This uses **step-file architecture** for disciplined execution:
66
+
67
+ - **Micro-file Design**: Each step is self-contained and followed exactly.
68
+ - **Just-In-Time Loading**: Only load the current step file.
69
+ - **Sequential Enforcement**: Complete steps in order, no skipping.
70
+ - **State Tracking**: Persist progress in an in-memory **Run Ledger** (see below) and mirror it to `{implementation_artifacts}/epic-runs/<epic-id>/run-ledger.md` so a resumed run can recover.
71
+
72
+ ### The Run Ledger
73
+
74
+ Maintain a single source of truth for the run with, per story: `id`, `wave`, `status` (`pending` → `in-progress` → `review` → `fixing` → `e2e` → `merged` → `blocked`), `worktree`, `branch`, `fix_rounds_used`, and a short note. Update it at every state transition and after every subagent returns.
75
+
76
+ ### Step Processing Rules
77
+
78
+ 1. **READ COMPLETELY**: Read the entire step file before acting.
79
+ 2. **FOLLOW SEQUENCE**: Execute sections in order.
80
+ 3. **HONOR GATES**: Halt only at the two declared human gates (publish, PR) and wherever a step says HALT.
81
+ 4. **LOAD NEXT**: When directed, read fully and follow the next step file.
82
+
83
+ ### Git discipline (defer to `git-workflow-skill`)
84
+
85
+ **`git-workflow-skill` is the single authority for every git operation in this run** — worktree creation, branch naming, conventional commits, hooks, rebasing, PR creation, and cleanup. Do not hand-roll git flows that contradict it. Load and follow it.
86
+
87
+ This epic uses a **nested-branch topology** (epic branch off the trunk; story branches off the epic branch; stories merge back to the epic branch; one PR to the trunk). Where that diverges from the skill's script defaults — chiefly the scripts' `dev` base assumption and their auto-PR-to-`dev` — use the skill's documented **manual equivalents** with the base overridden as the step specifies (trunk for the epic branch, the epic branch for stories). Everything else (worktree-per-unit-of-work, conventional commits, hook compliance, worktree cleanup) is used exactly as the skill defines it.
88
+
89
+ ### Critical Rules (NO EXCEPTIONS)
90
+
91
+ - **NEVER** load multiple step files simultaneously.
92
+ - **NEVER** perform any git action outside the `git-workflow-skill` conventions. The trunk (`main`) is never committed to or modified directly; all file-writing happens inside a worktree on a feature branch.
93
+ - **NEVER** publish to npm or open the epic PR without explicit user confirmation at the gate.
94
+ - **NEVER** treat the known pre-existing `npm test` CRLF failure as a regression — use the real package-integrity gate defined in step-05.
95
+ - **ALWAYS** validate each story against INVEST and split oversized / multi-goal stories before implementing them (see step-02 and `references/story-pipeline.md`).
96
+ - **ALWAYS** enforce the per-story Definition of Done before merging a story to the epic branch.
97
+ - **ALWAYS** respect the configured fix-loop cap; escalate a non-converging story rather than looping forever.
98
+
99
+ ## FIRST STEP
100
+
101
+ Read fully and follow: `./steps/step-01-intake.md`
@@ -0,0 +1,3 @@
1
+ type: skill
2
+ name: bmad-dev-epic
3
+ module: ma-skills
@@ -0,0 +1,44 @@
1
+ # bmad-dev-epic — Run Checklist
2
+
3
+ A run is correct only if every box can be checked. Use this to self-audit mid-run and before each gate.
4
+
5
+ ## Intake (step-01)
6
+ - [ ] Target epic identified and its stories enumerated with dependencies.
7
+ - [ ] Epic is genuinely ready (stories have acceptance criteria); otherwise routed to planning.
8
+ - [ ] Model tiers mapped to actually-available models (collapsed to one if single-model/air-gapped).
9
+ - [ ] Parallelism strategy, max-parallel, and fix-loop cap confirmed.
10
+ - [ ] Both release gates confirmed ON (or explicitly changed by the user).
11
+ - [ ] Real test/build gate command confirmed.
12
+ - [ ] Single go/no-go confirmation received.
13
+
14
+ ## Planning (step-02 / step-03)
15
+ - [ ] Every story checked against INVEST; oversized / multi-goal stories split into focused sub-stories (user-confirmed) before graphing.
16
+ - [ ] Dependency DAG built; no cycles (or cycle resolved with the user).
17
+ - [ ] Waves computed per the chosen strategy.
18
+ - [ ] Epic branch `feature/epic-<id>` created off the trunk via `git-workflow-skill` (base overridden to trunk), in its own worktree.
19
+
20
+ ## Per story (step-04 / story-pipeline)
21
+ - [ ] Story branch cut from the epic branch in its own worktree, per `git-workflow-skill`.
22
+ - [ ] Spec re-checked against INVEST/size after create-story; if too large/multi-goal, returned `needs-split` (not implemented) and the orchestrator split it.
23
+ - [ ] create-story → dev-story → parallel code-review + edge-case-hunter executed.
24
+ - [ ] Blocking findings fixed within the fix-loop cap (or story marked blocked, not papered over).
25
+ - [ ] E2E tests generated and passing; test gate green on the story branch.
26
+ - [ ] Definition of Done met before the story is integrated.
27
+ - [ ] Story merged into the epic branch by the orchestrator (serialized, `--no-ff`).
28
+ - [ ] Cross-story breakage checked after each merge.
29
+
30
+ ## Epic gate (step-05)
31
+ - [ ] Adversarial whole-epic review run; blocking findings cleared or HALTED.
32
+ - [ ] `npm run build:plugin` passes; bundle drift clean/committed.
33
+ - [ ] New test failures distinguished from the known pre-existing CRLF baseline.
34
+
35
+ ## Release (step-06)
36
+ - [ ] `code-review` self-review on the full epic diff completed.
37
+ - [ ] GATE A confirmed by user before publish; version bumped; packed `--ignore-scripts`; tarball inspected; published `--tag beta`.
38
+ - [ ] GATE B confirmed by user before PR; single epic PR opened to the trunk; body includes blocked/follow-up section.
39
+ - [ ] PR NOT merged (left for human approval).
40
+
41
+ ## Report (step-07)
42
+ - [ ] Honest summary presented, including every blocked story.
43
+ - [ ] Story worktrees cleaned up; epic worktree retained until merge.
44
+ - [ ] Run Ledger persisted.
@@ -0,0 +1,54 @@
1
+ # DO NOT EDIT -- overwritten on every update.
2
+ #
3
+ # Workflow customization surface for bmad-dev-epic. Mirrors the workflow
4
+ # customization shape under the [workflow] namespace. Override in
5
+ # {project-root}/_bmad/custom/bmad-dev-epic.toml (team) or
6
+ # {project-root}/_bmad/custom/bmad-dev-epic.user.toml (personal).
7
+
8
+ [workflow]
9
+
10
+ activation_steps_prepend = []
11
+ activation_steps_append = []
12
+
13
+ persistent_facts = [
14
+ "file:{project-root}/**/project-context.md",
15
+ ]
16
+
17
+ on_complete = ""
18
+
19
+ # ── Orchestration defaults ──────────────────────────────────────────────────
20
+ # These are PROPOSED defaults the intake step shows the user; the user can
21
+ # override every one of them at runtime. They are tier-abstract on purpose so
22
+ # the skill works on disconnected networks and with non-Claude runtimes.
23
+ #
24
+ # All keys below are scalars, so a team/user override TOML replaces them by the
25
+ # normal scalar-override merge rule (override wins over base).
26
+
27
+ [workflow.defaults]
28
+
29
+ # Model tiers are ABSTRACT. The intake step maps each tier to a concrete model
30
+ # that the runtime actually exposes (Claude Opus/Sonnet, Gemini, a local model,
31
+ # etc.). If only one model is available, both tiers collapse to it.
32
+ # review_tier → deep reasoning: create-story, code-review, edge-case-hunter,
33
+ # epic adversarial review.
34
+ # exec_tier → implementation: dev-story, fix loops, e2e generation.
35
+ review_tier_model = "claude-opus" # proposed; ask at runtime
36
+ exec_tier_model = "claude-sonnet" # proposed; ask at runtime
37
+
38
+ # Max story pipelines running concurrently within a single wave.
39
+ max_parallel_stories = 3
40
+
41
+ # Max review→fix→re-review rounds before a story is escalated as blocked.
42
+ fix_loop_cap = 2
43
+
44
+ # Parallelization strategy: "waves" (dependency-aware) | "sequential" | "full".
45
+ parallelism_strategy = "waves"
46
+
47
+ # Human gates. Dev + review run unattended; these two are always confirmed.
48
+ gate_before_publish = true
49
+ gate_before_pr = true
50
+
51
+ # Release behavior at the publish gate.
52
+ npm_dist_tag = "beta"
53
+ version_bump = "prerelease" # npm version <bump> --preid=beta
54
+ pack_ignore_scripts = true # avoid Windows prepare tarball leak
@@ -0,0 +1,112 @@
1
+ # Per-Story Pipeline Contract
2
+
3
+ This is the self-contained instruction set handed to each story subagent. The
4
+ orchestrator fills the `<…>` placeholders before spawning. The subagent owns
5
+ exactly one story, in exactly one worktree, and never touches the epic branch.
6
+
7
+ ---
8
+
9
+ ## Inputs (filled by the orchestrator)
10
+
11
+ ```
12
+ STORY_ID = <id>
13
+ STORY_TITLE = <title>
14
+ EPIC_ID = <epic-id>
15
+ EPIC_BRANCH = feature/epic-<epic-id>
16
+ STORY_BRANCH = feature/epic-<epic-id>-story-<id>
17
+ WORKTREE = .worktrees/epic-<epic-id>-story-<id>
18
+ SPRINT_STATUS = <path to sprint-status.yaml>
19
+ EXEC_MODEL = <execution-tier model | "host-default">
20
+ REVIEW_MODEL = <review-tier model | "host-default">
21
+ FIX_LOOP_CAP = <n>
22
+ TEST_CMD = <project test/build gate>
23
+ ```
24
+
25
+ ## Setup
26
+
27
+ All git follows `git-workflow-skill`; the only override is the base branch
28
+ (the story branch is cut from `<EPIC_BRANCH>`, not `dev`).
29
+
30
+ 1. Create the worktree off the epic branch, per `git-workflow-skill` (manual
31
+ form shown, base overridden to the epic branch):
32
+ ```bash
33
+ git worktree add <WORKTREE> -b <STORY_BRANCH> <EPIC_BRANCH>
34
+ ```
35
+ 2. Work **only** inside `<WORKTREE>`. Use the Conventional Commit format the
36
+ skill enforces (`feat`, `fix`, `test`, `docs`, `refactor`, `chore`, `ci`),
37
+ scoped to the story. Honor the skill's git hooks.
38
+
39
+ ## Pipeline
40
+
41
+ ### 1. Create story spec — `bmad-create-story` [REVIEW_MODEL]
42
+ Produce the context-filled spec for `<STORY_ID>`. If the spec already exists and
43
+ is complete, validate it instead of regenerating. The spec's acceptance criteria
44
+ (ACs) are the contract for the Definition of Done.
45
+
46
+ **INVEST & size gate (before implementing).** Once the spec is fleshed out,
47
+ re-check it against INVEST and the sizing/focus heuristics (same criteria as
48
+ step-02): one focused goal, small enough to reach Definition of Done in this
49
+ single pass, testable ACs. A spec often only reveals its true size here. **If
50
+ the story is too large or pursues more than one goal, do NOT implement it** —
51
+ return immediately with `status: needs-split` and a `split_proposal` (the
52
+ smallest set of INVEST-compliant sub-stories, each with a focused goal, derived
53
+ ids, and refined dependencies). The orchestrator owns the split because it
54
+ affects the epic-wide wave plan (see step-04). Only proceed to step 2 when the
55
+ story passes the gate.
56
+
57
+ ### 2. Implement — `bmad-dev-story` [EXEC_MODEL]
58
+ Implement strictly against the spec. Follow the repo's always-load skills
59
+ (language best-practices, logging, test-accompanied-development, etc.). Commit.
60
+
61
+ ### 3. Adversarial + edge-case review (PARALLEL) [REVIEW_MODEL]
62
+ Run both, ideally as parallel sub-subagents, each seeing the story diff:
63
+ - `bmad-code-review` — full adversarial review against spec + context.
64
+ - `bmad-review-edge-case-hunter` — exhaustive boundary/branch analysis.
65
+ Collect both findings sets.
66
+
67
+ ### 4. Triage & fix loop [EXEC_MODEL]
68
+ Classify findings as **blocking** (correctness, security, AC miss, broken build)
69
+ vs **non-blocking** (style, nits). For blocking findings:
70
+ - Run `bmad-dev-story` to fix them. Commit.
71
+ - Re-review **only the changed surface**.
72
+ - Repeat until no blocking findings remain OR `FIX_LOOP_CAP` rounds are used.
73
+ - If the cap is hit with blocking findings remaining → return `status: blocked`
74
+ with the unresolved findings. Do not merge, do not paper over.
75
+ Record non-blocking findings in the return notes (not fixed, by design).
76
+
77
+ ### 5. E2E tests — `bmad-qa-generate-e2e-tests` [EXEC_MODEL]
78
+ Generate e2e/automated tests for the story's behavior and **run them**. Also run
79
+ `<TEST_CMD>` to confirm the story didn't break the package build. If e2e cannot
80
+ be made green within the fix budget, return `status: blocked` with details.
81
+
82
+ ### 6. Definition of Done (gate before returning ready)
83
+ ALL must hold, or the story is `blocked`:
84
+ - [ ] All spec acceptance criteria implemented.
85
+ - [ ] No blocking findings remain from either reviewer.
86
+ - [ ] E2E tests written and passing.
87
+ - [ ] `<TEST_CMD>` passes on the story branch (modulo known pre-existing failures).
88
+ - [ ] All work committed with Conventional Commit messages.
89
+
90
+ ## Return value (structured)
91
+
92
+ ```
93
+ {
94
+ "story_id": "<STORY_ID>",
95
+ "status": "merged-ready" | "blocked" | "needs-split",
96
+ "branch": "<STORY_BRANCH>",
97
+ "worktree": "<WORKTREE>",
98
+ "commits": [ "<sha> <subject>", … ],
99
+ "e2e_status": "passing" | "failing" | "not-created",
100
+ "unresolved_findings": [ "<blocking finding>", … ],
101
+ "split_proposal": [ { "id": "<S3a>", "goal": "<focused goal>", "acs": [ … ], "depends_on": [ … ] }, … ],
102
+ "fix_rounds_used": <n>,
103
+ "notes": "<non-blocking findings, decisions, caveats>"
104
+ }
105
+ ```
106
+
107
+ `split_proposal` is populated only when `status: needs-split` (empty/omitted
108
+ otherwise). On `needs-split` the subagent has done **no** implementation — it
109
+ returns the proposal and stops.
110
+
111
+ **Do NOT** merge into `<EPIC_BRANCH>`. The orchestrator serializes all
112
+ integration into the epic branch (step-04) to avoid parallel-merge races.
@@ -0,0 +1,59 @@
1
+ # Step 01 — Intake & Guided Configuration
2
+
3
+ **Goal:** Confirm the epic exists and is ready, then collect the run configuration through guided questions. Nothing is spawned and no branch is created until this step completes.
4
+
5
+ ## 1. Locate and validate the epic (PRECONDITION)
6
+
7
+ This skill *runs* an epic; it does not invent one. Find the target epic:
8
+
9
+ 1. Read `{sprint_status}` (`{implementation_artifacts}/sprint-status.yaml`) and the epics/stories planning artifacts under `{planning_artifacts}`.
10
+ 2. If the user named an epic (id or title), select it. Otherwise list candidate epics and **HALT** for the user to choose.
11
+ 3. Enumerate the epic's stories. For each story capture: id, title, status, and declared dependencies / "depends on" / prerequisite references.
12
+
13
+ **If the epic has no stories**, or stories are placeholders without acceptance criteria: STOP and tell the user to run `bmad-create-epics-and-stories` (and `bmad-sprint-planning`) first. Do not fabricate stories.
14
+
15
+ **If some stories are already `done`/`merged`**: by default skip them (treat as satisfied dependencies). Confirm this with the user.
16
+
17
+ ## 2. Ask the guided questions
18
+
19
+ Ask these as a single grouped set (use the host's structured-question UI if available; otherwise a numbered list). Show the proposed default from `{workflow.defaults}` for each and accept "use defaults".
20
+
21
+ 1. **Model tiers (tier-abstract — critical for disconnected/non-Claude runtimes).**
22
+ First ask: *what models does this runtime actually expose?* Then map:
23
+ - `{review_model}` — deep reasoning tier (create-story, code-review, edge-case-hunter, epic adversarial review). Default: `{workflow.defaults.review_tier_model}`.
24
+ - `{exec_model}` — execution tier (dev-story, fix loops, e2e). Default: `{workflow.defaults.exec_tier_model}`.
25
+ - If only ONE model is available (air-gapped local model, or a single-provider CLI), **collapse both tiers to it** and note that tier separation is disabled.
26
+ - If the runtime is not Claude (e.g. Gemini, Codex, a local model) or does not support per-subagent model selection, record the mapping anyway but note it is **best-effort**: subagents will use whatever model the host assigns. Never block on this.
27
+
28
+ 2. **Parallelism strategy** — default `{workflow.defaults.parallelism_strategy}`:
29
+ - `waves` (recommended): dependency-aware; independent stories run in parallel, dependents wait for their predecessors to merge.
30
+ - `sequential`: one story fully done before the next.
31
+ - `full`: all stories at once (warn: ignores dependencies; high merge-conflict / broken-build risk).
32
+
33
+ 3. **Max parallel stories per wave** — default `{workflow.defaults.max_parallel_stories}`. Cap to what the host can sanely run concurrently.
34
+
35
+ 4. **Fix-loop cap** — default `{workflow.defaults.fix_loop_cap}`. Max review→fix→re-review rounds before a story is escalated as `blocked`.
36
+
37
+ 5. **Release gates** — confirm both default to ON: pause before npm publish (`{workflow.defaults.gate_before_publish}`) and before the epic PR (`{workflow.defaults.gate_before_pr}`). Confirm `{workflow.defaults.npm_dist_tag}` (default `beta`) and the version bump (default `{workflow.defaults.version_bump}`).
38
+
39
+ 6. **Test command** — the project's real test/build gate for the package-integrity check (step-05). Propose `npm run build:plugin` plus the targeted test subset; confirm. (Note: bare `npm test` has a known pre-existing CRLF failure on Windows — see step-05; do not rely on its exit code alone.)
40
+
41
+ ## 3. Record the resolved configuration
42
+
43
+ Write the resolved config into the Run Ledger header and mirror it to
44
+ `{implementation_artifacts}/epic-runs/<epic-id>/run-ledger.md`:
45
+
46
+ ```
47
+ Epic: <id> — <title>
48
+ Stories: <n> ( <ids…> ) skipped(done): <ids…>
49
+ review_model: <model> exec_model: <model> (tiers collapsed: yes/no)
50
+ strategy: <waves|sequential|full> max_parallel: <n> fix_cap: <n>
51
+ gates: publish=<on/off> pr=<on/off> dist-tag=<tag> bump=<bump>
52
+ test_gate: <command(s)>
53
+ ```
54
+
55
+ ## 4. Confirm and proceed
56
+
57
+ Present the resolved config in one compact block and **HALT for a single go/no-go confirmation**. This is the last broad confirmation — after "go", stories run unattended through to the two release gates.
58
+
59
+ On "go": read fully and follow `./steps/step-02-plan-waves.md`.