bmad-plus 0.12.2 → 0.13.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 (44) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +36 -8
  3. package/package.json +6 -4
  4. package/readme-international/README.de.md +37 -8
  5. package/readme-international/README.es.md +38 -9
  6. package/readme-international/README.fr.md +37 -8
  7. package/src/bmad-plus/agents/agent-orchestrator/SKILL.md +2 -0
  8. package/src/bmad-plus/module.yaml +270 -220
  9. package/src/bmad-plus/packs/pack-seo/scripts/seo_apis.py +8 -8
  10. package/src/bmad-plus/packs/pack-seo/scripts/seo_fetch.py +1 -2
  11. package/src/bmad-plus/packs/pack-seo/scripts/seo_report.py +0 -1
  12. package/src/bmad-plus/skills/bmad-plus-autopilot/SKILL.md +1 -1
  13. package/tools/bmad-plus-npx.js +4 -2
  14. package/tools/build/adapters.config.js +60 -51
  15. package/tools/build/check-counts.js +52 -54
  16. package/tools/build/check-install-contract.js +298 -0
  17. package/tools/build/generate-adapters.js +252 -56
  18. package/tools/build/generate.js +187 -10
  19. package/tools/build/generated-adapters/.codex/AGENTS.md +20 -7
  20. package/tools/build/generated-adapters/.cursor/rules/bmad-plus.mdc +20 -7
  21. package/tools/build/generated-adapters/.opencode/AGENTS.md +20 -7
  22. package/tools/build/generated-adapters/AGENTS.md +20 -7
  23. package/tools/build/generated-adapters/CLAUDE.md +20 -7
  24. package/tools/build/generated-adapters/CONVENTIONS.md +20 -7
  25. package/tools/build/generated-adapters/GEMINI.md +20 -7
  26. package/tools/build/module.template.yaml +82 -0
  27. package/tools/cli/bmad-plus-cli.js +16 -1
  28. package/tools/cli/commands/doctor.js +12 -40
  29. package/tools/cli/commands/install.js +108 -163
  30. package/tools/cli/commands/uninstall.js +173 -65
  31. package/tools/cli/commands/update-check.js +31 -0
  32. package/tools/cli/commands/update-policy.js +39 -0
  33. package/tools/cli/commands/update.js +102 -113
  34. package/tools/cli/i18n.js +60 -0
  35. package/tools/cli/lib/ide-config.js +4 -261
  36. package/tools/cli/lib/install-manifest.js +17 -0
  37. package/tools/cli/lib/installed-adapters.js +89 -0
  38. package/tools/cli/lib/npm-runner.js +177 -0
  39. package/tools/cli/lib/pack-copy.js +62 -66
  40. package/tools/cli/lib/packs.js +437 -3
  41. package/tools/cli/lib/update-check.js +153 -0
  42. package/tools/cli/lib/update-dispatch.js +182 -0
  43. package/tools/cli/lib/update-policy.js +90 -0
  44. package/tools/cli/lib/update-transaction.js +334 -0
@@ -1,28 +1,114 @@
1
+ # AUTO-GENERATED from registry.yaml + tools/build/module.template.yaml — DO NOT EDIT.
1
2
  code: bmad-plus
2
- name: "BMAD+ Streamlined AI-Driven Development"
3
- description: "Augmented BMAD framework with multi-role agents, autopilot mode, and parallel execution"
3
+ name: BMAD+ Streamlined AI-Driven Development
4
+ description: Augmented BMAD framework with multi-role agents, autopilot mode, and parallel execution
4
5
  default_selected: true
5
-
6
- # Compatibility with upstream
7
6
  extends: bmm
8
7
  compatibility:
9
- min_core_version: "6.0.0"
10
- max_core_version: "7.0.0"
11
- replaces_modules: ["bmm"]
8
+ min_core_version: 6.0.0
9
+ max_core_version: 7.0.0
10
+ replaces_modules:
11
+ - bmm
12
12
  keeps_core_skills: true
