bmad-method 5.1.2 → 6.0.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/FUNDING.yaml +2 -2
- package/.github/ISSUE_TEMPLATE/config.yaml +1 -0
- package/.github/ISSUE_TEMPLATE/idea_submission.md +109 -0
- package/.github/workflows/discord.yaml +1 -10
- package/.github/workflows/format-check.yaml +3 -2
- package/.github/workflows/manual-release.yaml +2 -2
- package/.nvmrc +1 -0
- package/.vscode/settings.json +34 -9
- package/CHANGELOG.md +211 -577
- package/CONTRIBUTING.md +130 -60
- package/LICENSE +6 -1
- package/docs/codebase-flattener.md +19 -0
- package/docs/ide-info/auggie.md +31 -0
- package/docs/ide-info/claude-code.md +25 -0
- package/docs/ide-info/cline.md +31 -0
- package/docs/ide-info/codex.md +32 -0
- package/docs/ide-info/crush.md +30 -0
- package/docs/ide-info/cursor.md +25 -0
- package/docs/ide-info/gemini.md +25 -0
- package/docs/ide-info/github-copilot.md +26 -0
- package/docs/ide-info/iflow.md +33 -0
- package/docs/ide-info/kilo.md +24 -0
- package/docs/ide-info/qwen.md +25 -0
- package/docs/ide-info/roo.md +27 -0
- package/docs/ide-info/trae.md +25 -0
- package/docs/ide-info/windsurf.md +22 -0
- package/docs/installers-bundlers/ide-injections.md +196 -0
- package/docs/installers-bundlers/installers-modules-platforms-reference.md +355 -0
- package/docs/installers-bundlers/web-bundler-usage.md +54 -0
- package/eslint.config.mjs +17 -7
- package/package.json +26 -35
- package/prettier.config.mjs +1 -1
- package/readme.md +216 -0
- package/src/core/_module-installer/install-menu-config.yaml +24 -0
- package/src/core/_module-installer/installer.js +68 -0
- package/src/core/agents/bmad-master.md +27 -0
- package/src/core/agents/bmad-web-orchestrator.md +71 -0
- package/src/core/tasks/adv-elicit-methods.csv +39 -0
- package/src/core/tasks/adv-elicit.md +109 -0
- package/src/core/tasks/index-docs.md +69 -0
- package/src/core/tasks/shard-doc.md +57 -0
- package/src/core/tasks/validate-workflow.md +92 -0
- package/src/core/tasks/workflow.md +141 -0
- package/src/core/workflows/bmad-init/instructions.md +79 -0
- package/src/core/workflows/bmad-init/workflow.yaml +24 -0
- package/src/core/workflows/party-mode/instructions.md +181 -0
- package/src/core/workflows/party-mode/workflow.yaml +24 -0
- package/src/modules/bmb/_module-installer/install-menu-config.yaml +16 -0
- package/src/modules/bmb/agents/bmad-builder.md +30 -0
- package/src/modules/bmb/workflows/convert-legacy/README.md +262 -0
- package/src/modules/bmb/workflows/convert-legacy/checklist.md +204 -0
- package/src/modules/bmb/workflows/convert-legacy/instructions.md +328 -0
- package/src/modules/bmb/workflows/convert-legacy/workflow.yaml +35 -0
- package/src/modules/bmb/workflows/create-agent/README.md +268 -0
- package/src/modules/bmb/workflows/create-agent/agent-architecture.md +412 -0
- package/src/modules/bmb/workflows/create-agent/agent-command-patterns.md +757 -0
- package/src/modules/bmb/workflows/create-agent/agent-types.md +177 -0
- package/src/modules/bmb/workflows/create-agent/brainstorm-context.md +174 -0
- package/src/modules/bmb/workflows/create-agent/checklist.md +134 -0
- package/src/modules/bmb/workflows/create-agent/communication-styles.md +240 -0
- package/src/modules/bmb/workflows/create-agent/instructions.md +340 -0
- package/src/modules/bmb/workflows/create-agent/workflow.yaml +39 -0
- package/src/modules/bmb/workflows/create-module/README.md +218 -0
- package/src/modules/bmb/workflows/create-module/brainstorm-context.md +137 -0
- package/src/modules/bmb/workflows/create-module/checklist.md +245 -0
- package/src/modules/bmb/workflows/create-module/installer-templates/install-module-config.yaml +132 -0
- package/src/modules/bmb/workflows/create-module/installer-templates/installer.js +231 -0
- package/src/modules/bmb/workflows/create-module/instructions.md +509 -0
- package/src/modules/bmb/workflows/create-module/module-structure.md +310 -0
- package/src/modules/bmb/workflows/create-module/workflow.yaml +47 -0
- package/src/modules/bmb/workflows/create-workflow/README.md +216 -0
- package/src/modules/bmb/workflows/create-workflow/brainstorm-context.md +197 -0
- package/src/modules/bmb/workflows/create-workflow/checklist.md +72 -0
- package/src/modules/bmb/workflows/create-workflow/instructions.md +267 -0
- package/src/modules/bmb/workflows/create-workflow/workflow-creation-guide.md +456 -0
- package/src/modules/bmb/workflows/create-workflow/workflow-template/checklist.md +24 -0
- package/src/modules/bmb/workflows/create-workflow/workflow-template/instructions.md +12 -0
- package/src/modules/bmb/workflows/create-workflow/workflow-template/template.md +9 -0
- package/src/modules/bmb/workflows/create-workflow/workflow-template/workflow.yaml +35 -0
- package/src/modules/bmb/workflows/create-workflow/workflow.yaml +42 -0
- package/src/modules/bmb/workflows/edit-workflow/README.md +63 -0
- package/src/modules/bmb/workflows/edit-workflow/checklist.md +70 -0
- package/src/modules/bmb/workflows/edit-workflow/instructions.md +170 -0
- package/src/modules/bmb/workflows/edit-workflow/workflow.yaml +34 -0
- package/src/modules/bmb/workflows/module-brief/README.md +264 -0
- package/src/modules/bmb/workflows/module-brief/checklist.md +116 -0
- package/src/modules/bmb/workflows/module-brief/instructions.md +265 -0
- package/src/modules/bmb/workflows/module-brief/template.md +275 -0
- package/src/modules/bmb/workflows/module-brief/workflow.yaml +30 -0
- package/src/modules/bmb/workflows/redoc/README.md +87 -0
- package/src/modules/bmb/workflows/redoc/checklist.md +99 -0
- package/src/modules/bmb/workflows/redoc/instructions.md +255 -0
- package/src/modules/bmb/workflows/redoc/workflow.yaml +33 -0
- package/src/modules/bmm/_module-installer/assets/bmm-kb.md +1 -0
- package/src/modules/bmm/_module-installer/assets/technical-decisions-template.md +30 -0
- package/src/modules/bmm/_module-installer/install-menu-config.yaml +49 -0
- package/src/modules/bmm/_module-installer/installer.js +131 -0
- package/src/modules/bmm/_module-installer/platform-specifics/claude-code.js +35 -0
- package/src/modules/bmm/_module-installer/platform-specifics/windsurf.js +32 -0
- package/src/modules/bmm/agents/analyst.md +26 -0
- package/src/modules/bmm/agents/architect.md +29 -0
- package/src/modules/bmm/agents/dev.md +61 -0
- package/src/modules/bmm/agents/game-architect.md +26 -0
- package/src/modules/bmm/agents/game-designer.md +27 -0
- package/src/modules/bmm/agents/game-dev.md +28 -0
- package/src/modules/bmm/agents/pm.md +26 -0
- package/src/modules/bmm/agents/po.md +25 -0
- package/src/modules/bmm/agents/sm.md +29 -0
- package/src/modules/bmm/agents/tea.md +32 -0
- package/src/modules/bmm/agents/ux-expert.md +24 -0
- package/src/modules/bmm/sub-modules/claude-code/config.yaml +5 -0
- package/src/modules/bmm/sub-modules/claude-code/injections.yaml +242 -0
- package/src/modules/bmm/sub-modules/claude-code/readme.md +87 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/api-documenter.md +85 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/codebase-analyzer.md +64 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/data-analyst.md +84 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/dependency-mapper.md +67 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/document-reviewer.md +85 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/epic-optimizer.md +66 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/market-researcher.md +34 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/pattern-detector.md +67 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/requirements-analyst.md +61 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/tech-debt-auditor.md +89 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/technical-decisions-curator.md +146 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/technical-evaluator.md +51 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/test-coverage-analyzer.md +91 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/trend-spotter.md +99 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/user-journey-mapper.md +101 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/user-researcher.md +56 -0
- package/src/modules/bmm/tasks/daily-standup.md +91 -0
- package/src/modules/bmm/tasks/retrospective.md +110 -0
- package/src/modules/bmm/teams/team-all.yaml +7 -0
- package/src/modules/bmm/teams/team-dev.yaml +14 -0
- package/src/modules/bmm/teams/team-gamedev.yaml +9 -0
- package/src/modules/bmm/testarch/atdd.md +40 -0
- package/src/modules/bmm/testarch/automate.md +38 -0
- package/src/modules/bmm/testarch/ci.md +39 -0
- package/src/modules/bmm/testarch/framework.md +41 -0
- package/src/modules/bmm/testarch/nfr-assess.md +38 -0
- package/src/modules/bmm/testarch/risk-profile.md +38 -0
- package/src/modules/bmm/testarch/tea-commands.csv +11 -0
- package/src/modules/bmm/testarch/tea-gate.md +38 -0
- package/src/modules/bmm/testarch/tea-knowledge.md +275 -0
- package/src/modules/bmm/testarch/test-design.md +39 -0
- package/{bmad-core/data → src/modules/bmm/testarch}/test-levels-framework.md +2 -0
- package/{bmad-core/data → src/modules/bmm/testarch}/test-priorities-matrix.md +2 -0
- package/src/modules/bmm/testarch/trace-requirements.md +38 -0
- package/src/modules/bmm/workflows/1-analysis/brainstorm-game/game-brain-methods.csv +26 -0
- package/src/modules/bmm/workflows/1-analysis/brainstorm-game/game-context.md +115 -0
- package/src/modules/bmm/workflows/1-analysis/brainstorm-game/instructions.md +47 -0
- package/src/modules/bmm/workflows/1-analysis/brainstorm-game/workflow.yaml +22 -0
- package/src/modules/bmm/workflows/1-analysis/brainstorm-project/instructions.md +38 -0
- package/src/modules/bmm/workflows/1-analysis/brainstorm-project/project-context.md +25 -0
- package/src/modules/bmm/workflows/1-analysis/brainstorm-project/workflow.yaml +21 -0
- package/src/modules/bmm/workflows/1-analysis/game-brief/README.md +221 -0
- package/src/modules/bmm/workflows/1-analysis/game-brief/checklist.md +128 -0
- package/src/modules/bmm/workflows/1-analysis/game-brief/instructions.md +517 -0
- package/src/modules/bmm/workflows/1-analysis/game-brief/template.md +205 -0
- package/src/modules/bmm/workflows/1-analysis/game-brief/workflow.yaml +34 -0
- package/src/modules/bmm/workflows/1-analysis/product-brief/README.md +180 -0
- package/src/modules/bmm/workflows/1-analysis/product-brief/checklist.md +115 -0
- package/src/modules/bmm/workflows/1-analysis/product-brief/instructions.md +353 -0
- package/src/modules/bmm/workflows/1-analysis/product-brief/template.md +165 -0
- package/src/modules/bmm/workflows/1-analysis/product-brief/workflow.yaml +33 -0
- package/src/modules/bmm/workflows/1-analysis/research/README.md +454 -0
- package/src/modules/bmm/workflows/1-analysis/research/checklist.md +202 -0
- package/src/modules/bmm/workflows/1-analysis/research/claude-code/injections.yaml +114 -0
- package/src/modules/bmm/workflows/1-analysis/research/claude-code/sub-agents/bmm-competitor-analyzer.md +259 -0
- package/src/modules/bmm/workflows/1-analysis/research/claude-code/sub-agents/bmm-data-analyst.md +190 -0
- package/src/modules/bmm/workflows/1-analysis/research/claude-code/sub-agents/bmm-market-researcher.md +337 -0
- package/src/modules/bmm/workflows/1-analysis/research/claude-code/sub-agents/bmm-trend-spotter.md +107 -0
- package/src/modules/bmm/workflows/1-analysis/research/claude-code/sub-agents/bmm-user-researcher.md +329 -0
- package/src/modules/bmm/workflows/1-analysis/research/instructions-deep-prompt.md +370 -0
- package/src/modules/bmm/workflows/1-analysis/research/instructions-market.md +553 -0
- package/src/modules/bmm/workflows/1-analysis/research/instructions-router.md +91 -0
- package/src/modules/bmm/workflows/1-analysis/research/instructions-technical.md +442 -0
- package/src/modules/bmm/workflows/1-analysis/research/template-deep-prompt.md +94 -0
- package/src/modules/bmm/workflows/1-analysis/research/template-market.md +311 -0
- package/src/modules/bmm/workflows/1-analysis/research/template-technical.md +210 -0
- package/src/modules/bmm/workflows/1-analysis/research/workflow.yaml +149 -0
- package/src/modules/bmm/workflows/2-plan/README.md +203 -0
- package/src/modules/bmm/workflows/2-plan/checklist.md +369 -0
- package/src/modules/bmm/workflows/2-plan/gdd/README.md +222 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/action-platformer.md +45 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/adventure.md +84 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/card-game.md +76 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/fighting.md +89 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/horror.md +86 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/idle-incremental.md +78 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/metroidvania.md +87 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/moba.md +74 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/party-game.md +79 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/puzzle.md +58 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/racing.md +88 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/rhythm.md +79 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/roguelike.md +69 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/rpg.md +70 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/sandbox.md +79 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/shooter.md +62 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/simulation.md +73 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/sports.md +75 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/strategy.md +71 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/survival.md +79 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/text-based.md +91 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/tower-defense.md +79 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/turn-based-tactics.md +88 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/visual-novel.md +89 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types.csv +25 -0
- package/src/modules/bmm/workflows/2-plan/gdd/gdd-template.md +159 -0
- package/src/modules/bmm/workflows/2-plan/gdd/instructions-gdd.md +480 -0
- package/src/modules/bmm/workflows/2-plan/instructions-router.md +222 -0
- package/src/modules/bmm/workflows/2-plan/narrative/instructions-narrative.md +517 -0
- package/src/modules/bmm/workflows/2-plan/narrative/narrative-template.md +195 -0
- package/src/modules/bmm/workflows/2-plan/prd/analysis-template.md +53 -0
- package/src/modules/bmm/workflows/2-plan/prd/epics-template.md +18 -0
- package/src/modules/bmm/workflows/2-plan/prd/instructions-lg.md +267 -0
- package/src/modules/bmm/workflows/2-plan/prd/instructions-med.md +251 -0
- package/src/modules/bmm/workflows/2-plan/prd/prd-template.md +73 -0
- package/src/modules/bmm/workflows/2-plan/tech-spec/instructions-sm.md +137 -0
- package/src/modules/bmm/workflows/2-plan/tech-spec/tech-spec-template.md +59 -0
- package/src/modules/bmm/workflows/2-plan/ux/instructions-ux.md +360 -0
- package/src/modules/bmm/workflows/2-plan/ux/ux-spec-template.md +162 -0
- package/src/modules/bmm/workflows/2-plan/workflow.yaml +60 -0
- package/src/modules/bmm/workflows/3-solutioning/ADR-template.md +74 -0
- package/src/modules/bmm/workflows/3-solutioning/README.md +565 -0
- package/src/modules/bmm/workflows/3-solutioning/checklist.md +170 -0
- package/src/modules/bmm/workflows/3-solutioning/instructions.md +661 -0
- package/src/modules/bmm/workflows/3-solutioning/project-types/backend-questions.md +490 -0
- package/src/modules/bmm/workflows/3-solutioning/project-types/cli-questions.md +337 -0
- package/src/modules/bmm/workflows/3-solutioning/project-types/data-questions.md +472 -0
- package/src/modules/bmm/workflows/3-solutioning/project-types/desktop-questions.md +299 -0
- package/src/modules/bmm/workflows/3-solutioning/project-types/embedded-questions.md +118 -0
- package/src/modules/bmm/workflows/3-solutioning/project-types/extension-questions.md +374 -0
- package/src/modules/bmm/workflows/3-solutioning/project-types/game-questions.md +133 -0
- package/src/modules/bmm/workflows/3-solutioning/project-types/infra-questions.md +484 -0
- package/src/modules/bmm/workflows/3-solutioning/project-types/library-questions.md +146 -0
- package/src/modules/bmm/workflows/3-solutioning/project-types/mobile-questions.md +110 -0
- package/src/modules/bmm/workflows/3-solutioning/project-types/project-types.csv +12 -0
- package/src/modules/bmm/workflows/3-solutioning/project-types/web-questions.md +136 -0
- package/src/modules/bmm/workflows/3-solutioning/tech-spec/README.md +195 -0
- package/src/modules/bmm/workflows/3-solutioning/tech-spec/checklist.md +17 -0
- package/src/modules/bmm/workflows/3-solutioning/tech-spec/instructions.md +73 -0
- package/src/modules/bmm/workflows/3-solutioning/tech-spec/template.md +76 -0
- package/src/modules/bmm/workflows/3-solutioning/tech-spec/workflow.yaml +51 -0
- package/src/modules/bmm/workflows/3-solutioning/templates/backend-service-architecture.md +66 -0
- package/src/modules/bmm/workflows/3-solutioning/templates/cli-tool-architecture.md +66 -0
- package/src/modules/bmm/workflows/3-solutioning/templates/data-pipeline-architecture.md +66 -0
- package/src/modules/bmm/workflows/3-solutioning/templates/desktop-app-architecture.md +66 -0
- package/src/modules/bmm/workflows/3-solutioning/templates/embedded-firmware-architecture.md +66 -0
- package/src/modules/bmm/workflows/3-solutioning/templates/game-engine-architecture.md +244 -0
- package/src/modules/bmm/workflows/3-solutioning/templates/game-engine-godot-guide.md +428 -0
- package/src/modules/bmm/workflows/3-solutioning/templates/game-engine-unity-guide.md +333 -0
- package/src/modules/bmm/workflows/3-solutioning/templates/game-engine-web-guide.md +528 -0
- package/src/modules/bmm/workflows/3-solutioning/templates/infrastructure-architecture.md +66 -0
- package/src/modules/bmm/workflows/3-solutioning/templates/library-package-architecture.md +66 -0
- package/src/modules/bmm/workflows/3-solutioning/templates/mobile-app-architecture.md +66 -0
- package/src/modules/bmm/workflows/3-solutioning/templates/registry.csv +172 -0
- package/src/modules/bmm/workflows/3-solutioning/templates/web-api-architecture.md +66 -0
- package/src/modules/bmm/workflows/3-solutioning/templates/web-fullstack-architecture.md +277 -0
- package/src/modules/bmm/workflows/3-solutioning/workflow.yaml +65 -0
- package/src/modules/bmm/workflows/4-implementation/correct-course/checklist.md +279 -0
- package/src/modules/bmm/workflows/4-implementation/correct-course/instructions.md +190 -0
- package/src/modules/bmm/workflows/4-implementation/correct-course/workflow.yaml +35 -0
- package/src/modules/bmm/workflows/4-implementation/create-story/README.md +42 -0
- package/src/modules/bmm/workflows/4-implementation/create-story/checklist.md +39 -0
- package/src/modules/bmm/workflows/4-implementation/create-story/instructions.md +81 -0
- package/src/modules/bmm/workflows/4-implementation/create-story/template.md +57 -0
- package/src/modules/bmm/workflows/4-implementation/create-story/workflow.yaml +72 -0
- package/src/modules/bmm/workflows/4-implementation/dev-story/README.md +84 -0
- package/src/modules/bmm/workflows/4-implementation/dev-story/checklist.md +38 -0
- package/src/modules/bmm/workflows/4-implementation/dev-story/instructions.md +87 -0
- package/src/modules/bmm/workflows/4-implementation/dev-story/workflow.yaml +53 -0
- package/src/modules/bmm/workflows/4-implementation/retrospective/instructions.md +391 -0
- package/src/modules/bmm/workflows/4-implementation/retrospective/workflow.yaml +41 -0
- package/src/modules/bmm/workflows/4-implementation/review-story/README.md +72 -0
- package/src/modules/bmm/workflows/4-implementation/review-story/backlog_template.md +12 -0
- package/src/modules/bmm/workflows/4-implementation/review-story/checklist.md +22 -0
- package/src/modules/bmm/workflows/4-implementation/review-story/instructions.md +176 -0
- package/src/modules/bmm/workflows/4-implementation/review-story/workflow.yaml +99 -0
- package/src/modules/bmm/workflows/4-implementation/story-context/README.md +234 -0
- package/src/modules/bmm/workflows/4-implementation/story-context/checklist.md +16 -0
- package/src/modules/bmm/workflows/4-implementation/story-context/context-template.xml +34 -0
- package/src/modules/bmm/workflows/4-implementation/story-context/instructions.md +76 -0
- package/src/modules/bmm/workflows/4-implementation/story-context/workflow.yaml +56 -0
- package/src/modules/cis/_module-installer/install-menu-config.yaml +14 -0
- package/src/modules/cis/_module-installer/installer.js +92 -0
- package/src/modules/cis/agents/README.md +104 -0
- package/src/modules/cis/agents/brainstorming-coach.md +24 -0
- package/src/modules/cis/agents/creative-problem-solver.md +24 -0
- package/src/modules/cis/agents/design-thinking-coach.md +24 -0
- package/src/modules/cis/agents/innovation-strategist.md +24 -0
- package/src/modules/cis/agents/storyteller.md +24 -0
- package/src/modules/cis/readme.md +86 -0
- package/src/modules/cis/teams/creative-squad.yaml +6 -0
- package/src/modules/cis/workflows/README.md +67 -0
- package/src/modules/cis/workflows/brainstorming/README.md +271 -0
- package/src/modules/cis/workflows/brainstorming/brain-methods.csv +36 -0
- package/src/modules/cis/workflows/brainstorming/instructions.md +310 -0
- package/src/modules/cis/workflows/brainstorming/template.md +102 -0
- package/src/modules/cis/workflows/brainstorming/workflow.yaml +30 -0
- package/src/modules/cis/workflows/design-thinking/README.md +56 -0
- package/src/modules/cis/workflows/design-thinking/design-methods.csv +31 -0
- package/src/modules/cis/workflows/design-thinking/instructions.md +200 -0
- package/src/modules/cis/workflows/design-thinking/template.md +111 -0
- package/src/modules/cis/workflows/design-thinking/workflow.yaml +29 -0
- package/src/modules/cis/workflows/innovation-strategy/README.md +56 -0
- package/src/modules/cis/workflows/innovation-strategy/innovation-frameworks.csv +31 -0
- package/src/modules/cis/workflows/innovation-strategy/instructions.md +274 -0
- package/src/modules/cis/workflows/innovation-strategy/template.md +189 -0
- package/src/modules/cis/workflows/innovation-strategy/workflow.yaml +29 -0
- package/src/modules/cis/workflows/problem-solving/README.md +56 -0
- package/src/modules/cis/workflows/problem-solving/instructions.md +250 -0
- package/src/modules/cis/workflows/problem-solving/solving-methods.csv +31 -0
- package/src/modules/cis/workflows/problem-solving/template.md +165 -0
- package/src/modules/cis/workflows/problem-solving/workflow.yaml +29 -0
- package/src/modules/cis/workflows/storytelling/README.md +58 -0
- package/src/modules/cis/workflows/storytelling/instructions.md +275 -0
- package/src/modules/cis/workflows/storytelling/story-types.csv +26 -0
- package/src/modules/cis/workflows/storytelling/template.md +113 -0
- package/src/modules/cis/workflows/storytelling/workflow.yaml +29 -0
- package/src/utility/models/agent-activation-ide.xml +51 -0
- package/src/utility/models/agent-config-template.md +23 -0
- package/tools/cli/bmad-cli.js +42 -0
- package/tools/cli/bundlers/bundle-web.js +157 -0
- package/tools/cli/bundlers/test-analyst.js +28 -0
- package/tools/cli/bundlers/test-bundler.js +118 -0
- package/tools/cli/bundlers/web-bundler.js +880 -0
- package/tools/cli/commands/install.js +41 -0
- package/tools/cli/commands/list.js +28 -0
- package/tools/cli/commands/status.js +47 -0
- package/tools/cli/commands/uninstall.js +44 -0
- package/tools/cli/commands/update.js +28 -0
- package/tools/cli/installers/lib/core/config-collector.js +383 -0
- package/tools/cli/installers/lib/core/dependency-resolver.js +721 -0
- package/tools/cli/installers/lib/core/detector.js +208 -0
- package/tools/cli/installers/lib/core/installer.js +1070 -0
- package/tools/cli/installers/lib/core/manifest-generator.js +385 -0
- package/tools/cli/installers/lib/core/manifest.js +484 -0
- package/tools/cli/installers/lib/ide/_base-ide.js +281 -0
- package/tools/cli/installers/lib/ide/auggie.js +271 -0
- package/tools/cli/installers/lib/ide/claude-code.js +625 -0
- package/tools/cli/installers/lib/ide/cline.js +301 -0
- package/tools/cli/installers/lib/ide/codex.js +267 -0
- package/tools/cli/installers/lib/ide/crush.js +204 -0
- package/tools/cli/installers/lib/ide/cursor.js +224 -0
- package/tools/cli/installers/lib/ide/gemini.js +160 -0
- package/tools/cli/installers/lib/ide/github-copilot.js +289 -0
- package/tools/cli/installers/lib/ide/iflow.js +142 -0
- package/tools/cli/installers/lib/ide/kilo.js +171 -0
- package/tools/cli/installers/lib/ide/manager.js +203 -0
- package/tools/cli/installers/lib/ide/qwen.js +188 -0
- package/tools/cli/installers/lib/ide/roo.js +288 -0
- package/tools/cli/installers/lib/ide/trae.js +182 -0
- package/tools/cli/installers/lib/ide/windsurf.js +149 -0
- package/tools/cli/installers/lib/ide/workflow-command-generator.js +162 -0
- package/tools/cli/installers/lib/ide/workflow-command-template.md +11 -0
- package/tools/cli/installers/lib/modules/manager.js +452 -0
- package/tools/cli/lib/agent-party-generator.js +206 -0
- package/tools/cli/lib/cli-utils.js +208 -0
- package/tools/cli/lib/config.js +210 -0
- package/tools/cli/lib/file-ops.js +204 -0
- package/tools/cli/lib/platform-codes.js +116 -0
- package/tools/cli/lib/project-root.js +71 -0
- package/tools/cli/lib/replace-project-root.js +239 -0
- package/tools/cli/lib/ui.js +516 -0
- package/tools/cli/lib/xml-handler.js +183 -0
- package/tools/cli/lib/xml-to-markdown.js +82 -0
- package/tools/{yaml-format.js → cli/lib/yaml-format.js} +3 -10
- package/tools/cli/regenerate-manifests.js +28 -0
- package/tools/flattener/ignoreRules.js +2 -6
- package/tools/flattener/main.js +31 -121
- package/tools/flattener/projectRoot.js +3 -8
- package/tools/flattener/stats.helpers.js +8 -35
- package/tools/flattener/stats.js +1 -6
- package/tools/flattener/test-matrix.js +1 -5
- package/tools/platform-codes.yaml +127 -0
- package/tools/test-agents/captain-kirk-commander.md +110 -0
- package/tools/test-agents/data-operations-android.md +123 -0
- package/tools/test-agents/geordi-chief-engineer.md +135 -0
- package/tools/test-agents/isabella-martinez-ethicist.md +109 -0
- package/tools/test-agents/marcus-thompson-security.md +109 -0
- package/tools/test-agents/maya-patel-pragmatist.md +82 -0
- package/tools/test-agents/picard-diplomat-captain.md +134 -0
- package/tools/test-agents/spock-science-officer.md +124 -0
- package/tools/test-agents/william-smithers-technocrat.md +71 -0
- package/tools/test-agents/zara-chen-designer.md +94 -0
- package/tools/validate-bundles.js +87 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -22
- package/README.md +0 -221
- package/bmad-core/agent-teams/team-all.yaml +0 -14
- package/bmad-core/agent-teams/team-fullstack.yaml +0 -18
- package/bmad-core/agent-teams/team-ide-minimal.yaml +0 -10
- package/bmad-core/agent-teams/team-no-ui.yaml +0 -13
- package/bmad-core/agents/analyst.md +0 -81
- package/bmad-core/agents/architect.md +0 -83
- package/bmad-core/agents/bmad-master.md +0 -107
- package/bmad-core/agents/bmad-orchestrator.md +0 -149
- package/bmad-core/agents/dev.md +0 -75
- package/bmad-core/agents/pm.md +0 -81
- package/bmad-core/agents/po.md +0 -76
- package/bmad-core/agents/qa.md +0 -88
- package/bmad-core/agents/sm.md +0 -62
- package/bmad-core/agents/ux-expert.md +0 -66
- package/bmad-core/checklists/architect-checklist.md +0 -438
- package/bmad-core/checklists/change-checklist.md +0 -182
- package/bmad-core/checklists/pm-checklist.md +0 -370
- package/bmad-core/checklists/po-master-checklist.md +0 -432
- package/bmad-core/checklists/story-dod-checklist.md +0 -94
- package/bmad-core/checklists/story-draft-checklist.md +0 -153
- package/bmad-core/core-config.yaml +0 -20
- package/bmad-core/data/bmad-kb.md +0 -806
- package/bmad-core/data/brainstorming-techniques.md +0 -36
- package/bmad-core/data/elicitation-methods.md +0 -154
- package/bmad-core/data/technical-preferences.md +0 -3
- package/bmad-core/tasks/advanced-elicitation.md +0 -117
- package/bmad-core/tasks/brownfield-create-epic.md +0 -160
- package/bmad-core/tasks/brownfield-create-story.md +0 -147
- package/bmad-core/tasks/correct-course.md +0 -70
- package/bmad-core/tasks/create-brownfield-story.md +0 -312
- package/bmad-core/tasks/create-deep-research-prompt.md +0 -278
- package/bmad-core/tasks/create-next-story.md +0 -112
- package/bmad-core/tasks/document-project.md +0 -343
- package/bmad-core/tasks/facilitate-brainstorming-session.md +0 -136
- package/bmad-core/tasks/generate-ai-frontend-prompt.md +0 -51
- package/bmad-core/tasks/index-docs.md +0 -173
- package/bmad-core/tasks/kb-mode-interaction.md +0 -75
- package/bmad-core/tasks/nfr-assess.md +0 -343
- package/bmad-core/tasks/qa-gate.md +0 -159
- package/bmad-core/tasks/review-story.md +0 -314
- package/bmad-core/tasks/risk-profile.md +0 -353
- package/bmad-core/tasks/shard-doc.md +0 -185
- package/bmad-core/tasks/test-design.md +0 -174
- package/bmad-core/tasks/trace-requirements.md +0 -264
- package/bmad-core/tasks/validate-next-story.md +0 -134
- package/bmad-core/templates/architecture-tmpl.yaml +0 -650
- package/bmad-core/templates/brainstorming-output-tmpl.yaml +0 -156
- package/bmad-core/templates/brownfield-architecture-tmpl.yaml +0 -476
- package/bmad-core/templates/brownfield-prd-tmpl.yaml +0 -280
- package/bmad-core/templates/competitor-analysis-tmpl.yaml +0 -306
- package/bmad-core/templates/front-end-architecture-tmpl.yaml +0 -218
- package/bmad-core/templates/front-end-spec-tmpl.yaml +0 -349
- package/bmad-core/templates/fullstack-architecture-tmpl.yaml +0 -823
- package/bmad-core/templates/market-research-tmpl.yaml +0 -252
- package/bmad-core/templates/prd-tmpl.yaml +0 -202
- package/bmad-core/templates/project-brief-tmpl.yaml +0 -221
- package/bmad-core/templates/qa-gate-tmpl.yaml +0 -102
- package/bmad-core/templates/story-tmpl.yaml +0 -137
- package/bmad-core/workflows/brownfield-fullstack.yaml +0 -297
- package/bmad-core/workflows/brownfield-service.yaml +0 -187
- package/bmad-core/workflows/brownfield-ui.yaml +0 -197
- package/bmad-core/workflows/greenfield-fullstack.yaml +0 -240
- package/bmad-core/workflows/greenfield-service.yaml +0 -206
- package/bmad-core/workflows/greenfield-ui.yaml +0 -235
- package/common/tasks/create-doc.md +0 -101
- package/common/tasks/execute-checklist.md +0 -86
- package/common/utils/bmad-doc-template.md +0 -325
- package/common/utils/workflow-management.md +0 -69
- package/dist/agents/analyst.txt +0 -2889
- package/dist/agents/architect.txt +0 -3552
- package/dist/agents/bmad-master.txt +0 -8769
- package/dist/agents/bmad-orchestrator.txt +0 -1513
- package/dist/agents/dev.txt +0 -414
- package/dist/agents/pm.txt +0 -2204
- package/dist/agents/po.txt +0 -1346
- package/dist/agents/qa.txt +0 -1987
- package/dist/agents/sm.txt +0 -658
- package/dist/agents/ux-expert.txt +0 -694
- package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-designer.txt +0 -2371
- package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-developer.txt +0 -1620
- package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-sm.txt +0 -815
- package/dist/expansion-packs/bmad-2d-phaser-game-dev/teams/phaser-2d-nodejs-game-team.txt +0 -10952
- package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-architect.txt +0 -4012
- package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-designer.txt +0 -3698
- package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-developer.txt +0 -450
- package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-sm.txt +0 -973
- package/dist/expansion-packs/bmad-2d-unity-game-dev/teams/unity-2d-game-team.txt +0 -15376
- package/dist/expansion-packs/bmad-infrastructure-devops/agents/infra-devops-platform.txt +0 -2075
- package/dist/teams/team-all.txt +0 -12682
- package/dist/teams/team-fullstack.txt +0 -10421
- package/dist/teams/team-ide-minimal.txt +0 -5103
- package/dist/teams/team-no-ui.txt +0 -8980
- package/docs/GUIDING-PRINCIPLES.md +0 -91
- package/docs/core-architecture.md +0 -219
- package/docs/enhanced-ide-development-workflow.md +0 -248
- package/docs/expansion-packs.md +0 -280
- package/docs/how-to-contribute-with-pull-requests.md +0 -158
- package/docs/user-guide.md +0 -504
- package/docs/versioning-and-releases.md +0 -147
- package/docs/versions.md +0 -48
- package/docs/working-in-the-brownfield.md +0 -597
- package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/Complete AI Agent System - Flowchart.svg +0 -102
- package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.1 Google Cloud Project Setup/1.1.1 - Initial Project Configuration - bash copy.txt +0 -13
- package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.1 Google Cloud Project Setup/1.1.1 - Initial Project Configuration - bash.txt +0 -13
- package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.2 Agent Development Kit Installation/1.2.2 - Basic Project Structure - txt.txt +0 -25
- package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.3 Core Configuration Files/1.3.1 - settings.py +0 -34
- package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.3 Core Configuration Files/1.3.2 - main.py - Base Application.py +0 -70
- package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.4 Deployment Configuration/1.4.2 - cloudbuild.yaml +0 -26
- package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/README.md +0 -109
- package/expansion-packs/README.md +0 -3
- package/expansion-packs/bmad-2d-phaser-game-dev/agent-teams/phaser-2d-nodejs-game-team.yaml +0 -13
- package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-designer.md +0 -71
- package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-developer.md +0 -78
- package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-sm.md +0 -64
- package/expansion-packs/bmad-2d-phaser-game-dev/checklists/game-design-checklist.md +0 -201
- package/expansion-packs/bmad-2d-phaser-game-dev/checklists/game-story-dod-checklist.md +0 -160
- package/expansion-packs/bmad-2d-phaser-game-dev/config.yaml +0 -8
- package/expansion-packs/bmad-2d-phaser-game-dev/data/bmad-kb.md +0 -250
- package/expansion-packs/bmad-2d-phaser-game-dev/data/development-guidelines.md +0 -647
- package/expansion-packs/bmad-2d-phaser-game-dev/tasks/advanced-elicitation.md +0 -110
- package/expansion-packs/bmad-2d-phaser-game-dev/tasks/create-game-story.md +0 -216
- package/expansion-packs/bmad-2d-phaser-game-dev/tasks/game-design-brainstorming.md +0 -290
- package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-architecture-tmpl.yaml +0 -613
- package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-brief-tmpl.yaml +0 -356
- package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-design-doc-tmpl.yaml +0 -343
- package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-story-tmpl.yaml +0 -253
- package/expansion-packs/bmad-2d-phaser-game-dev/templates/level-design-doc-tmpl.yaml +0 -484
- package/expansion-packs/bmad-2d-phaser-game-dev/workflows/game-dev-greenfield.yaml +0 -183
- package/expansion-packs/bmad-2d-phaser-game-dev/workflows/game-prototype.yaml +0 -175
- package/expansion-packs/bmad-2d-unity-game-dev/agent-teams/unity-2d-game-team.yaml +0 -14
- package/expansion-packs/bmad-2d-unity-game-dev/agents/game-architect.md +0 -80
- package/expansion-packs/bmad-2d-unity-game-dev/agents/game-designer.md +0 -77
- package/expansion-packs/bmad-2d-unity-game-dev/agents/game-developer.md +0 -78
- package/expansion-packs/bmad-2d-unity-game-dev/agents/game-sm.md +0 -65
- package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-architect-checklist.md +0 -391
- package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-change-checklist.md +0 -203
- package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-design-checklist.md +0 -201
- package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-story-dod-checklist.md +0 -124
- package/expansion-packs/bmad-2d-unity-game-dev/config.yaml +0 -6
- package/expansion-packs/bmad-2d-unity-game-dev/data/bmad-kb.md +0 -769
- package/expansion-packs/bmad-2d-unity-game-dev/data/development-guidelines.md +0 -586
- package/expansion-packs/bmad-2d-unity-game-dev/tasks/advanced-elicitation.md +0 -110
- package/expansion-packs/bmad-2d-unity-game-dev/tasks/correct-course-game.md +0 -141
- package/expansion-packs/bmad-2d-unity-game-dev/tasks/create-game-story.md +0 -184
- package/expansion-packs/bmad-2d-unity-game-dev/tasks/game-design-brainstorming.md +0 -290
- package/expansion-packs/bmad-2d-unity-game-dev/tasks/validate-game-story.md +0 -200
- package/expansion-packs/bmad-2d-unity-game-dev/templates/game-architecture-tmpl.yaml +0 -1030
- package/expansion-packs/bmad-2d-unity-game-dev/templates/game-brief-tmpl.yaml +0 -356
- package/expansion-packs/bmad-2d-unity-game-dev/templates/game-design-doc-tmpl.yaml +0 -705
- package/expansion-packs/bmad-2d-unity-game-dev/templates/game-story-tmpl.yaml +0 -256
- package/expansion-packs/bmad-2d-unity-game-dev/templates/level-design-doc-tmpl.yaml +0 -484
- package/expansion-packs/bmad-2d-unity-game-dev/workflows/game-dev-greenfield.yaml +0 -183
- package/expansion-packs/bmad-2d-unity-game-dev/workflows/game-prototype.yaml +0 -175
- package/expansion-packs/bmad-infrastructure-devops/README.md +0 -147
- package/expansion-packs/bmad-infrastructure-devops/agents/infra-devops-platform.md +0 -71
- package/expansion-packs/bmad-infrastructure-devops/checklists/infrastructure-checklist.md +0 -484
- package/expansion-packs/bmad-infrastructure-devops/config.yaml +0 -9
- package/expansion-packs/bmad-infrastructure-devops/data/bmad-kb.md +0 -305
- package/expansion-packs/bmad-infrastructure-devops/tasks/review-infrastructure.md +0 -159
- package/expansion-packs/bmad-infrastructure-devops/tasks/validate-infrastructure.md +0 -153
- package/expansion-packs/bmad-infrastructure-devops/templates/infrastructure-architecture-tmpl.yaml +0 -424
- package/expansion-packs/bmad-infrastructure-devops/templates/infrastructure-platform-from-arch-tmpl.yaml +0 -629
- package/release_notes.md +0 -32
- package/tools/bmad-npx-wrapper.js +0 -39
- package/tools/builders/web-builder.js +0 -675
- package/tools/bump-all-versions.js +0 -115
- package/tools/bump-expansion-version.js +0 -90
- package/tools/cli.js +0 -152
- package/tools/installer/README.md +0 -8
- package/tools/installer/bin/bmad.js +0 -585
- package/tools/installer/config/ide-agent-config.yaml +0 -58
- package/tools/installer/config/install.config.yaml +0 -123
- package/tools/installer/lib/config-loader.js +0 -257
- package/tools/installer/lib/file-manager.js +0 -389
- package/tools/installer/lib/ide-base-setup.js +0 -228
- package/tools/installer/lib/ide-setup.js +0 -1441
- package/tools/installer/lib/installer.js +0 -1995
- package/tools/installer/lib/memory-profiler.js +0 -225
- package/tools/installer/lib/module-manager.js +0 -114
- package/tools/installer/lib/resource-locator.js +0 -308
- package/tools/installer/package.json +0 -44
- package/tools/lib/dependency-resolver.js +0 -175
- package/tools/lib/yaml-utils.js +0 -29
- package/tools/md-assets/web-agent-startup-instructions.md +0 -39
- package/tools/preview-release-notes.js +0 -66
- package/tools/shared/bannerArt.js +0 -105
- package/tools/sync-installer-version.js +0 -32
- package/tools/update-expansion-version.js +0 -53
- package/tools/upgraders/v3-to-v4-upgrader.js +0 -672
- package/tools/version-bump.js +0 -94
|
@@ -0,0 +1,516 @@
|
|
|
1
|
+
const chalk = require('chalk');
|
|
2
|
+
const inquirer = require('inquirer');
|
|
3
|
+
const path = require('node:path');
|
|
4
|
+
const os = require('node:os');
|
|
5
|
+
const fs = require('fs-extra');
|
|
6
|
+
const { CLIUtils } = require('./cli-utils');
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* UI utilities for the installer
|
|
10
|
+
*/
|
|
11
|
+
class UI {
|
|
12
|
+
constructor() {}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Prompt for installation configuration
|
|
16
|
+
* @returns {Object} Installation configuration
|
|
17
|
+
*/
|
|
18
|
+
async promptInstall() {
|
|
19
|
+
CLIUtils.displayLogo();
|
|
20
|
+
CLIUtils.displaySection('BMAD™ Setup', 'Build More, Architect Dreams');
|
|
21
|
+
|
|
22
|
+
const confirmedDirectory = await this.getConfirmedDirectory();
|
|
23
|
+
const { installedModuleIds } = await this.getExistingInstallation(confirmedDirectory);
|
|
24
|
+
const coreConfig = await this.collectCoreConfig(confirmedDirectory);
|
|
25
|
+
const moduleChoices = await this.getModuleChoices(installedModuleIds);
|
|
26
|
+
const selectedModules = await this.selectModules(moduleChoices);
|
|
27
|
+
|
|
28
|
+
console.clear();
|
|
29
|
+
CLIUtils.displayLogo();
|
|
30
|
+
CLIUtils.displayModuleComplete('core', false); // false = don't clear the screen again
|
|
31
|
+
|
|
32
|
+
return {
|
|
33
|
+
directory: confirmedDirectory,
|
|
34
|
+
installCore: true, // Always install core
|
|
35
|
+
modules: selectedModules,
|
|
36
|
+
// IDE selection moved to after module configuration
|
|
37
|
+
ides: [],
|
|
38
|
+
skipIde: true, // Will be handled later
|
|
39
|
+
coreConfig: coreConfig, // Pass collected core config to installer
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Prompt for tool/IDE selection (called after module configuration)
|
|
45
|
+
* @param {string} projectDir - Project directory to check for existing IDEs
|
|
46
|
+
* @param {Array} selectedModules - Selected modules from configuration
|
|
47
|
+
* @returns {Object} Tool configuration
|
|
48
|
+
*/
|
|
49
|
+
async promptToolSelection(projectDir, selectedModules) {
|
|
50
|
+
// Check for existing configured IDEs
|
|
51
|
+
const { Detector } = require('../installers/lib/core/detector');
|
|
52
|
+
const detector = new Detector();
|
|
53
|
+
const bmadDir = path.join(projectDir || process.cwd(), 'bmad');
|
|
54
|
+
const existingInstall = await detector.detect(bmadDir);
|
|
55
|
+
const configuredIdes = existingInstall.ides || [];
|
|
56
|
+
|
|
57
|
+
// Get IDE manager to fetch available IDEs dynamically
|
|
58
|
+
const { IdeManager } = require('../installers/lib/ide/manager');
|
|
59
|
+
const ideManager = new IdeManager();
|
|
60
|
+
|
|
61
|
+
const preferredIdes = ideManager.getPreferredIdes();
|
|
62
|
+
const otherIdes = ideManager.getOtherIdes();
|
|
63
|
+
|
|
64
|
+
// Build IDE choices array with separators
|
|
65
|
+
const ideChoices = [];
|
|
66
|
+
const processedIdes = new Set();
|
|
67
|
+
|
|
68
|
+
// First, add previously configured IDEs at the top, marked with ✅
|
|
69
|
+
if (configuredIdes.length > 0) {
|
|
70
|
+
ideChoices.push(new inquirer.Separator('── Previously Configured ──'));
|
|
71
|
+
for (const ideValue of configuredIdes) {
|
|
72
|
+
// Find the IDE in either preferred or other lists
|
|
73
|
+
const preferredIde = preferredIdes.find((ide) => ide.value === ideValue);
|
|
74
|
+
const otherIde = otherIdes.find((ide) => ide.value === ideValue);
|
|
75
|
+
const ide = preferredIde || otherIde;
|
|
76
|
+
|
|
77
|
+
if (ide) {
|
|
78
|
+
ideChoices.push({
|
|
79
|
+
name: `${ide.name} ✅`,
|
|
80
|
+
value: ide.value,
|
|
81
|
+
checked: true, // Previously configured IDEs are checked by default
|
|
82
|
+
});
|
|
83
|
+
processedIdes.add(ide.value);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Add preferred tools (excluding already processed)
|
|
89
|
+
const remainingPreferred = preferredIdes.filter((ide) => !processedIdes.has(ide.value));
|
|
90
|
+
if (remainingPreferred.length > 0) {
|
|
91
|
+
ideChoices.push(new inquirer.Separator('── Recommended Tools ──'));
|
|
92
|
+
for (const ide of remainingPreferred) {
|
|
93
|
+
ideChoices.push({
|
|
94
|
+
name: `${ide.name} ⭐`,
|
|
95
|
+
value: ide.value,
|
|
96
|
+
checked: false,
|
|
97
|
+
});
|
|
98
|
+
processedIdes.add(ide.value);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Add other tools (excluding already processed)
|
|
103
|
+
const remainingOther = otherIdes.filter((ide) => !processedIdes.has(ide.value));
|
|
104
|
+
if (remainingOther.length > 0) {
|
|
105
|
+
ideChoices.push(new inquirer.Separator('── Additional Tools ──'));
|
|
106
|
+
for (const ide of remainingOther) {
|
|
107
|
+
ideChoices.push({
|
|
108
|
+
name: ide.name,
|
|
109
|
+
value: ide.value,
|
|
110
|
+
checked: false,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
CLIUtils.displaySection('Tool Integration', 'Select AI coding assistants and IDEs to configure');
|
|
116
|
+
|
|
117
|
+
const answers = await inquirer.prompt([
|
|
118
|
+
{
|
|
119
|
+
type: 'checkbox',
|
|
120
|
+
name: 'ides',
|
|
121
|
+
message: 'Select tools to configure:',
|
|
122
|
+
choices: ideChoices,
|
|
123
|
+
pageSize: 15,
|
|
124
|
+
},
|
|
125
|
+
]);
|
|
126
|
+
|
|
127
|
+
return {
|
|
128
|
+
ides: answers.ides || [],
|
|
129
|
+
skipIde: !answers.ides || answers.ides.length === 0,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Prompt for update configuration
|
|
135
|
+
* @returns {Object} Update configuration
|
|
136
|
+
*/
|
|
137
|
+
async promptUpdate() {
|
|
138
|
+
const answers = await inquirer.prompt([
|
|
139
|
+
{
|
|
140
|
+
type: 'confirm',
|
|
141
|
+
name: 'backupFirst',
|
|
142
|
+
message: 'Create backup before updating?',
|
|
143
|
+
default: true,
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
type: 'confirm',
|
|
147
|
+
name: 'preserveCustomizations',
|
|
148
|
+
message: 'Preserve local customizations?',
|
|
149
|
+
default: true,
|
|
150
|
+
},
|
|
151
|
+
]);
|
|
152
|
+
|
|
153
|
+
return answers;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Prompt for module selection
|
|
158
|
+
* @param {Array} modules - Available modules
|
|
159
|
+
* @returns {Array} Selected modules
|
|
160
|
+
*/
|
|
161
|
+
async promptModules(modules) {
|
|
162
|
+
const choices = modules.map((mod) => ({
|
|
163
|
+
name: `${mod.name} - ${mod.description}`,
|
|
164
|
+
value: mod.id,
|
|
165
|
+
checked: false,
|
|
166
|
+
}));
|
|
167
|
+
|
|
168
|
+
const { selectedModules } = await inquirer.prompt([
|
|
169
|
+
{
|
|
170
|
+
type: 'checkbox',
|
|
171
|
+
name: 'selectedModules',
|
|
172
|
+
message: 'Select modules to add:',
|
|
173
|
+
choices,
|
|
174
|
+
validate: (answer) => {
|
|
175
|
+
if (answer.length === 0) {
|
|
176
|
+
return 'You must choose at least one module.';
|
|
177
|
+
}
|
|
178
|
+
return true;
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
]);
|
|
182
|
+
|
|
183
|
+
return selectedModules;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Confirm action
|
|
188
|
+
* @param {string} message - Confirmation message
|
|
189
|
+
* @param {boolean} defaultValue - Default value
|
|
190
|
+
* @returns {boolean} User confirmation
|
|
191
|
+
*/
|
|
192
|
+
async confirm(message, defaultValue = false) {
|
|
193
|
+
const { confirmed } = await inquirer.prompt([
|
|
194
|
+
{
|
|
195
|
+
type: 'confirm',
|
|
196
|
+
name: 'confirmed',
|
|
197
|
+
message,
|
|
198
|
+
default: defaultValue,
|
|
199
|
+
},
|
|
200
|
+
]);
|
|
201
|
+
|
|
202
|
+
return confirmed;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Display installation summary
|
|
207
|
+
* @param {Object} result - Installation result
|
|
208
|
+
*/
|
|
209
|
+
showInstallSummary(result) {
|
|
210
|
+
CLIUtils.displaySection('Installation Complete', 'BMAD™ has been successfully installed');
|
|
211
|
+
|
|
212
|
+
const summary = [
|
|
213
|
+
`📁 Installation Path: ${result.path}`,
|
|
214
|
+
`📦 Modules Installed: ${result.modules?.length > 0 ? result.modules.join(', ') : 'core only'}`,
|
|
215
|
+
`🔧 Tools Configured: ${result.ides?.length > 0 ? result.ides.join(', ') : 'none'}`,
|
|
216
|
+
];
|
|
217
|
+
|
|
218
|
+
CLIUtils.displayBox(summary.join('\n\n'), {
|
|
219
|
+
borderColor: 'green',
|
|
220
|
+
borderStyle: 'round',
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
console.log('\n' + chalk.green.bold('✨ BMAD is ready to use!'));
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* Get confirmed directory from user
|
|
228
|
+
* @returns {string} Confirmed directory path
|
|
229
|
+
*/
|
|
230
|
+
async getConfirmedDirectory() {
|
|
231
|
+
let confirmedDirectory = null;
|
|
232
|
+
while (!confirmedDirectory) {
|
|
233
|
+
const directoryAnswer = await this.promptForDirectory();
|
|
234
|
+
await this.displayDirectoryInfo(directoryAnswer.directory);
|
|
235
|
+
|
|
236
|
+
if (await this.confirmDirectory(directoryAnswer.directory)) {
|
|
237
|
+
confirmedDirectory = directoryAnswer.directory;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
return confirmedDirectory;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Get existing installation info and installed modules
|
|
245
|
+
* @param {string} directory - Installation directory
|
|
246
|
+
* @returns {Object} Object with existingInstall and installedModuleIds
|
|
247
|
+
*/
|
|
248
|
+
async getExistingInstallation(directory) {
|
|
249
|
+
const { Detector } = require('../installers/lib/core/detector');
|
|
250
|
+
const detector = new Detector();
|
|
251
|
+
const bmadDir = path.join(directory, 'bmad');
|
|
252
|
+
const existingInstall = await detector.detect(bmadDir);
|
|
253
|
+
const installedModuleIds = new Set(existingInstall.modules.map((mod) => mod.id));
|
|
254
|
+
|
|
255
|
+
return { existingInstall, installedModuleIds };
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Collect core configuration
|
|
260
|
+
* @param {string} directory - Installation directory
|
|
261
|
+
* @returns {Object} Core configuration
|
|
262
|
+
*/
|
|
263
|
+
async collectCoreConfig(directory) {
|
|
264
|
+
const { ConfigCollector } = require('../installers/lib/core/config-collector');
|
|
265
|
+
const configCollector = new ConfigCollector();
|
|
266
|
+
// Load existing configs first if they exist
|
|
267
|
+
await configCollector.loadExistingConfig(directory);
|
|
268
|
+
// Now collect with existing values as defaults (false = don't skip loading, true = skip completion message)
|
|
269
|
+
await configCollector.collectModuleConfig('core', directory, false, true);
|
|
270
|
+
|
|
271
|
+
return configCollector.collectedConfig.core;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* Get module choices for selection
|
|
276
|
+
* @param {Set} installedModuleIds - Currently installed module IDs
|
|
277
|
+
* @returns {Array} Module choices for inquirer
|
|
278
|
+
*/
|
|
279
|
+
async getModuleChoices(installedModuleIds) {
|
|
280
|
+
const { ModuleManager } = require('../installers/lib/modules/manager');
|
|
281
|
+
const moduleManager = new ModuleManager();
|
|
282
|
+
const availableModules = await moduleManager.listAvailable();
|
|
283
|
+
|
|
284
|
+
const isNewInstallation = installedModuleIds.size === 0;
|
|
285
|
+
return availableModules.map((mod) => ({
|
|
286
|
+
name: mod.name,
|
|
287
|
+
value: mod.id,
|
|
288
|
+
checked: isNewInstallation ? mod.defaultSelected || false : installedModuleIds.has(mod.id),
|
|
289
|
+
}));
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
/**
|
|
293
|
+
* Prompt for module selection
|
|
294
|
+
* @param {Array} moduleChoices - Available module choices
|
|
295
|
+
* @returns {Array} Selected module IDs
|
|
296
|
+
*/
|
|
297
|
+
async selectModules(moduleChoices) {
|
|
298
|
+
CLIUtils.displaySection('Module Selection', 'Choose the BMAD modules to install');
|
|
299
|
+
|
|
300
|
+
const moduleAnswer = await inquirer.prompt([
|
|
301
|
+
{
|
|
302
|
+
type: 'checkbox',
|
|
303
|
+
name: 'modules',
|
|
304
|
+
message: 'Select modules to install:',
|
|
305
|
+
choices: moduleChoices,
|
|
306
|
+
},
|
|
307
|
+
]);
|
|
308
|
+
|
|
309
|
+
return moduleAnswer.modules || [];
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* Prompt for directory selection
|
|
314
|
+
* @returns {Object} Directory answer from inquirer
|
|
315
|
+
*/
|
|
316
|
+
async promptForDirectory() {
|
|
317
|
+
return await inquirer.prompt([
|
|
318
|
+
{
|
|
319
|
+
type: 'input',
|
|
320
|
+
name: 'directory',
|
|
321
|
+
message: `Installation directory:`,
|
|
322
|
+
default: process.cwd(),
|
|
323
|
+
validate: async (input) => this.validateDirectory(input),
|
|
324
|
+
filter: (input) => {
|
|
325
|
+
// If empty, use the default
|
|
326
|
+
if (!input || input.trim() === '') {
|
|
327
|
+
return process.cwd();
|
|
328
|
+
}
|
|
329
|
+
return this.expandUserPath(input);
|
|
330
|
+
},
|
|
331
|
+
},
|
|
332
|
+
]);
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
/**
|
|
336
|
+
* Display directory information
|
|
337
|
+
* @param {string} directory - The directory path
|
|
338
|
+
*/
|
|
339
|
+
async displayDirectoryInfo(directory) {
|
|
340
|
+
console.log(chalk.cyan('\nResolved installation path:'), chalk.bold(directory));
|
|
341
|
+
|
|
342
|
+
const dirExists = await fs.pathExists(directory);
|
|
343
|
+
if (dirExists) {
|
|
344
|
+
// Show helpful context about the existing path
|
|
345
|
+
const stats = await fs.stat(directory);
|
|
346
|
+
if (stats.isDirectory()) {
|
|
347
|
+
const files = await fs.readdir(directory);
|
|
348
|
+
if (files.length > 0) {
|
|
349
|
+
console.log(
|
|
350
|
+
chalk.gray(`Directory exists and contains ${files.length} item(s)`) +
|
|
351
|
+
(files.includes('bmad') ? chalk.yellow(' including existing bmad installation') : ''),
|
|
352
|
+
);
|
|
353
|
+
} else {
|
|
354
|
+
console.log(chalk.gray('Directory exists and is empty'));
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
} else {
|
|
358
|
+
const existingParent = await this.findExistingParent(directory);
|
|
359
|
+
console.log(chalk.gray(`Will create in: ${existingParent}`));
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
/**
|
|
364
|
+
* Confirm directory selection
|
|
365
|
+
* @param {string} directory - The directory path
|
|
366
|
+
* @returns {boolean} Whether user confirmed
|
|
367
|
+
*/
|
|
368
|
+
async confirmDirectory(directory) {
|
|
369
|
+
const dirExists = await fs.pathExists(directory);
|
|
370
|
+
|
|
371
|
+
if (dirExists) {
|
|
372
|
+
const confirmAnswer = await inquirer.prompt([
|
|
373
|
+
{
|
|
374
|
+
type: 'confirm',
|
|
375
|
+
name: 'proceed',
|
|
376
|
+
message: `Install to this directory?`,
|
|
377
|
+
default: true,
|
|
378
|
+
},
|
|
379
|
+
]);
|
|
380
|
+
|
|
381
|
+
if (!confirmAnswer.proceed) {
|
|
382
|
+
console.log(chalk.yellow("\nLet's try again with a different path.\n"));
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
return confirmAnswer.proceed;
|
|
386
|
+
} else {
|
|
387
|
+
// Ask for confirmation to create the directory
|
|
388
|
+
const createConfirm = await inquirer.prompt([
|
|
389
|
+
{
|
|
390
|
+
type: 'confirm',
|
|
391
|
+
name: 'create',
|
|
392
|
+
message: `The directory '${directory}' doesn't exist. Would you like to create it?`,
|
|
393
|
+
default: false,
|
|
394
|
+
},
|
|
395
|
+
]);
|
|
396
|
+
|
|
397
|
+
if (!createConfirm.create) {
|
|
398
|
+
console.log(chalk.yellow("\nLet's try again with a different path.\n"));
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
return createConfirm.create;
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
/**
|
|
406
|
+
* Validate directory path for installation
|
|
407
|
+
* @param {string} input - User input path
|
|
408
|
+
* @returns {string|true} Error message or true if valid
|
|
409
|
+
*/
|
|
410
|
+
async validateDirectory(input) {
|
|
411
|
+
// Allow empty input to use the default
|
|
412
|
+
if (!input || input.trim() === '') {
|
|
413
|
+
return true; // Empty means use default
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
let expandedPath;
|
|
417
|
+
try {
|
|
418
|
+
expandedPath = this.expandUserPath(input.trim());
|
|
419
|
+
} catch (error) {
|
|
420
|
+
return error.message;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
// Check if the path exists
|
|
424
|
+
const pathExists = await fs.pathExists(expandedPath);
|
|
425
|
+
|
|
426
|
+
if (!pathExists) {
|
|
427
|
+
// Find the first existing parent directory
|
|
428
|
+
const existingParent = await this.findExistingParent(expandedPath);
|
|
429
|
+
|
|
430
|
+
if (!existingParent) {
|
|
431
|
+
return 'Cannot create directory: no existing parent directory found';
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
// Check if the existing parent is writable
|
|
435
|
+
try {
|
|
436
|
+
await fs.access(existingParent, fs.constants.W_OK);
|
|
437
|
+
// Path doesn't exist but can be created - will prompt for confirmation later
|
|
438
|
+
return true;
|
|
439
|
+
} catch {
|
|
440
|
+
// Provide a detailed error message explaining both issues
|
|
441
|
+
return `Directory '${expandedPath}' does not exist and cannot be created: parent directory '${existingParent}' is not writable`;
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
// If it exists, validate it's a directory and writable
|
|
446
|
+
const stat = await fs.stat(expandedPath);
|
|
447
|
+
if (!stat.isDirectory()) {
|
|
448
|
+
return `Path exists but is not a directory: ${expandedPath}`;
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
// Check write permissions
|
|
452
|
+
try {
|
|
453
|
+
await fs.access(expandedPath, fs.constants.W_OK);
|
|
454
|
+
} catch {
|
|
455
|
+
return `Directory is not writable: ${expandedPath}`;
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
return true;
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
/**
|
|
462
|
+
* Find the first existing parent directory
|
|
463
|
+
* @param {string} targetPath - The path to check
|
|
464
|
+
* @returns {string|null} The first existing parent directory, or null if none found
|
|
465
|
+
*/
|
|
466
|
+
async findExistingParent(targetPath) {
|
|
467
|
+
let currentPath = path.resolve(targetPath);
|
|
468
|
+
|
|
469
|
+
// Walk up the directory tree until we find an existing directory
|
|
470
|
+
while (currentPath !== path.dirname(currentPath)) {
|
|
471
|
+
// Stop at root
|
|
472
|
+
const parent = path.dirname(currentPath);
|
|
473
|
+
if (await fs.pathExists(parent)) {
|
|
474
|
+
return parent;
|
|
475
|
+
}
|
|
476
|
+
currentPath = parent;
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
return null; // No existing parent found (shouldn't happen in practice)
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
/**
|
|
483
|
+
* Expands the user-provided path: handles ~ and resolves to absolute.
|
|
484
|
+
* @param {string} inputPath - User input path.
|
|
485
|
+
* @returns {string} Absolute expanded path.
|
|
486
|
+
*/
|
|
487
|
+
expandUserPath(inputPath) {
|
|
488
|
+
if (typeof inputPath !== 'string') {
|
|
489
|
+
throw new TypeError('Path must be a string.');
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
let expanded = inputPath.trim();
|
|
493
|
+
|
|
494
|
+
// Handle tilde expansion
|
|
495
|
+
if (expanded.startsWith('~')) {
|
|
496
|
+
if (expanded === '~') {
|
|
497
|
+
expanded = os.homedir();
|
|
498
|
+
} else if (expanded.startsWith('~' + path.sep)) {
|
|
499
|
+
const pathAfterHome = expanded.slice(2); // Remove ~/ or ~\
|
|
500
|
+
expanded = path.join(os.homedir(), pathAfterHome);
|
|
501
|
+
} else {
|
|
502
|
+
const restOfPath = expanded.slice(1);
|
|
503
|
+
const separatorIndex = restOfPath.indexOf(path.sep);
|
|
504
|
+
const username = separatorIndex === -1 ? restOfPath : restOfPath.slice(0, separatorIndex);
|
|
505
|
+
if (username) {
|
|
506
|
+
throw new Error(`Path expansion for ~${username} is not supported. Please use an absolute path or ~${path.sep}`);
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
// Resolve to the absolute path relative to the current working directory
|
|
512
|
+
return path.resolve(expanded);
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
module.exports = { UI };
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
const xml2js = require('xml2js');
|
|
2
|
+
const fs = require('fs-extra');
|
|
3
|
+
const path = require('node:path');
|
|
4
|
+
const { getProjectRoot, getSourcePath } = require('./project-root');
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* XML utility functions for BMAD installer
|
|
8
|
+
*/
|
|
9
|
+
class XmlHandler {
|
|
10
|
+
constructor() {
|
|
11
|
+
this.parser = new xml2js.Parser({
|
|
12
|
+
preserveChildrenOrder: true,
|
|
13
|
+
explicitChildren: true,
|
|
14
|
+
explicitArray: false,
|
|
15
|
+
trim: false,
|
|
16
|
+
normalizeTags: false,
|
|
17
|
+
attrkey: '$',
|
|
18
|
+
charkey: '_',
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
this.builder = new xml2js.Builder({
|
|
22
|
+
renderOpts: {
|
|
23
|
+
pretty: true,
|
|
24
|
+
indent: ' ',
|
|
25
|
+
newline: '\n',
|
|
26
|
+
},
|
|
27
|
+
xmldec: {
|
|
28
|
+
version: '1.0',
|
|
29
|
+
encoding: 'utf8',
|
|
30
|
+
standalone: false,
|
|
31
|
+
},
|
|
32
|
+
headless: true, // Don't add XML declaration
|
|
33
|
+
attrkey: '$',
|
|
34
|
+
charkey: '_',
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Load and parse the activation template
|
|
40
|
+
* @returns {Object} Parsed activation block
|
|
41
|
+
*/
|
|
42
|
+
async loadActivationTemplate() {
|
|
43
|
+
const templatePath = getSourcePath('utility', 'models', 'agent-activation-ide.xml');
|
|
44
|
+
|
|
45
|
+
try {
|
|
46
|
+
const xmlContent = await fs.readFile(templatePath, 'utf8');
|
|
47
|
+
|
|
48
|
+
// Parse the XML directly (file is now pure XML)
|
|
49
|
+
const parsed = await this.parser.parseStringPromise(xmlContent);
|
|
50
|
+
return parsed.activation;
|
|
51
|
+
} catch (error) {
|
|
52
|
+
console.error('Failed to load activation template:', error);
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Inject activation block into agent XML content
|
|
59
|
+
* @param {string} agentContent - The agent file content
|
|
60
|
+
* @param {Object} metadata - Metadata containing module and name
|
|
61
|
+
* @returns {string} Modified content with activation block
|
|
62
|
+
*/
|
|
63
|
+
async injectActivation(agentContent, metadata = {}) {
|
|
64
|
+
try {
|
|
65
|
+
// Check if already has activation
|
|
66
|
+
if (agentContent.includes('<activation')) {
|
|
67
|
+
return agentContent;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Extract the XML portion from markdown if needed
|
|
71
|
+
let xmlContent = agentContent;
|
|
72
|
+
let beforeXml = '';
|
|
73
|
+
let afterXml = '';
|
|
74
|
+
|
|
75
|
+
const xmlBlockMatch = agentContent.match(/([\s\S]*?)```xml\n([\s\S]*?)\n```([\s\S]*)/);
|
|
76
|
+
if (xmlBlockMatch) {
|
|
77
|
+
beforeXml = xmlBlockMatch[1] + '```xml\n';
|
|
78
|
+
xmlContent = xmlBlockMatch[2];
|
|
79
|
+
afterXml = '\n```' + xmlBlockMatch[3];
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Parse the agent XML
|
|
83
|
+
const parsed = await this.parser.parseStringPromise(xmlContent);
|
|
84
|
+
|
|
85
|
+
// Get the activation template
|
|
86
|
+
const activationBlock = await this.loadActivationTemplate();
|
|
87
|
+
if (!activationBlock) {
|
|
88
|
+
console.warn('Could not load activation template');
|
|
89
|
+
return agentContent;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Find the agent node
|
|
93
|
+
if (
|
|
94
|
+
parsed.agent && // Insert activation as the first child
|
|
95
|
+
!parsed.agent.activation
|
|
96
|
+
) {
|
|
97
|
+
// Ensure proper structure
|
|
98
|
+
if (!parsed.agent.$$) {
|
|
99
|
+
parsed.agent.$$ = [];
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Create the activation node with proper structure
|
|
103
|
+
const activationNode = {
|
|
104
|
+
'#name': 'activation',
|
|
105
|
+
$: { critical: '1' },
|
|
106
|
+
$$: activationBlock.$$,
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
// Insert at the beginning
|
|
110
|
+
parsed.agent.$$.unshift(activationNode);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Convert back to XML
|
|
114
|
+
let modifiedXml = this.builder.buildObject(parsed);
|
|
115
|
+
|
|
116
|
+
// Fix indentation - xml2js doesn't maintain our exact formatting
|
|
117
|
+
// Add 2-space base indentation to match our style
|
|
118
|
+
const lines = modifiedXml.split('\n');
|
|
119
|
+
const indentedLines = lines.map((line) => {
|
|
120
|
+
if (line.trim() === '') return line;
|
|
121
|
+
if (line.startsWith('<agent')) return line; // Keep agent at column 0
|
|
122
|
+
return ' ' + line; // Indent everything else
|
|
123
|
+
});
|
|
124
|
+
modifiedXml = indentedLines.join('\n');
|
|
125
|
+
|
|
126
|
+
// Reconstruct the full content
|
|
127
|
+
return beforeXml + modifiedXml + afterXml;
|
|
128
|
+
} catch (error) {
|
|
129
|
+
console.error('Error injecting activation:', error);
|
|
130
|
+
return agentContent;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Simple string-based injection (fallback method)
|
|
136
|
+
* This preserves formatting better than XML parsing
|
|
137
|
+
*/
|
|
138
|
+
injectActivationSimple(agentContent, metadata = {}) {
|
|
139
|
+
// Check if already has activation
|
|
140
|
+
if (agentContent.includes('<activation')) {
|
|
141
|
+
return agentContent;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Load template file
|
|
145
|
+
const templatePath = getSourcePath('utility', 'models', 'agent-activation-ide.xml');
|
|
146
|
+
|
|
147
|
+
try {
|
|
148
|
+
const templateContent = fs.readFileSync(templatePath, 'utf8');
|
|
149
|
+
|
|
150
|
+
// The file is now pure XML, use it directly with proper indentation
|
|
151
|
+
// Add 2 spaces of indentation for insertion into agent
|
|
152
|
+
let activationBlock = templateContent
|
|
153
|
+
.split('\n')
|
|
154
|
+
.map((line) => (line ? ' ' + line : ''))
|
|
155
|
+
.join('\n');
|
|
156
|
+
|
|
157
|
+
// Replace {agent-filename} with actual filename if metadata provided
|
|
158
|
+
if (metadata.module && metadata.name) {
|
|
159
|
+
const agentFilename = `${metadata.module}-${metadata.name}.md`;
|
|
160
|
+
activationBlock = activationBlock.replace('{agent-filename}', agentFilename);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Find where to insert (after <agent> tag)
|
|
164
|
+
const agentMatch = agentContent.match(/(<agent[^>]*>)/);
|
|
165
|
+
if (!agentMatch) {
|
|
166
|
+
return agentContent;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
const insertPos = agentMatch.index + agentMatch[0].length;
|
|
170
|
+
|
|
171
|
+
// Insert the activation block
|
|
172
|
+
const before = agentContent.slice(0, insertPos);
|
|
173
|
+
const after = agentContent.slice(insertPos);
|
|
174
|
+
|
|
175
|
+
return before + '\n' + activationBlock + after;
|
|
176
|
+
} catch (error) {
|
|
177
|
+
console.error('Error in simple injection:', error);
|
|
178
|
+
return agentContent;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
module.exports = { XmlHandler };
|