bmad-method 6.0.0-alpha.0 → 6.0.0-alpha.10
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/.github/ISSUE_TEMPLATE/config.yaml +4 -0
- package/.github/ISSUE_TEMPLATE/idea_submission.md +3 -3
- package/.github/workflows/bundle-latest.yaml +277 -0
- package/.github/workflows/manual-release.yaml +64 -17
- package/.github/workflows/quality.yaml +78 -0
- package/.husky/pre-commit +4 -0
- package/.prettierignore +6 -0
- package/.vscode/settings.json +3 -1
- package/CHANGELOG.md +1211 -2
- package/CONTRIBUTING.md +2 -13
- package/README.md +442 -0
- package/docs/BUNDLE_DISTRIBUTION_SETUP.md +95 -0
- package/docs/agent-customization-guide.md +208 -0
- package/docs/document-sharding-guide.md +449 -0
- package/docs/ide-info/auggie.md +2 -2
- package/docs/ide-info/claude-code.md +4 -4
- package/docs/ide-info/codex.md +9 -20
- package/docs/ide-info/crush.md +1 -1
- package/docs/ide-info/cursor.md +7 -7
- package/docs/ide-info/iflow.md +3 -3
- package/docs/ide-info/opencode.md +24 -0
- package/docs/index.md +227 -0
- package/docs/installers-bundlers/ide-injections.md +2 -12
- package/docs/installers-bundlers/installers-modules-platforms-reference.md +100 -67
- package/docs/v4-to-v6-upgrade.md +227 -0
- package/docs/web-bundles-gemini-gpt-guide.md +473 -0
- package/eslint.config.mjs +6 -2
- package/package.json +13 -6
- package/src/core/_module-installer/install-config.yaml +35 -0
- package/src/core/_module-installer/installer.js +1 -9
- package/src/core/agents/bmad-master.agent.yaml +39 -0
- package/src/core/agents/bmad-web-orchestrator.agent.xml +113 -0
- package/src/core/tasks/advanced-elicitation-methods.csv +21 -0
- package/src/core/tasks/{adv-elicit.md → advanced-elicitation.xml} +11 -14
- package/src/core/tasks/{index-docs.md → index-docs.xml} +6 -10
- package/src/core/tasks/{validate-workflow.md → validate-workflow.xml} +4 -7
- package/src/core/tasks/workflow.xml +270 -0
- package/src/core/tools/shard-doc.xml +109 -0
- package/src/{modules/cis → core}/workflows/brainstorming/README.md +8 -18
- package/src/{modules/cis → core}/workflows/brainstorming/instructions.md +29 -24
- package/src/{modules/cis → core}/workflows/brainstorming/template.md +6 -2
- package/src/{modules/cis → core}/workflows/brainstorming/workflow.yaml +17 -9
- package/src/core/workflows/party-mode/instructions.md +27 -25
- package/src/core/workflows/party-mode/workflow.yaml +14 -10
- package/src/modules/bmb/README.md +194 -0
- package/src/modules/bmb/_module-installer/install-config.yaml +31 -0
- package/src/modules/bmb/agents/bmad-builder.agent.yaml +57 -0
- package/src/modules/bmb/workflows/audit-workflow/checklist.md +142 -0
- package/src/modules/bmb/workflows/audit-workflow/instructions.md +341 -0
- package/src/modules/bmb/workflows/audit-workflow/template.md +118 -0
- package/src/modules/bmb/workflows/audit-workflow/workflow.yaml +25 -0
- package/src/modules/bmb/workflows/convert-legacy/README.md +34 -34
- package/src/modules/bmb/workflows/convert-legacy/checklist.md +22 -21
- package/src/modules/bmb/workflows/convert-legacy/instructions.md +135 -86
- package/src/modules/bmb/workflows/convert-legacy/workflow.yaml +10 -15
- package/src/modules/bmb/workflows/create-agent/README.md +144 -209
- package/src/modules/bmb/workflows/create-agent/agent-architecture.md +68 -65
- package/src/modules/bmb/workflows/create-agent/agent-command-patterns.md +174 -172
- package/src/modules/bmb/workflows/create-agent/agent-types.md +139 -24
- package/src/modules/bmb/workflows/create-agent/brainstorm-context.md +4 -4
- package/src/modules/bmb/workflows/create-agent/checklist.md +30 -102
- package/src/modules/bmb/workflows/create-agent/communication-styles.md +22 -60
- package/src/modules/bmb/workflows/create-agent/instructions.md +339 -221
- package/src/modules/bmb/workflows/create-agent/workflow.yaml +28 -19
- package/src/modules/bmb/workflows/create-module/README.md +164 -153
- package/src/modules/bmb/workflows/create-module/brainstorm-context.md +1 -1
- package/src/modules/bmb/workflows/create-module/checklist.md +21 -31
- package/src/modules/bmb/workflows/create-module/installer-templates/install-config.yaml +92 -0
- package/src/modules/bmb/workflows/create-module/installer-templates/installer.js +1 -1
- package/src/modules/bmb/workflows/create-module/instructions.md +306 -238
- package/src/modules/bmb/workflows/create-module/module-structure.md +135 -45
- package/src/modules/bmb/workflows/create-module/workflow.yaml +32 -27
- package/src/modules/bmb/workflows/create-workflow/README.md +70 -9
- package/src/modules/bmb/workflows/create-workflow/brainstorm-context.md +4 -4
- package/src/modules/bmb/workflows/create-workflow/checklist.md +22 -0
- package/src/modules/bmb/workflows/create-workflow/instructions.md +505 -47
- package/src/modules/bmb/workflows/create-workflow/workflow-creation-guide.md +939 -68
- package/src/modules/bmb/workflows/create-workflow/workflow-template/instructions.md +6 -3
- package/src/modules/bmb/workflows/create-workflow/workflow-template/workflow.yaml +31 -5
- package/src/modules/bmb/workflows/create-workflow/workflow.yaml +16 -17
- package/src/modules/bmb/workflows/edit-agent/README.md +112 -0
- package/src/modules/bmb/workflows/edit-agent/checklist.md +112 -0
- package/src/modules/bmb/workflows/edit-agent/instructions.md +290 -0
- package/src/modules/bmb/workflows/edit-agent/workflow.yaml +33 -0
- package/src/modules/bmb/workflows/edit-module/README.md +187 -0
- package/src/modules/bmb/workflows/edit-module/checklist.md +165 -0
- package/src/modules/bmb/workflows/edit-module/instructions.md +341 -0
- package/src/modules/bmb/workflows/edit-module/workflow.yaml +34 -0
- package/src/modules/bmb/workflows/edit-workflow/README.md +58 -2
- package/src/modules/bmb/workflows/edit-workflow/instructions.md +290 -118
- package/src/modules/bmb/workflows/edit-workflow/workflow.yaml +9 -16
- package/src/modules/bmb/workflows/module-brief/README.md +17 -17
- package/src/modules/bmb/workflows/module-brief/checklist.md +6 -6
- package/src/modules/bmb/workflows/module-brief/instructions.md +10 -7
- package/src/modules/bmb/workflows/module-brief/template.md +9 -9
- package/src/modules/bmb/workflows/module-brief/workflow.yaml +16 -10
- package/src/modules/bmb/workflows/redoc/README.md +5 -5
- package/src/modules/bmb/workflows/redoc/checklist.md +2 -2
- package/src/modules/bmb/workflows/redoc/instructions.md +20 -10
- package/src/modules/bmb/workflows/redoc/workflow.yaml +6 -5
- package/src/modules/bmgd/README.md +208 -0
- package/src/modules/bmgd/_module-installer/install-config.yaml +54 -0
- package/src/modules/bmgd/agents/game-architect.agent.yaml +33 -0
- package/src/modules/bmgd/agents/game-designer.agent.yaml +40 -0
- package/src/modules/bmgd/agents/game-dev.agent.yaml +40 -0
- package/src/modules/bmgd/agents/game-scrum-master.agent.yaml +75 -0
- package/src/modules/bmgd/teams/default-party.csv +10 -0
- package/src/modules/bmgd/teams/team-gamedev.yaml +18 -0
- package/src/modules/{bmm/workflows/1-analysis → bmgd/workflows/1-preproduction}/brainstorm-game/game-context.md +3 -3
- package/src/modules/bmgd/workflows/1-preproduction/brainstorm-game/instructions.md +130 -0
- package/src/modules/bmgd/workflows/1-preproduction/brainstorm-game/workflow.yaml +41 -0
- package/src/modules/{bmm/workflows/1-analysis → bmgd/workflows/1-preproduction}/game-brief/checklist.md +2 -2
- package/src/modules/bmgd/workflows/1-preproduction/game-brief/instructions.md +373 -0
- package/src/modules/{bmm/workflows/1-analysis → bmgd/workflows/1-preproduction}/game-brief/template.md +2 -2
- package/src/modules/bmgd/workflows/1-preproduction/game-brief/workflow.yaml +36 -0
- package/src/modules/bmgd/workflows/2-design/gdd/checklist.md +148 -0
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/action-platformer.md +1 -1
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/adventure.md +1 -1
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/card-game.md +2 -2
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/fighting.md +1 -1
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/horror.md +2 -2
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/idle-incremental.md +1 -1
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/moba.md +4 -4
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/party-game.md +1 -1
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/racing.md +3 -3
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/rhythm.md +1 -1
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/roguelike.md +2 -2
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/rpg.md +3 -3
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/sandbox.md +4 -4
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/shooter.md +3 -3
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/simulation.md +3 -3
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/sports.md +3 -3
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/strategy.md +3 -3
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/survival.md +2 -2
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/text-based.md +3 -3
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/tower-defense.md +5 -5
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/turn-based-tactics.md +4 -4
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/visual-novel.md +1 -1
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/gdd-template.md +6 -12
- package/src/modules/bmgd/workflows/2-design/gdd/instructions-gdd.md +502 -0
- package/src/modules/bmgd/workflows/2-design/gdd/workflow.yaml +81 -0
- package/src/modules/bmgd/workflows/2-design/narrative/checklist.md +139 -0
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/narrative/instructions-narrative.md +99 -12
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/narrative/narrative-template.md +8 -8
- package/src/modules/bmgd/workflows/2-design/narrative/workflow.yaml +32 -0
- package/src/modules/bmgd/workflows/3-technical/game-architecture/architecture-patterns.yaml +321 -0
- package/src/modules/bmgd/workflows/3-technical/game-architecture/architecture-template.md +103 -0
- package/src/modules/bmgd/workflows/3-technical/game-architecture/checklist.md +240 -0
- package/src/modules/bmgd/workflows/3-technical/game-architecture/decision-catalog.yaml +222 -0
- package/src/modules/bmgd/workflows/3-technical/game-architecture/instructions.md +701 -0
- package/src/modules/bmgd/workflows/3-technical/game-architecture/pattern-categories.csv +13 -0
- package/src/modules/bmgd/workflows/3-technical/game-architecture/workflow.yaml +69 -0
- package/src/modules/bmgd/workflows/4-production/code-review/instructions.md +398 -0
- package/src/modules/bmgd/workflows/4-production/code-review/workflow.yaml +61 -0
- package/src/modules/bmgd/workflows/4-production/correct-course/checklist.md +279 -0
- package/src/modules/bmgd/workflows/4-production/correct-course/instructions.md +206 -0
- package/src/modules/bmgd/workflows/4-production/correct-course/workflow.yaml +58 -0
- package/src/modules/bmgd/workflows/4-production/create-story/checklist.md +240 -0
- package/src/modules/bmgd/workflows/4-production/create-story/instructions.md +256 -0
- package/src/modules/bmgd/workflows/4-production/create-story/template.md +51 -0
- package/src/modules/bmgd/workflows/4-production/create-story/workflow.yaml +74 -0
- package/src/modules/bmgd/workflows/4-production/dev-story/checklist.md +38 -0
- package/src/modules/bmgd/workflows/4-production/dev-story/instructions.md +267 -0
- package/src/modules/bmgd/workflows/4-production/dev-story/workflow.yaml +58 -0
- package/src/modules/{bmm/workflows/3-solutioning/tech-spec → bmgd/workflows/4-production/epic-tech-context}/checklist.md +1 -1
- package/src/modules/bmgd/workflows/4-production/epic-tech-context/instructions.md +164 -0
- package/src/modules/{bmm/workflows/3-solutioning/tech-spec → bmgd/workflows/4-production/epic-tech-context}/template.md +1 -1
- package/src/modules/bmgd/workflows/4-production/epic-tech-context/workflow.yaml +58 -0
- package/src/modules/bmgd/workflows/4-production/retrospective/instructions.md +1443 -0
- package/src/modules/bmgd/workflows/4-production/retrospective/workflow.yaml +57 -0
- package/src/modules/bmgd/workflows/4-production/sprint-planning/checklist.md +33 -0
- package/src/modules/bmgd/workflows/4-production/sprint-planning/instructions.md +234 -0
- package/src/modules/bmgd/workflows/4-production/sprint-planning/sprint-status-template.yaml +55 -0
- package/src/modules/bmgd/workflows/4-production/sprint-planning/workflow.yaml +51 -0
- package/src/modules/bmgd/workflows/4-production/story-context/checklist.md +16 -0
- package/src/modules/bmgd/workflows/4-production/story-context/context-template.xml +34 -0
- package/src/modules/bmgd/workflows/4-production/story-context/instructions.md +209 -0
- package/src/modules/bmgd/workflows/4-production/story-context/workflow.yaml +63 -0
- package/src/modules/bmgd/workflows/4-production/story-done/instructions.md +111 -0
- package/src/modules/bmgd/workflows/4-production/story-done/workflow.yaml +28 -0
- package/src/modules/bmgd/workflows/4-production/story-ready/instructions.md +117 -0
- package/src/modules/bmgd/workflows/4-production/story-ready/workflow.yaml +25 -0
- package/src/modules/bmm/README.md +128 -0
- package/src/modules/bmm/_module-installer/install-config.yaml +60 -0
- package/src/modules/bmm/_module-installer/installer.js +3 -3
- package/src/modules/bmm/_module-installer/platform-specifics/claude-code.js +1 -1
- package/src/modules/bmm/_module-installer/platform-specifics/windsurf.js +1 -1
- package/src/modules/bmm/agents/analyst.agent.yaml +49 -0
- package/src/modules/bmm/agents/architect.agent.yaml +42 -0
- package/src/modules/bmm/agents/dev.agent.yaml +40 -0
- package/src/modules/bmm/agents/frame-expert.agent.yaml +42 -0
- package/src/modules/bmm/agents/pm.agent.yaml +64 -0
- package/src/modules/bmm/agents/sm.agent.yaml +73 -0
- package/src/modules/bmm/agents/tea.agent.yaml +67 -0
- package/src/modules/bmm/agents/tech-writer.agent.yaml +68 -0
- package/src/modules/bmm/agents/ux-designer.agent.yaml +39 -0
- package/src/modules/bmm/docs/README.md +236 -0
- package/src/modules/bmm/docs/agents-guide.md +1058 -0
- package/src/modules/bmm/docs/brownfield-guide.md +762 -0
- package/src/modules/bmm/docs/enterprise-agentic-development.md +686 -0
- package/src/modules/bmm/docs/faq.md +588 -0
- package/src/modules/bmm/docs/glossary.md +320 -0
- package/src/modules/bmm/docs/party-mode.md +224 -0
- package/src/modules/bmm/docs/quick-spec-flow.md +652 -0
- package/src/modules/bmm/docs/quick-start.md +376 -0
- package/src/modules/bmm/docs/scale-adaptive-system.md +612 -0
- package/src/modules/bmm/docs/test-architecture.md +396 -0
- package/src/modules/bmm/docs/workflow-architecture-reference.md +366 -0
- package/src/modules/bmm/docs/workflow-document-project-reference.md +489 -0
- package/src/modules/bmm/docs/workflows-analysis.md +370 -0
- package/src/modules/bmm/docs/workflows-implementation.md +286 -0
- package/src/modules/bmm/docs/workflows-planning.md +612 -0
- package/src/modules/bmm/docs/workflows-solutioning.md +554 -0
- package/src/modules/bmm/teams/default-party.csv +20 -0
- package/src/modules/bmm/teams/team-fullstack.yaml +13 -0
- package/src/modules/bmm/testarch/knowledge/ci-burn-in.md +675 -0
- package/src/modules/bmm/testarch/knowledge/component-tdd.md +486 -0
- package/src/modules/bmm/testarch/knowledge/contract-testing.md +957 -0
- package/src/modules/bmm/testarch/knowledge/data-factories.md +500 -0
- package/src/modules/bmm/testarch/knowledge/email-auth.md +721 -0
- package/src/modules/bmm/testarch/knowledge/error-handling.md +725 -0
- package/src/modules/bmm/testarch/knowledge/feature-flags.md +750 -0
- package/src/modules/bmm/testarch/knowledge/fixture-architecture.md +401 -0
- package/src/modules/bmm/testarch/knowledge/network-first.md +486 -0
- package/src/modules/bmm/testarch/knowledge/nfr-criteria.md +670 -0
- package/src/modules/bmm/testarch/knowledge/playwright-config.md +730 -0
- package/src/modules/bmm/testarch/knowledge/probability-impact.md +601 -0
- package/src/modules/bmm/testarch/knowledge/risk-governance.md +615 -0
- package/src/modules/bmm/testarch/knowledge/selective-testing.md +732 -0
- package/src/modules/bmm/testarch/knowledge/selector-resilience.md +527 -0
- package/src/modules/bmm/testarch/knowledge/test-healing-patterns.md +644 -0
- package/src/modules/bmm/testarch/knowledge/test-levels-framework.md +473 -0
- package/src/modules/bmm/testarch/knowledge/test-priorities-matrix.md +373 -0
- package/src/modules/bmm/testarch/knowledge/test-quality.md +664 -0
- package/src/modules/bmm/testarch/knowledge/timing-debugging.md +372 -0
- package/src/modules/bmm/testarch/knowledge/visual-debugging.md +524 -0
- package/src/modules/bmm/testarch/tea-index.csv +22 -0
- package/src/modules/bmm/workflows/1-analysis/brainstorm-project/instructions.md +82 -8
- package/src/modules/bmm/workflows/1-analysis/brainstorm-project/project-context.md +4 -4
- package/src/modules/bmm/workflows/1-analysis/brainstorm-project/workflow.yaml +23 -5
- package/src/modules/bmm/workflows/1-analysis/domain-research/instructions.md +425 -0
- package/src/modules/bmm/workflows/1-analysis/domain-research/template.md +180 -0
- package/src/modules/bmm/workflows/1-analysis/domain-research/workflow.yaml +56 -0
- package/src/modules/bmm/workflows/1-analysis/product-brief/checklist.md +2 -2
- package/src/modules/bmm/workflows/1-analysis/product-brief/instructions.md +418 -247
- package/src/modules/bmm/workflows/1-analysis/product-brief/template.md +93 -77
- package/src/modules/bmm/workflows/1-analysis/product-brief/workflow.yaml +42 -14
- package/src/modules/bmm/workflows/1-analysis/research/checklist-deep-prompt.md +144 -0
- package/src/modules/bmm/workflows/1-analysis/research/checklist-technical.md +249 -0
- package/src/modules/bmm/workflows/1-analysis/research/checklist.md +156 -59
- package/src/modules/bmm/workflows/1-analysis/research/instructions-deep-prompt.md +115 -47
- package/src/modules/bmm/workflows/1-analysis/research/instructions-market.md +236 -114
- package/src/modules/bmm/workflows/1-analysis/research/instructions-router.md +109 -66
- package/src/modules/bmm/workflows/1-analysis/research/instructions-technical.md +147 -55
- package/src/modules/bmm/workflows/1-analysis/research/template-deep-prompt.md +1 -1
- package/src/modules/bmm/workflows/1-analysis/research/template-market.md +38 -2
- package/src/modules/bmm/workflows/1-analysis/research/template-technical.md +36 -1
- package/src/modules/bmm/workflows/1-analysis/research/workflow.yaml +36 -123
- package/src/modules/bmm/workflows/2-plan-workflows/create-epics-and-stories/epics-template.md +80 -0
- package/src/modules/bmm/workflows/2-plan-workflows/create-epics-and-stories/instructions.md +616 -0
- package/src/modules/bmm/workflows/2-plan-workflows/create-epics-and-stories/workflow.yaml +63 -0
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/checklist.md +310 -0
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/instructions.md +1308 -0
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/ux-design-template.md +145 -0
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/workflow.yaml +93 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/checklist.md +346 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/domain-complexity.csv +13 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/instructions.md +703 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/prd-template.md +204 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/project-types.csv +11 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/workflow.yaml +78 -0
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/checklist.md +217 -0
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/epics-template.md +74 -0
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/instructions-generate-stories.md +436 -0
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/instructions.md +980 -0
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/tech-spec-template.md +181 -0
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/user-story-template.md +90 -0
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/workflow.yaml +60 -0
- package/src/modules/bmm/workflows/3-solutioning/architecture/architecture-patterns.yaml +321 -0
- package/src/modules/bmm/workflows/3-solutioning/architecture/architecture-template.md +103 -0
- package/src/modules/bmm/workflows/3-solutioning/architecture/checklist.md +240 -0
- package/src/modules/bmm/workflows/3-solutioning/architecture/decision-catalog.yaml +222 -0
- package/src/modules/bmm/workflows/3-solutioning/architecture/instructions.md +768 -0
- package/src/modules/bmm/workflows/3-solutioning/architecture/pattern-categories.csv +13 -0
- package/src/modules/bmm/workflows/3-solutioning/architecture/workflow.yaml +100 -0
- package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/checklist.md +169 -0
- package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/instructions.md +332 -0
- package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/template.md +146 -0
- package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/workflow.yaml +64 -0
- package/src/modules/bmm/workflows/4-implementation/code-review/backlog_template.md +12 -0
- package/src/modules/bmm/workflows/4-implementation/code-review/checklist.md +22 -0
- package/src/modules/bmm/workflows/4-implementation/code-review/instructions.md +398 -0
- package/src/modules/bmm/workflows/4-implementation/code-review/workflow.yaml +61 -0
- package/src/modules/bmm/workflows/4-implementation/correct-course/checklist.md +6 -6
- package/src/modules/bmm/workflows/4-implementation/correct-course/instructions.md +70 -54
- package/src/modules/bmm/workflows/4-implementation/correct-course/workflow.yaml +44 -21
- package/src/modules/bmm/workflows/4-implementation/create-story/checklist.md +240 -39
- package/src/modules/bmm/workflows/4-implementation/create-story/instructions.md +203 -28
- package/src/modules/bmm/workflows/4-implementation/create-story/template.md +2 -8
- package/src/modules/bmm/workflows/4-implementation/create-story/workflow.yaml +43 -42
- package/src/modules/bmm/workflows/4-implementation/dev-story/checklist.md +1 -1
- package/src/modules/bmm/workflows/4-implementation/dev-story/instructions.md +220 -40
- package/src/modules/bmm/workflows/4-implementation/dev-story/workflow.yaml +43 -38
- package/src/modules/bmm/workflows/4-implementation/epic-tech-context/checklist.md +17 -0
- package/src/modules/bmm/workflows/4-implementation/epic-tech-context/instructions.md +164 -0
- package/src/modules/bmm/workflows/4-implementation/epic-tech-context/template.md +76 -0
- package/src/modules/bmm/workflows/4-implementation/epic-tech-context/workflow.yaml +58 -0
- package/src/modules/bmm/workflows/4-implementation/retrospective/instructions.md +1280 -228
- package/src/modules/bmm/workflows/4-implementation/retrospective/workflow.yaml +41 -25
- package/src/modules/bmm/workflows/4-implementation/sprint-planning/checklist.md +33 -0
- package/src/modules/bmm/workflows/4-implementation/sprint-planning/instructions.md +234 -0
- package/src/modules/bmm/workflows/4-implementation/sprint-planning/sprint-status-template.yaml +55 -0
- package/src/modules/bmm/workflows/4-implementation/sprint-planning/workflow.yaml +51 -0
- package/src/modules/bmm/workflows/4-implementation/story-context/checklist.md +1 -1
- package/src/modules/bmm/workflows/4-implementation/story-context/context-template.xml +1 -1
- package/src/modules/bmm/workflows/4-implementation/story-context/instructions.md +155 -22
- package/src/modules/bmm/workflows/4-implementation/story-context/workflow.yaml +43 -36
- package/src/modules/bmm/workflows/4-implementation/story-done/instructions.md +111 -0
- package/src/modules/bmm/workflows/4-implementation/story-done/workflow.yaml +28 -0
- package/src/modules/bmm/workflows/4-implementation/story-ready/instructions.md +117 -0
- package/src/modules/bmm/workflows/4-implementation/story-ready/workflow.yaml +25 -0
- package/src/modules/bmm/workflows/document-project/checklist.md +245 -0
- package/src/modules/bmm/workflows/document-project/documentation-requirements.csv +12 -0
- package/src/modules/bmm/workflows/document-project/instructions.md +222 -0
- package/src/modules/bmm/workflows/document-project/templates/deep-dive-template.md +345 -0
- package/src/modules/bmm/workflows/document-project/templates/index-template.md +169 -0
- package/src/modules/bmm/workflows/document-project/templates/project-overview-template.md +103 -0
- package/src/modules/bmm/workflows/document-project/templates/project-scan-report-schema.json +160 -0
- package/src/modules/bmm/workflows/document-project/templates/source-tree-template.md +135 -0
- package/src/modules/bmm/workflows/document-project/workflow.yaml +31 -0
- package/src/modules/bmm/workflows/document-project/workflows/deep-dive-instructions.md +298 -0
- package/src/modules/bmm/workflows/document-project/workflows/deep-dive.yaml +31 -0
- package/src/modules/bmm/workflows/document-project/workflows/full-scan-instructions.md +1106 -0
- package/src/modules/bmm/workflows/document-project/workflows/full-scan.yaml +31 -0
- package/src/modules/bmm/workflows/frame-expert/_shared/excalidraw-helpers.md +127 -0
- package/src/modules/bmm/workflows/frame-expert/_shared/excalidraw-library.json +90 -0
- package/src/modules/bmm/workflows/frame-expert/_shared/excalidraw-templates.yaml +127 -0
- package/src/modules/bmm/workflows/frame-expert/_shared/validate-json-instructions.md +79 -0
- package/src/modules/bmm/workflows/frame-expert/create-dataflow/checklist.md +39 -0
- package/src/modules/bmm/workflows/frame-expert/create-dataflow/instructions.md +131 -0
- package/src/modules/bmm/workflows/frame-expert/create-dataflow/workflow.yaml +24 -0
- package/src/modules/bmm/workflows/frame-expert/create-diagram/checklist.md +43 -0
- package/src/modules/bmm/workflows/frame-expert/create-diagram/instructions.md +142 -0
- package/src/modules/bmm/workflows/frame-expert/create-diagram/workflow.yaml +25 -0
- package/src/modules/bmm/workflows/frame-expert/create-flowchart/checklist.md +49 -0
- package/src/modules/bmm/workflows/frame-expert/create-flowchart/instructions.md +242 -0
- package/src/modules/bmm/workflows/frame-expert/create-flowchart/workflow.yaml +28 -0
- package/src/modules/bmm/workflows/frame-expert/create-wireframe/checklist.md +38 -0
- package/src/modules/bmm/workflows/frame-expert/create-wireframe/instructions.md +133 -0
- package/src/modules/bmm/workflows/frame-expert/create-wireframe/workflow.yaml +24 -0
- package/src/modules/bmm/workflows/techdoc/documentation-standards.md +262 -0
- package/src/modules/bmm/workflows/testarch/atdd/atdd-checklist-template.md +363 -0
- package/src/modules/bmm/workflows/testarch/atdd/checklist.md +373 -0
- package/src/modules/bmm/workflows/testarch/atdd/instructions.md +785 -0
- package/src/modules/bmm/workflows/testarch/atdd/workflow.yaml +47 -0
- package/src/modules/bmm/workflows/testarch/automate/checklist.md +580 -0
- package/src/modules/bmm/workflows/testarch/automate/instructions.md +1303 -0
- package/src/modules/bmm/workflows/testarch/automate/workflow.yaml +54 -0
- package/src/modules/bmm/workflows/testarch/ci/checklist.md +246 -0
- package/src/modules/bmm/workflows/testarch/ci/github-actions-template.yaml +165 -0
- package/src/modules/bmm/workflows/testarch/ci/gitlab-ci-template.yaml +128 -0
- package/src/modules/bmm/workflows/testarch/ci/instructions.md +517 -0
- package/src/modules/bmm/workflows/testarch/ci/workflow.yaml +47 -0
- package/src/modules/bmm/workflows/testarch/framework/checklist.md +321 -0
- package/src/modules/bmm/workflows/testarch/framework/instructions.md +455 -0
- package/src/modules/bmm/workflows/testarch/framework/workflow.yaml +49 -0
- package/src/modules/bmm/workflows/testarch/nfr-assess/checklist.md +405 -0
- package/src/modules/bmm/workflows/testarch/nfr-assess/instructions.md +722 -0
- package/src/modules/bmm/workflows/testarch/nfr-assess/nfr-report-template.md +443 -0
- package/src/modules/bmm/workflows/testarch/nfr-assess/workflow.yaml +49 -0
- package/src/modules/bmm/workflows/testarch/test-design/checklist.md +234 -0
- package/src/modules/bmm/workflows/testarch/test-design/instructions.md +782 -0
- package/src/modules/bmm/workflows/testarch/test-design/test-design-template.md +285 -0
- package/src/modules/bmm/workflows/testarch/test-design/workflow.yaml +50 -0
- package/src/modules/bmm/workflows/testarch/test-review/checklist.md +470 -0
- package/src/modules/bmm/workflows/testarch/test-review/instructions.md +608 -0
- package/src/modules/bmm/workflows/testarch/test-review/test-review-template.md +388 -0
- package/src/modules/bmm/workflows/testarch/test-review/workflow.yaml +48 -0
- package/src/modules/bmm/workflows/testarch/trace/checklist.md +654 -0
- package/src/modules/bmm/workflows/testarch/trace/instructions.md +1045 -0
- package/src/modules/bmm/workflows/testarch/trace/trace-template.md +673 -0
- package/src/modules/bmm/workflows/testarch/trace/workflow.yaml +57 -0
- package/src/modules/bmm/workflows/workflow-status/init/instructions.md +334 -0
- package/src/modules/bmm/workflows/workflow-status/init/workflow.yaml +29 -0
- package/src/modules/bmm/workflows/workflow-status/instructions.md +388 -0
- package/src/modules/bmm/workflows/workflow-status/paths/enterprise-brownfield.yaml +138 -0
- package/src/modules/bmm/workflows/workflow-status/paths/enterprise-greenfield.yaml +126 -0
- package/src/modules/bmm/workflows/workflow-status/paths/game-design.yaml +52 -0
- package/src/modules/bmm/workflows/workflow-status/paths/method-brownfield.yaml +122 -0
- package/src/modules/bmm/workflows/workflow-status/paths/method-greenfield.yaml +113 -0
- package/src/modules/bmm/workflows/workflow-status/paths/quick-flow-brownfield.yaml +58 -0
- package/src/modules/bmm/workflows/workflow-status/paths/quick-flow-greenfield.yaml +47 -0
- package/src/modules/bmm/workflows/workflow-status/project-levels.yaml +59 -0
- package/src/modules/bmm/workflows/workflow-status/workflow-status-template.yaml +24 -0
- package/src/modules/bmm/workflows/workflow-status/workflow.yaml +30 -0
- package/src/modules/cis/README.md +153 -0
- package/src/modules/cis/_module-installer/{install-menu-config.yaml → install-config.yaml} +6 -4
- package/src/modules/cis/_module-installer/installer.js +1 -1
- package/src/modules/cis/agents/README.md +1 -1
- package/src/modules/cis/agents/brainstorming-coach.agent.yaml +28 -0
- package/src/modules/cis/agents/creative-problem-solver.agent.yaml +28 -0
- package/src/modules/cis/agents/design-thinking-coach.agent.yaml +28 -0
- package/src/modules/cis/agents/innovation-strategist.agent.yaml +28 -0
- package/src/modules/cis/agents/storyteller.agent.yaml +28 -0
- package/src/modules/cis/teams/creative-squad.yaml +1 -0
- package/src/modules/cis/teams/default-party.csv +11 -0
- package/src/modules/cis/workflows/README.md +102 -30
- package/src/modules/cis/workflows/design-thinking/design-methods.csv +1 -1
- package/src/modules/cis/workflows/design-thinking/instructions.md +4 -2
- package/src/modules/cis/workflows/design-thinking/workflow.yaml +16 -7
- package/src/modules/cis/workflows/innovation-strategy/innovation-frameworks.csv +2 -2
- package/src/modules/cis/workflows/innovation-strategy/instructions.md +7 -5
- package/src/modules/cis/workflows/innovation-strategy/template.md +6 -6
- package/src/modules/cis/workflows/innovation-strategy/workflow.yaml +16 -7
- package/src/modules/cis/workflows/problem-solving/instructions.md +4 -2
- package/src/modules/cis/workflows/problem-solving/solving-methods.csv +6 -6
- package/src/modules/cis/workflows/problem-solving/template.md +3 -3
- package/src/modules/cis/workflows/problem-solving/workflow.yaml +16 -7
- package/src/modules/cis/workflows/storytelling/instructions.md +48 -30
- package/src/modules/cis/workflows/storytelling/template.md +2 -2
- package/src/modules/cis/workflows/storytelling/workflow.yaml +16 -7
- package/src/utility/models/action-command-header.md +0 -0
- package/src/utility/models/agent-activation-ide.xml +4 -4
- package/src/utility/models/agent-activation-web.xml +60 -0
- package/src/utility/models/agent-command-header.md +1 -0
- package/src/utility/models/agent-in-team-activation.xml +3 -0
- package/src/utility/models/fragments/activation-rules.xml +8 -0
- package/src/utility/models/fragments/activation-steps.xml +16 -0
- package/src/utility/models/fragments/handler-action.xml +4 -0
- package/src/utility/models/fragments/handler-data.xml +5 -0
- package/src/utility/models/fragments/handler-exec.xml +5 -0
- package/src/utility/models/fragments/handler-tmpl.xml +5 -0
- package/src/utility/models/fragments/handler-validate-workflow.xml +7 -0
- package/src/utility/models/fragments/handler-workflow.xml +9 -0
- package/src/utility/models/fragments/menu-handlers.xml +6 -0
- package/src/utility/models/fragments/web-bundle-activation-steps.xml +32 -0
- package/src/utility/templates/agent.customize.template.yaml +42 -0
- package/test/README.md +295 -0
- package/test/fixtures/agent-schema/invalid/critical-actions/actions-as-string.agent.yaml +26 -0
- package/test/fixtures/agent-schema/invalid/critical-actions/empty-string-in-actions.agent.yaml +29 -0
- package/test/fixtures/agent-schema/invalid/menu/empty-menu.agent.yaml +21 -0
- package/test/fixtures/agent-schema/invalid/menu/missing-menu.agent.yaml +19 -0
- package/test/fixtures/agent-schema/invalid/menu-commands/empty-command-target.agent.yaml +24 -0
- package/test/fixtures/agent-schema/invalid/menu-commands/no-command-target.agent.yaml +23 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/camel-case.agent.yaml +24 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/duplicate-triggers.agent.yaml +30 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/empty-trigger.agent.yaml +24 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/leading-asterisk.agent.yaml +24 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/snake-case.agent.yaml +24 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/trigger-with-spaces.agent.yaml +24 -0
- package/test/fixtures/agent-schema/invalid/metadata/core-agent-with-module.agent.yaml +26 -0
- package/test/fixtures/agent-schema/invalid/metadata/empty-module-string.agent.yaml +26 -0
- package/test/fixtures/agent-schema/invalid/metadata/empty-name.agent.yaml +24 -0
- package/test/fixtures/agent-schema/invalid/metadata/extra-metadata-fields.agent.yaml +26 -0
- package/test/fixtures/agent-schema/invalid/metadata/missing-id.agent.yaml +23 -0
- package/test/fixtures/agent-schema/invalid/metadata/module-agent-missing-module.agent.yaml +25 -0
- package/test/fixtures/agent-schema/invalid/metadata/wrong-module-value.agent.yaml +26 -0
- package/test/fixtures/agent-schema/invalid/persona/empty-principles-array.agent.yaml +23 -0
- package/test/fixtures/agent-schema/invalid/persona/empty-string-in-principles.agent.yaml +26 -0
- package/test/fixtures/agent-schema/invalid/persona/extra-persona-fields.agent.yaml +26 -0
- package/test/fixtures/agent-schema/invalid/persona/missing-role.agent.yaml +23 -0
- package/test/fixtures/agent-schema/invalid/prompts/empty-content.agent.yaml +28 -0
- package/test/fixtures/agent-schema/invalid/prompts/extra-prompt-fields.agent.yaml +30 -0
- package/test/fixtures/agent-schema/invalid/prompts/missing-content.agent.yaml +27 -0
- package/test/fixtures/agent-schema/invalid/prompts/missing-id.agent.yaml +27 -0
- package/test/fixtures/agent-schema/invalid/top-level/empty-file.agent.yaml +5 -0
- package/test/fixtures/agent-schema/invalid/top-level/extra-top-level-keys.agent.yaml +27 -0
- package/test/fixtures/agent-schema/invalid/top-level/missing-agent-key.agent.yaml +11 -0
- package/test/fixtures/agent-schema/invalid/yaml-errors/invalid-indentation.agent.yaml +19 -0
- package/test/fixtures/agent-schema/invalid/yaml-errors/malformed-yaml.agent.yaml +18 -0
- package/test/fixtures/agent-schema/valid/critical-actions/empty-critical-actions.agent.yaml +23 -0
- package/test/fixtures/agent-schema/valid/critical-actions/no-critical-actions.agent.yaml +21 -0
- package/test/fixtures/agent-schema/valid/critical-actions/valid-critical-actions.agent.yaml +26 -0
- package/test/fixtures/agent-schema/valid/menu/multiple-menu-items.agent.yaml +30 -0
- package/test/fixtures/agent-schema/valid/menu/single-menu-item.agent.yaml +21 -0
- package/test/fixtures/agent-schema/valid/menu-commands/all-command-types.agent.yaml +39 -0
- package/test/fixtures/agent-schema/valid/menu-commands/multiple-commands.agent.yaml +23 -0
- package/test/fixtures/agent-schema/valid/menu-triggers/kebab-case-triggers.agent.yaml +33 -0
- package/test/fixtures/agent-schema/valid/metadata/empty-module-name-in-path.agent.yaml +23 -0
- package/test/fixtures/agent-schema/valid/metadata/malformed-path-treated-as-core.agent.yaml +23 -0
- package/test/fixtures/agent-schema/valid/metadata/module-agent-correct.agent.yaml +23 -0
- package/test/fixtures/agent-schema/valid/persona/complete-persona.agent.yaml +23 -0
- package/test/fixtures/agent-schema/valid/prompts/empty-prompts.agent.yaml +23 -0
- package/test/fixtures/agent-schema/valid/prompts/no-prompts.agent.yaml +21 -0
- package/test/fixtures/agent-schema/valid/prompts/valid-prompts-minimal.agent.yaml +27 -0
- package/test/fixtures/agent-schema/valid/prompts/valid-prompts-with-description.agent.yaml +29 -0
- package/test/fixtures/agent-schema/valid/top-level/minimal-core-agent.agent.yaml +23 -0
- package/test/test-agent-schema.js +387 -0
- package/test/test-cli-integration.sh +159 -0
- package/test/test-installation-components.js +214 -0
- package/test/unit-test-schema.js +133 -0
- package/tools/bmad-npx-wrapper.js +38 -0
- package/tools/cli/README.md +608 -0
- package/tools/cli/bmad-cli.js +0 -2
- package/tools/cli/bundlers/bundle-web.js +24 -2
- package/tools/cli/bundlers/test-bundler.js +1 -1
- package/tools/cli/bundlers/web-bundler.js +944 -49
- package/tools/cli/commands/build.js +458 -0
- package/tools/cli/commands/install.js +46 -8
- package/tools/cli/installers/lib/core/config-collector.js +490 -43
- package/tools/cli/installers/lib/core/dependency-resolver.js +5 -1
- package/tools/cli/installers/lib/core/detector.js +134 -13
- package/tools/cli/installers/lib/core/ide-config-manager.js +154 -0
- package/tools/cli/installers/lib/core/installer.js +1365 -167
- package/tools/cli/installers/lib/core/manifest-generator.js +388 -81
- package/tools/cli/installers/lib/core/manifest.js +100 -44
- package/tools/cli/installers/lib/ide/_base-ide.js +368 -23
- package/tools/cli/installers/lib/ide/auggie.js +100 -192
- package/tools/cli/installers/lib/ide/claude-code.js +167 -321
- package/tools/cli/installers/lib/ide/cline.js +146 -227
- package/tools/cli/installers/lib/ide/codex.js +138 -202
- package/tools/cli/installers/lib/ide/crush.js +108 -72
- package/tools/cli/installers/lib/ide/cursor.js +148 -20
- package/tools/cli/installers/lib/ide/gemini.js +109 -63
- package/tools/cli/installers/lib/ide/github-copilot.js +60 -47
- package/tools/cli/installers/lib/ide/iflow.js +13 -30
- package/tools/cli/installers/lib/ide/kilo.js +20 -16
- package/tools/cli/installers/lib/ide/manager.js +41 -35
- package/tools/cli/installers/lib/ide/opencode.js +212 -0
- package/tools/cli/installers/lib/ide/qwen.js +198 -68
- package/tools/cli/installers/lib/ide/roo.js +27 -62
- package/tools/cli/installers/lib/ide/shared/agent-command-generator.js +90 -0
- package/tools/cli/installers/lib/ide/shared/bmad-artifacts.js +143 -0
- package/tools/cli/installers/lib/ide/shared/module-injections.js +133 -0
- package/tools/cli/installers/lib/ide/shared/task-tool-command-generator.js +119 -0
- package/tools/cli/installers/lib/ide/shared/workflow-command-generator.js +237 -0
- package/tools/cli/installers/lib/ide/templates/agent-command-template.md +14 -0
- package/tools/cli/installers/lib/ide/templates/gemini-agent-command.toml +14 -0
- package/tools/cli/installers/lib/ide/templates/gemini-task-command.toml +12 -0
- package/tools/cli/installers/lib/ide/{workflow-command-template.md → templates/workflow-command-template.md} +7 -5
- package/tools/cli/installers/lib/ide/trae.js +138 -54
- package/tools/cli/installers/lib/ide/windsurf.js +104 -42
- package/tools/cli/installers/lib/modules/manager.js +332 -10
- package/tools/cli/lib/activation-builder.js +168 -0
- package/tools/cli/lib/agent-analyzer.js +81 -0
- package/tools/cli/lib/agent-party-generator.js +3 -3
- package/tools/cli/lib/cli-utils.js +52 -50
- package/tools/cli/lib/config.js +3 -1
- package/tools/cli/lib/ui.js +106 -14
- package/tools/cli/lib/xml-handler.js +47 -1
- package/tools/cli/lib/yaml-format.js +2 -1
- package/tools/cli/lib/yaml-xml-builder.js +507 -0
- package/tools/cli/regenerate-manifests.js +1 -1
- package/tools/cli/test-yaml-builder.js +43 -0
- package/tools/format-workflow-md.js +263 -0
- package/tools/platform-codes.yaml +6 -0
- package/tools/schema/agent.js +240 -0
- package/tools/validate-agent-schema.js +110 -0
- package/v6-open-items.md +17 -0
- package/.github/workflows/format-check.yaml +0 -43
- package/docs/codebase-flattener.md +0 -19
- package/readme.md +0 -216
- package/src/core/_module-installer/install-menu-config.yaml +0 -24
- package/src/core/agents/bmad-master.md +0 -27
- package/src/core/agents/bmad-web-orchestrator.md +0 -71
- package/src/core/tasks/shard-doc.md +0 -57
- package/src/core/tasks/workflow.md +0 -141
- package/src/core/workflows/bmad-init/instructions.md +0 -79
- package/src/core/workflows/bmad-init/workflow.yaml +0 -24
- package/src/modules/bmb/_module-installer/install-menu-config.yaml +0 -16
- package/src/modules/bmb/agents/bmad-builder.md +0 -30
- package/src/modules/bmb/workflows/create-module/installer-templates/install-module-config.yaml +0 -132
- package/src/modules/bmm/_module-installer/install-menu-config.yaml +0 -49
- package/src/modules/bmm/agents/analyst.md +0 -26
- package/src/modules/bmm/agents/architect.md +0 -29
- package/src/modules/bmm/agents/dev.md +0 -61
- package/src/modules/bmm/agents/game-architect.md +0 -26
- package/src/modules/bmm/agents/game-designer.md +0 -27
- package/src/modules/bmm/agents/game-dev.md +0 -28
- package/src/modules/bmm/agents/pm.md +0 -26
- package/src/modules/bmm/agents/po.md +0 -25
- package/src/modules/bmm/agents/sm.md +0 -29
- package/src/modules/bmm/agents/tea.md +0 -32
- package/src/modules/bmm/agents/ux-expert.md +0 -24
- package/src/modules/bmm/sub-modules/claude-code/config.yaml +0 -5
- package/src/modules/bmm/sub-modules/claude-code/injections.yaml +0 -242
- package/src/modules/bmm/sub-modules/claude-code/readme.md +0 -87
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/api-documenter.md +0 -85
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/codebase-analyzer.md +0 -64
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/data-analyst.md +0 -84
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/dependency-mapper.md +0 -67
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/document-reviewer.md +0 -85
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/epic-optimizer.md +0 -66
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/market-researcher.md +0 -34
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/pattern-detector.md +0 -67
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/requirements-analyst.md +0 -61
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/tech-debt-auditor.md +0 -89
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/technical-decisions-curator.md +0 -146
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/technical-evaluator.md +0 -51
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/test-coverage-analyzer.md +0 -91
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/trend-spotter.md +0 -99
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/user-journey-mapper.md +0 -101
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/user-researcher.md +0 -56
- package/src/modules/bmm/tasks/daily-standup.md +0 -91
- package/src/modules/bmm/tasks/retrospective.md +0 -110
- package/src/modules/bmm/teams/team-all.yaml +0 -7
- package/src/modules/bmm/teams/team-dev.yaml +0 -14
- package/src/modules/bmm/teams/team-gamedev.yaml +0 -9
- package/src/modules/bmm/testarch/atdd.md +0 -40
- package/src/modules/bmm/testarch/automate.md +0 -38
- package/src/modules/bmm/testarch/ci.md +0 -39
- package/src/modules/bmm/testarch/framework.md +0 -41
- package/src/modules/bmm/testarch/nfr-assess.md +0 -38
- package/src/modules/bmm/testarch/risk-profile.md +0 -38
- package/src/modules/bmm/testarch/tea-commands.csv +0 -11
- package/src/modules/bmm/testarch/tea-gate.md +0 -38
- package/src/modules/bmm/testarch/tea-knowledge.md +0 -275
- package/src/modules/bmm/testarch/test-design.md +0 -39
- package/src/modules/bmm/testarch/test-levels-framework.md +0 -148
- package/src/modules/bmm/testarch/test-priorities-matrix.md +0 -174
- package/src/modules/bmm/testarch/trace-requirements.md +0 -38
- package/src/modules/bmm/workflows/1-analysis/brainstorm-game/instructions.md +0 -47
- package/src/modules/bmm/workflows/1-analysis/brainstorm-game/workflow.yaml +0 -22
- package/src/modules/bmm/workflows/1-analysis/game-brief/README.md +0 -221
- package/src/modules/bmm/workflows/1-analysis/game-brief/instructions.md +0 -517
- package/src/modules/bmm/workflows/1-analysis/game-brief/workflow.yaml +0 -34
- package/src/modules/bmm/workflows/1-analysis/product-brief/README.md +0 -180
- package/src/modules/bmm/workflows/1-analysis/research/README.md +0 -454
- package/src/modules/bmm/workflows/1-analysis/research/claude-code/sub-agents/bmm-competitor-analyzer.md +0 -259
- package/src/modules/bmm/workflows/1-analysis/research/claude-code/sub-agents/bmm-data-analyst.md +0 -190
- package/src/modules/bmm/workflows/1-analysis/research/claude-code/sub-agents/bmm-market-researcher.md +0 -337
- package/src/modules/bmm/workflows/1-analysis/research/claude-code/sub-agents/bmm-trend-spotter.md +0 -107
- package/src/modules/bmm/workflows/1-analysis/research/claude-code/sub-agents/bmm-user-researcher.md +0 -329
- package/src/modules/bmm/workflows/2-plan/README.md +0 -203
- package/src/modules/bmm/workflows/2-plan/checklist.md +0 -369
- package/src/modules/bmm/workflows/2-plan/gdd/README.md +0 -222
- package/src/modules/bmm/workflows/2-plan/gdd/instructions-gdd.md +0 -480
- package/src/modules/bmm/workflows/2-plan/instructions-router.md +0 -222
- package/src/modules/bmm/workflows/2-plan/prd/analysis-template.md +0 -53
- package/src/modules/bmm/workflows/2-plan/prd/epics-template.md +0 -18
- package/src/modules/bmm/workflows/2-plan/prd/instructions-lg.md +0 -267
- package/src/modules/bmm/workflows/2-plan/prd/instructions-med.md +0 -251
- package/src/modules/bmm/workflows/2-plan/prd/prd-template.md +0 -73
- package/src/modules/bmm/workflows/2-plan/tech-spec/instructions-sm.md +0 -137
- package/src/modules/bmm/workflows/2-plan/tech-spec/tech-spec-template.md +0 -59
- package/src/modules/bmm/workflows/2-plan/ux/instructions-ux.md +0 -360
- package/src/modules/bmm/workflows/2-plan/ux/ux-spec-template.md +0 -162
- package/src/modules/bmm/workflows/2-plan/workflow.yaml +0 -60
- package/src/modules/bmm/workflows/3-solutioning/ADR-template.md +0 -74
- package/src/modules/bmm/workflows/3-solutioning/README.md +0 -565
- package/src/modules/bmm/workflows/3-solutioning/checklist.md +0 -170
- package/src/modules/bmm/workflows/3-solutioning/instructions.md +0 -661
- package/src/modules/bmm/workflows/3-solutioning/project-types/backend-questions.md +0 -490
- package/src/modules/bmm/workflows/3-solutioning/project-types/cli-questions.md +0 -337
- package/src/modules/bmm/workflows/3-solutioning/project-types/data-questions.md +0 -472
- package/src/modules/bmm/workflows/3-solutioning/project-types/desktop-questions.md +0 -299
- package/src/modules/bmm/workflows/3-solutioning/project-types/embedded-questions.md +0 -118
- package/src/modules/bmm/workflows/3-solutioning/project-types/extension-questions.md +0 -374
- package/src/modules/bmm/workflows/3-solutioning/project-types/game-questions.md +0 -133
- package/src/modules/bmm/workflows/3-solutioning/project-types/infra-questions.md +0 -484
- package/src/modules/bmm/workflows/3-solutioning/project-types/library-questions.md +0 -146
- package/src/modules/bmm/workflows/3-solutioning/project-types/mobile-questions.md +0 -110
- package/src/modules/bmm/workflows/3-solutioning/project-types/project-types.csv +0 -12
- package/src/modules/bmm/workflows/3-solutioning/project-types/web-questions.md +0 -136
- package/src/modules/bmm/workflows/3-solutioning/tech-spec/README.md +0 -195
- package/src/modules/bmm/workflows/3-solutioning/tech-spec/instructions.md +0 -73
- package/src/modules/bmm/workflows/3-solutioning/tech-spec/workflow.yaml +0 -51
- package/src/modules/bmm/workflows/3-solutioning/templates/backend-service-architecture.md +0 -66
- package/src/modules/bmm/workflows/3-solutioning/templates/cli-tool-architecture.md +0 -66
- package/src/modules/bmm/workflows/3-solutioning/templates/data-pipeline-architecture.md +0 -66
- package/src/modules/bmm/workflows/3-solutioning/templates/desktop-app-architecture.md +0 -66
- package/src/modules/bmm/workflows/3-solutioning/templates/embedded-firmware-architecture.md +0 -66
- package/src/modules/bmm/workflows/3-solutioning/templates/game-engine-architecture.md +0 -244
- package/src/modules/bmm/workflows/3-solutioning/templates/game-engine-godot-guide.md +0 -428
- package/src/modules/bmm/workflows/3-solutioning/templates/game-engine-unity-guide.md +0 -333
- package/src/modules/bmm/workflows/3-solutioning/templates/game-engine-web-guide.md +0 -528
- package/src/modules/bmm/workflows/3-solutioning/templates/infrastructure-architecture.md +0 -66
- package/src/modules/bmm/workflows/3-solutioning/templates/library-package-architecture.md +0 -66
- package/src/modules/bmm/workflows/3-solutioning/templates/mobile-app-architecture.md +0 -66
- package/src/modules/bmm/workflows/3-solutioning/templates/registry.csv +0 -172
- package/src/modules/bmm/workflows/3-solutioning/templates/web-api-architecture.md +0 -66
- package/src/modules/bmm/workflows/3-solutioning/templates/web-fullstack-architecture.md +0 -277
- package/src/modules/bmm/workflows/3-solutioning/workflow.yaml +0 -65
- package/src/modules/bmm/workflows/4-implementation/create-story/README.md +0 -42
- package/src/modules/bmm/workflows/4-implementation/dev-story/README.md +0 -84
- package/src/modules/bmm/workflows/4-implementation/review-story/README.md +0 -72
- package/src/modules/bmm/workflows/4-implementation/review-story/instructions.md +0 -176
- package/src/modules/bmm/workflows/4-implementation/review-story/workflow.yaml +0 -99
- package/src/modules/bmm/workflows/4-implementation/story-context/README.md +0 -234
- package/src/modules/cis/agents/brainstorming-coach.md +0 -24
- package/src/modules/cis/agents/creative-problem-solver.md +0 -24
- package/src/modules/cis/agents/design-thinking-coach.md +0 -24
- package/src/modules/cis/agents/innovation-strategist.md +0 -24
- package/src/modules/cis/agents/storyteller.md +0 -24
- package/src/modules/cis/readme.md +0 -86
- package/tools/cli/installers/lib/ide/workflow-command-generator.js +0 -162
- package/tools/test-agents/captain-kirk-commander.md +0 -110
- package/tools/test-agents/data-operations-android.md +0 -123
- package/tools/test-agents/geordi-chief-engineer.md +0 -135
- package/tools/test-agents/isabella-martinez-ethicist.md +0 -109
- package/tools/test-agents/marcus-thompson-security.md +0 -109
- package/tools/test-agents/maya-patel-pragmatist.md +0 -82
- package/tools/test-agents/picard-diplomat-captain.md +0 -134
- package/tools/test-agents/spock-science-officer.md +0 -124
- package/tools/test-agents/william-smithers-technocrat.md +0 -71
- package/tools/test-agents/zara-chen-designer.md +0 -94
- /package/src/{modules/cis → core}/workflows/brainstorming/brain-methods.csv +0 -0
- /package/src/modules/{bmm/workflows/1-analysis → bmgd/workflows/1-preproduction}/brainstorm-game/game-brain-methods.csv +0 -0
- /package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/metroidvania.md +0 -0
- /package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/puzzle.md +0 -0
- /package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types.csv +0 -0
- /package/src/modules/{bmm/workflows/4-implementation/review-story → bmgd/workflows/4-production/code-review}/backlog_template.md +0 -0
- /package/src/modules/{bmm/workflows/4-implementation/review-story → bmgd/workflows/4-production/code-review}/checklist.md +0 -0
- /package/src/modules/bmm/_module-installer/assets/{technical-decisions-template.md → technical-decisions.md} +0 -0
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
const path = require('node:path');
|
|
2
2
|
const fs = require('fs-extra');
|
|
3
3
|
const yaml = require('js-yaml');
|
|
4
|
+
const crypto = require('node:crypto');
|
|
4
5
|
const { getSourcePath, getModulePath } = require('../../../lib/project-root');
|
|
5
6
|
|
|
7
|
+
// Load package.json for version info
|
|
8
|
+
const packageJson = require('../../../../../package.json');
|
|
9
|
+
|
|
6
10
|
/**
|
|
7
11
|
* Generates manifest files for installed workflows, agents, and tasks
|
|
8
12
|
*/
|
|
@@ -11,22 +15,44 @@ class ManifestGenerator {
|
|
|
11
15
|
this.workflows = [];
|
|
12
16
|
this.agents = [];
|
|
13
17
|
this.tasks = [];
|
|
18
|
+
this.tools = [];
|
|
14
19
|
this.modules = [];
|
|
15
20
|
this.files = [];
|
|
21
|
+
this.selectedIdes = [];
|
|
16
22
|
}
|
|
17
23
|
|
|
18
24
|
/**
|
|
19
25
|
* Generate all manifests for the installation
|
|
20
26
|
* @param {string} bmadDir - BMAD installation directory
|
|
21
27
|
* @param {Array} selectedModules - Selected modules for installation
|
|
28
|
+
* @param {Array} installedFiles - All installed files (optional, for hash tracking)
|
|
22
29
|
*/
|
|
23
|
-
async generateManifests(bmadDir, selectedModules) {
|
|
30
|
+
async generateManifests(bmadDir, selectedModules, installedFiles = [], options = {}) {
|
|
24
31
|
// Create _cfg directory if it doesn't exist
|
|
25
32
|
const cfgDir = path.join(bmadDir, '_cfg');
|
|
26
33
|
await fs.ensureDir(cfgDir);
|
|
27
34
|
|
|
28
|
-
// Store modules list
|
|
29
|
-
|
|
35
|
+
// Store modules list (all modules including preserved ones)
|
|
36
|
+
const preservedModules = options.preservedModules || [];
|
|
37
|
+
// Deduplicate modules list to prevent duplicates
|
|
38
|
+
this.modules = [...new Set(['core', ...selectedModules, ...preservedModules])];
|
|
39
|
+
this.updatedModules = [...new Set(['core', ...selectedModules])]; // Only these get rescanned
|
|
40
|
+
this.preservedModules = preservedModules; // These stay as-is in CSVs
|
|
41
|
+
this.bmadDir = bmadDir;
|
|
42
|
+
this.bmadFolderName = path.basename(bmadDir); // Get the actual folder name (e.g., '.bmad' or 'bmad')
|
|
43
|
+
this.allInstalledFiles = installedFiles;
|
|
44
|
+
|
|
45
|
+
if (!Object.prototype.hasOwnProperty.call(options, 'ides')) {
|
|
46
|
+
throw new Error('ManifestGenerator requires `options.ides` to be provided – installer should supply the selected IDEs array.');
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const resolvedIdes = options.ides ?? [];
|
|
50
|
+
if (!Array.isArray(resolvedIdes)) {
|
|
51
|
+
throw new TypeError('ManifestGenerator expected `options.ides` to be an array.');
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Filter out any undefined/null values from IDE list
|
|
55
|
+
this.selectedIdes = resolvedIdes.filter((ide) => ide && typeof ide === 'string');
|
|
30
56
|
|
|
31
57
|
// Collect workflow data
|
|
32
58
|
await this.collectWorkflows(selectedModules);
|
|
@@ -37,37 +63,44 @@ class ManifestGenerator {
|
|
|
37
63
|
// Collect task data
|
|
38
64
|
await this.collectTasks(selectedModules);
|
|
39
65
|
|
|
40
|
-
//
|
|
41
|
-
await this.
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
66
|
+
// Collect tool data
|
|
67
|
+
await this.collectTools(selectedModules);
|
|
68
|
+
|
|
69
|
+
// Write manifest files and collect their paths
|
|
70
|
+
const manifestFiles = [
|
|
71
|
+
await this.writeMainManifest(cfgDir),
|
|
72
|
+
await this.writeWorkflowManifest(cfgDir),
|
|
73
|
+
await this.writeAgentManifest(cfgDir),
|
|
74
|
+
await this.writeTaskManifest(cfgDir),
|
|
75
|
+
await this.writeToolManifest(cfgDir),
|
|
76
|
+
await this.writeFilesManifest(cfgDir),
|
|
77
|
+
];
|
|
46
78
|
|
|
47
79
|
return {
|
|
48
80
|
workflows: this.workflows.length,
|
|
49
81
|
agents: this.agents.length,
|
|
50
82
|
tasks: this.tasks.length,
|
|
83
|
+
tools: this.tools.length,
|
|
51
84
|
files: this.files.length,
|
|
85
|
+
manifestFiles: manifestFiles,
|
|
52
86
|
};
|
|
53
87
|
}
|
|
54
88
|
|
|
55
89
|
/**
|
|
56
90
|
* Collect all workflows from core and selected modules
|
|
91
|
+
* Scans the INSTALLED bmad directory, not the source
|
|
57
92
|
*/
|
|
58
93
|
async collectWorkflows(selectedModules) {
|
|
59
94
|
this.workflows = [];
|
|
60
95
|
|
|
61
|
-
//
|
|
62
|
-
const
|
|
63
|
-
|
|
64
|
-
this.workflows.push(...coreWorkflows);
|
|
96
|
+
// Use updatedModules which already includes deduplicated 'core' + selectedModules
|
|
97
|
+
for (const moduleName of this.updatedModules) {
|
|
98
|
+
const modulePath = path.join(this.bmadDir, moduleName);
|
|
65
99
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
this.workflows.push(...moduleWorkflows);
|
|
100
|
+
if (await fs.pathExists(modulePath)) {
|
|
101
|
+
const moduleWorkflows = await this.getWorkflowsFromPath(modulePath, moduleName);
|
|
102
|
+
this.workflows.push(...moduleWorkflows);
|
|
103
|
+
}
|
|
71
104
|
}
|
|
72
105
|
}
|
|
73
106
|
|
|
@@ -108,14 +141,18 @@ class ManifestGenerator {
|
|
|
108
141
|
// Build relative path for installation
|
|
109
142
|
const installPath =
|
|
110
143
|
moduleName === 'core'
|
|
111
|
-
?
|
|
112
|
-
:
|
|
144
|
+
? `${this.bmadFolderName}/core/workflows/${relativePath}/workflow.yaml`
|
|
145
|
+
: `${this.bmadFolderName}/${moduleName}/workflows/${relativePath}/workflow.yaml`;
|
|
146
|
+
|
|
147
|
+
// Check for standalone property (default: false)
|
|
148
|
+
const standalone = workflow.standalone === true;
|
|
113
149
|
|
|
114
150
|
workflows.push({
|
|
115
151
|
name: workflow.name,
|
|
116
152
|
description: workflow.description.replaceAll('"', '""'), // Escape quotes for CSV
|
|
117
153
|
module: moduleName,
|
|
118
154
|
path: installPath,
|
|
155
|
+
standalone: standalone,
|
|
119
156
|
});
|
|
120
157
|
|
|
121
158
|
// Add to files list
|
|
@@ -139,59 +176,95 @@ class ManifestGenerator {
|
|
|
139
176
|
|
|
140
177
|
/**
|
|
141
178
|
* Collect all agents from core and selected modules
|
|
179
|
+
* Scans the INSTALLED bmad directory, not the source
|
|
142
180
|
*/
|
|
143
181
|
async collectAgents(selectedModules) {
|
|
144
182
|
this.agents = [];
|
|
145
183
|
|
|
146
|
-
//
|
|
147
|
-
const
|
|
148
|
-
|
|
149
|
-
if (await fs.pathExists(coreAgentsPath)) {
|
|
150
|
-
const coreAgents = await this.getAgentsFromDir(coreAgentsPath, 'core');
|
|
151
|
-
this.agents.push(...coreAgents);
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
// Get module agents
|
|
155
|
-
for (const moduleName of selectedModules) {
|
|
156
|
-
const modulePath = getSourcePath(`modules/${moduleName}`);
|
|
157
|
-
const agentsPath = path.join(modulePath, 'agents');
|
|
184
|
+
// Use updatedModules which already includes deduplicated 'core' + selectedModules
|
|
185
|
+
for (const moduleName of this.updatedModules) {
|
|
186
|
+
const agentsPath = path.join(this.bmadDir, moduleName, 'agents');
|
|
158
187
|
|
|
159
188
|
if (await fs.pathExists(agentsPath)) {
|
|
160
189
|
const moduleAgents = await this.getAgentsFromDir(agentsPath, moduleName);
|
|
161
190
|
this.agents.push(...moduleAgents);
|
|
162
191
|
}
|
|
163
192
|
}
|
|
193
|
+
|
|
194
|
+
// Get standalone agents from bmad/agents/ directory
|
|
195
|
+
const standaloneAgentsDir = path.join(this.bmadDir, 'agents');
|
|
196
|
+
if (await fs.pathExists(standaloneAgentsDir)) {
|
|
197
|
+
const agentDirs = await fs.readdir(standaloneAgentsDir, { withFileTypes: true });
|
|
198
|
+
|
|
199
|
+
for (const agentDir of agentDirs) {
|
|
200
|
+
if (!agentDir.isDirectory()) continue;
|
|
201
|
+
|
|
202
|
+
const agentDirPath = path.join(standaloneAgentsDir, agentDir.name);
|
|
203
|
+
const standaloneAgents = await this.getAgentsFromDir(agentDirPath, 'standalone');
|
|
204
|
+
this.agents.push(...standaloneAgents);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
164
207
|
}
|
|
165
208
|
|
|
166
209
|
/**
|
|
167
210
|
* Get agents from a directory
|
|
211
|
+
* Only includes compiled .md files (not .agent.yaml source files)
|
|
168
212
|
*/
|
|
169
213
|
async getAgentsFromDir(dirPath, moduleName) {
|
|
170
214
|
const agents = [];
|
|
171
215
|
const files = await fs.readdir(dirPath);
|
|
172
216
|
|
|
173
217
|
for (const file of files) {
|
|
174
|
-
|
|
218
|
+
// Only include .md files, skip .agent.yaml source files and README.md
|
|
219
|
+
if (file.endsWith('.md') && !file.endsWith('.agent.yaml') && file.toLowerCase() !== 'readme.md') {
|
|
175
220
|
const filePath = path.join(dirPath, file);
|
|
176
221
|
const content = await fs.readFile(filePath, 'utf8');
|
|
177
222
|
|
|
223
|
+
// Skip files that don't contain <agent> tag (e.g., README files)
|
|
224
|
+
if (!content.includes('<agent')) {
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
|
|
178
228
|
// Skip web-only agents
|
|
179
229
|
if (content.includes('localskip="true"')) {
|
|
180
230
|
continue;
|
|
181
231
|
}
|
|
182
232
|
|
|
183
|
-
// Extract agent metadata from
|
|
233
|
+
// Extract agent metadata from the XML structure
|
|
184
234
|
const nameMatch = content.match(/name="([^"]+)"/);
|
|
185
|
-
const
|
|
235
|
+
const titleMatch = content.match(/title="([^"]+)"/);
|
|
236
|
+
const iconMatch = content.match(/icon="([^"]+)"/);
|
|
237
|
+
|
|
238
|
+
// Extract persona fields
|
|
239
|
+
const roleMatch = content.match(/<role>([^<]+)<\/role>/);
|
|
240
|
+
const identityMatch = content.match(/<identity>([\s\S]*?)<\/identity>/);
|
|
241
|
+
const styleMatch = content.match(/<communication_style>([\s\S]*?)<\/communication_style>/);
|
|
242
|
+
const principlesMatch = content.match(/<principles>([\s\S]*?)<\/principles>/);
|
|
186
243
|
|
|
187
244
|
// Build relative path for installation
|
|
188
|
-
const installPath =
|
|
245
|
+
const installPath =
|
|
246
|
+
moduleName === 'core' ? `${this.bmadFolderName}/core/agents/${file}` : `${this.bmadFolderName}/${moduleName}/agents/${file}`;
|
|
189
247
|
|
|
190
248
|
const agentName = file.replace('.md', '');
|
|
249
|
+
|
|
250
|
+
// Helper function to clean and escape CSV content
|
|
251
|
+
const cleanForCSV = (text) => {
|
|
252
|
+
if (!text) return '';
|
|
253
|
+
return text
|
|
254
|
+
.trim()
|
|
255
|
+
.replaceAll(/\s+/g, ' ') // Normalize whitespace
|
|
256
|
+
.replaceAll('"', '""'); // Escape quotes for CSV
|
|
257
|
+
};
|
|
258
|
+
|
|
191
259
|
agents.push({
|
|
192
260
|
name: agentName,
|
|
193
261
|
displayName: nameMatch ? nameMatch[1] : agentName,
|
|
194
|
-
|
|
262
|
+
title: titleMatch ? titleMatch[1] : '',
|
|
263
|
+
icon: iconMatch ? iconMatch[1] : '',
|
|
264
|
+
role: roleMatch ? cleanForCSV(roleMatch[1]) : '',
|
|
265
|
+
identity: identityMatch ? cleanForCSV(identityMatch[1]) : '',
|
|
266
|
+
communicationStyle: styleMatch ? cleanForCSV(styleMatch[1]) : '',
|
|
267
|
+
principles: principlesMatch ? cleanForCSV(principlesMatch[1]) : '',
|
|
195
268
|
module: moduleName,
|
|
196
269
|
path: installPath,
|
|
197
270
|
});
|
|
@@ -211,22 +284,14 @@ class ManifestGenerator {
|
|
|
211
284
|
|
|
212
285
|
/**
|
|
213
286
|
* Collect all tasks from core and selected modules
|
|
287
|
+
* Scans the INSTALLED bmad directory, not the source
|
|
214
288
|
*/
|
|
215
289
|
async collectTasks(selectedModules) {
|
|
216
290
|
this.tasks = [];
|
|
217
291
|
|
|
218
|
-
//
|
|
219
|
-
const
|
|
220
|
-
|
|
221
|
-
if (await fs.pathExists(coreTasksPath)) {
|
|
222
|
-
const coreTasks = await this.getTasksFromDir(coreTasksPath, 'core');
|
|
223
|
-
this.tasks.push(...coreTasks);
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
// Get module tasks
|
|
227
|
-
for (const moduleName of selectedModules) {
|
|
228
|
-
const modulePath = getSourcePath(`modules/${moduleName}`);
|
|
229
|
-
const tasksPath = path.join(modulePath, 'tasks');
|
|
292
|
+
// Use updatedModules which already includes deduplicated 'core' + selectedModules
|
|
293
|
+
for (const moduleName of this.updatedModules) {
|
|
294
|
+
const tasksPath = path.join(this.bmadDir, moduleName, 'tasks');
|
|
230
295
|
|
|
231
296
|
if (await fs.pathExists(tasksPath)) {
|
|
232
297
|
const moduleTasks = await this.getTasksFromDir(tasksPath, moduleName);
|
|
@@ -243,24 +308,35 @@ class ManifestGenerator {
|
|
|
243
308
|
const files = await fs.readdir(dirPath);
|
|
244
309
|
|
|
245
310
|
for (const file of files) {
|
|
246
|
-
|
|
311
|
+
// Check for both .xml and .md files
|
|
312
|
+
if (file.endsWith('.xml') || file.endsWith('.md')) {
|
|
247
313
|
const filePath = path.join(dirPath, file);
|
|
248
314
|
const content = await fs.readFile(filePath, 'utf8');
|
|
249
315
|
|
|
250
316
|
// Extract task metadata from content if possible
|
|
251
317
|
const nameMatch = content.match(/name="([^"]+)"/);
|
|
318
|
+
|
|
319
|
+
// Try description attribute first, fall back to <objective> element
|
|
320
|
+
const descMatch = content.match(/description="([^"]+)"/);
|
|
252
321
|
const objMatch = content.match(/<objective>([^<]+)<\/objective>/);
|
|
322
|
+
const description = descMatch ? descMatch[1] : objMatch ? objMatch[1].trim() : '';
|
|
323
|
+
|
|
324
|
+
// Check for standalone attribute in <task> tag (default: false)
|
|
325
|
+
const standaloneMatch = content.match(/<task[^>]+standalone="true"/);
|
|
326
|
+
const standalone = !!standaloneMatch;
|
|
253
327
|
|
|
254
328
|
// Build relative path for installation
|
|
255
|
-
const installPath =
|
|
329
|
+
const installPath =
|
|
330
|
+
moduleName === 'core' ? `${this.bmadFolderName}/core/tasks/${file}` : `${this.bmadFolderName}/${moduleName}/tasks/${file}`;
|
|
256
331
|
|
|
257
|
-
const taskName = file.replace(
|
|
332
|
+
const taskName = file.replace(/\.(xml|md)$/, '');
|
|
258
333
|
tasks.push({
|
|
259
334
|
name: taskName,
|
|
260
335
|
displayName: nameMatch ? nameMatch[1] : taskName,
|
|
261
|
-
description:
|
|
336
|
+
description: description.replaceAll('"', '""'),
|
|
262
337
|
module: moduleName,
|
|
263
338
|
path: installPath,
|
|
339
|
+
standalone: standalone,
|
|
264
340
|
});
|
|
265
341
|
|
|
266
342
|
// Add to files list
|
|
@@ -276,24 +352,91 @@ class ManifestGenerator {
|
|
|
276
352
|
return tasks;
|
|
277
353
|
}
|
|
278
354
|
|
|
355
|
+
/**
|
|
356
|
+
* Collect all tools from core and selected modules
|
|
357
|
+
* Scans the INSTALLED bmad directory, not the source
|
|
358
|
+
*/
|
|
359
|
+
async collectTools(selectedModules) {
|
|
360
|
+
this.tools = [];
|
|
361
|
+
|
|
362
|
+
// Use updatedModules which already includes deduplicated 'core' + selectedModules
|
|
363
|
+
for (const moduleName of this.updatedModules) {
|
|
364
|
+
const toolsPath = path.join(this.bmadDir, moduleName, 'tools');
|
|
365
|
+
|
|
366
|
+
if (await fs.pathExists(toolsPath)) {
|
|
367
|
+
const moduleTools = await this.getToolsFromDir(toolsPath, moduleName);
|
|
368
|
+
this.tools.push(...moduleTools);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
/**
|
|
374
|
+
* Get tools from a directory
|
|
375
|
+
*/
|
|
376
|
+
async getToolsFromDir(dirPath, moduleName) {
|
|
377
|
+
const tools = [];
|
|
378
|
+
const files = await fs.readdir(dirPath);
|
|
379
|
+
|
|
380
|
+
for (const file of files) {
|
|
381
|
+
// Check for both .xml and .md files
|
|
382
|
+
if (file.endsWith('.xml') || file.endsWith('.md')) {
|
|
383
|
+
const filePath = path.join(dirPath, file);
|
|
384
|
+
const content = await fs.readFile(filePath, 'utf8');
|
|
385
|
+
|
|
386
|
+
// Extract tool metadata from content if possible
|
|
387
|
+
const nameMatch = content.match(/name="([^"]+)"/);
|
|
388
|
+
|
|
389
|
+
// Try description attribute first, fall back to <objective> element
|
|
390
|
+
const descMatch = content.match(/description="([^"]+)"/);
|
|
391
|
+
const objMatch = content.match(/<objective>([^<]+)<\/objective>/);
|
|
392
|
+
const description = descMatch ? descMatch[1] : objMatch ? objMatch[1].trim() : '';
|
|
393
|
+
|
|
394
|
+
// Check for standalone attribute in <tool> tag (default: false)
|
|
395
|
+
const standaloneMatch = content.match(/<tool[^>]+standalone="true"/);
|
|
396
|
+
const standalone = !!standaloneMatch;
|
|
397
|
+
|
|
398
|
+
// Build relative path for installation
|
|
399
|
+
const installPath =
|
|
400
|
+
moduleName === 'core' ? `${this.bmadFolderName}/core/tools/${file}` : `${this.bmadFolderName}/${moduleName}/tools/${file}`;
|
|
401
|
+
|
|
402
|
+
const toolName = file.replace(/\.(xml|md)$/, '');
|
|
403
|
+
tools.push({
|
|
404
|
+
name: toolName,
|
|
405
|
+
displayName: nameMatch ? nameMatch[1] : toolName,
|
|
406
|
+
description: description.replaceAll('"', '""'),
|
|
407
|
+
module: moduleName,
|
|
408
|
+
path: installPath,
|
|
409
|
+
standalone: standalone,
|
|
410
|
+
});
|
|
411
|
+
|
|
412
|
+
// Add to files list
|
|
413
|
+
this.files.push({
|
|
414
|
+
type: 'tool',
|
|
415
|
+
name: toolName,
|
|
416
|
+
module: moduleName,
|
|
417
|
+
path: installPath,
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
return tools;
|
|
423
|
+
}
|
|
424
|
+
|
|
279
425
|
/**
|
|
280
426
|
* Write main manifest as YAML with installation info only
|
|
427
|
+
* @returns {string} Path to the manifest file
|
|
281
428
|
*/
|
|
282
429
|
async writeMainManifest(cfgDir) {
|
|
283
430
|
const manifestPath = path.join(cfgDir, 'manifest.yaml');
|
|
284
431
|
|
|
285
432
|
const manifest = {
|
|
286
433
|
installation: {
|
|
287
|
-
version:
|
|
434
|
+
version: packageJson.version,
|
|
288
435
|
installDate: new Date().toISOString(),
|
|
289
436
|
lastUpdated: new Date().toISOString(),
|
|
290
437
|
},
|
|
291
|
-
modules: this.modules
|
|
292
|
-
|
|
293
|
-
version: '',
|
|
294
|
-
shortTitle: '',
|
|
295
|
-
})),
|
|
296
|
-
ides: ['claude-code'],
|
|
438
|
+
modules: this.modules,
|
|
439
|
+
ides: this.selectedIdes,
|
|
297
440
|
};
|
|
298
441
|
|
|
299
442
|
const yamlStr = yaml.dump(manifest, {
|
|
@@ -303,82 +446,246 @@ class ManifestGenerator {
|
|
|
303
446
|
sortKeys: false,
|
|
304
447
|
});
|
|
305
448
|
|
|
306
|
-
|
|
449
|
+
// Ensure POSIX-compliant final newline
|
|
450
|
+
const content = yamlStr.endsWith('\n') ? yamlStr : yamlStr + '\n';
|
|
451
|
+
await fs.writeFile(manifestPath, content);
|
|
452
|
+
return manifestPath;
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
/**
|
|
456
|
+
* Read existing CSV and preserve rows for modules NOT being updated
|
|
457
|
+
* @param {string} csvPath - Path to existing CSV file
|
|
458
|
+
* @param {number} moduleColumnIndex - Which column contains the module name (0-indexed)
|
|
459
|
+
* @param {Array<string>} expectedColumns - Expected column names in order
|
|
460
|
+
* @param {Object} defaultValues - Default values for missing columns
|
|
461
|
+
* @returns {Array} Preserved CSV rows (without header), upgraded to match expected columns
|
|
462
|
+
*/
|
|
463
|
+
async getPreservedCsvRows(csvPath, moduleColumnIndex, expectedColumns, defaultValues = {}) {
|
|
464
|
+
if (!(await fs.pathExists(csvPath)) || this.preservedModules.length === 0) {
|
|
465
|
+
return [];
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
try {
|
|
469
|
+
const content = await fs.readFile(csvPath, 'utf8');
|
|
470
|
+
const lines = content.trim().split('\n');
|
|
471
|
+
|
|
472
|
+
if (lines.length < 2) {
|
|
473
|
+
return []; // No data rows
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
// Parse header to understand old schema
|
|
477
|
+
const header = lines[0];
|
|
478
|
+
const headerColumns = header.match(/(".*?"|[^",\s]+)(?=\s*,|\s*$)/g) || [];
|
|
479
|
+
const oldColumns = headerColumns.map((c) => c.replaceAll(/^"|"$/g, ''));
|
|
480
|
+
|
|
481
|
+
// Skip header row for data
|
|
482
|
+
const dataRows = lines.slice(1);
|
|
483
|
+
const preservedRows = [];
|
|
484
|
+
|
|
485
|
+
for (const row of dataRows) {
|
|
486
|
+
// Simple CSV parsing (handles quoted values)
|
|
487
|
+
const columns = row.match(/(".*?"|[^",\s]+)(?=\s*,|\s*$)/g) || [];
|
|
488
|
+
const cleanColumns = columns.map((c) => c.replaceAll(/^"|"$/g, ''));
|
|
489
|
+
|
|
490
|
+
const moduleValue = cleanColumns[moduleColumnIndex];
|
|
491
|
+
|
|
492
|
+
// Keep this row if it belongs to a preserved module
|
|
493
|
+
if (this.preservedModules.includes(moduleValue)) {
|
|
494
|
+
// Upgrade row to match expected schema
|
|
495
|
+
const upgradedRow = this.upgradeRowToSchema(cleanColumns, oldColumns, expectedColumns, defaultValues);
|
|
496
|
+
preservedRows.push(upgradedRow);
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
return preservedRows;
|
|
501
|
+
} catch (error) {
|
|
502
|
+
console.warn(`Warning: Failed to read existing CSV ${csvPath}:`, error.message);
|
|
503
|
+
return [];
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
/**
|
|
508
|
+
* Upgrade a CSV row from old schema to new schema
|
|
509
|
+
* @param {Array<string>} rowValues - Values from old row
|
|
510
|
+
* @param {Array<string>} oldColumns - Old column names
|
|
511
|
+
* @param {Array<string>} newColumns - New column names
|
|
512
|
+
* @param {Object} defaultValues - Default values for missing columns
|
|
513
|
+
* @returns {string} Upgraded CSV row
|
|
514
|
+
*/
|
|
515
|
+
upgradeRowToSchema(rowValues, oldColumns, newColumns, defaultValues) {
|
|
516
|
+
const upgradedValues = [];
|
|
517
|
+
|
|
518
|
+
for (const newCol of newColumns) {
|
|
519
|
+
const oldIndex = oldColumns.indexOf(newCol);
|
|
520
|
+
|
|
521
|
+
if (oldIndex !== -1 && oldIndex < rowValues.length) {
|
|
522
|
+
// Column exists in old schema, use its value
|
|
523
|
+
upgradedValues.push(rowValues[oldIndex]);
|
|
524
|
+
} else if (defaultValues[newCol] === undefined) {
|
|
525
|
+
// Column missing, no default provided
|
|
526
|
+
upgradedValues.push('');
|
|
527
|
+
} else {
|
|
528
|
+
// Column missing, use default value
|
|
529
|
+
upgradedValues.push(defaultValues[newCol]);
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
// Properly quote values and join
|
|
534
|
+
return upgradedValues.map((v) => `"${v}"`).join(',');
|
|
307
535
|
}
|
|
308
536
|
|
|
309
537
|
/**
|
|
310
538
|
* Write workflow manifest CSV
|
|
539
|
+
* @returns {string} Path to the manifest file
|
|
311
540
|
*/
|
|
312
541
|
async writeWorkflowManifest(cfgDir) {
|
|
313
542
|
const csvPath = path.join(cfgDir, 'workflow-manifest.csv');
|
|
314
543
|
|
|
315
|
-
// Create CSV header
|
|
316
|
-
let csv = 'name,description,module,path\n';
|
|
544
|
+
// Create CSV header with standalone column
|
|
545
|
+
let csv = 'name,description,module,path,standalone\n';
|
|
317
546
|
|
|
318
|
-
// Add
|
|
547
|
+
// Add all workflows
|
|
319
548
|
for (const workflow of this.workflows) {
|
|
320
|
-
csv += `"${workflow.name}","${workflow.description}","${workflow.module}","${workflow.path}"\n`;
|
|
549
|
+
csv += `"${workflow.name}","${workflow.description}","${workflow.module}","${workflow.path}","${workflow.standalone}"\n`;
|
|
321
550
|
}
|
|
322
551
|
|
|
323
552
|
await fs.writeFile(csvPath, csv);
|
|
553
|
+
return csvPath;
|
|
324
554
|
}
|
|
325
555
|
|
|
326
556
|
/**
|
|
327
557
|
* Write agent manifest CSV
|
|
558
|
+
* @returns {string} Path to the manifest file
|
|
328
559
|
*/
|
|
329
560
|
async writeAgentManifest(cfgDir) {
|
|
330
561
|
const csvPath = path.join(cfgDir, 'agent-manifest.csv');
|
|
331
562
|
|
|
332
|
-
// Create CSV header
|
|
333
|
-
let csv = 'name,displayName,
|
|
563
|
+
// Create CSV header with persona fields
|
|
564
|
+
let csv = 'name,displayName,title,icon,role,identity,communicationStyle,principles,module,path\n';
|
|
334
565
|
|
|
335
|
-
// Add
|
|
566
|
+
// Add all agents
|
|
336
567
|
for (const agent of this.agents) {
|
|
337
|
-
csv += `"${agent.name}","${agent.displayName}","${agent.
|
|
568
|
+
csv += `"${agent.name}","${agent.displayName}","${agent.title}","${agent.icon}","${agent.role}","${agent.identity}","${agent.communicationStyle}","${agent.principles}","${agent.module}","${agent.path}"\n`;
|
|
338
569
|
}
|
|
339
570
|
|
|
340
571
|
await fs.writeFile(csvPath, csv);
|
|
572
|
+
return csvPath;
|
|
341
573
|
}
|
|
342
574
|
|
|
343
575
|
/**
|
|
344
576
|
* Write task manifest CSV
|
|
577
|
+
* @returns {string} Path to the manifest file
|
|
345
578
|
*/
|
|
346
579
|
async writeTaskManifest(cfgDir) {
|
|
347
580
|
const csvPath = path.join(cfgDir, 'task-manifest.csv');
|
|
348
581
|
|
|
349
|
-
// Create CSV header
|
|
350
|
-
let csv = 'name,displayName,description,module,path\n';
|
|
582
|
+
// Create CSV header with standalone column
|
|
583
|
+
let csv = 'name,displayName,description,module,path,standalone\n';
|
|
351
584
|
|
|
352
|
-
// Add
|
|
585
|
+
// Add all tasks
|
|
353
586
|
for (const task of this.tasks) {
|
|
354
|
-
csv += `"${task.name}","${task.displayName}","${task.description}","${task.module}","${task.path}"\n`;
|
|
587
|
+
csv += `"${task.name}","${task.displayName}","${task.description}","${task.module}","${task.path}","${task.standalone}"\n`;
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
await fs.writeFile(csvPath, csv);
|
|
591
|
+
return csvPath;
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
/**
|
|
595
|
+
* Write tool manifest CSV
|
|
596
|
+
* @returns {string} Path to the manifest file
|
|
597
|
+
*/
|
|
598
|
+
async writeToolManifest(cfgDir) {
|
|
599
|
+
const csvPath = path.join(cfgDir, 'tool-manifest.csv');
|
|
600
|
+
|
|
601
|
+
// Create CSV header with standalone column
|
|
602
|
+
let csv = 'name,displayName,description,module,path,standalone\n';
|
|
603
|
+
|
|
604
|
+
// Add all tools
|
|
605
|
+
for (const tool of this.tools) {
|
|
606
|
+
csv += `"${tool.name}","${tool.displayName}","${tool.description}","${tool.module}","${tool.path}","${tool.standalone}"\n`;
|
|
355
607
|
}
|
|
356
608
|
|
|
357
609
|
await fs.writeFile(csvPath, csv);
|
|
610
|
+
return csvPath;
|
|
358
611
|
}
|
|
359
612
|
|
|
360
613
|
/**
|
|
361
614
|
* Write files manifest CSV
|
|
362
615
|
*/
|
|
616
|
+
/**
|
|
617
|
+
* Calculate SHA256 hash of a file
|
|
618
|
+
* @param {string} filePath - Path to file
|
|
619
|
+
* @returns {string} SHA256 hash
|
|
620
|
+
*/
|
|
621
|
+
async calculateFileHash(filePath) {
|
|
622
|
+
try {
|
|
623
|
+
const content = await fs.readFile(filePath);
|
|
624
|
+
return crypto.createHash('sha256').update(content).digest('hex');
|
|
625
|
+
} catch {
|
|
626
|
+
return '';
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
/**
|
|
631
|
+
* @returns {string} Path to the manifest file
|
|
632
|
+
*/
|
|
363
633
|
async writeFilesManifest(cfgDir) {
|
|
364
634
|
const csvPath = path.join(cfgDir, 'files-manifest.csv');
|
|
365
635
|
|
|
366
|
-
// Create CSV header
|
|
367
|
-
let csv = 'type,name,module,path\n';
|
|
636
|
+
// Create CSV header with hash column
|
|
637
|
+
let csv = 'type,name,module,path,hash\n';
|
|
638
|
+
|
|
639
|
+
// If we have ALL installed files, use those instead of just workflows/agents/tasks
|
|
640
|
+
const allFiles = [];
|
|
641
|
+
if (this.allInstalledFiles && this.allInstalledFiles.length > 0) {
|
|
642
|
+
// Process all installed files
|
|
643
|
+
for (const filePath of this.allInstalledFiles) {
|
|
644
|
+
const relativePath = 'bmad' + filePath.replace(this.bmadDir, '').replaceAll('\\', '/');
|
|
645
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
646
|
+
const fileName = path.basename(filePath, ext);
|
|
647
|
+
|
|
648
|
+
// Determine module from path
|
|
649
|
+
const pathParts = relativePath.split('/');
|
|
650
|
+
const module = pathParts.length > 1 ? pathParts[1] : 'unknown';
|
|
651
|
+
|
|
652
|
+
// Calculate hash
|
|
653
|
+
const hash = await this.calculateFileHash(filePath);
|
|
654
|
+
|
|
655
|
+
allFiles.push({
|
|
656
|
+
type: ext.slice(1) || 'file',
|
|
657
|
+
name: fileName,
|
|
658
|
+
module: module,
|
|
659
|
+
path: relativePath,
|
|
660
|
+
hash: hash,
|
|
661
|
+
});
|
|
662
|
+
}
|
|
663
|
+
} else {
|
|
664
|
+
// Fallback: use the collected workflows/agents/tasks
|
|
665
|
+
for (const file of this.files) {
|
|
666
|
+
const filePath = path.join(this.bmadDir, file.path.replace(this.bmadFolderName + '/', ''));
|
|
667
|
+
const hash = await this.calculateFileHash(filePath);
|
|
668
|
+
allFiles.push({
|
|
669
|
+
...file,
|
|
670
|
+
hash: hash,
|
|
671
|
+
});
|
|
672
|
+
}
|
|
673
|
+
}
|
|
368
674
|
|
|
369
|
-
// Sort files by
|
|
370
|
-
|
|
371
|
-
if (a.type !== b.type) return a.type.localeCompare(b.type);
|
|
675
|
+
// Sort files by module, then type, then name
|
|
676
|
+
allFiles.sort((a, b) => {
|
|
372
677
|
if (a.module !== b.module) return a.module.localeCompare(b.module);
|
|
678
|
+
if (a.type !== b.type) return a.type.localeCompare(b.type);
|
|
373
679
|
return a.name.localeCompare(b.name);
|
|
374
680
|
});
|
|
375
681
|
|
|
376
|
-
// Add
|
|
377
|
-
for (const file of
|
|
378
|
-
csv += `"${file.type}","${file.name}","${file.module}","${file.path}"\n`;
|
|
682
|
+
// Add all files
|
|
683
|
+
for (const file of allFiles) {
|
|
684
|
+
csv += `"${file.type}","${file.name}","${file.module}","${file.path}","${file.hash}"\n`;
|
|
379
685
|
}
|
|
380
686
|
|
|
381
687
|
await fs.writeFile(csvPath, csv);
|
|
688
|
+
return csvPath;
|
|
382
689
|
}
|
|
383
690
|
}
|
|
384
691
|
|