13
-
14
- # ═══════════════════════════════════════════
15
- # MODULAR PACK SYSTEM
16
- # Core is always installed. Additional packs
17
- # add specialized agents and skills.
18
- # ═══════════════════════════════════════════
19
-
13
+ install_packs:
14
+ prompt:
15
+ - Quels packs additionnels souhaites-tu installer ?
16
+ - Core est toujours inclus.
17
+ default: none
18
+ result: '{value}'
19
+ multi-select:
20
+ - value: osint
21
+ label: 🔍 OSINT Intelligence — Investigation & scraping (55+ Apify actors, 7 APIs).
22
+ - value: maker
23
+ label: 🧬 Agent Creator — Design, build, validate, and package new BMAD+-compatible agents.
24
+ - value: shield
25
+ label: 🛡️ Shield — GRC Compliance — 27 compliance agents + 11 workflows across 26+ frameworks.
26
+ - value: seo
27
+ label: 🔍 SEO Audit 360 — 3 agents (Scout, Chief, Judge) + 6-phase audit + PageSpeed loop.
28
+ - value: memory
29
+ label: 🧠 Memory — Persistent Brain — Cross-session memory + project scanner + Karpathy guardrails.
30
+ - value: dev-studio
31
+ label: >-
32
+ 🏗️ Dev Studio — Full SDLC — 6 specialized agents + 38 workflows: Analysis → Planning → Architecture →
33
+ Implementation → Review.
34
+ - value: backup
35
+ label: 🗂️ Universal Backup — Timestamped ZIP backup with smart exclusions.
36
+ - value: animated
37
+ label: 🎬 Animated Website — Luxury scroll-driven website from video.
38
+ - value: all
39
+ label: Tout installer
40
+ - value: none
41
+ label: Aucun — Core uniquement
42
+ project_name:
43
+ prompt: What is your project called?
44
+ default: '{directory_name}'
45
+ result: '{value}'
46
+ user_skill_level:
47
+ prompt:
48
+ - What is your development experience level?
49
+ - This affects how agents explain concepts in chat.
50
+ default: expert
51
+ result: '{value}'
52
+ single-select:
53
+ - value: beginner
54
+ label: Beginner - Explain things clearly
55
+ - value: intermediate
56
+ label: Intermediate - Balance detail with speed
57
+ - value: expert
58
+ label: Expert - Be direct and technical
59
+ execution_mode:
60
+ prompt:
61
+ - How do you want to work with BMAD+ agents?
62
+ - 'Manual: you call agents when needed. Autopilot: orchestrator manages everything.'
63
+ default: manual
64
+ result: '{value}'
65
+ single-select:
66
+ - value: manual
67
+ label: Manual - Call agents yourself
68
+ - value: autopilot
69
+ label: Autopilot - Orchestrator manages the pipeline
70
+ - value: hybrid
71
+ label: Hybrid - Autopilot with frequent checkpoints
72
+ auto_role_activation:
73
+ prompt: Enable intelligent auto-activation of agent roles based on context?
74
+ default: 'true'
75
+ result: '{value}'
76
+ single-select:
77
+ - value: 'true'
78
+ label: Yes - Agents auto-switch roles when context demands it
79
+ - value: 'false'
80
+ label: No - Only switch roles when I explicitly ask
81
+ parallel_execution:
82
+ prompt: Enable parallel multi-agent execution for independent tasks?
83
+ default: 'true'
84
+ result: '{value}'
85
+ single-select:
86
+ - value: 'true'
87
+ label: Yes - Run independent tasks in parallel
88
+ - value: 'false'
89
+ label: No - Sequential execution only
90
+ planning_artifacts:
91
+ prompt: Where should planning artifacts be stored? (Discovery phase output)
92
+ default: '{output_folder}/discovery'
93
+ result: '{project-root}/{value}'
94
+ implementation_artifacts:
95
+ prompt: Where should implementation artifacts be stored? (Build & Ship phase output)
96
+ default: '{output_folder}/build'
97
+ result: '{project-root}/{value}'
98
+ project_knowledge:
99
+ prompt: Where should long-term project knowledge be stored?
100
+ default: docs
101
+ result: '{project-root}/{value}'
102
+ directories:
103
+ - '{planning_artifacts}'
104
+ - '{implementation_artifacts}'
105
+ - '{project_knowledge}'
20
106
  packs:
21
107
  core:
22
- name: "Core Development"
23
- icon: "⚙️"
24
- description: "4 multi-role agents for full development lifecycle"
25
- required: true # Always installed
108
+ name: Core Development
109
+ icon: ⚙️
110
+ description: Multi-role agents for the full development lifecycle.
111
+ required: true
26
112
  agents:
27
113
  - agent-strategist
