bmad-plus 0.13.0 → 0.14.0

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 (104) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +96 -489
  3. package/package.json +7 -2
  4. package/readme-international/README.de.md +9 -5
  5. package/readme-international/README.es.md +9 -5
  6. package/readme-international/README.fr.md +9 -5
  7. package/src/bmad-plus/agents/agent-orchestrator/SKILL.md +3 -3
  8. package/src/bmad-plus/packs/pack-dev-studio/README.md +133 -141
  9. package/src/bmad-plus/packs/pack-dev-studio/SKILL.md +49 -0
  10. package/src/bmad-plus/packs/pack-dev-studio/categories/analysis/analyst-agent.md +35 -60
  11. package/src/bmad-plus/packs/pack-dev-studio/categories/analysis/document-project.md +59 -59
  12. package/src/bmad-plus/packs/pack-dev-studio/categories/analysis/domain-research.md +55 -93
  13. package/src/bmad-plus/packs/pack-dev-studio/categories/analysis/market-research.md +58 -93
  14. package/src/bmad-plus/packs/pack-dev-studio/categories/analysis/prfaq.md +55 -132
  15. package/src/bmad-plus/packs/pack-dev-studio/categories/analysis/product-brief.md +63 -78
  16. package/src/bmad-plus/packs/pack-dev-studio/categories/analysis/tech-writer-agent.md +54 -69
  17. package/src/bmad-plus/packs/pack-dev-studio/categories/analysis/technical-research.md +54 -93
  18. package/src/bmad-plus/packs/pack-dev-studio/categories/architecture/architect-agent.md +32 -60
  19. package/src/bmad-plus/packs/pack-dev-studio/categories/architecture/create-architecture.md +67 -71
  20. package/src/bmad-plus/packs/pack-dev-studio/categories/architecture/create-epics-stories.md +61 -90
  21. package/src/bmad-plus/packs/pack-dev-studio/categories/architecture/generate-project-context.md +56 -78
  22. package/src/bmad-plus/packs/pack-dev-studio/categories/architecture/implementation-readiness.md +55 -88
  23. package/src/bmad-plus/packs/pack-dev-studio/categories/architecture/steps/step-01-init.md +20 -153
  24. package/src/bmad-plus/packs/pack-dev-studio/categories/architecture/steps/step-01b-continue.md +20 -173
  25. package/src/bmad-plus/packs/pack-dev-studio/categories/architecture/steps/step-02-context.md +14 -220
  26. package/src/bmad-plus/packs/pack-dev-studio/categories/architecture/steps/step-03-starter.md +20 -329
  27. package/src/bmad-plus/packs/pack-dev-studio/categories/architecture/steps/step-04-decisions.md +15 -314
  28. package/src/bmad-plus/packs/pack-dev-studio/categories/architecture/steps/step-05-patterns.md +15 -355
  29. package/src/bmad-plus/packs/pack-dev-studio/categories/architecture/steps/step-06-structure.md +15 -375
  30. package/src/bmad-plus/packs/pack-dev-studio/categories/architecture/steps/step-07-validation.md +14 -357
  31. package/src/bmad-plus/packs/pack-dev-studio/categories/architecture/steps/step-08-complete.md +13 -78
  32. package/src/bmad-plus/packs/pack-dev-studio/categories/implementation/checkpoint-preview.md +52 -65
  33. package/src/bmad-plus/packs/pack-dev-studio/categories/implementation/code-review-steps/step-01-gather-context.md +14 -81
  34. package/src/bmad-plus/packs/pack-dev-studio/categories/implementation/code-review-steps/step-02-review.md +14 -31
  35. package/src/bmad-plus/packs/pack-dev-studio/categories/implementation/code-review-steps/step-03-triage.md +14 -45
  36. package/src/bmad-plus/packs/pack-dev-studio/categories/implementation/code-review-steps/step-04-present.md +13 -128
  37. package/src/bmad-plus/packs/pack-dev-studio/categories/implementation/code-review.md +61 -87
  38. package/src/bmad-plus/packs/pack-dev-studio/categories/implementation/correct-course.md +55 -298
  39. package/src/bmad-plus/packs/pack-dev-studio/categories/implementation/create-story.md +52 -426
  40. package/src/bmad-plus/packs/pack-dev-studio/categories/implementation/dev-agent.md +48 -69
  41. package/src/bmad-plus/packs/pack-dev-studio/categories/implementation/dev-story-checklist.md +22 -80
  42. package/src/bmad-plus/packs/pack-dev-studio/categories/implementation/dev-story.md +60 -482
  43. package/src/bmad-plus/packs/pack-dev-studio/categories/implementation/investigate.md +50 -184
  44. package/src/bmad-plus/packs/pack-dev-studio/categories/implementation/qa-e2e-tests.md +57 -173
  45. package/src/bmad-plus/packs/pack-dev-studio/categories/implementation/quick-dev.md +56 -108
  46. package/src/bmad-plus/packs/pack-dev-studio/categories/implementation/retrospective.md +54 -1509
  47. package/src/bmad-plus/packs/pack-dev-studio/categories/implementation/sprint-planning.md +54 -296
  48. package/src/bmad-plus/packs/pack-dev-studio/categories/implementation/sprint-status.md +41 -283
  49. package/src/bmad-plus/packs/pack-dev-studio/categories/planning/create-prd.md +58 -18
  50. package/src/bmad-plus/packs/pack-dev-studio/categories/planning/create-ux-design.md +103 -72
  51. package/src/bmad-plus/packs/pack-dev-studio/categories/planning/edit-prd.md +55 -27
  52. package/src/bmad-plus/packs/pack-dev-studio/categories/planning/pm-agent.md +34 -60
  53. package/src/bmad-plus/packs/pack-dev-studio/categories/planning/prd.md +46 -87
  54. package/src/bmad-plus/packs/pack-dev-studio/categories/planning/steps/step-01-init.md +10 -0
  55. package/src/bmad-plus/packs/pack-dev-studio/categories/planning/ux-designer-agent.md +30 -60
  56. package/src/bmad-plus/packs/pack-dev-studio/categories/planning/validate-prd.md +57 -27
  57. package/src/bmad-plus/packs/pack-dev-studio/categories/utilities/advanced-elicitation.md +47 -138
  58. package/src/bmad-plus/packs/pack-dev-studio/categories/utilities/adversarial-review.md +48 -34
  59. package/src/bmad-plus/packs/pack-dev-studio/categories/utilities/bmad-help.md +51 -68
  60. package/src/bmad-plus/packs/pack-dev-studio/categories/utilities/brainstorming.md +46 -3
  61. package/src/bmad-plus/packs/pack-dev-studio/categories/utilities/customize.md +68 -109
  62. package/src/bmad-plus/packs/pack-dev-studio/categories/utilities/distillator.md +53 -174
  63. package/src/bmad-plus/packs/pack-dev-studio/categories/utilities/edge-case-hunter.md +39 -53
  64. package/src/bmad-plus/packs/pack-dev-studio/categories/utilities/editorial-review-prose.md +45 -83
  65. package/src/bmad-plus/packs/pack-dev-studio/categories/utilities/editorial-review-structure.md +45 -176
  66. package/src/bmad-plus/packs/pack-dev-studio/categories/utilities/index-docs.md +45 -63
  67. package/src/bmad-plus/packs/pack-dev-studio/categories/utilities/party-mode.md +53 -124
  68. package/src/bmad-plus/packs/pack-dev-studio/categories/utilities/shard-doc.md +44 -100
  69. package/src/bmad-plus/packs/pack-dev-studio/dev-studio-orchestrator.md +56 -116
  70. package/src/bmad-plus/packs/pack-dev-studio/shared/architecture-decision-template.md +49 -12
  71. package/src/bmad-plus/packs/pack-dev-studio/shared/bwml-spec.md +51 -328
  72. package/src/bmad-plus/packs/pack-dev-studio/shared/catalog.json +489 -0
  73. package/src/bmad-plus/packs/pack-dev-studio/shared/execution.md +69 -0
  74. package/src/bmad-plus/packs/pack-dev-studio/shared/module-help.csv +39 -32
  75. package/src/bmad-plus/packs/pack-dev-studio/upstream-sync.yaml +85 -14
  76. package/src/bmad-plus/packs/pack-memory/README.md +6 -0
  77. package/src/bmad-plus/packs/pack-memory/memory-orchestrator.md +12 -5
  78. package/src/bmad-plus/packs/pack-seo/SKILL.md +27 -1
  79. package/src/bmad-plus/packs/pack-seo/seo-chief.md +16 -1
  80. package/src/bmad-plus/packs/pack-seo/seo-judge.md +12 -0
  81. package/src/bmad-plus/packs/pack-seo/seo-scout.md +12 -0
  82. package/src/bmad-plus/skills/bmad-plus-autopilot/SKILL.md +3 -3
  83. package/src/bmad-plus/skills/bmad-plus-sync/SKILL.md +5 -3
  84. package/src/bmad-plus/skills/dev-studio/SKILL.md +19 -0
  85. package/tools/build/check-install-contract.js +165 -13
  86. package/tools/build/generate.js +213 -40
  87. package/tools/build/generated-adapters/.codex/AGENTS.md +1 -1
  88. package/tools/build/generated-adapters/.cursor/rules/bmad-plus.mdc +1 -1
  89. package/tools/build/generated-adapters/.opencode/AGENTS.md +1 -1
  90. package/tools/build/generated-adapters/AGENTS.md +1 -1
  91. package/tools/build/generated-adapters/CLAUDE.md +1 -1
  92. package/tools/build/generated-adapters/CONVENTIONS.md +1 -1
  93. package/tools/build/generated-adapters/GEMINI.md +1 -1
  94. package/tools/build/pack-delivery.js +78 -0
  95. package/tools/cli/bmad-plus-cli.js +1 -1
  96. package/tools/cli/commands/doctor.js +49 -189
  97. package/tools/cli/commands/install.js +1 -1
  98. package/tools/cli/commands/studio.js +68 -0
  99. package/tools/cli/lib/installation-health.js +360 -0
  100. package/tools/cli/lib/packs.js +118 -9
  101. package/tools/cli/lib/python-health.js +233 -0
  102. package/tools/cli/lib/python-provision.js +2 -2
  103. package/tools/cli/lib/studio.js +310 -0
  104. package/tools/release/publication-content.js +901 -0
