bmad-method 6.12.1-next.0 → 6.12.1-next.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 (40) hide show
  1. package/package.json +1 -1
  2. package/src/bmm-skills/agents/bmad-agent-analyst/SKILL.md +1 -1
  3. package/src/bmm-skills/agents/bmad-agent-architect/SKILL.md +1 -1
  4. package/src/bmm-skills/agents/bmad-agent-dev/SKILL.md +1 -1
  5. package/src/bmm-skills/agents/bmad-agent-pm/SKILL.md +1 -1
  6. package/src/bmm-skills/agents/bmad-agent-ux-designer/SKILL.md +1 -1
  7. package/src/bmm-skills/plan/bmad-create-epics-and-stories/SKILL.md +1 -1
  8. package/src/bmm-skills/plan/bmad-create-epics-and-stories/steps/step-04-final-validation.md +6 -8
  9. package/src/bmm-skills/plan/bmad-create-epics-and-stories/templates/epics-template.md +1 -0
  10. package/src/bmm-skills/plan/bmad-prd/SKILL.md +1 -1
  11. package/src/bmm-skills/plan/bmad-prfaq/SKILL.md +1 -1
  12. package/src/bmm-skills/plan/bmad-product-brief/SKILL.md +1 -1
  13. package/src/bmm-skills/plan/bmad-sprint-planning/SKILL.md +1 -1
  14. package/src/bmm-skills/plan/bmad-sprint-planning/scripts/__pycache__/sprint_plan.cpython-311.pyc +0 -0
  15. package/src/bmm-skills/plan/bmad-sprint-planning/scripts/tests/__pycache__/test_sprint_plan.cpython-311-pytest-9.1.1.pyc +0 -0
  16. package/src/bmm-skills/plan/bmad-ux/SKILL.md +1 -1
  17. package/src/bmm-skills/ship/bmad-code-review/SKILL.md +1 -1
  18. package/src/bmm-skills/ship/bmad-correct-course/SKILL.md +1 -1
  19. package/src/bmm-skills/ship/bmad-qa-generate-e2e-tests/SKILL.md +1 -1
  20. package/src/bmm-skills/ship/bmad-retrospective/SKILL.md +1 -1
  21. package/src/bmm-skills/ship/bmad-retrospective/scripts/__pycache__/sprint_status.cpython-311.pyc +0 -0
  22. package/src/bmm-skills/ship/bmad-retrospective/scripts/tests/__pycache__/test_git_evidence.cpython-311-pytest-9.1.1.pyc +0 -0
  23. package/src/bmm-skills/ship/bmad-retrospective/scripts/tests/__pycache__/test_sprint_status.cpython-311-pytest-9.1.1.pyc +0 -0
  24. package/src/bmm-skills/ship/bmad-walkthrough/SKILL.md +1 -1
  25. package/src/bmm-skills/v6-shims/bmad-create-architecture/SKILL.md +1 -1
  26. package/src/bmm-skills/v6-shims/bmad-create-prd/SKILL.md +1 -1
  27. package/src/bmm-skills/v6-shims/bmad-create-story/SKILL.md +1 -1
  28. package/src/bmm-skills/v6-shims/bmad-dev-story/SKILL.md +1 -1
  29. package/src/bmm-skills/v6-shims/bmad-edit-prd/SKILL.md +1 -1
  30. package/src/bmm-skills/v6-shims/bmad-sprint-status/SKILL.md +1 -1
  31. package/src/bmm-skills/v6-shims/bmad-validate-prd/SKILL.md +1 -1
  32. package/src/core-skills/bmad-party-mode/references/create-party.md +1 -1
  33. package/src/core-skills/bmad-party-mode/scripts/resolve_party.py +16 -0
  34. package/src/core-skills/bmad-party-mode/scripts/tests/test_resolve_party.py +15 -0
  35. package/src/scripts/__pycache__/config_utils.cpython-311.pyc +0 -0
  36. package/src/scripts/tests/__pycache__/test_config_utils.cpython-311.pyc +0 -0
  37. package/src/scripts/tests/__pycache__/test_resolve_config.cpython-311.pyc +0 -0
  38. package/src/scripts/tests/__pycache__/test_resolve_customization.cpython-311.pyc +0 -0
  39. package/tools/installer/core/manifest-generator.js +18 -0
  40. package/tools/tests/__pycache__/test_validate_skills.cpython-311.pyc +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.12.1-next.0",
4
+ "version": "6.12.1-next.1",
5
5
  "description": "Breakthrough Method of Agile AI-driven Development",