28
114
  - agent-architect-dev
@@ -34,17 +120,15 @@ packs:
34
120
  - bmad-plus-sync
35
121
  data:
36
122
  - role-triggers.yaml
37
-
38
123
  osint:
39
- name: "OSINT Intelligence"
40
- icon: "🔍"
41
- description: "Investigation, scraping, psychoprofiling (55+ Apify actors, 7 APIs)"
124
+ name: OSINT Intelligence
125
+ icon: 🔍
126
+ description: Investigation & scraping (55+ Apify actors, 7 APIs).
42
127
  required: false
43
128
  agents:
44
129
  - agent-shadow
45
- skills:
46
- - bmad-osint-investigate
47
- external_package: "osint-agent-package"
130
+ skills: []
131
+ external_package: osint-agent-package
48
132
  required_keys:
49
133
  - APIFY_API_TOKEN
50
134
  optional_keys:
@@ -52,232 +136,198 @@ packs:
52
136
  - EXA_API_KEY
53
137
  - TAVILY_API_KEY
54
138
  - JINA_API_KEY
55
-
56
139
  maker:
57
- name: "Agent Creator"
58
- icon: "🧬"
59
- description: "Créer de nouveaux agents BMAD+ compatibles: design, build, package"
140
+ name: Agent Creator
141
+ icon: 🧬
142
+ description: Design, build, validate, and package new BMAD+-compatible agents.
60
143
  required: false
61
144
  agents:
62
145
  - agent-maker
63
146
  skills: []
64
-
147
+ data: []
65
148
  shield:
66
- name: "Shield — GRC Compliance"
67
- icon: "🛡️"
68
- description: "27 compliance agents + 11 workflows covering 25+ regulatory frameworks (GDPR, ISO 27001, SOC 2, HIPAA, PCI DSS, EU AI Act, DORA, NIS2...)"
149
+ name: Shield — GRC Compliance
150
+ icon: 🛡️
151
+ description: 27 compliance agents + 11 workflows across 26+ frameworks.
69
152
  required: false
70
- packDir: pack-shield
71
- packSrcDir: packs
153
+ agents:
154
+ - shield-orchestrator
155
+ skills: []
72
156
  orchestrator: shield-orchestrator
73
157
  categories:
74
158
  - id: data-privacy
75
- name: "Data Privacy"
76
- icon: "🔐"
77
- agents: [gdpr-agent, ccpa-agent, lgpd-agent, dpdpa-agent, iso27701-agent]
159
+ name: Data Privacy
160
+ agents:
161
+ - gdpr-agent
162
+ - ccpa-agent
163
+ - lgpd-agent
164
+ - dpdpa-agent
165
+ - iso27701-agent
78
166
  - id: cybersecurity
79
- name: "Cybersecurity"
80
- icon: "🛡️"
81
- agents: [iso27001-agent, nist-csf-agent, nist-800-53-agent, cis-controls-agent, nis2-agent, ism-agent]
167
+ name: Cybersecurity
168
+ agents:
169
+ - iso27001-agent
170
+ - nist-csf-agent
171
+ - nist-800-53-agent
172
+ - cis-controls-agent
173
+ - nis2-agent
174
+ - ism-agent
82
175
  - id: industry-compliance
83
- name: "Industry Compliance"
84
- icon: "🏢"
85
- agents: [soc2-agent, pci-dss-agent, hipaa-agent, swift-csp-agent, dora-agent, fedramp-agent]
176
+ name: Industry Compliance
177
+ agents:
178
+ - soc2-agent
179
+ - pci-dss-agent
180
+ - hipaa-agent
181
+ - swift-csp-agent
182
+ - dora-agent
183
+ - fedramp-agent
86
184
  - id: defense-export
87
- name: "Defense & Export Control"
88
- icon: "🔒"
89
- agents: [cmmc-agent, itar-agent, ear-agent, tsa-agent]
185
+ name: Defense & Export Control
186
+ agents:
187
+ - cmmc-agent
188
+ - itar-agent
189
+ - ear-agent
190
+ - tsa-agent
90
191
  - id: ai-governance
91
- name: "AI Governance"
92
- icon: "🤖"
93
- agents: [eu-ai-act-agent, iso42001-agent, nist-ai-rmf-agent]
192
+ name: AI Governance
193
+ agents:
194
+ - eu-ai-act-agent
195
+ - iso42001-agent
196
+ - nist-ai-rmf-agent
94
197
  - id: accessibility-esg