@@ -1,15 +1,41 @@
1
- # Pack Dev Studio — upstream-sync.yaml
2
- # Tracks the source commit and version from BMAD-METHOD for future updates
1
+ # Dev Studio provenance and selective adaptation ledger.
2
+ # Version and commit below have different, explicitly recorded roles.
3
+ # The 0.14.0 implementation is original BMAD+ work, not a wholesale upstream sync.
4
+ schema_version: 2
3
5
 
4
6
  upstream:
5
7
  repository: https://github.com/bmad-code-org/BMAD-METHOD
6
8
  version: "6.6.0"
9
+ version_role: declared-compatibility-baseline
10
+ baseline_tag_commit: "e6cdc93b79420fcc915d3bd3ca63387bc86af694"
7
11
  commit: "0f852a38ac7c0ac30340b3aedc3aba4505b7c14a"
12
+ commit_role: historical-partial-import
8
13
  synced_at: "2026-05-17"
14
+ synced_at_role: recorded-date-of-historical-import
9
15
  license: MIT
10
16
 
17
+ reviewed_reference:
18
+ version: "6.12.0"
19
+ commit: "05bfbd46d00766ec88eb9b42e76be2c575d64d7b"
20
+ reviewed_at: "2026-09-09"
21
+ status: reviewed-only
22
+ full_migration: false
23
+ compatibility_baseline_changed: false
24
+
25
+ implementation:
26
+ bmad_plus_version: "0.14.0"
27
+ origin: original-bmad-plus-instructions-and-context-preparation
28
+ authored_at: "2026-09-09"
29
+ execution: host-managed-markdown
30
+ context_preparation: read-only-cli
31
+ standalone_llm_runtime: false
32
+ upstream_runtime_imported: false
33
+ preserved_public_workflow_ids: 38
34
+ preserved_personas: 6
35
+ evidence_limit: Resource reconciliation does not establish host execution or model compliance.
36
+
11
37
  adaptations:
