From 6b21cf632c79fce00ddf7f611b4f4c8f21f10c32 Mon Sep 17 00:00:00 2001 From: Brian Madison Date: Sun, 15 Mar 2026 16:40:20 -0500 Subject: [PATCH 1/6] refactor: flatten skill folder structure to align with Agent Skills spec - Move prompts/ and agents/ files to skill root (both builders) - Rename templates/ to assets/ (both builders) - Rename resources/ to references/ to match agentskills.io spec - Remove unused tests/fixtures directories and skip guards - Update all path references across SKILL.md, build-process, quality-optimizer, quality scanners, reference docs, templates, and Python scripts - Add clear "what goes where" guidance table for root vs references vs assets vs scripts - Builders now produce output skills following the same conventions Co-Authored-By: Claude Opus 4.6 (1M context) --- src/module.yaml | 6 + src/skills/bmad-agent-builder/SKILL.md | 8 +- .../{templates => assets}/SKILL-template.md | 10 +- .../{templates => assets}/autonomous-wake.md | 0 .../{templates => assets}/init-template.md | 0 .../{templates => assets}/memory-system.md | 2 +- .../{templates => assets}/save-memory.md | 0 .../bmad-agent-builder/bmad-manifest.json | 4 +- .../{prompts => }/build-process.md | 56 +++--- .../{prompts => }/quality-optimizer.md | 16 +- .../quality-scan-agent-cohesion.md | 6 +- .../quality-scan-enhancement-opportunities.md | 8 +- .../quality-scan-execution-efficiency.md | 6 +- .../{agents => }/quality-scan-prompt-craft.md | 16 +- .../quality-scan-script-opportunities.md | 6 +- .../{agents => }/quality-scan-structure.md | 2 +- .../metadata-reference.md | 10 +- .../quality-dimensions.md | 11 +- .../script-opportunities-reference.md | 6 +- .../skill-best-practices.md | 2 +- .../standard-fields.md | 0 .../template-substitution-rules.md | 6 +- .../report-quality-scan-creator.md | 0 .../scripts/bmad-manifest-schema.json | 2 +- .../scripts/prepass-execution-deps.py | 4 +- .../scripts/prepass-prompt-metrics.py | 27 ++- .../scripts/prepass-structure-capabilities.py | 30 +-- .../scripts/scan-path-standards.py | 3 - .../fixtures/complex/old-format-pm-agent.md | 72 ------- .../deficient/bmad-agent-with-issues.md | 40 ---- .../tests/test-validate-manifest.py | 182 ------------------ src/skills/bmad-workflow-builder/SKILL.md | 8 +- .../{templates => assets}/SKILL-template.md | 6 +- .../bmad-workflow-builder/bmad-manifest.json | 4 +- .../{prompts => }/build-process.md | 46 +++-- .../{prompts => }/quality-optimizer.md | 16 +- .../quality-scan-enhancement-opportunities.md | 8 +- .../quality-scan-execution-efficiency.md | 10 +- .../{agents => }/quality-scan-prompt-craft.md | 28 +-- .../quality-scan-script-opportunities.md | 6 +- .../quality-scan-skill-cohesion.md | 6 +- .../quality-scan-workflow-integrity.md | 18 +- .../classification-reference.md | 4 +- .../complex-workflow-patterns.md | 56 +++--- .../metadata-reference.md | 12 +- .../quality-dimensions.md | 8 +- .../script-opportunities-reference.md | 12 +- .../skill-best-practices.md | 2 +- .../standard-fields.md | 4 +- .../template-substitution-rules.md | 4 +- .../report-quality-scan-creator.md | 0 .../scripts/bmad-manifest-schema.json | 2 +- .../scripts/prepass-execution-deps.py | 27 ++- .../scripts/prepass-prompt-metrics.py | 14 +- .../scripts/prepass-workflow-integrity.py | 47 +++-- .../scripts/scan-path-standards.py | 3 - .../tests/fixtures/complex/SKILL.md | 34 ---- .../tests/fixtures/complex/bmad-manifest.json | 15 -- .../tests/fixtures/deficient/SKILL.md | 19 -- 59 files changed, 307 insertions(+), 653 deletions(-) rename src/skills/bmad-agent-builder/{templates => assets}/SKILL-template.md (87%) rename src/skills/bmad-agent-builder/{templates => assets}/autonomous-wake.md (100%) rename src/skills/bmad-agent-builder/{templates => assets}/init-template.md (100%) rename src/skills/bmad-agent-builder/{templates => assets}/memory-system.md (98%) rename src/skills/bmad-agent-builder/{templates => assets}/save-memory.md (100%) rename src/skills/bmad-agent-builder/{prompts => }/build-process.md (77%) rename src/skills/bmad-agent-builder/{prompts => }/quality-optimizer.md (87%) rename src/skills/bmad-agent-builder/{agents => }/quality-scan-agent-cohesion.md (98%) rename src/skills/bmad-agent-builder/{agents => }/quality-scan-enhancement-opportunities.md (98%) rename src/skills/bmad-agent-builder/{agents => }/quality-scan-execution-efficiency.md (97%) rename src/skills/bmad-agent-builder/{agents => }/quality-scan-prompt-craft.md (95%) rename src/skills/bmad-agent-builder/{agents => }/quality-scan-script-opportunities.md (98%) rename src/skills/bmad-agent-builder/{agents => }/quality-scan-structure.md (99%) rename src/skills/bmad-agent-builder/{resources => references}/metadata-reference.md (92%) rename src/skills/bmad-agent-builder/{resources => references}/quality-dimensions.md (84%) rename src/skills/bmad-agent-builder/{resources => references}/script-opportunities-reference.md (98%) rename src/skills/bmad-agent-builder/{resources => references}/skill-best-practices.md (98%) rename src/skills/bmad-agent-builder/{resources => references}/standard-fields.md (100%) rename src/skills/bmad-agent-builder/{resources => references}/template-substitution-rules.md (94%) rename src/skills/bmad-agent-builder/{agents => }/report-quality-scan-creator.md (100%) delete mode 100644 src/skills/bmad-agent-builder/tests/fixtures/complex/old-format-pm-agent.md delete mode 100644 src/skills/bmad-agent-builder/tests/fixtures/deficient/bmad-agent-with-issues.md delete mode 100755 src/skills/bmad-agent-builder/tests/test-validate-manifest.py rename src/skills/bmad-workflow-builder/{templates => assets}/SKILL-template.md (93%) rename src/skills/bmad-workflow-builder/{prompts => }/build-process.md (79%) rename src/skills/bmad-workflow-builder/{prompts => }/quality-optimizer.md (86%) rename src/skills/bmad-workflow-builder/{agents => }/quality-scan-enhancement-opportunities.md (98%) rename src/skills/bmad-workflow-builder/{agents => }/quality-scan-execution-efficiency.md (98%) rename src/skills/bmad-workflow-builder/{agents => }/quality-scan-prompt-craft.md (93%) rename src/skills/bmad-workflow-builder/{agents => }/quality-scan-script-opportunities.md (98%) rename src/skills/bmad-workflow-builder/{agents => }/quality-scan-skill-cohesion.md (98%) rename src/skills/bmad-workflow-builder/{agents => }/quality-scan-workflow-integrity.md (94%) rename src/skills/bmad-workflow-builder/{resources => references}/classification-reference.md (85%) rename src/skills/bmad-workflow-builder/{resources => references}/complex-workflow-patterns.md (90%) rename src/skills/bmad-workflow-builder/{resources => references}/metadata-reference.md (90%) rename src/skills/bmad-workflow-builder/{resources => references}/quality-dimensions.md (88%) rename src/skills/bmad-workflow-builder/{resources => references}/script-opportunities-reference.md (97%) rename src/skills/bmad-workflow-builder/{resources => references}/skill-best-practices.md (98%) rename src/skills/bmad-workflow-builder/{resources => references}/standard-fields.md (99%) rename src/skills/bmad-workflow-builder/{resources => references}/template-substitution-rules.md (95%) rename src/skills/bmad-workflow-builder/{agents => }/report-quality-scan-creator.md (100%) delete mode 100644 src/skills/bmad-workflow-builder/tests/fixtures/complex/SKILL.md delete mode 100644 src/skills/bmad-workflow-builder/tests/fixtures/complex/bmad-manifest.json delete mode 100644 src/skills/bmad-workflow-builder/tests/fixtures/deficient/SKILL.md diff --git a/src/module.yaml b/src/module.yaml index ed38ac4..4003333 100644 --- a/src/module.yaml +++ b/src/module.yaml @@ -3,6 +3,12 @@ name: "BMad Builder" description: "Standard Skill Compliant Factory for BMad Agents, Workflows and Modules" default_selected: false +# Variables from Core Config inserted: +## user_name +## communication_language +## document_output_language +## output_folder + bmad_builder_output_folder: prompt: "Where should your custom skills (agents and workflows) be saved?" default: "_bmad-output/skills" diff --git a/src/skills/bmad-agent-builder/SKILL.md b/src/skills/bmad-agent-builder/SKILL.md index d840ec5..177ca7f 100644 --- a/src/skills/bmad-agent-builder/SKILL.md +++ b/src/skills/bmad-agent-builder/SKILL.md @@ -40,7 +40,7 @@ This is the core creative path — where agent ideas become reality. Through six Agents are named personas with optional memory, capabilities, autonomous modes, and personality. The build process includes a lint gate for structural validation. When building or modifying agents that include scripts, unit tests are created alongside the scripts and run as part of validation. -Load `prompts/build-process.md` to begin. +Load `build-process.md` to begin. ## Quality Optimizer @@ -48,7 +48,7 @@ For agents that already work but could work *better*. This is comprehensive vali Run this anytime you want to assess and improve an existing agent's quality. -Load `prompts/quality-optimizer.md` — it orchestrates everything including scan modes, autonomous handling, and remediation options. +Load `quality-optimizer.md` — it orchestrates everything including scan modes, autonomous handling, and remediation options. --- @@ -56,8 +56,8 @@ Load `prompts/quality-optimizer.md` — it orchestrates everything including sca | Intent | Trigger Phrases | Route | |--------|----------------|-------| -| **Builder** | "build/create/design/convert/edit/fix an agent", "new agent" | Load `prompts/build-process.md` | -| **Quality Optimizer** | "quality check", "validate", "review/optimize/improve agent" | Load `prompts/quality-optimizer.md` | +| **Builder** | "build/create/design/convert/edit/fix an agent", "new agent" | Load `build-process.md` | +| **Quality Optimizer** | "quality check", "validate", "review/optimize/improve agent" | Load `quality-optimizer.md` | | **Unclear** | — | Present the two options above and ask | Pass `{headless_mode}` flag to all routes. Use Todo List to track progress through multi-step flows. Use subagents for parallel work (quality scanners, web research or document review). diff --git a/src/skills/bmad-agent-builder/templates/SKILL-template.md b/src/skills/bmad-agent-builder/assets/SKILL-template.md similarity index 87% rename from src/skills/bmad-agent-builder/templates/SKILL-template.md rename to src/skills/bmad-agent-builder/assets/SKILL-template.md index 9314e07..6bdec78 100644 --- a/src/skills/bmad-agent-builder/templates/SKILL-template.md +++ b/src/skills/bmad-agent-builder/assets/SKILL-template.md @@ -18,7 +18,7 @@ description: {skill-description} # Format: [4-6 word summary]. [trigger: "User w - Look for `--headless` in the activation context - If `--headless:{task-name}` → run that specific autonomous task - If just `--headless` → run default autonomous wake behavior - - Load and execute `prompts/headless-wake.md` with task context + - Load and execute `headless-wake.md` with task context - Do NOT load config, do NOT greet user, do NOT show menu - Execute task, write results, exit silently @@ -50,7 +50,7 @@ description: {skill-description} # Format: [4-6 word summary]. [trigger: "User w ## Sidecar Memory location: `_bmad/_memory/{skillName}-sidecar/` -Load `resources/memory-system.md` for memory discipline and structure. +Load `references/memory-system.md` for memory discipline and structure. {/if-sidecar} ## On Activation @@ -61,14 +61,14 @@ Load `resources/memory-system.md` for memory discipline and structure. - Store any other config variables as `{var-name}` and use appropriately {if-autonomous} -2. **If autonomous mode** — Load and run `prompts/autonomous-wake.md` (default wake behavior), or load the specified prompt and execute its autonomous section without interaction +2. **If autonomous mode** — Load and run `autonomous-wake.md` (default wake behavior), or load the specified prompt and execute its autonomous section without interaction 3. **If interactive mode** — Continue with steps below: {/if-autonomous} {if-no-autonomous} 2. **Continue with steps below:** {/if-no-autonomous} - {if-sidecar}- **Check first-run** — If no `{skillName}-sidecar/` folder exists in `_bmad/_memory/`, load `prompts/init.md` for first-run setup + {if-sidecar}- **Check first-run** — If no `{skillName}-sidecar/` folder exists in `_bmad/_memory/`, load `init.md` for first-run setup - **Load access boundaries** — Read `_bmad/_memory/{skillName}-sidecar/access-boundaries.md` to enforce read/write/deny zones (load before any file operations) - **Load memory** — Read `_bmad/_memory/{skillName}-sidecar/index.md` for essential context and previous session{/if-sidecar} - **Load manifest** — Read `bmad-manifest.json` to set `{capabilities}` list of actions the agent can perform (internal prompts and available skills) @@ -93,5 +93,5 @@ Load `resources/memory-system.md` for memory discipline and structure. - DO NOT hardcode menu examples — generate from actual manifest data **CRITICAL Handling:** When user selects a code/number, consult the bmad-manifest.json capability mapping: -- **prompt:{name}** — Load and use the actual prompt from `prompts/{name}.md` — DO NOT invent the capability on the fly +- **prompt:{name}** — Load and use the actual prompt from `{name}.md` — DO NOT invent the capability on the fly - **skill:{name}** — Invoke the skill by its exact registered name diff --git a/src/skills/bmad-agent-builder/templates/autonomous-wake.md b/src/skills/bmad-agent-builder/assets/autonomous-wake.md similarity index 100% rename from src/skills/bmad-agent-builder/templates/autonomous-wake.md rename to src/skills/bmad-agent-builder/assets/autonomous-wake.md diff --git a/src/skills/bmad-agent-builder/templates/init-template.md b/src/skills/bmad-agent-builder/assets/init-template.md similarity index 100% rename from src/skills/bmad-agent-builder/templates/init-template.md rename to src/skills/bmad-agent-builder/assets/init-template.md diff --git a/src/skills/bmad-agent-builder/templates/memory-system.md b/src/skills/bmad-agent-builder/assets/memory-system.md similarity index 98% rename from src/skills/bmad-agent-builder/templates/memory-system.md rename to src/skills/bmad-agent-builder/assets/memory-system.md index 1301c5b..8c3946c 100644 --- a/src/skills/bmad-agent-builder/templates/memory-system.md +++ b/src/skills/bmad-agent-builder/assets/memory-system.md @@ -126,4 +126,4 @@ Regularly (every few sessions or when files grow large): ## First Run -If sidecar doesn't exist, load `prompts/init.md` to create the structure. +If sidecar doesn't exist, load `init.md` to create the structure. diff --git a/src/skills/bmad-agent-builder/templates/save-memory.md b/src/skills/bmad-agent-builder/assets/save-memory.md similarity index 100% rename from src/skills/bmad-agent-builder/templates/save-memory.md rename to src/skills/bmad-agent-builder/assets/save-memory.md diff --git a/src/skills/bmad-agent-builder/bmad-manifest.json b/src/skills/bmad-agent-builder/bmad-manifest.json index eaa12bd..d9a6ace 100644 --- a/src/skills/bmad-agent-builder/bmad-manifest.json +++ b/src/skills/bmad-agent-builder/bmad-manifest.json @@ -7,7 +7,7 @@ "menu-code": "BP", "description": "Build, edit, or convert agents through six-phase conversational discovery. Covers new agents, format conversion, edits, and fixes.", "supports-headless": true, - "prompt": "prompts/build-process.md", + "prompt": "build-process.md", "phase-name": "anytime", "output-location": "{bmad_builder_output_folder}" }, @@ -16,7 +16,7 @@ "menu-code": "QO", "description": "Comprehensive validation and optimization using lint scripts and LLM scanner subagents. Structure, prompt craft, efficiency, and more.", "supports-headless": true, - "prompt": "prompts/quality-optimizer.md", + "prompt": "quality-optimizer.md", "phase-name": "anytime", "output-location": "{bmad_builder_reports}" } diff --git a/src/skills/bmad-agent-builder/prompts/build-process.md b/src/skills/bmad-agent-builder/build-process.md similarity index 77% rename from src/skills/bmad-agent-builder/prompts/build-process.md rename to src/skills/bmad-agent-builder/build-process.md index 07ad158..4eb52cf 100644 --- a/src/skills/bmad-agent-builder/prompts/build-process.md +++ b/src/skills/bmad-agent-builder/build-process.md @@ -65,7 +65,7 @@ Work through these conversationally: - **Checkpoint data** (save periodically): What can be batched and saved occasionally? - **Save triggers:** After which interactions should memory be updated? - **Capabilities:** - - **Internal prompts:** Capabilities the agent knows itself (each will get a prompt file in `prompts/`) + - **Internal prompts:** Capabilities the agent knows itself (each will get its own prompt file) - **External skills:** Skills the agent invokes (ask for **exact registered skill names** — e.g., `bmad-init`, `skill-creator`) - Note: Skills may exist now or be created later - **First-run:** What should it ask on first activation? (standalone only; module-based gets config from module's config.yaml) @@ -87,7 +87,7 @@ Work through these conversationally: - **Path Conventions** (CRITICAL for reliable agent behavior): - **Memory location:** `{project-root}/_bmad/_memory/{skillName}-sidecar/` - **Project artifacts:** `{project-root}/_bmad/...` when referencing project-level files - - **Skill-internal files:** Use relative paths (`resources/`, `prompts/`, `scripts/`) + - **Skill-internal files:** Use relative paths (`references/`, `scripts/`) - **Config variables:** Use directly — they already contain full paths (NO `{project-root}` prefix) - Correct: `{output_folder}/file.md` - Wrong: `{project-root}/{output_folder}/file.md` (double-prefix breaks resolution) @@ -100,19 +100,19 @@ Once you have a cohesive idea, think one level deeper. Once you have done this, ## Phase 5: Build **Always load these before building:** -- Load `resources/standard-fields.md` — field definitions, description format, path rules -- Load `resources/skill-best-practices.md` — authoring patterns (freedom levels, templates, anti-patterns) -- Load `resources/quality-dimensions.md` — quick mental checklist for build quality +- Load `references/standard-fields.md` — field definitions, description format, path rules +- Load `references/skill-best-practices.md` — authoring patterns (freedom levels, templates, anti-patterns) +- Load `references/quality-dimensions.md` — quick mental checklist for build quality **Load based on context:** -- **If module-based:** Load `resources/metadata-reference.md` — manifest.json field definitions, module metadata structure, config loading requirements -- **Always load** `resources/script-opportunities-reference.md` — script opportunity spotting guide, catalog, and output standards. Use this to identify additional script opportunities not caught in Phase 2, even if no scripts were initially planned. +- **If module-based:** Load `references/metadata-reference.md` — manifest.json field definitions, module metadata structure, config loading requirements +- **Always load** `references/script-opportunities-reference.md` — script opportunity spotting guide, catalog, and output standards. Use this to identify additional script opportunities not caught in Phase 2, even if no scripts were initially planned. When confirmed: -1. Load template substitution rules from `resources/template-substitution-rules.md` and apply +1. Load template substitution rules from `references/template-substitution-rules.md` and apply -2. Create skill structure using templates from `templates/` folder: +2. Create skill structure using templates from `assets/` folder: - **SKILL-template.md** — skill wrapper with full persona content embedded - **init-template.md** — first-run setup (if sidecar) - **memory-system.md** — memory (if sidecar, saved at root level) @@ -132,7 +132,7 @@ When confirmed: python3 scripts/manifest.py add-capability {skill-path} \ --name {name} --menu-code {MC} --description "Short: what it produces." \ --supports-autonomous \ - --prompt prompts/{name}.md # internal capability + --prompt {name}.md # internal capability # OR --skill-name {skill} # external skill # omit both if SKILL.md handles it directly @@ -150,22 +150,32 @@ When confirmed: --is-required ``` -4. **Folder structure** (no `assets/` folder — everything at root): +4. **Folder structure:** ``` {skill-name}/ -├── SKILL.md # Contains full persona content (agent.md embedded) -├── bmad-manifest.json # Capabilities, persona, memory, module integration -├── resources/ -│ └── memory-system.md # (if sidecar needed) -├── scripts/ # python or shell scripts needed for the agent -│ └── run-tests.sh # uvx-powered test runner (if python tests exist) -└── prompts/ # Internal capability prompts - ├── init.md # First-run setup - ├── autonomous-wake.md # Autonomous activation (if autonomous mode) - ├── save-memory.md # Explicit memory save (if sidecar) - └── {name}.md # Each internal capability prompt +├── SKILL.md # Contains full persona content (agent.md embedded) +├── bmad-manifest.json # Capabilities, persona, memory, module integration +├── init.md # First-run setup (if sidecar) +├── autonomous-wake.md # Autonomous activation (if autonomous mode) +├── save-memory.md # Explicit memory save (if sidecar) +├── {name}.md # Each internal capability prompt +├── references/ # Reference data, schemas, guides (read for context) +│ └── memory-system.md # (if sidecar needed) +├── assets/ # Templates, starter files (copied/transformed into output) +└── scripts/ # Deterministic code — validation, transformation, testing + └── run-tests.sh # uvx-powered test runner (if python tests exist) ``` +**What goes where:** +| Location | Contains | LLM relationship | +|----------|----------|-----------------| +| **Root `.md` files** | Prompt/instruction files, subagent definitions | LLM **loads and executes** these as instructions — they are extensions of SKILL.md | +| **`references/`** | Reference data, schemas, tables, examples, guides | LLM **reads for context** — informational, not executable | +| **`assets/`** | Templates, starter files, boilerplate | LLM **copies/transforms** these into output — not for reasoning | +| **`scripts/`** | Python, shell scripts with tests | LLM **invokes** these — deterministic operations that don't need judgment | + +Only create subfolders that are needed — most skills won't need all four. + 5. Output to `bmad_builder_output_folder` from config, or `{project-root}/bmad-builder-creations/` 6. **Lint gate** — run deterministic validation scripts: @@ -184,6 +194,6 @@ Present what was built: location, structure, first-run behavior, capabilities. A Ask: *"Build is done. Would you like to run a Quality Scan to optimize the agent further?"* -If yes, load `prompts/quality-optimizer.md` with `{scan_mode}=full` and the agent path. +If yes, load `quality-optimizer.md` with `{scan_mode}=full` and the agent path. Remind them: BMad module system compliant. Use `bmad-init` skill to integrate into a project. diff --git a/src/skills/bmad-agent-builder/prompts/quality-optimizer.md b/src/skills/bmad-agent-builder/quality-optimizer.md similarity index 87% rename from src/skills/bmad-agent-builder/prompts/quality-optimizer.md rename to src/skills/bmad-agent-builder/quality-optimizer.md index 28a7cfe..3573b21 100644 --- a/src/skills/bmad-agent-builder/prompts/quality-optimizer.md +++ b/src/skills/bmad-agent-builder/quality-optimizer.md @@ -92,12 +92,12 @@ These extract metrics for the LLM scanners so they work from compact data instea | # | Scanner | Focus | Pre-Pass? | Temp Filename | |---|---------|-------|-----------|---------------| -| L1 | `agents/quality-scan-structure.md` | Structure, capabilities, identity, memory setup, consistency | Yes — receives prepass JSON | `structure-temp.json` | -| L2 | `agents/quality-scan-prompt-craft.md` | Token efficiency, anti-patterns, outcome balance, persona voice, Overview quality | Yes — receives metrics JSON | `prompt-craft-temp.json` | -| L3 | `agents/quality-scan-execution-efficiency.md` | Parallelization, subagent delegation, memory loading, context optimization | Yes — receives dep graph JSON | `execution-efficiency-temp.json` | -| L4 | `agents/quality-scan-agent-cohesion.md` | Persona-capability alignment, gaps, redundancies, coherence | No | `agent-cohesion-temp.json` | -| L5 | `agents/quality-scan-enhancement-opportunities.md` | Script automation, autonomous potential, edge cases, experience gaps, delight | No | `enhancement-opportunities-temp.json` | -| L6 | `agents/quality-scan-script-opportunities.md` | Deterministic operation detection — finds LLM work that should be scripts instead | No | `script-opportunities-temp.json` | +| L1 | `quality-scan-structure.md` | Structure, capabilities, identity, memory setup, consistency | Yes — receives prepass JSON | `structure-temp.json` | +| L2 | `quality-scan-prompt-craft.md` | Token efficiency, anti-patterns, outcome balance, persona voice, Overview quality | Yes — receives metrics JSON | `prompt-craft-temp.json` | +| L3 | `quality-scan-execution-efficiency.md` | Parallelization, subagent delegation, memory loading, context optimization | Yes — receives dep graph JSON | `execution-efficiency-temp.json` | +| L4 | `quality-scan-agent-cohesion.md` | Persona-capability alignment, gaps, redundancies, coherence | No | `agent-cohesion-temp.json` | +| L5 | `quality-scan-enhancement-opportunities.md` | Script automation, autonomous potential, edge cases, experience gaps, delight | No | `enhancement-opportunities-temp.json` | +| L6 | `quality-scan-script-opportunities.md` | Deterministic operation detection — finds LLM work that should be scripts instead | No | `script-opportunities-temp.json` | ## Execution Instructions @@ -125,7 +125,7 @@ After scripts complete, spawn applicable LLM scanners as parallel subagents. **For scanners WITHOUT pre-pass (L4, L5, L6):** provide just the skill path and output directory. Each subagent receives: -- Scanner file to load (e.g., `agents/quality-scan-agent-cohesion.md`) +- Scanner file to load (e.g., `quality-scan-agent-cohesion.md`) - Skill path to scan: `{skill-path}` - Output directory for results: `{quality-report-dir}` - Temp filename for output: `{temp-filename}` @@ -151,7 +151,7 @@ After all scripts and scanners complete: 3. Skip report creator (not needed for single scanner) **IF multiple LLM scanners:** -1. Initiate a subagent with `agents/report-quality-scan-creator.md` +1. Initiate a subagent with `report-quality-scan-creator.md` **Provide the subagent with:** - `{skill-path}` — The agent being validated diff --git a/src/skills/bmad-agent-builder/agents/quality-scan-agent-cohesion.md b/src/skills/bmad-agent-builder/quality-scan-agent-cohesion.md similarity index 98% rename from src/skills/bmad-agent-builder/agents/quality-scan-agent-cohesion.md rename to src/skills/bmad-agent-builder/quality-scan-agent-cohesion.md index 440ef71..ad1ba9e 100644 --- a/src/skills/bmad-agent-builder/agents/quality-scan-agent-cohesion.md +++ b/src/skills/bmad-agent-builder/quality-scan-agent-cohesion.md @@ -22,8 +22,8 @@ This is an **opinionated, advisory scan**. Findings are suggestions, not errors. Find and read: - `SKILL.md` — Identity, persona, principles, description - `bmad-manifest.json` — All capabilities with menu codes and descriptions -- `prompts/*.md` — What each prompt actually does -- `resources/dimension-definitions.md` — If exists, context for capability design +- `*.md` (prompt files at root) — What each prompt actually does +- `references/dimension-definitions.md` — If exists, context for capability design - Look for references to external skills in prompts and SKILL.md ## Cohesion Dimensions @@ -159,7 +159,7 @@ Write JSON findings to: `{quality-report-dir}/agent-cohesion-temp.json` }, "findings": [ { - "file": "SKILL.md|bmad-manifest.json|prompts/{name}.md", + "file": "SKILL.md|bmad-manifest.json|{name}.md", "severity": "high|medium|low|suggestion", "category": "gap|redundancy|misalignment|opportunity|strength", "issue": "Brief description", diff --git a/src/skills/bmad-agent-builder/agents/quality-scan-enhancement-opportunities.md b/src/skills/bmad-agent-builder/quality-scan-enhancement-opportunities.md similarity index 98% rename from src/skills/bmad-agent-builder/agents/quality-scan-enhancement-opportunities.md rename to src/skills/bmad-agent-builder/quality-scan-enhancement-opportunities.md index a9e179b..8073a20 100644 --- a/src/skills/bmad-agent-builder/agents/quality-scan-enhancement-opportunities.md +++ b/src/skills/bmad-agent-builder/quality-scan-enhancement-opportunities.md @@ -27,9 +27,9 @@ You are NOT checking structure, craft quality, performance, or test coverage — Find and read: - `SKILL.md` — Understand the agent's purpose, persona, audience, and flow -- `prompts/*.md` — Walk through each capability as a user would experience it -- `resources/*.md` — Understand what supporting material exists -- `resources/*.json` — See what supporting schemas exist +- `*.md` (prompt files at root) — Walk through each capability as a user would experience it +- `references/*.md` — Understand what supporting material exists +- `references/*.json` — See what supporting schemas exist ## Creative Analysis Lenses @@ -180,7 +180,7 @@ Write JSON findings to: `{quality-report-dir}/enhancement-opportunities-temp.jso }, "findings": [ { - "file": "SKILL.md|prompts/{name}.md", + "file": "SKILL.md|{name}.md", "severity": "high-opportunity|medium-opportunity|low-opportunity", "category": "edge-case|experience-gap|delight-opportunity|assumption-risk|journey-friction|autonomous-potential|facilitative-pattern", "scenario": "The specific situation or user story that reveals this opportunity", diff --git a/src/skills/bmad-agent-builder/agents/quality-scan-execution-efficiency.md b/src/skills/bmad-agent-builder/quality-scan-execution-efficiency.md similarity index 97% rename from src/skills/bmad-agent-builder/agents/quality-scan-execution-efficiency.md rename to src/skills/bmad-agent-builder/quality-scan-execution-efficiency.md index ba3e52e..924e7dd 100644 --- a/src/skills/bmad-agent-builder/agents/quality-scan-execution-efficiency.md +++ b/src/skills/bmad-agent-builder/quality-scan-execution-efficiency.md @@ -18,8 +18,8 @@ Pre-pass provides: dependency graph, sequential patterns, loop patterns, subagen Read raw files for judgment calls: - `SKILL.md` — On Activation patterns, operation flow -- `prompts/*.md` — Each prompt for execution patterns -- `resources/*.md` — Resource loading patterns +- `*.md` (prompt files at root) — Each prompt for execution patterns +- `references/*.md` — Resource loading patterns --- @@ -130,7 +130,7 @@ Write JSON findings to: `{quality-report-dir}/execution-efficiency-temp.json` "skill_path": "{path}", "issues": [ { - "file": "SKILL.md|prompts/{name}.md", + "file": "SKILL.md|{name}.md", "line": 42, "severity": "critical|high|medium|low", "category": "sequential-independent|parent-reads-first|missing-batch|no-output-spec|subagent-chain-violation|memory-loading|resource-loading|missing-delegation", diff --git a/src/skills/bmad-agent-builder/agents/quality-scan-prompt-craft.md b/src/skills/bmad-agent-builder/quality-scan-prompt-craft.md similarity index 95% rename from src/skills/bmad-agent-builder/agents/quality-scan-prompt-craft.md rename to src/skills/bmad-agent-builder/quality-scan-prompt-craft.md index 1e9aa45..04ce2cd 100644 --- a/src/skills/bmad-agent-builder/agents/quality-scan-prompt-craft.md +++ b/src/skills/bmad-agent-builder/quality-scan-prompt-craft.md @@ -20,8 +20,8 @@ Pre-pass provides: line counts, token estimates, section inventories, waste patt Read raw files for judgment calls: - `SKILL.md` — Overview quality, persona context assessment -- `prompts/*.md` — Each capability prompt for craft quality -- `resources/*.md` — Progressive disclosure assessment +- `*.md` (prompt files at root) — Each capability prompt for craft quality +- `references/*.md` — Progressive disclosure assessment --- @@ -54,9 +54,9 @@ A good agent Overview includes: | Scenario | Acceptable Size | Notes | |----------|----------------|-------| -| Multi-capability agent with brief capability sections | Up to ~250 lines | Each capability section brief, detail in prompts/ | +| Multi-capability agent with brief capability sections | Up to ~250 lines | Each capability section brief, detail in prompt files | | Single-purpose agent with deep persona | Up to ~500 lines (~5000 tokens) | Acceptable if content is genuinely needed | -| Agent with large reference tables or schemas inline | Flag for extraction | These belong in resources/, not SKILL.md | +| Agent with large reference tables or schemas inline | Flag for extraction | These belong in references/, not SKILL.md | ### Detecting Over-Optimization (Under-Contextualized Agents) @@ -72,7 +72,7 @@ A good agent Overview includes: ## Part 2: Capability Prompt Craft -Capability prompts (`prompts/*.md`) are the working instructions for each capability. These should be more procedural than SKILL.md but maintain persona voice consistency. +Capability prompts (prompt `.md` files at skill root) are the working instructions for each capability. These should be more procedural than SKILL.md but maintain persona voice consistency. ### Config Header | Check | Why It Matters | @@ -183,7 +183,7 @@ Write JSON findings to: `{quality-report-dir}/prompt-craft-temp.json` "prompts_scanned": 0, "issues": [ { - "file": "SKILL.md|prompts/{name}.md", + "file": "SKILL.md|{name}.md", "line": 42, "severity": "critical|high|medium|low|note", "category": "token-waste|anti-pattern|outcome-balance|progression|self-containment|intelligence-placement|overview-quality|progressive-disclosure|under-contextualized|persona-voice|communication-consistency|inline-data", @@ -212,8 +212,8 @@ Write JSON findings to: `{quality-report-dir}/prompt-craft-temp.json` 1. Read pre-pass JSON at `{quality-report-dir}/prompt-metrics-prepass.json` 2. Read SKILL.md — assess agent type, evaluate Overview quality, persona context -3. Read all prompt files in prompts/ -4. Check resources/ for progressive disclosure +3. Read all prompt files at skill root +4. Check references/ for progressive disclosure 5. Evaluate Overview quality (present? appropriate? excessive? missing?) 6. Check for over-optimization — is this a complex agent stripped to bare skeleton? 7. Check size and progressive disclosure diff --git a/src/skills/bmad-agent-builder/agents/quality-scan-script-opportunities.md b/src/skills/bmad-agent-builder/quality-scan-script-opportunities.md similarity index 98% rename from src/skills/bmad-agent-builder/agents/quality-scan-script-opportunities.md rename to src/skills/bmad-agent-builder/quality-scan-script-opportunities.md index 401c5d8..2a156f1 100644 --- a/src/skills/bmad-agent-builder/agents/quality-scan-script-opportunities.md +++ b/src/skills/bmad-agent-builder/quality-scan-script-opportunities.md @@ -16,8 +16,8 @@ Read every prompt file and SKILL.md. For each instruction that tells the LLM to Find and read: - `SKILL.md` — On Activation patterns, inline operations -- `prompts/*.md` — Each capability prompt for deterministic operations hiding in LLM instructions -- `resources/*.md` — Check if any resource content could be generated by scripts instead +- `*.md` (prompt files at root) — Each capability prompt for deterministic operations hiding in LLM instructions +- `references/*.md` — Check if any resource content could be generated by scripts instead - `scripts/` — Understand what scripts already exist (to avoid suggesting duplicates) --- @@ -199,7 +199,7 @@ Write JSON findings to: `{quality-report-dir}/script-opportunities-temp.json` "existing_scripts": ["list of scripts that already exist in the agent's scripts/ folder"], "findings": [ { - "file": "SKILL.md|prompts/{name}.md", + "file": "SKILL.md|{name}.md", "line": 42, "severity": "high|medium|low", "category": "validation|extraction|transformation|counting|comparison|structure|graph|preprocessing|postprocessing", diff --git a/src/skills/bmad-agent-builder/agents/quality-scan-structure.md b/src/skills/bmad-agent-builder/quality-scan-structure.md similarity index 99% rename from src/skills/bmad-agent-builder/agents/quality-scan-structure.md rename to src/skills/bmad-agent-builder/quality-scan-structure.md index 24fdc1f..aa6f017 100644 --- a/src/skills/bmad-agent-builder/agents/quality-scan-structure.md +++ b/src/skills/bmad-agent-builder/quality-scan-structure.md @@ -126,7 +126,7 @@ Write JSON findings to: `{quality-report-dir}/structure-temp.json` "skill_path": "{path}", "issues": [ { - "file": "SKILL.md|bmad-manifest.json|prompts/{name}.md", + "file": "SKILL.md|bmad-manifest.json|{name}.md", "line": 42, "severity": "critical|high|medium|low", "category": "frontmatter|sections|artifacts|manifest|capabilities|identity|communication-style|principles|consistency|memory-setup|headless-mode|activation-sequence", diff --git a/src/skills/bmad-agent-builder/resources/metadata-reference.md b/src/skills/bmad-agent-builder/references/metadata-reference.md similarity index 92% rename from src/skills/bmad-agent-builder/resources/metadata-reference.md rename to src/skills/bmad-agent-builder/references/metadata-reference.md index 73ba3df..96cb565 100644 --- a/src/skills/bmad-agent-builder/resources/metadata-reference.md +++ b/src/skills/bmad-agent-builder/references/metadata-reference.md @@ -36,7 +36,7 @@ description: [5-8 word summary]. [Use when user says 'X' or 'Y'.] "menu-code": "BP", "description": "Builds agents through conversational discovery. Outputs to skill folder.", "supports-headless": true, - "prompt": "prompts/build-process.md", + "prompt": "build-process.md", "phase-name": "anytime", "after": ["create-prd"], "before": [], @@ -112,15 +112,15 @@ Never use `{skill-root}`. Only use `{project-root}` for `_bmad` paths. **Correct:** ``` -resources/reference.md # Skill-internal (bare relative) -prompts/capability.md # Skill-internal (bare relative) +references/reference.md # Skill-internal (bare relative) +capability.md # Skill-internal (bare relative) {project-root}/_bmad/_memory/x-sidecar/ # Project _bmad path {output_folder}/report.md # Config var (already has full path) ``` **Never use:** ``` -{skill-root}/resources/reference.md # {skill-root} doesn't exist +{skill-root}/references/reference.md # {skill-root} doesn't exist {project-root}/{config_var}/output.md # Double-prefix -./resources/reference.md # Relative prefix breaks context changes +./references/reference.md # Relative prefix breaks context changes ``` diff --git a/src/skills/bmad-agent-builder/resources/quality-dimensions.md b/src/skills/bmad-agent-builder/references/quality-dimensions.md similarity index 84% rename from src/skills/bmad-agent-builder/resources/quality-dimensions.md rename to src/skills/bmad-agent-builder/references/quality-dimensions.md index f79b595..aeea223 100644 --- a/src/skills/bmad-agent-builder/resources/quality-dimensions.md +++ b/src/skills/bmad-agent-builder/references/quality-dimensions.md @@ -22,9 +22,10 @@ Scripts handle plumbing (fetch, transform, validate). Prompts handle judgment (i SKILL.md stays focused. Detail goes where it belongs. -- Capability instructions → `prompts/` -- Reference data, schemas, large tables → `resources/` -- Memory discipline → `resources/memory-system.md` +- Capability instructions → prompt files at skill root +- Reference data, schemas, large tables → `references/` +- Templates, starter files → `assets/` +- Memory discipline → `references/memory-system.md` - Multi-capability SKILL.md under ~250 lines: fine as-is - Single-purpose up to ~500 lines: acceptable if focused @@ -32,13 +33,13 @@ SKILL.md stays focused. Detail goes where it belongs. Two parts: `[5-8 word summary]. [Use when user says 'X' or 'Y'.]` -Default to conservative triggering. See `resources/standard-fields.md` for full format and examples. +Default to conservative triggering. See `references/standard-fields.md` for full format and examples. ## 5. Path Construction Never use `{skill-root}`. Only use `{project-root}` for `_bmad` paths. Config variables used directly — they already contain `{project-root}`. -See `resources/standard-fields.md` for correct/incorrect patterns. +See `references/standard-fields.md` for correct/incorrect patterns. ## 6. Token Efficiency diff --git a/src/skills/bmad-agent-builder/resources/script-opportunities-reference.md b/src/skills/bmad-agent-builder/references/script-opportunities-reference.md similarity index 98% rename from src/skills/bmad-agent-builder/resources/script-opportunities-reference.md rename to src/skills/bmad-agent-builder/references/script-opportunities-reference.md index d890f95..bf6a224 100644 --- a/src/skills/bmad-agent-builder/resources/script-opportunities-reference.md +++ b/src/skills/bmad-agent-builder/references/script-opportunities-reference.md @@ -1,6 +1,6 @@ # Quality Scan Script Opportunities — Reference Guide -**Reference: `resources/script-standards.md` for script creation guidelines.** +**Reference: `references/script-standards.md` for script creation guidelines.** This document identifies deterministic operations that should be offloaded from the LLM into scripts for quality validation of BMad agents. @@ -136,7 +136,7 @@ All scripts use PEP 723 and `--help`. When a skill's prompt needs to invoke a sc **Checks:** ```python -# For each prompt in prompts/: +# For each prompt .md file at skill root: - Has frontmatter (name, description, menu-code) - name matches manifest capability name - menu-code matches manifest (case-insensitive) @@ -145,7 +145,7 @@ All scripts use PEP 723 and `--help`. When a skill's prompt needs to invoke a sc **Output:** JSON with mismatches, missing files -**Implementation:** Python, reads bmad-manifest.json and all .md files in prompts/ +**Implementation:** Python, reads bmad-manifest.json and all prompt .md files at skill root --- diff --git a/src/skills/bmad-agent-builder/resources/skill-best-practices.md b/src/skills/bmad-agent-builder/references/skill-best-practices.md similarity index 98% rename from src/skills/bmad-agent-builder/resources/skill-best-practices.md rename to src/skills/bmad-agent-builder/references/skill-best-practices.md index 432a502..67cdeb3 100644 --- a/src/skills/bmad-agent-builder/resources/skill-best-practices.md +++ b/src/skills/bmad-agent-builder/references/skill-best-practices.md @@ -1,6 +1,6 @@ # Skill Authoring Best Practices -Practical patterns for writing effective BMad agent skills. For field definitions and description format, see `resources/standard-fields.md`. For quality dimensions, see `resources/quality-dimensions.md`. +Practical patterns for writing effective BMad agent skills. For field definitions and description format, see `references/standard-fields.md`. For quality dimensions, see `references/quality-dimensions.md`. ## Core Principle: Informed Autonomy diff --git a/src/skills/bmad-agent-builder/resources/standard-fields.md b/src/skills/bmad-agent-builder/references/standard-fields.md similarity index 100% rename from src/skills/bmad-agent-builder/resources/standard-fields.md rename to src/skills/bmad-agent-builder/references/standard-fields.md diff --git a/src/skills/bmad-agent-builder/resources/template-substitution-rules.md b/src/skills/bmad-agent-builder/references/template-substitution-rules.md similarity index 94% rename from src/skills/bmad-agent-builder/resources/template-substitution-rules.md rename to src/skills/bmad-agent-builder/references/template-substitution-rules.md index b0e4a87..b3bce15 100644 --- a/src/skills/bmad-agent-builder/resources/template-substitution-rules.md +++ b/src/skills/bmad-agent-builder/references/template-substitution-rules.md @@ -43,9 +43,9 @@ Add user's additional questions to the init.md template, replacing `{custom-init ## Path References All generated agents use these paths: -- `prompts/init.md` — First-run setup -- `prompts/{name}.md` — Individual capability prompts -- `resources/memory-system.md` — Memory discipline (if sidecar needed) +- `init.md` — First-run setup +- `{name}.md` — Individual capability prompts +- `references/memory-system.md` — Memory discipline (if sidecar needed) - `bmad-manifest.json` — Capabilities and metadata with menu codes - `scripts/` — Python/shell scripts for deterministic operations (if needed) diff --git a/src/skills/bmad-agent-builder/agents/report-quality-scan-creator.md b/src/skills/bmad-agent-builder/report-quality-scan-creator.md similarity index 100% rename from src/skills/bmad-agent-builder/agents/report-quality-scan-creator.md rename to src/skills/bmad-agent-builder/report-quality-scan-creator.md diff --git a/src/skills/bmad-agent-builder/scripts/bmad-manifest-schema.json b/src/skills/bmad-agent-builder/scripts/bmad-manifest-schema.json index 90e66db..ea674b5 100644 --- a/src/skills/bmad-agent-builder/scripts/bmad-manifest-schema.json +++ b/src/skills/bmad-agent-builder/scripts/bmad-manifest-schema.json @@ -61,7 +61,7 @@ }, "prompt": { - "description": "Relative path to the prompt file for internal capabilities (e.g., prompts/build-process.md). Omit if handled by SKILL.md directly or if this is an external skill call.", + "description": "Relative path to the prompt file for internal capabilities (e.g., build-process.md). Omit if handled by SKILL.md directly or if this is an external skill call.", "type": "string" }, "skill-name": { diff --git a/src/skills/bmad-agent-builder/scripts/prepass-execution-deps.py b/src/skills/bmad-agent-builder/scripts/prepass-execution-deps.py index f497631..d4b69ed 100644 --- a/src/skills/bmad-agent-builder/scripts/prepass-execution-deps.py +++ b/src/skills/bmad-agent-builder/scripts/prepass-execution-deps.py @@ -185,8 +185,8 @@ def scan_sequential_patterns(filepath: Path, rel_path: str) -> list[dict]: # Subagent spawning from subagent (impossible) if re.search(r'(?i)spawn.*subagent|launch.*subagent|create.*subagent', content): - # Check if this file IS a subagent (lives in agents/) - if '/agents/' in rel_path or rel_path.startswith('agents/'): + # Check if this file IS a subagent (quality-scan-* or report-* files at root) + if re.match(r'(?:quality-scan-|report-)', rel_path): patterns.append({ 'file': rel_path, 'type': 'subagent-chain-violation', diff --git a/src/skills/bmad-agent-builder/scripts/prepass-prompt-metrics.py b/src/skills/bmad-agent-builder/scripts/prepass-prompt-metrics.py index 56231e4..9c8da05 100644 --- a/src/skills/bmad-agent-builder/scripts/prepass-prompt-metrics.py +++ b/src/skills/bmad-agent-builder/scripts/prepass-prompt-metrics.py @@ -357,25 +357,24 @@ def scan_prompt_metrics(skill_path: Path) -> dict: data['is_skill_md'] = True files_data.append(data) - # Prompts — also extract frontmatter - prompts_dir = skill_path / 'prompts' + # Prompt files at skill root — also extract frontmatter prompt_frontmatters: dict[str, dict] = {} + skip_files = {'SKILL.md', 'bmad-manifest.json', 'bmad-skill-manifest.yaml'} - if prompts_dir.exists(): - for f in sorted(prompts_dir.iterdir()): - if f.is_file() and f.suffix == '.md': - data = scan_file_patterns(f, f'prompts/{f.name}') - data['is_skill_md'] = False + for f in sorted(skill_path.iterdir()): + if f.is_file() and f.suffix == '.md' and f.name not in skip_files and f.name != 'SKILL.md': + data = scan_file_patterns(f, f.name) + data['is_skill_md'] = False - # Parse prompt frontmatter - pfm = parse_prompt_frontmatter(f) - data['prompt_frontmatter'] = pfm + # Parse prompt frontmatter + pfm = parse_prompt_frontmatter(f) + data['prompt_frontmatter'] = pfm - # Use stem as key for manifest alignment - prompt_name = pfm.get('fields', {}).get('name', f.stem) - prompt_frontmatters[prompt_name] = pfm + # Use stem as key for manifest alignment + prompt_name = pfm.get('fields', {}).get('name', f.stem) + prompt_frontmatters[prompt_name] = pfm - files_data.append(data) + files_data.append(data) # Resources (just sizes, for progressive disclosure assessment) resources_dir = skill_path / 'resources' diff --git a/src/skills/bmad-agent-builder/scripts/prepass-structure-capabilities.py b/src/skills/bmad-agent-builder/scripts/prepass-structure-capabilities.py index 6675b3f..ceff64e 100644 --- a/src/skills/bmad-agent-builder/scripts/prepass-structure-capabilities.py +++ b/src/skills/bmad-agent-builder/scripts/prepass-structure-capabilities.py @@ -9,7 +9,7 @@ - Agent name validation (bmad-{code}-agent-{name} or bmad-agent-{name}) - Required agent sections (Overview, Identity, Communication Style, Principles, On Activation) - bmad-manifest.json validation (persona field for agent detection, capabilities) -- Capability cross-referencing with prompts/ +- Capability cross-referencing with prompt files at skill root - Memory path consistency checking - Language/directness pattern grep - On Exit / Exiting section detection (invalid) @@ -339,7 +339,6 @@ def cross_reference_capabilities(skill_path: Path) -> tuple[dict, list[dict]]: } manifest_path = skill_path / 'bmad-manifest.json' - prompts_dir = skill_path / 'prompts' if not manifest_path.exists(): return crossref, findings @@ -362,11 +361,11 @@ def cross_reference_capabilities(skill_path: Path) -> tuple[dict, list[dict]]: prompt_cap_names.add(name) crossref['manifest_prompt_caps'].append(name) - # Get actual prompt files + # Get actual prompt files (at skill root, excluding SKILL.md and non-prompt files) actual_prompts = set() - if prompts_dir.exists(): - for f in prompts_dir.iterdir(): - if f.is_file() and f.suffix == '.md': + skip_files = {'SKILL.md', 'bmad-manifest.json', 'bmad-skill-manifest.yaml'} + for f in skill_path.iterdir(): + if f.is_file() and f.suffix == '.md' and f.name not in skip_files: actual_prompts.add(f.stem) # Missing prompt files (in manifest but no file) @@ -376,7 +375,7 @@ def cross_reference_capabilities(skill_path: Path) -> tuple[dict, list[dict]]: findings.append({ 'file': 'bmad-manifest.json', 'line': 0, 'severity': 'high', 'category': 'capability-crossref', - 'issue': f'Prompt capability "{name}" has no matching file prompts/{name}.md', + 'issue': f'Prompt capability "{name}" has no matching file {name}.md at skill root', }) # Orphaned prompt files (file exists but not in manifest) @@ -384,9 +383,9 @@ def cross_reference_capabilities(skill_path: Path) -> tuple[dict, list[dict]]: for name in sorted(orphaned): crossref['orphaned_prompt_files'].append(name) findings.append({ - 'file': f'prompts/{name}.md', 'line': 0, + 'file': f'{name}.md', 'line': 0, 'severity': 'medium', 'category': 'capability-crossref', - 'issue': f'Prompt file prompts/{name}.md not referenced as a prompt capability in manifest', + 'issue': f'Prompt file {name}.md not referenced as a prompt capability in manifest', }) return crossref, findings @@ -450,15 +449,16 @@ def check_prompt_basics(skill_path: Path) -> tuple[list[dict], list[dict]]: """Check each prompt file for config header and progression conditions.""" findings = [] prompt_details = [] - prompts_dir = skill_path / 'prompts' - if not prompts_dir.exists(): + skip_files = {'SKILL.md', 'bmad-manifest.json', 'bmad-skill-manifest.yaml'} + + prompt_files = [f for f in sorted(skill_path.iterdir()) + if f.is_file() and f.suffix == '.md' and f.name not in skip_files] + if not prompt_files: return prompt_details, findings - for f in sorted(prompts_dir.iterdir()): - if not f.is_file() or f.suffix != '.md': - continue + for f in prompt_files: content = f.read_text(encoding='utf-8') - rel_path = f'prompts/{f.name}' + rel_path = f.name detail = {'file': f.name, 'has_config_header': False, 'has_progression': False} # Config header check diff --git a/src/skills/bmad-agent-builder/scripts/scan-path-standards.py b/src/skills/bmad-agent-builder/scripts/scan-path-standards.py index 42f72e6..e2acf0e 100644 --- a/src/skills/bmad-agent-builder/scripts/scan-path-standards.py +++ b/src/skills/bmad-agent-builder/scripts/scan-path-standards.py @@ -166,9 +166,6 @@ def scan_skill(skill_path: Path, skip_fenced: bool = True) -> dict: files_scanned = [] for md_file in md_files: - # Skip tests/fixtures - if 'tests/fixtures' in str(md_file): - continue rel = md_file.relative_to(skill_path) files_scanned.append(str(rel)) file_findings = scan_file(md_file, skip_fenced) diff --git a/src/skills/bmad-agent-builder/tests/fixtures/complex/old-format-pm-agent.md b/src/skills/bmad-agent-builder/tests/fixtures/complex/old-format-pm-agent.md deleted file mode 100644 index b5a91ac..0000000 --- a/src/skills/bmad-agent-builder/tests/fixtures/complex/old-format-pm-agent.md +++ /dev/null @@ -1,72 +0,0 @@ ---- -name: "pm" -description: "Product Manager" ---- - -You must fully embody this agent's persona and follow all activation instructions exactly as specified. NEVER break character until given an exit command. - -```xml - - - Load persona from this current agent file (already in context) - 🚨 IMMEDIATE ACTION REQUIRED - BEFORE ANY OUTPUT: - - Load and read {project-root}/_bmad/bmm/config.yaml NOW - - Store ALL fields as session variables: {user_name}, {communication_language}, {output_folder} - - VERIFY: If config not loaded, STOP and report error to user - - DO NOT PROCEED to step 3 until config is successfully loaded and variables stored - - Remember: user's name is {user_name} - - Show greeting using {user_name} from config, communicate in {communication_language}, then display numbered list of ALL menu items from menu section - Let {user_name} know they can type command `/bmad-help` at any time to get advice on what to do next, and that they can combine that with what they need help with `/bmad-help where should I start with an idea I have that does XYZ` - STOP and WAIT for user input - do NOT execute menu items automatically - accept number or cmd trigger or fuzzy command match - On user input: Number → process menu item[n] | Text → case-insensitive substring match | Multiple matches → ask user to clarify | No match → show "Not recognized" - When processing a menu item: Check menu-handlers section below - extract any attributes from the selected menu item (workflow, exec, tmpl, data, action, validate-workflow) and follow the corresponding handler instructions - - - - - When menu item or handler has: exec="path/to/file.md": - 1. Read fully and follow the file at that path - 2. Process the complete file and follow all instructions within it - 3. If there is data="some/path/data-foo.md" with the same item, pass that data path to the executed file as context. - - - When menu item has: workflow="path/to/workflow.yaml": - - 1. CRITICAL: Always LOAD {project-root}/_bmad/core/tasks/workflow.xml - 2. Read the complete file - this is the CORE OS for processing BMAD workflows - 3. Pass the yaml path as 'workflow-config' parameter to those instructions - 4. Follow workflow.xml instructions precisely following all steps - 5. Save outputs after completing EACH workflow step (never batch multiple steps together) - 6. If workflow.yaml path is "todo", inform user the workflow hasn't been implemented yet - - - - - - ALWAYS communicate in {communication_language} UNLESS contradicted by communication_style. - Stay in character until exit selected - Display Menu items as the item dictates and in the order given. - Load files ONLY when executing a user chosen workflow or a command requires it, EXCEPTION: agent activation step 2 config.yaml - - - Product Manager specializing in collaborative PRD creation through user interviews, requirement discovery, and stakeholder alignment. - Product management veteran with 8+ years launching B2B and consumer products. Expert in market research, competitive analysis, and user behavior insights. - Asks 'WHY?' relentlessly like a detective on a case. Direct and data-sharp, cuts through fluff to what actually matters. - - Channel expert product manager thinking: draw upon deep knowledge of user-centered design, Jobs-to-be-Done framework, opportunity scoring, and what separates great products from mediocre ones - PRDs emerge from user interviews, not template filling - discover what users actually need - Ship the smallest thing that validates the assumption - iteration over perfection - Technical feasibility is a constraint, not the driver - user value first - - - [MH] Redisplay Menu Help - [CH] Chat with the Agent about anything - [CP] Create PRD: Expert led facilitation to produce your Product Requirements Document - [VP] Validate PRD: Validate a Product Requirements Document is comprehensive, lean, well organized and cohesive - [EP] Edit PRD: Update an existing Product Requirements Document - [CE] Create Epics and Stories: Create the Epics and Stories Listing, these are the specs that will drive development - [IR] Implementation Readiness: Ensure the PRD, UX, and Architecture and Epics and Stories List are all aligned - [CC] Course Correction: Use this so we can determine how to proceed if major need for change is discovered mid implementation - [PM] Start Party Mode - [DA] Dismiss Agent - - -``` diff --git a/src/skills/bmad-agent-builder/tests/fixtures/deficient/bmad-agent-with-issues.md b/src/skills/bmad-agent-builder/tests/fixtures/deficient/bmad-agent-with-issues.md deleted file mode 100644 index b2e7a07..0000000 --- a/src/skills/bmad-agent-builder/tests/fixtures/deficient/bmad-agent-with-issues.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -bad frontmatter missing quotes -description: this description is way too vague and doesn't explain when to use the skill ---- - -# My Agent - -This agent does things. It helps with stuff. - -## Activation - -Load config and greet the user. - -## On Activation - -1. Load the config variables -2. Greet the user -3. Show menu - -## Build Process - -Just build the thing with whatever capabilities. - -## Capabilities - -The agent can do stuff like: -- Help with tasks -- Answer questions -- Process data - -## Output - -Create the files and stuff. - -## Notes - -- Make sure to use MUST and ALWAYS a lot -- Don't explain why things are important -- Keep it really vague so the model has to guess -- Use inconsistent formatting diff --git a/src/skills/bmad-agent-builder/tests/test-validate-manifest.py b/src/skills/bmad-agent-builder/tests/test-validate-manifest.py deleted file mode 100755 index 1163576..0000000 --- a/src/skills/bmad-agent-builder/tests/test-validate-manifest.py +++ /dev/null @@ -1,182 +0,0 @@ -#!/usr/bin/env python3 -"""Tests for manifest.py validate command.""" - -# /// script -# requires-python = ">=3.9" -# dependencies = [ -# "pytest>=7.0.0", -# "jsonschema>=4.0.0", -# ] -# /// - -from __future__ import annotations - -import json -import subprocess -import sys -import tempfile -from pathlib import Path - -try: - import pytest -except ImportError: - print("Error: pytest is required. Install with: pip install pytest", file=sys.stderr) - sys.exit(2) - - -# Path to the manifest.py script -SCRIPT_PATH = Path(__file__).parent.parent / "scripts" / "manifest.py" -# Path to the schema -SCHEMA_PATH = Path(__file__).parent.parent / "scripts" / "bmad-manifest-schema.json" - - -def run_validator(manifest: dict) -> tuple[int, str, str]: - """Run the validator on a manifest dict and return exit code, stdout, stderr.""" - with tempfile.NamedTemporaryFile(mode="w", suffix=".json", delete=False) as f: - json.dump(manifest, f) - manifest_path = f.name - - try: - result = subprocess.run( - [sys.executable, str(SCRIPT_PATH), manifest_path, "--schema", str(SCHEMA_PATH)], - capture_output=True, - text=True, - ) - return result.returncode, result.stdout, result.stderr - finally: - Path(manifest_path).unlink() - - -def test_valid_manifest(): - """Test validation of a valid manifest.""" - manifest = { - "persona": "A helpful test agent", - "module-name": "Test Module", - "module-code": "test", - "capabilities": [ - { - "name": "test-capability", - "menu-code": "TC", - "description": "A test capability", - "phase": "on-demand", - }, - ], - } - - exit_code, stdout, _ = run_validator(manifest) - assert exit_code == 0 - assert "valid" in stdout.lower() or json.loads(stdout).get("valid") is True - - -def test_invalid_json(): - """Test that invalid JSON produces an error.""" - with tempfile.NamedTemporaryFile(mode="w", suffix=".json", delete=False) as f: - f.write("{invalid json") - manifest_path = f.name - - try: - result = subprocess.run( - [sys.executable, str(SCRIPT_PATH), manifest_path], - capture_output=True, - text=True, - ) - assert result.returncode != 0 - finally: - Path(manifest_path).unlink() - - -def test_missing_menu_code(): - """Test that missing menu-code produces a warning.""" - manifest = { - "persona": "A helpful test agent", - "module-name": "Test Module", - "module-code": "test", - "capabilities": [ - { - "name": "test-capability", - "description": "A test capability", - }, - ], - } - - exit_code, stdout, stderr = run_validator(manifest) - # Should still be valid (warning only) but mention the missing menu-code - assert exit_code == 0 - output = stdout + stderr - assert "menu-code" in output - - -def test_invalid_menu_code_format(): - """Test that invalid menu-code format produces a warning.""" - manifest = { - "persona": "A helpful test agent", - "module-name": "Test Module", - "module-code": "test", - "capabilities": [ - { - "name": "test-capability", - "menu-code": "t", # Too short - "description": "A test capability", - }, - ], - } - - exit_code, stdout, stderr = run_validator(manifest) - # Should still be valid (warning only) - assert exit_code == 0 - output = stdout + stderr - assert "menu-code" in output - - -def test_json_output(): - """Test JSON output format.""" - manifest = { - "persona": "A helpful test agent", - "module-name": "Test Module", - "module-code": "test", - "capabilities": [ - { - "name": "test-capability", - "menu-code": "TC", - "description": "A test capability", - }, - ], - } - - with tempfile.NamedTemporaryFile(mode="w", suffix=".json", delete=False) as f: - json.dump(manifest, f) - manifest_path = f.name - - try: - result = subprocess.run( - [sys.executable, str(SCRIPT_PATH), manifest_path, "--json"], - capture_output=True, - text=True, - ) - assert result.returncode == 0 - - output = json.loads(result.stdout) - assert output["valid"] is True - assert output["error_count"] == 0 - assert "warnings" in output - finally: - Path(manifest_path).unlink() - - -def test_invalid_manifest_no_persona(): - """Test that manifest without persona field produces an error.""" - manifest = { - "module-name": "Test Module", - "module-code": "test", - } - - exit_code, stdout, _ = run_validator(manifest) - assert exit_code != 0 - output = json.loads(stdout) if "--json" in sys.argv else stdout - # Should have validation errors - assert exit_code == 1 - - -if __name__ == "__main__": - # Run pytest if available - pytest.main([__file__, "-v"]) diff --git a/src/skills/bmad-workflow-builder/SKILL.md b/src/skills/bmad-workflow-builder/SKILL.md index df54222..32464ef 100644 --- a/src/skills/bmad-workflow-builder/SKILL.md +++ b/src/skills/bmad-workflow-builder/SKILL.md @@ -40,7 +40,7 @@ This is the core creative path — where workflow and skill ideas become reality Workflows and skills span three types: simple utilities (composable building blocks), simple workflows (single-file processes), and complex workflows (multi-stage with routing and progressive disclosure). The build process includes a lint gate for structural validation. When building or modifying skills that include scripts, unit tests are created alongside the scripts and run as part of validation. -Load `prompts/build-process.md` to begin. +Load `build-process.md` to begin. ## Quality Optimizer @@ -48,7 +48,7 @@ For workflows/skills that already work but could work *better*. This is comprehe Run this anytime you want to assess and improve an existing skill's quality. -Load `prompts/quality-optimizer.md` — it orchestrates everything including scan modes, autonomous handling, and remediation options. +Load `quality-optimizer.md` — it orchestrates everything including scan modes, autonomous handling, and remediation options. --- @@ -56,8 +56,8 @@ Load `prompts/quality-optimizer.md` — it orchestrates everything including sca | Intent | Trigger Phrases | Route | |--------|----------------|-------| -| **Build** | "build/create/design/convert/edit/fix a workflow/skill/tool" | Load `prompts/build-process.md` | -| **Quality Optimize** | "quality check", "validate", "review/optimize/improve workflow/skill" | Load `prompts/quality-optimizer.md` | +| **Build** | "build/create/design/convert/edit/fix a workflow/skill/tool" | Load `build-process.md` | +| **Quality Optimize** | "quality check", "validate", "review/optimize/improve workflow/skill" | Load `quality-optimizer.md` | | **Unclear** | — | Present the two options above and ask | Pass `{headless_mode}` flag to all routes. Use TodoList tool to track progress through multi-step flows. Use AskUserQuestion tool when structuring questions for users. Use subagents for parallel work (quality scanners, web research or document review). diff --git a/src/skills/bmad-workflow-builder/templates/SKILL-template.md b/src/skills/bmad-workflow-builder/assets/SKILL-template.md similarity index 93% rename from src/skills/bmad-workflow-builder/templates/SKILL-template.md rename to src/skills/bmad-workflow-builder/assets/SKILL-template.md index ce3629e..0885a0c 100644 --- a/src/skills/bmad-workflow-builder/templates/SKILL-template.md +++ b/src/skills/bmad-workflow-builder/assets/SKILL-template.md @@ -83,7 +83,7 @@ Act as {role-guidance}. - If output doc exists (user specifies path or we prompt): - Read doc to determine current stage - Resume from last completed stage - - Else: Start at `prompts/01-{stage-1-name}.md` + - Else: Start at `01-{stage-1-name}.md` 4. **Route to appropriate stage** based on progress @@ -98,8 +98,8 @@ Act as {role-guidance}. | # | Stage | Purpose | Prompt | |---|-------|---------|--------| -| 1 | {stage-1-name} | {stage-1-purpose} | `prompts/01-{stage-1-name}.md` | -| 2 | {stage-2-name} | {stage-2-purpose} | `prompts/02-{stage-2-name}.md` | +| 1 | {stage-1-name} | {stage-1-purpose} | `01-{stage-1-name}.md` | +| 2 | {stage-2-name} | {stage-2-purpose} | `02-{stage-2-name}.md` | {/if-complex-workflow} {if-external-skills} diff --git a/src/skills/bmad-workflow-builder/bmad-manifest.json b/src/skills/bmad-workflow-builder/bmad-manifest.json index 06a9c28..f5c7fa9 100644 --- a/src/skills/bmad-workflow-builder/bmad-manifest.json +++ b/src/skills/bmad-workflow-builder/bmad-manifest.json @@ -6,7 +6,7 @@ "menu-code": "BP", "description": "Build, edit, or convert workflows and skills through six-phase conversational discovery. Covers new skills, format conversion, edits, and fixes.", "supports-headless": true, - "prompt": "prompts/build-process.md", + "prompt": "build-process.md", "phase-name": "anytime", "output-location": "{bmad_builder_output_folder}" }, @@ -15,7 +15,7 @@ "menu-code": "QO", "description": "Comprehensive validation and optimization using lint scripts and LLM scanner subagents. Structure, prompt craft, efficiency, and more.", "supports-headless": true, - "prompt": "prompts/quality-optimizer.md", + "prompt": "quality-optimizer.md", "phase-name": "anytime", "output-location": "{bmad_builder_reports}" } diff --git a/src/skills/bmad-workflow-builder/prompts/build-process.md b/src/skills/bmad-workflow-builder/build-process.md similarity index 79% rename from src/skills/bmad-workflow-builder/prompts/build-process.md rename to src/skills/bmad-workflow-builder/build-process.md index 7d812ec..b607539 100644 --- a/src/skills/bmad-workflow-builder/prompts/build-process.md +++ b/src/skills/bmad-workflow-builder/build-process.md @@ -32,7 +32,7 @@ Ask upfront: - What other skills will it use from the core or specified module, we need the name, inputs, and output so we know how to integrate it? (bmad-init is default unless explicitly opted out, other skills should be either core skills or skills that will be part of the module) - What are the variable names it will have access to that it needs to use? (variables can be use for things like choosing various paths in the skill, adjusting output styles, configuring output locations, tool availability, and anything that could be configurable by a user) -Load `resources/classification-reference.md` for the full decision tree, classification signals, and module context rules. Use it to classify: +Load `references/classification-reference.md` for the full decision tree, classification signals, and module context rules. Use it to classify: 1. Composable building block with clear input/output and generally will use scripts either inline or in the scripts folder? → **Simple Utility** 2. Fits in a single SKILL.md, may have some resources and a prompt, but generally not very complex. Human in the Loop and Autonomous abilities? → **Simple Workflow** @@ -50,7 +50,7 @@ Work through conversationally, adapted per skill type, so you can either glean f **All types — Common fields:** - **Name:** kebab-case. If module: `bmad-{modulecode}-{skillname}`. If standalone: `bmad-{skillname}` -- **Description:** Two parts: [5-8 word summary of what it does]. [Use when user says 'specific phrase' or 'specific phrase'.] — Default to explicit invocation (conservative triggering) unless user specifies organic/reactive activation. See `resources/standard-fields.md` for format details and examples. +- **Description:** Two parts: [5-8 word summary of what it does]. [Use when user says 'specific phrase' or 'specific phrase'.] — Default to explicit invocation (conservative triggering) unless user specifies organic/reactive activation. See `references/standard-fields.md` for format details and examples. - **Overview:** 3-part formula (What/How/Why-Outcome). For interactive or complex skills, also include brief domain framing (what concepts does this skill operate on?) and theory of mind (who is the user and what might they not know?). These give the executing agent enough context to make judgment calls when situations don't match the script. - **Role guidance:** Brief "Act as a [role/expert]" statement to prime the model for the right domain expertise and tone - **Design rationale:** Any non-obvious choices the executing agent should understand? (e.g., "We interview before building because users rarely know their full requirements upfront") @@ -106,7 +106,7 @@ For each capability, confirm these with the user — they determine how the modu - **description (capability):** Keep this VERY short — a single sentence describing what it produces, not how it works. This is what the LLM help system shows users. (e.g., "Produces executive product brief and optional LLM distillate for PRD input.") **Path conventions (CRITICAL):** -- Skill-internal files use bare relative paths: `resources/`, `prompts/`, `scripts/` (never `{skill-root}`) +- Skill-internal files use bare relative paths: `references/`, `scripts/`, and prompt files at root (never `{skill-root}`) - Only `_bmad` paths get `{project-root}` prefix: `{project-root}/_bmad/...` - Config variables used directly — they already contain `{project-root}` (no double-prefix) @@ -117,23 +117,23 @@ Once you have a cohesive idea, think one level deeper, clarify with the user any ## Phase 5: Build **Always load these before building:** -- Load `resources/standard-fields.md` — field definitions, description format, path rules -- Load `resources/skill-best-practices.md` — authoring patterns (freedom levels, templates, anti-patterns) -- Load `resources/quality-dimensions.md` — quick mental checklist for build quality +- Load `references/standard-fields.md` — field definitions, description format, path rules +- Load `references/skill-best-practices.md` — authoring patterns (freedom levels, templates, anti-patterns) +- Load `references/quality-dimensions.md` — quick mental checklist for build quality **Load based on skill type:** -- **If Complex Workflow:** Load `resources/complex-workflow-patterns.md` — compaction survival, document-as-cache pattern, config integration, facilitator model, progressive disclosure with prompts/. This is essential for building workflows that survive long-running sessions. -- **If module-based (any type):** Load `resources/metadata-reference.md` — bmad-manifest.json field definitions, module metadata structure, config loading requirements. -- **Always load** `resources/script-opportunities-reference.md` — script opportunity spotting guide, catalog, and output standards. Use this to identify additional script opportunities not caught in Phase 3, even if no scripts were initially planned. +- **If Complex Workflow:** Load `references/complex-workflow-patterns.md` — compaction survival, document-as-cache pattern, config integration, facilitator model, progressive disclosure with prompt files at root. This is essential for building workflows that survive long-running sessions. +- **If module-based (any type):** Load `references/metadata-reference.md` — bmad-manifest.json field definitions, module metadata structure, config loading requirements. +- **Always load** `references/script-opportunities-reference.md` — script opportunity spotting guide, catalog, and output standards. Use this to identify additional script opportunities not caught in Phase 3, even if no scripts were initially planned. When confirmed: -1. Load template substitution rules from `resources/template-substitution-rules.md` and apply +1. Load template substitution rules from `references/template-substitution-rules.md` and apply -2. Load unified template: `templates/SKILL-template.md` +2. Load unified template: `assets/SKILL-template.md` - Apply skill-type conditionals (`{if-complex-workflow}`, `{if-simple-workflow}`, `{if-simple-utility}`) to keep only relevant sections -3. **Progressive disclosure:** Keep SKILL.md focused on Overview, activation, and routing. Detailed stage instructions go in `prompts/`. Reference data, schemas, and large tables go in `resources/`. Multi-branch SKILL.md under ~250 lines is fine as-is; single-purpose up to ~500 lines if genuinely needed. +3. **Progressive disclosure:** Keep SKILL.md focused on Overview, activation, and routing. Detailed stage instructions go in prompt files at the skill root. Reference data, schemas, and large tables go in `references/`. Multi-branch SKILL.md under ~250 lines is fine as-is; single-purpose up to ~500 lines if genuinely needed. 4. Generate folder structure and include only what is needed for the specific skill: **Skill Source Tree:** @@ -141,13 +141,23 @@ When confirmed: {skill-name}/ ├── SKILL.md # name (same as folder name), description ├── bmad-manifest.json # Capabilities, module integration, optional persona/memory -├── resources/ # Additional resource and data files as needed -├── prompts/ # Offload expensive details to prompt files for actions that will not happen every time or work that will benefit from splitting across potentially multiple prompts -├── agents/ # If the skill will have pre defined agents (persona with actions or knowledge) for spawning as a subagent for separate context and parallel processing -├── scripts/ # As Needed (favor python unless user specified) +├── *.md # Prompt files and subagent definitions at root +├── references/ # Reference data, schemas, guides (read for context) +├── assets/ # Templates, starter files (copied/transformed into output) +├── scripts/ # Deterministic code — validation, transformation, testing │ └── tests/ # All scripts need unit tests ``` +**What goes where:** +| Location | Contains | LLM relationship | +|----------|----------|-----------------| +| **Root `.md` files** | Prompt/instruction files, subagent definitions | LLM **loads and executes** these as instructions — they are extensions of SKILL.md | +| **`references/`** | Reference data, schemas, tables, examples, guides | LLM **reads for context** — informational, not executable | +| **`assets/`** | Templates, starter files, boilerplate | LLM **copies/transforms** these into output — not for reasoning | +| **`scripts/`** | Python, shell scripts with tests | LLM **invokes** these — deterministic operations that don't need judgment | + +Only create subfolders that are needed — most skills won't need all four. + 5. **Generate bmad-manifest.json** — Use `scripts/manifest.py` (validation is automatic on every write). **IMPORTANT:** The generated manifest must NOT include a `$schema` field — the schema is used for validation tooling only and is not part of the delivered skill. ```bash # Create manifest @@ -160,7 +170,7 @@ When confirmed: python3 scripts/manifest.py add-capability {skill-path} \ --name {name} --menu-code {MC} --description "Short: what it produces." \ --supports-autonomous \ - --prompt prompts/{name}.md # internal capability + --prompt {name}.md # internal capability # OR --skill-name {skill} # external skill # omit both if SKILL.md handles it directly # Module capabilities also need: @@ -195,4 +205,4 @@ If scripts exist, also run unit tests. Ask: *"Build is done. Would you like to run a Quality Scan to optimize further?"* -If yes, load `prompts/quality-optimizer.md` with `{scan_mode}=full` and the skill path. +If yes, load `quality-optimizer.md` with `{scan_mode}=full` and the skill path. diff --git a/src/skills/bmad-workflow-builder/prompts/quality-optimizer.md b/src/skills/bmad-workflow-builder/quality-optimizer.md similarity index 86% rename from src/skills/bmad-workflow-builder/prompts/quality-optimizer.md rename to src/skills/bmad-workflow-builder/quality-optimizer.md index 87dda95..85256f3 100644 --- a/src/skills/bmad-workflow-builder/prompts/quality-optimizer.md +++ b/src/skills/bmad-workflow-builder/quality-optimizer.md @@ -91,12 +91,12 @@ These extract metrics for the LLM scanners so they work from compact data instea | # | Scanner | Focus | Pre-Pass? | Temp Filename | |---|---------|-------|-----------|---------------| -| L1 | `agents/quality-scan-workflow-integrity.md` | Logical consistency, description quality, progression condition quality, type-appropriate structure | Yes — receives prepass JSON | `workflow-integrity-temp.json` | -| L2 | `agents/quality-scan-prompt-craft.md` | Token efficiency, anti-patterns, outcome balance, Overview quality, progressive disclosure | Yes — receives metrics JSON | `prompt-craft-temp.json` | -| L3 | `agents/quality-scan-execution-efficiency.md` | Parallelization, subagent delegation, read avoidance, context optimization | Yes — receives dep graph JSON | `execution-efficiency-temp.json` | -| L4 | `agents/quality-scan-skill-cohesion.md` | Stage flow coherence, purpose alignment, complexity appropriateness | No | `skill-cohesion-temp.json` | -| L5 | `agents/quality-scan-enhancement-opportunities.md` | Creative edge-case discovery, experience gaps, delight opportunities, assumption auditing | No | `enhancement-opportunities-temp.json` | -| L6 | `agents/quality-scan-script-opportunities.md` | Deterministic operation detection — finds LLM work that should be scripts instead | No | `script-opportunities-temp.json` | +| L1 | `quality-scan-workflow-integrity.md` | Logical consistency, description quality, progression condition quality, type-appropriate structure | Yes — receives prepass JSON | `workflow-integrity-temp.json` | +| L2 | `quality-scan-prompt-craft.md` | Token efficiency, anti-patterns, outcome balance, Overview quality, progressive disclosure | Yes — receives metrics JSON | `prompt-craft-temp.json` | +| L3 | `quality-scan-execution-efficiency.md` | Parallelization, subagent delegation, read avoidance, context optimization | Yes — receives dep graph JSON | `execution-efficiency-temp.json` | +| L4 | `quality-scan-skill-cohesion.md` | Stage flow coherence, purpose alignment, complexity appropriateness | No | `skill-cohesion-temp.json` | +| L5 | `quality-scan-enhancement-opportunities.md` | Creative edge-case discovery, experience gaps, delight opportunities, assumption auditing | No | `enhancement-opportunities-temp.json` | +| L6 | `quality-scan-script-opportunities.md` | Deterministic operation detection — finds LLM work that should be scripts instead | No | `script-opportunities-temp.json` | ## Execution Instructions @@ -124,7 +124,7 @@ After scripts complete, spawn applicable LLM scanners as parallel subagents. **For scanners WITHOUT pre-pass (L4, L5, L6):** provide just the skill path and output directory as before. Each subagent receives: -- Scanner file to load (e.g., `agents/quality-scan-skill-cohesion.md`) +- Scanner file to load (e.g., `quality-scan-skill-cohesion.md`) - Skill path to scan: `{skill-path}` - Output directory for results: `{quality-report-dir}` - Temp filename for output: `{temp-filename}` @@ -150,7 +150,7 @@ After all scripts and scanners complete: 3. Skip report creator (not needed for single scanner) **IF multiple LLM scanners:** -1. Initiate a subagent with `agents/report-quality-scan-creator.md` +1. Initiate a subagent with `report-quality-scan-creator.md` **Provide the subagent with:** - `{skill-path}` — The skill being validated diff --git a/src/skills/bmad-workflow-builder/agents/quality-scan-enhancement-opportunities.md b/src/skills/bmad-workflow-builder/quality-scan-enhancement-opportunities.md similarity index 98% rename from src/skills/bmad-workflow-builder/agents/quality-scan-enhancement-opportunities.md rename to src/skills/bmad-workflow-builder/quality-scan-enhancement-opportunities.md index f4ec56b..037aa25 100644 --- a/src/skills/bmad-workflow-builder/agents/quality-scan-enhancement-opportunities.md +++ b/src/skills/bmad-workflow-builder/quality-scan-enhancement-opportunities.md @@ -27,9 +27,9 @@ You are NOT checking structure, craft quality, performance, or test coverage — Find and read: - `SKILL.md` — Understand the skill's purpose, audience, and flow -- `prompts/*.md` — Walk through each stage as a user would experience it -- `resources/*.md` — Understand what supporting material exists -- `resources/*.json` — See what supporting schemas exist +- `*.md` prompt files at root — Walk through each stage as a user would experience it +- `references/*.md` — Understand what supporting material exists +- `references/*.json` — See what supporting schemas exist ## Creative Analysis Lenses @@ -180,7 +180,7 @@ Write JSON findings to: `{quality-report-dir}/enhancement-opportunities-temp.jso }, "findings": [ { - "file": "SKILL.md|prompts/{name}.md", + "file": "SKILL.md|{name}.md", "severity": "high-opportunity|medium-opportunity|low-opportunity", "category": "edge-case|experience-gap|delight-opportunity|assumption-risk|journey-friction|autonomous-potential|facilitative-pattern", "scenario": "The specific situation or user story that reveals this opportunity", diff --git a/src/skills/bmad-workflow-builder/agents/quality-scan-execution-efficiency.md b/src/skills/bmad-workflow-builder/quality-scan-execution-efficiency.md similarity index 98% rename from src/skills/bmad-workflow-builder/agents/quality-scan-execution-efficiency.md rename to src/skills/bmad-workflow-builder/quality-scan-execution-efficiency.md index 2ed2432..f64a63c 100644 --- a/src/skills/bmad-workflow-builder/agents/quality-scan-execution-efficiency.md +++ b/src/skills/bmad-workflow-builder/quality-scan-execution-efficiency.md @@ -16,8 +16,8 @@ Read the skill's SKILL.md, all prompt files, and manifest (if present). Identify Find and read: - `SKILL.md` — On Activation patterns, operation flow -- `prompts/*.md` — Each prompt for execution patterns -- `resources/*.md` — Resource loading patterns +- `*.md` prompt files at root — Each prompt for execution patterns +- `references/*.md` — Resource loading patterns - `bmad-manifest.json` — Stage ordering, dependencies --- @@ -231,7 +231,7 @@ Write JSON findings to: `{quality-report-dir}/execution-efficiency-temp.json` "skill_path": "{path}", "issues": [ { - "file": "SKILL.md|prompts/{name}.md|bmad-manifest.json", + "file": "SKILL.md|{name}.md|bmad-manifest.json", "line": 42, "severity": "critical|high|medium|low", "category": "sequential-independent|parent-reads-first|missing-batch|no-output-spec|subagent-chain-violation|stage-ordering|dependency-bloat|circular-dependency|resource-loading|missing-delegation", @@ -243,7 +243,7 @@ Write JSON findings to: `{quality-report-dir}/execution-efficiency-temp.json` ], "opportunities": [ { - "file": "SKILL.md|prompts/{name}.md|bmad-manifest.json", + "file": "SKILL.md|{name}.md|bmad-manifest.json", "line": 15, "type": "parallelization|stage-reorder|dependency-trim|batching|delegation|resource-optimization", "description": "What could be improved", @@ -280,7 +280,7 @@ Write JSON findings to: `{quality-report-dir}/execution-efficiency-temp.json` 1. Read SKILL.md — check On Activation and operation flow patterns 2. Read all prompt files — check each for execution patterns 3. Read bmad-manifest.json if present — check stage ordering and dependencies -4. Check resource loading patterns in resources/ +4. Check resource loading patterns in references/ 5. Identify sequential operations that could be parallel 6. Check for parent-reading-before-delegating patterns 7. Verify subagent instructions have output specifications diff --git a/src/skills/bmad-workflow-builder/agents/quality-scan-prompt-craft.md b/src/skills/bmad-workflow-builder/quality-scan-prompt-craft.md similarity index 93% rename from src/skills/bmad-workflow-builder/agents/quality-scan-prompt-craft.md rename to src/skills/bmad-workflow-builder/quality-scan-prompt-craft.md index 003cfdd..dd65220 100644 --- a/src/skills/bmad-workflow-builder/agents/quality-scan-prompt-craft.md +++ b/src/skills/bmad-workflow-builder/quality-scan-prompt-craft.md @@ -16,8 +16,8 @@ Read every prompt in the skill and evaluate craft quality with this core princip Find and read: - `SKILL.md` — Primary target, evaluated with SKILL.md-specific criteria (see below) -- `prompts/*.md` — Each stage prompt evaluated for craft quality -- `resources/*.md` — Check progressive disclosure is used properly +- `*.md` prompt files at root — Each stage prompt evaluated for craft quality +- `references/*.md` — Check progressive disclosure is used properly --- @@ -57,18 +57,18 @@ A good Overview includes whichever of these elements are relevant to the skill: |----------|----------------|-------| | Multi-branch skill where each branch is lightweight | Up to ~250 lines | Each branch section should have a brief explanation of what it handles and why, even if the procedure is short | | Single-purpose skill with no branches | Up to ~500 lines (~5000 tokens) | Rare, but acceptable if the content is genuinely needed and focused on one thing | -| Any skill with large data tables, schemas, or reference material inline | Flag for extraction | These belong in `resources/` or `assets/`, not the SKILL.md body | +| Any skill with large data tables, schemas, or reference material inline | Flag for extraction | These belong in `references/` or `assets/`, not the SKILL.md body | **Progressive disclosure techniques — how SKILL.md stays lean without stripping context:** | Technique | When to Use | What to Flag | |-----------|-------------|--------------| -| Branch to `prompts/*.md` | Multiple execution paths where each path needs detailed instructions | All detailed path logic inline in SKILL.md when it pushes beyond size guidelines | -| Load from `resources/*.md` | Domain knowledge, reference tables, examples >30 lines, large data | Large reference blocks or data tables inline that aren't needed every activation | +| Branch to prompt `*.md` files at root | Multiple execution paths where each path needs detailed instructions | All detailed path logic inline in SKILL.md when it pushes beyond size guidelines | +| Load from `references/*.md` | Domain knowledge, reference tables, examples >30 lines, large data | Large reference blocks or data tables inline that aren't needed every activation | | Load from `assets/` | Templates, schemas, config files | Template content pasted directly into SKILL.md | | Routing tables | Complex workflows with multiple entry points | Long prose describing "if this then go here, if that then go there" | -**Flag when:** SKILL.md contains detailed content that belongs in prompts/ or resources/ — data tables, schemas, long reference material, or detailed multi-step procedures for branches that could be separate prompts. +**Flag when:** SKILL.md contains detailed content that belongs in prompt files or references/ — data tables, schemas, long reference material, or detailed multi-step procedures for branches that could be separate prompts. **Don't flag:** Overview context, branch summary sections with brief explanations of what each path handles, or design rationale. These ARE needed on every activation because they establish the agent's mental model. A multi-branch SKILL.md under ~250 lines with brief-but-contextual branch sections is good design, not an anti-pattern. @@ -103,8 +103,8 @@ A skill that has been aggressively optimized — or built too lean from the star | Pattern | Why It's a Problem | Fix | |---------|-------------------|-----| -| SKILL.md exceeds size guidelines with no progressive disclosure | Context-heavy on every activation, likely contains extractable content | Extract detailed procedures to prompts/, reference material and data to resources/ | -| Large data tables, schemas, or reference material inline | This is never needed on every activation — bloats context | Move to `resources/` or `assets/`, load on demand | +| SKILL.md exceeds size guidelines with no progressive disclosure | Context-heavy on every activation, likely contains extractable content | Extract detailed procedures to prompt files at root, reference material and data to references/ | +| Large data tables, schemas, or reference material inline | This is never needed on every activation — bloats context | Move to `references/` or `assets/`, load on demand | | No Overview or empty Overview | Agent follows steps without understanding why — brittle when situations vary | Add Overview with mission, domain framing, and relevant context | | Overview without connection to behavior | Philosophy that doesn't change how the agent executes | Either connect it to specific instructions or remove it | | Multi-branch sections with zero context | Agent can't understand what each branch is for | Add 1-2 sentence explanation per branch — what it handles and why | @@ -116,7 +116,7 @@ A skill that has been aggressively optimized — or built too lean from the star ## Part 2: Stage Prompt Craft -Stage prompts (`prompts/*.md`) are the working instructions for each phase of execution. These should be more procedural than SKILL.md, but still benefit from brief context about WHY this stage matters. +Stage prompts (prompt `*.md` files at skill root) are the working instructions for each phase of execution. These should be more procedural than SKILL.md, but still benefit from brief context about WHY this stage matters. ### Config Header @@ -248,7 +248,7 @@ Write JSON findings to: `{quality-report-dir}/prompt-craft-temp.json` "prompts_scanned": 0, "issues": [ { - "file": "SKILL.md|prompts/{name}.md", + "file": "SKILL.md|{name}.md", "line": 42, "severity": "critical|high|medium|low|note", "category": "token-waste|anti-pattern|outcome-balance|progression|self-containment|intelligence-placement|overview-quality|progressive-disclosure|under-contextualized|inline-data", @@ -276,11 +276,11 @@ Write JSON findings to: `{quality-report-dir}/prompt-craft-temp.json` ## Process 1. Read SKILL.md — assess skill type, evaluate Overview quality and progressive disclosure -2. Read all prompt files in prompts/ -3. Check resources/ to verify progressive disclosure is working (detail is where it belongs) +2. Read all prompt files at skill root +3. Check references/ to verify progressive disclosure is working (detail is where it belongs) 4. For SKILL.md: evaluate Overview quality (present? appropriate? excessive? disconnected? **missing?**) 5. For SKILL.md: check for over-optimization — is this a complex/interactive skill stripped to a bare skeleton? -6. For SKILL.md: check size and progressive disclosure — does it exceed guidelines? Are data tables, schemas, or reference material inline that should be in resources/? +6. For SKILL.md: check size and progressive disclosure — does it exceed guidelines? Are data tables, schemas, or reference material inline that should be in references/? 7. For multi-branch SKILL.md: does each branch section have brief context explaining what it handles and why? 7. For each stage prompt: check config header, progression conditions, self-containment 8. For each stage prompt: check context sufficiency — do judgment-heavy prompts have enough context to make good decisions? @@ -307,7 +307,7 @@ Write JSON findings to: `{quality-report-dir}/prompt-craft-temp.json` - Did I include the `nuance` field for findings that could be intentional? - Am I flagging Overview content as waste? If so, re-evaluate — domain context, theory of mind, and design rationale are load-bearing for complex/interactive workflows. - Did I check for under-contextualization? A complex/interactive skill with a missing or empty Overview is a high-severity finding — the agent will execute mechanically and fail on edge cases. -- Did I check for inline data (tables, schemas, reference material) that should be in resources/ or assets/? +- Did I check for inline data (tables, schemas, reference material) that should be in references/ or assets/? ### Calibration Check - Would implementing ALL my suggestions produce a better skill, or would some strip valuable context? diff --git a/src/skills/bmad-workflow-builder/agents/quality-scan-script-opportunities.md b/src/skills/bmad-workflow-builder/quality-scan-script-opportunities.md similarity index 98% rename from src/skills/bmad-workflow-builder/agents/quality-scan-script-opportunities.md rename to src/skills/bmad-workflow-builder/quality-scan-script-opportunities.md index 7da0314..d5df82b 100644 --- a/src/skills/bmad-workflow-builder/agents/quality-scan-script-opportunities.md +++ b/src/skills/bmad-workflow-builder/quality-scan-script-opportunities.md @@ -16,8 +16,8 @@ Read every prompt file and SKILL.md. For each instruction that tells the LLM to Find and read: - `SKILL.md` — On Activation patterns, inline operations -- `prompts/*.md` — Each prompt for deterministic operations hiding in LLM instructions -- `resources/*.md` — Check if any resource content could be generated by scripts instead +- `*.md` prompt files at root — Each prompt for deterministic operations hiding in LLM instructions +- `references/*.md` — Check if any resource content could be generated by scripts instead - `scripts/` — Understand what scripts already exist (to avoid suggesting duplicates) --- @@ -191,7 +191,7 @@ Write JSON findings to: `{quality-report-dir}/script-opportunities-temp.json` "existing_scripts": ["list of scripts that already exist in skills/scripts/"], "findings": [ { - "file": "SKILL.md|prompts/{name}.md", + "file": "SKILL.md|{name}.md", "line": 42, "severity": "high|medium|low", "category": "validation|extraction|transformation|counting|comparison|structure|graph|preprocessing|postprocessing", diff --git a/src/skills/bmad-workflow-builder/agents/quality-scan-skill-cohesion.md b/src/skills/bmad-workflow-builder/quality-scan-skill-cohesion.md similarity index 98% rename from src/skills/bmad-workflow-builder/agents/quality-scan-skill-cohesion.md rename to src/skills/bmad-workflow-builder/quality-scan-skill-cohesion.md index e3eb9e7..9406c60 100644 --- a/src/skills/bmad-workflow-builder/agents/quality-scan-skill-cohesion.md +++ b/src/skills/bmad-workflow-builder/quality-scan-skill-cohesion.md @@ -22,8 +22,8 @@ This is an **opinionated, advisory scan**. Findings are suggestions, not errors. Find and read: - `SKILL.md` — Identity, purpose, role guidance, description - `bmad-manifest.json` — All capabilities with dependencies and metadata -- `prompts/*.md` — What each stage prompt actually does -- `resources/*.md` — Supporting resources and patterns +- `*.md` prompt files at root — What each stage prompt actually does +- `references/*.md` — Supporting resources and patterns - Look for references to external skills in prompts and SKILL.md ## Cohesion Dimensions @@ -176,7 +176,7 @@ Write JSON findings to: `{quality-report-dir}/skill-cohesion-temp.json` }, "findings": [ { - "file": "SKILL.md|bmad-manifest.json|prompts/{name}.md", + "file": "SKILL.md|bmad-manifest.json|{name}.md", "severity": "high|medium|low|suggestion", "category": "gap|redundancy|misalignment|opportunity|strength", "issue": "Brief description", diff --git a/src/skills/bmad-workflow-builder/agents/quality-scan-workflow-integrity.md b/src/skills/bmad-workflow-builder/quality-scan-workflow-integrity.md similarity index 94% rename from src/skills/bmad-workflow-builder/agents/quality-scan-workflow-integrity.md rename to src/skills/bmad-workflow-builder/quality-scan-workflow-integrity.md index 12fb733..33959a5 100644 --- a/src/skills/bmad-workflow-builder/agents/quality-scan-workflow-integrity.md +++ b/src/skills/bmad-workflow-builder/quality-scan-workflow-integrity.md @@ -4,7 +4,7 @@ You are **WorkflowIntegrityBot**, a quality engineer who validates that a skill ## Overview -You validate structural completeness and correctness across the entire skill: SKILL.md, stage prompts, manifest, and their interconnections. **Why this matters:** Structure is what the AI reads first — frontmatter determines whether the skill triggers, sections establish the mental model, stage files are the executable units, and broken references cause runtime failures. A structurally sound skill is one where the blueprint (SKILL.md) and the implementation (prompts/, resources/, manifest) are aligned and complete. +You validate structural completeness and correctness across the entire skill: SKILL.md, stage prompts, manifest, and their interconnections. **Why this matters:** Structure is what the AI reads first — frontmatter determines whether the skill triggers, sections establish the mental model, stage files are the executable units, and broken references cause runtime failures. A structurally sound skill is one where the blueprint (SKILL.md) and the implementation (prompt files, references/, manifest) are aligned and complete. This is a single unified scan that checks both the skill's skeleton (SKILL.md structure) and its organs (stage files, progression, config, manifest). Checking these together lets you catch mismatches that separate scans would miss — like a SKILL.md claiming complex workflow with routing but having no stage files, or stage files that exist but aren't referenced. @@ -16,7 +16,7 @@ Read the skill's SKILL.md, all stage prompts, and manifest (if present). Verify Find and read: - `SKILL.md` — Primary structure and blueprint -- `prompts/*.md` — Stage prompt files (if complex workflow) +- `*.md` prompt files at root — Stage prompt files (if complex workflow) - `bmad-manifest.json` — Module manifest (if present) --- @@ -89,7 +89,7 @@ Determine workflow type from SKILL.md before applying type-specific checks: | Type | Indicators | |------|-----------| -| Complex Workflow | Has routing logic, references stage files in prompts/, stages table | +| Complex Workflow | Has routing logic, references stage files at root, stages table | | Simple Workflow | Has inline numbered steps, no external stage files | | Simple Utility | Input/output focused, transformation rules, minimal process | @@ -99,8 +99,8 @@ Determine workflow type from SKILL.md before applying type-specific checks: | Check | Why It Matters | |-------|----------------| -| Each stage referenced in SKILL.md exists in `prompts/` | Missing stage file means workflow cannot proceed — **critical** | -| All stage files in `prompts/` are referenced in SKILL.md | Orphaned stage files indicate incomplete refactoring | +| Each stage referenced in SKILL.md exists at skill root | Missing stage file means workflow cannot proceed — **critical** | +| All stage files at root are referenced in SKILL.md | Orphaned stage files indicate incomplete refactoring | | Stage files use numbered prefixes (`01-`, `02-`, etc.) | Numbering establishes execution order at a glance | | Numbers are sequential with no gaps | Gaps suggest missing or deleted stages | | Stage file names are descriptive after the number | `01-gather-requirements.md` is clear; `01-step.md` is not | @@ -199,7 +199,7 @@ Write JSON findings to: `{quality-report-dir}/workflow-integrity-temp.json` "workflow_type": "complex|simple-workflow|simple-utility", "issues": [ { - "file": "SKILL.md|prompts/{name}.md|bmad-manifest.json", + "file": "SKILL.md|{name}.md|bmad-manifest.json", "line": 42, "severity": "critical|high|medium|low", "category": "frontmatter|sections|type-structure|config|config-header|language|artifacts|consistency|progression|missing-stage|naming|inline-steps|input-output|manifest|headless|invalid-section", @@ -227,8 +227,8 @@ Write JSON findings to: `{quality-report-dir}/workflow-integrity-temp.json` 1. Read SKILL.md — validate frontmatter, sections, language, template artifacts 2. Determine workflow type (complex, simple workflow, simple utility) -3. For complex workflows: list all stage files in prompts/, cross-reference with SKILL.md references -4. For complex workflows: read each stage prompt — check progression conditions, config headers, naming +3. For complex workflows: list all stage files at skill root, cross-reference with SKILL.md references +4. For complex workflows: read each stage prompt at root — check progression conditions, config headers, naming 5. For complex workflows: check bmad-manifest.json if module-based 6. For simple workflows: verify inline steps are numbered, clear, and complete 7. For simple utilities: verify input/output format and transformation rules @@ -244,7 +244,7 @@ Write JSON findings to: `{quality-report-dir}/workflow-integrity-temp.json` ### Scan Completeness - Did I read the entire SKILL.md file? - Did I correctly identify the workflow type? -- Did I read ALL stage files in prompts/ (for complex workflows)? +- Did I read ALL stage files at skill root (for complex workflows)? - Did I verify every stage reference in SKILL.md has a corresponding file? - Did I check progression conditions in every stage prompt? - Did I check config headers in stage prompts? diff --git a/src/skills/bmad-workflow-builder/resources/classification-reference.md b/src/skills/bmad-workflow-builder/references/classification-reference.md similarity index 85% rename from src/skills/bmad-workflow-builder/resources/classification-reference.md rename to src/skills/bmad-workflow-builder/references/classification-reference.md index 82e7777..70a520c 100644 --- a/src/skills/bmad-workflow-builder/resources/classification-reference.md +++ b/src/skills/bmad-workflow-builder/references/classification-reference.md @@ -7,8 +7,8 @@ Classify the skill type based on user requirements. This table is for internal u | Type | Description | Structure | When to Use | |------|-------------|-----------|-------------| | **Simple Utility** | Input/output building block. Headless, composable, often has scripts. May opt out of bmad-init for true standalone use. | Single SKILL.md + scripts/ | Composable building block with clear input/output, single-purpose | -| **Simple Workflow** | Multi-step process contained in a single SKILL.md. Uses bmad-init. Minimal or no prompts/. | SKILL.md + optional resources/ | Multi-step process that fits in one file, no progressive disclosure needed | -| **Complex Workflow** | Multi-stage with progressive disclosure, numbered prompts/, config integration. May support headless mode. | SKILL.md (routing) + prompts/ stages + resources/ | Multiple stages, long-running process, progressive disclosure, routing logic | +| **Simple Workflow** | Multi-step process contained in a single SKILL.md. Uses bmad-init. Minimal or no prompt files. | SKILL.md + optional references/ | Multi-step process that fits in one file, no progressive disclosure needed | +| **Complex Workflow** | Multi-stage with progressive disclosure, numbered prompt files at root, config integration. May support headless mode. | SKILL.md (routing) + prompt stages at root + references/ | Multiple stages, long-running process, progressive disclosure, routing logic | ## Decision Tree diff --git a/src/skills/bmad-workflow-builder/resources/complex-workflow-patterns.md b/src/skills/bmad-workflow-builder/references/complex-workflow-patterns.md similarity index 90% rename from src/skills/bmad-workflow-builder/resources/complex-workflow-patterns.md rename to src/skills/bmad-workflow-builder/references/complex-workflow-patterns.md index efda4ca..038816b 100644 --- a/src/skills/bmad-workflow-builder/resources/complex-workflow-patterns.md +++ b/src/skills/bmad-workflow-builder/references/complex-workflow-patterns.md @@ -307,23 +307,22 @@ If context is compacted mid-workflow: ## Sequential Progressive Disclosure -Use the `prompts/` subfolder when: +Place numbered prompt files at the skill root when: - Multi-phase workflow with ordered questions - Input of one phase affects the next - User requires specific sequence - Workflow is long-running and stages shouldn't be visible upfront -### prompts/ Structure +### Prompt File Structure ``` my-workflow/ ├── SKILL.md -├── prompts/ -│ ├── 01-discovery.md # Stage 1: Gather requirements, start output doc -│ ├── 02-planning.md # Stage 2: Create plan (uses discovery output) -│ ├── 03-execution.md # Stage 3: Execute (uses plan, updates output) -│ └── 04-review.md # Stage 4: Review and polish final output -└── resources/ +├── 01-discovery.md # Stage 1: Gather requirements, start output doc +├── 02-planning.md # Stage 2: Create plan (uses discovery output) +├── 03-execution.md # Stage 3: Execute (uses plan, updates output) +├── 04-review.md # Stage 4: Review and polish final output +└── references/ └── stage-templates.md ``` @@ -332,7 +331,7 @@ my-workflow/ Each prompt file specifies when to proceed: ```markdown -# prompts/02-planning.md +# 02-planning.md ## Prerequisites - Discovery complete (output doc exists and has discovery section) @@ -348,10 +347,10 @@ Each prompt file specifies when to proceed: Proceed to execution stage when user confirms: "Proceed with plan" OR user provides modifications ## On User Approval -Route to prompts/03-execution.md +Route to 03-execution.md ``` -### SKILL.md Routes to prompts/ +### SKILL.md Routes to Prompt Files Main SKILL.md is minimal — just routing logic: @@ -364,12 +363,12 @@ Main SKILL.md is minimal — just routing logic: - If output doc exists (user specifies path or we prompt): - Read doc to determine current stage - Resume from last completed section - - Else: Start at prompts/01-discovery.md + - Else: Start at 01-discovery.md -3. Route to appropriate prompts/ file based on stage +3. Route to appropriate prompt file based on stage ``` -### When NOT to Use prompts/ +### When NOT to Use Separate Prompt Files Keep inline in SKILL.md when: - Simple skill (session-long context fits) @@ -381,7 +380,7 @@ Keep inline in SKILL.md when: ## Module Metadata Reference -BMad module workflows require extended frontmatter metadata. See `resources/metadata-reference.md` for the metadata template, field explanations, and comparisons between standalone skills and module workflows. +BMad module workflows require extended frontmatter metadata. See `references/metadata-reference.md` for the metadata template, field explanations, and comparisons between standalone skills and module workflows. --- @@ -396,7 +395,7 @@ Before finalizing a BMad module workflow, verify: - [ ] **Document-as-cache**: Output doc has YAML front matter with `status` and `inputs` for recovery? - [ ] **Input tracking**: Does front matter list relative paths to all input files used? - [ ] **Final polish**: Does workflow include a subagent polish step at the end? -- [ ] **Progressive disclosure**: Are stages in `prompts/` with clear progression conditions? +- [ ] **Progressive disclosure**: Are stages in prompt files at root with clear progression conditions? - [ ] **Metadata complete**: All bmad-* fields present and accurate? - [ ] **Recovery pattern**: Can the workflow resume by reading the output doc front matter? @@ -407,12 +406,11 @@ Before finalizing a BMad module workflow, verify: ``` my-module-workflow/ ├── SKILL.md # Routing + entry logic -├── prompts/ -│ ├── 01-discovery.md # Gather requirements -│ ├── 02-planning.md # Create plan -│ ├── 03-execution.md # Execute -│ └── 04-review.md # Review results -├── resources/ +├── 01-discovery.md # Gather requirements +├── 02-planning.md # Create plan +├── 03-execution.md # Execute +├── 04-review.md # Review results +├── references/ │ └── templates.md # Stage templates └── scripts/ └── validator.sh # Output validation @@ -433,12 +431,12 @@ description: Complex multi-stage workflow for my module. Use when user requests 3. Check if doc exists: - If yes: read to determine current stage, resume - - If no: start at prompts/01-discovery.md + - If no: start at 01-discovery.md -4. Route to appropriate prompts/ file based on stage +4. Route to appropriate prompt file based on stage ``` -**prompts/01-discovery.md**: +**01-discovery.md**: ```markdown Language: {communication_language} Output Language: {document_output_language} @@ -473,10 +471,10 @@ updated: "{timestamp}" ``` ## Progression -When complete → prompts/02-planning.md +When complete → 02-planning.md ``` -**prompts/02-planning.md**: +**02-planning.md**: ```markdown Language: {communication_language} Output Language: {document_output_language} @@ -494,10 +492,10 @@ Output Language: {document_output_language} - Append planning section ## Progression -When complete → prompts/03-execution.md +When complete → 03-execution.md ``` -**prompts/04-review.md**: +**04-review.md**: ```markdown Language: {communication_language} Output Language: {document_output_language} diff --git a/src/skills/bmad-workflow-builder/resources/metadata-reference.md b/src/skills/bmad-workflow-builder/references/metadata-reference.md similarity index 90% rename from src/skills/bmad-workflow-builder/resources/metadata-reference.md rename to src/skills/bmad-workflow-builder/references/metadata-reference.md index 3746ce2..b25f73f 100644 --- a/src/skills/bmad-workflow-builder/resources/metadata-reference.md +++ b/src/skills/bmad-workflow-builder/references/metadata-reference.md @@ -35,7 +35,7 @@ description: [5-8 word summary]. [Use when user says 'X' or 'Y'.] "menu-code": "BP", "description": "Builds skills through conversational discovery. Outputs to skill folder.", "supports-headless": true, - "prompt": "prompts/build-process.md", + "prompt": "build-process.md", "phase-name": "design", "after": ["create-requirements"], "before": ["quality-optimize"], @@ -99,7 +99,7 @@ No type field needed — inferred from content: All module skills MUST use the `bmad-init` skill at startup. -See `resources/complex-workflow-patterns.md` for the config loading pattern. +See `references/complex-workflow-patterns.md` for the config loading pattern. ## Path Construction Rules — CRITICAL @@ -112,15 +112,15 @@ Never use `{skill-root}`. Only use `{project-root}` for `_bmad` paths. **Correct:** ``` -resources/reference.md # Skill-internal (bare relative) -prompts/stage-one.md # Skill-internal (bare relative) +references/reference.md # Skill-internal (bare relative) +stage-one.md # Skill-internal (prompt at root) {project-root}/_bmad/planning/prd.md # Project _bmad path {planning_artifacts}/prd.md # Config var (already has full path) ``` **Never use:** ``` -{skill-root}/resources/reference.md # {skill-root} doesn't exist +{skill-root}/references/reference.md # {skill-root} doesn't exist {project-root}/{config_var}/output.md # Double-prefix -./resources/reference.md # Relative prefix breaks context changes +./references/reference.md # Relative prefix breaks context changes ``` diff --git a/src/skills/bmad-workflow-builder/resources/quality-dimensions.md b/src/skills/bmad-workflow-builder/references/quality-dimensions.md similarity index 88% rename from src/skills/bmad-workflow-builder/resources/quality-dimensions.md rename to src/skills/bmad-workflow-builder/references/quality-dimensions.md index 5f54535..a52c1b6 100644 --- a/src/skills/bmad-workflow-builder/resources/quality-dimensions.md +++ b/src/skills/bmad-workflow-builder/references/quality-dimensions.md @@ -22,8 +22,8 @@ Scripts handle plumbing (fetch, transform, validate). Prompts handle judgment (i SKILL.md stays focused. Detail goes where it belongs. -- Stage instructions → `prompts/` -- Reference data, schemas, large tables → `resources/` +- Stage instructions → prompt files at skill root +- Reference data, schemas, large tables → `references/` - Templates, config files → `assets/` - Multi-branch SKILL.md under ~250 lines: fine as-is - Single-purpose up to ~500 lines: acceptable if focused @@ -32,13 +32,13 @@ SKILL.md stays focused. Detail goes where it belongs. Two parts: `[5-8 word summary]. [Use when user says 'X' or 'Y'.]` -Default to conservative triggering. See `resources/standard-fields.md` for full format and examples. +Default to conservative triggering. See `references/standard-fields.md` for full format and examples. ## 5. Path Construction Never use `{skill-root}`. Only use `{project-root}` for `_bmad` paths. Config variables used directly — they already contain `{project-root}`. -See `resources/standard-fields.md` for correct/incorrect patterns. +See `references/standard-fields.md` for correct/incorrect patterns. ## 6. Token Efficiency diff --git a/src/skills/bmad-workflow-builder/resources/script-opportunities-reference.md b/src/skills/bmad-workflow-builder/references/script-opportunities-reference.md similarity index 97% rename from src/skills/bmad-workflow-builder/resources/script-opportunities-reference.md rename to src/skills/bmad-workflow-builder/references/script-opportunities-reference.md index a48cc3c..73986fb 100644 --- a/src/skills/bmad-workflow-builder/resources/script-opportunities-reference.md +++ b/src/skills/bmad-workflow-builder/references/script-opportunities-reference.md @@ -132,7 +132,7 @@ Each entry follows the format: What it does, Why it matters for workflows, What **Why:** Capability misalignment between prompts and the manifest causes routing failures — the skill advertises a capability it can't deliver, or has a prompt that's never reachable. **Checks:** -- Every prompt in `prompts/` has frontmatter with `name`, `description`, `menu-code` +- Every prompt file at root has frontmatter with `name`, `description`, `menu-code` - Prompt `name` matches manifest capability name - `menu-code` matches manifest entry (case-insensitive) - Every manifest capability with `type: "prompt"` has a corresponding file @@ -140,7 +140,7 @@ Each entry follows the format: What it does, Why it matters for workflows, What **Output:** JSON with mismatches, missing files, orphaned prompts. -**Implementation:** Python, reads `bmad-skill-manifest.yaml` and all `.md` files in `prompts/`. +**Implementation:** Python, reads `bmad-skill-manifest.yaml` and all prompt `.md` files at skill root. --- @@ -225,8 +225,8 @@ Each entry follows the format: What it does, Why it matters for workflows, What **Checks:** - Parse SKILL.md and prompts for `Load resource` / `Read` / file reference patterns - Map each resource to the stage/prompt where it's first loaded -- Identify resources in `resources/` that are never referenced -- Identify resources referenced but missing from `resources/` +- Identify resources in `references/` that are never referenced +- Identify resources referenced but missing from `references/` - Calculate cumulative token cost at each loading point **Output:** JSON with resource file, loading trigger (which prompt/stage), and orphan/missing flags. @@ -257,10 +257,10 @@ Each entry follows the format: What it does, Why it matters for workflows, What **What:** Trace the chain of prompt loads through a workflow and verify every path is valid. -**Why:** Workflows route between prompts based on user intent and stage progression. A broken link in the chain — a `Load prompts/foo.md` where `foo.md` doesn't exist — halts the workflow. +**Why:** Workflows route between prompts based on user intent and stage progression. A broken link in the chain — a `Load foo.md` where `foo.md` doesn't exist — halts the workflow. **Checks:** -- Extract all `Load prompts/*.md` references from SKILL.md and every prompt file +- Extract all `Load *.md` prompt references from SKILL.md and every prompt file - Verify each referenced prompt file exists - Build a reachability map from SKILL.md entry points - Flag prompts that exist but are unreachable from any entry point diff --git a/src/skills/bmad-workflow-builder/resources/skill-best-practices.md b/src/skills/bmad-workflow-builder/references/skill-best-practices.md similarity index 98% rename from src/skills/bmad-workflow-builder/resources/skill-best-practices.md rename to src/skills/bmad-workflow-builder/references/skill-best-practices.md index df277a2..8e341c1 100644 --- a/src/skills/bmad-workflow-builder/resources/skill-best-practices.md +++ b/src/skills/bmad-workflow-builder/references/skill-best-practices.md @@ -1,6 +1,6 @@ # Skill Authoring Best Practices -Practical patterns for writing effective BMad skills. For field definitions and description format, see `resources/standard-fields.md`. For quality dimensions, see `resources/quality-dimensions.md`. +Practical patterns for writing effective BMad skills. For field definitions and description format, see `references/standard-fields.md`. For quality dimensions, see `references/quality-dimensions.md`. ## Core Principle: Informed Autonomy diff --git a/src/skills/bmad-workflow-builder/resources/standard-fields.md b/src/skills/bmad-workflow-builder/references/standard-fields.md similarity index 99% rename from src/skills/bmad-workflow-builder/resources/standard-fields.md rename to src/skills/bmad-workflow-builder/references/standard-fields.md index 2eb45bc..0f2d536 100644 --- a/src/skills/bmad-workflow-builder/resources/standard-fields.md +++ b/src/skills/bmad-workflow-builder/references/standard-fields.md @@ -102,8 +102,8 @@ This provides quick prompt priming for expertise and tone. Workflows may also us ### Skill-Internal Files Use bare relative paths (no prefix): -- `resources/reference.md` -- `prompts/01-discover.md` +- `references/reference.md` +- `01-discover.md` - `scripts/validate.py` ### Project `_bmad` Paths diff --git a/src/skills/bmad-workflow-builder/resources/template-substitution-rules.md b/src/skills/bmad-workflow-builder/references/template-substitution-rules.md similarity index 95% rename from src/skills/bmad-workflow-builder/resources/template-substitution-rules.md rename to src/skills/bmad-workflow-builder/references/template-substitution-rules.md index 0d706c7..fb89b3f 100644 --- a/src/skills/bmad-workflow-builder/resources/template-substitution-rules.md +++ b/src/skills/bmad-workflow-builder/references/template-substitution-rules.md @@ -80,6 +80,6 @@ Replace all content placeholders with skill-specific values: All generated skills use these paths: - `bmad-manifest.json` — Module metadata (if module-based) -- `resources/{reference}.md` — Reference documents loaded on demand -- `prompts/01-{stage}.md` — Numbered stage prompts (complex workflows) +- `references/{reference}.md` — Reference documents loaded on demand +- `01-{stage}.md` — Numbered stage prompts at skill root (complex workflows) - `scripts/` — Python/shell scripts for deterministic operations (if needed) diff --git a/src/skills/bmad-workflow-builder/agents/report-quality-scan-creator.md b/src/skills/bmad-workflow-builder/report-quality-scan-creator.md similarity index 100% rename from src/skills/bmad-workflow-builder/agents/report-quality-scan-creator.md rename to src/skills/bmad-workflow-builder/report-quality-scan-creator.md diff --git a/src/skills/bmad-workflow-builder/scripts/bmad-manifest-schema.json b/src/skills/bmad-workflow-builder/scripts/bmad-manifest-schema.json index 90e66db..ea674b5 100644 --- a/src/skills/bmad-workflow-builder/scripts/bmad-manifest-schema.json +++ b/src/skills/bmad-workflow-builder/scripts/bmad-manifest-schema.json @@ -61,7 +61,7 @@ }, "prompt": { - "description": "Relative path to the prompt file for internal capabilities (e.g., prompts/build-process.md). Omit if handled by SKILL.md directly or if this is an external skill call.", + "description": "Relative path to the prompt file for internal capabilities (e.g., build-process.md). Omit if handled by SKILL.md directly or if this is an external skill call.", "type": "string" }, "skill-name": { diff --git a/src/skills/bmad-workflow-builder/scripts/prepass-execution-deps.py b/src/skills/bmad-workflow-builder/scripts/prepass-execution-deps.py index 58e640e..af6d14e 100755 --- a/src/skills/bmad-workflow-builder/scripts/prepass-execution-deps.py +++ b/src/skills/bmad-workflow-builder/scripts/prepass-execution-deps.py @@ -146,8 +146,8 @@ def scan_sequential_patterns(filepath: Path, rel_path: str) -> list[dict]: # Subagent spawning from subagent (impossible) if re.search(r'(?i)spawn.*subagent|launch.*subagent|create.*subagent', content): - # Check if this file IS a subagent (lives in agents/) - if '/agents/' in rel_path or rel_path.startswith('agents/'): + # Check if this file IS a subagent (non-SKILL.md, non-numbered prompt at root) + if rel_path != 'SKILL.md' and not re.match(r'^\d+-', rel_path): patterns.append({ 'file': rel_path, 'type': 'subagent-chain-violation', @@ -190,12 +190,10 @@ def scan_execution_deps(skill_path: Path) -> dict: pass break - # Also check for stage-level manifests or stage definitions in SKILL.md - prompts_dir = skill_path / 'prompts' - if prompts_dir.exists(): - for f in sorted(prompts_dir.iterdir()): - if f.is_file() and f.suffix == '.md': - all_stages.add(f.stem) + # Also check for stage-level prompt files at skill root + for f in sorted(skill_path.iterdir()): + if f.is_file() and f.suffix == '.md' and f.name != 'SKILL.md': + all_stages.add(f.stem) # Cycle detection cycles = detect_cycles(dep_graph) @@ -206,15 +204,12 @@ def scan_execution_deps(skill_path: Path) -> dict: # Parallel groups parallel_groups = find_parallel_groups(dep_graph, all_stages) - # Sequential pattern detection across all prompt and agent files + # Sequential pattern detection across all prompt and agent files at root sequential_patterns = [] - for scan_dir in ['prompts', 'agents']: - d = skill_path / scan_dir - if d.exists(): - for f in sorted(d.iterdir()): - if f.is_file() and f.suffix == '.md': - patterns = scan_sequential_patterns(f, f'{scan_dir}/{f.name}') - sequential_patterns.extend(patterns) + for f in sorted(skill_path.iterdir()): + if f.is_file() and f.suffix == '.md' and f.name != 'SKILL.md': + patterns = scan_sequential_patterns(f, f.name) + sequential_patterns.extend(patterns) # Also scan SKILL.md skill_md = skill_path / 'SKILL.md' diff --git a/src/skills/bmad-workflow-builder/scripts/prepass-prompt-metrics.py b/src/skills/bmad-workflow-builder/scripts/prepass-prompt-metrics.py index 88bcd69..2408768 100755 --- a/src/skills/bmad-workflow-builder/scripts/prepass-prompt-metrics.py +++ b/src/skills/bmad-workflow-builder/scripts/prepass-prompt-metrics.py @@ -186,14 +186,12 @@ def scan_prompt_metrics(skill_path: Path) -> dict: data['is_skill_md'] = True files_data.append(data) - # Prompts - prompts_dir = skill_path / 'prompts' - if prompts_dir.exists(): - for f in sorted(prompts_dir.iterdir()): - if f.is_file() and f.suffix == '.md': - data = scan_file_patterns(f, f'prompts/{f.name}') - data['is_skill_md'] = False - files_data.append(data) + # Prompt files at skill root (non-SKILL.md .md files) + for f in sorted(skill_path.iterdir()): + if f.is_file() and f.suffix == '.md' and f.name != 'SKILL.md': + data = scan_file_patterns(f, f.name) + data['is_skill_md'] = False + files_data.append(data) # Resources (just sizes, for progressive disclosure assessment) resources_dir = skill_path / 'resources' diff --git a/src/skills/bmad-workflow-builder/scripts/prepass-workflow-integrity.py b/src/skills/bmad-workflow-builder/scripts/prepass-workflow-integrity.py index 62debb3..8767703 100755 --- a/src/skills/bmad-workflow-builder/scripts/prepass-workflow-integrity.py +++ b/src/skills/bmad-workflow-builder/scripts/prepass-workflow-integrity.py @@ -213,20 +213,19 @@ def find_template_artifacts(filepath: Path, rel_path: str) -> list[dict]: def cross_reference_stages(skill_path: Path, skill_content: str) -> tuple[dict, list[dict]]: - """Cross-reference stage files between SKILL.md and prompts/ directory.""" + """Cross-reference stage files between SKILL.md and numbered prompt files at skill root.""" findings = [] - prompts_dir = skill_path / 'prompts' - # Get actual prompt files + # Get actual numbered prompt files at skill root (exclude SKILL.md) actual_files = set() - if prompts_dir.exists(): - for f in prompts_dir.iterdir(): - if f.is_file() and f.suffix == '.md': - actual_files.add(f.name) + for f in skill_path.iterdir(): + if f.is_file() and f.suffix == '.md' and f.name != 'SKILL.md' and re.match(r'^\d+-', f.name): + actual_files.add(f.name) - # Find stage references in SKILL.md + # Find stage references in SKILL.md — look for both old prompts/ style and new root style referenced = set() - ref_pattern = re.compile(r'prompts/([^\s)]+\.md)') + # Match `prompts/XX-name.md` (legacy) or bare `XX-name.md` references + ref_pattern = re.compile(r'(?:prompts/)?(\d+-[^\s)`]+\.md)') for m in ref_pattern.finditer(skill_content): referenced.add(m.group(1)) @@ -236,16 +235,16 @@ def cross_reference_stages(skill_path: Path, skill_content: str) -> tuple[dict, findings.append({ 'file': 'SKILL.md', 'line': 0, 'severity': 'critical', 'category': 'missing-stage', - 'issue': f'Referenced stage file does not exist: prompts/{f}', + 'issue': f'Referenced stage file does not exist: {f}', }) # Orphaned files (exist but not referenced) orphaned = actual_files - referenced for f in sorted(orphaned): findings.append({ - 'file': f'prompts/{f}', 'line': 0, + 'file': f, 'line': 0, 'severity': 'medium', 'category': 'naming', - 'issue': f'Stage file exists but not referenced in SKILL.md: prompts/{f}', + 'issue': f'Stage file exists but not referenced in SKILL.md: {f}', }) # Stage numbering check @@ -263,7 +262,7 @@ def cross_reference_stages(skill_path: Path, skill_content: str) -> tuple[dict, gaps = set(expected) - set(nums) if gaps: findings.append({ - 'file': 'prompts/', 'line': 0, + 'file': skill_path.name, 'line': 0, 'severity': 'medium', 'category': 'naming', 'issue': f'Stage numbering has gaps: missing {sorted(gaps)}', }) @@ -283,15 +282,18 @@ def check_prompt_basics(skill_path: Path) -> tuple[list[dict], list[dict]]: """Check each prompt file for config header and progression conditions.""" findings = [] prompt_details = [] - prompts_dir = skill_path / 'prompts' - if not prompts_dir.exists(): + + # Look for numbered prompt files at skill root + prompt_files = sorted( + f for f in skill_path.iterdir() + if f.is_file() and f.suffix == '.md' and f.name != 'SKILL.md' and re.match(r'^\d+-', f.name) + ) + if not prompt_files: return prompt_details, findings - for f in sorted(prompts_dir.iterdir()): - if not f.is_file() or f.suffix != '.md': - continue + for f in prompt_files: content = f.read_text(encoding='utf-8') - rel_path = f'prompts/{f.name}' + rel_path = f.name detail = {'file': f.name, 'has_config_header': False, 'has_progression': False} # Config header check @@ -337,7 +339,7 @@ def check_prompt_basics(skill_path: Path) -> tuple[list[dict], list[dict]]: def detect_workflow_type(skill_content: str, has_prompts: bool) -> str: """Detect workflow type from SKILL.md content.""" - has_stage_refs = bool(re.search(r'prompts/\d+-', skill_content)) + has_stage_refs = bool(re.search(r'(?:prompts/)?\d+-\S+\.md', skill_content)) has_routing = bool(re.search(r'(?i)(rout|stage|branch|path)', skill_content)) if has_stage_refs or (has_prompts and has_routing): @@ -392,7 +394,10 @@ def scan_workflow_integrity(skill_path: Path) -> dict: }) # Workflow type - has_prompts = (skill_path / 'prompts').exists() + has_prompts = any( + f.is_file() and f.suffix == '.md' and f.name != 'SKILL.md' and re.match(r'^\d+-', f.name) + for f in skill_path.iterdir() + ) workflow_type = detect_workflow_type(skill_content, has_prompts) # Stage cross-reference diff --git a/src/skills/bmad-workflow-builder/scripts/scan-path-standards.py b/src/skills/bmad-workflow-builder/scripts/scan-path-standards.py index b4d3fc8..13e6252 100755 --- a/src/skills/bmad-workflow-builder/scripts/scan-path-standards.py +++ b/src/skills/bmad-workflow-builder/scripts/scan-path-standards.py @@ -129,9 +129,6 @@ def scan_skill(skill_path: Path, skip_fenced: bool = True) -> dict: files_scanned = [] for md_file in md_files: - # Skip tests/fixtures - if 'tests/fixtures' in str(md_file): - continue rel = md_file.relative_to(skill_path) files_scanned.append(str(rel)) file_findings = scan_file(md_file, skip_fenced) diff --git a/src/skills/bmad-workflow-builder/tests/fixtures/complex/SKILL.md b/src/skills/bmad-workflow-builder/tests/fixtures/complex/SKILL.md deleted file mode 100644 index f3e2fb5..0000000 --- a/src/skills/bmad-workflow-builder/tests/fixtures/complex/SKILL.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -name: bmad-cq-code-review -description: Use when the user requests to "review code", "code quality check", or "run code review workflow". Multi-stage code review with automated analysis and consolidated reporting. ---- - -# Code Review Workflow - -## Overview - -This skill helps you perform thorough, consistent code reviews through a multi-stage process. Act as a senior code reviewer, guiding the review through discovery, planning, multi-pass analysis, and consolidated reporting. Your output is a comprehensive code review report with actionable findings. - -## On Activation - -1. **Load config via bmad-init skill** — Store all returned vars - - Use `{user_name}` for greeting - - Use `{communication_language}` for communications - - Use `{document_output_language}` for the review report - -2. **Greet user** as `{user_name}` - -3. **Check if review in progress:** - - If output doc exists: read to determine current stage, resume - - Else: Start at `prompts/01-discover.md` - -4. **Route to appropriate stage** - -## Stages - -| # | Stage | Purpose | Prompt | -|---|-------|---------|--------| -| 1 | discover | Identify files and scope for review | `prompts/01-discover.md` | -| 2 | plan | Create review strategy and checklist | `prompts/02-plan.md` | -| 3 | analyze | Multi-pass code analysis | `prompts/03-analyze.md` | -| 4 | report | Generate consolidated review report | `prompts/04-report.md` | diff --git a/src/skills/bmad-workflow-builder/tests/fixtures/complex/bmad-manifest.json b/src/skills/bmad-workflow-builder/tests/fixtures/complex/bmad-manifest.json deleted file mode 100644 index 2e70331..0000000 --- a/src/skills/bmad-workflow-builder/tests/fixtures/complex/bmad-manifest.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "module-code": "cq", - "capabilities": [ - { - "name": "code-review", - "menu-code": "CR", - "description": "Multi-stage code review with analysis and reporting.", - "phase-name": "development", - "is-required": false, - "after": [], - "before": [], - "output-location": "{code_review_output_folder}" - } - ] -} diff --git a/src/skills/bmad-workflow-builder/tests/fixtures/deficient/SKILL.md b/src/skills/bmad-workflow-builder/tests/fixtures/deficient/SKILL.md deleted file mode 100644 index c7ad94a..0000000 --- a/src/skills/bmad-workflow-builder/tests/fixtures/deficient/SKILL.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -name: my-workflow -description: Does stuff ---- - -# My Workflow - -This workflow does things. It should be helpful. - -## Steps - -1. Do the first thing -2. Handle appropriately -3. Make sure everything is good -4. You should probably check the output - -## On Activation - -Please load the config and then do the workflow steps above. Don't forget to greet the user! From 031f8beececbe6f1ac93f71cc392cc04f4b01a86 Mon Sep 17 00:00:00 2001 From: Brian Madison Date: Sun, 15 Mar 2026 17:49:53 -0500 Subject: [PATCH 2/6] refactor: update samples to match new skill folder conventions - Move prompts/ and agents/ files to skill root in all three samples - Rename resources/ to references/ - Update all internal path references Co-Authored-By: Claude Opus 4.6 (1M context) --- samples/bmad-agent-dream-weaver/SKILL.md | 12 +- .../bmad-manifest.json | 16 +- .../{prompts => }/dream-interpret.md | 0 .../{prompts => }/dream-log.md | 0 .../{prompts => }/dream-query.md | 0 .../{prompts => }/dream-seed.md | 0 .../{prompts => }/headless-wake.md | 0 .../{prompts => }/init.md | 0 .../{prompts => }/lucid-coach.md | 0 .../{prompts => }/pattern-discovery.md | 0 .../{prompts => }/recall-training.md | 0 .../memory-system.md | 2 +- .../{prompts => }/save-memory.md | 0 .../bmad-bmm-product-brief-preview/SKILL.md | 12 +- .../{agents => }/artifact-analyzer.md | 0 .../{prompts => }/contextual-discovery.md | 14 +- .../{prompts => }/draft-and-review.md | 10 +- .../{prompts => }/finalize.md | 2 +- .../{prompts => }/guided-elicitation.md | 4 +- .../{agents => }/opportunity-reviewer.md | 0 .../brief-template.md | 0 .../{agents => }/skeptic-reviewer.md | 0 .../{agents => }/web-researcher.md | 0 samples/bmad-excalidraw/SKILL.md | 10 +- samples/bmad-excalidraw/bmad-manifest.json | 4 +- .../{prompts => }/diagram-generation.md | 2 +- .../{prompts => }/guided-design.md | 4 +- .../diagram-types.md | 0 .../excalidraw-schema.md | 0 .../bmad-distillation-generator-spec.md | 347 ------------------ ...bmad-next-gen-installer-discovery-notes.md | 120 ------ ...rief-bmad-next-gen-installer-distillate.md | 109 ------ .../product-brief-bmad-next-gen-installer.md | 96 ----- 33 files changed, 46 insertions(+), 718 deletions(-) rename samples/bmad-agent-dream-weaver/{prompts => }/dream-interpret.md (100%) rename samples/bmad-agent-dream-weaver/{prompts => }/dream-log.md (100%) rename samples/bmad-agent-dream-weaver/{prompts => }/dream-query.md (100%) rename samples/bmad-agent-dream-weaver/{prompts => }/dream-seed.md (100%) rename samples/bmad-agent-dream-weaver/{prompts => }/headless-wake.md (100%) rename samples/bmad-agent-dream-weaver/{prompts => }/init.md (100%) rename samples/bmad-agent-dream-weaver/{prompts => }/lucid-coach.md (100%) rename samples/bmad-agent-dream-weaver/{prompts => }/pattern-discovery.md (100%) rename samples/bmad-agent-dream-weaver/{prompts => }/recall-training.md (100%) rename samples/bmad-agent-dream-weaver/{resources => references}/memory-system.md (98%) rename samples/bmad-agent-dream-weaver/{prompts => }/save-memory.md (100%) rename samples/bmad-bmm-product-brief-preview/{agents => }/artifact-analyzer.md (100%) rename samples/bmad-bmm-product-brief-preview/{prompts => }/contextual-discovery.md (72%) rename samples/bmad-bmm-product-brief-preview/{prompts => }/draft-and-review.md (84%) rename samples/bmad-bmm-product-brief-preview/{prompts => }/finalize.md (97%) rename samples/bmad-bmm-product-brief-preview/{prompts => }/guided-elicitation.md (96%) rename samples/bmad-bmm-product-brief-preview/{agents => }/opportunity-reviewer.md (100%) rename samples/bmad-bmm-product-brief-preview/{resources => references}/brief-template.md (100%) rename samples/bmad-bmm-product-brief-preview/{agents => }/skeptic-reviewer.md (100%) rename samples/bmad-bmm-product-brief-preview/{agents => }/web-researcher.md (100%) rename samples/bmad-excalidraw/{prompts => }/diagram-generation.md (97%) rename samples/bmad-excalidraw/{prompts => }/guided-design.md (94%) rename samples/bmad-excalidraw/{resources => references}/diagram-types.md (100%) rename samples/bmad-excalidraw/{resources => references}/excalidraw-schema.md (100%) delete mode 100644 samples/planning-artifacts/bmad-distillation-generator-spec.md delete mode 100644 samples/planning-artifacts/product-brief-bmad-next-gen-installer-discovery-notes.md delete mode 100644 samples/planning-artifacts/product-brief-bmad-next-gen-installer-distillate.md delete mode 100644 samples/planning-artifacts/product-brief-bmad-next-gen-installer.md diff --git a/samples/bmad-agent-dream-weaver/SKILL.md b/samples/bmad-agent-dream-weaver/SKILL.md index f77ae9c..6eeb309 100644 --- a/samples/bmad-agent-dream-weaver/SKILL.md +++ b/samples/bmad-agent-dream-weaver/SKILL.md @@ -17,7 +17,7 @@ This skill provides a Dream Analyst and Lucid Dreaming Coach who helps users cap - Look for `--headless` in the activation context - If `--headless:{task-name}` → run that specific headless task - If just `--headless` → run default headless wake behavior - - Load and execute `prompts/headless-wake.md` with task context + - Load and execute `headless-wake.md` with task context - Do NOT load config, do NOT greet user, do NOT show menu - Execute task, write results, exit silently @@ -64,24 +64,24 @@ Oneira speaks with gentle poetic flair grounded in real knowledge. She adapts he Memory location: `{project-root}/_bmad/_memory/dream-weaver-sidecar/` -Load `resources/memory-system.md` for memory discipline and structure. +Load `references/memory-system.md` for memory discipline and structure. ## On Activation 1. **Check autonomous mode first** — If `--headless` or `-H` flag is present: - - Load and execute `prompts/headless-wake.md` with task context + - Load and execute `headless-wake.md` with task context - Do NOT load config, do NOT greet user, do NOT show menu - Execute task, write results, exit silently - **Stop here — do not continue to step 2** 2. **Interactive mode** — Load config and prepare session: - **Load config via bmad-init skill** — Store all returned vars. Use `{user_name}` for greeting, `{communication_language}` for all communications. - - **Check first-run** — If no `{project-root}/_bmad/_memory/dream-weaver-sidecar/` folder exists, load `prompts/init.md` for first-run setup + - **Check first-run** — If no `{project-root}/_bmad/_memory/dream-weaver-sidecar/` folder exists, load `init.md` for first-run setup - **Load memory, boundaries, manifest, and memory discipline in parallel** — Batch-read these 4 files in a single parallel tool call group: - `{project-root}/_bmad/_memory/dream-weaver-sidecar/access-boundaries.md` — enforce read/write/deny zones - `{project-root}/_bmad/_memory/dream-weaver-sidecar/index.md` — essential context and previous session - `bmad-manifest.json` — set `{capabilities}` list - - `resources/memory-system.md` — memory discipline and structure + - `references/memory-system.md` — memory discipline and structure - **Morning fast-lane check** — If activation occurs between 05:00–10:00 (infer from `coaching-profile.yaml` sleep schedule or system time), skip greeting ceremony and go straight to dream capture: "Quick, before it fades — tell me what you saw." Load menu AFTER capture is complete. - **Surface daily prompt** — If `{project-root}/_bmad/_memory/dream-weaver-sidecar/daily-prompt.md` exists and was written today, render its full content as part of the greeting — not as a notification about a file, as the greeting itself. - **Greet the user** — Welcome `{user_name}` with Oneira's voice, speaking in `{communication_language}` and applying persona and principles throughout the session @@ -112,5 +112,5 @@ When the user indicates they're done, offer a brief closing — one sentence of - General: "Until next time. Your dreams will keep weaving whether I'm here or not." **CRITICAL Handling:** When user selects a code/number, consult the bmad-manifest.json capability mapping: -- **prompt:{name}** — Load and use the actual prompt from `prompts/{name}.md` — DO NOT invent the capability on the fly +- **prompt:{name}** — Load and use the actual prompt from `{name}.md` — DO NOT invent the capability on the fly - **skill:{name}** — Invoke the skill by its exact registered name diff --git a/samples/bmad-agent-dream-weaver/bmad-manifest.json b/samples/bmad-agent-dream-weaver/bmad-manifest.json index 5cb670f..6de4d0d 100644 --- a/samples/bmad-agent-dream-weaver/bmad-manifest.json +++ b/samples/bmad-agent-dream-weaver/bmad-manifest.json @@ -7,56 +7,56 @@ "menu-code": "DL", "description": "Capture a dream through guided conversation.", "type": "prompt", - "prompt": "prompts/dream-log.md" + "prompt": "dream-log.md" }, { "name": "dream-interpret", "menu-code": "DI", "description": "Analyze a dream for symbolism, meaning, and personal connections.", "type": "prompt", - "prompt": "prompts/dream-interpret.md" + "prompt": "dream-interpret.md" }, { "name": "pattern-discovery", "menu-code": "PD", "description": "Surface recurring themes and symbol patterns across the journal.", "type": "prompt", - "prompt": "prompts/pattern-discovery.md" + "prompt": "pattern-discovery.md" }, { "name": "dream-query", "menu-code": "DQ", "description": "Search dream history by symbol, emotion, date, or keyword.", "type": "prompt", - "prompt": "prompts/dream-query.md" + "prompt": "dream-query.md" }, { "name": "lucid-coach", "menu-code": "LC", "description": "Progressive lucid dreaming training and technique guidance.", "type": "prompt", - "prompt": "prompts/lucid-coach.md" + "prompt": "lucid-coach.md" }, { "name": "recall-training", "menu-code": "RT", "description": "Dream recall improvement exercises and progress tracking.", "type": "prompt", - "prompt": "prompts/recall-training.md" + "prompt": "recall-training.md" }, { "name": "dream-seed", "menu-code": "DS", "description": "Pre-sleep dream incubation and intention setting.", "type": "prompt", - "prompt": "prompts/dream-seed.md" + "prompt": "dream-seed.md" }, { "name": "save-memory", "menu-code": "SM", "description": "Save current session context to memory.", "type": "prompt", - "prompt": "prompts/save-memory.md" + "prompt": "save-memory.md" } ] } diff --git a/samples/bmad-agent-dream-weaver/prompts/dream-interpret.md b/samples/bmad-agent-dream-weaver/dream-interpret.md similarity index 100% rename from samples/bmad-agent-dream-weaver/prompts/dream-interpret.md rename to samples/bmad-agent-dream-weaver/dream-interpret.md diff --git a/samples/bmad-agent-dream-weaver/prompts/dream-log.md b/samples/bmad-agent-dream-weaver/dream-log.md similarity index 100% rename from samples/bmad-agent-dream-weaver/prompts/dream-log.md rename to samples/bmad-agent-dream-weaver/dream-log.md diff --git a/samples/bmad-agent-dream-weaver/prompts/dream-query.md b/samples/bmad-agent-dream-weaver/dream-query.md similarity index 100% rename from samples/bmad-agent-dream-weaver/prompts/dream-query.md rename to samples/bmad-agent-dream-weaver/dream-query.md diff --git a/samples/bmad-agent-dream-weaver/prompts/dream-seed.md b/samples/bmad-agent-dream-weaver/dream-seed.md similarity index 100% rename from samples/bmad-agent-dream-weaver/prompts/dream-seed.md rename to samples/bmad-agent-dream-weaver/dream-seed.md diff --git a/samples/bmad-agent-dream-weaver/prompts/headless-wake.md b/samples/bmad-agent-dream-weaver/headless-wake.md similarity index 100% rename from samples/bmad-agent-dream-weaver/prompts/headless-wake.md rename to samples/bmad-agent-dream-weaver/headless-wake.md diff --git a/samples/bmad-agent-dream-weaver/prompts/init.md b/samples/bmad-agent-dream-weaver/init.md similarity index 100% rename from samples/bmad-agent-dream-weaver/prompts/init.md rename to samples/bmad-agent-dream-weaver/init.md diff --git a/samples/bmad-agent-dream-weaver/prompts/lucid-coach.md b/samples/bmad-agent-dream-weaver/lucid-coach.md similarity index 100% rename from samples/bmad-agent-dream-weaver/prompts/lucid-coach.md rename to samples/bmad-agent-dream-weaver/lucid-coach.md diff --git a/samples/bmad-agent-dream-weaver/prompts/pattern-discovery.md b/samples/bmad-agent-dream-weaver/pattern-discovery.md similarity index 100% rename from samples/bmad-agent-dream-weaver/prompts/pattern-discovery.md rename to samples/bmad-agent-dream-weaver/pattern-discovery.md diff --git a/samples/bmad-agent-dream-weaver/prompts/recall-training.md b/samples/bmad-agent-dream-weaver/recall-training.md similarity index 100% rename from samples/bmad-agent-dream-weaver/prompts/recall-training.md rename to samples/bmad-agent-dream-weaver/recall-training.md diff --git a/samples/bmad-agent-dream-weaver/resources/memory-system.md b/samples/bmad-agent-dream-weaver/references/memory-system.md similarity index 98% rename from samples/bmad-agent-dream-weaver/resources/memory-system.md rename to samples/bmad-agent-dream-weaver/references/memory-system.md index 18de958..bbb6b2b 100644 --- a/samples/bmad-agent-dream-weaver/resources/memory-system.md +++ b/samples/bmad-agent-dream-weaver/references/memory-system.md @@ -200,4 +200,4 @@ Regularly (every few sessions or when files grow large): ## First Run -If sidecar doesn't exist, load `prompts/init.md` to create the structure. +If sidecar doesn't exist, load `init.md` to create the structure. diff --git a/samples/bmad-agent-dream-weaver/prompts/save-memory.md b/samples/bmad-agent-dream-weaver/save-memory.md similarity index 100% rename from samples/bmad-agent-dream-weaver/prompts/save-memory.md rename to samples/bmad-agent-dream-weaver/save-memory.md diff --git a/samples/bmad-bmm-product-brief-preview/SKILL.md b/samples/bmad-bmm-product-brief-preview/SKILL.md index 7e1daaf..6242141 100644 --- a/samples/bmad-bmm-product-brief-preview/SKILL.md +++ b/samples/bmad-bmm-product-brief-preview/SKILL.md @@ -19,7 +19,7 @@ Check activation context immediately: 1. **Autonomous mode**: If the user passes `--headless`/`-H` flags, or provides structured inputs clearly intended for headless execution: - Ingest all provided inputs, fan out subagents, produce complete brief without interaction - - Route directly to `prompts/contextual-discovery.md` with `{mode}=headless` + - Route directly to `contextual-discovery.md` with `{mode}=headless` 2. **Yolo mode**: If the user passes `--yolo` or says "just draft it" / "draft the whole thing": - Ingest everything, draft complete brief upfront, then walk user through refinement @@ -69,17 +69,17 @@ Check activation context immediately: **Capture-don't-interrupt:** If the user shares details beyond brief scope (requirements, platform preferences, technical constraints, timeline), capture them silently for the distillate. Don't redirect or stop their flow. -**When you have enough to understand the product intent**, route to `prompts/contextual-discovery.md` with the current mode. +**When you have enough to understand the product intent**, route to `contextual-discovery.md` with the current mode. ## Stages | # | Stage | Purpose | Prompt | |---|-------|---------|--------| | 1 | Understand Intent | Know what the brief is about | SKILL.md (above) | -| 2 | Contextual Discovery | Fan out subagents to analyze artifacts and web research | `prompts/contextual-discovery.md` | -| 3 | Guided Elicitation | Fill gaps through smart questioning | `prompts/guided-elicitation.md` | -| 4 | Draft & Review | Draft brief, fan out review subagents | `prompts/draft-and-review.md` | -| 5 | Finalize | Polish, output, offer distillate | `prompts/finalize.md` | +| 2 | Contextual Discovery | Fan out subagents to analyze artifacts and web research | `contextual-discovery.md` | +| 3 | Guided Elicitation | Fill gaps through smart questioning | `guided-elicitation.md` | +| 4 | Draft & Review | Draft brief, fan out review subagents | `draft-and-review.md` | +| 5 | Finalize | Polish, output, offer distillate | `finalize.md` | ## External Skills diff --git a/samples/bmad-bmm-product-brief-preview/agents/artifact-analyzer.md b/samples/bmad-bmm-product-brief-preview/artifact-analyzer.md similarity index 100% rename from samples/bmad-bmm-product-brief-preview/agents/artifact-analyzer.md rename to samples/bmad-bmm-product-brief-preview/artifact-analyzer.md diff --git a/samples/bmad-bmm-product-brief-preview/prompts/contextual-discovery.md b/samples/bmad-bmm-product-brief-preview/contextual-discovery.md similarity index 72% rename from samples/bmad-bmm-product-brief-preview/prompts/contextual-discovery.md rename to samples/bmad-bmm-product-brief-preview/contextual-discovery.md index 2fe7ed2..37097fb 100644 --- a/samples/bmad-bmm-product-brief-preview/prompts/contextual-discovery.md +++ b/samples/bmad-bmm-product-brief-preview/contextual-discovery.md @@ -12,9 +12,9 @@ Now that you know what the brief is about, fan out subagents in parallel to gath **Launch in parallel:** -1. **Artifact Analyzer** (`agents/artifact-analyzer.md`) — Scans `{planning_artifacts}` and `{project_knowledge}` for relevant documents. Also scans any specific paths the user provided. Returns structured synthesis of what it found. +1. **Artifact Analyzer** (`artifact-analyzer.md`) — Scans `{planning_artifacts}` and `{project_knowledge}` for relevant documents. Also scans any specific paths the user provided. Returns structured synthesis of what it found. -2. **Web Researcher** (`agents/web-researcher.md`) — Searches for competitive landscape, market context, trends, and relevant industry data. Returns structured findings scoped to the product domain. +2. **Web Researcher** (`web-researcher.md`) — Searches for competitive landscape, market context, trends, and relevant industry data. Returns structured findings scoped to the product domain. ### Graceful Degradation @@ -38,20 +38,20 @@ Once subagent results return (or inline scanning completes): - Highlight anything surprising or worth discussing - Share the gaps you've identified - Ask: "Anything else you'd like to add, or shall we move on to filling in the details?" -- Route to `prompts/guided-elicitation.md` +- Route to `guided-elicitation.md` **Yolo mode:** - Absorb all findings silently -- Skip directly to `prompts/draft-and-review.md` — you have enough to draft +- Skip directly to `draft-and-review.md` — you have enough to draft - The user will refine later **Autonomous mode:** - Absorb all findings -- Skip directly to `prompts/draft-and-review.md` +- Skip directly to `draft-and-review.md` - No interaction ## Stage Complete This stage is complete when subagent results (or inline scanning fallback) have returned and findings are merged with user context. Route per mode: -- **Guided** → `prompts/guided-elicitation.md` -- **Yolo / Autonomous** → `prompts/draft-and-review.md` +- **Guided** → `guided-elicitation.md` +- **Yolo / Autonomous** → `draft-and-review.md` diff --git a/samples/bmad-bmm-product-brief-preview/prompts/draft-and-review.md b/samples/bmad-bmm-product-brief-preview/draft-and-review.md similarity index 84% rename from samples/bmad-bmm-product-brief-preview/prompts/draft-and-review.md rename to samples/bmad-bmm-product-brief-preview/draft-and-review.md index 23e65ca..ffd8874 100644 --- a/samples/bmad-bmm-product-brief-preview/prompts/draft-and-review.md +++ b/samples/bmad-bmm-product-brief-preview/draft-and-review.md @@ -8,7 +8,7 @@ ## Step 1: Draft the Executive Brief -Use `resources/brief-template.md` as a guide — adapt structure to fit the product's story. +Use `references/brief-template.md` as a guide — adapt structure to fit the product's story. **Writing principles:** - **Executive audience** — persuasive, clear, concise. 1-2 pages. @@ -36,9 +36,9 @@ Before showing the draft to the user, run it through multiple review lenses in p **Launch in parallel:** -1. **Skeptic Reviewer** (`agents/skeptic-reviewer.md`) — "What's missing? What assumptions are untested? What could go wrong? Where is the brief vague or hand-wavy?" +1. **Skeptic Reviewer** (`skeptic-reviewer.md`) — "What's missing? What assumptions are untested? What could go wrong? Where is the brief vague or hand-wavy?" -2. **Opportunity Reviewer** (`agents/opportunity-reviewer.md`) — "What adjacent value propositions are being missed? What market angles or partnerships could strengthen this? What's underemphasized?" +2. **Opportunity Reviewer** (`opportunity-reviewer.md`) — "What adjacent value propositions are being missed? What market angles or partnerships could strengthen this? What's underemphasized?" 3. **Contextual Reviewer** — You (the main agent) pick the most useful third lens based on THIS specific product. Choose the lens that addresses the SINGLE BIGGEST RISK that the skeptic and opportunity reviewers won't naturally catch. Examples: - For healthtech: "Regulatory and compliance risk reviewer" @@ -65,7 +65,7 @@ After all reviews complete: ## Step 4: Present to User -**Autonomous mode:** Skip to `prompts/finalize.md` — no user interaction. Save the improved draft directly. +**Autonomous mode:** Skip to `finalize.md` — no user interaction. Save the improved draft directly. **Yolo and Guided modes:** @@ -83,4 +83,4 @@ Present reviewer findings with brief rationale, then offer: "Want me to dig into ## Stage Complete -This stage is complete when: (a) the draft has been reviewed by all three lenses and improvements integrated, AND either (autonomous) save and route directly, or (guided/yolo) the user is satisfied. Route to `prompts/finalize.md`. +This stage is complete when: (a) the draft has been reviewed by all three lenses and improvements integrated, AND either (autonomous) save and route directly, or (guided/yolo) the user is satisfied. Route to `finalize.md`. diff --git a/samples/bmad-bmm-product-brief-preview/prompts/finalize.md b/samples/bmad-bmm-product-brief-preview/finalize.md similarity index 97% rename from samples/bmad-bmm-product-brief-preview/prompts/finalize.md rename to samples/bmad-bmm-product-brief-preview/finalize.md index abcfdcf..5157ada 100644 --- a/samples/bmad-bmm-product-brief-preview/prompts/finalize.md +++ b/samples/bmad-bmm-product-brief-preview/finalize.md @@ -72,4 +72,4 @@ purpose: "Token-efficient context for downstream PRD creation" ## Stage Complete -This is the terminal stage. After delivering the completion message and file paths, the workflow is done. If the user requests further revisions, loop back to `prompts/draft-and-review.md`. Otherwise, exit. +This is the terminal stage. After delivering the completion message and file paths, the workflow is done. If the user requests further revisions, loop back to `draft-and-review.md`. Otherwise, exit. diff --git a/samples/bmad-bmm-product-brief-preview/prompts/guided-elicitation.md b/samples/bmad-bmm-product-brief-preview/guided-elicitation.md similarity index 96% rename from samples/bmad-bmm-product-brief-preview/prompts/guided-elicitation.md rename to samples/bmad-bmm-product-brief-preview/guided-elicitation.md index ec2e770..a5d0e3a 100644 --- a/samples/bmad-bmm-product-brief-preview/prompts/guided-elicitation.md +++ b/samples/bmad-bmm-product-brief-preview/guided-elicitation.md @@ -5,7 +5,7 @@ **Goal:** Fill the gaps in what you know. By now you have the user's brain dump, artifact analysis, and web research. This stage is about smart, targeted questioning — not rote section-by-section interrogation. -**Skip this stage entirely in Yolo and Autonomous modes** — go directly to `prompts/draft-and-review.md`. +**Skip this stage entirely in Yolo and Autonomous modes** — go directly to `draft-and-review.md`. ## Approach @@ -67,4 +67,4 @@ If the user is providing complete, confident answers and you have solid coverage ## Stage Complete -This stage is complete when sufficient substance exists to draft a compelling brief and the user confirms readiness. Route to `prompts/draft-and-review.md`. +This stage is complete when sufficient substance exists to draft a compelling brief and the user confirms readiness. Route to `draft-and-review.md`. diff --git a/samples/bmad-bmm-product-brief-preview/agents/opportunity-reviewer.md b/samples/bmad-bmm-product-brief-preview/opportunity-reviewer.md similarity index 100% rename from samples/bmad-bmm-product-brief-preview/agents/opportunity-reviewer.md rename to samples/bmad-bmm-product-brief-preview/opportunity-reviewer.md diff --git a/samples/bmad-bmm-product-brief-preview/resources/brief-template.md b/samples/bmad-bmm-product-brief-preview/references/brief-template.md similarity index 100% rename from samples/bmad-bmm-product-brief-preview/resources/brief-template.md rename to samples/bmad-bmm-product-brief-preview/references/brief-template.md diff --git a/samples/bmad-bmm-product-brief-preview/agents/skeptic-reviewer.md b/samples/bmad-bmm-product-brief-preview/skeptic-reviewer.md similarity index 100% rename from samples/bmad-bmm-product-brief-preview/agents/skeptic-reviewer.md rename to samples/bmad-bmm-product-brief-preview/skeptic-reviewer.md diff --git a/samples/bmad-bmm-product-brief-preview/agents/web-researcher.md b/samples/bmad-bmm-product-brief-preview/web-researcher.md similarity index 100% rename from samples/bmad-bmm-product-brief-preview/agents/web-researcher.md rename to samples/bmad-bmm-product-brief-preview/web-researcher.md diff --git a/samples/bmad-excalidraw/SKILL.md b/samples/bmad-excalidraw/SKILL.md index 33d0cb0..8ca1b18 100644 --- a/samples/bmad-excalidraw/SKILL.md +++ b/samples/bmad-excalidraw/SKILL.md @@ -42,19 +42,19 @@ Produce professional diagrams and visual aids as Excalidraw files through conver 3. **Detect diagram intent from user's request:** - What do they want to visualize? - - Did they specify a diagram type? If so, validate against `resources/diagram-types.md` + - Did they specify a diagram type? If so, validate against `references/diagram-types.md` - Did they specify enough detail to skip guided design? 4. **Route by mode:** - - Autonomous/YOLO → `prompts/diagram-generation.md` directly - - Guided → `prompts/guided-design.md` first, then `prompts/diagram-generation.md` + - Autonomous/YOLO → `diagram-generation.md` directly + - Guided → `guided-design.md` first, then `diagram-generation.md` ## Stages | # | Stage | Purpose | Prompt | |---|-------|---------|--------| -| 1 | Guided Design | Creative facilitation — brainstorm diagram type, content, layout | `prompts/guided-design.md` | -| 2 | Generation | Produce the `.excalidraw` file with proper layout | `prompts/diagram-generation.md` | +| 1 | Guided Design | Creative facilitation — brainstorm diagram type, content, layout | `guided-design.md` | +| 2 | Generation | Produce the `.excalidraw` file with proper layout | `diagram-generation.md` | Headless: skip guided-design, output file path on completion. diff --git a/samples/bmad-excalidraw/bmad-manifest.json b/samples/bmad-excalidraw/bmad-manifest.json index 3134061..f628727 100644 --- a/samples/bmad-excalidraw/bmad-manifest.json +++ b/samples/bmad-excalidraw/bmad-manifest.json @@ -5,14 +5,14 @@ "menu-code": "GD", "description": "Facilitates diagram design through conversational discovery.", "supports-headless": true, - "prompt": "prompts/guided-design.md" + "prompt": "guided-design.md" }, { "name": "diagram-generation", "menu-code": "DG", "description": "Generates Excalidraw diagram files from specifications.", "supports-headless": true, - "prompt": "prompts/diagram-generation.md" + "prompt": "diagram-generation.md" } ] } diff --git a/samples/bmad-excalidraw/prompts/diagram-generation.md b/samples/bmad-excalidraw/diagram-generation.md similarity index 97% rename from samples/bmad-excalidraw/prompts/diagram-generation.md rename to samples/bmad-excalidraw/diagram-generation.md index 4228555..79b3584 100644 --- a/samples/bmad-excalidraw/prompts/diagram-generation.md +++ b/samples/bmad-excalidraw/diagram-generation.md @@ -9,7 +9,7 @@ Generate a valid `.excalidraw` file from the diagram specification. Use the sche ## Step 1: Build the Diagram Specification -Create a JSON specification that the generation script can consume. Load `resources/excalidraw-schema.md` for the element format reference. +Create a JSON specification that the generation script can consume. Load `references/excalidraw-schema.md` for the element format reference. The specification format: diff --git a/samples/bmad-excalidraw/prompts/guided-design.md b/samples/bmad-excalidraw/guided-design.md similarity index 94% rename from samples/bmad-excalidraw/prompts/guided-design.md rename to samples/bmad-excalidraw/guided-design.md index 81122d0..7990c53 100644 --- a/samples/bmad-excalidraw/prompts/guided-design.md +++ b/samples/bmad-excalidraw/guided-design.md @@ -15,7 +15,7 @@ Capture any details they've already provided — don't re-ask what they've told ## Step 2: Suggest Diagram Type -Load `resources/diagram-types.md` for the full catalog. +Load `references/diagram-types.md` for the full catalog. Based on what you know, suggest the best-fit diagram type(s) with reasoning: @@ -77,4 +77,4 @@ Ask: "Ready to generate, or want to adjust anything?" ## Progression -When the user confirms → proceed to `prompts/diagram-generation.md` with the complete specification. +When the user confirms → proceed to `diagram-generation.md` with the complete specification. diff --git a/samples/bmad-excalidraw/resources/diagram-types.md b/samples/bmad-excalidraw/references/diagram-types.md similarity index 100% rename from samples/bmad-excalidraw/resources/diagram-types.md rename to samples/bmad-excalidraw/references/diagram-types.md diff --git a/samples/bmad-excalidraw/resources/excalidraw-schema.md b/samples/bmad-excalidraw/references/excalidraw-schema.md similarity index 100% rename from samples/bmad-excalidraw/resources/excalidraw-schema.md rename to samples/bmad-excalidraw/references/excalidraw-schema.md diff --git a/samples/planning-artifacts/bmad-distillation-generator-spec.md b/samples/planning-artifacts/bmad-distillation-generator-spec.md deleted file mode 100644 index c11e750..0000000 --- a/samples/planning-artifacts/bmad-distillation-generator-spec.md +++ /dev/null @@ -1,347 +0,0 @@ ---- -title: "Skill Spec: bmad-distillation-generator" -status: "complete" -created: "2026-03-13" -purpose: "Full specification for the skill builder agent to implement" -reference-skill: "bmad-bmm-product-brief-preview (use as architectural pattern)" ---- - -# bmad-distillation-generator — Skill Specification - -## Purpose - -A general-purpose utility skill that takes any set of input documents and produces a single hyper-compressed, token-efficient document (a "distillate") that an LLM can consume as sole context input for downstream workflows. The distillate is **lossless compression for an LLM reader** — every fact, decision, constraint, and relationship from the source documents is preserved, but all overhead that humans need and LLMs don't is stripped. - -This is a compression task, not a capture task. The skill assumes all relevant information has already been captured in the source documents. Its job is to produce the most token-efficient representation possible without losing signal. - -## What a Distillate Is - -A distillate is NOT a summary. Summaries are lossy — they capture the gist but drop detail. A distillate preserves all detail through lossless compression optimized for LLM consumption: - -- Every fact, decision, and constraint appears exactly once -- No prose transitions, rhetoric, or persuasion -- No repetition — deduplicated across all source documents -- No formatting for human scannability (decorative bold, whitespace for visual breathing room) -- No explaining things an LLM already knows (common terms, well-known companies, standard concepts) -- No hedging language ("we believe", "it's likely that") — state the signal directly -- Relationships between items are explicit, not implied -- Each item carries enough context to be understood without the source documents -- Rejected ideas and open questions are preserved — they prevent downstream re-proposal - -**Format:** Dense thematically-grouped bullets. Markdown structure for hierarchy only (## for themes, - for items). No decorative formatting. Every token carries signal. - -## Activation & Inputs - -### Required Inputs -- **source_documents** — One or more file paths or inline content to distill - -### Optional Inputs -- **downstream_consumer** — What workflow or agent will consume this distillate (e.g., "PRD creation", "architecture design", "story implementation"). When provided, the compressor uses this to judge what's signal vs noise. When omitted, preserve everything — no filtering. -- **token_budget** — Approximate target size. When provided and the distillate would exceed it, trigger semantic splitting. When omitted, produce the smallest possible single document. -- **output_path** — Where to save the distillate. When omitted, save adjacent to the primary source document with `-distillate.md` suffix. - -### Flags -- **--validate** — After producing the distillate, run a round-trip reconstruction test (see Validation section below) - -### Activation Modes -- **Direct invocation:** User calls the skill with inputs -- **Called by another skill:** Other BMAD skills (product brief, PRD, architecture) can invoke this as a final step after producing their primary document + discovery notes - -## Skill Architecture - -``` -bmad-distillation-generator/ - SKILL.md # Entry point, input validation, routing - agents/ - distillate-compressor.md # Core compression agent - round-trip-reconstructor.md # Validation: reconstructs source docs from distillate - prompts/ - compression-rules.md # The compression ruleset (shared reference) - splitting-strategy.md # Semantic splitting logic for large inputs - resources/ - distillate-format-reference.md # Format examples showing before/after -``` - -## Stages - -| # | Stage | Purpose | Location | -|---|-------|---------|----------| -| 1 | Validate & Analyze | Validate inputs, assess total size, detect document types | SKILL.md | -| 2 | Compress | Fan out compressor agent(s), produce distillate | agents/distillate-compressor.md | -| 3 | Verify & Output | Structured completeness check, save output | SKILL.md | -| 4 | Round-Trip Validation | (optional, --validate flag) Reconstruct sources from distillate, diff against originals | agents/round-trip-reconstructor.md | - -### Stage 1: Validate & Analyze (SKILL.md) - -1. **Validate inputs exist and are readable.** If source documents are paths, read them. If inline content, accept directly. - -2. **Assess total input size.** Count approximate tokens across all source documents. - -3. **Detect document types.** Understand what each source document is (product brief, discovery notes, research report, architecture doc, PRD, etc.) — this informs how to group themes in the output. - -4. **Determine splitting need.** If total input is large (heuristic: source documents collectively exceed ~15,000 tokens of content) AND no token_budget is set, warn the user that the distillate may be large and offer to split semantically. If token_budget is set and would require splitting, proceed automatically. - -5. **Route to Stage 2.** Pass all source content, downstream_consumer context, and splitting decision to the compressor. - -### Stage 2: Compress (agents/distillate-compressor.md) - -The compressor agent is the core of this skill. It receives all source document content and produces the distillate. - -**Compression process:** - -1. **Extract all discrete facts, decisions, constraints, requirements, relationships, rejected ideas, and open questions** from all source documents. Treat this as entity extraction — pull out every distinct piece of information. - -2. **Deduplicate ruthlessly.** If the same fact appears in the brief's executive summary AND the discovery notes' technical context, it appears once in the distillate. Choose the version with the most context. - -3. **Apply downstream filtering** (only if downstream_consumer is specified). For each extracted item, ask: "Would the downstream workflow need this?" Drop items that are clearly irrelevant to the stated consumer. When uncertain, keep. - -4. **Group thematically.** Organize items into coherent themes derived from the source content — not from a fixed template. The themes should reflect what the documents are actually about. Common groupings: core concept, problem/motivation, solution/approach, users/segments, technical decisions, constraints, scope boundaries, competitive context, rejected alternatives, open questions, risks. - -5. **Compress language.** For each item: - - Strip prose transitions and connective tissue - - Remove hedging and rhetoric - - Remove explanations of common knowledge - - Preserve specific details (numbers, names, versions, dates) - - Ensure the item is self-contained (understandable without reading the source) - - Make relationships explicit ("X because Y", "X blocks Y", "X replaces Y") - -6. **Apply the compression rules** from `prompts/compression-rules.md` as a final pass. - -**If semantic splitting is required:** - -7. **Identify natural semantic boundaries** in the source content. These are NOT arbitrary size breaks — they are coherent topic clusters that a downstream workflow might load independently. - -8. **Produce a root distillate** that contains: a 3-5 bullet orientation (what was distilled, for whom, how many parts), cross-references to section distillates, and any items that span multiple sections. - -9. **Produce section distillates**, each self-sufficient — a reader loading only one section should understand it without the others. Include a 1-line context header: "This section covers [topic]. Part N of M from [source document names]." - -### Stage 3: Verify & Output (SKILL.md) - -After the compressor returns: - -1. **Structured completeness check.** Extract all Level 2+ headings and key named entities (products, people, technologies, decisions) from the source documents. Verify each appears in the distillate. If gaps are found, send them back to the compressor for a targeted fix pass — not a full recompression. - -2. **Format check.** Verify the output follows distillate format rules: - - No prose paragraphs (only bullets) - - No decorative formatting - - No repeated information - - Each bullet is self-contained - - Themes are clearly delineated - -3. **Save output.** Write the distillate to the output path. Use frontmatter: - -```yaml ---- -type: bmad-distillate -sources: - - "{source file 1}" - - "{source file 2}" -downstream_consumer: "{consumer or 'general'}" -created: "{timestamp}" -token_estimate: {approximate token count} -parts: {1 or N if split} ---- -``` - -4. **Report to user or calling skill.** Return the file path(s) and a one-line confirmation. If called by another skill, return structured output: - -```json -{ - "status": "complete", - "distillate": "{path}", - "section_distillates": ["{path1}", "{path2}"] or null, - "token_estimate": N, - "source_documents": ["{path1}", "{path2}"], - "completeness_check": "pass" or "pass_with_additions" -} -``` - -## Compression Rules (for prompts/compression-rules.md) - -These rules govern how text is compressed. They are the core IP of this skill. - -### Strip — Remove entirely -- Prose transitions: "As mentioned earlier", "It's worth noting", "In addition to this" -- Rhetoric and persuasion: "This is a game-changer", "The exciting thing is" -- Hedging: "We believe", "It's likely that", "Perhaps", "It seems" -- Self-reference: "This document describes", "As outlined above" -- Common knowledge explanations: "Vercel is a cloud platform company", "MIT is an open-source license" -- Repeated introductions of the same concept -- Section transition paragraphs -- Formatting-only elements (decorative bold/italic for emphasis, horizontal rules for visual breaks) - -### Preserve — Keep always -- Specific numbers, dates, versions, percentages -- Named entities (products, companies, people, technologies) -- Decisions made and their rationale (compressed: "Decision: X. Reason: Y") -- Rejected alternatives and why (compressed: "Rejected: X. Reason: Y") -- Explicit constraints and non-negotiables -- Dependencies and ordering relationships -- Open questions and unresolved items -- Scope boundaries (in/out/deferred) -- Success criteria and how they're validated -- User segments and what success means for each - -### Transform — Change form for efficiency -- Long prose paragraphs → single dense bullet capturing the same information -- "We decided to use X because Y and Z" → "X (rationale: Y, Z)" -- Repeated category labels → group under a single heading, no per-item labels -- "Risk: ... Severity: high" → "HIGH RISK: ..." -- Conditional statements → "If X → Y" form -- Multi-sentence explanations → semicolon-separated compressed form - -### Deduplication Rules -- Same fact in multiple documents → keep the version with most context -- Same concept at different detail levels → keep the detailed version -- Overlapping lists → merge into single list, no duplicates -- When source documents disagree → note the conflict explicitly: "Brief says X; discovery notes say Y — unresolved" - -## Format Reference (for resources/distillate-format-reference.md) - -### Before (human-readable brief excerpt) -``` -## What Makes This Different - -**The anti-fragmentation layer.** The AI tooling space is fracturing across 40+ -platforms with no shared methodology layer. BMAD is uniquely positioned to be the -cross-platform constant — the structured approach that works the same in Cursor, -Claude Code, Windsurf, Copilot, and whatever launches next month. Every other -methodology or skill framework maintains its own platform support matrix. By -building on the open-source skills CLI ecosystem, BMAD offloads the highest-churn -maintenance burden and focuses on what actually differentiates it: the methodology -itself. -``` - -### After (distillate) -``` -## Differentiation -- Anti-fragmentation positioning: BMAD = cross-platform constant across 40+ fragmenting AI tools; no competitor provides shared methodology layer -- Platform complexity delegated to Vercel skills CLI ecosystem (MIT); BMAD maintains methodology, not platform configs -``` - -### Before (discovery notes excerpt) -``` -## Competitive Landscape - -- **Vercel Skills.sh**: 83K+ skills, 18 agents, largest curated leaderboard — - but dev-only, skills trigger unreliably (20% without explicit prompting) -- **SkillsMP**: 400K+ skills directory, pure aggregator with no curation or CLI -- **ClawHub/OpenClaw**: ~3.2K curated skills with versioning/rollback, small ecosystem -- **Lindy**: No-code AI agent builder for business automation — closed platform, - no skill sharing -- **Microsoft Copilot Studio**: Enterprise no-code agent builder — vendor-locked - to Microsoft -- **MindStudio**: No-code AI agent platform — siloed, no interoperability -- **Make/Zapier AI**: Workflow automation adding AI agents — workflow-centric, - not methodology-centric -- **Key gap**: NO competitor combines structured methodology with plugin - marketplace — this is BMAD's whitespace -``` - -### After (distillate) -``` -## Competitive Landscape -- No competitor combines structured methodology + plugin marketplace (whitespace) -- Skills.sh (Vercel): 83K skills, 18 agents, dev-only, 20% trigger reliability -- SkillsMP: 400K skills, aggregator only, no curation/CLI -- ClawHub: 3.2K curated, versioning, small ecosystem -- No-code platforms (Lindy, Copilot Studio, MindStudio, Make/Zapier): closed/siloed, no skill portability, business-only -``` - -## Stage 4: Round-Trip Validation (agents/round-trip-reconstructor.md) - -**Triggered by:** `--validate` flag. Optional. Not run by default. - -**Purpose:** Prove the distillate is lossless by reconstructing the original source documents from the distillate alone, then diffing against the originals to surface any information loss. - -### Process - -1. **The reconstructor agent receives ONLY the distillate.** It has no access to the original source documents. This is critical — if it could see the originals, the test is meaningless. - -2. **Detect source document types from the distillate's frontmatter.** The `sources` field lists what was distilled. The reconstructor uses the document type (product brief, discovery notes, architecture doc, etc.) to understand what kind of document to reconstruct. - -3. **Reconstruct each source document.** For each source listed in frontmatter, produce a full human-readable document from the distillate's content alone. The reconstruction should: - - Use appropriate prose, structure, and formatting for the document type - - Include all sections the original would have had - - Not invent information — only use what's in the distillate - - Flag any places where the distillate felt insufficient with `[POSSIBLE GAP]` markers - -4. **Save reconstructions** as temporary files adjacent to the distillate with `-reconstruction-{N}.md` suffixes. - -### Diff Analysis (back in SKILL.md) - -After the reconstructor returns, the main skill performs the diff: - -1. **Read both the original source documents and the reconstructions.** - -2. **Semantic diff, not text diff.** Don't compare prose word-for-word — compare information content. For each section of the original, ask: - - Is the core information present in the reconstruction? - - Are specific details preserved (numbers, names, decisions)? - - Are relationships and rationale intact? - - Did the reconstruction add anything not in the original? (indicates hallucination to fill gaps) - -3. **Produce a validation report** saved adjacent to the distillate as `-validation-report.md`: - -```markdown ---- -type: distillate-validation -distillate: "{distillate path}" -sources: ["{source paths}"] -created: "{timestamp}" ---- - -## Validation Summary -- Status: PASS | PASS_WITH_WARNINGS | FAIL -- Information preserved: {percentage estimate} -- Gaps found: {count} -- Hallucinations detected: {count} - -## Gaps (information in originals but missing from reconstruction) -- {gap description} — Source: {which original}, Section: {where} - -## Hallucinations (information in reconstruction not traceable to originals) -- {hallucination description} — appears to fill gap in: {section} - -## Possible Gap Markers (flagged by reconstructor) -- {marker description} -``` - -4. **If gaps are found**, offer to run a targeted fix pass on the distillate — adding the missing information without full recompression. - -5. **Clean up** — delete the temporary reconstruction files after the report is generated (the report preserves the findings). - -### When to use --validate - -- During development/testing of the distillation generator itself -- When distilling critical documents where information loss is unacceptable (architecture decisions, compliance-relevant specs) -- As a quality gate before handing off a distillate to a high-stakes downstream workflow -- NOT for routine use — it adds significant token cost (full reconstruction + diff analysis) - -## Design Rationale - -### Why a separate skill, not inline in each workflow? -Compression is a distinct competency. The agent producing a brief is optimized for collaborative discovery and persuasive writing. The agent producing a distillate is optimized for ruthless information extraction and deduplication. Separating them means each can be excellent at its job. It also means any BMAD workflow can call the same distillation skill — briefs, PRDs, architecture docs, research reports — without each reimplementing compression logic. - -### Why self-check instead of a separate validator? -The completeness check is mechanical (does each heading/entity from source appear in output?) not judgmental. A checklist-based self-audit is reliable for this task. A separate validator agent adds a round-trip and token cost for marginal benefit. If the downstream workflow finds gaps, it can always read the source documents directly — the distillate is an optimization, not a single point of failure. A validator can be added later if needed. - -### Why round-trip reconstruction for validation? -The strongest proof of lossless compression is reconstruction. If an LLM reading only the distillate can reproduce both source documents with no meaningful information loss, the distillate is complete. The delta between originals and reconstructions is a precise quality metric: missing information = compression loss, added information = hallucination filling gaps (which also flags where the distillate was too terse). This is more rigorous than any checklist-based approach because it tests actual recoverability, not just presence of keywords. - -### Why semantic splitting instead of size-based? -Arbitrary splits (every N tokens) break coherence. A downstream workflow loading "part 2 of 4" of a size-split distillate gets context fragments. Semantic splits produce self-contained topic clusters that a workflow can load selectively — "give me just the technical decisions section" — which is more useful and more token-efficient for the consumer. - -## Integration Points - -### As a standalone skill -User invokes directly: "distill these documents for PRD creation" or "create a distillate of the architecture doc" - -### Called by other BMAD skills -Any skill that produces a primary document + discovery notes can call this as a final optional step: -- Product Brief → offers distillate for PRD creation -- PRD → offers distillate for architecture/story creation -- Architecture → offers distillate for implementation stories -- Research Reports → offers distillate for brief/PRD input - -### Calling convention for other skills -Other skills invoke this by telling the LLM to run the `bmad-distillation-generator` skill with the source documents and downstream consumer specified. The distillation skill handles everything else and returns the output path. diff --git a/samples/planning-artifacts/product-brief-bmad-next-gen-installer-discovery-notes.md b/samples/planning-artifacts/product-brief-bmad-next-gen-installer-discovery-notes.md deleted file mode 100644 index 87d92a9..0000000 --- a/samples/planning-artifacts/product-brief-bmad-next-gen-installer-discovery-notes.md +++ /dev/null @@ -1,120 +0,0 @@ ---- -title: "Discovery Notes: BMAD Next-Gen Installer" -type: discovery-notes -source: "product-brief-bmad-next-gen-installer.md" -created: "2026-03-12" -purpose: "Detailed supporting context captured during product brief discovery" ---- - -## Current Installer Architecture (Migration Context) - -- Entry point: `tools/cli/bmad-cli.js` using Commander.js, routes install/uninstall/status commands -- Core installer: `tools/cli/installers/lib/core/installer.js` orchestrates all installation -- Platform configs: `tools/cli/installers/lib/ide/platform-codes.yaml` defines ~20 platforms with target dirs, legacy dirs, template types, and special flags (ancestor conflict checks, skill format toggles) -- Manifest generation: produces CSV files (`skill-manifest.csv`, `workflow-manifest.csv`, `agent-manifest.csv`) — these are the current source of truth, NOT the JSON manifests -- External modules: `tools/cli/commands/external-official-modules.yaml` lists official modules (CIS, GDS, TEA, WDS) installed from npm with semver -- Dependency resolution: 4-pass system (collect primary files, parse deps, resolve paths, resolve transitive) — limited to YAML-declared deps -- Config collection: prompts user for name, communication language, document output language, output folder path -- Current install directory structure: `_bmad/` for core files, `._config/` for manifests, plus per-IDE skill directories (`.claude/skills/`, `.cursor/skills/`, etc.) -- Supports install, update, quick-update, and compile-agents actions -- Custom modules supported via file paths in addition to npm packages - -## Existing Skill/Manifest Primitives (Already Partially Built) - -- Skills already use directory-per-skill layout: `skill-name/SKILL.md` with frontmatter (name, description) -- `bmad-manifest.json` sidecar files already exist alongside skills — example from product-brief skill: `{"module-code": "bmm", "replaces-skill": "bmad-create-product-brief", "capabilities": [{"name": "create-brief", "menu-code": "CB", "description": "...", "supports-headless": true, "phase-name": "1-analysis", "after": ["brainstorming"], "before": ["create-prd"], "is-required": true, "output-location": "{planning_artifacts}"}]}` -- `bmad-skill-manifest.yaml` files define `canonicalId` and artifact type in source -- The gap: JSON manifests exist but CSV remains single source of truth; no runtime scanning/registration; manifests are static, generated once at install - -## Vercel Skills CLI Technical Details - -- CLI tool: `npx skills add ` — installs from GitHub repos, GitLab, local paths, git URLs -- Supports 40+ agents with per-agent path mappings (Claude Code: `.claude/skills/`, Cursor: `.cursor/skills/`, etc.) -- Installation methods: symlinks (recommended) or copies -- Scope: project-level (shared via git) or global (user-wide) -- Discovery: scans `skills/`, `.agents/skills/`, agent-specific paths, and `.claude-plugin/marketplace.json` manifests -- Recognizes Anthropic plugin marketplace format: `{"metadata": {"pluginRoot": "./plugins"}, "plugins": [{"name": "my-plugin", "skills": ["./skills/review"]}]}` -- Key commands: add, list, find, remove, check, update, init -- Supports interactive selection or non-interactive CI/CD flags (`-y`, `--all`) -- MIT licensed, backed by Vercel - -## Competitive Landscape - -- **Vercel Skills.sh**: 83K+ skills, 18 agents, largest curated leaderboard — but dev-only, skills trigger unreliably (20% without explicit prompting) -- **SkillsMP**: 400K+ skills directory, pure aggregator with no curation or CLI -- **ClawHub/OpenClaw**: ~3.2K curated skills with versioning/rollback, small ecosystem -- **Lindy**: No-code AI agent builder for business automation — closed platform, no skill sharing -- **Microsoft Copilot Studio**: Enterprise no-code agent builder — vendor-locked to Microsoft -- **MindStudio**: No-code AI agent platform — siloed, no interoperability -- **Make/Zapier AI**: Workflow automation adding AI agents — workflow-centric, not methodology-centric -- **Key gap**: NO competitor combines structured methodology with plugin marketplace — this is BMAD's whitespace - -## Market Context - -- AI agent market: $7.84B in 2025, projected $52.62B by 2030 -- Agent Skills spec is ~4 months old, ecosystem grew from thousands to 351K+ skills in that time -- Three standards converging under Linux Foundation's AAIF: MCP (tool integration, 97M monthly SDK downloads), AGENTS.md (project instructions), A2A (agent-to-agent communication) -- Skills quality crisis: 13.4% have critical vulnerabilities (Snyk study); most community skills are "AI slop" -- Skill activation reliability is a known problem: 20% trigger rate without explicit prompting — BMAD's structured invocation patterns may be an advantage here -- BMAD already has established presence: GitHub repo, npm package, docs site, organic coverage on DEV.to and Medium - -## User & Distribution Requirements Captured - -- NPX installer should still exist for technical users, potentially wrapping Vercel skills CLI -- Non-technical path: download zip, get platform-specific README, copy skills to folder, run bmad-init -- No requirement for Node.js, Git, or terminal for the non-technical path -- Install messages (like current installer shows) are valued — NPX path should preserve this UX -- Users may share bundles peer-to-peer, not just from marketplace -- Marketplace initially just a download button + zip + README popup with instructions -- As low-code platforms mature, provide better per-platform guidance — but this is an emerging space, we're betting on the future - -## Technical Decisions & Constraints - -- Adopt Anthropic plugin standard as base format (what Vercel uses) -- `bmad-manifest.json` extends the base standard for BMAD-specific needs (installer options, capabilities, help system integration, phase ordering, dependency declarations) -- bmad-init must always be included as a base skill in every bundle/install (solves bootstrapping problem) -- Vercel CLI integration pattern (wrap vs fork vs call) is a PRD/architecture decision -- Manifest format stability is critical once third-party authors publish against it — needs careful upfront design -- Migration from current CSV-based manifests to JSON-based runtime scanning is a key technical shift - -## Quality & Curation Model - -- All plugin submissions will be gated — not an open bazaar -- Human review by BMad and core team personally -- This is a key differentiator: curated quality vs ecosystem noise -- Certification process details are out of scope for the brief, but gated-submission is a core architectural requirement -- The quality gate becomes MORE valuable over time as the broader ecosystem gets noisier - -## Scope Signals (In/Out/Maybe for PRD) - -- **In**: manifest spec, bmad-init, bmad-update, Vercel CLI integration, NPX installer, zip bundles, migration path -- **Out**: BMAD Builder, marketplace web platform, skill conversion work, one-click install for all platforms, monetization -- **Maybe/Future**: deeper platform-specific integrations for non-technical users, CI/CD integration (bmad-init as GitHub Action one-liner), telemetry/usage analytics for module authors, offline/air-gapped enterprise install story, integrity verification for zip bundles (checksums/signing) - -## Rejected Ideas / Decisions Made - -- **Not building our own platform support matrix going forward** — delegating to Vercel skills CLI ecosystem. Rationale: maintaining 20+ platform configs is the biggest maintenance burden; it's unsustainable at 40+ -- **Not requiring one-click install for non-technical users in v1** — emerging space, guidance-based for now. Rationale: we don't know what all the low-code platforms will be; better to provide good READMEs and improve over time -- **Not using existing roadmap or prior brainstorming** — starting fresh for this initiative. Rationale: BMad wanted a clean vision unconstrained by previous planning - -## Open Questions for PRD - -- Exact Vercel skills CLI integration pattern: wrap as subprocess? Fork and bundle? Use as a library? Peer dependency? -- How does bmad-update work technically? Diff-based? Full replacement? Does it preserve user customizations? -- What's the migration story for existing users? Migration command? Manual reinstall? Compatibility shim? -- How do we test installation correctness across 40+ platforms? CI matrix for top N? Community testing? -- Should bmad-manifest.json be proposed as an open standard to Agent Skills governance? -- How do we handle platforms NOT supported by the Vercel skills CLI? -- What's the manifest versioning strategy? How do we evolve the format without breaking existing plugins? -- What does the plugin author getting-started experience look like? What tooling do they need? - -## Reviewer Insights Worth Preserving - -- **Opportunity**: Module authors are an acquisition channel — every published plugin is a distribution event bringing the creator's audience into the ecosystem -- **Opportunity**: CI/CD integration (bmad-init as a pipeline one-liner) makes BMAD part of repo infrastructure, dramatically increasing stickiness -- **Opportunity**: Educational institutions are an overlooked segment — structured methodology + non-technical install maps onto university AI curriculum -- **Opportunity**: Skill composability as a first-class primitive — letting users mix BMAD modules with third-party skills for custom methodology stacks -- **Risk**: Manifest format evolution creates a versioning/compatibility matrix — once third-party authors publish, changes break plugins (same maintenance burden in a new form) -- **Risk**: "Methodology-backed quality" needs to be a defined process, not just a claim — the gated review model addresses this -- **Risk**: Platform proliferation means 40+ testing environments, even with Vercel handling translation -- **Risk**: Scope creep pressure from marketplace vision — brief explicitly excludes it but it's the primary long-term value diff --git a/samples/planning-artifacts/product-brief-bmad-next-gen-installer-distillate.md b/samples/planning-artifacts/product-brief-bmad-next-gen-installer-distillate.md deleted file mode 100644 index 2f01674..0000000 --- a/samples/planning-artifacts/product-brief-bmad-next-gen-installer-distillate.md +++ /dev/null @@ -1,109 +0,0 @@ ---- -type: bmad-distillate -sources: - - "product-brief-bmad-next-gen-installer.md" - - "product-brief-bmad-next-gen-installer-discovery-notes.md" -downstream_consumer: "PRD creation" -created: "2026-03-13" ---- - -## Core Concept -- BMAD Next-Gen Installer: replaces monolithic Node.js CLI with skill-based plugin architecture for distributing BMAD methodology across 40+ AI platforms -- Three layers: self-describing plugins (bmad-manifest.json), cross-platform install via Vercel skills CLI (MIT), runtime registration via bmad-init skill -- Transforms BMAD from dev-only methodology into open platform for any domain (creative, therapeutic, educational, personal) - -## Problem -- Current installer maintains ~20 platform configs manually; each platform convention change requires installer update, test, release — largest maintenance burden on team -- Node.js/npm required — blocks non-technical users on UI-based platforms (Claude Co-Work, etc.) -- CSV manifests are static, generated once at install; no runtime scanning/registration -- Unsustainable at 40+ platforms; new tools launching weekly - -## Solution Architecture -- Plugins: skill bundles with Anthropic plugin standard as base format + bmad-manifest.json extending for BMAD-specific metadata (installer options, capabilities, help integration, phase ordering, dependencies) -- Existing manifest example: `{"module-code":"bmm","replaces-skill":"bmad-create-product-brief","capabilities":[{"name":"create-brief","menu-code":"CB","supports-headless":true,"phase-name":"1-analysis","after":["brainstorming"],"before":["create-prd"],"is-required":true}]}` -- Vercel skills CLI handles platform translation; integration pattern (wrap/fork/call) is PRD decision -- bmad-init: global skill scanning installed bmad-manifest.json files, registering capabilities, configuring project settings; always included as base skill in every bundle (solves bootstrapping) -- bmad-update: plugin update path without full reinstall; technical approach (diff/replace/preserve customizations) is PRD decision -- Distribution tiers: (1) NPX installer wrapping skills CLI for technical users, (2) zip bundle + platform-specific README for non-technical users, (3) future marketplace -- Non-technical path has honest friction: "copy to right folder" requires knowing where that folder is; per-platform README instructions for common tools; improves over time as low-code space matures - -## Differentiation -- Anti-fragmentation: BMAD = cross-platform constant; no competitor provides shared methodology layer across AI tools -- Curated quality: all submissions gated, human-reviewed by BMad + core team personally; 13.4% of community skills have critical vulnerabilities (Snyk 2026); quality gate value increases as ecosystem gets noisier -- Domain-agnostic: no competitor builds beyond software dev workflows; same plugin system powers any domain via BMAD Builder (separate initiative) - -## Users (ordered by v1 priority) -- Module authors (primary v1): package/test/distribute plugins independently without installer changes -- Developers: single-command install on any of 40+ platforms via NPX -- Non-technical users: install without Node/Git/terminal; emerging segment including PMs, designers, educators -- Future plugin creators: non-dev authors using BMAD Builder; need distribution without building own installer - -## Success Criteria -- Zero (or near-zero) custom platform directory code; delegated to skills CLI ecosystem -- Installation verified on top platforms by volume; skills CLI handles long tail -- Non-technical install path validated with non-developer users -- bmad-init discovers/registers all plugins from manifests; clear errors for malformed manifests -- At least one external module author successfully publishes plugin using manifest system -- bmad-update works without full reinstall -- Existing CLI users have documented migration path - -## Scope -- In: manifest spec, bmad-init, bmad-update, Vercel CLI integration, NPX installer, zip bundles, migration path -- Out: BMAD Builder, marketplace web platform, skill conversion (prerequisite, separate), one-click install for all platforms, monetization, quality certification process (gated-submission principle is architectural requirement; process defined separately) -- Deferred: CI/CD integration, telemetry for module authors, air-gapped enterprise install, zip bundle integrity verification (checksums/signing), deeper non-technical platform integrations - -## Current Installer (migration context) -- Entry: `tools/cli/bmad-cli.js` (Commander.js) → `tools/cli/installers/lib/core/installer.js` -- Platforms: `tools/cli/installers/lib/ide/platform-codes.yaml` (~20 platforms with target dirs, legacy dirs, template types, special flags) -- Manifests: CSV files (skill/workflow/agent-manifest.csv) are current source of truth, not JSON -- External modules: `external-official-modules.yaml` (CIS, GDS, TEA, WDS) from npm with semver -- Dependencies: 4-pass resolver (collect → parse → resolve → transitive); YAML-declared only -- Config: prompts for name, communication language, document output language, output folder -- Actions: install, update, quick-update, compile-agents -- Skills already use directory-per-skill layout (skill-name/SKILL.md); bmad-manifest.json sidecars already exist but are not source of truth -- Key shift: CSV-based static manifests → JSON-based runtime scanning - -## Vercel Skills CLI -- `npx skills add ` — GitHub, GitLab, local paths, git URLs -- 40+ agents; per-agent path mappings; symlinks (recommended) or copies -- Scopes: project-level or global -- Discovery: `skills/`, `.agents/skills/`, agent-specific paths, `.claude-plugin/marketplace.json` -- Commands: add, list, find, remove, check, update, init -- Non-interactive: `-y`, `--all` flags for CI/CD - -## Competitive Landscape -- No competitor combines structured methodology + plugin marketplace (whitespace) -- Skills.sh (Vercel): 83K skills, dev-only, 20% trigger reliability without explicit prompting -- SkillsMP: 400K skills, aggregator only, no curation -- ClawHub: 3.2K curated, versioning, small -- No-code platforms (Lindy, Copilot Studio, MindStudio, Make/Zapier): closed/siloed, no skill portability, business-only -- Market: $7.84B (2025) → $52.62B (2030); Agent Skills spec ~4 months old, 351K+ skills; standards converging under Linux Foundation AAIF (MCP, AGENTS.md, A2A) -- BMAD's structured invocation patterns may advantage vs 20% trigger reliability problem - -## Rejected Alternatives -- Building own platform support matrix: unsustainable at 40+; delegate to Vercel ecosystem -- One-click install for non-technical v1: emerging space; guidance-based, improve over time -- Prior roadmap/brainstorming: clean start, unconstrained by previous planning - -## Open Questions -- Vercel CLI integration pattern: wrap/fork/call/peer dependency? -- bmad-update mechanics: diff/replace? Preserve user customizations? -- Migration story: command/manual reinstall/compatibility shim? -- Cross-platform testing: CI matrix for top N? Community testing for rest? -- bmad-manifest.json as open standard submission to Agent Skills governance? -- Platforms NOT supported by Vercel skills CLI? -- Manifest versioning strategy for backward compatibility? -- Plugin author getting-started experience and tooling? - -## Opportunities (from review) -- Module authors as acquisition channel: each published plugin distributes BMAD to creator's audience -- CI/CD integration: bmad-init as pipeline one-liner increases stickiness -- Educational institutions: structured methodology + non-technical install → university AI curriculum -- Skill composability: mixing BMAD modules with third-party skills for custom methodology stacks - -## Risks -- Manifest format evolution creates versioning/compatibility burden once third-party authors publish -- Quality gate needs defined process, not just claim — gated review model addresses -- 40+ platform testing environments even with Vercel handling translation -- Scope creep pressure from marketplace vision (explicitly excluded but primary long-term value) -- Vercel dependency: minor supply-chain risk; MIT license allows fork if deprioritized; supporting many platforms is core differentiator regardless diff --git a/samples/planning-artifacts/product-brief-bmad-next-gen-installer.md b/samples/planning-artifacts/product-brief-bmad-next-gen-installer.md deleted file mode 100644 index cca4f7c..0000000 --- a/samples/planning-artifacts/product-brief-bmad-next-gen-installer.md +++ /dev/null @@ -1,96 +0,0 @@ ---- -title: "Product Brief: BMAD Next-Gen Installer" -status: "complete" -created: "2026-03-12" -updated: "2026-03-12" -inputs: - - "User brain dump (BMad)" - - "Current installer codebase analysis (tools/cli/)" - - "Vercel skills CLI README (github.com/vercel-labs/skills)" - - "Web research: AI agent skills ecosystem, marketplace landscape" ---- - -# Product Brief: BMAD Next-Gen Installer - -## Executive Summary - -The BMAD Method has grown from a developer-focused agile AI methodology into a framework used across 20+ platforms — but its installer hasn't kept up. Today, every new AI tool that supports skills means manual work: adding platform configs, maintaining directory mappings, testing installation paths. This doesn't scale, and it locks BMAD out of the fastest-growing segment of the market: non-technical users on low-code and UI-based platforms. - -The Next-Gen Installer replaces BMAD's monolithic Node.js CLI with a skill-based architecture built on the emerging Agent Skills standard. By leveraging the open-source Vercel skills CLI for cross-platform installation and introducing a plugin system where BMAD modules are self-describing skill bundles, we eliminate the platform maintenance burden, open distribution beyond what BMAD could maintain alone, and lay the foundation for a marketplace where anyone — developers, creators, educators, therapists — can discover, download, and install BMAD plugins without needing Git, Node, or a terminal. - -This isn't just a better installer. It's the infrastructure that transforms BMAD from a dev methodology into an open platform. - -## The Problem - -BMAD currently supports ~20 AI platforms through a custom Node.js installer that maintains per-platform directory mappings, template formats, and legacy migration paths. Every platform that changes its skill conventions — and they change constantly — requires installer updates, testing, and a new release. This is the single biggest maintenance burden on the bmad-code team. - -Meanwhile, the Agent Skills ecosystem has exploded. The broader skills ecosystem now spans 40+ platforms with hundreds of thousands of skills and millions of installs. The market is moving fast, and BMAD is fighting to keep up with platform-by-platform manual support while new tools launch weekly. - -Worse, the current installer requires Node.js and npm — a hard barrier for the growing population of non-technical users building with AI through UI-based platforms like Claude Co-Work. These users can't run `npx bmad-method install`. They need something simpler. - -The cost of the status quo is clear: developer time spent maintaining platform configs instead of building methodology, and an entire user segment that can't access BMAD at all. - -## The Solution - -The Next-Gen Installer is a skill-based distribution and registration system with three layers: - -**1. Self-Describing Plugins.** Every BMAD module becomes a plugin — a bundle of skills with a manifest that declares what's included, how skills relate to each other, what capabilities they provide, and how they integrate with the BMAD help system. The plugin format adopts the Anthropic plugin standard (used by Vercel and the broader skills ecosystem) as its base, extended with a BMAD-specific manifest (`bmad-manifest.json`) for metadata the base standard doesn't cover — such as installer options, capability declarations, and help system integration. A plugin is fully self-contained: download it, put the skills in your tool's skill folder, and it works. - -**2. Cross-Platform Installation via Vercel Skills CLI.** For users who want an automated install experience, the installer builds on the MIT-licensed Vercel skills CLI, which handles translating the Anthropic plugin standard to 40+ platforms. The exact integration pattern — wrapping, forking, or calling as a dependency — is a PRD-level architecture decision. The strategic intent is clear: BMAD stops maintaining platform directory mappings and delegates that problem to a well-maintained open-source project. The Vercel dependency carries minor supply-chain risk, but the pros far outweigh it: the MIT license means BMAD can fork and maintain it if Vercel ever deprioritizes the project. Supporting many platforms is a core BMAD differentiator — we need this problem solved one way or another, and leveraging an existing solution beats building from scratch. - -**3. Runtime Registration via `bmad-init`.** A global skill that scans for installed BMAD manifests, registers capabilities, configures project settings, and bootstraps the BMAD experience. Users run it once after installation. It replaces the current installer's config-collection step and provides the entry point for updates via `bmad-update`. Note: `bmad-init` itself must be installed before it can run — the NPX installer and zip bundle README handle this bootstrapping step by ensuring `bmad-init` is always included as a base skill. - -For non-technical users, distribution is straightforward: download a zip containing all plugin skills plus a README with platform-specific guidance. The honest reality is that "copy to the right folder" still requires knowing where that folder is — and this varies by platform. The README provides per-platform instructions for the most common tools, and as the low-code/no-code AI platform space matures, we improve guidance and explore deeper integrations. We don't need to solve universal one-click install today, but we do need to be honest that the non-technical path has friction we'll reduce over time. - -## What Makes This Different - -**The anti-fragmentation layer.** The AI tooling space is fracturing across 40+ platforms with no shared methodology layer. BMAD is uniquely positioned to be the cross-platform constant — the structured approach that works the same in Cursor, Claude Code, Windsurf, Copilot, and whatever launches next month. Every other methodology or skill framework maintains its own platform support matrix. By building on the open-source skills CLI ecosystem, BMAD offloads the highest-churn maintenance burden and focuses on what actually differentiates it: the methodology itself. - -**Methodology-backed quality in a sea of AI slop.** The broader skills ecosystem is flooded with low-quality, AI-generated content — and early research (Snyk, 2026) suggests a meaningful percentage of community skills contain security vulnerabilities. BMAD plugins are different: they're structured, tested, and part of a coherent methodology. The BMAD manifest system ensures skills work together, declare dependencies, and integrate with the help system. This is a curated ecosystem, not an open bazaar — all plugin submissions will be gated, reviewed, and curated by the BMAD creator and open-source core team. This human-reviewed quality gate is a key differentiator that becomes more valuable as the broader ecosystem grows noisier. - -**Platform for everything, not just code.** No competitor in the AI skills space is building beyond software development workflows. BMAD's plugin architecture is domain-agnostic — the same manifest system, installer, and registration flow that powers the dev methodology will power creative, educational, therapeutic, and personal plugins built with the BMAD Builder. This is unaddressed whitespace in the current market. - -## Who This Serves - -**BMAD Open-Source Contributors and Module Authors** (primary v1 target) — The people who build BMAD modules today. They currently package workflows and agents manually and rely on the installer team to support new platforms. They need a standardized way to package modules as self-contained skill plugins that work anywhere — and they need to do it without waiting on installer changes. Success: a module author can package, test, and distribute a plugin independently. - -**Developers Using AI Coding Tools** — Technical users across Claude Code, Cursor, Gemini CLI, Codex, and dozens of other platforms who want to install BMAD with a single command and have it just work, regardless of their tool. Success: `npx` one-liner installs BMAD to their tool of choice, and `bmad-init` configures it for their project. - -**Non-Technical AI Users** — People building with AI through UI-based platforms who don't have (or want) a development environment. They need download-and-copy simplicity with clear, platform-specific guidance. This is an emerging segment — we don't fully understand their needs yet, but removing the Node.js barrier opens BMAD to product managers, designers, educators, and knowledge workers who currently cannot access it. Success: a user who has never opened a terminal can install and use BMAD on their platform. - -**Future Plugin Creators** — People who will build BMAD-compatible plugins for domains beyond software development. They need a distribution system that gets their work into users' hands without building their own installer. Success: a non-dev plugin author can package and share their creation using the same manifest and distribution system. - -## Success Criteria - -- **Platform maintenance burden reduced dramatically:** Custom platform directory code in BMAD's codebase approaches zero, with cross-platform installation delegated to the skills CLI ecosystem -- **Broad platform coverage:** Installation verified on the top platforms by install volume, with the skills CLI handling the long tail -- **Non-technical installation path exists:** Users can install BMAD without Node.js, npm, or Git — validated by at least testing the flow with non-developer users -- **Plugin self-registration works:** `bmad-init` correctly discovers and registers all installed BMAD plugins from manifests alone, with clear error messages for malformed or missing manifests -- **Module authors can package and distribute plugins** using the manifest system without needing installer changes — validated by at least one external module author successfully publishing a plugin -- **Update path exists:** `bmad-update` allows users to update installed plugins without reinstalling from scratch -- **Migration from current installer:** Existing BMAD users on the Node.js CLI have a clear, documented path to the next-gen system - -## Scope - -**In scope for the next-gen installer:** -- Plugin manifest format (`bmad-manifest.json`) and specification -- `bmad-init` skill for runtime discovery and registration -- `bmad-update` skill for plugin updates -- Integration with Vercel skills CLI (or equivalent) for automated cross-platform installation -- NPX-based installer for technical users -- Downloadable zip bundles with platform-specific README guidance for non-technical users -- Migration path from current installer — existing users need a clear upgrade story, whether that's a migration command or documented manual steps - -**Explicitly out of scope:** -- BMAD Builder (plugin creation tool) — separate initiative -- Marketplace platform (web-based discovery and download) — future phase -- Converting existing workflows/agents to skills — prerequisite, handled separately -- One-click install for every platform — emerging space, guidance-based for now -- Monetization or paid plugin infrastructure -- Plugin quality certification process — the review and curation workflow will be defined separately, though the gated-submission principle is a core architectural requirement - -## Vision - -If the next-gen installer succeeds, BMAD becomes the first AI agent methodology that is truly platform-agnostic and accessible to non-developers. The plugin architecture creates the foundation for a marketplace where a therapist can download a "Guided Journaling" BMAD plugin, a game designer can install a "World Building" plugin, and a startup founder can get the full software development methodology — all through the same system, on whatever AI platform they use. - -In 2-3 years, BMAD plugins become a leading way people package and share structured AI agent workflows. The combination of methodology-backed quality, cross-platform portability, and open distribution creates a flywheel: more plugins attract more users across more platforms, more users attract more plugin creators from more domains, and the growing library of quality plugins reinforces BMAD's reputation as the curated alternative to the skills bazaar. BMAD evolves from a method into an ecosystem. From 2503463275dfbeab0574006c4698c6583a363913 Mon Sep 17 00:00:00 2001 From: Brian Madison Date: Sun, 15 Mar 2026 20:14:15 -0500 Subject: [PATCH 3/6] refactor: remove obsolete sample and manifest files from old skill structure Co-Authored-By: Claude Opus 4.6 (1M context) --- .../bmad-bmm-product-brief-preview/SKILL.md | 87 ------------------- .../artifact-analyzer.md | 60 ------------- .../bmad-manifest.json | 17 ---- .../contextual-discovery.md | 57 ------------ .../draft-and-review.md | 86 ------------------ .../finalize.md | 75 ---------------- .../guided-elicitation.md | 70 --------------- .../opportunity-reviewer.md | 44 ---------- .../references/brief-template.md | 60 ------------- .../skeptic-reviewer.md | 44 ---------- .../web-researcher.md | 49 ----------- src/skills/bmad-bmb-manifest/SKILL.md | 9 -- .../bmad-skill-manifest.yaml | 21 ----- 13 files changed, 679 deletions(-) delete mode 100644 samples/bmad-bmm-product-brief-preview/SKILL.md delete mode 100644 samples/bmad-bmm-product-brief-preview/artifact-analyzer.md delete mode 100644 samples/bmad-bmm-product-brief-preview/bmad-manifest.json delete mode 100644 samples/bmad-bmm-product-brief-preview/contextual-discovery.md delete mode 100644 samples/bmad-bmm-product-brief-preview/draft-and-review.md delete mode 100644 samples/bmad-bmm-product-brief-preview/finalize.md delete mode 100644 samples/bmad-bmm-product-brief-preview/guided-elicitation.md delete mode 100644 samples/bmad-bmm-product-brief-preview/opportunity-reviewer.md delete mode 100644 samples/bmad-bmm-product-brief-preview/references/brief-template.md delete mode 100644 samples/bmad-bmm-product-brief-preview/skeptic-reviewer.md delete mode 100644 samples/bmad-bmm-product-brief-preview/web-researcher.md delete mode 100644 src/skills/bmad-bmb-manifest/SKILL.md delete mode 100644 src/skills/bmad-bmb-manifest/bmad-skill-manifest.yaml diff --git a/samples/bmad-bmm-product-brief-preview/SKILL.md b/samples/bmad-bmm-product-brief-preview/SKILL.md deleted file mode 100644 index 6242141..0000000 --- a/samples/bmad-bmm-product-brief-preview/SKILL.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -name: bmad-bmm-product-brief-preview -description: Create or update product briefs through guided or autonomous discovery. Use when the user requests to 'create a product brief', 'help me create a project brief', or 'update my product brief'. ---- - -# Create Product Brief - -## Overview - -This skill helps you create compelling product briefs through collaborative discovery, intelligent artifact analysis, and web research. Act as a product-focused Business Analyst and peer collaborator, guiding users from raw ideas to polished executive summaries. Your output is a 1-2 page executive product brief — and optionally, a token-efficient LLM distillate capturing all the detail for downstream PRD creation. - -The user is the domain expert. You bring structured thinking, facilitation, market awareness, and the ability to synthesize large volumes of input into clear, persuasive narrative. Work together as equals. - -**Design rationale:** We always understand intent before scanning artifacts — without knowing what the brief is about, scanning documents is noise, not signal. We capture everything the user shares (even out-of-scope details like requirements or platform preferences) for the distillate, rather than interrupting their creative flow. - -## Activation Mode Detection - -Check activation context immediately: - -1. **Autonomous mode**: If the user passes `--headless`/`-H` flags, or provides structured inputs clearly intended for headless execution: - - Ingest all provided inputs, fan out subagents, produce complete brief without interaction - - Route directly to `contextual-discovery.md` with `{mode}=headless` - -2. **Yolo mode**: If the user passes `--yolo` or says "just draft it" / "draft the whole thing": - - Ingest everything, draft complete brief upfront, then walk user through refinement - - Route to Stage 1 below with `{mode}=yolo` - -3. **Guided mode** (default): Conversational discovery with soft gates - - Route to Stage 1 below with `{mode}=guided` - -## On Activation - -1. **Load config via bmad-init skill** (module: `bmm`) — Store all returned vars: - - Use `{user_name}` for greeting - - Use `{communication_language}` for all communications - - Use `{document_output_language}` for output documents - - Use `{planning_artifacts}` for output location and artifact scanning - - Use `{project_knowledge}` for additional context scanning - -2. **Greet user** as `{user_name}`, speaking in `{communication_language}`. Be warm but efficient — dream builder energy. - -3. **Stage 1: Understand Intent** (handled here in SKILL.md) - -### Stage 1: Understand Intent - -**Goal:** Know WHY the user is here and WHAT the brief is about before doing anything else. - -**Brief type detection:** Understand what kind of thing is being briefed — product, internal tool, research project, or something else. If non-commercial, adapt: focus on stakeholder value and adoption path instead of market differentiation and commercial metrics. - -**Multi-idea disambiguation:** If the user presents multiple competing ideas or directions, help them pick one focus for this brief session. Note that others can be briefed separately. - -**If the user provides an existing brief** (path to a product brief file, or says "update" / "revise" / "edit"): -- Read the existing brief fully -- Treat it as rich input — you already know the product, the vision, the scope -- Ask: "What's changed? What do you want to update or improve?" -- The rest of the workflow proceeds normally — contextual discovery may pull in new research, elicitation focuses on gaps or changes, and draft-and-review produces an updated version - -**If the user already provided context** when launching the skill (description, docs, brain dump): -- Acknowledge what you received — but **DO NOT read document files yet**. Note their paths for Stage 2's subagents to scan contextually. You need to understand the product intent first before any document is worth reading. -- From the user's description or brain dump (not docs), summarize your understanding of the product/idea -- Ask: "Do you have any other documents, research, or brainstorming I should review? Anything else to add before I dig in?" - -**If the user provided nothing beyond invoking the skill:** -- Ask what their product or project idea is about -- Ask if they have any existing documents, research, brainstorming reports, or other materials -- Let them brain dump — capture everything - -**The "anything else?" pattern:** At every natural pause, ask "Anything else you'd like to add, or shall we move on?" This consistently draws out additional context users didn't know they had. - -**Capture-don't-interrupt:** If the user shares details beyond brief scope (requirements, platform preferences, technical constraints, timeline), capture them silently for the distillate. Don't redirect or stop their flow. - -**When you have enough to understand the product intent**, route to `contextual-discovery.md` with the current mode. - -## Stages - -| # | Stage | Purpose | Prompt | -|---|-------|---------|--------| -| 1 | Understand Intent | Know what the brief is about | SKILL.md (above) | -| 2 | Contextual Discovery | Fan out subagents to analyze artifacts and web research | `contextual-discovery.md` | -| 3 | Guided Elicitation | Fill gaps through smart questioning | `guided-elicitation.md` | -| 4 | Draft & Review | Draft brief, fan out review subagents | `draft-and-review.md` | -| 5 | Finalize | Polish, output, offer distillate | `finalize.md` | - -## External Skills - -This workflow uses: -- `bmad-init` — Configuration loading (module: bmm) diff --git a/samples/bmad-bmm-product-brief-preview/artifact-analyzer.md b/samples/bmad-bmm-product-brief-preview/artifact-analyzer.md deleted file mode 100644 index 72b9888..0000000 --- a/samples/bmad-bmm-product-brief-preview/artifact-analyzer.md +++ /dev/null @@ -1,60 +0,0 @@ -# Artifact Analyzer - -You are a research analyst. Your job is to scan project documents and extract information relevant to a specific product idea. - -## Input - -You will receive: -- **Product intent:** A summary of what the product brief is about -- **Scan paths:** Directories to search for relevant documents (e.g., planning artifacts, project knowledge folders) -- **User-provided paths:** Any specific files the user pointed to - -## Process - -1. **Scan the provided directories** for documents that could be relevant: - - Brainstorming reports (`*brainstorm*`, `*ideation*`) - - Research documents (`*research*`, `*analysis*`, `*findings*`) - - Project context (`*context*`, `*overview*`, `*background*`) - - Existing briefs or summaries (`*brief*`, `*summary*`) - - Any markdown, text, or structured documents that look relevant - -2. **For sharded documents** (a folder with `index.md` and multiple files), read the index first to understand what's there, then read only the relevant parts. - -3. **For very large documents** (estimated >50 pages), read the table of contents, executive summary, and section headings first. Read only sections directly relevant to the stated product intent. Note which sections were skimmed vs read fully. - -4. **Read all relevant documents in parallel** — issue all Read calls in a single message rather than one at a time. Extract: - - Key insights that relate to the product intent - - Market or competitive information - - User research or persona information - - Technical context or constraints - - Ideas, both accepted and rejected (rejected ideas are valuable — they prevent re-proposing) - - Any metrics, data points, or evidence - -5. **Ignore documents that aren't relevant** to the stated product intent. Don't waste tokens on unrelated content. - -## Output - -Return ONLY the following JSON object. No preamble, no commentary. Maximum 8 bullets per section. - -```json -{ - "documents_found": [ - {"path": "file path", "relevance": "one-line summary"} - ], - "key_insights": [ - "bullet — grouped by theme, each self-contained" - ], - "user_market_context": [ - "bullet — users, market, competition found in docs" - ], - "technical_context": [ - "bullet — platforms, constraints, integrations" - ], - "ideas_and_decisions": [ - {"idea": "description", "status": "accepted|rejected|open", "rationale": "brief why"} - ], - "raw_detail_worth_preserving": [ - "bullet — specific details, data points, quotes for the distillate" - ] -} -``` diff --git a/samples/bmad-bmm-product-brief-preview/bmad-manifest.json b/samples/bmad-bmm-product-brief-preview/bmad-manifest.json deleted file mode 100644 index 42ea35c..0000000 --- a/samples/bmad-bmm-product-brief-preview/bmad-manifest.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "module-code": "bmm", - "replaces-skill": "bmad-create-product-brief", - "capabilities": [ - { - "name": "create-brief", - "menu-code": "CB", - "description": "Produces executive product brief and optional LLM distillate for PRD input.", - "supports-headless": true, - "phase-name": "1-analysis", - "after": ["brainstorming, perform-research"], - "before": ["create-prd"], - "is-required": true, - "output-location": "{planning_artifacts}" - } - ] -} diff --git a/samples/bmad-bmm-product-brief-preview/contextual-discovery.md b/samples/bmad-bmm-product-brief-preview/contextual-discovery.md deleted file mode 100644 index 37097fb..0000000 --- a/samples/bmad-bmm-product-brief-preview/contextual-discovery.md +++ /dev/null @@ -1,57 +0,0 @@ -**Language:** Use `{communication_language}` for all output. -**Output Language:** Use `{document_output_language}` for documents. -**Output Location:** `{planning_artifacts}` - -# Stage 2: Contextual Discovery - -**Goal:** Armed with the user's stated intent, intelligently gather and synthesize all available context — documents, project knowledge, and web research — so later stages work from a rich, relevant foundation. - -## Subagent Fan-Out - -Now that you know what the brief is about, fan out subagents in parallel to gather context. Each subagent receives the product intent summary so it knows what's relevant. - -**Launch in parallel:** - -1. **Artifact Analyzer** (`artifact-analyzer.md`) — Scans `{planning_artifacts}` and `{project_knowledge}` for relevant documents. Also scans any specific paths the user provided. Returns structured synthesis of what it found. - -2. **Web Researcher** (`web-researcher.md`) — Searches for competitive landscape, market context, trends, and relevant industry data. Returns structured findings scoped to the product domain. - -### Graceful Degradation - -If subagents are unavailable or fail: -- Read only the most relevant 1-2 documents in the main context and summarize (don't full-read everything — limit context impact in degraded mode) -- Do a few targeted web searches inline -- Never block the workflow because a subagent feature is unavailable - -## Synthesis - -Once subagent results return (or inline scanning completes): - -1. **Merge findings** with what the user already told you -2. **Identify gaps** — what do you still need to know to write a solid brief? -3. **Note surprises** — anything from research that contradicts or enriches the user's assumptions? - -## Mode-Specific Behavior - -**Guided mode:** -- Present a concise summary of what you found: "Here's what I learned from your documents and web research..." -- Highlight anything surprising or worth discussing -- Share the gaps you've identified -- Ask: "Anything else you'd like to add, or shall we move on to filling in the details?" -- Route to `guided-elicitation.md` - -**Yolo mode:** -- Absorb all findings silently -- Skip directly to `draft-and-review.md` — you have enough to draft -- The user will refine later - -**Autonomous mode:** -- Absorb all findings -- Skip directly to `draft-and-review.md` -- No interaction - -## Stage Complete - -This stage is complete when subagent results (or inline scanning fallback) have returned and findings are merged with user context. Route per mode: -- **Guided** → `guided-elicitation.md` -- **Yolo / Autonomous** → `draft-and-review.md` diff --git a/samples/bmad-bmm-product-brief-preview/draft-and-review.md b/samples/bmad-bmm-product-brief-preview/draft-and-review.md deleted file mode 100644 index ffd8874..0000000 --- a/samples/bmad-bmm-product-brief-preview/draft-and-review.md +++ /dev/null @@ -1,86 +0,0 @@ -**Language:** Use `{communication_language}` for all output. -**Output Language:** Use `{document_output_language}` for documents. -**Output Location:** `{planning_artifacts}` - -# Stage 4: Draft & Review - -**Goal:** Produce the executive product brief and run it through multiple review lenses to catch blind spots before the user sees the final version. - -## Step 1: Draft the Executive Brief - -Use `references/brief-template.md` as a guide — adapt structure to fit the product's story. - -**Writing principles:** -- **Executive audience** — persuasive, clear, concise. 1-2 pages. -- **Lead with the problem** — make the reader feel the pain before presenting the solution -- **Concrete over abstract** — specific examples, real scenarios, measurable outcomes -- **Confident voice** — this is a pitch, not a hedge -- Write in `{document_output_language}` - -**Create the output document at:** `{planning_artifacts}/product-brief-{project_name}.md` - -Include YAML frontmatter: -```yaml ---- -title: "Product Brief: {project_name}" -status: "draft" -created: "{timestamp}" -updated: "{timestamp}" -inputs: [list of input files used] ---- -``` - -## Step 2: Fan Out Review Subagents - -Before showing the draft to the user, run it through multiple review lenses in parallel. - -**Launch in parallel:** - -1. **Skeptic Reviewer** (`skeptic-reviewer.md`) — "What's missing? What assumptions are untested? What could go wrong? Where is the brief vague or hand-wavy?" - -2. **Opportunity Reviewer** (`opportunity-reviewer.md`) — "What adjacent value propositions are being missed? What market angles or partnerships could strengthen this? What's underemphasized?" - -3. **Contextual Reviewer** — You (the main agent) pick the most useful third lens based on THIS specific product. Choose the lens that addresses the SINGLE BIGGEST RISK that the skeptic and opportunity reviewers won't naturally catch. Examples: - - For healthtech: "Regulatory and compliance risk reviewer" - - For devtools: "Developer experience and adoption friction critic" - - For marketplace: "Network effects and chicken-and-egg problem analyst" - - For enterprise: "Procurement and organizational change management reviewer" - - **When domain is unclear, default to:** "Go-to-market and launch risk reviewer" — examines distribution, pricing, and first-customer acquisition. Almost always valuable, frequently missed. - Describe the lens, run the review yourself inline. - -### Graceful Degradation - -If subagents are unavailable: -- Perform all three review passes yourself, sequentially -- Apply each lens deliberately — don't blend them into one generic review -- The quality of review matters more than the parallelism - -## Step 3: Integrate Review Insights - -After all reviews complete: - -1. **Triage findings** — group by theme, remove duplicates -2. **Apply non-controversial improvements** directly to the draft (obvious gaps, unclear language, missing specifics) -3. **Flag substantive suggestions** that need user input (strategic choices, scope questions, market positioning decisions) - -## Step 4: Present to User - -**Autonomous mode:** Skip to `finalize.md` — no user interaction. Save the improved draft directly. - -**Yolo and Guided modes:** - -Present the draft brief to the user. Then share the reviewer insights: - -"Here's your product brief draft. Before we finalize, my review panel surfaced some things worth considering: - -**[Grouped reviewer findings — only the substantive ones that need user input]** - -What do you think? Any changes you'd like to make?" - -Present reviewer findings with brief rationale, then offer: "Want me to dig into any of these, or are you ready to make your revisions?" - -**Iterate** as long as the user wants to refine. Use the "anything else, or are we happy with this?" soft gate. - -## Stage Complete - -This stage is complete when: (a) the draft has been reviewed by all three lenses and improvements integrated, AND either (autonomous) save and route directly, or (guided/yolo) the user is satisfied. Route to `finalize.md`. diff --git a/samples/bmad-bmm-product-brief-preview/finalize.md b/samples/bmad-bmm-product-brief-preview/finalize.md deleted file mode 100644 index 5157ada..0000000 --- a/samples/bmad-bmm-product-brief-preview/finalize.md +++ /dev/null @@ -1,75 +0,0 @@ -**Language:** Use `{communication_language}` for all output. -**Output Language:** Use `{document_output_language}` for documents. -**Output Location:** `{planning_artifacts}` - -# Stage 5: Finalize - -**Goal:** Save the polished brief, offer the LLM distillate, and point the user forward. - -## Step 1: Polish and Save - -Update the product brief document at `{planning_artifacts}/product-brief-{project_name}.md`: -- Update frontmatter `status` to `"complete"` -- Update `updated` timestamp -- Ensure formatting is clean and consistent -- Confirm the document reads well as a standalone 1-2 page executive summary - -## Step 2: Offer the Distillate - -Throughout the discovery process, you likely captured detail that doesn't belong in a 1-2 page executive summary but is valuable for downstream work — requirements hints, platform preferences, rejected ideas, technical constraints, detailed user scenarios, competitive deep-dives, etc. - -**Ask the user:** -"Your product brief is complete. During our conversation, I captured additional detail that goes beyond the executive summary — things like [mention 2-3 specific examples of overflow you captured]. Would you like me to create a detail pack for PRD creation? It distills all that extra context into a concise, structured format optimized for the next phase." - -**If yes, create the distillate** at `{planning_artifacts}/product-brief-{project_name}-distillate.md`: - -```yaml ---- -title: "Product Brief Distillate: {project_name}" -type: llm-distillate -source: "product-brief-{project_name}.md" -created: "{timestamp}" -purpose: "Token-efficient context for downstream PRD creation" ---- -``` - -**Distillate content principles:** -- Dense bullet points, not prose -- Each bullet carries enough context to be understood standalone (don't assume the reader has the full brief loaded) -- Group by theme, not by when it was mentioned -- Include: - - **Rejected ideas** — so downstream workflows don't re-propose them, with brief rationale - - **Requirements hints** — anything the user mentioned that sounds like a requirement - - **Technical context** — platforms, integrations, constraints, preferences - - **Detailed user scenarios** — richer than what fits in the exec summary - - **Competitive intelligence** — specifics from web research worth preserving - - **Open questions** — things surfaced but not resolved during discovery - - **Scope signals** — what the user indicated is in/out/maybe for MVP -- Token-conscious: be concise, but give enough context per bullet so an LLM reading this later understands WHY each point matters - -**Autonomous mode:** Always create the distillate automatically — unless the session was too brief to capture meaningful overflow (in that case, note this in the completion output instead of creating an empty file). - -## Step 3: Present Completion - -"Your product brief for {project_name} is complete! - -**Executive Brief:** `{planning_artifacts}/product-brief-{project_name}.md` -[If distillate created:] **Detail Pack:** `{planning_artifacts}/product-brief-{project_name}-distillate.md` - -**Recommended next step:** Use the product brief (and detail pack) as input for PRD creation — tell your assistant 'create a PRD' and point it to these files." -[If distillate created:] "The detail pack contains all the overflow context (requirements hints, rejected ideas, technical constraints) specifically structured for the PRD workflow to consume." - -**Autonomous mode:** Output the file paths as structured JSON and exit: -```json -{ - "status": "complete", - "brief": "{planning_artifacts}/product-brief-{project_name}.md", - "distillate": "{path or null}", - "confidence": "high|medium|low", - "open_questions": ["any unresolved items"] -} -``` - -## Stage Complete - -This is the terminal stage. After delivering the completion message and file paths, the workflow is done. If the user requests further revisions, loop back to `draft-and-review.md`. Otherwise, exit. diff --git a/samples/bmad-bmm-product-brief-preview/guided-elicitation.md b/samples/bmad-bmm-product-brief-preview/guided-elicitation.md deleted file mode 100644 index a5d0e3a..0000000 --- a/samples/bmad-bmm-product-brief-preview/guided-elicitation.md +++ /dev/null @@ -1,70 +0,0 @@ -**Language:** Use `{communication_language}` for all output. -**Output Language:** Use `{document_output_language}` for documents. - -# Stage 3: Guided Elicitation - -**Goal:** Fill the gaps in what you know. By now you have the user's brain dump, artifact analysis, and web research. This stage is about smart, targeted questioning — not rote section-by-section interrogation. - -**Skip this stage entirely in Yolo and Autonomous modes** — go directly to `draft-and-review.md`. - -## Approach - -You are NOT walking through a rigid questionnaire. You're having a conversation that covers the substance of a great product brief. The topics below are your mental checklist, not a script. Adapt to: -- What you already know (don't re-ask what's been covered) -- What the user is excited about (follow their energy) -- What's genuinely unclear (focus questions where they matter) - -## Topics to Cover (flexibly, conversationally) - -### Vision & Problem -- What core problem does this solve? For whom? -- How do people solve this today? What's frustrating about current approaches? -- What would success look like for the people this helps? -- What's the insight or angle that makes this approach different? - -### Users & Value -- Who experiences this problem most acutely? -- Are there different user types with different needs? -- What's the "aha moment" — when does a user realize this is what they needed? -- How does this fit into their existing workflow or life? - -### Market & Differentiation -- What competitive or alternative solutions exist? (Leverage web research findings) -- What's the unfair advantage or defensible moat? -- Why is now the right time for this? - -### Success & Scope -- How will you know this is working? What metrics matter? -- What's the minimum viable version that creates real value? -- What's explicitly NOT in scope for the first version? -- If this is wildly successful, what does it become in 2-3 years? - -## The Flow - -For each topic area where you have gaps: - -1. **Lead with what you know** — "Based on your input and my research, it sounds like [X]. Is that right?" -2. **Ask the gap question** — targeted, specific, not generic -3. **Reflect and confirm** — paraphrase what you heard -4. **"Anything else on this, or shall we move on?"** — the soft gate - -If the user is giving you detail beyond brief scope (requirements, architecture, platform details, timelines), **capture it silently** for the distillate. Acknowledge it briefly ("Good detail, I'll capture that") but don't derail the conversation. - -## When to Move On - -When you have enough substance to draft a compelling 1-2 page executive brief covering: -- Clear problem and who it affects -- Proposed solution and what makes it different -- Target users (at least primary) -- Some sense of success criteria or business objectives -- MVP-level scope thinking - -You don't need perfection — you need enough to draft well. Missing details can be surfaced during the review stage. - -If the user is providing complete, confident answers and you have solid coverage across all four topic areas after fewer than 3-4 exchanges, proactively offer to draft early. - -**Transition:** "I think I have a solid picture. Ready for me to draft the brief, or is there anything else you'd like to add?" - -## Stage Complete - -This stage is complete when sufficient substance exists to draft a compelling brief and the user confirms readiness. Route to `draft-and-review.md`. diff --git a/samples/bmad-bmm-product-brief-preview/opportunity-reviewer.md b/samples/bmad-bmm-product-brief-preview/opportunity-reviewer.md deleted file mode 100644 index 1ec4db4..0000000 --- a/samples/bmad-bmm-product-brief-preview/opportunity-reviewer.md +++ /dev/null @@ -1,44 +0,0 @@ -# Opportunity Reviewer - -You are a strategic advisor reviewing a product brief draft. Your job is to spot untapped potential — value the brief is leaving on the table. - -## Input - -You will receive the complete draft product brief. - -## Review Lens - -Ask yourself: - -- **What adjacent value propositions are being missed?** Are there related problems this solution naturally addresses? -- **What market angles are underemphasized?** Is the positioning leaving opportunities unexplored? -- **What partnerships or integrations could multiply impact?** Who would benefit from aligning with this product? -- **What's the network effect or viral potential?** Is there a growth flywheel the brief doesn't describe? -- **What's underemphasized?** Which strengths deserve more spotlight? -- **What user segments are overlooked?** Could this serve audiences not yet mentioned? -- **What's the bigger story?** If you zoom out, is there a more compelling narrative? -- **What would an investor want to hear more about?** What would make someone lean forward? - -## Output - -Return ONLY the following JSON object. No preamble, no commentary. Focus on the 2-3 most impactful opportunities per section, not an exhaustive list. - -```json -{ - "untapped_value": [ - {"opportunity": "adjacent problem or value prop", "rationale": "why it matters"} - ], - "positioning_opportunities": [ - {"angle": "market angle or narrative", "impact": "how it strengthens the brief"} - ], - "growth_and_scale": [ - "bullet — network effects, viral loops, expansion paths" - ], - "strategic_partnerships": [ - {"partner_type": "who", "value": "why this alliance matters"} - ], - "underemphasized_strengths": [ - {"strength": "what's underplayed", "suggestion": "how to elevate it"} - ] -} -``` diff --git a/samples/bmad-bmm-product-brief-preview/references/brief-template.md b/samples/bmad-bmm-product-brief-preview/references/brief-template.md deleted file mode 100644 index 79c5a40..0000000 --- a/samples/bmad-bmm-product-brief-preview/references/brief-template.md +++ /dev/null @@ -1,60 +0,0 @@ -# Product Brief Template - -This is a flexible guide for the executive product brief — adapt it to serve the product's story. Merge sections, add new ones, reorder as needed. The product determines the structure, not the template. - -## Sensible Default Structure - -```markdown -# Product Brief: {Product Name} - -## Executive Summary - -[2-3 paragraph narrative: What is this? What problem does it solve? Why does it matter? Why now? -This should be compelling enough to stand alone — if someone reads only this section, they should understand the vision.] - -## The Problem - -[What pain exists? Who feels it? How are they coping today? What's the cost of the status quo? -Be specific — real scenarios, real frustrations, real consequences.] - -## The Solution - -[What are we building? How does it solve the problem? -Focus on the experience and outcome, not the implementation.] - -## What Makes This Different - -[Key differentiators. Why this approach vs alternatives? What's the unfair advantage? -Be honest — if the moat is execution speed, say so. Don't fabricate technical moats.] - -## Who This Serves - -[Primary users — vivid but brief. Who are they, what do they need, what does success look like for them? -Secondary users if relevant.] - -## Success Criteria - -[How do we know this is working? What metrics matter? -Mix of user success signals and business objectives. Be measurable.] - -## Scope - -[What's in for the first version? What's explicitly out? -Keep this tight — it's a boundary document, not a feature list.] - -## Vision - -[Where does this go if it succeeds? What does it become in 2-3 years? -Inspiring but grounded.] -``` - -## Adaptation Guidelines - -- **For B2B products:** Consider adding a "Buyer vs User" section if they're different people -- **For platforms/marketplaces:** Consider a "Network Effects" or "Ecosystem" section -- **For technical products:** May need a brief "Technical Approach" section (keep it high-level) -- **For regulated industries:** Consider a "Compliance & Regulatory" section -- **If scope is well-defined:** Merge "Scope" and "Vision" into "Roadmap Thinking" -- **If the problem is well-known:** Shorten "The Problem" and expand "What Makes This Different" - -The brief should be 1-2 pages. If it's longer, you're putting in too much detail — that's what the distillate is for. diff --git a/samples/bmad-bmm-product-brief-preview/skeptic-reviewer.md b/samples/bmad-bmm-product-brief-preview/skeptic-reviewer.md deleted file mode 100644 index 5eb511c..0000000 --- a/samples/bmad-bmm-product-brief-preview/skeptic-reviewer.md +++ /dev/null @@ -1,44 +0,0 @@ -# Skeptic Reviewer - -You are a critical analyst reviewing a product brief draft. Your job is to find weaknesses, gaps, and untested assumptions — not to tear it apart, but to make it stronger. - -## Input - -You will receive the complete draft product brief. - -## Review Lens - -Ask yourself: - -- **What's missing?** Are there sections that feel thin or glossed over? -- **What assumptions are untested?** Where does the brief assert things without evidence? -- **What could go wrong?** What risks aren't acknowledged? -- **Where is it vague?** Which claims need more specificity? -- **Does the problem statement hold up?** Is this a real, significant problem or a nice-to-have? -- **Are the differentiators actually defensible?** Could a competitor replicate them easily? -- **Do the success metrics make sense?** Are they measurable and meaningful? -- **Is the MVP scope realistic?** Too ambitious? Too timid? - -## Output - -Return ONLY the following JSON object. No preamble, no commentary. Maximum 5 items per section. Prioritize — lead with the most impactful issues. - -```json -{ - "critical_gaps": [ - {"issue": "what's missing", "impact": "why it matters", "suggestion": "how to fix"} - ], - "untested_assumptions": [ - {"assumption": "what's asserted", "risk": "what could go wrong"} - ], - "unacknowledged_risks": [ - {"risk": "potential failure mode", "severity": "high|medium|low"} - ], - "vague_areas": [ - {"section": "where", "issue": "what's vague", "suggestion": "how to sharpen"} - ], - "suggested_improvements": [ - "actionable suggestion" - ] -} -``` diff --git a/samples/bmad-bmm-product-brief-preview/web-researcher.md b/samples/bmad-bmm-product-brief-preview/web-researcher.md deleted file mode 100644 index d7fc8d2..0000000 --- a/samples/bmad-bmm-product-brief-preview/web-researcher.md +++ /dev/null @@ -1,49 +0,0 @@ -# Web Researcher - -You are a market research analyst. Your job is to find relevant competitive, market, and industry context for a product idea through web searches. - -## Input - -You will receive: -- **Product intent:** A summary of what the product is about, the problem it solves, and the domain it operates in - -## Process - -1. **Identify search angles** based on the product intent: - - Direct competitors (products solving the same problem) - - Adjacent solutions (different approaches to the same pain point) - - Market size and trends for the domain - - Industry news or developments that create opportunity or risk - - User sentiment about existing solutions (what's frustrating people) - -2. **Execute 3-5 targeted web searches** — quality over quantity. Search for: - - "[problem domain] solutions comparison" - - "[competitor names] alternatives" (if competitors are known) - - "[industry] market trends [current year]" - - "[target user type] pain points [domain]" - -3. **Synthesize findings** — don't just list links. Extract the signal. - -## Output - -Return ONLY the following JSON object. No preamble, no commentary. Maximum 5 bullets per section. - -```json -{ - "competitive_landscape": [ - {"name": "competitor", "approach": "one-line description", "gaps": "where they fall short"} - ], - "market_context": [ - "bullet — market size, growth trends, relevant data points" - ], - "user_sentiment": [ - "bullet — what users say about existing solutions" - ], - "timing_and_opportunity": [ - "bullet — why now, enabling shifts" - ], - "risks_and_considerations": [ - "bullet — market risks, competitive threats, regulatory concerns" - ] -} -``` diff --git a/src/skills/bmad-bmb-manifest/SKILL.md b/src/skills/bmad-bmb-manifest/SKILL.md deleted file mode 100644 index 2d62aec..0000000 --- a/src/skills/bmad-bmb-manifest/SKILL.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -name: bmad-bmb-manifest -description: Returns the BMad Builder (bmb) module manifest for bmad-init configuration setup. Only use when bmad-get-manifest-bmb is specifically invoked by name. -user-invocable: false ---- - -# ONLY STEP - -1. Read and return the full `bmad-skill-manifest.json` contents exactly. diff --git a/src/skills/bmad-bmb-manifest/bmad-skill-manifest.yaml b/src/skills/bmad-bmb-manifest/bmad-skill-manifest.yaml deleted file mode 100644 index e4fe792..0000000 --- a/src/skills/bmad-bmb-manifest/bmad-skill-manifest.yaml +++ /dev/null @@ -1,21 +0,0 @@ -type: skill -code: bmb -name: "BMad Builder" -description: "Standard Skill Compliant Factory for BMad Agents, Workflows and Modules" -default_selected: false - -installer-config-options: - bmad_builder_output_folder: - prompt: "Where should your custom skills (agents and workflows) be saved?" - default: "_bmad-output/skills" - result: "{project-root}/{value}" - - bmad_builder_reports: - prompt: "Output for Evals, Test, Quality and Planning Reports?" - default: "_bmad-output/reports" - result: "{project-root}/{value}" - -# installer-intro-message: > - -# installer-outro-message: > - From e91b4c61efc806254b3348f5b4ef93919d4ed0dc Mon Sep 17 00:00:00 2001 From: Brian Madison Date: Sun, 15 Mar 2026 21:44:35 -0500 Subject: [PATCH 4/6] optimizer improvements, all fragements now go into report and also produce a final html report --- quality-report-full.png | Bin 0 -> 137772 bytes quality-report-modal.png | Bin 0 -> 227372 bytes .../assets/quality-report-template.md | 283 ++++++ .../bmad-agent-builder/quality-optimizer.md | 15 +- .../report-quality-scan-creator.md | 237 ++--- .../scripts/generate-html-report.py | 848 ++++++++++++++++++ .../scripts/scan-scripts.py | 292 +++++- .../assets/quality-report-template.md | 261 ++++++ .../quality-optimizer.md | 15 +- .../report-quality-scan-creator.md | 204 ++--- .../scripts/generate-html-report.py | 848 ++++++++++++++++++ .../scripts/scan-scripts.py | 292 +++++- 12 files changed, 2984 insertions(+), 311 deletions(-) create mode 100644 quality-report-full.png create mode 100644 quality-report-modal.png create mode 100644 src/skills/bmad-agent-builder/assets/quality-report-template.md create mode 100644 src/skills/bmad-agent-builder/scripts/generate-html-report.py create mode 100644 src/skills/bmad-workflow-builder/assets/quality-report-template.md create mode 100644 src/skills/bmad-workflow-builder/scripts/generate-html-report.py diff --git a/quality-report-full.png b/quality-report-full.png new file mode 100644 index 0000000000000000000000000000000000000000..aab2a47d2b5bf6d4d5d629a589989f26f9b56e72 GIT binary patch literal 137772 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 literal 0 HcmV?d00001 diff --git a/src/skills/bmad-agent-builder/assets/quality-report-template.md b/src/skills/bmad-agent-builder/assets/quality-report-template.md new file mode 100644 index 0000000..4759bcc --- /dev/null +++ b/src/skills/bmad-agent-builder/assets/quality-report-template.md @@ -0,0 +1,283 @@ +# Quality Report: {agent-name} + +**Scanned:** {timestamp} +**Skill Path:** {skill-path} +**Report:** {report-file-path} +**Performed By** QualityReportBot-9001 and {user_name} + +## Executive Summary + +- **Total Issues:** {total-issues} +- **Critical:** {critical} | **High:** {high} | **Medium:** {medium} | **Low:** {low} +- **Overall Quality:** {Excellent|Good|Fair|Poor} +- **Overall Cohesion:** {cohesion-score} +- **Craft Assessment:** {craft-assessment} + + +{executive-narrative} + +### Issues by Category + +| Category | Critical | High | Medium | Low | +|----------|----------|------|--------|-----| +| Structure & Capabilities | {n} | {n} | {n} | {n} | +| Prompt Craft | {n} | {n} | {n} | {n} | +| Execution Efficiency | {n} | {n} | {n} | {n} | +| Path & Script Standards | {n} | {n} | {n} | {n} | +| Agent Cohesion | {n} | {n} | {n} | {n} | +| Creative | — | — | {n} | {n} | + +--- + +## Agent Identity + + + +- **Persona:** {persona-summary} +- **Primary Purpose:** {primary-purpose} +- **Capabilities:** {capability-count} + +--- + +## Strengths + +*What this agent does well — preserve these during optimization:* + + + +{strengths-list} + +--- + +{if-truly-broken} +## Truly Broken or Missing + +*Issues that prevent the agent from working correctly:* + + + +{truly-broken-findings} + +--- +{/if-truly-broken} + +## Detailed Findings by Category + +### 1. Structure & Capabilities + + + +{if-structure-metadata} +**Agent Metadata:** +- Sections found: {sections-list} +- Capabilities: {capabilities-count} +- Memory sidecar: {has-memory} +- Headless mode: {has-headless} +- Manifest valid: {manifest-valid} +- Structure assessment: {structure-assessment} +{/if-structure-metadata} + + + +{structure-findings} + +### 2. Prompt Craft + + + +**Agent Assessment:** +- Agent type: {skill-type-assessment} +- Overview quality: {overview-quality} +- Progressive disclosure: {progressive-disclosure} +- Persona context: {persona-context} +- {skillmd-assessment-notes} + +{if-prompt-health} +**Prompt Health:** {prompts-with-config-header}/{total-prompts} with config header | {prompts-with-progression}/{total-prompts} with progression conditions | {prompts-self-contained}/{total-prompts} self-contained +{/if-prompt-health} + +{prompt-craft-findings} + +### 3. Execution Efficiency + + + +{efficiency-issue-findings} + +{if-efficiency-opportunities} +**Optimization Opportunities:** + + + +{efficiency-opportunities} +{/if-efficiency-opportunities} + +### 4. Path & Script Standards + + + +{if-script-inventory} +**Script Inventory:** {total-scripts} scripts ({by-type-breakdown}) | Missing tests: {missing-tests-list} +{/if-script-inventory} + +{path-script-findings} + +### 5. Agent Cohesion + + + +{if-cohesion-analysis} +**Cohesion Analysis:** + + + +| Dimension | Score | Notes | +|-----------|-------|-------| +| Persona Alignment | {score} | {notes} | +| Capability Completeness | {score} | {notes} | +| Redundancy Level | {score} | {notes} | +| External Integration | {score} | {notes} | +| User Journey | {score} | {notes} | + +{if-consolidation-opportunities} +**Consolidation Opportunities:** + + + +{consolidation-opportunities} +{/if-consolidation-opportunities} +{/if-cohesion-analysis} + +{cohesion-findings} + +{if-creative-suggestions} +**Creative Suggestions:** + + + +{creative-suggestions} +{/if-creative-suggestions} + +### 6. Creative (Edge-Case & Experience Innovation) + + + +**Agent Understanding:** +- **Purpose:** {skill-purpose} +- **Primary User:** {primary-user} +- **Key Assumptions:** +{key-assumptions-list} + +**Enhancement Findings:** + + + +{enhancement-findings} + +{if-top-insights} +**Top Insights:** + + + +{top-insights} +{/if-top-insights} + +--- + +{if-user-journeys} +## User Journeys + +*How different user archetypes experience this agent:* + + + +### {archetype-name} + +{journey-summary} + +**Friction Points:** +{friction-points-list} + +**Bright Spots:** +{bright-spots-list} + + + +--- +{/if-user-journeys} + +{if-autonomous-assessment} +## Autonomous Readiness + + + +- **Overall Potential:** {overall-potential} +- **HITL Interaction Points:** {hitl-count} +- **Auto-Resolvable:** {auto-resolvable-count} +- **Needs Input:** {needs-input-count} +- **Suggested Output Contract:** {output-contract} +- **Required Inputs:** {required-inputs-list} +- **Notes:** {assessment-notes} + +--- +{/if-autonomous-assessment} + +{if-script-opportunities} +## Script Opportunities + + + +**Existing Scripts:** {existing-scripts-list} + + + +{script-opportunity-findings} + +**Token Savings:** {total-estimated-token-savings} | Highest value: {highest-value-opportunity} | Prepass opportunities: {prepass-count} + +--- +{/if-script-opportunities} + +## Quick Wins (High Impact, Low Effort) + + + +| Issue | File | Effort | Impact | +|-------|------|--------|--------| +{quick-wins-rows} + +--- + +## Optimization Opportunities + + + +**Token Efficiency:** +{token-optimization-narrative} + +**Performance:** +{performance-optimization-narrative} + +**Maintainability:** +{maintainability-optimization-narrative} + +--- + +## Recommendations + + + +1. {recommendation-1} +2. {recommendation-2} +3. {recommendation-3} +4. {recommendation-4} +5. {recommendation-5} diff --git a/src/skills/bmad-agent-builder/quality-optimizer.md b/src/skills/bmad-agent-builder/quality-optimizer.md index 3573b21..0a43163 100644 --- a/src/skills/bmad-agent-builder/quality-optimizer.md +++ b/src/skills/bmad-agent-builder/quality-optimizer.md @@ -158,6 +158,16 @@ After all scripts and scanners complete: - `{temp-files-dir}` — Directory containing all `*-temp.json` files (both script and LLM results) - `{quality-report-dir}` — Where to write the final report +## Generate HTML Report + +After the report creator finishes (or after presenting lint-only / single-scanner results), generate the interactive HTML report: + +```bash +python3 scripts/generate-html-report.py {quality-report-dir} --open +``` + +This produces `{quality-report-dir}/quality-report.html` — a self-contained interactive report with severity filters, collapsible sections, per-item copy-prompt buttons, and a batch prompt generator. The `--open` flag opens it in the default browser. + ## Present Findings to User After receiving the JSON summary from the report creator: @@ -169,6 +179,7 @@ After receiving the JSON summary from the report creator: "headless_mode": true, "scan_completed": true, "report_file": "{full-path-to-report}", + "html_report": "{full-path-to-html}", "warnings": ["any warnings from pre-scan checks"], "summary": { "total_issues": 0, @@ -186,10 +197,10 @@ After receiving the JSON summary from the report creator: **IF `{headless_mode}=false` or not set:** 1. **High-level summary** with total issues by severity 2. **Highlight truly broken/missing** — CRITICAL and HIGH issues prominently -3. **Mention detailed report** — "Full report saved to: {report_file}" +3. **Mention reports** — "Full report: {report_file}" and "Interactive HTML report opened in browser (also at: {html_report})" 4. **Offer next steps:** - Apply fixes directly - - Export checklist for manual fixes + - Use the HTML report to select specific items and generate prompts - Discuss specific findings ## Key Principle diff --git a/src/skills/bmad-agent-builder/report-quality-scan-creator.md b/src/skills/bmad-agent-builder/report-quality-scan-creator.md index a49a9ae..3afd474 100644 --- a/src/skills/bmad-agent-builder/report-quality-scan-creator.md +++ b/src/skills/bmad-agent-builder/report-quality-scan-creator.md @@ -1,147 +1,92 @@ # Quality Scan Report Creator -You are a master quality engineer tech writer agent QualityReportBot-9001 and you will create a comprehensive, cohesive quality report from multiple scanner outputs. You read all temporary JSON fragments, consolidate findings, remove duplicates, and produce a well-organized markdown report. Ensure that nothing is missed. You are quality obsessed, after your initial report is created as outlined in this file, you will re-scan every temp finding again and think one level deeper to ensure its properly covered all findings and accounted for in the report, including proposed remediation suggestions. You will never attempt to actually fix anything - you are a master quality engineer tech writer. +You are a master quality engineer tech writer agent QualityReportBot-9001. You create comprehensive, cohesive quality reports from multiple scanner outputs. You read all temporary JSON fragments, consolidate findings, remove duplicates, and produce a well-organized markdown report using the provided template. You are quality obsessed — nothing gets dropped. You will never attempt to fix anything — you are a writer, not a fixer. ## Inputs -You will receive: - `{skill-path}` — Path to the agent being validated - `{quality-report-dir}` — Directory containing scanner temp files AND where to write the final report -## Process - -1. List all `*-temp.json` files in `{quality-report-dir}` -2. Read each JSON file and extract all findings -3. Consolidate and deduplicate findings across scanners -4. Organize by category, then by severity within each category -5. Identify truly broken/missing issues (CRITICAL and HIGH severity) -6. Write comprehensive markdown report -7. Return JSON summary with report link and most importantly the truly broken/missing item or failing issues (CRITICAL and HIGH severity) - -## Categories to Organize By - -1. **Structure & Capabilities** — Frontmatter, sections, manifest, capabilities, identity, memory setup (from structure scanner + lint scripts) -2. **Prompt Craft** — Token efficiency, anti-patterns, outcome balance, persona voice, communication consistency (from prompt-craft scanner + lint scripts) -3. **Execution Efficiency** — Parallelization, subagent delegation, memory loading, context optimization (from execution-efficiency scanner) -4. **Path & Script Standards** — Path conventions, double-prefix, script quality, portability (from lint scripts) -5. **Agent Cohesion** — Persona-capability alignment, gaps, redundancies, coherence (from cohesion scanner) -6. **Creative — Edge-case discoveries, experience gaps, delight opportunities, assumption risks (advisory)** (from enhancement scanner — advisory, not errors) - -## Scanner Sources (7 Scanners) - -| Scanner | Temp File | Category | -|---------|-----------|----------| -| structure | structure-temp.json | Structure & Capabilities | -| prompt-craft | prompt-craft-temp.json | Prompt Craft | -| execution-efficiency | execution-efficiency-temp.json | Execution Efficiency | -| path-standards | path-standards-temp.json | Path & Script Standards | -| scripts | scripts-temp.json | Path & Script Standards | -| agent-cohesion | agent-cohesion-temp.json | Agent Cohesion | -| enhancement-opportunities | enhancement-opportunities-temp.json | Enhancement Opportunities | - -## Severity Order Within Categories - -CRITICAL → HIGH → MEDIUM → LOW - -## Report Format - -```markdown -# Quality Report: {Agent Skill Name} - -**Scanned:** {timestamp} -**Skill Path:** {skill-path} -**Report:** {output-file} -**Performed By** QualityReportBot-9001 and {user_name} - -## Executive Summary - -- **Total Issues:** {n} -- **Critical:** {n} | **High:** {n} | **Medium:** {n} | **Low:** {n} -- **Overall Quality:** {Excellent / Good / Fair / Poor} - -### Issues by Category - -| Category | Critical | High | Medium | Low | -|----------|----------|------|--------|-----| -| Structure & Capabilities | {n} | {n} | {n} | {n} | -| Prompt Craft | {n} | {n} | {n} | {n} | -| Execution Efficiency | {n} | {n} | {n} | {n} | -| Path & Script Standards | {n} | {n} | {n} | {n} | -| Agent Cohesion | {n} | {n} | {n} | {n} | -| Creative (Edge-Case & Experience Innovation) | — | — | {n} | {n} | - ---- - -## Truly Broken or Missing - -*Issues that prevent the agent from working correctly:* - -{If any CRITICAL or HIGH issues exist, list them here with brief description and fix} - ---- - -## Detailed Findings by Category - -### 1. Structure & Capabilities +## Template -**Critical Issues** -{if any} +Read `assets/quality-report-template.md` for the report structure. The template contains: +- `{placeholder}` markers — replace with actual data +- `{if-section}...{/if-section}` blocks — include only when data exists, omit entirely when empty +- `` — inline guidance for what data to pull and from where; strip from final output -**High Priority** -{if any} - -**Medium Priority** -{if any} - -**Low Priority (Optional)** -{if any} - -### 2. Prompt Craft -{repeat pattern above} - -### 3. Execution Efficiency -{repeat pattern above} - -### 4. Path & Script Standards -{repeat pattern above} - -### 5. Agent Cohesion -{repeat pattern above, include alignment analysis and creative suggestions} - -### 6. Creative (Edge-Case & Experience Innovation) -{list opportunities, no severity — advisory items only} - ---- - -## Quick Wins (High Impact, Low Effort) - -{List issues that are easy to fix with high value} - ---- - -## Optimization Opportunities - -**Token Efficiency:** -{findings related to token savings} - -**Performance:** -{findings related to execution speed} - -**Maintainability:** -{findings related to code/agent structure} - ---- - -## Recommendations - -1. {Most important action item} -2. {Second priority} -3. {Third priority} -``` - -## Output +## Process -Write report to: `{quality-report-dir}/quality-report-{skill-name}-{timestamp}.md` +### Step 1: Ingest Everything + +1. Read `assets/quality-report-template.md` +2. List ALL files in `{quality-report-dir}` — both `*-temp.json` (scanner findings) and `*-prepass.json` (structural metrics) +3. Read EVERY JSON file + +### Step 2: Extract All Data Types + +For each scanner file, extract not just `issues`/`findings` arrays but ALL of these data types: + +| Data Type | Where It Lives | Report Destination | +|-----------|---------------|-------------------| +| Issues/findings (severity: critical-low) | All scanner `issues[]`/`findings[]` | Detailed Findings by Category | +| Strengths (severity: "strength"/"note", category: "strength") | agent-cohesion, prompt-craft | Strengths section | +| Agent identity | agent-cohesion `agent_identity` | Agent Identity section + Executive Summary | +| Cohesion dimensional analysis | agent-cohesion `cohesion_analysis` | Cohesion Analysis table | +| Consolidation opportunities | agent-cohesion `cohesion_analysis.redundancy_level.consolidation_opportunities` | Consolidation Opportunities in Cohesion | +| Creative suggestions | agent-cohesion `creative_suggestions[]` | Creative Suggestions in Cohesion section | +| Craft & agent assessment | prompt-craft `skillmd_assessment` (incl. `persona_context`), `prompt_health`, `summary.craft_assessment` | Prompt Craft section header + Executive Summary | +| Structure metadata | structure `metadata` (has_memory, has_headless, manifest_valid, etc.) | Structure & Capabilities section header | +| User journeys | enhancement-opportunities `user_journeys[]` | User Journeys section | +| Autonomous assessment | enhancement-opportunities `autonomous_assessment` | Autonomous Readiness section | +| Skill understanding | enhancement-opportunities `skill_understanding` | Creative section header | +| Top insights | enhancement-opportunities `top_insights[]` | Top Insights in Creative section | +| Optimization opportunities | execution-efficiency `opportunities[]` | Optimization Opportunities in Efficiency section | +| Script inventory & token savings | scripts `script_summary`, script-opportunities `summary` | Scripts sections | +| Prepass metrics | `*-prepass.json` files | Context data points where useful | + +### Step 3: Populate Template + +Fill the template section by section, following the `` guidance in each. Key rules: + +- **Conditional sections:** Only include `{if-...}` blocks when the data exists. If a scanner didn't produce user_journeys, omit the entire User Journeys section. +- **Empty severity levels:** Within a category, omit severity sub-headers that have zero findings. +- **Persona voice:** When reporting prompt-craft findings, remember that persona voice is INVESTMENT for agents, not waste. Reflect the scanner's nuance field if present. +- **Strip comments:** Remove all `` blocks from final output. + +### Step 4: Deduplicate + +- **Same issue, two scanners:** Keep ONE entry, cite both sources. Use the more detailed description. +- **Same issue pattern, multiple files:** List once with all file:line references in a table. +- **Issue + strength about same thing:** Keep BOTH — strength shows what works, issue shows what could be better. +- **Overlapping creative suggestions:** Merge into the richer description. +- **Routing:** "note"/"strength" severity → Strengths section. "suggestion" severity → Creative subsection. Do not mix these into issue lists. + +### Step 5: Verification Pass + +**This step is mandatory.** After populating the report, re-read every temp file and verify against this checklist: + +- [ ] Every finding from every `*-temp.json` issues/findings array +- [ ] Agent identity block (persona_summary, primary_purpose, capability_count) +- [ ] All strengths (agent-cohesion `strengths[]` AND severity="strength" findings) +- [ ] All positive notes from prompt-craft (severity="note") +- [ ] Cohesion analysis dimensional scores table (if present) +- [ ] Consolidation opportunities from cohesion redundancy analysis +- [ ] Craft assessment, skill type assessment, and persona context assessment +- [ ] Structure metadata (sections_found, has_memory, has_headless, manifest_valid) +- [ ] ALL user journeys with ALL friction_points and bright_spots per archetype +- [ ] The autonomous_assessment block (all fields) +- [ ] All creative_suggestions from agent-cohesion +- [ ] All opportunities from execution-efficiency +- [ ] All top_insights from enhancement-opportunities +- [ ] Script inventory and token savings from script-opportunities +- [ ] Skill understanding (purpose, primary_user, key_assumptions) +- [ ] Prompt health summary from prompt-craft (if prompts exist) + +If any item was dropped, add it to the appropriate section before writing. + +### Step 6: Write and Return + +Write report to: `{quality-report-dir}/quality-report.md` Return JSON: @@ -154,8 +99,13 @@ Return JSON: "high": 0, "medium": 0, "low": 0, + "strengths_count": 0, + "enhancements_count": 0, + "user_journeys_count": 0, "overall_quality": "Excellent|Good|Fair|Poor", - "truly_broken_found": true|false, + "overall_cohesion": "cohesive|mostly-cohesive|fragmented|confused", + "craft_assessment": "brief summary from prompt-craft", + "truly_broken_found": true, "truly_broken_count": 0 }, "by_category": { @@ -164,7 +114,7 @@ Return JSON: "execution_efficiency": {"critical": 0, "high": 0, "medium": 0, "low": 0}, "path_script_standards": {"critical": 0, "high": 0, "medium": 0, "low": 0}, "agent_cohesion": {"critical": 0, "high": 0, "medium": 0, "low": 0}, - "enhancement_opportunities": {"count": 0, "description": "Creative — edge-case discoveries, experience gaps, delight opportunities, assumption risks"} + "creative": {"high_opportunity": 0, "medium_opportunity": 0, "low_opportunity": 0} }, "high_impact_quick_wins": [ {"issue": "description", "file": "location", "effort": "low"} @@ -172,10 +122,15 @@ Return JSON: } ``` -## Notes +## Scanner Reference -- Remove duplicate issues that appear in multiple scanner outputs -- If the same issue is found in multiple files, list it once with all affected files -- Preserve all CRITICAL and HIGH severity findings — these indicate broken functionality -- MEDIUM and LOW can be consolidated if they're similar -- Autonomous opportunities are not "issues" — they're enhancements, so categorize separately +| Scanner | Temp File | Primary Category | +|---------|-----------|-----------------| +| structure | structure-temp.json | Structure & Capabilities | +| prompt-craft | prompt-craft-temp.json | Prompt Craft | +| execution-efficiency | execution-efficiency-temp.json | Execution Efficiency | +| path-standards | path-standards-temp.json | Path & Script Standards | +| scripts | scripts-temp.json | Path & Script Standards | +| script-opportunities | script-opportunities-temp.json | Script Opportunities | +| agent-cohesion | agent-cohesion-temp.json | Agent Cohesion | +| enhancement-opportunities | enhancement-opportunities-temp.json | Creative | diff --git a/src/skills/bmad-agent-builder/scripts/generate-html-report.py b/src/skills/bmad-agent-builder/scripts/generate-html-report.py new file mode 100644 index 0000000..df07336 --- /dev/null +++ b/src/skills/bmad-agent-builder/scripts/generate-html-report.py @@ -0,0 +1,848 @@ +# /// script +# requires-python = ">=3.9" +# /// + +#!/usr/bin/env python3 +""" +Generate an interactive HTML quality report from scanner temp JSON files. + +Reads all *-temp.json and *-prepass.json files from a quality scan output +directory, normalizes findings into a unified data model, and produces a +self-contained HTML report with: + - Collapsible sections with severity filter badges + - Per-item copy-prompt buttons + - Multi-select batch prompt generator + - Executive summary with severity counts + +Usage: + python3 generate-html-report.py {quality-report-dir} [--open] [--skill-path /path/to/skill] + +The --skill-path is embedded in the prompt context so generated prompts +reference the correct location. If omitted, it is read from the first +temp JSON that contains a skill_path field. +""" + +from __future__ import annotations + +import argparse +import json +import platform +import subprocess +import sys +from datetime import datetime, timezone +from pathlib import Path + + +# ============================================================================= +# Normalization — diverse scanner JSONs → unified item model +# ============================================================================= + +SEVERITY_RANK = { + 'critical': 0, 'high': 1, 'medium': 2, 'low': 3, + 'high-opportunity': 1, 'medium-opportunity': 2, 'low-opportunity': 3, + 'note': 4, 'strength': 5, 'suggestion': 4, 'info': 5, +} + +# Map scanner names to report sections +SCANNER_SECTIONS = { + 'workflow-integrity': 'structural', + 'structure': 'structure-capabilities', + 'prompt-craft': 'prompt-craft', + 'execution-efficiency': 'efficiency', + 'skill-cohesion': 'cohesion', + 'agent-cohesion': 'cohesion', + 'path-standards': 'quality', + 'scripts': 'scripts', + 'script-opportunities': 'script-opportunities', + 'enhancement-opportunities': 'creative', +} + +SECTION_LABELS = { + 'structural': 'Structural', + 'structure-capabilities': 'Structure & Capabilities', + 'prompt-craft': 'Prompt Craft', + 'efficiency': 'Efficiency', + 'cohesion': 'Cohesion', + 'quality': 'Path & Script Standards', + 'scripts': 'Scripts', + 'script-opportunities': 'Script Opportunities', + 'creative': 'Creative & Enhancements', +} + + +def normalize_finding(f: dict, scanner: str, idx: int) -> dict: + """Normalize a single finding/issue dict into the unified item model.""" + sev = f.get('severity', 'low') + section = SCANNER_SECTIONS.get(scanner, 'other') + + # Determine item type + if sev in ('strength', 'note') or f.get('category') == 'strength': + item_type = 'strength' + action_type = 'none' + selectable = False + elif sev.endswith('-opportunity'): + item_type = 'enhancement' + action_type = 'enhance' + selectable = True + elif f.get('category') == 'suggestion' or sev == 'suggestion': + item_type = 'suggestion' + action_type = 'refactor' + selectable = True + else: + item_type = 'issue' + action_type = 'fix' + selectable = True + + # Build title — different scanners use different fields + title = ( + f.get('issue') + or _first_sentence(f.get('scenario', '')) + or _first_sentence(f.get('current_behavior', '')) + or f.get('observation', '') + or 'Finding' + ) + + # Build description + desc_parts = [] + for key in ('rationale', 'observation', 'insight', 'scenario', + 'current_behavior', 'current_pattern', 'nuance'): + v = f.get(key) + if v and v != title: + desc_parts.append(v) + description = ' '.join(desc_parts) if desc_parts else title + + # Build action/fix + action = ( + f.get('fix') + or f.get('suggestion') + or f.get('efficient_alternative') + or f.get('script_alternative') + or '' + ) + + # Build impact + impact = ( + f.get('user_impact') + or f.get('impact') + or f.get('estimated_savings') + or f.get('estimated_token_savings') + or '' + ) + + # Script-opportunity specific + if scanner == 'script-opportunities': + action_type = 'create-script' + extra = {} + for k in ('determinism_confidence', 'implementation_complexity', + 'language', 'could_be_prepass', 'reusable_across_skills'): + if k in f: + extra[k] = f[k] + else: + extra = {} + + return { + 'id': f'{scanner}-{idx:03d}', + 'scanner': scanner, + 'section': section, + 'type': item_type, + 'severity': sev, + 'rank': SEVERITY_RANK.get(sev, 3), + 'category': f.get('category', ''), + 'file': f.get('file', ''), + 'line': f.get('line'), + 'title': title, + 'description': description, + 'action': action, + 'impact': str(impact) if impact else '', + 'extra': extra, + 'selectable': selectable, + 'action_type': action_type, + } + + +def _first_sentence(text: str) -> str: + """Extract the first sentence from a string.""" + if not text: + return '' + for end in ('. ', '.\n', '—'): + pos = text.find(end) + if 0 < pos < 120: + return text[:pos + 1].strip() + return text[:120].strip() + + +def normalize_scanner(data: dict) -> tuple[list[dict], dict]: + """ + Normalize a full scanner JSON into (items, meta). + Returns list of normalized items + dict of meta/assessment data. + """ + scanner = data.get('scanner', 'unknown') + items = [] + meta = {} + + # Normalize issues/findings arrays + findings = data.get('issues', data.get('findings', [])) + for idx, f in enumerate(findings): + items.append(normalize_finding(f, scanner, idx)) + + # Normalize opportunities (execution-efficiency has separate array) + for idx, opp in enumerate(data.get('opportunities', []), start=len(findings)): + opp_item = normalize_finding(opp, scanner, idx) + opp_item['type'] = 'enhancement' + opp_item['action_type'] = 'enhance' + opp_item['selectable'] = True + items.append(opp_item) + + # Extract strengths array (cohesion scanners) + for idx, s in enumerate(data.get('strengths', [])): + items.append({ + 'id': f'{scanner}-str-{idx:03d}', + 'scanner': scanner, + 'section': SCANNER_SECTIONS.get(scanner, 'cohesion'), + 'type': 'strength', + 'severity': 'strength', + 'rank': 5, + 'category': 'strength', + 'file': '', + 'line': None, + 'title': s if isinstance(s, str) else str(s), + 'description': '', + 'action': '', + 'impact': '', + 'extra': {}, + 'selectable': False, + 'action_type': 'none', + }) + + # Extract creative_suggestions (cohesion scanners) + for idx, cs in enumerate(data.get('creative_suggestions', [])): + items.append({ + 'id': f'{scanner}-cs-{idx:03d}', + 'scanner': scanner, + 'section': SCANNER_SECTIONS.get(scanner, 'cohesion'), + 'type': 'suggestion', + 'severity': 'suggestion', + 'rank': 4, + 'category': cs.get('type', 'suggestion'), + 'file': '', + 'line': None, + 'title': cs.get('idea', ''), + 'description': cs.get('rationale', ''), + 'action': cs.get('idea', ''), + 'impact': cs.get('estimated_impact', ''), + 'extra': {}, + 'selectable': True, + 'action_type': 'refactor', + }) + + # Collect meta/assessment data + for key in ('cohesion_analysis', 'autonomous_assessment', 'skill_understanding', + 'agent_identity', 'skill_identity', 'skillmd_assessment', + 'prompt_health', 'metadata', 'script_summary', 'stage_summary', + 'skill_type_assessment', 'top_insights', 'summary'): + if key in data: + meta[key] = data[key] + + return items, meta + + +def build_journeys(data: dict) -> list[dict]: + """Extract user journey data from enhancement-opportunities scanner.""" + return data.get('user_journeys', []) + + +# ============================================================================= +# Report Data Assembly +# ============================================================================= + +def load_report_data(report_dir: Path, skill_path: str | None) -> dict: + """Load all temp/prepass JSONs and assemble normalized report data.""" + all_items = [] + all_meta = {} + journeys = [] + detected_skill_path = skill_path + + # Read all JSON files + json_files = sorted(report_dir.glob('*.json')) + for jf in json_files: + try: + data = json.loads(jf.read_text(encoding='utf-8')) + except (json.JSONDecodeError, OSError): + continue + + if not isinstance(data, dict): + continue + + scanner = data.get('scanner', jf.stem.replace('-temp', '').replace('-prepass', '')) + + # Detect skill path from scanner data + if not detected_skill_path: + detected_skill_path = data.get('skill_path') or data.get('agent_path') + + # Only normalize temp files (not prepass) + if '-temp' in jf.name or jf.name in ('path-standards-temp.json', 'scripts-temp.json'): + items, meta = normalize_scanner(data) + all_items.extend(items) + all_meta[scanner] = meta + + if scanner == 'enhancement-opportunities': + journeys = build_journeys(data) + elif '-prepass' in jf.name: + all_meta[f'prepass-{scanner}'] = data + + # Sort items: severity rank first, then section + all_items.sort(key=lambda x: (x['rank'], x['section'])) + + # Build severity counts + counts = {'critical': 0, 'high': 0, 'medium': 0, 'low': 0} + for item in all_items: + if item['type'] == 'issue' and item['severity'] in counts: + counts[item['severity']] += 1 + + enhancement_count = sum(1 for i in all_items if i['type'] == 'enhancement') + strength_count = sum(1 for i in all_items if i['type'] == 'strength') + total_issues = sum(counts.values()) + + # Quality grade + if counts['critical'] > 0: + grade = 'Poor' + elif counts['high'] > 2: + grade = 'Fair' + elif counts['high'] > 0 or counts['medium'] > 5: + grade = 'Good' + else: + grade = 'Excellent' + + # Extract assessments for display + assessments = {} + for scanner_key, meta in all_meta.items(): + for akey in ('cohesion_analysis', 'autonomous_assessment', 'skill_understanding', + 'agent_identity', 'skill_identity', 'prompt_health', + 'skillmd_assessment', 'top_insights'): + if akey in meta: + assessments[akey] = meta[akey] + if 'summary' in meta: + s = meta['summary'] + if 'craft_assessment' in s: + assessments['craft_assessment'] = s['craft_assessment'] + if 'overall_cohesion' in s: + assessments['overall_cohesion'] = s['overall_cohesion'] + + # Skill name from path + sp = detected_skill_path or str(report_dir) + skill_name = Path(sp).name + + return { + 'meta': { + 'skill_name': skill_name, + 'skill_path': detected_skill_path or '', + 'timestamp': datetime.now(timezone.utc).isoformat(), + 'scanner_count': len([f for f in json_files if '-temp' in f.name]), + 'report_dir': str(report_dir), + }, + 'executive_summary': { + 'total_issues': total_issues, + 'counts': counts, + 'enhancement_count': enhancement_count, + 'strength_count': strength_count, + 'grade': grade, + 'craft_assessment': assessments.get('craft_assessment', ''), + 'overall_cohesion': assessments.get('overall_cohesion', ''), + }, + 'items': all_items, + 'journeys': journeys, + 'assessments': assessments, + 'section_labels': SECTION_LABELS, + } + + +# ============================================================================= +# HTML Generation +# ============================================================================= + +HTML_TEMPLATE = r""" + + + + +Quality Report: SKILL_NAME_PLACEHOLDER + + + + +

Quality Report:

+
+ +
+ +
+ +
+ + + + + + + +""" + + +def generate_html(report_data: dict) -> str: + """Inject report data into the HTML template.""" + data_json = json.dumps(report_data, indent=None, ensure_ascii=False) + # Embed the JSON as a script tag before the main script + data_tag = f'' + # Insert before the main + +""" + + +def generate_html(report_data: dict) -> str: + """Inject report data into the HTML template.""" + data_json = json.dumps(report_data, indent=None, ensure_ascii=False) + # Embed the JSON as a script tag before the main script + data_tag = f'' + # Insert before the main