bmad-method 6.11.1-next.2 → 6.11.1-next.21
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.
- package/package.json +2 -2
- package/src/bmm-skills/agents/bmad-agent-analyst/customize.toml +1 -3
- package/src/bmm-skills/agents/bmad-agent-architect/customize.toml +1 -3
- package/src/bmm-skills/agents/bmad-agent-dev/customize.toml +1 -3
- package/src/bmm-skills/agents/bmad-agent-pm/customize.toml +1 -3
- package/src/bmm-skills/agents/bmad-agent-ux-designer/customize.toml +1 -3
- package/src/bmm-skills/plan/bmad-architecture/SKILL.md +1 -1
- package/src/bmm-skills/plan/bmad-architecture/customize.toml +5 -6
- package/src/bmm-skills/plan/bmad-create-epics-and-stories/customize.toml +1 -3
- package/src/bmm-skills/plan/bmad-generate-project-context/SKILL.md +2 -0
- package/src/bmm-skills/plan/bmad-prd/customize.toml +5 -6
- package/src/bmm-skills/plan/bmad-prfaq/customize.toml +1 -3
- package/src/bmm-skills/plan/bmad-product-brief/customize.toml +5 -6
- package/src/bmm-skills/plan/bmad-project-context/SKILL.md +23 -12
- package/src/bmm-skills/plan/bmad-project-context/references/best-practices.md +26 -7
- package/src/bmm-skills/plan/bmad-project-context/references/template.md +1 -1
- package/src/bmm-skills/plan/bmad-spec/customize.toml +5 -5
- package/src/bmm-skills/plan/bmad-sprint-planning/customize.toml +1 -3
- package/src/bmm-skills/plan/bmad-sprint-planning/scripts/__pycache__/sprint_plan.cpython-311.pyc +0 -0
- package/src/bmm-skills/plan/bmad-sprint-planning/scripts/tests/__pycache__/test_sprint_plan.cpython-311-pytest-9.1.1.pyc +0 -0
- package/src/bmm-skills/plan/bmad-ux/customize.toml +1 -3
- package/src/bmm-skills/ship/bmad-build/SKILL.md +1 -1
- package/src/bmm-skills/ship/bmad-build/customize.toml +13 -16
- package/src/bmm-skills/ship/bmad-build/references/claims-check.md +14 -0
- package/src/bmm-skills/ship/bmad-build/review-prompts/edge-case-hunter.md +29 -7
- package/src/bmm-skills/ship/bmad-build/review-prompts/verification-gap.md +1 -1
- package/src/bmm-skills/ship/bmad-build/step-01-clarify-and-route.md +12 -7
- package/src/bmm-skills/ship/bmad-build/step-02-plan.md +13 -10
- package/src/bmm-skills/ship/bmad-build/step-03-implement.md +3 -1
- package/src/bmm-skills/ship/bmad-build/step-04-review.md +7 -5
- package/src/bmm-skills/ship/bmad-build/step-oneshot.md +7 -8
- package/src/bmm-skills/ship/bmad-build-auto/customize.toml +16 -18
- package/src/bmm-skills/ship/bmad-build-auto/references/claims-check.md +14 -0
- package/src/bmm-skills/ship/bmad-build-auto/review-prompts/edge-case-hunter.md +29 -7
- package/src/bmm-skills/ship/bmad-build-auto/review-prompts/verification-gap.md +1 -1
- package/src/bmm-skills/ship/bmad-build-auto/step-03-implement.md +5 -1
- package/src/bmm-skills/ship/bmad-build-auto/step-04-review.md +7 -5
- package/src/bmm-skills/ship/bmad-checkpoint-preview/customize.toml +1 -3
- package/src/bmm-skills/ship/bmad-code-review/customize.toml +14 -17
- package/src/bmm-skills/ship/bmad-code-review/references/claims-check.md +14 -0
- package/src/bmm-skills/ship/bmad-code-review/review-prompts/edge-case-hunter.md +29 -7
- package/src/bmm-skills/ship/bmad-code-review/review-prompts/verification-gap.md +1 -1
- package/src/bmm-skills/ship/bmad-code-review/steps/step-01-gather-context.md +22 -15
- package/src/bmm-skills/ship/bmad-code-review/steps/step-02-review.md +2 -2
- package/src/bmm-skills/ship/bmad-correct-course/SKILL.md +11 -3
- package/src/bmm-skills/ship/bmad-correct-course/customize.toml +1 -3
- package/src/bmm-skills/ship/bmad-qa-generate-e2e-tests/customize.toml +1 -3
- package/src/bmm-skills/ship/bmad-retrospective/customize.toml +1 -3
- package/src/bmm-skills/ship/bmad-retrospective/scripts/__pycache__/sprint_status.cpython-311.pyc +0 -0
- package/src/bmm-skills/ship/bmad-retrospective/scripts/tests/__pycache__/test_git_evidence.cpython-311-pytest-9.1.1.pyc +0 -0
- package/src/bmm-skills/ship/bmad-retrospective/scripts/tests/__pycache__/test_sprint_status.cpython-311-pytest-9.1.1.pyc +0 -0
- package/src/bmm-skills/v6-shims/bmad-create-architecture/SKILL.md +2 -0
- package/src/bmm-skills/v6-shims/bmad-create-architecture/customize.toml +1 -3
- package/src/bmm-skills/v6-shims/bmad-create-prd/SKILL.md +2 -0
- package/src/bmm-skills/v6-shims/bmad-create-prd/customize.toml +1 -3
- package/src/bmm-skills/v6-shims/bmad-create-story/SKILL.md +3 -1
- package/src/bmm-skills/v6-shims/bmad-create-story/customize.toml +1 -3
- package/src/bmm-skills/v6-shims/bmad-dev-auto/SKILL.md +2 -0
- package/src/bmm-skills/v6-shims/bmad-dev-story/SKILL.md +2 -0
- package/src/bmm-skills/v6-shims/bmad-dev-story/customize.toml +1 -6
- package/src/bmm-skills/v6-shims/bmad-document-project/SKILL.md +2 -0
- package/src/bmm-skills/v6-shims/bmad-domain-research/SKILL.md +2 -0
- package/src/bmm-skills/v6-shims/bmad-edit-prd/SKILL.md +2 -0
- package/src/bmm-skills/v6-shims/bmad-edit-prd/customize.toml +1 -3
- package/src/bmm-skills/v6-shims/bmad-market-research/SKILL.md +2 -0
- package/src/bmm-skills/v6-shims/bmad-quick-dev/SKILL.md +2 -0
- package/src/bmm-skills/v6-shims/bmad-sprint-status/SKILL.md +2 -0
- package/src/bmm-skills/v6-shims/bmad-sprint-status/customize.toml +1 -3
- package/src/bmm-skills/v6-shims/bmad-technical-research/SKILL.md +2 -0
- package/src/bmm-skills/v6-shims/bmad-validate-prd/SKILL.md +2 -0
- package/src/bmm-skills/v6-shims/bmad-validate-prd/customize.toml +1 -3
- package/src/core-skills/bmad-advanced-elicitation/SKILL.md +21 -22
- package/src/core-skills/bmad-brainstorming/customize.toml +5 -6
- package/src/core-skills/bmad-forge-idea/customize.toml +5 -6
- package/src/core-skills/bmad-party-mode/customize.toml +4 -4
- package/src/core-skills/bmad-review/SKILL.md +5 -4
- package/src/core-skills/bmad-review/customize.toml +1 -1
- package/src/core-skills/bmad-review/references/lens-edge-case-hunter.md +16 -0
- package/src/core-skills/v6-shims/bmad-editorial-review/SKILL.md +2 -0
- package/src/core-skills/v6-shims/bmad-editorial-review-prose/SKILL.md +2 -0
- package/src/core-skills/v6-shims/bmad-editorial-review-structure/SKILL.md +2 -0
- package/src/core-skills/v6-shims/bmad-review-adversarial-general/SKILL.md +2 -0
- package/src/core-skills/v6-shims/bmad-review-edge-case-hunter/SKILL.md +2 -0
- package/src/core-skills/v6-shims/bmad-review-verification-gap/SKILL.md +2 -0
- package/src/scripts/__pycache__/config_utils.cpython-311.pyc +0 -0
- package/src/scripts/tests/__pycache__/test_config_utils.cpython-311.pyc +0 -0
- package/src/scripts/tests/__pycache__/test_resolve_config.cpython-311.pyc +0 -0
- package/src/scripts/tests/__pycache__/test_resolve_customization.cpython-311.pyc +0 -0
- package/tools/installer/commands/install.js +2 -0
- package/tools/installer/core/config.js +3 -0
- package/tools/installer/core/installer.js +57 -1
- package/tools/installer/core/manifest-generator.js +6 -0
- package/tools/installer/core/manifest.js +6 -0
- package/tools/installer/core/shim-policy.js +159 -0
- package/tools/installer/ide/_config-driven.js +3 -3
- package/tools/installer/ide/platform-codes.yaml +7 -0
- package/tools/installer/modules/official-modules.js +38 -6
- package/tools/installer/prompts.js +15 -2
- package/tools/installer/ui.js +68 -3
|
@@ -5,10 +5,12 @@ When a diff is provided, scan only the diff hunks and list boundaries that are d
|
|
|
5
5
|
When no diff is provided (full file or function), treat the entire provided content as the scope.
|
|
6
6
|
Ignore the rest of the codebase unless the provided content explicitly references external functions.
|
|
7
7
|
A brief secondary deletion check runs as Step 4 when the diff removes code.
|
|
8
|
+
A claims check runs as Step 5 when the launch message names a claims file.
|
|
8
9
|
|
|
9
10
|
**Inputs:**
|
|
10
|
-
- **content** — Content to review: diff, full file, or function
|
|
11
|
+
- **content** — Content to review, or a path to read it from: diff, full file, or function
|
|
11
12
|
- **also_consider** (optional) — Areas to keep in mind during review alongside normal edge-case analysis
|
|
13
|
+
- **claims_file** (optional) — Path to the change's stated narrative. Do NOT read it before Step 5: the path tracing in Steps 2–3 must finish before the narrative is seen.
|
|
12
14
|
|
|
13
15
|
**MANDATORY: Execute steps in the Execution section IN EXACT ORDER. DO NOT skip steps or change the sequence. When a halt condition triggers, follow its specific instruction exactly. Each action within a step is a REQUIRED action to complete that step.**
|
|
14
16
|
|
|
@@ -19,8 +21,8 @@ A brief secondary deletion check runs as Step 4 when the diff removes code.
|
|
|
19
21
|
|
|
20
22
|
### Step 1: Receive Content
|
|
21
23
|
|
|
22
|
-
-
|
|
23
|
-
- If content is empty, or cannot be decoded as text, return `[{"location":"N/A","trigger_condition":"Input empty or undecodable","guard_snippet":"Provide valid content to review","potential_consequence":"Review skipped — no analysis performed"}]` and stop
|
|
24
|
+
- Take the content to review from the parent message that launched you — inline, or by reading the file it points to (never from this instruction file)
|
|
25
|
+
- If no content is supplied, or it is empty, unreadable, or cannot be decoded as text, return `[{"location":"N/A","trigger_condition":"Input empty or undecodable","guard_snippet":"Provide valid content to review","potential_consequence":"Review skipped — no analysis performed"}]` and stop
|
|
24
26
|
- Identify content type (diff, full file, or function) to determine scope rules
|
|
25
27
|
|
|
26
28
|
### Step 2: Exhaustive Path Analysis
|
|
@@ -42,7 +44,11 @@ A brief secondary deletion check runs as Step 4 when the diff removes code.
|
|
|
42
44
|
|
|
43
45
|
If the diff removed or replaced meaningful code (ignore pure renames and whitespace): load `references/deletion-check.md` and follow it.
|
|
44
46
|
|
|
45
|
-
### Step 5:
|
|
47
|
+
### Step 5: Claims Check
|
|
48
|
+
|
|
49
|
+
If the launch message provided a `claims_file` path and the file exists and is non-empty: load `references/claims-check.md` and follow it.
|
|
50
|
+
|
|
51
|
+
### Step 6: Present Findings
|
|
46
52
|
|
|
47
53
|
Output all findings as a single JSON array following the Output Format specification exactly.
|
|
48
54
|
|
|
@@ -60,12 +66,12 @@ Return ONLY a valid JSON array of objects. Each edge-case finding contains exact
|
|
|
60
66
|
}]
|
|
61
67
|
```
|
|
62
68
|
|
|
63
|
-
No extra text, no explanations, no markdown wrapping. An empty array `[]` is valid when nothing is found. Deletion findings from Step 4, if any, go in the same array with the extra fields defined in `references/deletion-check.md`.
|
|
69
|
+
No extra text, no explanations, no markdown wrapping. An empty array `[]` is valid when nothing is found. Deletion findings from Step 4 and claim findings from Step 5, if any, go in the same array with the extra fields defined in `references/deletion-check.md` and `references/claims-check.md`.
|
|
64
70
|
|
|
65
71
|
|
|
66
72
|
## HALT CONDITIONS
|
|
67
73
|
|
|
68
|
-
- If content is empty or cannot be decoded as text, return `[{"location":"N/A","trigger_condition":"Input empty or undecodable","guard_snippet":"Provide valid content to review","potential_consequence":"Review skipped — no analysis performed"}]` and stop
|
|
74
|
+
- If no content is supplied, or it is empty, unreadable, or cannot be decoded as text, return `[{"location":"N/A","trigger_condition":"Input empty or undecodable","guard_snippet":"Provide valid content to review","potential_consequence":"Review skipped — no analysis performed"}]` and stop
|
|
69
75
|
<reference path="references/deletion-check.md">
|
|
70
76
|
# Deletion Check
|
|
71
77
|
|
|
@@ -82,7 +88,23 @@ For a deletion finding the standard fields read as: `location` = the removed ite
|
|
|
82
88
|
|
|
83
89
|
Add nothing if nothing qualifies.
|
|
84
90
|
</reference>
|
|
91
|
+
<reference path="references/claims-check.md">
|
|
92
|
+
# Claims Check
|
|
93
|
+
|
|
94
|
+
Final pass for the Edge Case Hunter — runs only when the message that launched you named a claims file. Read that file now, for the first time; the path tracing is finished and the claims cannot steer it retroactively.
|
|
95
|
+
|
|
96
|
+
The file holds the change's own narrative — commit messages and any stated description. The narrative is the author's testimony, not evidence: a claim repeated in a code comment is still the same claim, not confirmation. Extract each checkable claim — what the change does, what it preserves, ordering, arithmetic, and parity with existing code ("exactly as X does") — then try to falsify each one against the code you have already traced. Where your trace is not enough to decide, read the code that decides it: the compared-to function, the actual callee, the state the claim assumes.
|
|
97
|
+
|
|
98
|
+
Append one finding per falsified claim to the same JSON array, with the four standard fields plus:
|
|
99
|
+
|
|
100
|
+
- `kind`: `"claim"`
|
|
101
|
+
- `confidence`: `"high"`, `"medium"`, or `"low"`
|
|
102
|
+
|
|
103
|
+
For a claim finding the standard fields read as: `location` = where the code contradicts the claim; `trigger_condition` = the claim, quoted or tightly paraphrased; `guard_snippet` = what the code actually does; `potential_consequence` = what goes wrong for someone who believed the claim.
|
|
104
|
+
|
|
105
|
+
Verified claims produce nothing. Add nothing if nothing is falsified.
|
|
106
|
+
</reference>
|
|
85
107
|
|
|
86
108
|
## CONTENT SOURCE
|
|
87
109
|
|
|
88
|
-
|
|
110
|
+
"Review content:" in the message that launched you gives the content itself or a path to read it from. Read the file when it is a path; either way that is the content under review, and this instruction file never is.
|
|
@@ -110,4 +110,4 @@ When you find no verification gaps and no other findings, output exactly this si
|
|
|
110
110
|
|
|
111
111
|
## CONTENT SOURCE
|
|
112
112
|
|
|
113
|
-
|
|
113
|
+
"Review content:" in the message that launched you gives the content itself or a path to read it from. Read the file when it is a path; either way that is the content under review, and this instruction file never is. If no content is supplied, or it is empty or unreadable, stop with exactly: `No verification gaps found.`
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
2
|
+
diff_file: '' # set at runtime: path to the diff file
|
|
3
|
+
claims_file: '' # set at runtime (path or empty)
|
|
3
4
|
spec_file: '' # set at runtime (path or empty)
|
|
4
5
|
review_mode: '' # set at runtime: "full" or "no-spec"
|
|
5
6
|
story_key: '' # set at runtime when discovered from sprint status
|
|
@@ -11,7 +12,7 @@ story_key: '' # set at runtime when discovered from sprint status
|
|
|
11
12
|
|
|
12
13
|
- YOU MUST ALWAYS SPEAK OUTPUT in your Agent communication style with the config `{communication_language}`
|
|
13
14
|
- The prompt that triggered this workflow IS the intent — not a hint.
|
|
14
|
-
-
|
|
15
|
+
- Writing `{diff_file}` and the claims file is the only change this step may make. Otherwise it is read-only.
|
|
15
16
|
|
|
16
17
|
## INSTRUCTIONS
|
|
17
18
|
|
|
@@ -35,7 +36,10 @@ story_key: '' # set at runtime when discovered from sprint status
|
|
|
35
36
|
|
|
36
37
|
**Tier 3 — Sprint tracking.**
|
|
37
38
|
Look for a sprint status file (`*sprint-status*`) in `{implementation_artifacts}` or `{planning_artifacts}`. If found, scan for stories with status `review`:
|
|
38
|
-
- **Exactly one `review` story:** Set `{story_key}` to the story's key (e.g., `1-2-user-auth`).
|
|
39
|
+
- **Exactly one `review` story:** Set `{story_key}` to the story's key (e.g., `1-2-user-auth`). HALT and give the user a choice:
|
|
40
|
+
- **Review this story** — review the detected story `<story-id>` (status `review`).
|
|
41
|
+
- **Choose another target** — pick a different review target.
|
|
42
|
+
If the user chooses **Review this story**, use the story context to determine the diff source (branch name derived from story slug, or uncommitted changes). If they choose **Choose another target**, clear `{story_key}` and fall through.
|
|
39
43
|
- **Multiple `review` stories:** Present them as numbered options alongside a manual choice option. Wait for user selection. If a story is selected, set `{story_key}` and use its context to determine the diff source. If manual choice is selected, clear `{story_key}` and fall through.
|
|
40
44
|
- **None:** Fall through.
|
|
41
45
|
|
|
@@ -54,16 +58,19 @@ story_key: '' # set at runtime when discovered from sprint status
|
|
|
54
58
|
- **Specific commit range** (ask for the range)
|
|
55
59
|
- **Provided diff or file list** (user pastes or provides a path)
|
|
56
60
|
|
|
57
|
-
3.
|
|
58
|
-
- For **staged changes only**: run `git diff --cached`.
|
|
59
|
-
- For **uncommitted changes** (staged + unstaged): run `git diff HEAD`.
|
|
60
|
-
- For **branch diff**: verify the base branch exists
|
|
61
|
-
- For **commit range**: verify the range resolves
|
|
62
|
-
- For **provided diff**: validate the content is non-empty and parseable as a unified diff. If it is not parseable, HALT and ask the user to provide a valid diff.
|
|
63
|
-
- For **file list**: validate each path exists in the working tree.
|
|
64
|
-
- After
|
|
61
|
+
3. Write the diff for the chosen source to `{diff_file}` — a uniquely-named file in the system temp directory, so concurrent reviews cannot collide. The review layers read that file; the diff text is never pasted into their prompts.
|
|
62
|
+
- For **staged changes only**: run `git diff --cached > {diff_file}`.
|
|
63
|
+
- For **uncommitted changes** (staged + unstaged): run `git diff HEAD > {diff_file}`.
|
|
64
|
+
- For **branch diff**: verify the base branch exists, then run `git diff <base-branch>...HEAD > {diff_file}`. If it does not exist, HALT and ask the user for a valid branch.
|
|
65
|
+
- For **commit range**: verify the range resolves, then run `git diff <range> > {diff_file}`. If it does not resolve, HALT and ask the user for a valid range.
|
|
66
|
+
- For **provided diff**: validate the content is non-empty and parseable as a unified diff. If it is not parseable, HALT and ask the user to provide a valid diff. Write the validated diff to `{diff_file}`.
|
|
67
|
+
- For **file list**: validate each path exists in the working tree. Run `git diff HEAD -- <path1> <path2> ... > {diff_file}`. If any paths are untracked (new files not yet staged), append them with `git diff --no-index /dev/null <path> >> {diff_file}`. If the diff is empty (files have no uncommitted changes and are not untracked), ask the user whether to review the full file contents or to specify a different baseline.
|
|
68
|
+
- After writing `{diff_file}`, verify it is non-empty regardless of source type. If empty, HALT and tell the user there is nothing to review.
|
|
69
|
+
- Read `{diff_file}` yourself whenever you need the diff for your own context — triage and presentation later in this workflow.
|
|
65
70
|
|
|
66
|
-
4. **
|
|
71
|
+
4. **Stage the claims file.** Collect the change's own narrative: for a branch diff or commit range, the commit messages it covers (`git log <base>..<head>`); for other sources, whatever description of the change the user or conversation supplied. Write it verbatim to a uniquely-named file in the system temp directory and set `{claims_file}` to its path. If there is no narrative, set `{claims_file}` = `''`. Do not analyze or summarize the narrative — it is input for one review layer, staged as a file precisely so the other layers never see it.
|
|
72
|
+
|
|
73
|
+
5. **Set the spec context.**
|
|
67
74
|
- If the triggering request or recent conversation **explicitly** states there is no spec (e.g. "no spec", "without a spec", "no-spec"): set `{review_mode}` = `"no-spec"` and clear `{spec_file}` (set it to `''`). Do **not** ask for a spec. Do **not** infer no-spec mode merely because the invocation omitted a spec path.
|
|
68
75
|
- Else if `{spec_file}` is already set (from Tier 1 or Tier 2): verify the file exists and is readable, then set `{review_mode}` = `"full"`.
|
|
69
76
|
- Else (neither a spec path nor an explicit no-spec declaration is present): ask the user to choose:
|
|
@@ -72,10 +79,10 @@ story_key: '' # set at runtime when discovered from sprint status
|
|
|
72
79
|
- If the user provides a path: set `{spec_file}` to that path, verify the file exists and is readable, then set `{review_mode}` = `"full"`.
|
|
73
80
|
- If the user explicitly chooses to continue without a spec: set `{review_mode}` = `"no-spec"`.
|
|
74
81
|
|
|
75
|
-
|
|
82
|
+
6. If `{review_mode}` = `"full"` and the file at `{spec_file}` has a `context` field in its frontmatter listing additional docs, load each referenced document. Warn the user about any docs that cannot be found.
|
|
76
83
|
|
|
77
|
-
|
|
78
|
-
- If the user opts to chunk: agree on the first group,
|
|
84
|
+
7. Sanity check: if `wc -l {diff_file}` exceeds approximately 3000 lines, warn the user and offer to chunk the review by file group.
|
|
85
|
+
- If the user opts to chunk: agree on the first group, rebuild `{diff_file}` narrowed to that group, and list the remaining groups for the user to note for follow-up runs.
|
|
79
86
|
- If the user declines: proceed as-is with the full diff.
|
|
80
87
|
|
|
81
88
|
### CHECKPOINT
|
|
@@ -8,7 +8,7 @@ failed_layers: '' # set at runtime: comma-separated list of layers that failed o
|
|
|
8
8
|
|
|
9
9
|
- YOU MUST ALWAYS SPEAK OUTPUT in your Agent communication style with the config `{communication_language}`
|
|
10
10
|
- All review subagents must run at the same model capability as the current session.
|
|
11
|
-
- Run subagents synchronously: launch them together,
|
|
11
|
+
- Run subagents synchronously: launch them together as blocking calls awaited in this turn — never backgrounded or detached, never ending the turn to await results.
|
|
12
12
|
|
|
13
13
|
## INSTRUCTIONS
|
|
14
14
|
|
|
@@ -21,7 +21,7 @@ failed_layers: '' # set at runtime: comma-separated list of layers that failed o
|
|
|
21
21
|
|
|
22
22
|
If no layer is active, HALT with status `blocked` and blocking condition `no active review layers`.
|
|
23
23
|
|
|
24
|
-
3.
|
|
24
|
+
3. Announce skipped layers first, then launch every active layer before handling any layer's result. Try running all active layers simultaneously: expand `{skill-root}` in each layer's `instruction` to this skill's absolute installed directory, then substitute the runtime placeholders (`{diff_file}`, `{claims_file}`, `{spec_file}`). `{diff_file}` is a path: substitute the path itself and let the layer read the file — a launch prompt never carries diff text. For an instruction that launches a reviewer subagent, launch that child with the prompt text after placeholder substitution; do not load the reviewer instruction file yourself. For any other customized instruction, execute it as written. Do not leave `{skill-root}` unresolved in a child prompt, and resolve `{diff_file}` to an absolute path — the child's working directory is not yours. If a layer's instruction requires subagents and subagents are not available, for each such layer write under `{implementation_artifacts}` that layer's child prompt with everything after its content label replaced by the contents of `{diff_file}` (not a path-only pointer) — that session may not share this filesystem, so its prompt must be self-contained. Then HALT. Ask the user to run each in a separate session (ideally a different LLM) and paste back the findings. When findings are pasted, treat them as those layers' findings and resume from this point. This is the only allowed parent-side read of a reviewer instruction file.
|
|
25
25
|
|
|
26
26
|
4. **Layer failure handling**: If any layer fails, times out, or returns empty results, append the layer's `name` to `{failed_layers}` (comma-separated) and proceed with findings from the remaining layers.
|
|
27
27
|
|
|
@@ -182,8 +182,12 @@ Activation is complete. If `activation_steps_prepend` or `activation_steps_appen
|
|
|
182
182
|
|
|
183
183
|
<check if="mode is Incremental">
|
|
184
184
|
<action>Present each edit proposal individually</action>
|
|
185
|
-
<
|
|
186
|
-
|
|
185
|
+
<action>HALT and give the user a choice:
|
|
186
|
+
- **Approve** — accept this proposal
|
|
187
|
+
- **Edit** — refine this proposal
|
|
188
|
+
- **Skip** — drop this proposal
|
|
189
|
+
</action>
|
|
190
|
+
<action>If the user chooses **Approve**, keep the proposal. If they choose **Edit**, refine it with them. If they choose **Skip**, drop it. Continue to the next proposal.</action>
|
|
187
191
|
</check>
|
|
188
192
|
|
|
189
193
|
<action if="mode is Batch">Collect all edit proposals and present together at end of step</action>
|
|
@@ -232,7 +236,11 @@ Activation is complete. If `activation_steps_prepend` or `activation_steps_appen
|
|
|
232
236
|
|
|
233
237
|
<action>Present complete Sprint Change Proposal to user</action>
|
|
234
238
|
<action>Write Sprint Change Proposal document to {default_output_file}</action>
|
|
235
|
-
<
|
|
239
|
+
<action>HALT and give the user a choice:
|
|
240
|
+
- **Continue** — proceed to approval
|
|
241
|
+
- **Edit** — revise the proposal first
|
|
242
|
+
</action>
|
|
243
|
+
<action>If the user chooses **Edit**, revise the proposal with them and write the updated document before continuing.</action>
|
|
236
244
|
</step>
|
|
237
245
|
|
|
238
246
|
<step n="5" goal="Finalize and Route for Implementation">
|
|
@@ -30,9 +30,7 @@ activation_steps_append = []
|
|
|
30
30
|
# - a file reference prefixed with `file:`, e.g. "file:{project-root}/docs/standards.md"
|
|
31
31
|
# (glob patterns are supported; the file's contents are loaded and treated as facts).
|
|
32
32
|
|
|
33
|
-
persistent_facts = [
|
|
34
|
-
"file:{project-root}/**/project-context.md",
|
|
35
|
-
]
|
|
33
|
+
persistent_facts = []
|
|
36
34
|
|
|
37
35
|
# Scalar: executed when the workflow reaches Step 6 (Workflow Completion),
|
|
38
36
|
# after the Sprint Change Proposal is finalized and handoff is confirmed. Override wins.
|
|
@@ -30,9 +30,7 @@ activation_steps_append = []
|
|
|
30
30
|
# - a file reference prefixed with `file:`, e.g. "file:{project-root}/docs/standards.md"
|
|
31
31
|
# (glob patterns are supported; the file's contents are loaded and treated as facts).
|
|
32
32
|
|
|
33
|
-
persistent_facts = [
|
|
34
|
-
"file:{project-root}/**/project-context.md",
|
|
35
|
-
]
|
|
33
|
+
persistent_facts = []
|
|
36
34
|
|
|
37
35
|
# Scalar: executed when the workflow reaches Step 5 (Create Summary),
|
|
38
36
|
# after all tests pass and the summary document is saved. Override wins.
|
|
@@ -30,9 +30,7 @@ activation_steps_append = []
|
|
|
30
30
|
# - a file reference prefixed with `file:`, e.g. "file:{project-root}/docs/standards.md"
|
|
31
31
|
# (glob patterns are supported; the file's contents are loaded and treated as facts).
|
|
32
32
|
|
|
33
|
-
persistent_facts = [
|
|
34
|
-
"file:{project-root}/**/project-context.md",
|
|
35
|
-
]
|
|
33
|
+
persistent_facts = []
|
|
36
34
|
|
|
37
35
|
# Scalar: executed at the end of Phase 5 (Close), after the retrospective
|
|
38
36
|
# document is saved and sprint-status is updated. Override wins.
|
package/src/bmm-skills/ship/bmad-retrospective/scripts/__pycache__/sprint_status.cpython-311.pyc
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -30,9 +30,7 @@ activation_steps_append = []
|
|
|
30
30
|
# - a file reference prefixed with `file:`, e.g. "file:{project-root}/docs/standards.md"
|
|
31
31
|
# (glob patterns are supported; the file's contents are loaded and treated as facts).
|
|
32
32
|
|
|
33
|
-
persistent_facts = [
|
|
34
|
-
"file:{project-root}/**/project-context.md",
|
|
35
|
-
]
|
|
33
|
+
persistent_facts = []
|
|
36
34
|
|
|
37
35
|
# Scalar: executed when the workflow reaches Step 8 (Architecture Completion & Handoff),
|
|
38
36
|
# after the architecture document frontmatter is updated and next-steps guidance is given.
|
|
@@ -30,9 +30,7 @@ activation_steps_append = []
|
|
|
30
30
|
# - a file reference prefixed with `file:`, e.g. "file:{project-root}/docs/standards.md"
|
|
31
31
|
# (glob patterns are supported; the file's contents are loaded and treated as facts).
|
|
32
32
|
|
|
33
|
-
persistent_facts = [
|
|
34
|
-
"file:{project-root}/**/project-context.md",
|
|
35
|
-
]
|
|
33
|
+
persistent_facts = []
|
|
36
34
|
|
|
37
35
|
# Scalar: executed when the workflow reaches Step 12 (Workflow Completion),
|
|
38
36
|
# after the PRD is finalized and workflow status is updated. Override wins.
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: bmad-create-story
|
|
3
3
|
description: "Deprecated: `bmad-build` is now the official implementation method. Only use this when explicitly invoked by name"
|
|
4
|
+
metadata:
|
|
5
|
+
lifecycle: shim
|
|
4
6
|
---
|
|
5
7
|
|
|
6
8
|
# Create Story Workflow
|
|
@@ -255,7 +257,7 @@ Activation is complete. If `activation_steps_prepend` or `activation_steps_appen
|
|
|
255
257
|
|
|
256
258
|
<!-- Load all available content through discovery protocol -->
|
|
257
259
|
<action>Read fully and follow `./discover-inputs.md` to load all input files</action>
|
|
258
|
-
<note>Available content: {epics_content}, {prd_content}, {architecture_content}, {ux_content}, plus
|
|
260
|
+
<note>Available content: {epics_content}, {prd_content}, {architecture_content}, {ux_content}, plus any facts loaded during activation via `persistent_facts` (empty unless the user opted in).</note>
|
|
259
261
|
|
|
260
262
|
<!-- Analyze epics file for story foundation -->
|
|
261
263
|
<action>From {epics_content}, extract Epic {{epic_num}} complete context:</action> **EPIC ANALYSIS:** - Epic
|
|
@@ -30,9 +30,7 @@ activation_steps_append = []
|
|
|
30
30
|
# - a file reference prefixed with `file:`, e.g. "file:{project-root}/docs/standards.md"
|
|
31
31
|
# (glob patterns are supported; the file's contents are loaded and treated as facts).
|
|
32
32
|
|
|
33
|
-
persistent_facts = [
|
|
34
|
-
"file:{project-root}/**/project-context.md",
|
|
35
|
-
]
|
|
33
|
+
persistent_facts = []
|
|
36
34
|
|
|
37
35
|
# Scalar: executed when the workflow reaches Step 6 (Update sprint status and finalize),
|
|
38
36
|
# after the story file is saved and sprint-status.yaml is updated. Override wins.
|
|
@@ -30,12 +30,7 @@ activation_steps_append = []
|
|
|
30
30
|
# - a file reference prefixed with `file:`, e.g. "file:{project-root}/docs/standards.md"
|
|
31
31
|
# (glob patterns are supported; the file's contents are loaded and treated as facts).
|
|
32
32
|
|
|
33
|
-
persistent_facts = [
|
|
34
|
-
"file:{project-root}/**/project-context.md",
|
|
35
|
-
"Never add epic or story references as inline code comments (e.g. # Epic: X, # Story: PROJ-42).",
|
|
36
|
-
"Code comments explain why, not what — no AI workflow metadata, planning refs, or story tracking in source code.",
|
|
37
|
-
"Generated code must be production-ready: clean, minimal, and free of AI-generated noise.",
|
|
38
|
-
]
|
|
33
|
+
persistent_facts = []
|
|
39
34
|
|
|
40
35
|
# Scalar: executed when the workflow reaches its final step,
|
|
41
36
|
# after the story implementation is complete and status is updated. Override wins.
|
|
@@ -30,9 +30,7 @@ activation_steps_append = []
|
|
|
30
30
|
# - a file reference prefixed with `file:`, e.g. "file:{project-root}/docs/standards.md"
|
|
31
31
|
# (glob patterns are supported; the file's contents are loaded and treated as facts).
|
|
32
32
|
|
|
33
|
-
persistent_facts = [
|
|
34
|
-
"file:{project-root}/**/project-context.md",
|
|
35
|
-
]
|
|
33
|
+
persistent_facts = []
|
|
36
34
|
|
|
37
35
|
# Scalar: executed when the workflow reaches Step E-4 (Complete & Validate) and the
|
|
38
36
|
# user exits via [S] Summary or [X] Exit — not on [V] Validate (which chains to
|
|
@@ -30,9 +30,7 @@ activation_steps_append = []
|
|
|
30
30
|
# - a file reference prefixed with `file:`, e.g. "file:{project-root}/docs/standards.md"
|
|
31
31
|
# (glob patterns are supported; the file's contents are loaded and treated as facts).
|
|
32
32
|
|
|
33
|
-
persistent_facts = [
|
|
34
|
-
"file:{project-root}/**/project-context.md",
|
|
35
|
-
]
|
|
33
|
+
persistent_facts = []
|
|
36
34
|
|
|
37
35
|
# Scalar: executed when the workflow reaches its final step,
|
|
38
36
|
# after sprint status is summarized and risks are surfaced. Override wins.
|
|
@@ -30,9 +30,7 @@ activation_steps_append = []
|
|
|
30
30
|
# - a file reference prefixed with `file:`, e.g. "file:{project-root}/docs/standards.md"
|
|
31
31
|
# (glob patterns are supported; the file's contents are loaded and treated as facts).
|
|
32
32
|
|
|
33
|
-
persistent_facts = [
|
|
34
|
-
"file:{project-root}/**/project-context.md",
|
|
35
|
-
]
|
|
33
|
+
persistent_facts = []
|
|
36
34
|
|
|
37
35
|
# Scalar: executed when the workflow reaches Step 13 (Validation Report Complete) and
|
|
38
36
|
# the user exits via [X] Exit — not on [E] Use Edit Workflow (which chains to
|
|
@@ -19,7 +19,7 @@ You are BMad's shared refinement checkpoint: other skills invoke you at natural
|
|
|
19
19
|
|
|
20
20
|
## Serving the Catalog
|
|
21
21
|
|
|
22
|
-
`scripts/pick_methods.py` serves the method catalog (num, category, method_name, description, output_pattern) so it never enters context whole — the one exception is
|
|
22
|
+
`scripts/pick_methods.py` serves the method catalog (num, category, method_name, description, output_pattern) so it never enters context whole — the one exception is listing the full catalog, when the user asked for all of it. Invoke as:
|
|
23
23
|
|
|
24
24
|
```bash
|
|
25
25
|
uv run {skill-root}/scripts/pick_methods.py --file {workflow.methods_file} <command>
|
|
@@ -28,7 +28,7 @@ uv run {skill-root}/scripts/pick_methods.py --file {workflow.methods_file} <comm
|
|
|
28
28
|
If `{workflow.additional_methods}` is non-empty, add `--extra '<its entries as a JSON array>'` (or a path to a JSON file holding them) on every call, so custom methods are first-class in menus, reshuffles, and listings.
|
|
29
29
|
|
|
30
30
|
- `categories` — category names + counts, the cheap map.
|
|
31
|
-
- `list --category <cat> [--category <cat>]` — the index for chosen categories; `--all` dumps the whole catalog, only
|
|
31
|
+
- `list --category <cat> [--category <cat>]` — the index for chosen categories; `--all` dumps the whole catalog, only when listing all.
|
|
32
32
|
- `show <name-or-num> [...]` — full rows by name or num.
|
|
33
33
|
- `random -n 5 --spread [--exclude <name>]...` — a category-diverse random draw.
|
|
34
34
|
|
|
@@ -36,30 +36,29 @@ If `{workflow.additional_methods}` is non-empty, add `--extra '<its entries as a
|
|
|
36
36
|
|
|
37
37
|
## The Menu
|
|
38
38
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
3. [Method Name]
|
|
46
|
-
4. [Method Name]
|
|
47
|
-
5. [Method Name]
|
|
48
|
-
r. Reshuffle the list with 5 new options
|
|
49
|
-
a. List all methods with descriptions
|
|
50
|
-
x. Proceed / No Further Actions
|
|
51
|
-
```
|
|
39
|
+
HALT and give the user a choice:
|
|
40
|
+
|
|
41
|
+
- The five offered methods, listed by name. The user may pick one or several.
|
|
42
|
+
- **Reshuffle** — replace the list with five new options.
|
|
43
|
+
- **List all** — show the full catalog with descriptions.
|
|
44
|
+
- **Proceed** — no further elicitation.
|
|
52
45
|
|
|
53
|
-
This menu is the interface other skills and their users rely on — keep its options and behavior stable. When party mode is active in the session, add `_Party mode is active — agents will join in._` under the heading.
|
|
46
|
+
This menu is the interface other skills and their users rely on — keep its options and behavior stable. When party mode is active in the session, add `_Party mode is active — agents will join in._` under the heading.
|
|
54
47
|
|
|
55
|
-
-
|
|
56
|
-
- **
|
|
57
|
-
- **
|
|
58
|
-
- **
|
|
59
|
-
-
|
|
48
|
+
- If the user picks methods: run them (several: in sequence), then offer the menu again.
|
|
49
|
+
- If the user chooses **Reshuffle**: reshuffle as above and offer the menu again.
|
|
50
|
+
- If the user chooses **List all**: show the full catalog (`list --all`) as a compact table; a pick by name or number runs like a method choice.
|
|
51
|
+
- If the user chooses **Proceed**: done. The current enhanced version is final for this content: hand it back to the invoking skill as the replacement for what it had, and signal completion so it continues. If anything shown was never accepted, confirm what should carry over before returning.
|
|
52
|
+
- Any other reply is direction: apply it to the target and offer the menu again.
|
|
60
53
|
|
|
61
54
|
## Running a Method
|
|
62
55
|
|
|
63
|
-
Use the method's description as its intent and its output_pattern as a flexible flow guide; scale depth to the target — a paragraph gets a light pass, an architecture decision gets the full treatment. Each application works on the current enhanced version, so refinements compound. Show what the method revealed and the changes it proposes, then
|
|
56
|
+
Use the method's description as its intent and its output_pattern as a flexible flow guide; scale depth to the target — a paragraph gets a light pass, an architecture decision gets the full treatment. Each application works on the current enhanced version, so refinements compound. Show what the method revealed and the changes it proposes, then HALT and give the user a choice:
|
|
57
|
+
|
|
58
|
+
- **Apply** — accept the proposed changes.
|
|
59
|
+
- **Reject** — drop the proposal entirely.
|
|
60
|
+
- Or give different direction.
|
|
61
|
+
|
|
62
|
+
Never change the work unless the user accepts the proposal. If they reject it, drop the proposal entirely. Any other reply is instruction to follow.
|
|
64
63
|
|
|
65
64
|
When a method casts personas (round tables, panels, debates), reuse party members already in the session if party mode is active; otherwise resolve installed agents on demand via `uv run {project-root}/_bmad/scripts/resolve_config.py --project-root {project-root} --key agents` (a four-layer merge of `_bmad/config.toml`, `config.user.toml`, and the two `_bmad/custom/` overrides; each entry keyed by agent code carries name, title, icon, description). If neither yields a fit, invent named viewpoints suited to the content.
|
|
@@ -22,12 +22,11 @@ activation_steps_append = []
|
|
|
22
22
|
# Persistent facts the facilitator keeps in mind for the whole session
|
|
23
23
|
# (domain constraints, house rules, stylistic guardrails). Each entry is a
|
|
24
24
|
# literal sentence, a skill prefixed with `skill:`, or a `file:`-prefixed
|
|
25
|
-
# path/glob whose contents are loaded as facts.
|
|
26
|
-
#
|
|
27
|
-
#
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
]
|
|
25
|
+
# path/glob whose contents are loaded as facts. Empty by default — repo-wide context
|
|
26
|
+
# belongs in AGENTS.md (see bmad-project-context), which every skill already sees. Use
|
|
27
|
+
# this for context only the facilitator needs, loaded on demand rather than carried as
|
|
28
|
+
# constant memory (e.g. `file:{project-root}/**/project-context.md` if you keep one).
|
|
29
|
+
persistent_facts = []
|
|
31
30
|
|
|
32
31
|
# The technique library loaded on demand during the session. Swap the path in
|
|
33
32
|
# team/user TOML to ship a different or extended catalog of creative methods.
|
|
@@ -20,12 +20,11 @@ activation_steps_append = []
|
|
|
20
20
|
# Persistent facts the interrogator keeps in mind for the whole session
|
|
21
21
|
# (domain constraints, house rules, what's off the table). Each entry is a
|
|
22
22
|
# literal sentence, a skill prefixed with `skill:`, or a `file:`-prefixed
|
|
23
|
-
# path/glob whose contents are loaded as facts.
|
|
24
|
-
#
|
|
25
|
-
#
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
]
|
|
23
|
+
# path/glob whose contents are loaded as facts. Empty by default — repo-wide context
|
|
24
|
+
# belongs in AGENTS.md (see bmad-project-context), which every skill already sees. Use
|
|
25
|
+
# this for context only the forge needs, loaded on demand rather than carried as constant
|
|
26
|
+
# memory (e.g. `file:{project-root}/**/project-context.md` if you keep one).
|
|
27
|
+
persistent_facts = []
|
|
29
28
|
|
|
30
29
|
# Executed when the session completes. Scalar or array of instructions. Empty for none.
|
|
31
30
|
on_complete = []
|
|
@@ -22,10 +22,10 @@ activation_steps_append = []
|
|
|
22
22
|
# Persistent facts the orchestrator keeps in mind for the whole session
|
|
23
23
|
# (house rules, running gags, topics to avoid). Each entry is a literal
|
|
24
24
|
# sentence, a `skill:`-prefixed reference, or a `file:`-prefixed path/glob whose
|
|
25
|
-
# contents load as facts.
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
]
|
|
25
|
+
# contents load as facts. Empty by default — repo-wide context belongs in AGENTS.md
|
|
26
|
+
# (see bmad-project-context), which every skill already sees. Use this for context only
|
|
27
|
+
# the party needs, loaded on demand rather than carried as constant memory.
|
|
28
|
+
persistent_facts = []
|
|
29
29
|
|
|
30
30
|
# Which party loads when the user just says "party mode" with no override.
|
|
31
31
|
# Empty = the installed BMAD agents — exactly the default behavior of a plain
|