12
- format: "BMAD+ BWML (Workflow Markup Language)"
38
+ format: Original BMAD+ Markdown procedures with explicit inputs, evidence and continuation.
13
39
  personas:
14
40
  Mary: Miriam (מרים)
15
41
  Paige: Huldah (חולדה)
@@ -17,18 +43,63 @@ adaptations:
17
43
  Sally: Rachel (רחל)
18
44
  Winston: Bezalel (בצלאל)
19
45
  Amelia: Oholiab (אהליאב)
20
- removed_dependencies:
21
- - customize.toml (3-layer TOML config system)
22
- - resolve_customization.py (Python variable resolver)
23
- - resolve_config.py (Python config merger)
24
- - analyze_sources.py (Python source analyzer)
25
- - config.yaml (per-project config)
26
- added:
27
- - BWML specification (shared/bwml-spec.md)
28
- - Dev Studio orchestrator
29
- - Specialized persona naming
30
- - BMAD+ pack integration (module.yaml, CLI, i18n)
46
+ entry: SKILL.md
47
+ catalog: shared/catalog.json
48
+ execution_guide: shared/execution.md
49
+ historical_bwml_document: shared/bwml-spec.md
50
+ historical_bwml_document_role: migration-note-not-interpreter-specification
51
+ configuration:
52
+ file: _bmad/config.yaml
53
+ scope: explicitly-selected-project
54
+ parser: existing-bmad-plus-yaml-parser
55
+ known_fields:
56
+ - user_name
57
+ - communication_language
58
+ - document_output_language
59
+ - output_folder
60
+ - project_name
61
+ missing_values: Explicit neutral defaults in the execution guide.
62
+ invalid_present_values: Report an error rather than inventing configuration.
63
+ preserve_unrelated_settings: true
64
+ layered_toml_overrides: false
65
+ retired_dependency_contracts:
66
+ - Imported PRD headless schemas and automatic HTML validation rendering.
67
+ - Distillator compression/reconstruction format and Python source analyzer.
68
+ - Upstream Python/TOML customization discovery and layered override merging.
69
+ - Implied execution of BWML tags as scheduler, memory, events or validation gates.
70
+ historical_dependency_note: >-
71
+ The old removed_dependencies list was not proof that dependent instructions
72
+ remained executable. Project YAML configuration is supported now; it is not
73
+ a removed dependency. Per-skill customize.toml files and shared upstream
74
+ resolvers fall outside the 147-support-file inventory below.
75
+
76
+ support_reconciliation:
77
+ source_method: Read-only git ls-tree at the historical import commit.
78
+ historical_bmad_plus_commit: "913d0600b9e0c3ac12af22b17e2205bf9d394a63"
79
+ mapped_entry_families: 44
80
+ excluded_relative_paths:
81
+ - SKILL.md
82
+ - customize.toml
83
+ source_support_files: 147
84
+ historically_delivered: 15
85
+ historically_omitted: 132
86
+ historically_omitted_families: 24
87
+ omitted_dispositions:
88
+ replaced-by-self-contained-workflows: 117
89
+ retired-runtime: 12
90
+ optional-tests-or-metadata: 3
91
+ delivered_disposition: retained-as-original-support
92
+ interpretation: >-
93
+ Counts describe the pre-remediation snapshot. An omitted support file is not
94
+ automatically a demonstrated runtime failure. Replaced means the relevant
95
+ purpose is covered by original instructions, not exact upstream feature parity.
96
+ Retired-runtime includes unsupported execution contracts even when no working
97
+ runtime had been delivered.
98
+ repository_report: docs/research/dev-studio-0.14-validation/migration.md
99
+ repository_inventory: docs/research/dev-studio-0.14-validation/migration.json
31
100
 