95
- name: "Accessibility & ESG"
96
- icon: "♿"
97
- agents: [wcag-agent, section508-agent, csrd-agent]
98
- - id: workflows
99
- name: "GDPR & AI Act Workflows"
100
- icon: "📋"
101
- agents: [dpia-sentinel, breach-sentinel, legitimate-interest, privacy-advisor, privacy-notice-gen, privacy-policy-gen, cookie-policy-gen, ai-act-classifier, ai-act-roles, ai-act-fria, ai-act-incidents]
102
-
103
- dev-studio:
104
- name: "Dev Studio — Full SDLC"
105
- icon: "🏗️"
106
- description: "6 specialized agents + 38 workflows covering Analysis → Planning → Architecture → Implementation → Review. Adapted from BMAD-METHOD v6.6.0."
198
+ name: Accessibility & ESG
199
+ agents:
200
+ - wcag-agent
201
+ - section508-agent
202
+ - csrd-agent
203
+ workflows:
204
+ - dpia-sentinel
205
+ - breach-sentinel
206
+ - legitimate-interest
207
+ - privacy-advisor
208
+ - privacy-notice-gen
209
+ - privacy-policy-gen
210
+ - cookie-policy-gen
211
+ - ai-act-classifier
212
+ - ai-act-roles
213
+ - ai-act-fria
214
+ - ai-act-incidents
215
+ packDir: pack-shield
216
+ packSrcDir: packs
217
+ seo:
218
+ name: SEO Audit 360
219
+ icon: 🔍
220
+ description: 3 agents (Scout, Chief, Judge) + 6-phase audit + PageSpeed loop.
107
221
  required: false
108
- packDir: pack-dev-studio
222
+ agents:
223
+ - seo-scout
224
+ - seo-chief
225
+ - seo-judge
226
+ skills: []
227
+ packDir: pack-seo
228
+ packSrcDir: packs
229
+ memory:
230
+ name: Memory — Persistent Brain
231
+ icon: 🧠
232
+ description: Cross-session memory + project scanner + Karpathy guardrails.
233
+ required: false
234
+ agents:
235
+ - zecher
236
+ skills: []
237
+ cohabitation_warning: Detects and links existing brains (_brain/, ~/.claude/memory/); NEVER overwrites memory files.
238
+ packDir: pack-memory
109
239
  packSrcDir: packs
240
+ dev-studio:
241
+ name: Dev Studio — Full SDLC
242
+ icon: 🏗️
243
+ description: '6 specialized agents + 38 workflows: Analysis → Planning → Architecture → Implementation → Review.'
244
+ required: false
245
+ agents:
246
+ - dev-studio-orchestrator
247
+ skills:
248
+ - dev-studio
110
249
  orchestrator: dev-studio-orchestrator
111
- cohabitation_warning: "Dev Studio agents overlap with Core agents (Atlas/Forge/Sentinel/Nexus). Both can be installed — Dev Studio offers more specialized, phase-specific workflows."
112
250
  categories:
113
251
  - id: analysis
114
- name: "Analysis"
115
- icon: "📊"
116
- agents: [analyst-agent, tech-writer-agent, product-brief, prfaq, document-project, market-research, domain-research, technical-research]
252
+ name: Analysis
253
+ workflows:
254
+ - product-brief
255
+ - prfaq
256
+ - document-project
257
+ - market-research
258
+ - domain-research
259
+ - technical-research
117
260
  - id: planning
118
- name: "Planning"
119
- icon: "📋"
120
- agents: [pm-agent, ux-designer-agent, create-prd, prd, edit-prd, validate-prd, create-ux-design]
261
+ name: Planning
262
+ workflows:
263
+ - create-prd
264
+ - prd
265
+ - edit-prd
266
+ - validate-prd
267
+ - create-ux-design
121
268
  - id: architecture
122
- name: "Architecture"
123
- icon: "🏗️"
124
- agents: [architect-agent, create-architecture, create-epics-stories, implementation-readiness, generate-project-context]
269
+ name: Architecture
270
+ workflows:
271
+ - create-architecture
272
+ - create-epics-stories
273
+ - implementation-readiness
274
+ - generate-project-context
125
275
  - id: implementation
