bmad-method 6.0.0-alpha.6 → 6.0.0-alpha.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +13 -6
- package/.github/workflows/{lint.yaml → quality.yaml} +19 -2
- package/.husky/pre-commit +4 -0
- package/README.md +59 -1
- package/bmad/_cfg/agent-manifest.csv +2 -8
- package/bmad/_cfg/files-manifest.csv +8 -202
- package/bmad/_cfg/ides/claude-code.yaml +3 -4
- package/bmad/_cfg/manifest.yaml +5 -4
- package/bmad/_cfg/task-manifest.csv +8 -1
- package/bmad/_cfg/tool-manifest.csv +2 -0
- package/bmad/_cfg/workflow-manifest.csv +4 -31
- package/bmad/bmb/config.yaml +2 -2
- package/bmad/bmb/workflows/create-agent/instructions.md +25 -9
- package/bmad/bmb/workflows/create-module/module-structure.md +34 -0
- package/bmad/core/config.yaml +2 -2
- package/docs/installers-bundlers/installers-modules-platforms-reference.md +61 -0
- package/package.json +5 -3
- package/src/core/tasks/adv-elicit.xml +1 -1
- package/src/modules/bmb/workflows/create-agent/instructions.md +25 -9
- package/src/modules/bmb/workflows/create-module/module-structure.md +34 -0
- package/src/modules/bmgd/README.md +208 -0
- package/src/modules/bmgd/_module-installer/install-config.yaml +66 -0
- package/src/modules/{bmm → bmgd}/agents/game-architect.agent.yaml +5 -12
- package/src/modules/{bmm → bmgd}/agents/game-designer.agent.yaml +10 -22
- package/src/modules/{bmm → bmgd}/agents/game-dev.agent.yaml +9 -10
- package/src/modules/bmgd/agents/game-scrum-master.agent.yaml +70 -0
- package/{bmad/bmm → src/modules/bmgd}/teams/team-gamedev.yaml +3 -1
- package/src/modules/{bmm/workflows/1-analysis → bmgd/workflows/1-preproduction}/brainstorm-game/workflow.yaml +7 -7
- package/src/modules/{bmm/workflows/1-analysis → bmgd/workflows/1-preproduction}/game-brief/workflow.yaml +9 -9
- package/src/modules/bmgd/workflows/2-design/gdd/workflow.yaml +81 -0
- package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/narrative/workflow.yaml +6 -6
- package/{bmad/bmm/workflows/3-solutioning/architecture → src/modules/bmgd/workflows/3-technical/game-architecture}/workflow.yaml +16 -16
- package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/code-review/workflow.yaml +3 -1
- package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/correct-course/workflow.yaml +3 -1
- package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/create-story/workflow.yaml +3 -1
- package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/dev-story/workflow.yaml +3 -1
- package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/epic-tech-context/workflow.yaml +3 -1
- package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/retrospective/workflow.yaml +3 -1
- package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/sprint-planning/workflow.yaml +3 -1
- package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/story-context/workflow.yaml +3 -1
- package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/story-done/workflow.yaml +3 -1
- package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/story-ready/workflow.yaml +3 -1
- package/src/modules/bmm/docs/README.md +8 -9
- package/src/modules/bmm/docs/agents-guide.md +0 -1
- package/src/modules/bmm/docs/brownfield-guide.md +5 -9
- package/src/modules/bmm/docs/faq.md +4 -6
- package/src/modules/bmm/docs/glossary.md +0 -1
- package/src/modules/bmm/docs/quick-spec-flow.md +4 -4
- package/src/modules/bmm/docs/quick-start.md +4 -4
- package/src/modules/bmm/docs/scale-adaptive-system.md +5 -5
- package/src/modules/bmm/docs/test-architecture.md +183 -118
- package/src/modules/bmm/docs/workflows-analysis.md +203 -539
- package/src/modules/bmm/docs/workflows-planning.md +326 -850
- package/src/modules/bmm/docs/workflows-solutioning.md +250 -505
- package/src/modules/bmm/workflows/1-analysis/domain-research/workflow.yaml +65 -32
- package/src/modules/bmm/workflows/1-analysis/product-brief/workflow.yaml +4 -0
- package/src/modules/bmm/workflows/1-analysis/research/instructions-market.md +1 -1
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/workflow.yaml +34 -5
- package/src/modules/bmm/workflows/2-plan-workflows/prd/instructions.md +1 -1
- package/src/modules/bmm/workflows/2-plan-workflows/prd/workflow.yaml +8 -0
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/workflow.yaml +6 -0
- package/src/modules/bmm/workflows/3-solutioning/architecture/workflow.yaml +47 -0
- package/src/modules/bmm/workflows/workflow-status/init/instructions.md +50 -0
- package/src/modules/bmm/workflows/workflow-status/paths/enterprise-brownfield.yaml +18 -11
- package/src/modules/bmm/workflows/workflow-status/paths/enterprise-greenfield.yaml +18 -11
- package/src/modules/bmm/workflows/workflow-status/paths/game-design.yaml +42 -65
- package/test/test-installation-components.js +214 -0
- package/tools/cli/bundlers/web-bundler.js +127 -8
- package/tools/cli/installers/lib/ide/auggie.js +9 -20
- package/tools/cli/installers/lib/ide/claude-code.js +33 -3
- package/tools/cli/installers/lib/ide/cursor.js +17 -0
- package/tools/cli/installers/lib/modules/manager.js +128 -0
- package/tools/cli/lib/yaml-xml-builder.js +9 -1
- package/tools/schema/agent.js +1 -0
- package/v6-open-items.md +3 -9
- package/web-bundles/bmm/agents/analyst.xml +5028 -0
- package/web-bundles/bmm/agents/architect.xml +2047 -0
- package/web-bundles/bmm/agents/dev.xml +68 -0
- package/web-bundles/bmm/agents/pm.xml +3808 -0
- package/web-bundles/bmm/agents/sm.xml +77 -0
- package/web-bundles/bmm/agents/tea.xml +66 -0
- package/web-bundles/bmm/agents/tech-writer.xml +84 -0
- package/web-bundles/bmm/agents/ux-designer.xml +2018 -0
- package/web-bundles/bmm/teams/team-fullstack.xml +12039 -0
- package/.claude/agents/bmad-analysis/api-documenter.md +0 -102
- package/.claude/agents/bmad-analysis/codebase-analyzer.md +0 -82
- package/.claude/agents/bmad-analysis/data-analyst.md +0 -101
- package/.claude/agents/bmad-analysis/pattern-detector.md +0 -84
- package/.claude/agents/bmad-planning/dependency-mapper.md +0 -83
- package/.claude/agents/bmad-planning/epic-optimizer.md +0 -81
- package/.claude/agents/bmad-planning/requirements-analyst.md +0 -61
- package/.claude/agents/bmad-planning/technical-decisions-curator.md +0 -168
- package/.claude/agents/bmad-planning/trend-spotter.md +0 -115
- package/.claude/agents/bmad-planning/user-journey-mapper.md +0 -123
- package/.claude/agents/bmad-planning/user-researcher.md +0 -72
- package/.claude/agents/bmad-research/market-researcher.md +0 -51
- package/.claude/agents/bmad-research/tech-debt-auditor.md +0 -106
- package/.claude/agents/bmad-review/document-reviewer.md +0 -102
- package/.claude/agents/bmad-review/technical-evaluator.md +0 -68
- package/.claude/agents/bmad-review/test-coverage-analyzer.md +0 -108
- package/.claude/commands/bmad/bmb/workflows/README.md +0 -67
- package/.claude/commands/bmad/bmm/agents/analyst.md +0 -67
- package/.claude/commands/bmad/bmm/agents/architect.md +0 -72
- package/.claude/commands/bmad/bmm/agents/dev.md +0 -69
- package/.claude/commands/bmad/bmm/agents/pm.md +0 -76
- package/.claude/commands/bmad/bmm/agents/sm.md +0 -85
- package/.claude/commands/bmad/bmm/agents/tea.md +0 -72
- package/.claude/commands/bmad/bmm/agents/tech-writer.md +0 -82
- package/.claude/commands/bmad/bmm/agents/ux-designer.md +0 -71
- package/.claude/commands/bmad/bmm/workflows/README.md +0 -132
- package/.claude/commands/bmad/bmm/workflows/architecture.md +0 -15
- package/.claude/commands/bmad/bmm/workflows/brainstorm-project.md +0 -15
- package/.claude/commands/bmad/bmm/workflows/code-review.md +0 -15
- package/.claude/commands/bmad/bmm/workflows/correct-course.md +0 -15
- package/.claude/commands/bmad/bmm/workflows/create-epics-and-stories.md +0 -15
- package/.claude/commands/bmad/bmm/workflows/create-story.md +0 -15
- package/.claude/commands/bmad/bmm/workflows/create-ux-design.md +0 -15
- package/.claude/commands/bmad/bmm/workflows/dev-story.md +0 -15
- package/.claude/commands/bmad/bmm/workflows/document-project.md +0 -15
- package/.claude/commands/bmad/bmm/workflows/epic-tech-context.md +0 -15
- package/.claude/commands/bmad/bmm/workflows/narrative.md +0 -15
- package/.claude/commands/bmad/bmm/workflows/prd.md +0 -15
- package/.claude/commands/bmad/bmm/workflows/product-brief.md +0 -15
- package/.claude/commands/bmad/bmm/workflows/research.md +0 -15
- package/.claude/commands/bmad/bmm/workflows/retrospective.md +0 -15
- package/.claude/commands/bmad/bmm/workflows/solutioning-gate-check.md +0 -15
- package/.claude/commands/bmad/bmm/workflows/sprint-planning.md +0 -15
- package/.claude/commands/bmad/bmm/workflows/story-context.md +0 -15
- package/.claude/commands/bmad/bmm/workflows/story-done.md +0 -15
- package/.claude/commands/bmad/bmm/workflows/story-ready.md +0 -15
- package/.claude/commands/bmad/bmm/workflows/tech-spec.md +0 -15
- package/.claude/commands/bmad/bmm/workflows/workflow-init.md +0 -15
- package/.claude/commands/bmad/bmm/workflows/workflow-status.md +0 -15
- package/.claude/commands/bmad/cis/agents/README.md +0 -104
- package/.claude/commands/bmad/cis/agents/brainstorming-coach.md +0 -62
- package/.claude/commands/bmad/cis/agents/creative-problem-solver.md +0 -62
- package/.claude/commands/bmad/cis/agents/design-thinking-coach.md +0 -62
- package/.claude/commands/bmad/cis/agents/innovation-strategist.md +0 -62
- package/.claude/commands/bmad/cis/agents/storyteller.md +0 -59
- package/.claude/commands/bmad/cis/workflows/README.md +0 -37
- package/.claude/commands/bmad/cis/workflows/design-thinking.md +0 -15
- package/.claude/commands/bmad/cis/workflows/innovation-strategy.md +0 -15
- package/.claude/commands/bmad/cis/workflows/problem-solving.md +0 -15
- package/.claude/commands/bmad/cis/workflows/storytelling.md +0 -15
- package/.claude/commands/bmad/core/workflows/README.md +0 -27
- package/bmad/_cfg/agents/bmm-analyst.customize.yaml +0 -42
- package/bmad/_cfg/agents/bmm-architect.customize.yaml +0 -42
- package/bmad/_cfg/agents/bmm-dev.customize.yaml +0 -42
- package/bmad/_cfg/agents/bmm-pm.customize.yaml +0 -42
- package/bmad/_cfg/agents/bmm-sm.customize.yaml +0 -42
- package/bmad/_cfg/agents/bmm-tea.customize.yaml +0 -42
- package/bmad/_cfg/agents/bmm-tech-writer.customize.yaml +0 -42
- package/bmad/_cfg/agents/bmm-ux-designer.customize.yaml +0 -42
- package/bmad/bmm/README.md +0 -128
- package/bmad/bmm/agents/analyst.md +0 -67
- package/bmad/bmm/agents/architect.md +0 -72
- package/bmad/bmm/agents/dev.md +0 -69
- package/bmad/bmm/agents/pm.md +0 -76
- package/bmad/bmm/agents/sm.md +0 -85
- package/bmad/bmm/agents/tea.md +0 -72
- package/bmad/bmm/agents/tech-writer.md +0 -82
- package/bmad/bmm/agents/ux-designer.md +0 -71
- package/bmad/bmm/config.yaml +0 -18
- package/bmad/bmm/tasks/daily-standup.xml +0 -85
- package/bmad/bmm/teams/team-fullstack.yaml +0 -11
- package/bmad/bmm/testarch/knowledge/ci-burn-in.md +0 -675
- package/bmad/bmm/testarch/knowledge/component-tdd.md +0 -486
- package/bmad/bmm/testarch/knowledge/contract-testing.md +0 -957
- package/bmad/bmm/testarch/knowledge/data-factories.md +0 -500
- package/bmad/bmm/testarch/knowledge/email-auth.md +0 -721
- package/bmad/bmm/testarch/knowledge/error-handling.md +0 -725
- package/bmad/bmm/testarch/knowledge/feature-flags.md +0 -750
- package/bmad/bmm/testarch/knowledge/fixture-architecture.md +0 -401
- package/bmad/bmm/testarch/knowledge/network-first.md +0 -486
- package/bmad/bmm/testarch/knowledge/nfr-criteria.md +0 -670
- package/bmad/bmm/testarch/knowledge/playwright-config.md +0 -730
- package/bmad/bmm/testarch/knowledge/probability-impact.md +0 -601
- package/bmad/bmm/testarch/knowledge/risk-governance.md +0 -615
- package/bmad/bmm/testarch/knowledge/selective-testing.md +0 -732
- package/bmad/bmm/testarch/knowledge/selector-resilience.md +0 -527
- package/bmad/bmm/testarch/knowledge/test-healing-patterns.md +0 -644
- package/bmad/bmm/testarch/knowledge/test-levels-framework.md +0 -473
- package/bmad/bmm/testarch/knowledge/test-priorities-matrix.md +0 -373
- package/bmad/bmm/testarch/knowledge/test-quality.md +0 -664
- package/bmad/bmm/testarch/knowledge/timing-debugging.md +0 -372
- package/bmad/bmm/testarch/knowledge/visual-debugging.md +0 -524
- package/bmad/bmm/testarch/tea-index.csv +0 -22
- package/bmad/bmm/workflows/1-analysis/brainstorm-project/instructions.md +0 -110
- package/bmad/bmm/workflows/1-analysis/brainstorm-project/project-context.md +0 -25
- package/bmad/bmm/workflows/1-analysis/brainstorm-project/workflow.yaml +0 -26
- package/bmad/bmm/workflows/1-analysis/domain-research/instructions.md +0 -423
- package/bmad/bmm/workflows/1-analysis/domain-research/template.md +0 -180
- package/bmad/bmm/workflows/1-analysis/domain-research/workflow.yaml +0 -36
- package/bmad/bmm/workflows/1-analysis/product-brief/checklist.md +0 -115
- package/bmad/bmm/workflows/1-analysis/product-brief/instructions.md +0 -524
- package/bmad/bmm/workflows/1-analysis/product-brief/template.md +0 -181
- package/bmad/bmm/workflows/1-analysis/product-brief/workflow.yaml +0 -45
- package/bmad/bmm/workflows/1-analysis/research/checklist-deep-prompt.md +0 -144
- package/bmad/bmm/workflows/1-analysis/research/checklist-technical.md +0 -249
- package/bmad/bmm/workflows/1-analysis/research/checklist.md +0 -299
- package/bmad/bmm/workflows/1-analysis/research/claude-code/injections.yaml +0 -114
- package/bmad/bmm/workflows/1-analysis/research/instructions-deep-prompt.md +0 -439
- package/bmad/bmm/workflows/1-analysis/research/instructions-market.md +0 -679
- package/bmad/bmm/workflows/1-analysis/research/instructions-router.md +0 -133
- package/bmad/bmm/workflows/1-analysis/research/instructions-technical.md +0 -538
- package/bmad/bmm/workflows/1-analysis/research/template-deep-prompt.md +0 -94
- package/bmad/bmm/workflows/1-analysis/research/template-market.md +0 -347
- package/bmad/bmm/workflows/1-analysis/research/template-technical.md +0 -245
- package/bmad/bmm/workflows/1-analysis/research/workflow.yaml +0 -44
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/checklist.md +0 -310
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/instructions.md +0 -1301
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/ux-design-template.md +0 -145
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/workflow.yaml +0 -64
- package/bmad/bmm/workflows/2-plan-workflows/narrative/workflow.yaml +0 -29
- package/bmad/bmm/workflows/2-plan-workflows/prd/checklist.md +0 -350
- package/bmad/bmm/workflows/2-plan-workflows/prd/create-epics-and-stories/epics-template.md +0 -52
- package/bmad/bmm/workflows/2-plan-workflows/prd/create-epics-and-stories/instructions.md +0 -169
- package/bmad/bmm/workflows/2-plan-workflows/prd/create-epics-and-stories/workflow.yaml +0 -45
- package/bmad/bmm/workflows/2-plan-workflows/prd/domain-complexity.csv +0 -13
- package/bmad/bmm/workflows/2-plan-workflows/prd/instructions.md +0 -408
- package/bmad/bmm/workflows/2-plan-workflows/prd/prd-template.md +0 -237
- package/bmad/bmm/workflows/2-plan-workflows/prd/project-types.csv +0 -11
- package/bmad/bmm/workflows/2-plan-workflows/prd/workflow.yaml +0 -46
- package/bmad/bmm/workflows/2-plan-workflows/tech-spec/checklist.md +0 -214
- package/bmad/bmm/workflows/2-plan-workflows/tech-spec/epics-template.md +0 -80
- package/bmad/bmm/workflows/2-plan-workflows/tech-spec/instructions-level0-story.md +0 -200
- package/bmad/bmm/workflows/2-plan-workflows/tech-spec/instructions-level1-stories.md +0 -451
- package/bmad/bmm/workflows/2-plan-workflows/tech-spec/instructions.md +0 -1115
- package/bmad/bmm/workflows/2-plan-workflows/tech-spec/tech-spec-template.md +0 -181
- package/bmad/bmm/workflows/2-plan-workflows/tech-spec/user-story-template.md +0 -90
- package/bmad/bmm/workflows/2-plan-workflows/tech-spec/workflow.yaml +0 -60
- package/bmad/bmm/workflows/3-solutioning/solutioning-gate-check/checklist.md +0 -175
- package/bmad/bmm/workflows/3-solutioning/solutioning-gate-check/instructions.md +0 -305
- package/bmad/bmm/workflows/3-solutioning/solutioning-gate-check/template.md +0 -146
- package/bmad/bmm/workflows/3-solutioning/solutioning-gate-check/validation-criteria.yaml +0 -189
- package/bmad/bmm/workflows/3-solutioning/solutioning-gate-check/workflow.yaml +0 -64
- package/bmad/bmm/workflows/document-project/checklist.md +0 -245
- package/bmad/bmm/workflows/document-project/documentation-requirements.csv +0 -12
- package/bmad/bmm/workflows/document-project/instructions.md +0 -222
- package/bmad/bmm/workflows/document-project/templates/deep-dive-template.md +0 -345
- package/bmad/bmm/workflows/document-project/templates/index-template.md +0 -169
- package/bmad/bmm/workflows/document-project/templates/project-overview-template.md +0 -103
- package/bmad/bmm/workflows/document-project/templates/project-scan-report-schema.json +0 -160
- package/bmad/bmm/workflows/document-project/templates/source-tree-template.md +0 -135
- package/bmad/bmm/workflows/document-project/workflow.yaml +0 -34
- package/bmad/bmm/workflows/document-project/workflows/deep-dive-instructions.md +0 -298
- package/bmad/bmm/workflows/document-project/workflows/deep-dive.yaml +0 -31
- package/bmad/bmm/workflows/document-project/workflows/full-scan-instructions.md +0 -1106
- package/bmad/bmm/workflows/document-project/workflows/full-scan.yaml +0 -31
- package/bmad/bmm/workflows/techdoc/documentation-standards.md +0 -262
- package/bmad/bmm/workflows/testarch/atdd/atdd-checklist-template.md +0 -363
- package/bmad/bmm/workflows/testarch/atdd/checklist.md +0 -373
- package/bmad/bmm/workflows/testarch/atdd/instructions.md +0 -785
- package/bmad/bmm/workflows/testarch/atdd/workflow.yaml +0 -52
- package/bmad/bmm/workflows/testarch/automate/checklist.md +0 -580
- package/bmad/bmm/workflows/testarch/automate/instructions.md +0 -1303
- package/bmad/bmm/workflows/testarch/automate/workflow.yaml +0 -61
- package/bmad/bmm/workflows/testarch/ci/checklist.md +0 -246
- package/bmad/bmm/workflows/testarch/ci/github-actions-template.yaml +0 -165
- package/bmad/bmm/workflows/testarch/ci/gitlab-ci-template.yaml +0 -128
- package/bmad/bmm/workflows/testarch/ci/instructions.md +0 -517
- package/bmad/bmm/workflows/testarch/ci/workflow.yaml +0 -53
- package/bmad/bmm/workflows/testarch/framework/checklist.md +0 -321
- package/bmad/bmm/workflows/testarch/framework/instructions.md +0 -455
- package/bmad/bmm/workflows/testarch/framework/workflow.yaml +0 -53
- package/bmad/bmm/workflows/testarch/nfr-assess/checklist.md +0 -405
- package/bmad/bmm/workflows/testarch/nfr-assess/instructions.md +0 -722
- package/bmad/bmm/workflows/testarch/nfr-assess/nfr-report-template.md +0 -443
- package/bmad/bmm/workflows/testarch/nfr-assess/workflow.yaml +0 -56
- package/bmad/bmm/workflows/testarch/test-design/checklist.md +0 -234
- package/bmad/bmm/workflows/testarch/test-design/instructions.md +0 -621
- package/bmad/bmm/workflows/testarch/test-design/test-design-template.md +0 -285
- package/bmad/bmm/workflows/testarch/test-design/workflow.yaml +0 -52
- package/bmad/bmm/workflows/testarch/test-review/checklist.md +0 -470
- package/bmad/bmm/workflows/testarch/test-review/instructions.md +0 -608
- package/bmad/bmm/workflows/testarch/test-review/test-review-template.md +0 -388
- package/bmad/bmm/workflows/testarch/test-review/workflow.yaml +0 -53
- package/bmad/bmm/workflows/testarch/trace/checklist.md +0 -654
- package/bmad/bmm/workflows/testarch/trace/instructions.md +0 -1045
- package/bmad/bmm/workflows/testarch/trace/trace-template.md +0 -673
- package/bmad/bmm/workflows/testarch/trace/workflow.yaml +0 -66
- package/bmad/bmm/workflows/workflow-status/init/instructions.md +0 -771
- package/bmad/bmm/workflows/workflow-status/init/workflow.yaml +0 -27
- package/bmad/bmm/workflows/workflow-status/instructions.md +0 -386
- package/bmad/bmm/workflows/workflow-status/paths/enterprise-brownfield.yaml +0 -120
- package/bmad/bmm/workflows/workflow-status/paths/enterprise-greenfield.yaml +0 -108
- package/bmad/bmm/workflows/workflow-status/paths/game-design.yaml +0 -75
- package/bmad/bmm/workflows/workflow-status/paths/method-brownfield.yaml +0 -97
- package/bmad/bmm/workflows/workflow-status/paths/method-greenfield.yaml +0 -88
- package/bmad/bmm/workflows/workflow-status/paths/quick-flow-brownfield.yaml +0 -58
- package/bmad/bmm/workflows/workflow-status/paths/quick-flow-greenfield.yaml +0 -47
- package/bmad/bmm/workflows/workflow-status/project-levels.yaml +0 -59
- package/bmad/bmm/workflows/workflow-status/sample-level-3-workflow.yaml +0 -49
- package/bmad/bmm/workflows/workflow-status/workflow-status-template.yaml +0 -31
- package/bmad/bmm/workflows/workflow-status/workflow.yaml +0 -28
- package/src/modules/bmm/docs/troubleshooting.md +0 -680
- package/src/modules/bmm/teams/team-gamedev.yaml +0 -14
- package/src/modules/bmm/workflows/2-plan-workflows/gdd/workflow.yaml +0 -81
- package/src/modules/bmm/workflows/2-plan-workflows/narrative/checklist.md +0 -139
- package/src/modules/bmm/workflows/2-plan-workflows/narrative/instructions-narrative.md +0 -608
- package/src/modules/bmm/workflows/2-plan-workflows/narrative/narrative-template.md +0 -195
- /package/src/modules/{bmm/workflows/1-analysis → bmgd/workflows/1-preproduction}/brainstorm-game/game-brain-methods.csv +0 -0
- /package/src/modules/{bmm/workflows/1-analysis → bmgd/workflows/1-preproduction}/brainstorm-game/game-context.md +0 -0
- /package/src/modules/{bmm/workflows/1-analysis → bmgd/workflows/1-preproduction}/brainstorm-game/instructions.md +0 -0
- /package/src/modules/{bmm/workflows/1-analysis → bmgd/workflows/1-preproduction}/game-brief/checklist.md +0 -0
- /package/src/modules/{bmm/workflows/1-analysis → bmgd/workflows/1-preproduction}/game-brief/instructions.md +0 -0
- /package/src/modules/{bmm/workflows/1-analysis → bmgd/workflows/1-preproduction}/game-brief/template.md +0 -0
- /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/checklist.md +0 -0
- /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/action-platformer.md +0 -0
- /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/adventure.md +0 -0
- /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/card-game.md +0 -0
- /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/fighting.md +0 -0
- /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/horror.md +0 -0
- /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/idle-incremental.md +0 -0
- /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/metroidvania.md +0 -0
- /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/moba.md +0 -0
- /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/party-game.md +0 -0
- /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/puzzle.md +0 -0
- /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/racing.md +0 -0
- /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/rhythm.md +0 -0
- /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/roguelike.md +0 -0
- /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/rpg.md +0 -0
- /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/sandbox.md +0 -0
- /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/shooter.md +0 -0
- /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/simulation.md +0 -0
- /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/sports.md +0 -0
- /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/strategy.md +0 -0
- /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/survival.md +0 -0
- /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/text-based.md +0 -0
- /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/tower-defense.md +0 -0
- /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/turn-based-tactics.md +0 -0
- /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/visual-novel.md +0 -0
- /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types.csv +0 -0
- /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/gdd-template.md +0 -0
- /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/instructions-gdd.md +0 -0
- /package/{bmad/bmm/workflows/2-plan-workflows → src/modules/bmgd/workflows/2-design}/narrative/checklist.md +0 -0
- /package/{bmad/bmm/workflows/2-plan-workflows → src/modules/bmgd/workflows/2-design}/narrative/instructions-narrative.md +0 -0
- /package/{bmad/bmm/workflows/2-plan-workflows → src/modules/bmgd/workflows/2-design}/narrative/narrative-template.md +0 -0
- /package/{bmad/bmm/workflows/3-solutioning/architecture → src/modules/bmgd/workflows/3-technical/game-architecture}/architecture-patterns.yaml +0 -0
- /package/{bmad/bmm/workflows/3-solutioning/architecture → src/modules/bmgd/workflows/3-technical/game-architecture}/architecture-template.md +0 -0
- /package/{bmad/bmm/workflows/3-solutioning/architecture → src/modules/bmgd/workflows/3-technical/game-architecture}/checklist.md +0 -0
- /package/{bmad/bmm/workflows/3-solutioning/architecture → src/modules/bmgd/workflows/3-technical/game-architecture}/decision-catalog.yaml +0 -0
- /package/{bmad/bmm/workflows/3-solutioning/architecture → src/modules/bmgd/workflows/3-technical/game-architecture}/instructions.md +0 -0
- /package/{bmad/bmm/workflows/3-solutioning/architecture → src/modules/bmgd/workflows/3-technical/game-architecture}/pattern-categories.csv +0 -0
- /package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/code-review/backlog_template.md +0 -0
- /package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/code-review/checklist.md +0 -0
- /package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/code-review/instructions.md +0 -0
- /package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/correct-course/checklist.md +0 -0
- /package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/correct-course/instructions.md +0 -0
- /package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/create-story/checklist.md +0 -0
- /package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/create-story/instructions.md +0 -0
- /package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/create-story/template.md +0 -0
- /package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/dev-story/AUDIT-REPORT.md +0 -0
- /package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/dev-story/checklist.md +0 -0
- /package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/dev-story/instructions.md +0 -0
- /package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/epic-tech-context/checklist.md +0 -0
- /package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/epic-tech-context/instructions.md +0 -0
- /package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/epic-tech-context/template.md +0 -0
- /package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/retrospective/instructions.md +0 -0
- /package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/sprint-planning/checklist.md +0 -0
- /package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/sprint-planning/instructions.md +0 -0
- /package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/sprint-planning/sprint-status-template.yaml +0 -0
- /package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/story-context/checklist.md +0 -0
- /package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/story-context/context-template.xml +0 -0
- /package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/story-context/instructions.md +0 -0
- /package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/story-done/instructions.md +0 -0
- /package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/story-ready/instructions.md +0 -0
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Installation Component Tests
|
|
3
|
+
*
|
|
4
|
+
* Tests individual installation components in isolation:
|
|
5
|
+
* - Agent YAML → XML compilation
|
|
6
|
+
* - Manifest generation
|
|
7
|
+
* - Path resolution
|
|
8
|
+
* - Customization merging
|
|
9
|
+
*
|
|
10
|
+
* These are deterministic unit tests that don't require full installation.
|
|
11
|
+
* Usage: node test/test-installation-components.js
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
const path = require('node:path');
|
|
15
|
+
const fs = require('fs-extra');
|
|
16
|
+
const { YamlXmlBuilder } = require('../tools/cli/lib/yaml-xml-builder');
|
|
17
|
+
const { ManifestGenerator } = require('../tools/cli/installers/lib/core/manifest-generator');
|
|
18
|
+
|
|
19
|
+
// ANSI colors
|
|
20
|
+
const colors = {
|
|
21
|
+
reset: '\u001B[0m',
|
|
22
|
+
green: '\u001B[32m',
|
|
23
|
+
red: '\u001B[31m',
|
|
24
|
+
yellow: '\u001B[33m',
|
|
25
|
+
cyan: '\u001B[36m',
|
|
26
|
+
dim: '\u001B[2m',
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
let passed = 0;
|
|
30
|
+
let failed = 0;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Test helper: Assert condition
|
|
34
|
+
*/
|
|
35
|
+
function assert(condition, testName, errorMessage = '') {
|
|
36
|
+
if (condition) {
|
|
37
|
+
console.log(`${colors.green}✓${colors.reset} ${testName}`);
|
|
38
|
+
passed++;
|
|
39
|
+
} else {
|
|
40
|
+
console.log(`${colors.red}✗${colors.reset} ${testName}`);
|
|
41
|
+
if (errorMessage) {
|
|
42
|
+
console.log(` ${colors.dim}${errorMessage}${colors.reset}`);
|
|
43
|
+
}
|
|
44
|
+
failed++;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Test Suite
|
|
50
|
+
*/
|
|
51
|
+
async function runTests() {
|
|
52
|
+
console.log(`${colors.cyan}========================================`);
|
|
53
|
+
console.log('Installation Component Tests');
|
|
54
|
+
console.log(`========================================${colors.reset}\n`);
|
|
55
|
+
|
|
56
|
+
const projectRoot = path.join(__dirname, '..');
|
|
57
|
+
|
|
58
|
+
// ============================================================
|
|
59
|
+
// Test 1: YAML → XML Agent Compilation (In-Memory)
|
|
60
|
+
// ============================================================
|
|
61
|
+
console.log(`${colors.yellow}Test Suite 1: Agent Compilation${colors.reset}\n`);
|
|
62
|
+
|
|
63
|
+
try {
|
|
64
|
+
const builder = new YamlXmlBuilder();
|
|
65
|
+
const pmAgentPath = path.join(projectRoot, 'src/modules/bmm/agents/pm.agent.yaml');
|
|
66
|
+
|
|
67
|
+
// Create temp output path
|
|
68
|
+
const tempOutput = path.join(__dirname, 'temp-pm-agent.md');
|
|
69
|
+
|
|
70
|
+
try {
|
|
71
|
+
const result = await builder.buildAgent(pmAgentPath, null, tempOutput, { includeMetadata: true });
|
|
72
|
+
|
|
73
|
+
assert(result && result.outputPath === tempOutput, 'Agent compilation returns result object with outputPath');
|
|
74
|
+
|
|
75
|
+
// Read the output
|
|
76
|
+
const compiled = await fs.readFile(tempOutput, 'utf8');
|
|
77
|
+
|
|
78
|
+
assert(compiled.includes('<agent'), 'Compiled agent contains <agent> tag');
|
|
79
|
+
|
|
80
|
+
assert(compiled.includes('<persona>'), 'Compiled agent contains <persona> tag');
|
|
81
|
+
|
|
82
|
+
assert(compiled.includes('<menu>'), 'Compiled agent contains <menu> tag');
|
|
83
|
+
|
|
84
|
+
assert(compiled.includes('Product Manager'), 'Compiled agent contains agent title');
|
|
85
|
+
|
|
86
|
+
// Cleanup
|
|
87
|
+
await fs.remove(tempOutput);
|
|
88
|
+
} catch (error) {
|
|
89
|
+
assert(false, 'Agent compilation succeeds', error.message);
|
|
90
|
+
}
|
|
91
|
+
} catch (error) {
|
|
92
|
+
assert(false, 'YamlXmlBuilder instantiates', error.message);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
console.log('');
|
|
96
|
+
|
|
97
|
+
// ============================================================
|
|
98
|
+
// Test 2: Customization Merging
|
|
99
|
+
// ============================================================
|
|
100
|
+
console.log(`${colors.yellow}Test Suite 2: Customization Merging${colors.reset}\n`);
|
|
101
|
+
|
|
102
|
+
try {
|
|
103
|
+
const builder = new YamlXmlBuilder();
|
|
104
|
+
|
|
105
|
+
// Test deepMerge function
|
|
106
|
+
const base = {
|
|
107
|
+
agent: {
|
|
108
|
+
metadata: { name: 'John', title: 'PM' },
|
|
109
|
+
persona: { role: 'Product Manager', style: 'Analytical' },
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
const customize = {
|
|
114
|
+
agent: {
|
|
115
|
+
metadata: { name: 'Sarah' }, // Override name only
|
|
116
|
+
persona: { style: 'Concise' }, // Override style only
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
const merged = builder.deepMerge(base, customize);
|
|
121
|
+
|
|
122
|
+
assert(merged.agent.metadata.name === 'Sarah', 'Deep merge overrides customized name');
|
|
123
|
+
|
|
124
|
+
assert(merged.agent.metadata.title === 'PM', 'Deep merge preserves non-overridden title');
|
|
125
|
+
|
|
126
|
+
assert(merged.agent.persona.role === 'Product Manager', 'Deep merge preserves non-overridden role');
|
|
127
|
+
|
|
128
|
+
assert(merged.agent.persona.style === 'Concise', 'Deep merge overrides customized style');
|
|
129
|
+
} catch (error) {
|
|
130
|
+
assert(false, 'Customization merging works', error.message);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
console.log('');
|
|
134
|
+
|
|
135
|
+
// ============================================================
|
|
136
|
+
// Test 3: Path Resolution
|
|
137
|
+
// ============================================================
|
|
138
|
+
console.log(`${colors.yellow}Test Suite 3: Path Variable Resolution${colors.reset}\n`);
|
|
139
|
+
|
|
140
|
+
try {
|
|
141
|
+
const builder = new YamlXmlBuilder();
|
|
142
|
+
|
|
143
|
+
// Test path resolution logic (if exposed)
|
|
144
|
+
// This would test {project-root}, {installed_path}, {config_source} resolution
|
|
145
|
+
|
|
146
|
+
const testPath = '{project-root}/bmad/bmm/config.yaml';
|
|
147
|
+
const expectedPattern = /\/bmad\/bmm\/config\.yaml$/;
|
|
148
|
+
|
|
149
|
+
assert(
|
|
150
|
+
true, // Placeholder - would test actual resolution
|
|
151
|
+
'Path variable resolution pattern matches expected format',
|
|
152
|
+
'Note: This test validates path resolution logic exists',
|
|
153
|
+
);
|
|
154
|
+
} catch (error) {
|
|
155
|
+
assert(false, 'Path resolution works', error.message);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
console.log('');
|
|
159
|
+
|
|
160
|
+
// ============================================================
|
|
161
|
+
// Test 5: TEA Agent Special Handling
|
|
162
|
+
// ============================================================
|
|
163
|
+
console.log(`${colors.yellow}Test Suite 5: TEA Agent Compilation${colors.reset}\n`);
|
|
164
|
+
|
|
165
|
+
try {
|
|
166
|
+
const builder = new YamlXmlBuilder();
|
|
167
|
+
const teaAgentPath = path.join(projectRoot, 'src/modules/bmm/agents/tea.agent.yaml');
|
|
168
|
+
const tempOutput = path.join(__dirname, 'temp-tea-agent.md');
|
|
169
|
+
|
|
170
|
+
try {
|
|
171
|
+
const result = await builder.buildAgent(teaAgentPath, null, tempOutput, { includeMetadata: true });
|
|
172
|
+
const compiled = await fs.readFile(tempOutput, 'utf8');
|
|
173
|
+
|
|
174
|
+
assert(compiled.includes('tea-index.csv'), 'TEA agent compilation includes critical_actions with tea-index.csv reference');
|
|
175
|
+
|
|
176
|
+
assert(compiled.includes('testarch/knowledge'), 'TEA agent compilation includes knowledge base path');
|
|
177
|
+
|
|
178
|
+
assert(compiled.includes('*test-design'), 'TEA agent menu includes test-design workflow');
|
|
179
|
+
|
|
180
|
+
// Cleanup
|
|
181
|
+
await fs.remove(tempOutput);
|
|
182
|
+
} catch (error) {
|
|
183
|
+
assert(false, 'TEA agent compiles successfully', error.message);
|
|
184
|
+
}
|
|
185
|
+
} catch (error) {
|
|
186
|
+
assert(false, 'TEA compilation test setup', error.message);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
console.log('');
|
|
190
|
+
|
|
191
|
+
// ============================================================
|
|
192
|
+
// Summary
|
|
193
|
+
// ============================================================
|
|
194
|
+
console.log(`${colors.cyan}========================================`);
|
|
195
|
+
console.log('Test Results:');
|
|
196
|
+
console.log(` Passed: ${colors.green}${passed}${colors.reset}`);
|
|
197
|
+
console.log(` Failed: ${colors.red}${failed}${colors.reset}`);
|
|
198
|
+
console.log(`========================================${colors.reset}\n`);
|
|
199
|
+
|
|
200
|
+
if (failed === 0) {
|
|
201
|
+
console.log(`${colors.green}✨ All installation component tests passed!${colors.reset}\n`);
|
|
202
|
+
process.exit(0);
|
|
203
|
+
} else {
|
|
204
|
+
console.log(`${colors.red}❌ Some installation component tests failed${colors.reset}\n`);
|
|
205
|
+
process.exit(1);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// Run tests
|
|
210
|
+
runTests().catch((error) => {
|
|
211
|
+
console.error(`${colors.red}Test runner failed:${colors.reset}`, error.message);
|
|
212
|
+
console.error(error.stack);
|
|
213
|
+
process.exit(1);
|
|
214
|
+
});
|
|
@@ -51,8 +51,13 @@ class WebBundler {
|
|
|
51
51
|
console.log(chalk.cyan.bold('═══════════════════════════════════════════════\n'));
|
|
52
52
|
|
|
53
53
|
try {
|
|
54
|
-
//
|
|
54
|
+
// Vendor cross-module workflows FIRST
|
|
55
55
|
const modules = await this.discoverModules();
|
|
56
|
+
for (const module of modules) {
|
|
57
|
+
await this.vendorCrossModuleWorkflows(module);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Pre-discover all modules to generate complete manifests
|
|
56
61
|
for (const module of modules) {
|
|
57
62
|
await this.preDiscoverModule(module);
|
|
58
63
|
}
|
|
@@ -92,6 +97,9 @@ class WebBundler {
|
|
|
92
97
|
teams: [],
|
|
93
98
|
};
|
|
94
99
|
|
|
100
|
+
// Vendor cross-module workflows first (if not already done by bundleAll)
|
|
101
|
+
await this.vendorCrossModuleWorkflows(moduleName);
|
|
102
|
+
|
|
95
103
|
// Pre-discover all agents and teams for manifest generation
|
|
96
104
|
await this.preDiscoverModule(moduleName);
|
|
97
105
|
|
|
@@ -134,6 +142,9 @@ class WebBundler {
|
|
|
134
142
|
|
|
135
143
|
console.log(chalk.dim(` → Processing: ${agentName}`));
|
|
136
144
|
|
|
145
|
+
// Vendor cross-module workflows first (if not already done)
|
|
146
|
+
await this.vendorCrossModuleWorkflows(moduleName);
|
|
147
|
+
|
|
137
148
|
const agentPath = path.join(this.modulesPath, moduleName, 'agents', agentFile);
|
|
138
149
|
|
|
139
150
|
// Check if agent file exists
|
|
@@ -433,6 +444,97 @@ class WebBundler {
|
|
|
433
444
|
return parts.join('\n');
|
|
434
445
|
}
|
|
435
446
|
|
|
447
|
+
/**
|
|
448
|
+
* Vendor cross-module workflows for a module
|
|
449
|
+
* Scans source agent YAML files for workflow-install attributes and copies workflows
|
|
450
|
+
*/
|
|
451
|
+
async vendorCrossModuleWorkflows(moduleName) {
|
|
452
|
+
const modulePath = path.join(this.modulesPath, moduleName);
|
|
453
|
+
const agentsPath = path.join(modulePath, 'agents');
|
|
454
|
+
|
|
455
|
+
if (!(await fs.pathExists(agentsPath))) {
|
|
456
|
+
return;
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
// Find all agent YAML files
|
|
460
|
+
const files = await fs.readdir(agentsPath);
|
|
461
|
+
const yamlFiles = files.filter((f) => f.endsWith('.agent.yaml'));
|
|
462
|
+
|
|
463
|
+
for (const agentFile of yamlFiles) {
|
|
464
|
+
const agentPath = path.join(agentsPath, agentFile);
|
|
465
|
+
const agentYaml = yaml.load(await fs.readFile(agentPath, 'utf8'));
|
|
466
|
+
|
|
467
|
+
const menuItems = agentYaml?.agent?.menu || [];
|
|
468
|
+
const workflowInstallItems = menuItems.filter((item) => item['workflow-install']);
|
|
469
|
+
|
|
470
|
+
for (const item of workflowInstallItems) {
|
|
471
|
+
const sourceWorkflowPath = item.workflow;
|
|
472
|
+
const installWorkflowPath = item['workflow-install'];
|
|
473
|
+
|
|
474
|
+
if (!sourceWorkflowPath || !installWorkflowPath) {
|
|
475
|
+
continue;
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
// Parse paths to extract module and workflow location
|
|
479
|
+
const sourceMatch = sourceWorkflowPath.match(/\{project-root\}\/bmad\/([^/]+)\/workflows\/(.+)/);
|
|
480
|
+
const installMatch = installWorkflowPath.match(/\{project-root\}\/bmad\/([^/]+)\/workflows\/(.+)/);
|
|
481
|
+
|
|
482
|
+
if (!sourceMatch || !installMatch) {
|
|
483
|
+
continue;
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
const sourceModule = sourceMatch[1];
|
|
487
|
+
const sourceWorkflowRelPath = sourceMatch[2];
|
|
488
|
+
const installModule = installMatch[1];
|
|
489
|
+
const installWorkflowRelPath = installMatch[2];
|
|
490
|
+
|
|
491
|
+
// Build actual filesystem paths
|
|
492
|
+
const actualSourceWorkflowPath = path.join(this.modulesPath, sourceModule, 'workflows', sourceWorkflowRelPath);
|
|
493
|
+
const actualDestWorkflowPath = path.join(this.modulesPath, installModule, 'workflows', installWorkflowRelPath);
|
|
494
|
+
|
|
495
|
+
// Check if source workflow exists
|
|
496
|
+
if (!(await fs.pathExists(actualSourceWorkflowPath))) {
|
|
497
|
+
console.log(chalk.yellow(` ⚠ Source workflow not found for vendoring: ${sourceWorkflowPath}`));
|
|
498
|
+
continue;
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
// Check if destination already exists (skip if already vendored)
|
|
502
|
+
if (await fs.pathExists(actualDestWorkflowPath)) {
|
|
503
|
+
continue;
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
// Get workflow directory (workflow.yaml is in a directory with other files)
|
|
507
|
+
const sourceWorkflowDir = path.dirname(actualSourceWorkflowPath);
|
|
508
|
+
const destWorkflowDir = path.dirname(actualDestWorkflowPath);
|
|
509
|
+
|
|
510
|
+
// Copy entire workflow directory
|
|
511
|
+
await fs.copy(sourceWorkflowDir, destWorkflowDir, { overwrite: false });
|
|
512
|
+
|
|
513
|
+
// Update config_source in the vendored workflow.yaml
|
|
514
|
+
const workflowYamlPath = actualDestWorkflowPath;
|
|
515
|
+
if (await fs.pathExists(workflowYamlPath)) {
|
|
516
|
+
await this.updateWorkflowConfigSource(workflowYamlPath, installModule);
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
console.log(chalk.dim(` → Vendored workflow: ${sourceWorkflowRelPath} → ${installModule}/workflows/${installWorkflowRelPath}`));
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
/**
|
|
525
|
+
* Update config_source in a vendored workflow YAML file
|
|
526
|
+
*/
|
|
527
|
+
async updateWorkflowConfigSource(workflowYamlPath, newModuleName) {
|
|
528
|
+
let yamlContent = await fs.readFile(workflowYamlPath, 'utf8');
|
|
529
|
+
|
|
530
|
+
// Replace config_source with new module reference
|
|
531
|
+
const configSourcePattern = /config_source:\s*["']?\{project-root\}\/bmad\/[^/]+\/config\.yaml["']?/g;
|
|
532
|
+
const newConfigSource = `config_source: "{project-root}/bmad/${newModuleName}/config.yaml"`;
|
|
533
|
+
|
|
534
|
+
const updatedYaml = yamlContent.replaceAll(configSourcePattern, newConfigSource);
|
|
535
|
+
await fs.writeFile(workflowYamlPath, updatedYaml, 'utf8');
|
|
536
|
+
}
|
|
537
|
+
|
|
436
538
|
/**
|
|
437
539
|
* Pre-discover all agents and teams in a module for manifest generation
|
|
438
540
|
*/
|
|
@@ -595,16 +697,25 @@ class WebBundler {
|
|
|
595
697
|
removeSkippedWorkflowCommands(agentXml, skippedWorkflows) {
|
|
596
698
|
let modifiedXml = agentXml;
|
|
597
699
|
|
|
598
|
-
// For each skipped workflow, find and remove
|
|
700
|
+
// For each skipped workflow, find and remove menu items and commands
|
|
599
701
|
for (const workflowPath of skippedWorkflows) {
|
|
600
|
-
// Match: <c cmd="..." run-workflow="workflowPath">...</c>
|
|
601
702
|
// Need to escape special regex characters in the path
|
|
602
703
|
const escapedPath = workflowPath.replaceAll(/[.*+?^${}()|[\]\\]/g, String.raw`\$&`);
|
|
603
704
|
|
|
604
|
-
// Pattern
|
|
605
|
-
|
|
705
|
+
// Pattern 1: Remove <item> tags with workflow attribute
|
|
706
|
+
// Match: <item cmd="..." workflow="workflowPath">...</item>
|
|
707
|
+
const itemWorkflowPattern = new RegExp(`\\s*<item\\s+[^>]*workflow="[^"]*${escapedPath}"[^>]*>.*?</item>\\s*`, 'gs');
|
|
708
|
+
modifiedXml = modifiedXml.replace(itemWorkflowPattern, '');
|
|
606
709
|
|
|
607
|
-
|
|
710
|
+
// Pattern 2: Remove <item> tags with run-workflow attribute
|
|
711
|
+
// Match: <item cmd="..." run-workflow="workflowPath">...</item>
|
|
712
|
+
const itemRunWorkflowPattern = new RegExp(`\\s*<item\\s+[^>]*run-workflow="[^"]*${escapedPath}"[^>]*>.*?</item>\\s*`, 'gs');
|
|
713
|
+
modifiedXml = modifiedXml.replace(itemRunWorkflowPattern, '');
|
|
714
|
+
|
|
715
|
+
// Pattern 3: Remove <c> tags with run-workflow attribute (legacy)
|
|
716
|
+
// Match: <c cmd="..." run-workflow="workflowPath">...</c>
|
|
717
|
+
const cPattern = new RegExp(`\\s*<c\\s+[^>]*run-workflow="[^"]*${escapedPath}"[^>]*>.*?</c>\\s*`, 'gs');
|
|
718
|
+
modifiedXml = modifiedXml.replace(cPattern, '');
|
|
608
719
|
}
|
|
609
720
|
|
|
610
721
|
return modifiedXml;
|
|
@@ -894,9 +1005,12 @@ class WebBundler {
|
|
|
894
1005
|
processed.add(bundleFilePath);
|
|
895
1006
|
|
|
896
1007
|
// Read the file content
|
|
897
|
-
|
|
1008
|
+
let fileContent = await fs.readFile(bundleActualPath, 'utf8');
|
|
898
1009
|
const fileExt = path.extname(bundleActualPath).toLowerCase().replace('.', '');
|
|
899
1010
|
|
|
1011
|
+
// Process {project-root} references before wrapping
|
|
1012
|
+
fileContent = this.processProjectRootReferences(fileContent);
|
|
1013
|
+
|
|
900
1014
|
// Wrap in XML with proper escaping
|
|
901
1015
|
const wrappedContent = this.wrapContentInXml(fileContent, bundleFilePath, fileExt);
|
|
902
1016
|
dependencies.set(bundleFilePath, wrappedContent);
|
|
@@ -1447,7 +1561,10 @@ class WebBundler {
|
|
|
1447
1561
|
}
|
|
1448
1562
|
|
|
1449
1563
|
// Display warnings summary
|
|
1450
|
-
if
|
|
1564
|
+
// Check if there are actually any warnings with content
|
|
1565
|
+
const hasActualWarnings = this.stats.warnings.some((w) => w && w.warnings && w.warnings.length > 0);
|
|
1566
|
+
|
|
1567
|
+
if (hasActualWarnings) {
|
|
1451
1568
|
console.log(chalk.yellow('\n⚠ Missing Dependencies by Agent:'));
|
|
1452
1569
|
|
|
1453
1570
|
// Group and display warnings by agent
|
|
@@ -1461,6 +1578,8 @@ class WebBundler {
|
|
|
1461
1578
|
}
|
|
1462
1579
|
}
|
|
1463
1580
|
}
|
|
1581
|
+
} else {
|
|
1582
|
+
console.log(chalk.green('\n✓ No missing dependencies'));
|
|
1464
1583
|
}
|
|
1465
1584
|
|
|
1466
1585
|
// Final status
|
|
@@ -83,6 +83,9 @@ class AuggieSetup extends BaseIdeSetup {
|
|
|
83
83
|
return { success: false, reason: 'no-locations' };
|
|
84
84
|
}
|
|
85
85
|
|
|
86
|
+
// Clean up old BMAD installation first
|
|
87
|
+
await this.cleanup(projectDir);
|
|
88
|
+
|
|
86
89
|
// Get agents, tasks, tools, and workflows (standalone only)
|
|
87
90
|
const agents = await this.getAgents(bmadDir);
|
|
88
91
|
const tasks = await this.getTasks(bmadDir, true);
|
|
@@ -305,31 +308,17 @@ BMAD ${workflow.module.toUpperCase()} module
|
|
|
305
308
|
async cleanup(projectDir) {
|
|
306
309
|
const fs = require('fs-extra');
|
|
307
310
|
|
|
308
|
-
// Check common locations
|
|
311
|
+
// Check common locations - bmad folder structure
|
|
309
312
|
const locations = [path.join(os.homedir(), '.augment', 'commands'), path.join(projectDir, '.augment', 'commands')];
|
|
310
313
|
|
|
311
314
|
for (const location of locations) {
|
|
312
|
-
const
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
const dirs = [agentsDir, tasksDir, toolsDir, workflowsDir];
|
|
318
|
-
|
|
319
|
-
for (const dir of dirs) {
|
|
320
|
-
if (await fs.pathExists(dir)) {
|
|
321
|
-
// Remove only BMAD files (those with module prefix)
|
|
322
|
-
const files = await fs.readdir(dir);
|
|
323
|
-
for (const file of files) {
|
|
324
|
-
if (file.includes('-') && file.endsWith('.md')) {
|
|
325
|
-
await fs.remove(path.join(dir, file));
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
}
|
|
315
|
+
const bmadDir = path.join(location, 'bmad');
|
|
316
|
+
|
|
317
|
+
if (await fs.pathExists(bmadDir)) {
|
|
318
|
+
await fs.remove(bmadDir);
|
|
319
|
+
console.log(chalk.dim(` Removed old BMAD commands from ${location}`));
|
|
329
320
|
}
|
|
330
321
|
}
|
|
331
|
-
|
|
332
|
-
console.log(chalk.dim('Cleaned up Auggie CLI configurations'));
|
|
333
322
|
}
|
|
334
323
|
}
|
|
335
324
|
|
|
@@ -81,6 +81,20 @@ class ClaudeCodeSetup extends BaseIdeSetup {
|
|
|
81
81
|
return config;
|
|
82
82
|
}
|
|
83
83
|
|
|
84
|
+
/**
|
|
85
|
+
* Cleanup old BMAD installation before reinstalling
|
|
86
|
+
* @param {string} projectDir - Project directory
|
|
87
|
+
*/
|
|
88
|
+
async cleanup(projectDir) {
|
|
89
|
+
const fs = require('fs-extra');
|
|
90
|
+
const bmadCommandsDir = path.join(projectDir, this.configDir, this.commandsDir, 'bmad');
|
|
91
|
+
|
|
92
|
+
if (await fs.pathExists(bmadCommandsDir)) {
|
|
93
|
+
await fs.remove(bmadCommandsDir);
|
|
94
|
+
console.log(chalk.dim(` Removed old BMAD commands from ${this.name}`));
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
84
98
|
/**
|
|
85
99
|
* Setup Claude Code IDE configuration
|
|
86
100
|
* @param {string} projectDir - Project directory
|
|
@@ -93,6 +107,9 @@ class ClaudeCodeSetup extends BaseIdeSetup {
|
|
|
93
107
|
|
|
94
108
|
console.log(chalk.cyan(`Setting up ${this.name}...`));
|
|
95
109
|
|
|
110
|
+
// Clean up old BMAD installation first
|
|
111
|
+
await this.cleanup(projectDir);
|
|
112
|
+
|
|
96
113
|
// Create .claude/commands directory structure
|
|
97
114
|
const claudeDir = path.join(projectDir, this.configDir);
|
|
98
115
|
const commandsDir = path.join(claudeDir, this.commandsDir);
|
|
@@ -145,7 +162,20 @@ class ClaudeCodeSetup extends BaseIdeSetup {
|
|
|
145
162
|
|
|
146
163
|
// Generate workflow commands from manifest (if it exists)
|
|
147
164
|
const workflowGen = new WorkflowCommandGenerator();
|
|
148
|
-
const
|
|
165
|
+
const { artifacts: workflowArtifacts } = await workflowGen.collectWorkflowArtifacts(bmadDir);
|
|
166
|
+
|
|
167
|
+
// Write only workflow-command artifacts, skip workflow-launcher READMEs
|
|
168
|
+
let workflowCommandCount = 0;
|
|
169
|
+
for (const artifact of workflowArtifacts) {
|
|
170
|
+
if (artifact.type === 'workflow-command') {
|
|
171
|
+
const moduleWorkflowsDir = path.join(bmadCommandsDir, artifact.module, 'workflows');
|
|
172
|
+
await this.ensureDir(moduleWorkflowsDir);
|
|
173
|
+
const commandPath = path.join(moduleWorkflowsDir, path.basename(artifact.relativePath));
|
|
174
|
+
await this.writeFile(commandPath, artifact.content);
|
|
175
|
+
workflowCommandCount++;
|
|
176
|
+
}
|
|
177
|
+
// Skip workflow-launcher READMEs as they would be treated as slash commands
|
|
178
|
+
}
|
|
149
179
|
|
|
150
180
|
// Generate task and tool commands from manifests (if they exist)
|
|
151
181
|
const taskToolGen = new TaskToolCommandGenerator();
|
|
@@ -153,8 +183,8 @@ class ClaudeCodeSetup extends BaseIdeSetup {
|
|
|
153
183
|
|
|
154
184
|
console.log(chalk.green(`✓ ${this.name} configured:`));
|
|
155
185
|
console.log(chalk.dim(` - ${agentCount} agents installed`));
|
|
156
|
-
if (
|
|
157
|
-
console.log(chalk.dim(` - ${
|
|
186
|
+
if (workflowCommandCount > 0) {
|
|
187
|
+
console.log(chalk.dim(` - ${workflowCommandCount} workflow commands generated`));
|
|
158
188
|
}
|
|
159
189
|
if (taskToolResult.generated > 0) {
|
|
160
190
|
console.log(
|
|
@@ -12,6 +12,20 @@ class CursorSetup extends BaseIdeSetup {
|
|
|
12
12
|
this.rulesDir = 'rules';
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
+
/**
|
|
16
|
+
* Cleanup old BMAD installation before reinstalling
|
|
17
|
+
* @param {string} projectDir - Project directory
|
|
18
|
+
*/
|
|
19
|
+
async cleanup(projectDir) {
|
|
20
|
+
const fs = require('fs-extra');
|
|
21
|
+
const bmadRulesDir = path.join(projectDir, this.configDir, this.rulesDir, 'bmad');
|
|
22
|
+
|
|
23
|
+
if (await fs.pathExists(bmadRulesDir)) {
|
|
24
|
+
await fs.remove(bmadRulesDir);
|
|
25
|
+
console.log(chalk.dim(` Removed old BMAD rules from ${this.name}`));
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
15
29
|
/**
|
|
16
30
|
* Setup Cursor IDE configuration
|
|
17
31
|
* @param {string} projectDir - Project directory
|
|
@@ -21,6 +35,9 @@ class CursorSetup extends BaseIdeSetup {
|
|
|
21
35
|
async setup(projectDir, bmadDir, options = {}) {
|
|
22
36
|
console.log(chalk.cyan(`Setting up ${this.name}...`));
|
|
23
37
|
|
|
38
|
+
// Clean up old BMAD installation first
|
|
39
|
+
await this.cleanup(projectDir);
|
|
40
|
+
|
|
24
41
|
// Create .cursor/rules directory structure
|
|
25
42
|
const cursorDir = path.join(projectDir, this.configDir);
|
|
26
43
|
const rulesDir = path.join(cursorDir, this.rulesDir);
|