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.
- package/CHANGELOG.md +22 -0
- package/README.md +96 -489
- package/package.json +7 -2
- package/readme-international/README.de.md +9 -5
- package/readme-international/README.es.md +9 -5
- package/readme-international/README.fr.md +9 -5
- package/src/bmad-plus/agents/agent-orchestrator/SKILL.md +3 -3
- package/src/bmad-plus/packs/pack-dev-studio/README.md +133 -141
- package/src/bmad-plus/packs/pack-dev-studio/SKILL.md +49 -0
- package/src/bmad-plus/packs/pack-dev-studio/categories/analysis/analyst-agent.md +35 -60
- package/src/bmad-plus/packs/pack-dev-studio/categories/analysis/document-project.md +59 -59
- package/src/bmad-plus/packs/pack-dev-studio/categories/analysis/domain-research.md +55 -93
- package/src/bmad-plus/packs/pack-dev-studio/categories/analysis/market-research.md +58 -93
- package/src/bmad-plus/packs/pack-dev-studio/categories/analysis/prfaq.md +55 -132
- package/src/bmad-plus/packs/pack-dev-studio/categories/analysis/product-brief.md +63 -78
- package/src/bmad-plus/packs/pack-dev-studio/categories/analysis/tech-writer-agent.md +54 -69
- package/src/bmad-plus/packs/pack-dev-studio/categories/analysis/technical-research.md +54 -93
- package/src/bmad-plus/packs/pack-dev-studio/categories/architecture/architect-agent.md +32 -60
- package/src/bmad-plus/packs/pack-dev-studio/categories/architecture/create-architecture.md +67 -71
- package/src/bmad-plus/packs/pack-dev-studio/categories/architecture/create-epics-stories.md +61 -90
- package/src/bmad-plus/packs/pack-dev-studio/categories/architecture/generate-project-context.md +56 -78
- package/src/bmad-plus/packs/pack-dev-studio/categories/architecture/implementation-readiness.md +55 -88
- package/src/bmad-plus/packs/pack-dev-studio/categories/architecture/steps/step-01-init.md +20 -153
- package/src/bmad-plus/packs/pack-dev-studio/categories/architecture/steps/step-01b-continue.md +20 -173
- package/src/bmad-plus/packs/pack-dev-studio/categories/architecture/steps/step-02-context.md +14 -220
- package/src/bmad-plus/packs/pack-dev-studio/categories/architecture/steps/step-03-starter.md +20 -329
- package/src/bmad-plus/packs/pack-dev-studio/categories/architecture/steps/step-04-decisions.md +15 -314
- package/src/bmad-plus/packs/pack-dev-studio/categories/architecture/steps/step-05-patterns.md +15 -355
- package/src/bmad-plus/packs/pack-dev-studio/categories/architecture/steps/step-06-structure.md +15 -375
- package/src/bmad-plus/packs/pack-dev-studio/categories/architecture/steps/step-07-validation.md +14 -357
- package/src/bmad-plus/packs/pack-dev-studio/categories/architecture/steps/step-08-complete.md +13 -78
- package/src/bmad-plus/packs/pack-dev-studio/categories/implementation/checkpoint-preview.md +52 -65
- package/src/bmad-plus/packs/pack-dev-studio/categories/implementation/code-review-steps/step-01-gather-context.md +14 -81
- package/src/bmad-plus/packs/pack-dev-studio/categories/implementation/code-review-steps/step-02-review.md +14 -31
- package/src/bmad-plus/packs/pack-dev-studio/categories/implementation/code-review-steps/step-03-triage.md +14 -45
- package/src/bmad-plus/packs/pack-dev-studio/categories/implementation/code-review-steps/step-04-present.md +13 -128
- package/src/bmad-plus/packs/pack-dev-studio/categories/implementation/code-review.md +61 -87
- package/src/bmad-plus/packs/pack-dev-studio/categories/implementation/correct-course.md +55 -298
- package/src/bmad-plus/packs/pack-dev-studio/categories/implementation/create-story.md +52 -426
- package/src/bmad-plus/packs/pack-dev-studio/categories/implementation/dev-agent.md +48 -69
- package/src/bmad-plus/packs/pack-dev-studio/categories/implementation/dev-story-checklist.md +22 -80
- package/src/bmad-plus/packs/pack-dev-studio/categories/implementation/dev-story.md +60 -482
- package/src/bmad-plus/packs/pack-dev-studio/categories/implementation/investigate.md +50 -184
- package/src/bmad-plus/packs/pack-dev-studio/categories/implementation/qa-e2e-tests.md +57 -173
- package/src/bmad-plus/packs/pack-dev-studio/categories/implementation/quick-dev.md +56 -108
- package/src/bmad-plus/packs/pack-dev-studio/categories/implementation/retrospective.md +54 -1509
- package/src/bmad-plus/packs/pack-dev-studio/categories/implementation/sprint-planning.md +54 -296
- package/src/bmad-plus/packs/pack-dev-studio/categories/implementation/sprint-status.md +41 -283
- package/src/bmad-plus/packs/pack-dev-studio/categories/planning/create-prd.md +58 -18
- package/src/bmad-plus/packs/pack-dev-studio/categories/planning/create-ux-design.md +103 -72
- package/src/bmad-plus/packs/pack-dev-studio/categories/planning/edit-prd.md +55 -27
- package/src/bmad-plus/packs/pack-dev-studio/categories/planning/pm-agent.md +34 -60
- package/src/bmad-plus/packs/pack-dev-studio/categories/planning/prd.md +46 -87
- package/src/bmad-plus/packs/pack-dev-studio/categories/planning/steps/step-01-init.md +10 -0
- package/src/bmad-plus/packs/pack-dev-studio/categories/planning/ux-designer-agent.md +30 -60
- package/src/bmad-plus/packs/pack-dev-studio/categories/planning/validate-prd.md +57 -27
- package/src/bmad-plus/packs/pack-dev-studio/categories/utilities/advanced-elicitation.md +47 -138
- package/src/bmad-plus/packs/pack-dev-studio/categories/utilities/adversarial-review.md +48 -34
- package/src/bmad-plus/packs/pack-dev-studio/categories/utilities/bmad-help.md +51 -68
- package/src/bmad-plus/packs/pack-dev-studio/categories/utilities/brainstorming.md +46 -3
- package/src/bmad-plus/packs/pack-dev-studio/categories/utilities/customize.md +68 -109
- package/src/bmad-plus/packs/pack-dev-studio/categories/utilities/distillator.md +53 -174
- package/src/bmad-plus/packs/pack-dev-studio/categories/utilities/edge-case-hunter.md +39 -53
- package/src/bmad-plus/packs/pack-dev-studio/categories/utilities/editorial-review-prose.md +45 -83
- package/src/bmad-plus/packs/pack-dev-studio/categories/utilities/editorial-review-structure.md +45 -176
- package/src/bmad-plus/packs/pack-dev-studio/categories/utilities/index-docs.md +45 -63
- package/src/bmad-plus/packs/pack-dev-studio/categories/utilities/party-mode.md +53 -124
- package/src/bmad-plus/packs/pack-dev-studio/categories/utilities/shard-doc.md +44 -100
- package/src/bmad-plus/packs/pack-dev-studio/dev-studio-orchestrator.md +56 -116
- package/src/bmad-plus/packs/pack-dev-studio/shared/architecture-decision-template.md +49 -12
- package/src/bmad-plus/packs/pack-dev-studio/shared/bwml-spec.md +51 -328
- package/src/bmad-plus/packs/pack-dev-studio/shared/catalog.json +489 -0
- package/src/bmad-plus/packs/pack-dev-studio/shared/execution.md +69 -0
- package/src/bmad-plus/packs/pack-dev-studio/shared/module-help.csv +39 -32
- package/src/bmad-plus/packs/pack-dev-studio/upstream-sync.yaml +85 -14
- package/src/bmad-plus/packs/pack-memory/README.md +6 -0
- package/src/bmad-plus/packs/pack-memory/memory-orchestrator.md +12 -5
- package/src/bmad-plus/packs/pack-seo/SKILL.md +27 -1
- package/src/bmad-plus/packs/pack-seo/seo-chief.md +16 -1
- package/src/bmad-plus/packs/pack-seo/seo-judge.md +12 -0
- package/src/bmad-plus/packs/pack-seo/seo-scout.md +12 -0
- package/src/bmad-plus/skills/bmad-plus-autopilot/SKILL.md +3 -3
- package/src/bmad-plus/skills/bmad-plus-sync/SKILL.md +5 -3
- package/src/bmad-plus/skills/dev-studio/SKILL.md +19 -0
- package/tools/build/check-install-contract.js +165 -13
- package/tools/build/generate.js +213 -40
- package/tools/build/generated-adapters/.codex/AGENTS.md +1 -1
- package/tools/build/generated-adapters/.cursor/rules/bmad-plus.mdc +1 -1
- package/tools/build/generated-adapters/.opencode/AGENTS.md +1 -1
- package/tools/build/generated-adapters/AGENTS.md +1 -1
- package/tools/build/generated-adapters/CLAUDE.md +1 -1
- package/tools/build/generated-adapters/CONVENTIONS.md +1 -1
- package/tools/build/generated-adapters/GEMINI.md +1 -1
- package/tools/build/pack-delivery.js +78 -0
- package/tools/cli/bmad-plus-cli.js +1 -1
- package/tools/cli/commands/doctor.js +49 -189
- package/tools/cli/commands/install.js +1 -1
- package/tools/cli/commands/studio.js +68 -0
- package/tools/cli/lib/installation-health.js +360 -0
- package/tools/cli/lib/packs.js +118 -9
- package/tools/cli/lib/python-health.js +233 -0
- package/tools/cli/lib/python-provision.js +2 -2
- package/tools/cli/lib/studio.js +310 -0
- package/tools/release/publication-content.js +901 -0
|
@@ -1,15 +1,41 @@
|
|
|
1
|
-
#
|
|
2
|
-
#
|
|
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:
|
|
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
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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
|
|
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
|
-
|
|
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):
|
|
54
|
-
- **notify_only** (🟡 INFO):
|
|
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**:
|
|
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
|
-
└─
|
|
51
|
-
└─ WhatsApp (Evolution API) or
|
|
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
|
-
|
|
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(
|
|
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(
|
|
101
|
-
|
|
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
|
|
104
|
-
|
|
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
|
|
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 !==
|
|
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
|
-
|
|
225
|
-
|
|
298
|
+
const expectedExitCode = 0;
|
|
299
|
+
const diagnosis = run(
|
|
300
|
+
process.execPath,
|
|
301
|
+
[
|
|
226
302
|
path.join(packageRoot, 'tools', 'cli', 'bmad-plus-cli.js'),
|
|
227
|
-
'
|
|
228
|
-
|
|
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(
|
|
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 {
|