126
- name: "Implementation"
127
- icon: "💻"
128
- agents: [dev-agent, sprint-planning, create-story, dev-story, code-review, quick-dev, sprint-status, retrospective, correct-course, investigate, checkpoint-preview, qa-e2e-tests]
276
+ name: Implementation
277
+ workflows:
278
+ - sprint-planning
279
+ - create-story
280
+ - dev-story
281
+ - code-review
282
+ - quick-dev
283
+ - sprint-status
284
+ - retrospective
285
+ - correct-course
286
+ - investigate
287
+ - checkpoint-preview
288
+ - qa-e2e-tests
129
289
  - id: utilities
130
- name: "Utilities"
131
- icon: "🔧"
132
- agents: [distillator, party-mode, brainstorming, adversarial-review, edge-case-hunter, editorial-review-prose, editorial-review-structure, advanced-elicitation, shard-doc, index-docs, bmad-help, customize]
133
-
134
- seo:
135
- name: "SEO Audit 360"
136
- icon: "🔍"
137
- description: "3 agents (Scout, Chief, Judge) + 6-phase audit + PageSpeed loop"
138
- required: false
139
- packDir: pack-seo
290
+ name: Utilities
291
+ workflows:
292
+ - distillator
293
+ - party-mode
294
+ - brainstorming
295
+ - adversarial-review
296
+ - edge-case-hunter
297
+ - editorial-review-prose
298
+ - editorial-review-structure
299
+ - advanced-elicitation
300
+ - shard-doc
301
+ - index-docs
302
+ - bmad-help
303
+ - customize
304
+ sub_agents:
305
+ - analyst-agent
306
+ - tech-writer-agent
307
+ - pm-agent
308
+ - ux-designer-agent
309
+ - architect-agent
310
+ - dev-agent
311
+ cohabitation_warning: Dev Studio agents overlap with Core (Atlas/Forge/Sentinel/Nexus); both can coexist.
312
+ packDir: pack-dev-studio
140
313
  packSrcDir: packs
141
- agents:
142
- - seo-scout
143
- - seo-chief
144
- - seo-judge
145
-
146
314
  backup:
147
- name: "Universal Backup"
148
- icon: "🗂️"
149
- description: "Timestamped ZIP backup with smart exclusions"
315
+ name: Universal Backup
316
+ icon: 🗂️
317
+ description: Timestamped ZIP backup with smart exclusions.
150
318
  required: false
151
- packDir: pack-backup
152
- packSrcDir: packs
153
319
  agents:
154
320
  - backup-agent
155
-
321
+ skills: []
322
+ packDir: pack-backup
323
+ packSrcDir: packs
156
324
  animated:
157
- name: "Animated Website"
158
- icon: "🎬"
159
- description: "Luxury scroll-driven website from video"
325
+ name: Animated Website
326
+ icon: 🎬
327
+ description: Luxury scroll-driven website from video.
160
328
  required: false
161
- packDir: pack-animated
162
- packSrcDir: packs
163
329
  agents:
164
330
  - animated-website-agent
165
-
166
- memory:
167
- name: "Memory — Persistent Brain"
168
- icon: "🧠"
169
- description: "Cross-session memory + project scanner + Karpathy guardrails"
170
- required: false
171
- packDir: pack-memory
331
+ skills: []
332
+ packDir: pack-animated
172
333
  packSrcDir: packs