101
+ # Historical source mapping only. These are lineage references, not live imports
102
+ # or runtime dependencies. Current routes resolve through shared/catalog.json.
32
103
  source_mapping:
33
104
  categories/analysis:
34
105
  - src/bmm-skills/1-analysis/bmad-agent-analyst → analyst-agent.md
@@ -48,6 +48,12 @@ Dedicated memory agent that can:
48
48
 
49
49
  ## Installation
50
50
 
51
+ The npm pack provides file-based memory and requires Node.js only. Vector/RAG
52
+ recall is an optional, local-only enhancement through a separately deployed
53
+ MCP server. That server, its Python dependencies and its vector index are not
54
+ included in the npm package; `--provision-python` does not install them.
55
+ Missing RAG infrastructure does not disable Markdown memory or the project scanner.
56
+
51
57
  ```bash
52
58
  npx bmad-plus install
53
59
  # Select "🧠 Memory — Persistent Brain" in the pack menu
@@ -16,10 +16,17 @@ Pack Memory provides a two-level persistent brain for BMAD+:
16
16
 
17
17
  ## Activation
18
18
 
19
- Pack Memory activates automatically when installed:
20
- - At session start: agents load project memory + global identity
21
- - During session: agents write decisions/lessons/patterns on trigger
22
- - At session end: session handoff is persisted
19
+ Pack Memory supplies instructions and files for the host agent to use. The host
20
+ must load and follow the memory protocol; installation alone does not execute it.
21
+ No automatic session-start or session-end hooks are installed.
22
+
23
+ While executing the protocol, the host agent should:
24
+
25
+ - At session start: load project memory + global identity
26
+ - During the session: record decisions, lessons and patterns when relevant
27
+ - Before ending its work: persist a session handoff
28
+
29
+ A session that ends without an agent turn has no guaranteed handoff.
23
30
 
24
31
  Manual activation via Zecher:
25
32
  - `"Zecher, scan projects in D:\travail\DEV"` — discover and index all projects
@@ -43,7 +50,7 @@ pack-memory/
43
50
  ├── memory-orchestrator.md ← This file
44
51
  ├── zecher-agent.md ← Memory Agent (Zecher)
45
52
  ├── shared/
46
- │ ├── karpathy-guardrails.md ← 4 Karpathy principles + memory hooks
53
+ │ ├── karpathy-guardrails.md ← 4 Karpathy principles + memory practices
47
54
  │ └── memory-protocol.md ← Complete read/write protocol
48
55
  └── templates/
49
56
  ├── decisions.md ← ADR template
@@ -15,6 +15,31 @@ description: >
15
15
  This skill orchestrates 3 specialized agents through a structured workflow.
16
16
  Load the full agent files only when activating that agent's phase.
17
17
 
18
+ ### Runtime availability
19
+
20
+ The local `scripts/*.py` commands require a working Python environment and their
21
+ optional service credentials or browser setup. Never invent crawl, PageSpeed,
22
+ API or screenshot results.
23
+
24
+ Use `bmad-plus install --provision-python` to provision the selected Python packs,
25
+ or install this pack's `requirements.txt` in a dedicated environment manually.
26
+ Run scripts with that environment's interpreter, not an assumed system Python.
27
+ Provisioning is optional. Report **prompts-only mode** before starting an audit
28
+ if the environment is unavailable. Do not repeatedly run failing scripts or
29
+ install dependencies without authorization.
30
+
31
+ ### Evidence and reporting
32
+
33
+ Use evidence available in the session or collected by working tools. Without a
34
+ usable Python environment, use **prompts-only mode** and skip local Python commands.
35
+ Mark missing data `unverified` and omit every score with incomplete inputs,
36
+ including the overall SEO Health Score. Do not substitute zero or reweight the
37
+ remaining categories. For incomplete audits, produce Markdown with explicit
38
+ coverage: pages and checks reviewed, evidence sources, and unverified items.
39
+ Use `scripts/seo_report.py` only when every score value it uses is verified;
40
+ the current exporter has no N/A support. This policy applies to every role and
41
+ overrides numeric placeholders in report templates.
42
+
18
43
  ## Command Router
19
44
 
20
45
  When the user issues a `/seo` command, route as follows:
@@ -90,7 +115,8 @@ Use `scripts/seo_screenshot.py <url> --viewport mobile` for visual audit.
90
115
  **Agent**: Chief (Scorer role)
91
116
  **Load**: `seo-chief.md`
92
117
 
93
- Compute SEO Health Score (0–100):
118
+ Compute SEO Health Score (0–100) only when all weighted categories have verified
119
+ inputs. Otherwise report coverage and omit the overall score:
94
120
 
95
121
  | Category | Weight |
96
122
  |----------|--------|
@@ -6,6 +6,18 @@
6
6
 
7
7
  You are **Chief**, the strategist and reporting agent of the BMAD+ SEO Engine. You aggregate findings from Scout and Judge, compute the SEO Health Score, generate prioritized action plans, and produce publication-ready reports.
8
8
 
9
+ ## Evidence and reporting
10
+
11
+ Use evidence available in the session or collected by working tools. Without a
12
+ usable Python environment, use **prompts-only mode** and skip local Python commands.
13
+ Mark missing data `unverified` and omit every score with incomplete inputs,
14
+ including the overall SEO Health Score. Do not substitute zero or reweight the
15
+ remaining categories. For incomplete audits, produce Markdown with explicit
16
+ coverage: pages and checks reviewed, evidence sources, and unverified items.
17
+ Use `scripts/seo_report.py` only when every score value it uses is verified;
18
+ the current exporter has no N/A support. This policy applies to every role and
19
+ overrides numeric placeholders in report templates.
20
+
9
21
  ## Roles
10
22
 
11
23
  ### Role: Scorer
@@ -73,13 +85,16 @@ You are **Chief**, the strategist and reporting agent of the BMAD+ SEO Engine. Y
73
85
  | 0–39 | 🔴 Critical | Fundamental issues blocking performance |
74
86
 
75
87
  ### Category Score Calculation
76
- Each category is scored 0–100 based on the checklist pass rate:
88
+ Score a category 0–100 only when its required checklist inputs are verified:
77
89
  - ✅ Pass = full points for that item
78
90
  - ⚠️ Warning = 50% points (issue exists but not blocking)
79
91
  - ❌ Fail = 0 points (blocking issue)
80
92
 
81
93
  **Final Score** = Σ(category_score × category_weight)
82
94
 
95
+ Compute this total only when all weighted categories are verified. Missing
96
+ evidence remains `unverified`; it is never a failed check or a zero score.
97
+
83
98
  ---
84
99
 
85
100
  ## Issue Priority Classification
@@ -6,6 +6,18 @@
6
6
 
7
7
  You are **Judge**, the content and AI analyst of the BMAD+ SEO Engine. You evaluate content quality, validate structured data, and measure AI search readiness. You are the analytical brain of the audit.
8
8
 
9
+ ## Evidence and reporting
10
+
11
+ Use evidence available in the session or collected by working tools. Without a
12
+ usable Python environment, use **prompts-only mode** and skip local Python commands.
13
+ Mark missing data `unverified` and omit every score with incomplete inputs,
14
+ including the overall SEO Health Score. Do not substitute zero or reweight the
15
+ remaining categories. For incomplete audits, produce Markdown with explicit
16
+ coverage: pages and checks reviewed, evidence sources, and unverified items.
17
+ Use `scripts/seo_report.py` only when every score value it uses is verified;
18
+ the current exporter has no N/A support. This policy applies to every role and
19
+ overrides numeric placeholders in report templates.
20
+
9
21
  ## Roles
10
22
 
11
23
  ### Role: Content Expert
@@ -6,6 +6,18 @@
6
6
 
7
7
  You are **Scout**, the technical reconnaissance agent of the BMAD+ SEO Engine. You crawl, fetch, inspect, and photograph websites to produce raw technical intelligence for the audit pipeline.
8
8
 
9
+ ## Evidence and reporting
10
+
11
+ Use evidence available in the session or collected by working tools. Without a
12
+ usable Python environment, use **prompts-only mode** and skip local Python commands.
13
+ Mark missing data `unverified` and omit every score with incomplete inputs,
14
+ including the overall SEO Health Score. Do not substitute zero or reweight the
15
+ remaining categories. For incomplete audits, produce Markdown with explicit
16
+ coverage: pages and checks reviewed, evidence sources, and unverified items.
17
+ Use `scripts/seo_report.py` only when every score value it uses is verified;
18
+ the current exporter has no N/A support. This policy applies to every role and
19
+ overrides numeric placeholders in report templates.
20
+
9
21
  ## Roles
10
22
 
11
23
  You operate in 3 switchable roles:
@@ -50,8 +50,8 @@ The autopilot executes the following pipeline:
50
50
 
51
51
  Before starting, read `execution_mode` and `checkpoints` from `_bmad/config.yaml`. The checkpoint keys are `discovery` (PRD and UX review), `architecture`, `story` (each completed story), and `delivery`. Apply the configured behavior at each stage:
52
52
 
53
- - **require_approval** (🔴 STOP): Pause execution, send WhatsApp notification, wait for user approval.
54
- - **notify_only** (🟡 INFO): Send notification, continue unless user intervenes.
53
+ - **require_approval** (🔴 STOP): Present the checkpoint in the session and wait for user approval. If an external notification channel is configured and sending is authorized, also notify through that channel.
54
+ - **notify_only** (🟡 INFO): Report progress in the session and continue. If an external notification channel is configured and sending is authorized, also notify through that channel.
55
55
  - **auto** (🟢 AUTO): Continue automatically. Log for audit trail.
56
56
 
57
57
  ### State Management
@@ -96,4 +96,4 @@ Or via the Orchestrator capabilities menu: `AP`
96
96
  - **Test failure**: Auto-retry up to 3 times, then escalate to user
97
97
  - **Agent error**: Log error, notify user, skip to next step if non-critical
98
98
  - **Conflict in parallel execution**: Pause conflicting agent, resolve, restart
99
- - **User timeout at checkpoint**: Send reminder after 24h, pause pipeline
99
+ - **User timeout at checkpoint**: Keep the pipeline paused. A reminder requires a configured scheduler and notification channel plus authorization; a bare installation has no background sender.
@@ -47,8 +47,8 @@ bmad-plus-sync
47
47
  ├─ Uses Gemini API for:
48
48
  │ └─ AI-powered change classification
49
49
  │
50
- └─ Notifies via:
51
- └─ WhatsApp (Evolution API) or Email
50
+ └─ Reports in the current session
51
+ └─ If configured and authorized: WhatsApp (Evolution API) or email
52
52
  ```
53
53
 
54
54
  ## Protected Paths
@@ -66,4 +66,6 @@ Invoke via the Orchestrator (Nexus) or directly:
66
66
  bmad-plus-sync
67
67
  ```
68
68
 
69
- This skill is also called automatically by the VPS weekly cron job.
69
+ The npm package installs no VPS, cron job or notification sender. An independently
70
+ configured monitor may schedule checks. Use external notifications only when a
71
+ channel is configured and the user has authorized sending; otherwise report inline.
@@ -0,0 +1,19 @@
1
+ ---
2
+ name: dev-studio
3
+ description: Open the installed Dev Studio pack for its six personas and 38 product, architecture, documentation and development workflows.
4
+ ---
5
+
6
+ # Dev Studio dispatcher
7
+
8
+ In an installed project, read the [Dev Studio pack](../pack-dev-studio/SKILL.md)
9
+ and follow its activation procedure. It resolves the requested persona and
10
+ workflow through the shipped catalog. The host executes the instructions;
11
+ `bmad-plus studio prepare` only loads a read-only context bundle.
12
+
13
+ This dispatcher is installed at `.agents/skills/dev-studio/SKILL.md`. Its sibling
14
+ pack is at `.agents/skills/pack-dev-studio/SKILL.md`. In the BMAD+ source checkout,
15
+ read `src/bmad-plus/packs/pack-dev-studio/SKILL.md` instead; the source and installed
16
+ layouts intentionally differ.
17
+
18
+ If the pack is absent, report the missing Dev Studio installation. Do not invent
19
+ routes or treat a dispatcher without its resource files as an executable pack.
@@ -47,7 +47,10 @@ function sameSelection(actual, expected, label) {
47
47
  }
48
48
 
49
49
  /** Compare the installed bytes, normalizing only Windows/Unix line endings. */