6
6
  "keywords": [
7
7
  "agile",
@@ -46,7 +46,7 @@ Treat every entry in `{agent.persistent_facts}` as foundational context you carr
46
46
 
47
47
  ### Step 5: Load Config
48
48
 
49
- Load config from `{project-root}/_bmad/bmm/config.yaml` and resolve:
49
+ Run `uv run {project-root}/_bmad/scripts/resolve_config.py --project-root {project-root}` and use:
50
50
  - Use `{user_name}` for greeting
51
51
  - Use `{communication_language}` for all communications
52
52
  - Use `{document_output_language}` for output documents
@@ -46,7 +46,7 @@ Treat every entry in `{agent.persistent_facts}` as foundational context you carr
46
46
 
47
47
  ### Step 5: Load Config
48
48
 
49
- Load config from `{project-root}/_bmad/bmm/config.yaml` and resolve:
49
+ Run `uv run {project-root}/_bmad/scripts/resolve_config.py --project-root {project-root}` and use:
50
50
  - Use `{user_name}` for greeting
51
51
  - Use `{communication_language}` for all communications
52
52
  - Use `{document_output_language}` for output documents
@@ -46,7 +46,7 @@ Treat every entry in `{agent.persistent_facts}` as foundational context you carr
46
46
 
47
47
  ### Step 5: Load Config
48
48
 
49
- Load config from `{project-root}/_bmad/bmm/config.yaml` and resolve:
49
+ Run `uv run {project-root}/_bmad/scripts/resolve_config.py --project-root {project-root}` and use:
50
50
  - Use `{user_name}` for greeting
51
51
  - Use `{communication_language}` for all communications
52
52
  - Use `{document_output_language}` for output documents
@@ -46,7 +46,7 @@ Treat every entry in `{agent.persistent_facts}` as foundational context you carr
46
46
 
47
47
  ### Step 5: Load Config
48
48
 
49
- Load config from `{project-root}/_bmad/bmm/config.yaml` and resolve:
49
+ Run `uv run {project-root}/_bmad/scripts/resolve_config.py --project-root {project-root}` and use:
50
50
  - Use `{user_name}` for greeting
51
51
  - Use `{communication_language}` for all communications
52
52
  - Use `{document_output_language}` for output documents
@@ -46,7 +46,7 @@ Treat every entry in `{agent.persistent_facts}` as foundational context you carr
46
46
 
47
47
  ### Step 5: Load Config
48
48
 
49
- Load config from `{project-root}/_bmad/bmm/config.yaml` and resolve:
49
+ Run `uv run {project-root}/_bmad/scripts/resolve_config.py --project-root {project-root}` and use:
50
50
  - Use `{user_name}` for greeting
51
51
  - Use `{communication_language}` for all communications
52
52
  - Use `{document_output_language}` for output documents
@@ -71,7 +71,7 @@ Treat every entry in `{workflow.persistent_facts}` as foundational context you c
71
71
 
72
72
  ### Step 4: Load Config
73
73
 
74
- Load config from `{project-root}/_bmad/bmm/config.yaml` and resolve:
74
+ Run `uv run {project-root}/_bmad/scripts/resolve_config.py --project-root {project-root}` and use:
75
75
  - Use `{user_name}` for greeting
76
76
  - Use `{communication_language}` for all communications
77
77
  - Use `{document_output_language}` for output documents
@@ -119,22 +119,20 @@ For each epic, review stories in order:
119
119
 
120
120
  ### 6. Complete and Save
121
121
 
122
- If all validations pass:
123
-
124
122
  - Update any remaining placeholders in the document
125
123
  - Ensure proper formatting
126
- - Save the final epics.md
124
+ - Save epics.md with frontmatter `status: draft`
125
+
126
+ If any validation failed, list each failed check with what is missing, keep `status: draft`, and tell the user "epics.md saved as draft, N checks open". Offer to fix the open checks now and re-run this validation; if the user declines, end the workflow with the document still a draft. Do not offer [C].
127
+
128
+ If all validations pass:
127
129
 
128
130
  **Present Final Menu:**
129
131
  **All validations complete!** [C] Complete Workflow
130
132
 
131
133
  HALT — wait for user input before proceeding.
132
134
 
133
- When C is selected, the workflow is complete and the epics.md is ready for development.
134
-
135
- Epics and Stories complete. Invoke the `bmad-help` skill.
136
-
137
- Upon Completion of task output: offer to answer any questions about the Epics and Stories.
135
+ When C is selected, set epics.md frontmatter `status: final`, tell the user the epics.md is complete and ready for development, invoke the `bmad-help` skill, and offer to answer any questions about the Epics and Stories.
138
136
 
139
137
  ## On Complete
140
138
 
@@ -1,4 +1,5 @@
1
1
  ---
2
+ status: draft
2
3
  stepsCompleted: []
3
4
  inputDocuments: []
4
5
  ---
@@ -19,7 +19,7 @@ You are a master facilitator and coach helping the user create, edit, or validat
19
19
 
20
20
  1. Resolve customization: `uv run {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --project-root {project-root} --key workflow`. On failure, read `{skill-root}/customize.toml` directly and use defaults.
21
21
  2. Run `{workflow.activation_steps_prepend}`. Treat `{workflow.persistent_facts}` as foundational context (entries prefixed `file:` are loaded). `{workflow.external_sources}` is an org-configured registry of internal tools (knowledge bases, MCP tools); consult them alongside generic web research on the same triggers, org tools preferred when their directive matches. Research itself fires during Discovery — see **Research subagents**.
22
- 3. Load `{project-root}/_bmad/bmm/config.yaml` (+ `config.user.yaml` if present). Resolve `{user_name}`, `{communication_language}`, `{document_output_language}`, `{planning_artifacts}`, `{project_name}`, `{date}`. Missing keys → neutral defaults; never block.
22
+ 3. Run `uv run {project-root}/_bmad/scripts/resolve_config.py --project-root {project-root}` and resolve `{user_name}`, `{communication_language}`, `{document_output_language}`, `{project_name}`, `{planning_artifacts}`, and `{date}`. Missing keys → neutral defaults; never block.
23
23
  4. If headless, follow `references/headless.md` for the whole run. Otherwise greet the user **by name** using `{user_name}` and **in their language** using `{communication_language}` — and stay in `{communication_language}` for every turn for the entire run, not just the greeting. In the greeting, let the user know that at any point they can invoke `bmad-party-mode` for multi-agent perspectives or `bmad-advanced-elicitation` for deeper exploration on a specific section. Then scan for misroute on the first message: if the signal points elsewhere (game → BMad GDS; express build → `bmad-build`; one-pager → `bmad-product-brief`; vet product idea → `bmad-prfaq`; agent skill or custom agent → `bmad-workflow-builder`), suggest they might want the other options before continuing.
24
24
  5. Detect intent: **Create** (no PRD), **Update** (existing PRD), **Validate** (critique only). If ambiguous, ask. For Create intent, before binding a fresh workspace, scan `{workflow.prd_output_path}` for prior in-progress runs (folders matching `{workflow.run_folder_pattern}` whose `prd.md` frontmatter `status` is not `final`); if any exist, offer to resume rather than starting over.
25
25
 
@@ -50,7 +50,7 @@ Treat every entry in `{workflow.persistent_facts}` as foundational context you c
50
50
 
51
51
  ### Step 4: Load Config
52
52
 
53
- Load config from `{project-root}/_bmad/bmm/config.yaml` and resolve:
53
+ Run `uv run {project-root}/_bmad/scripts/resolve_config.py --project-root {project-root}` and use:
54
54
  - Use `{user_name}` for greeting
55
55
  - Use `{communication_language}` for all communications
56
56
  - Use `{document_output_language}` for output documents
@@ -19,7 +19,7 @@ At the opening greeting, let the user know they can invoke `bmad-party-mode` for
19
19
  2. Execute each entry in `{workflow.activation_steps_prepend}` in order.
20
20
  3. Treat every entry in `{workflow.persistent_facts}` as foundational context 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.
21
21
  4. `{workflow.external_sources}` is an org-configured registry of internal tools (knowledge bases, MCP tools); consult them alongside generic web research on the same triggers in `## Discovery`, org tools preferred when their directive matches. If a named tool is unavailable at runtime, fall back to standard behavior and note the gap when relevant.
22
- 5. Load `{project-root}/_bmad/bmm/config.yaml` (and `config.user.yaml` if present). Resolve `{user_name}`, `{communication_language}`, `{document_output_language}`, `{planning_artifacts}`, `{project_name}`, `{date}`.
22
+ 5. Run `uv run {project-root}/_bmad/scripts/resolve_config.py --project-root {project-root}` and resolve `{user_name}`, `{communication_language}`, `{document_output_language}`, `{project_name}`, `{planning_artifacts}`, and `{date}`.
23
23
  6. Greet `{user_name}` in `{communication_language}` — and stay in `{communication_language}` for every turn for the entire run, not just the greeting. Detect intent (create / update / validate). If interactive and intent is unclear, ask; for headless behavior see `## Headless Mode`.
24
24
 
25
25
  Execute each entry in `{workflow.activation_steps_append}` in order.
@@ -12,7 +12,7 @@ You are a senior developer about to commit to this plan. Two moves, in order: fi
12
12
  1. Resolve customization: `uv run {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --project-root {project-root} --key workflow`. On failure, read `{skill-root}/customize.toml` directly and use defaults.
13
13
  2. Execute each entry in `{workflow.activation_steps_prepend}` in order.
14
14
  3. Treat every entry in `{workflow.persistent_facts}` as foundational context 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.
15
- 4. Load `{project-root}/_bmad/bmm/config.yaml` (and `config.user.yaml` if present). Resolve `{user_name}`, `{communication_language}`, `{document_output_language}`, `{project_name}`, `{planning_artifacts}`, `{implementation_artifacts}`, `{project_knowledge}` (skip gracefully if unset), `{date}`. Stay in `{communication_language}` for every turn, not just the greeting.
15
+ 4. Run `uv run {project-root}/_bmad/scripts/resolve_config.py --project-root {project-root}` and resolve `{user_name}`, `{communication_language}`, `{document_output_language}`, `{project_name}`, `{planning_artifacts}`, `{implementation_artifacts}`, `{project_knowledge}` (skip gracefully if unset), and `{date}`. Stay in `{communication_language}` for every turn, not just the greeting.
16
16
  5. Greet `{user_name}`, detect intent, and load only what that intent needs:
17
17
  - **readiness** — check implementation readiness only: load `references/readiness-gate.md`, run the gate, report, stop
18
18
  - **sprint-planning** — the full flow (also the refresh path for an existing `sprint-status.yaml`): load `references/readiness-gate.md`, then on PASS `references/generate-tracking.md`
@@ -32,7 +32,7 @@ UX may lead, follow, or stand alone. Inherit `sources:` by reference; the spines
32
32
 
33
33
  1. Resolve customization: `uv run {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --project-root {project-root} --key workflow`. On failure, read `{skill-root}/customize.toml` directly and use defaults.
34
34
  2. Run `{workflow.activation_steps_prepend}`. Treat `{workflow.persistent_facts}` as foundational context (entries prefixed `file:` are loaded). `{workflow.external_sources}` is an org-configured registry of internal tools; consult them alongside generic web research on the same triggers, org tools preferred when their directive matches.
35
- 3. Load `{project-root}/_bmad/bmm/config.yaml` (+ `config.user.yaml` if present). Resolve `{user_name}`, `{communication_language}`, `{document_output_language}`, `{planning_artifacts}`, `{project_name}`, `{date}`. Missing keys → neutral defaults; never block.
35
+ 3. Run `uv run {project-root}/_bmad/scripts/resolve_config.py --project-root {project-root}` and resolve `{user_name}`, `{communication_language}`, `{document_output_language}`, `{project_name}`, `{planning_artifacts}`, and `{date}`. Missing keys → neutral defaults; never block.
36
36
  4. If headless, follow `references/headless.md` for the whole run. Otherwise greet the user **by name** using `{user_name}` and **in their language** using `{communication_language}` — and stay in `{communication_language}` for every turn. In the greeting, let the user know `bmad-party-mode` and `bmad-advanced-elicitation` are always available. Then scan for misroute on the first message: PRD → `bmad-prd`; architecture → `bmad-architecture`; game UX → BMad GDS; agent/skill → `bmad-workflow-builder`; brief → `bmad-product-brief`.
37
37
  5. Detect intent: **Create**, **Update**, **Validate**. For Create, before binding a fresh workspace, scan `{workflow.ux_output_path}` for prior in-progress runs (folders matching `{workflow.run_folder_pattern}` whose `DESIGN.md` frontmatter `status` is not `final`) and offer to resume rather than starting over.
38
38
 
@@ -41,7 +41,7 @@ Treat every entry in `{workflow.persistent_facts}` as foundational context you c
41
41
 
42
42
  ### Step 4: Load Config
43
43
 
44
- Load config from `{project-root}/_bmad/bmm/config.yaml` and resolve:
44
+ Run `uv run {project-root}/_bmad/scripts/resolve_config.py --project-root {project-root}` and resolve:
45
45
 
46
46
  - `project_name`, `planning_artifacts`, `implementation_artifacts`, `user_name`
47
47
  - `communication_language`, `document_output_language`, `user_skill_level`
@@ -40,7 +40,7 @@ Treat every entry in `{workflow.persistent_facts}` as foundational context you c
40
40
 
41
41
  ### Step 4: Load Config
42
42
 
43
- Load config from `{project-root}/_bmad/bmm/config.yaml` and resolve:
43
+ Run `uv run {project-root}/_bmad/scripts/resolve_config.py --project-root {project-root}` and resolve:
44
44
 
45
45
  - `project_name`, `user_name`
46
46
  - `communication_language`, `document_output_language`
@@ -40,7 +40,7 @@ Treat every entry in `{workflow.persistent_facts}` as foundational context you c
40
40
 
41
41
  ### Step 4: Load Config
42
42
 
43
- Load config from `{project-root}/_bmad/bmm/config.yaml` and resolve:
43
+ Run `uv run {project-root}/_bmad/scripts/resolve_config.py --project-root {project-root}` and resolve:
44
44
 
45
45
  - `project_name`, `user_name`
46
46
  - `communication_language`, `document_output_language`
@@ -28,7 +28,7 @@ Run these in order before the retrospective begins:
28
28
  1. **Resolve the workflow block.** Run `uv run --no-cache {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --project-root {project-root} --key workflow`. If it fails, resolve `{workflow.*}` yourself by reading `{skill-root}/customize.toml`, then `{project-root}/_bmad/custom/{skill-name}.toml`, then `.user.toml` in that order, merging base → team → user (scalars override, keyed arrays-of-tables merge by `code`/`id`, other arrays append).
29
29
  2. **Run prepend steps** — execute each entry in `{workflow.activation_steps_prepend}` in order.
30
30
  3. **Load persistent facts** — treat every `{workflow.persistent_facts}` entry as standing context. `file:` entries are paths/globs under `{project-root}` whose contents load as facts; all others are literal facts.
31
- 4. **Load config** from `{project-root}/_bmad/bmm/config.yaml`: `project_name`, `user_name`, `communication_language`, `document_output_language`, `user_skill_level`, `planning_artifacts`, `implementation_artifacts`, and `date` (system datetime), plus `output_folder` from `{project-root}/_bmad/core/config.yaml`. Speak all output in `{communication_language}`; write all documents in `{document_output_language}`. Never state time estimates — AI has changed development speed, so hour/day/week predictions are noise.
31
+ 4. **Load config** with `uv run {project-root}/_bmad/scripts/resolve_config.py --project-root {project-root}`: `project_name`, `user_name`, `communication_language`, `document_output_language`, `output_folder`, `user_skill_level`, `planning_artifacts`, `implementation_artifacts`, and `date` (system datetime). Speak all output in `{communication_language}`; write all documents in `{document_output_language}`. Never state time estimates — AI has changed development speed, so hour/day/week predictions are noise.
32
32
  5. **Greet and orient** (interactive only). Greet `{user_name}`, name the epic you are about to retro, and optionally invite their going-in concerns ("anything you want weighted — a story that felt rushed, a risky interaction between two stories?"). Use any answer to focus the Phase 1–2 analysis; it directs attention but never becomes a finding without a source.
33
33
  6. **Run append steps** — execute each entry in `{workflow.activation_steps_append}` in order.
34
34
 
@@ -40,7 +40,7 @@ Treat every entry in `{workflow.persistent_facts}` as foundational context you c
40
40
 
41
41
  ### Step 4: Load Config
42
42
 
43
- Load config from `{project-root}/_bmad/bmm/config.yaml` and resolve:
43
+ Run `uv run {project-root}/_bmad/scripts/resolve_config.py --project-root {project-root}` and resolve:
44
44
 
45
45
  - `implementation_artifacts`
46
46
  - `planning_artifacts`
@@ -13,7 +13,7 @@ This skill was consolidated into `bmad-architecture`. It is retained as a thin c
13
13
 
14
14
  1. Resolve customization: `uv run {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --project-root {project-root} --key workflow`. This picks up any `{project-root}/_bmad/custom/bmad-create-architecture.toml` and `bmad-create-architecture.user.toml` overrides for the legacy fields (`activation_steps_prepend`, `activation_steps_append`, `persistent_facts`, `on_complete`).
15
15
 
16
- 2. Load `{project-root}/_bmad/bmm/config.yaml` (and `config.user.yaml` if present) to resolve `{user_name}` and `{communication_language}`.
16
+ 2. Run `uv run {project-root}/_bmad/scripts/resolve_config.py --project-root {project-root}` and resolve `{user_name}` and `{communication_language}`.
17
17
 
18
18
  3. Emit a deprecation notice to the user in `{communication_language}`:
19
19
 
@@ -13,7 +13,7 @@ This skill was consolidated into `bmad-prd`. It is retained as a thin compatibil
13
13
 
14
14
  1. Resolve customization: `uv run {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --project-root {project-root} --key workflow`. This picks up any `{project-root}/_bmad/custom/bmad-create-prd.toml` and `bmad-create-prd.user.toml` overrides for the legacy fields (`activation_steps_prepend`, `activation_steps_append`, `persistent_facts`, `on_complete`).
15
15
 
16
- 2. Load `{project-root}/_bmad/bmm/config.yaml` (and `config.user.yaml` if present) to resolve `{user_name}` and `{communication_language}`.
16
+ 2. Run `uv run {project-root}/_bmad/scripts/resolve_config.py --project-root {project-root}` and resolve `{user_name}` and `{communication_language}`.
17
17
 
18
18
  3. Emit a deprecation notice to the user in `{communication_language}`:
19
19
 
@@ -52,7 +52,7 @@ Treat every entry in `{workflow.persistent_facts}` as foundational context you c
52
52
 
53
53
  ### Step 4: Load Config
54
54
 
55
- Load config from `{project-root}/_bmad/bmm/config.yaml` and resolve:
55
+ Run `uv run {project-root}/_bmad/scripts/resolve_config.py --project-root {project-root}` and resolve:
56
56
 
57
57
  - `project_name`, `user_name`
58
58
  - `communication_language`, `document_output_language`
@@ -49,7 +49,7 @@ Treat every entry in `{workflow.persistent_facts}` as foundational context you c
49
49
 
50
50
  ### Step 4: Load Config
51
51
 
52
- Load config from `{project-root}/_bmad/bmm/config.yaml` and resolve:
52
+ Run `uv run {project-root}/_bmad/scripts/resolve_config.py --project-root {project-root}` and resolve:
53
53
 
54
54
  - `project_name`, `user_name`
55
55
  - `communication_language`, `document_output_language`
@@ -13,7 +13,7 @@ This skill was consolidated into `bmad-prd`. It is retained as a thin compatibil
13
13
 
14
14
  1. Resolve customization: `uv run {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --project-root {project-root} --key workflow`. This picks up any `{project-root}/_bmad/custom/bmad-edit-prd.toml` and `bmad-edit-prd.user.toml` overrides for the legacy fields (`activation_steps_prepend`, `activation_steps_append`, `persistent_facts`, `on_complete`).
15
15
 
16
- 2. Load `{project-root}/_bmad/bmm/config.yaml` (and `config.user.yaml` if present) to resolve `{user_name}` and `{communication_language}`.
16
+ 2. Run `uv run {project-root}/_bmad/scripts/resolve_config.py --project-root {project-root}` and resolve `{user_name}` and `{communication_language}`.
17
17
 
18
18
  3. Emit a deprecation notice to the user in `{communication_language}`:
19
19
 
@@ -13,7 +13,7 @@ This skill was consolidated into `bmad-sprint-planning`, which now owns the whol
13
13
 
14
14
  1. Resolve customization: `uv run {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --project-root {project-root} --key workflow`. This picks up any `{project-root}/_bmad/custom/bmad-sprint-status.toml` and `bmad-sprint-status.user.toml` overrides for the legacy fields (`activation_steps_prepend`, `activation_steps_append`, `persistent_facts`, `on_complete`).
15
15
 
16
- 2. Load `{project-root}/_bmad/bmm/config.yaml` (and `config.user.yaml` if present) to resolve `{user_name}` and `{communication_language}`.
16
+ 2. Run `uv run {project-root}/_bmad/scripts/resolve_config.py --project-root {project-root}` and resolve `{user_name}` and `{communication_language}`.
17
17
 
18
18
  3. Emit a deprecation notice to the user in `{communication_language}`:
19
19
 
@@ -13,7 +13,7 @@ This skill was consolidated into `bmad-prd`. It is retained as a thin compatibil
13
13
 
14
14
  1. Resolve customization: `uv run {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --project-root {project-root} --key workflow`. This picks up any `{project-root}/_bmad/custom/bmad-validate-prd.toml` and `bmad-validate-prd.user.toml` overrides for the legacy fields (`activation_steps_prepend`, `activation_steps_append`, `persistent_facts`, `on_complete`).
15
15
 
16
- 2. Load `{project-root}/_bmad/bmm/config.yaml` (and `config.user.yaml` if present) to resolve `{user_name}` and `{communication_language}`.
16
+ 2. Run `uv run {project-root}/_bmad/scripts/resolve_config.py --project-root {project-root}` and resolve `{user_name}` and `{communication_language}`.
17
17
 
18
18
  3. Emit a deprecation notice to the user in `{communication_language}`:
19
19
 
@@ -63,7 +63,7 @@ Keep pushing for specificity. "Skeptical CFO" is a placeholder; "won't approve a
63
63
 
64
64
  ## Write via bmad-customize
65
65
 
66
- **First, check for code collisions.** A custom member whose `code` matches an installed agent silently *overrides* that agent in the collective. Before composing, resolve the collective once — `uv run {skill-root}/scripts/resolve_party.py --project-root {project-root} --skill {skill-root}` — and check each new member's `code` against the returned members. On a collision, surface it ("`analyst` would override the installed Analyst — intended, or pick a different code?") and let the user confirm or rename. One check, not a gate.
66
+ **First, check for code collisions.** A custom member whose `code` matches an existing member's code, alias, or name silently *overrides* that member in the collective. Before composing, list every taken token once — `uv run {skill-root}/scripts/resolve_party.py --project-root {project-root} --skill {skill-root} --list-codes` — and look up each new member's `code`, lower-cased, in the returned `codes` map. On a hit, name the member it maps to ("`analyst` would override Mary (`bmad-agent-analyst`) — intended, or pick a different code?") and let the user confirm or rename. One check, not a gate.
67
67
 
68
68
  Compose the sparse override and hand it to `bmad-customize` to place, confirm, and write — target skill `bmad-party-mode`, `[workflow]` surface. Default to the **user** override (`bmad-party-mode.user.toml`); offer the **team** file when the party is meant to be shared. Hand it the exact entries: the `party_members` tables, any `party_groups` table (including its `memory` flag), and `default_party` if the user opted in. Keep it sparse — only the new entries, never a copy of the base customize.toml. `bmad-customize` shows the TOML, waits for an explicit yes, writes, and verifies the merge; don't write the file yourself.
69
69
 
@@ -16,6 +16,9 @@ into one collective, then projects only what the moment needs:
16
16
  * --party <id> — full member detail for one chosen group, on demand
17
17
  (e.g. when the user switches rooms). Unknown id returns the available
18
18
  names instead of an error wall.
19
+ * --list-codes — every token that resolves to a member (code, alias,
20
+ lower-cased name, custom-only codes) mapped to that member's code and
21
+ name. The collision check before adding custom members.
19
22
 
20
23
  The merge is deterministic (a keyed union; a custom member whose code
21
24
  matches an installed agent overrides it), so the orchestrator consumes a
@@ -28,6 +31,7 @@ customize.toml directly if the customization resolver is unavailable.
28
31
  resolve_party.py --project-root P --skill S
29
32
  resolve_party.py --project-root P --skill S --list-groups
30
33
  resolve_party.py --project-root P --skill S --party writers-room
34
+ resolve_party.py --project-root P --skill S --list-codes
31
35
  """
32
36
 
33
37
  import argparse
@@ -172,6 +176,12 @@ def resolve_members(member_tokens, collective, index):
172
176
  return resolved, unresolved
173
177
 
174
178
 
179
+ def code_map(collective, index):
180
+ """Every resolvable token -> the member it resolves to (code + name)."""
181
+ return {token: {"code": code, "name": collective[code].get("name", code)}
182
+ for token, code in sorted(index.items()) if code in collective}
183
+
184
+
175
185
  def group_menu(groups):
176
186
  """Names only — the cheap menu. Open-cast groups (no roster) are flagged."""
177
187
  out = []
@@ -224,6 +234,8 @@ def main():
224
234
  ap.add_argument("--skill", required=True, help="Path to the bmad-party-mode skill dir")
225
235
  ap.add_argument("--party", help="Resolve full detail for this group id")
226
236
  ap.add_argument("--list-groups", action="store_true", help="Group names only")
237
+ ap.add_argument("--list-codes", action="store_true",
238
+ help="Every code, alias and name in the collective, for collision checks")
227
239
  args = ap.parse_args()
228
240
 
229
241
  project_root = Path(args.project_root).resolve()
@@ -249,6 +261,10 @@ def main():
249
261
  agents, agents_ok = load_agents(project_root)
250
262
  collective, index, installed_codes = build_collective(agents, workflow.get("party_members", []))
251
263
 
264
+ if args.list_codes:
265
+ _emit({"installed_agents_resolved": agents_ok, "codes": code_map(collective, index)})
266
+ return
267
+
252
268
  if args.party:
253
269
  g = find_group(groups, args.party)
254
270
  if g is None:
@@ -67,6 +67,21 @@ class TestResolveMembers(unittest.TestCase):
67
67
  self.assertEqual(rp.resolve_members([], self.col, self.idx), ([], []))
68
68
 
69
69
 
70
+ class TestCodeMap(unittest.TestCase):
71
+ def test_maps_aliases_names_and_custom_only_codes_to_their_member(self):
72
+ col, idx, _ = rp.build_collective(AGENTS, [{"code": "morpheus", "name": "Morpheus"}])
73
+ codes = rp.code_map(col, idx)
74
+ self.assertEqual(codes["analyst"], {"code": "bmad-agent-analyst", "name": "Mary"})
75
+ self.assertEqual(codes["mary"]["code"], "bmad-agent-analyst")
76
+ self.assertEqual(codes["bmad-agent-pm"]["code"], "bmad-agent-pm")
77
+ self.assertEqual(codes["morpheus"], {"code": "morpheus", "name": "Morpheus"})
78
+
79
+ def test_override_reports_the_overriding_name(self):
80
+ col, idx, _ = rp.build_collective(AGENTS, [{"code": "analyst", "name": "Mary-Custom"}])
81
+ self.assertEqual(rp.code_map(col, idx)["analyst"],
82
+ {"code": "bmad-agent-analyst", "name": "Mary-Custom"})
83
+
84
+
70
85
  class TestGroups(unittest.TestCase):
71
86
  GROUPS = [
72
87
  {"id": "wr", "name": "Writers", "members": ["analyst", "morpheus"]},
@@ -427,6 +427,8 @@ class ManifestGenerator {
427
427
  /**
428
428
  * Write central _bmad/config.toml with [core], [modules.<code>], [agents.<code>] tables.
429
429
  * Install-owned. Team-scope answers → config.toml; user-scope answers → config.user.toml.
430
+ * User-scope keys also get their module.yaml default in config.toml, so a
431
+ * clone without config.user.toml still resolves them.
430
432
  * Both files are regenerated on every install. User overrides live in
431
433
  * _bmad/custom/config.toml and _bmad/custom/config.user.toml (never touched by installer).
432
434
  * @returns {string[]} Paths to the written config files
@@ -444,6 +446,9 @@ class ManifestGenerator {
444
446
  // Maps installer moduleName (may be full display name) → module code field
445
447
  // from module.yaml, so TOML sections use [modules.<code>] not [modules.<name>].
446
448
  const codeByModuleName = {};
449
+ // Module.yaml defaults for user-scope keys, written to config.toml as the
450
+ // team fallback; config.user.toml overrides them.
451
+ const userDefaultsByModule = {};
447
452
  for (const moduleName of this.updatedModules) {
448
453
  const moduleYamlPath = await resolveInstalledModuleYaml(moduleName);
449
454
  if (!moduleYamlPath) {
@@ -458,9 +463,19 @@ class ManifestGenerator {
458
463
  if (!parsed || typeof parsed !== 'object') continue;
459
464
  if (parsed.code) codeByModuleName[moduleName] = parsed.code;
460
465
  scopeByModuleKey[moduleName] = {};
466
+ userDefaultsByModule[moduleName] = {};
461
467
  for (const [key, value] of Object.entries(parsed)) {
462
468
  if (value && typeof value === 'object' && 'prompt' in value) {
463
469
  scopeByModuleKey[moduleName][key] = value.scope === 'user' ? 'user' : 'team';
470
+ // Only plain defaults: no placeholders like {directory_name}, no result transform.
471
+ if (
472
+ value.scope === 'user' &&
473
+ value.default !== undefined &&
474
+ !String(value.default).includes('{') &&
475
+ (value.result === undefined || value.result === '{value}')
476
+ ) {
477
+ userDefaultsByModule[moduleName][key] = value.default;
478
+ }
464
479
  }
465
480
  }
466
481
  } catch (error) {
@@ -488,6 +503,9 @@ class ManifestGenerator {
488
503
  const user = {};
489
504
  const scopes = scopeByModuleKey[moduleName] || {};
490
505
  const isCore = moduleName === 'core';
506
+ for (const [key, value] of Object.entries(userDefaultsByModule[moduleName] || {})) {
507
+ if (isCore || !coreKeys.has(key)) team[key] = value;
508
+ }
491
509
  for (const [key, value] of Object.entries(cfg || {})) {
492
510
  if (!isCore && coreKeys.has(key)) continue;
493
511
  if (onlyDeclaredKeys && !(key in scopes)) continue;