173
- agents:
174
- - zecher
175
- cohabitation_warning: "Memory can detect and link to existing brain directories (_brain/, ~/.claude/memory/). It will NEVER overwrite existing memory files."
176
-
177
- install_packs:
178
- prompt:
179
- - "Quels packs additionnels souhaites-tu installer ?"
180
- - "Core (Atlas, Forge, Sentinel, Nexus) est toujours inclus."
181
- default: "none"
182
- result: "{value}"
183
- multi-select:
184
- - value: "osint"
185
- label: "🔍 OSINT — Agent Shadow (investigation, scraping, psychoprofil)"
186
- - value: "maker"
187
- label: "🧬 Agent Creator — Créer de nouveaux agents BMAD+ compatibles"
188
- - value: "shield"
189
- label: "🛡️ Shield GRC — 27 agents de conformité + 11 workflows (GDPR, ISO 27001, SOC 2, EU AI Act...)"
190
- - value: "dev-studio"
191
- label: "🏗️ Dev Studio — 6 agents + 38 workflows SDLC complet (Miriam, Yosef, Bezalel, Oholiab...)"
192
- - value: "seo"
193
- label: "🔍 SEO Audit 360 — 3 agents (Scout, Chief, Judge)"
194
- - value: "backup"
195
- label: "🗂️ Universal Backup — Backup ZIP intelligent"
196
- - value: "animated"
197
- label: "🎬 Animated Website — Luxury scroll-driven site from video"
198
- - value: "memory"
199
- label: "🧠 Memory — Cerveau persistant + scanner de projets + guardrails Karpathy"
200
- - value: "all"
201
- label: "🤖 Tout installer"
202
- - value: "none"
203
- label: "Aucun — Core uniquement"
204
-
205
- # Variables from Core Config inserted:
206
- ## user_name
207
- ## communication_language
208
- ## document_output_language
209
- ## output_folder
210
-
211
- project_name:
212
- prompt: "What is your project called?"
213
- default: "{directory_name}"
214
- result: "{value}"
215
-
216
- user_skill_level:
217
- prompt:
218
- - "What is your development experience level?"
219
- - "This affects how agents explain concepts in chat."
220
- default: "expert"
221
- result: "{value}"
222
- single-select:
223
- - value: "beginner"
224
- label: "Beginner - Explain things clearly"
225
- - value: "intermediate"
226
- label: "Intermediate - Balance detail with speed"
227
- - value: "expert"
228
- label: "Expert - Be direct and technical"
229
-
230
- execution_mode:
231
- prompt:
232
- - "How do you want to work with BMAD+ agents?"
233
- - "Manual: you call agents when needed. Autopilot: orchestrator manages everything."
234
- default: "manual"
235
- result: "{value}"
236
- single-select:
237
- - value: "manual"
238
- label: "Manual - Call agents yourself"
239
- - value: "autopilot"
240
- label: "Autopilot - Orchestrator manages the pipeline"
241
- - value: "hybrid"
242
- label: "Hybrid - Autopilot with frequent checkpoints"
243
-
244
- auto_role_activation:
245
- prompt: "Enable intelligent auto-activation of agent roles based on context?"
246
- default: "true"
247
- result: "{value}"
248
- single-select:
249
- - value: "true"
250
- label: "Yes - Agents auto-switch roles when context demands it"
251
- - value: "false"
252
- label: "No - Only switch roles when I explicitly ask"
253
-
254
- parallel_execution:
255
- prompt: "Enable parallel multi-agent execution for independent tasks?"
256
- default: "true"
257
- result: "{value}"
258
- single-select:
259
- - value: "true"
260
- label: "Yes - Run independent tasks in parallel"
261
- - value: "false"
262
- label: "No - Sequential execution only"
263
-
264
- planning_artifacts:
265
- prompt: "Where should planning artifacts be stored? (Discovery phase output)"
266
- default: "{output_folder}/discovery"
267
- result: "{project-root}/{value}"
268
-
269
- implementation_artifacts:
270
- prompt: "Where should implementation artifacts be stored? (Build & Ship phase output)"
271
- default: "{output_folder}/build"
272
- result: "{project-root}/{value}"
273
-
274
- project_knowledge:
275
- prompt: "Where should long-term project knowledge be stored?"
276
- default: "docs"
277
- result: "{project-root}/{value}"
278
-
279
- # Directories to create during installation
280
- directories:
281
- - "{planning_artifacts}"
282
- - "{implementation_artifacts}"
283
- - "{project_knowledge}"
@@ -298,16 +298,16 @@ def run_rich_results_test(url: str) -> dict:
298
298
 
299
299
  def run_all(url: str) -> dict:
300
300
  """Run all available API checks and merge results."""
301
- print(f"Running PageSpeed Insights (mobile)...", file=sys.stderr)
301
+ print("Running PageSpeed Insights (mobile)...", file=sys.stderr)
302
302
  psi_mobile = run_pagespeed(url, strategy="mobile")
303
303
 
304
- print(f"Running PageSpeed Insights (desktop)...", file=sys.stderr)
304
+ print("Running PageSpeed Insights (desktop)...", file=sys.stderr)
305
305
  psi_desktop = run_pagespeed(url, strategy="desktop")
306
306
 
307
- print(f"Running CrUX API...", file=sys.stderr)
307
+ print("Running CrUX API...", file=sys.stderr)
308
308
  crux = run_crux(url)