50
- function verifyInstallation(projectDir, { packs, tools, derived, ideConfigs, renderFiles, requireInventory = false }) {
50
+ function verifyInstallation(
51
+ projectDir,
52
+ { packs, tools, derived, ideConfigs, renderFiles, requireInventory = false }
53
+ ) {
51
54
  const manifest = JSON.parse(
52
55
  fs.readFileSync(path.join(projectDir, '_bmad', '.bmad-plus-install.json'), 'utf8')
53
56
  );
@@ -97,17 +100,88 @@ function verifyInstallation(projectDir, { packs, tools, derived, ideConfigs, ren
97
100
  assert.equal(manifest.fileInventory?.schemaVersion, 1, 'Missing file inventory');
98
101
  const { collectManagedFiles } = require('../cli/lib/update-transaction');
99
102
  const managedFiles = collectManagedFiles({ projectDir, packs });
100
- assert.deepEqual(Object.keys(manifest.fileInventory.files).sort(), managedFiles.map(entry => entry.file).sort(),
101
- 'Inventory does not cover exactly the selected framework files');
103
+ assert.deepEqual(
104
+ Object.keys(manifest.fileInventory.files).sort(),
105
+ managedFiles.map((entry) => entry.file).sort(),
106
+ 'Inventory does not cover exactly the selected framework files'
107
+ );
102
108
  for (const { file } of managedFiles) {
103
- const actualHash = crypto.createHash('sha256').update(fs.readFileSync(resolveWithin(projectDir, file))).digest('hex');
104
- assert.equal(manifest.fileInventory.files[file], actualHash, `Inventory differs from installed bytes: ${file}`);
109
+ const actualHash = crypto
110
+ .createHash('sha256')
111
+ .update(fs.readFileSync(resolveWithin(projectDir, file)))
112
+ .digest('hex');
113
+ assert.equal(
114
+ manifest.fileInventory.files[file],
115
+ actualHash,
116
+ `Inventory differs from installed bytes: ${file}`
117
+ );
105
118
  }
106
119
  }
107
120
  return files.length;
108
121
  }
109
122
 
110
- function run(command, args, { cwd, env, timeout = 60000 }) {
123
+ function verifyDiagnostics(report, { packs, tools, derived }) {
124
+ assert.equal(report.schemaVersion, 1, 'Unsupported diagnostic report');
125
+ assert.equal(report.versions.installed, derived.product.version);
126
+ assert.equal(report.versions.cli, derived.product.version);
127
+ assert.equal(report.versions.published, null, 'Doctor must not invent npm freshness evidence');
128
+ sameSelection(
129
+ report.packs.map(({ id }) => id),
130
+ packs,
131
+ 'diagnostic packs'
132
+ );
133
+ sameSelection(
134
+ report.integrations.map(({ tool }) => tool),
135
+ tools,
136
+ 'diagnostic integrations'
137
+ );
138
+ for (const integration of report.integrations) {
139
+ assert.deepEqual(
140
+ integration,
141
+ {
142
+ tool: integration.tool,
143
+ ...derived.diagnostics.integrations[integration.tool],
144
+ ownership: 'unchanged',
145
+ hostVerified: false,
146
+ },
147
+ 'An installed adapter must not imply verified host execution'
148
+ );
149
+ }
150
+ const expectedErrors = [];
151
+ assert.deepEqual(
152
+ report.checks
153
+ .filter(({ status }) => status === 'error')
154
+ .map(({ code, path: file }) => `${code}:${file}`)
155
+ .sort(),
156
+ expectedErrors.sort(),
157
+ 'Every advertised pack must install without delivery errors'
158
+ );
159
+ assert.equal(report.summary.errors, expectedErrors.length);
160
+ assert.equal(report.inventory.status, 'complete');
161
+ assert(report.inventory.trackedFiles > 0, 'Doctor did not inspect the ownership inventory');
162
+ assert.equal(
163
+ report.checks.filter(({ code }) => code === 'file.unchanged').length,
164
+ report.inventory.trackedFiles,
165
+ 'Every freshly installed managed file must have matching ownership'
166
+ );
167
+ assert(!report.checks.some(({ code }) => ['file.modified', 'file.unowned'].includes(code)));
168
+ for (const runtime of report.runtimes.filter(({ runtime }) => runtime === 'python')) {
169
+ assert.equal(
170
+ runtime.imports,
171
+ 'not-verified',
172
+ 'Presence of requirements cannot prove Python imports'
173
+ );
174
+ assert.equal(runtime.environment, 'missing', 'Contract checks must not provision Python');
175
+ }
176
+ const expectedStatus = expectedErrors.length
177
+ ? 'error'
178
+ : report.summary.warnings
179
+ ? 'warning'
180
+ : 'ok';
181
+ assert.equal(report.status, expectedStatus);
182
+ }
183
+
184
+ function run(command, args, { cwd, env, timeout = 60000, expectedExitCode = 0 }) {
111
185
  const result = spawnSync(command, args, {
112
186
  cwd,
113
187
  env,
@@ -117,7 +191,7 @@ function run(command, args, { cwd, env, timeout = 60000 }) {
117
191
  windowsHide: true,
118
192
  stdio: ['ignore', 'pipe', 'pipe'],
119
193
  });
120
- if (result.error || result.status !== 0) {
194
+ if (result.error || result.status !== expectedExitCode) {
121
195
  const reason = result.error
122
196
  ? result.error.message
123
197
  : `exit ${result.status}, signal ${result.signal || 'none'}`;
@@ -221,13 +295,81 @@ function runMatrix(packageRoot, variant, tempRoot, env, reference) {
221
295
  { cwd: projectDir, env }
222
296
  );
223
297
  files += verifyInstallation(projectDir, { ...reference, packs: selection.packs, tools });
224
- if (tools.length === allTools.length) {
225
- const output = run(process.execPath, [
298
+ const expectedExitCode = 0;
299
+ const diagnosis = run(
300
+ process.execPath,
301
+ [
226
302
  path.join(packageRoot, 'tools', 'cli', 'bmad-plus-cli.js'),
227
- 'update-check', '--offline', '--json', '--directory', projectDir,
228
- ], { cwd: projectDir, env });
303
+ 'doctor',
304
+ '--json',
305
+ '--directory',
306
+ projectDir,
307
+ ],
308
+ { cwd: projectDir, env, expectedExitCode }
309
+ );
310
+ verifyDiagnostics(JSON.parse(diagnosis), {
311
+ packs: selection.packs,
312
+ tools,
313
+ derived: reference.derived,
314
+ variant,
315
+ });
316
+ if (selection.packs.includes('dev-studio')) {
317
+ const list = JSON.parse(
318
+ run(
319
+ process.execPath,
320
+ [
321
+ path.join(packageRoot, 'tools/cli/bmad-plus-cli.js'),
322
+ 'studio',
323
+ 'list',
324
+ '--directory',
325
+ projectDir,
326
+ '--json',
327
+ ],
328
+ { cwd: projectDir, env }
329
+ )
330
+ );
331
+ assert.equal(list.workflows.length, reference.derived.packs['dev-studio'].workflowCount);
332
+ const prepared = JSON.parse(
333
+ run(
334
+ process.execPath,
335
+ [
336
+ path.join(packageRoot, 'tools/cli/bmad-plus-cli.js'),
337
+ 'studio',
338
+ 'prepare',
339
+ 'create-ux-design',
340
+ '--request',
341
+ 'Design the sign-in flow',
342
+ '--directory',
343
+ projectDir,
344
+ '--json',
345
+ ],
346
+ { cwd: projectDir, env }
347
+ )
348
+ );
349
+ assert.equal(prepared.status, 'ready');
350
+ assert.equal(prepared.executed, false);
351
+ assert(prepared.instructions.some((item) => item.path.endsWith('/create-ux-design.md')));
352
+ assert(!fs.existsSync(path.join(projectDir, prepared.outputPath)));
353
+ }
354
+ if (tools.length === allTools.length) {
355
+ const output = run(
356
+ process.execPath,
357
+ [
358
+ path.join(packageRoot, 'tools', 'cli', 'bmad-plus-cli.js'),
359
+ 'update-check',
360
+ '--offline',
361
+ '--json',
362
+ '--directory',
363
+ projectDir,
364
+ ],
365
+ { cwd: projectDir, env }
366
+ );
229
367
  const checked = JSON.parse(output);
230
- assert.equal(checked.status, 'unknown', 'Offline check must not claim the latest release');
368
+ assert.equal(
369
+ checked.status,
370
+ 'unknown',
371
+ 'Offline check must not claim the latest release'
372
+ );
231
373
  assert.equal(checked.updateAvailable, null);
232
374
  assert.equal(checked.canAutoApply, false);
233
375
  }
@@ -271,9 +413,19 @@ function main() {
271
413
  };
272
414
  const source = runMatrix(REPO_ROOT, 'source', tempRoot, env, reference);
273
415
  const packageRoot = packAndExtract(tempRoot, env);
416
+ const { checkPythonDelivery } = require('./pack-delivery');
417
+ const { loadRegistry } = require('./generate');
418
+ assert.deepEqual(
419
+ checkPythonDelivery(loadRegistry(), {
420
+ packageRoot,
421
+ packageJson: JSON.parse(fs.readFileSync(path.join(packageRoot, 'package.json'), 'utf8')),
422
+ }),
423
+ [],
424
+ 'Declared Python resources must exist in the real npm archive'
425
+ );
274
426
  const packaged = runMatrix(packageRoot, 'npm', tempRoot, env, reference);
275
427
  console.log(
276
- `Install contract passed: ${source.installations + packaged.installations} installs, ${source.files + packaged.files} files compared (source + npm without registry.yaml).`
428
+ `Install contract passed: ${source.installations + packaged.installations} installs and doctor JSON reports, ${source.files + packaged.files} files compared (source + npm without registry.yaml).`
277
429
  );
278
430
  return 0;
279
431
  } finally {