bmad-method 6.3.1-next.1 → 6.3.1-next.10
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 +1 -2
- package/src/bmm-skills/2-plan-workflows/bmad-create-prd/steps-c/step-08-scoping.md +70 -23
- package/src/bmm-skills/2-plan-workflows/bmad-create-prd/steps-c/step-11-polish.md +1 -1
- package/src/bmm-skills/4-implementation/bmad-quick-dev/step-01-clarify-and-route.md +14 -5
- package/src/bmm-skills/4-implementation/bmad-quick-dev/step-03-implement.md +2 -0
- package/src/bmm-skills/4-implementation/bmad-quick-dev/step-05-present.md +17 -8
- package/src/bmm-skills/4-implementation/bmad-quick-dev/step-oneshot.md +4 -0
- package/src/bmm-skills/4-implementation/bmad-quick-dev/sync-sprint-status.md +19 -0
- package/src/bmm-skills/4-implementation/bmad-quick-dev/workflow.md +1 -0
- package/src/core-skills/module.yaml +1 -0
- package/tools/installer/cli-utils.js +0 -137
- package/tools/installer/commands/status.js +1 -1
- package/tools/installer/commands/uninstall.js +1 -1
- package/tools/installer/core/existing-install.js +1 -1
- package/tools/installer/core/install-paths.js +1 -1
- package/tools/installer/core/installer.js +1 -1
- package/tools/installer/core/manifest-generator.js +8 -6
- package/tools/installer/core/manifest.js +1 -578
- package/tools/installer/file-ops.js +1 -1
- package/tools/installer/fs-native.js +116 -0
- package/tools/installer/ide/_config-driven.js +1 -1
- package/tools/installer/ide/platform-codes.js +1 -1
- package/tools/installer/ide/shared/path-utils.js +0 -145
- package/tools/installer/ide/shared/skill-manifest.js +1 -1
- package/tools/installer/message-loader.js +1 -1
- package/tools/installer/modules/community-manager.js +11 -6
- package/tools/installer/modules/custom-module-manager.js +1 -28
- package/tools/installer/modules/external-manager.js +5 -44
- package/tools/installer/modules/official-modules.js +3 -51
- package/tools/installer/modules/plugin-resolver.js +1 -1
- package/tools/installer/modules/registry-client.js +133 -12
- package/tools/installer/project-root.js +1 -1
- package/tools/installer/prompts.js +0 -106
- package/tools/installer/ui.js +45 -12
- package/tools/migrate-custom-module-paths.js +1 -1
- package/tools/installer/ide/shared/agent-command-generator.js +0 -180
- package/tools/installer/ide/shared/bmad-artifacts.js +0 -208
- package/tools/installer/ide/shared/module-injections.js +0 -136
- package/tools/installer/ide/templates/agent-command-template.md +0 -14
- package/tools/installer/ide/templates/combined/antigravity.md +0 -8
- package/tools/installer/ide/templates/combined/default-agent.md +0 -15
- package/tools/installer/ide/templates/combined/default-task.md +0 -10
- package/tools/installer/ide/templates/combined/default-tool.md +0 -10
- package/tools/installer/ide/templates/combined/default-workflow.md +0 -6
- package/tools/installer/ide/templates/combined/gemini-agent.toml +0 -14
- package/tools/installer/ide/templates/combined/gemini-task.toml +0 -11
- package/tools/installer/ide/templates/combined/gemini-tool.toml +0 -11
- package/tools/installer/ide/templates/combined/gemini-workflow-yaml.toml +0 -16
- package/tools/installer/ide/templates/combined/gemini-workflow.toml +0 -14
- package/tools/installer/ide/templates/combined/kiro-agent.md +0 -16
- package/tools/installer/ide/templates/combined/kiro-task.md +0 -9
- package/tools/installer/ide/templates/combined/kiro-tool.md +0 -9
- package/tools/installer/ide/templates/combined/kiro-workflow.md +0 -7
- package/tools/installer/ide/templates/combined/opencode-agent.md +0 -15
- package/tools/installer/ide/templates/combined/opencode-task.md +0 -13
- package/tools/installer/ide/templates/combined/opencode-tool.md +0 -13
- package/tools/installer/ide/templates/combined/opencode-workflow-yaml.md +0 -16
- package/tools/installer/ide/templates/combined/opencode-workflow.md +0 -16
- package/tools/installer/ide/templates/combined/rovodev.md +0 -9
- package/tools/installer/ide/templates/combined/trae.md +0 -9
- package/tools/installer/ide/templates/combined/windsurf-workflow.md +0 -10
- package/tools/installer/ide/templates/split/.gitkeep +0 -0
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/package.json",
|
|
3
3
|
"name": "bmad-method",
|
|
4
|
-
"version": "6.3.1-next.
|
|
4
|
+
"version": "6.3.1-next.10",
|
|
5
5
|
"description": "Breakthrough Method of Agile AI-driven Development",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"agile",
|
|
@@ -70,7 +70,6 @@
|
|
|
70
70
|
"chalk": "^4.1.2",
|
|
71
71
|
"commander": "^14.0.0",
|
|
72
72
|
"csv-parse": "^6.1.0",
|
|
73
|
-
"fs-extra": "^11.3.0",
|
|
74
73
|
"glob": "^11.0.3",
|
|
75
74
|
"ignore": "^7.0.5",
|
|
76
75
|
"js-yaml": "^4.1.0",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Step 8: Scoping Exercise -
|
|
1
|
+
# Step 8: Scoping Exercise - Scope Definition (Phased or Single-Release)
|
|
2
2
|
|
|
3
3
|
**Progress: Step 8 of 11** - Next: Functional Requirements
|
|
4
4
|
|
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
- 📋 YOU ARE A FACILITATOR, not a content generator
|
|
13
13
|
- 💬 FOCUS on strategic scope decisions that keep projects viable
|
|
14
14
|
- 🎯 EMPHASIZE lean MVP thinking while preserving long-term vision
|
|
15
|
+
- ⚠️ NEVER de-scope, defer, or phase out requirements that the user explicitly included in their input documents without asking first
|
|
16
|
+
- ⚠️ NEVER invent phasing (MVP/Growth/Vision) unless the user requests phased delivery — if input documents define all components as core requirements, they are ALL in scope
|
|
15
17
|
- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}`
|
|
16
18
|
- ✅ YOU MUST ALWAYS WRITE all artifact and document content in `{document_output_language}`
|
|
17
19
|
|
|
@@ -34,7 +36,7 @@
|
|
|
34
36
|
|
|
35
37
|
## YOUR TASK:
|
|
36
38
|
|
|
37
|
-
Conduct comprehensive scoping exercise to define
|
|
39
|
+
Conduct comprehensive scoping exercise to define release boundaries and prioritize features based on the user's chosen delivery mode (phased or single-release).
|
|
38
40
|
|
|
39
41
|
## SCOPING SEQUENCE:
|
|
40
42
|
|
|
@@ -75,30 +77,41 @@ Use structured decision-making for scope:
|
|
|
75
77
|
- Advanced functionality that builds on MVP
|
|
76
78
|
- Ask what features could be added in versions 2, 3, etc.
|
|
77
79
|
|
|
80
|
+
**⚠️ SCOPE CHANGE CONFIRMATION GATE:**
|
|
81
|
+
- If you believe any user-specified requirement should be deferred or de-scoped, you MUST present this to the user and get explicit confirmation BEFORE removing it from scope
|
|
82
|
+
- Frame it as a recommendation, not a decision: "I'd recommend deferring X because [reason]. Do you agree, or should it stay in scope?"
|
|
83
|
+
- NEVER silently move user requirements to a later phase or exclude them from MVP
|
|
84
|
+
- Before creating any consequential phase-based artifacts (e.g., phase tags, labels, or follow-on prompts), present artifact creation as a recommendation and proceed only after explicit user approval
|
|
85
|
+
|
|
78
86
|
### 4. Progressive Feature Roadmap
|
|
79
87
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
88
|
+
**CRITICAL: Phasing is NOT automatic. Check the user's input first.**
|
|
89
|
+
|
|
90
|
+
Before proposing any phased approach, review the user's input documents:
|
|
91
|
+
|
|
92
|
+
- **If the input documents define all components as core requirements with no mention of phases:** Present all requirements as a single release scope. Do NOT invent phases or move requirements to fabricated future phases.
|
|
93
|
+
- **If the input documents explicitly request phased delivery:** Guide mapping of features across the phases the user defined.
|
|
94
|
+
- **If scope is unclear:** ASK the user whether they want phased delivery or a single release before proceeding.
|
|
84
95
|
|
|
85
|
-
|
|
86
|
-
- Essential user journeys
|
|
87
|
-
- Basic functionality that works reliably
|
|
96
|
+
**When the user requests phased delivery**, guide mapping of features across the phases the user defines:
|
|
88
97
|
|
|
89
|
-
|
|
98
|
+
- Use user-provided phase labels and count; if none are provided, propose a default (e.g., MVP/Growth/Vision) and ask for confirmation
|
|
99
|
+
- Ensure clear progression and dependencies between phases
|
|
90
100
|
|
|
91
|
-
|
|
92
|
-
- Enhanced features
|
|
93
|
-
- Scale improvements
|
|
101
|
+
**Each phase should address:**
|
|
94
102
|
|
|
95
|
-
|
|
103
|
+
- Core user value delivery and essential journeys for that phase
|
|
104
|
+
- Clear boundaries on what ships in each phase
|
|
105
|
+
- Dependencies on prior phases
|
|
96
106
|
|
|
97
|
-
|
|
98
|
-
- Platform features
|
|
99
|
-
- New markets or use cases
|
|
107
|
+
**When the user chooses a single release**, define the complete scope:
|
|
100
108
|
|
|
101
|
-
|
|
109
|
+
- All user-specified requirements are in scope
|
|
110
|
+
- Focus must-have vs nice-to-have analysis on what ships in this release
|
|
111
|
+
- Do NOT create phases — use must-have/nice-to-have priority within the single release
|
|
112
|
+
|
|
113
|
+
**If phased delivery:** "Where does your current vision fit in this development sequence?"
|
|
114
|
+
**If single release:** "How does your current vision map to this upcoming release?"
|
|
102
115
|
|
|
103
116
|
### 5. Risk-Based Scoping
|
|
104
117
|
|
|
@@ -129,6 +142,8 @@ Prepare comprehensive scoping section:
|
|
|
129
142
|
|
|
130
143
|
#### Content Structure:
|
|
131
144
|
|
|
145
|
+
**If user chose phased delivery:**
|
|
146
|
+
|
|
132
147
|
```markdown
|
|
133
148
|
## Project Scoping & Phased Development
|
|
134
149
|
|
|
@@ -160,11 +175,39 @@ Prepare comprehensive scoping section:
|
|
|
160
175
|
**Resource Risks:** {{contingency_approach}}
|
|
161
176
|
```
|
|
162
177
|
|
|
178
|
+
**If user chose single release (no phasing):**
|
|
179
|
+
|
|
180
|
+
```markdown
|
|
181
|
+
## Project Scoping
|
|
182
|
+
|
|
183
|
+
### Strategy & Philosophy
|
|
184
|
+
|
|
185
|
+
**Approach:** {{chosen_approach}}
|
|
186
|
+
**Resource Requirements:** {{team_size_and_skills}}
|
|
187
|
+
|
|
188
|
+
### Complete Feature Set
|
|
189
|
+
|
|
190
|
+
**Core User Journeys Supported:**
|
|
191
|
+
{{all_journeys}}
|
|
192
|
+
|
|
193
|
+
**Must-Have Capabilities:**
|
|
194
|
+
{{list_of_must_have_features}}
|
|
195
|
+
|
|
196
|
+
**Nice-to-Have Capabilities:**
|
|
197
|
+
{{list_of_nice_to_have_features}}
|
|
198
|
+
|
|
199
|
+
### Risk Mitigation Strategy
|
|
200
|
+
|
|
201
|
+
**Technical Risks:** {{mitigation_approach}}
|
|
202
|
+
**Market Risks:** {{validation_approach}}
|
|
203
|
+
**Resource Risks:** {{contingency_approach}}
|
|
204
|
+
```
|
|
205
|
+
|
|
163
206
|
### 7. Present MENU OPTIONS
|
|
164
207
|
|
|
165
208
|
Present the scoping decisions for review, then display menu:
|
|
166
209
|
- Show strategic scoping plan (using structure from step 6)
|
|
167
|
-
- Highlight
|
|
210
|
+
- Highlight release boundaries and prioritization (phased roadmap only if phased delivery was selected)
|
|
168
211
|
- Ask if they'd like to refine further, get other perspectives, or proceed
|
|
169
212
|
- Present menu options naturally as part of conversation
|
|
170
213
|
|
|
@@ -173,7 +216,7 @@ Display: "**Select:** [A] Advanced Elicitation [P] Party Mode [C] Continue to Fu
|
|
|
173
216
|
#### Menu Handling Logic:
|
|
174
217
|
- IF A: Invoke the `bmad-advanced-elicitation` skill with the current scoping analysis, process the enhanced insights that come back, ask user if they accept the improvements, if yes update content then redisplay menu, if no keep original content then redisplay menu
|
|
175
218
|
- IF P: Invoke the `bmad-party-mode` skill with the scoping context, process the collaborative insights on MVP and roadmap decisions, ask user if they accept the changes, if yes update content then redisplay menu, if no keep original content then redisplay menu
|
|
176
|
-
- IF C: Append the final content to {outputFile}, update frontmatter by adding this step name to the end of the stepsCompleted array, then read fully and follow: ./step-09-functional.md
|
|
219
|
+
- IF C: Append the final content to {outputFile}, update frontmatter by adding this step name to the end of the stepsCompleted array (also add `releaseMode: phased` or `releaseMode: single-release` to frontmatter based on user's choice), then read fully and follow: ./step-09-functional.md
|
|
177
220
|
- IF Any other: help user respond, then redisplay menu
|
|
178
221
|
|
|
179
222
|
#### EXECUTION RULES:
|
|
@@ -189,8 +232,9 @@ When user selects 'C', append the content directly to the document using the str
|
|
|
189
232
|
|
|
190
233
|
✅ Complete PRD document analyzed for scope implications
|
|
191
234
|
✅ Strategic MVP approach defined and justified
|
|
192
|
-
✅ Clear
|
|
193
|
-
✅
|
|
235
|
+
✅ Clear feature boundaries established (phased or single-release, per user preference)
|
|
236
|
+
✅ All user-specified requirements accounted for — none silently removed or deferred
|
|
237
|
+
✅ Any scope reduction recommendations presented to user with rationale and explicit confirmation obtained
|
|
194
238
|
✅ Key risks identified and mitigation strategies defined
|
|
195
239
|
✅ User explicitly agrees to scope decisions
|
|
196
240
|
✅ A/P/C menu presented and handled correctly
|
|
@@ -202,8 +246,11 @@ When user selects 'C', append the content directly to the document using the str
|
|
|
202
246
|
❌ Making scope decisions without strategic rationale
|
|
203
247
|
❌ Not getting explicit user agreement on MVP boundaries
|
|
204
248
|
❌ Missing critical risk analysis
|
|
205
|
-
❌ Not creating clear phased development approach
|
|
206
249
|
❌ Not presenting A/P/C menu after content generation
|
|
250
|
+
❌ **CRITICAL**: Silently de-scoping or deferring requirements that the user explicitly included in their input documents
|
|
251
|
+
❌ **CRITICAL**: Inventing phasing (MVP/Growth/Vision) when the user did not request phased delivery
|
|
252
|
+
❌ **CRITICAL**: Making consequential scoping decisions (what is in/out of scope) without explicit user confirmation
|
|
253
|
+
❌ **CRITICAL**: Creating phase-based artifacts (tags, labels, follow-on prompts) without explicit user approval
|
|
207
254
|
|
|
208
255
|
❌ **CRITICAL**: Reading only partial step file - leads to incomplete understanding and poor decisions
|
|
209
256
|
❌ **CRITICAL**: Proceeding with 'C' without fully reading and understanding the next step file
|
|
@@ -138,7 +138,7 @@ Make targeted improvements:
|
|
|
138
138
|
- All user success criteria
|
|
139
139
|
- All functional requirements (capability contract)
|
|
140
140
|
- All user journey narratives
|
|
141
|
-
- All scope decisions (
|
|
141
|
+
- All scope decisions (whether phased or single-release), including consent-critical evidence (explicit user confirmations and rationales for any scope changes from step 8)
|
|
142
142
|
- All non-functional requirements
|
|
143
143
|
- Product differentiator and vision
|
|
144
144
|
- Domain-specific requirements
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
deferred_work_file: '{implementation_artifacts}/deferred-work.md'
|
|
3
3
|
spec_file: '' # set at runtime for both routes before leaving this step
|
|
4
|
+
story_key: '' # set at runtime to the current story's full sprint-status key (e.g. 3-2-digest-delivery) when the intent is an epic story and sprint-status resolution succeeds
|
|
4
5
|
---
|
|
5
6
|
|
|
6
7
|
# Step 1: Clarify and Route
|
|
@@ -20,7 +21,7 @@ Before listing artifacts or prompting the user, check whether you already know t
|
|
|
20
21
|
|
|
21
22
|
1. Explicit argument
|
|
22
23
|
Did the user pass a specific file path, spec name, or clear instruction this message?
|
|
23
|
-
- If it points to a file that matches the spec template (has `status` frontmatter with a recognized value: draft, ready-for-dev, in-progress, in-review, or done) → set `spec_file
|
|
24
|
+
- If it points to a file that matches the spec template (has `status` frontmatter with a recognized value: draft, ready-for-dev, in-progress, in-review, or done) → set `spec_file`. Before exiting, run **Story-key resolution** (below). Then **EARLY EXIT** to the appropriate step (step-02 for draft, step-03 for ready/in-progress, step-04 for review). For `done`, ingest as context and proceed to INSTRUCTIONS — do not resume.
|
|
24
25
|
- Anything else (intent files, external docs, plans, descriptions) → ingest it as starting intent and proceed to INSTRUCTIONS. Do not attempt to infer a workflow state from it.
|
|
25
26
|
|
|
26
27
|
2. Recent conversation
|
|
@@ -29,13 +30,19 @@ Before listing artifacts or prompting the user, check whether you already know t
|
|
|
29
30
|
|
|
30
31
|
3. Otherwise — scan artifacts and ask
|
|
31
32
|
- Active specs (`draft`, `ready-for-dev`, `in-progress`, `in-review`) in `{implementation_artifacts}`? → List them and HALT. Ask user which to resume (or `[N]` for new).
|
|
32
|
-
- If `draft` selected: Set `spec_file`. **EARLY EXIT** → `./step-02-plan.md` (resume planning from the draft)
|
|
33
|
-
- If `ready-for-dev` or `in-progress` selected: Set `spec_file`. **EARLY EXIT** → `./step-03-implement.md`
|
|
34
|
-
- If `in-review` selected: Set `spec_file`. **EARLY EXIT** → `./step-04-review.md`
|
|
33
|
+
- If `draft` selected: Set `spec_file`. Run **Story-key resolution** (below). **EARLY EXIT** → `./step-02-plan.md` (resume planning from the draft)
|
|
34
|
+
- If `ready-for-dev` or `in-progress` selected: Set `spec_file`. Run **Story-key resolution** (below). **EARLY EXIT** → `./step-03-implement.md`
|
|
35
|
+
- If `in-review` selected: Set `spec_file`. Run **Story-key resolution** (below). **EARLY EXIT** → `./step-04-review.md`
|
|
35
36
|
- Unformatted spec or intent file lacking `status` frontmatter? → Suggest treating its contents as the starting intent. Do NOT attempt to infer a state and resume it.
|
|
36
37
|
|
|
37
38
|
Never ask extra questions if you already understand what the user intends.
|
|
38
39
|
|
|
40
|
+
### Story-key resolution
|
|
41
|
+
|
|
42
|
+
This runs on ALL paths (early-exit and INSTRUCTIONS) whenever `spec_file` is set. Determine whether the spec is an epic story — use the spec's filename, frontmatter, and any loaded epics file to identify `{epic_num}` and `{story_num}`. If the spec is not an epic story, skip silently and leave `{story_key}` unset.
|
|
43
|
+
|
|
44
|
+
If the spec is an epic story and `{sprint_status}` exists: find the `development_status` key matching `{epic_num}-{story_num}` by exact numeric equality on the first two segments (so `1-1` never collides with `1-10`). Exactly one match → set `{story_key}` to that full key. Zero or multiple matches → leave `{story_key}` unset (warn on multiple).
|
|
45
|
+
|
|
39
46
|
## INSTRUCTIONS
|
|
40
47
|
|
|
41
48
|
1. Load context.
|
|
@@ -45,7 +52,7 @@ Never ask extra questions if you already understand what the user intends.
|
|
|
45
52
|
|
|
46
53
|
**A) Epic story path** — if the intent is clearly an epic story:
|
|
47
54
|
|
|
48
|
-
1. Identify the epic number and (if present) the story number
|
|
55
|
+
1. Identify the epic number `{epic_num}` and (if present) the story number `{story_num}`. If you can't identify an epic number, use path B.
|
|
49
56
|
|
|
50
57
|
2. **Check for a valid cached epic context.** Look for `{implementation_artifacts}/epic-<N>-context.md` (where `<N>` is the epic number). A file is **valid** when it exists, is non-empty, starts with `# Epic <N> Context:` (with the correct epic number), and no file in `{planning_artifacts}` is newer.
|
|
51
58
|
- **If valid:** load it as the primary planning context. Do not load raw planning docs (PRD, architecture, UX, etc.). Skip to step 5.
|
|
@@ -59,6 +66,8 @@ Never ask extra questions if you already understand what the user intends.
|
|
|
59
66
|
|
|
60
67
|
5. **Previous story continuity.** Regardless of which context source succeeded above, scan `{implementation_artifacts}` for specs from the same epic with `status: done` and a lower story number. Load the most recent one (highest story number below current). Extract its **Code Map**, **Design Notes**, **Spec Change Log**, and **task list** as continuity context for step-02 planning. If no `done` spec is found but an `in-review` spec exists for the same epic with a lower story number, note it to the user and ask whether to load it.
|
|
61
68
|
|
|
69
|
+
6. **Resolve `{story_key}`.** If not already set by an earlier early-exit path, run **Story-key resolution** (above) now.
|
|
70
|
+
|
|
62
71
|
**B) Freeform path** — if the intent is not an epic story:
|
|
63
72
|
- Planning artifacts are the output of BMAD phases 1-3. Typical files include:
|
|
64
73
|
- **PRD** (`*prd*`) — product requirements and success criteria
|
|
@@ -24,6 +24,8 @@ Capture `baseline_commit` (current HEAD, or `NO_VCS` if version control is unava
|
|
|
24
24
|
|
|
25
25
|
Change `{spec_file}` status to `in-progress` in the frontmatter before starting implementation.
|
|
26
26
|
|
|
27
|
+
Follow `./sync-sprint-status.md` with `{target_status}` = `in-progress`.
|
|
28
|
+
|
|
27
29
|
If `{spec_file}` has a non-empty `context:` list in its frontmatter, load those files before implementation begins. When handing to a sub-agent, include them in the sub-agent prompt so it has access to the referenced context.
|
|
28
30
|
|
|
29
31
|
Hand `{spec_file}` to a sub-agent/task and let it implement. If no sub-agents are available, implement directly.
|
|
@@ -48,16 +48,25 @@ Format each stop as framing first, link on the next indented line:
|
|
|
48
48
|
|
|
49
49
|
When there is only one concern, omit the bold label — just list the stops directly.
|
|
50
50
|
|
|
51
|
-
###
|
|
51
|
+
### Mark Spec Done
|
|
52
52
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
53
|
+
Change `{spec_file}` status to `done` in the frontmatter.
|
|
54
|
+
|
|
55
|
+
Follow `./sync-sprint-status.md` with `{target_status}` = `review`.
|
|
56
|
+
|
|
57
|
+
### Commit and Open
|
|
58
|
+
|
|
59
|
+
1. If version control is available and the tree is dirty, create a local commit with a conventional message derived from the spec title.
|
|
60
|
+
2. Open the spec in the user's editor so they can click through the Suggested Review Order:
|
|
56
61
|
- Resolve two absolute paths: (1) the repository root (`git rev-parse --show-toplevel` — returns the worktree root when in a worktree, project root otherwise; if this fails, fall back to the current working directory), (2) `{spec_file}`. Run `code -r "{absolute-root}" "{absolute-spec-file}"` — the root first so VS Code opens in the right context, then the spec file. Always double-quote paths to handle spaces and special characters.
|
|
57
62
|
- If `code` is not available (command fails), skip gracefully and tell the user the spec file path instead.
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
63
|
+
|
|
64
|
+
### Display Summary
|
|
65
|
+
|
|
66
|
+
Display summary of your work to the user, including the commit hash if one was created. Any file paths shown in conversation/terminal output must use CWD-relative format (no leading `/`) with `:line` notation (e.g., `src/path/file.ts:42`) for terminal clickability — the goal is to make paths clickable in terminal emulators. Include:
|
|
67
|
+
|
|
68
|
+
- A note that the spec is open in their editor (or the file path if it couldn't be opened). Mention that `{spec_file}` now contains a Suggested Review Order.
|
|
69
|
+
- **Navigation tip:** "Ctrl+click (Cmd+click on macOS) the links in the Suggested Review Order to jump to each stop."
|
|
70
|
+
- Offer to push and/or create a pull request.
|
|
62
71
|
|
|
63
72
|
Workflow complete.
|
|
@@ -13,6 +13,8 @@ deferred_work_file: '{implementation_artifacts}/deferred-work.md'
|
|
|
13
13
|
|
|
14
14
|
### Implement
|
|
15
15
|
|
|
16
|
+
Follow `./sync-sprint-status.md` with `{target_status}` = `in-progress`.
|
|
17
|
+
|
|
16
18
|
Implement the clarified intent directly.
|
|
17
19
|
|
|
18
20
|
### Review
|
|
@@ -39,6 +41,8 @@ Write `{spec_file}` using `./spec-template.md`. Fill only these sections — del
|
|
|
39
41
|
2. **Title and Intent** — `# {title}` heading and `## Intent` with **Problem** and **Approach** lines. Reuse the summary you already generated for the terminal.
|
|
40
42
|
3. **Suggested Review Order** — append after Intent. Build using the same convention as `./step-05-present.md` § "Generate Suggested Review Order" (spec-file-relative links, concern-based ordering, ultra-concise framing).
|
|
41
43
|
|
|
44
|
+
Follow `./sync-sprint-status.md` with `{target_status}` = `review`.
|
|
45
|
+
|
|
42
46
|
### Commit
|
|
43
47
|
|
|
44
48
|
If version control is available and the tree is dirty, create a local commit with a conventional message derived from the intent. If VCS is unavailable, skip.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Sync Sprint Status
|
|
2
|
+
|
|
3
|
+
Shared sub-step for updating `sprint-status.yaml` during quick-dev. Called from any route (plan-code-review, one-shot, future routes) with a `{target_status}` parameter.
|
|
4
|
+
|
|
5
|
+
## Preconditions
|
|
6
|
+
|
|
7
|
+
Skip this entire file (return to caller) if ANY of:
|
|
8
|
+
- `{story_key}` is unset
|
|
9
|
+
- `{sprint_status}` does not exist on disk
|
|
10
|
+
|
|
11
|
+
## Instructions
|
|
12
|
+
|
|
13
|
+
1. Load the FULL `{sprint_status}` file.
|
|
14
|
+
2. Find the `development_status` entry matching `{story_key}`. If not found, warn the user once (`"{story_key} not found in sprint-status; skipping sprint sync"`) and return to caller.
|
|
15
|
+
3. **Idempotency check.** If `development_status[{story_key}]` is already at `{target_status}` or a later state (`review` is later than `in-progress`; `done` is later than both), return to caller — no write needed. Never regress a story's status.
|
|
16
|
+
4. Set `development_status[{story_key}]` to `{target_status}`.
|
|
17
|
+
5. **Epic lift (only when `{target_status}` = `in-progress`).** Derive the parent epic key as `epic-{N}` from the leading numeric segment of `{story_key}` (e.g., `3-2-digest-delivery` → `epic-3`). If that entry exists and is `backlog`, set it to `in-progress`. Leave it alone otherwise. Skip this sub-step entirely when `{target_status}` is not `in-progress`.
|
|
18
|
+
6. Refresh `last_updated` to the current date.
|
|
19
|
+
7. Save the file, preserving ALL comments and structure including STATUS DEFINITIONS and WORKFLOW NOTES.
|
|
@@ -65,6 +65,7 @@ Load and read full config from `{main_config}` and resolve:
|
|
|
65
65
|
- `project_name`, `planning_artifacts`, `implementation_artifacts`, `user_name`
|
|
66
66
|
- `communication_language`, `document_output_language`, `user_skill_level`
|
|
67
67
|
- `date` as system-generated current datetime
|
|
68
|
+
- `sprint_status` = `{implementation_artifacts}/sprint-status.yaml`
|
|
68
69
|
- `project_context` = `**/project-context.md` (load if exists)
|
|
69
70
|
- CLAUDE.md / memory files (load if exist)
|
|
70
71
|
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
code: core
|
|
2
2
|
name: "BMad Core Module"
|
|
3
|
+
description: "Core configuration and shared resources"
|
|
3
4
|
|
|
4
5
|
header: "BMad Core Configuration"
|
|
5
6
|
subheader: "Configure the core settings for your BMad installation.\nThese settings will be used across all installed bmad skills, workflows, and agents."
|
|
@@ -1,20 +1,6 @@
|
|
|
1
|
-
const path = require('node:path');
|
|
2
|
-
const os = require('node:os');
|
|
3
1
|
const prompts = require('./prompts');
|
|
4
2
|
|
|
5
3
|
const CLIUtils = {
|
|
6
|
-
/**
|
|
7
|
-
* Get version from package.json
|
|
8
|
-
*/
|
|
9
|
-
getVersion() {
|
|
10
|
-
try {
|
|
11
|
-
const packageJson = require(path.join(__dirname, '..', '..', 'package.json'));
|
|
12
|
-
return packageJson.version || 'Unknown';
|
|
13
|
-
} catch {
|
|
14
|
-
return 'Unknown';
|
|
15
|
-
}
|
|
16
|
-
},
|
|
17
|
-
|
|
18
4
|
/**
|
|
19
5
|
* Display BMAD logo and version using @clack intro + box
|
|
20
6
|
*/
|
|
@@ -52,37 +38,6 @@ const CLIUtils = {
|
|
|
52
38
|
});
|
|
53
39
|
},
|
|
54
40
|
|
|
55
|
-
/**
|
|
56
|
-
* Display section header
|
|
57
|
-
* @param {string} title - Section title
|
|
58
|
-
* @param {string} subtitle - Optional subtitle
|
|
59
|
-
*/
|
|
60
|
-
async displaySection(title, subtitle = null) {
|
|
61
|
-
await prompts.note(subtitle || '', title);
|
|
62
|
-
},
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* Display info box
|
|
66
|
-
* @param {string|Array} content - Content to display
|
|
67
|
-
* @param {Object} options - Box options
|
|
68
|
-
*/
|
|
69
|
-
async displayBox(content, options = {}) {
|
|
70
|
-
let text = content;
|
|
71
|
-
if (Array.isArray(content)) {
|
|
72
|
-
text = content.join('\n\n');
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
const color = await prompts.getColor();
|
|
76
|
-
const borderColor = options.borderColor || 'cyan';
|
|
77
|
-
const colorMap = { green: color.green, red: color.red, yellow: color.yellow, cyan: color.cyan, blue: color.blue };
|
|
78
|
-
const formatBorder = colorMap[borderColor] || color.cyan;
|
|
79
|
-
|
|
80
|
-
await prompts.box(text, options.title, {
|
|
81
|
-
rounded: options.borderStyle === 'round' || options.borderStyle === undefined,
|
|
82
|
-
formatBorder,
|
|
83
|
-
});
|
|
84
|
-
},
|
|
85
|
-
|
|
86
41
|
/**
|
|
87
42
|
* Display module configuration header
|
|
88
43
|
* @param {string} moduleName - Module name (fallback if no custom header)
|
|
@@ -93,98 +48,6 @@ const CLIUtils = {
|
|
|
93
48
|
const title = header || `Configuring ${moduleName.toUpperCase()} Module`;
|
|
94
49
|
await prompts.note(subheader || '', title);
|
|
95
50
|
},
|
|
96
|
-
|
|
97
|
-
/**
|
|
98
|
-
* Display module with no custom configuration
|
|
99
|
-
* @param {string} moduleName - Module name (fallback if no custom header)
|
|
100
|
-
* @param {string} header - Custom header from module.yaml
|
|
101
|
-
* @param {string} subheader - Custom subheader from module.yaml
|
|
102
|
-
*/
|
|
103
|
-
async displayModuleNoConfig(moduleName, header = null, subheader = null) {
|
|
104
|
-
const title = header || `${moduleName.toUpperCase()} Module - No Custom Configuration`;
|
|
105
|
-
await prompts.note(subheader || '', title);
|
|
106
|
-
},
|
|
107
|
-
|
|
108
|
-
/**
|
|
109
|
-
* Display step indicator
|
|
110
|
-
* @param {number} current - Current step
|
|
111
|
-
* @param {number} total - Total steps
|
|
112
|
-
* @param {string} description - Step description
|
|
113
|
-
*/
|
|
114
|
-
async displayStep(current, total, description) {
|
|
115
|
-
const progress = `[${current}/${total}]`;
|
|
116
|
-
await prompts.log.step(`${progress} ${description}`);
|
|
117
|
-
},
|
|
118
|
-
|
|
119
|
-
/**
|
|
120
|
-
* Display completion message
|
|
121
|
-
* @param {string} message - Completion message
|
|
122
|
-
*/
|
|
123
|
-
async displayComplete(message) {
|
|
124
|
-
const color = await prompts.getColor();
|
|
125
|
-
await prompts.box(`\u2728 ${message}`, 'Complete', {
|
|
126
|
-
rounded: true,
|
|
127
|
-
formatBorder: color.green,
|
|
128
|
-
});
|
|
129
|
-
},
|
|
130
|
-
|
|
131
|
-
/**
|
|
132
|
-
* Display error message
|
|
133
|
-
* @param {string} message - Error message
|
|
134
|
-
*/
|
|
135
|
-
async displayError(message) {
|
|
136
|
-
const color = await prompts.getColor();
|
|
137
|
-
await prompts.box(`\u2717 ${message}`, 'Error', {
|
|
138
|
-
rounded: true,
|
|
139
|
-
formatBorder: color.red,
|
|
140
|
-
});
|
|
141
|
-
},
|
|
142
|
-
|
|
143
|
-
/**
|
|
144
|
-
* Format list for display
|
|
145
|
-
* @param {Array} items - Items to display
|
|
146
|
-
* @param {string} prefix - Item prefix
|
|
147
|
-
*/
|
|
148
|
-
formatList(items, prefix = '\u2022') {
|
|
149
|
-
return items.map((item) => ` ${prefix} ${item}`).join('\n');
|
|
150
|
-
},
|
|
151
|
-
|
|
152
|
-
/**
|
|
153
|
-
* Clear previous lines
|
|
154
|
-
* @param {number} lines - Number of lines to clear
|
|
155
|
-
*/
|
|
156
|
-
clearLines(lines) {
|
|
157
|
-
for (let i = 0; i < lines; i++) {
|
|
158
|
-
process.stdout.moveCursor(0, -1);
|
|
159
|
-
process.stdout.clearLine(1);
|
|
160
|
-
}
|
|
161
|
-
},
|
|
162
|
-
|
|
163
|
-
/**
|
|
164
|
-
* Display module completion message
|
|
165
|
-
* @param {string} moduleName - Name of the completed module
|
|
166
|
-
* @param {boolean} clearScreen - Whether to clear the screen first (deprecated, always false now)
|
|
167
|
-
*/
|
|
168
|
-
displayModuleComplete(moduleName, clearScreen = false) {
|
|
169
|
-
// No longer clear screen or show boxes - just a simple completion message
|
|
170
|
-
// This is deprecated but kept for backwards compatibility
|
|
171
|
-
},
|
|
172
|
-
|
|
173
|
-
/**
|
|
174
|
-
* Expand path with ~ expansion
|
|
175
|
-
* @param {string} inputPath - Path to expand
|
|
176
|
-
* @returns {string} Expanded path
|
|
177
|
-
*/
|
|
178
|
-
expandPath(inputPath) {
|
|
179
|
-
if (!inputPath) return inputPath;
|
|
180
|
-
|
|
181
|
-
// Expand ~ to home directory
|
|
182
|
-
if (inputPath.startsWith('~')) {
|
|
183
|
-
return path.join(os.homedir(), inputPath.slice(1));
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
return inputPath;
|
|
187
|
-
},
|
|
188
51
|
};
|
|
189
52
|
|
|
190
53
|
module.exports = { CLIUtils };
|
|
@@ -19,7 +19,7 @@ module.exports = {
|
|
|
19
19
|
const { bmadDir } = await installer.findBmadDir(projectDir);
|
|
20
20
|
|
|
21
21
|
// Check if bmad directory exists
|
|
22
|
-
const fs = require('fs-
|
|
22
|
+
const fs = require('../fs-native');
|
|
23
23
|
if (!(await fs.pathExists(bmadDir))) {
|
|
24
24
|
await prompts.log.warn('No BMAD installation found in the current directory.');
|
|
25
25
|
await prompts.log.message(`Expected location: ${bmadDir}`);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const path = require('node:path');
|
|
2
|
-
const fs = require('fs-
|
|
2
|
+
const fs = require('../fs-native');
|
|
3
3
|
const { Manifest } = require('./manifest');
|
|
4
4
|
const { OfficialModules } = require('../modules/official-modules');
|
|
5
5
|
const { IdeManager } = require('../ide/manager');
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const path = require('node:path');
|
|
2
|
-
const fs = require('fs-
|
|
2
|
+
const fs = require('../fs-native');
|
|
3
3
|
const yaml = require('yaml');
|
|
4
4
|
const crypto = require('node:crypto');
|
|
5
5
|
const csv = require('csv-parse/sync');
|
|
@@ -193,11 +193,13 @@ class ManifestGenerator {
|
|
|
193
193
|
}
|
|
194
194
|
}
|
|
195
195
|
|
|
196
|
-
// Recurse into subdirectories
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
196
|
+
// Recurse into subdirectories — but not inside a discovered skill
|
|
197
|
+
if (!skillMeta) {
|
|
198
|
+
for (const entry of entries) {
|
|
199
|
+
if (!entry.isDirectory()) continue;
|
|
200
|
+
if (entry.name.startsWith('.') || entry.name.startsWith('_')) continue;
|
|
201
|
+
await walk(path.join(dir, entry.name));
|
|
202
|
+
}
|
|
201
203
|
}
|
|
202
204
|
};
|
|
203
205
|
|