309
309
 
310
- print(f"Running Mobile-Friendly Test...", file=sys.stderr)
310
+ print("Running Mobile-Friendly Test...", file=sys.stderr)
311
311
  rich = run_rich_results_test(url)
312
312
 
313
313
  return {
@@ -339,21 +339,21 @@ def print_psi_summary(result: dict, label: str):
339
339
 
340
340
  cwv = result.get("cwv", {})
341
341
  if cwv:
342
- print(f"\n Core Web Vitals:")
342
+ print("\n Core Web Vitals:")
343
343
  for metric, data in cwv.items():
344
344
  icon = "🟢" if data["score"] >= 90 else "🟡" if data["score"] >= 50 else "🔴"
345
345
  print(f" {icon} {metric}: {data['display']} ({data['score']}/100)")
346
346
 
347
347
  failures = result.get("failing_audits", [])[:5]
348
348
  if failures:
349
- print(f"\n Top Failing Audits:")
349
+ print("\n Top Failing Audits:")
350
350
  for audit in failures:
351
351
  icon = "🔴" if audit["severity"] == "critical" else "🟠"
352
352
  print(f" {icon} {audit['title']} ({audit['score']}/100)")
353
353
 
354
354
  opps = result.get("opportunities", [])[:3]
355
355
  if opps:
356
- print(f"\n Top Opportunities:")
356
+ print("\n Top Opportunities:")
357
357
  for opp in opps:
358
358
  print(f" 💡 {opp['title']} (save {opp['savings_ms']}ms)")
359
359
 
@@ -397,7 +397,7 @@ def main():
397
397
 
398
398
  crux = result["crux"]
399
399
  if not crux.get("error"):
400
- print(f"\n 📊 CrUX Field Data:")
400
+ print("\n 📊 CrUX Field Data:")
401
401
  for metric, data in crux.get("metrics", {}).items():
402
402
  print(f" {metric}: p75 = {data['p75']}")
403
403
  else:
@@ -18,7 +18,6 @@ import ipaddress
18
18
  import json
19
19
  import socket
20
20
  import sys
21
- from typing import Optional
22
21
  from urllib.parse import urljoin, urlparse
23
22
 
24
23
  try:
@@ -290,7 +289,7 @@ def main():
290
289
  print(result["content"])
291
290
 
292
291
  # Metadata to stderr
293
- print(f"\n--- Fetch Summary ---", file=sys.stderr)
292
+ print("\n--- Fetch Summary ---", file=sys.stderr)
294
293
  print(f"Final URL: {result['final_url']}", file=sys.stderr)
295
294
  print(f"Status: {result['status_code']}", file=sys.stderr)
296
295
  print(f"Size: {result['content_length']:,} bytes", file=sys.stderr)
@@ -136,7 +136,6 @@ def generate_html_report(audit_data: dict) -> str:
136
136
  total_score_esc = html.escape(str(total_score))
137
137
  categories = audit_data.get("score", {}).get("categories", {})
138
138
  issues = audit_data.get("issues", [])
139
- pages = audit_data.get("pages", [])
140
139
 
141
140
  # Generate radar chart
142
141
  radar_svg = generate_radar_svg(categories) if categories else ""
@@ -48,7 +48,7 @@ The autopilot executes the following pipeline:
48
48
 
49
49
  ### Checkpoint Behavior
50
50
 
51
- Checkpoints are configurable via `module.yaml`:
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
53
  - **require_approval** (🔴 STOP): Pause execution, send WhatsApp notification, wait for user approval.
54
54
  - **notify_only** (🟡 INFO): Send notification, continue unless user intervenes.
@@ -21,8 +21,10 @@ if (isNpxExecution) {
21
21
  }
22
22
 
23
23
  try {
24
- const result = spawnSync('node', [cliPath, ...args], { stdio: 'inherit' });
25
- if (result.status !== 0) process.exit(result.status);
24
+ const result = spawnSync(process.execPath, [cliPath, ...args], { stdio: 'inherit' });
25
+ if (result.error) console.error(`Error: Could not launch BMAD+: ${result.error.message}`);
26
+ if (result.error || result.signal || result.status === null) process.exit(1);
27
+ if (result.status !== 0) process.exit(result.status || 1);
26
28
  } catch (error) {
27
29
  process.exit(error.status || 1);
28
30
  }