bmad-method 5.1.3 → 6.0.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/commands/bmad/bmb/agents/bmad-builder.md +70 -0
- package/.claude/commands/bmad/bmb/workflows/README.md +67 -0
- package/.claude/commands/bmad/bmb/workflows/audit-workflow.md +15 -0
- package/.claude/commands/bmad/bmb/workflows/convert-legacy.md +15 -0
- package/.claude/commands/bmad/bmb/workflows/create-agent.md +15 -0
- package/.claude/commands/bmad/bmb/workflows/create-module.md +15 -0
- package/.claude/commands/bmad/bmb/workflows/create-workflow.md +15 -0
- package/.claude/commands/bmad/bmb/workflows/edit-agent.md +15 -0
- package/.claude/commands/bmad/bmb/workflows/edit-module.md +15 -0
- package/.claude/commands/bmad/bmb/workflows/edit-workflow.md +15 -0
- package/.claude/commands/bmad/bmb/workflows/module-brief.md +15 -0
- package/.claude/commands/bmad/bmb/workflows/redoc.md +15 -0
- package/.claude/commands/bmad/bmd/agents/cli-chief.md +108 -0
- package/.claude/commands/bmad/bmd/agents/doc-keeper.md +115 -0
- package/.claude/commands/bmad/bmd/agents/release-chief.md +109 -0
- package/.claude/commands/bmad/core/agents/bmad-master.md +71 -0
- package/.claude/commands/bmad/core/tasks/index-docs.md +9 -0
- package/.claude/commands/bmad/core/tools/shard-doc.md +9 -0
- package/.claude/commands/bmad/core/workflows/README.md +27 -0
- package/.claude/commands/bmad/core/workflows/brainstorming.md +15 -0
- package/.claude/commands/bmad/core/workflows/party-mode.md +15 -0
- package/.claude/hooks/bmad-tts-injector.sh +415 -0
- package/.claude/hooks/bmad-voice-manager.sh +511 -0
- package/.claude/hooks/check-output-style.sh +112 -0
- package/.claude/hooks/download-extra-voices.sh +244 -0
- package/.claude/hooks/github-star-reminder.sh +154 -0
- package/.claude/hooks/language-manager.sh +392 -0
- package/.claude/hooks/learn-manager.sh +475 -0
- package/.claude/hooks/personality-manager.sh +438 -0
- package/.claude/hooks/piper-download-voices.sh +165 -0
- package/.claude/hooks/piper-installer.sh +178 -0
- package/.claude/hooks/piper-multispeaker-registry.sh +165 -0
- package/.claude/hooks/piper-voice-manager.sh +293 -0
- package/.claude/hooks/play-tts-elevenlabs.sh +404 -0
- package/.claude/hooks/play-tts-piper.sh +338 -0
- package/.claude/hooks/play-tts.sh +100 -0
- package/.claude/hooks/provider-commands.sh +540 -0
- package/.claude/hooks/provider-manager.sh +298 -0
- package/.claude/hooks/replay-target-audio.sh +95 -0
- package/.claude/hooks/sentiment-manager.sh +201 -0
- package/.claude/hooks/speed-manager.sh +291 -0
- package/.claude/hooks/voice-manager.sh +594 -0
- package/.claude/hooks/voices-config.sh +70 -0
- package/.claude/settings.local.json +41 -0
- package/.github/FUNDING.yaml +2 -2
- package/.github/ISSUE_TEMPLATE/config.yaml +5 -0
- package/.github/ISSUE_TEMPLATE/idea_submission.md +109 -0
- package/.github/workflows/discord.yaml +1 -10
- package/.github/workflows/{format-check.yaml → lint.yaml} +22 -3
- package/.github/workflows/manual-release.yaml +2 -2
- package/.nvmrc +1 -0
- package/.prettierignore +2 -0
- package/.vscode/settings.json +34 -9
- package/CHANGELOG.md +214 -574
- package/CONTRIBUTING.md +131 -60
- package/LICENSE +6 -1
- package/README.md +188 -148
- package/bmad/_cfg/agent-manifest.csv +7 -0
- package/bmad/_cfg/agents/bmb-bmad-builder.customize.yaml +42 -0
- package/bmad/_cfg/agents/bmd-cli-chief.customize.yaml +32 -0
- package/bmad/_cfg/agents/bmd-doc-keeper.customize.yaml +42 -0
- package/bmad/_cfg/agents/bmd-release-chief.customize.yaml +42 -0
- package/bmad/_cfg/agents/core-bmad-master.customize.yaml +42 -0
- package/bmad/_cfg/files-manifest.csv +83 -0
- package/bmad/_cfg/manifest.yaml +12 -0
- package/bmad/_cfg/task-manifest.csv +5 -0
- package/bmad/_cfg/tool-manifest.csv +2 -0
- package/bmad/_cfg/workflow-manifest.csv +15 -0
- package/bmad/bmb/README.md +132 -0
- package/bmad/bmb/agents/bmad-builder.md +70 -0
- package/bmad/bmb/config.yaml +14 -0
- package/bmad/bmb/workflows/audit-workflow/checklist.md +143 -0
- package/bmad/bmb/workflows/audit-workflow/instructions.md +341 -0
- package/bmad/bmb/workflows/audit-workflow/template.md +118 -0
- package/bmad/bmb/workflows/audit-workflow/workflow.yaml +23 -0
- package/bmad/bmb/workflows/audit-workflow/workflow.yaml.bak +21 -0
- package/bmad/bmb/workflows/convert-legacy/README.md +262 -0
- package/bmad/bmb/workflows/convert-legacy/checklist.md +205 -0
- package/bmad/bmb/workflows/convert-legacy/instructions.md +377 -0
- package/bmad/bmb/workflows/convert-legacy/workflow.yaml +32 -0
- package/bmad/bmb/workflows/create-agent/README.md +320 -0
- package/bmad/bmb/workflows/create-agent/agent-architecture.md +419 -0
- package/bmad/bmb/workflows/create-agent/agent-architecture.md.bak +412 -0
- package/bmad/bmb/workflows/create-agent/agent-command-patterns.md +759 -0
- package/bmad/bmb/workflows/create-agent/agent-command-patterns.md.bak +759 -0
- package/bmad/bmb/workflows/create-agent/agent-types.md +292 -0
- package/bmad/bmb/workflows/create-agent/brainstorm-context.md +174 -0
- package/bmad/bmb/workflows/create-agent/checklist.md +62 -0
- package/bmad/bmb/workflows/create-agent/communication-styles.md +202 -0
- package/bmad/bmb/workflows/create-agent/instructions.md +430 -0
- package/bmad/bmb/workflows/create-agent/workflow.yaml +37 -0
- package/bmad/bmb/workflows/create-module/README.md +220 -0
- package/bmad/bmb/workflows/create-module/README.md.bak +218 -0
- package/bmad/bmb/workflows/create-module/brainstorm-context.md +137 -0
- package/bmad/bmb/workflows/create-module/checklist.md +244 -0
- package/bmad/bmb/workflows/create-module/checklist.md.bak +245 -0
- package/bmad/bmb/workflows/create-module/installer-templates/install-config.yaml +92 -0
- package/bmad/bmb/workflows/create-module/installer-templates/installer.js +231 -0
- package/bmad/bmb/workflows/create-module/installer-templates/installer.js.bak +231 -0
- package/bmad/bmb/workflows/create-module/instructions.md +581 -0
- package/bmad/bmb/workflows/create-module/instructions.md.bak +521 -0
- package/bmad/bmb/workflows/create-module/module-structure.md +366 -0
- package/bmad/bmb/workflows/create-module/module-structure.md.bak +310 -0
- package/bmad/bmb/workflows/create-module/workflow.yaml +42 -0
- package/bmad/bmb/workflows/create-module/workflow.yaml.bak +40 -0
- package/bmad/bmb/workflows/create-workflow/README.md +277 -0
- package/bmad/bmb/workflows/create-workflow/brainstorm-context.md +197 -0
- package/bmad/bmb/workflows/create-workflow/checklist.md +94 -0
- package/bmad/bmb/workflows/create-workflow/instructions.md +716 -0
- package/bmad/bmb/workflows/create-workflow/workflow-creation-guide.md +1150 -0
- package/bmad/bmb/workflows/create-workflow/workflow-template/checklist.md +24 -0
- package/bmad/bmb/workflows/create-workflow/workflow-template/instructions.md +13 -0
- package/bmad/bmb/workflows/create-workflow/workflow-template/template.md +9 -0
- package/bmad/bmb/workflows/create-workflow/workflow-template/workflow.yaml +39 -0
- package/bmad/bmb/workflows/create-workflow/workflow-template/workflow.yaml.bak +39 -0
- package/bmad/bmb/workflows/create-workflow/workflow.yaml +40 -0
- package/bmad/bmb/workflows/create-workflow/workflow.yaml.bak +38 -0
- package/bmad/bmb/workflows/edit-agent/README.md +112 -0
- package/bmad/bmb/workflows/edit-agent/checklist.md +112 -0
- package/bmad/bmb/workflows/edit-agent/instructions.md +290 -0
- package/bmad/bmb/workflows/edit-agent/workflow.yaml +33 -0
- package/bmad/bmb/workflows/edit-module/README.md +187 -0
- package/bmad/bmb/workflows/edit-module/checklist.md +165 -0
- package/bmad/bmb/workflows/edit-module/instructions.md +339 -0
- package/bmad/bmb/workflows/edit-module/workflow.yaml +34 -0
- package/bmad/bmb/workflows/edit-workflow/README.md +119 -0
- package/bmad/bmb/workflows/edit-workflow/checklist.md +70 -0
- package/bmad/bmb/workflows/edit-workflow/instructions.md +342 -0
- package/bmad/bmb/workflows/edit-workflow/workflow.yaml +27 -0
- package/bmad/bmb/workflows/edit-workflow/workflow.yaml.bak +25 -0
- package/bmad/bmb/workflows/module-brief/README.md +264 -0
- package/bmad/bmb/workflows/module-brief/checklist.md +116 -0
- package/bmad/bmb/workflows/module-brief/instructions.md +267 -0
- package/bmad/bmb/workflows/module-brief/template.md +275 -0
- package/bmad/bmb/workflows/module-brief/workflow.yaml +29 -0
- package/bmad/bmb/workflows/module-brief/workflow.yaml.bak +27 -0
- package/bmad/bmb/workflows/redoc/README.md +87 -0
- package/bmad/bmb/workflows/redoc/checklist.md +99 -0
- package/bmad/bmb/workflows/redoc/instructions.md +265 -0
- package/bmad/bmb/workflows/redoc/workflow.yaml +32 -0
- package/bmad/bmb/workflows/redoc/workflow.yaml.bak +31 -0
- package/bmad/bmd/README.md +193 -0
- package/bmad/bmd/README.md.bak +193 -0
- package/bmad/bmd/agents/cli-chief-sidecar/instructions.md +102 -0
- package/bmad/bmd/agents/cli-chief-sidecar/instructions.md.bak +102 -0
- package/bmad/bmd/agents/cli-chief-sidecar/knowledge/README.md +68 -0
- package/bmad/bmd/agents/cli-chief-sidecar/knowledge/README.md.bak +68 -0
- package/bmad/bmd/agents/cli-chief-sidecar/knowledge/cli-reference.md +123 -0
- package/bmad/bmd/agents/cli-chief-sidecar/knowledge/cli-reference.md.bak +123 -0
- package/bmad/bmd/agents/cli-chief-sidecar/memories.md +53 -0
- package/bmad/bmd/agents/cli-chief-sidecar/memories.md.bak +53 -0
- package/bmad/bmd/agents/cli-chief.md +108 -0
- package/bmad/bmd/agents/cli-chief.md.bak +108 -0
- package/bmad/bmd/agents/doc-keeper-sidecar/instructions.md +177 -0
- package/bmad/bmd/agents/doc-keeper-sidecar/instructions.md.bak +177 -0
- package/bmad/bmd/agents/doc-keeper-sidecar/knowledge/README.md +81 -0
- package/bmad/bmd/agents/doc-keeper-sidecar/knowledge/README.md.bak +81 -0
- package/bmad/bmd/agents/doc-keeper-sidecar/memories.md +88 -0
- package/bmad/bmd/agents/doc-keeper-sidecar/memories.md.bak +88 -0
- package/bmad/bmd/agents/doc-keeper.md +115 -0
- package/bmad/bmd/agents/doc-keeper.md.bak +115 -0
- package/bmad/bmd/agents/release-chief-sidecar/instructions.md +164 -0
- package/bmad/bmd/agents/release-chief-sidecar/instructions.md.bak +164 -0
- package/bmad/bmd/agents/release-chief-sidecar/knowledge/README.md +82 -0
- package/bmad/bmd/agents/release-chief-sidecar/knowledge/README.md.bak +82 -0
- package/bmad/bmd/agents/release-chief-sidecar/memories.md +73 -0
- package/bmad/bmd/agents/release-chief-sidecar/memories.md.bak +73 -0
- package/bmad/bmd/agents/release-chief.md +109 -0
- package/bmad/bmd/agents/release-chief.md.bak +109 -0
- package/bmad/bmd/config.yaml +10 -0
- package/bmad/core/agents/bmad-master.md +71 -0
- package/bmad/core/agents/bmad-web-orchestrator.agent.xml +122 -0
- package/bmad/core/config.yaml +9 -0
- package/bmad/core/tasks/adv-elicit-methods.csv +39 -0
- package/bmad/core/tasks/adv-elicit.xml +104 -0
- package/bmad/core/tasks/index-docs.xml +65 -0
- package/bmad/core/tasks/validate-workflow.xml +89 -0
- package/bmad/core/tasks/workflow.xml +174 -0
- package/bmad/core/tools/shard-doc.xml +100 -0
- package/bmad/core/workflows/brainstorming/README.md +271 -0
- package/bmad/core/workflows/brainstorming/brain-methods.csv +36 -0
- package/bmad/core/workflows/brainstorming/instructions.md +314 -0
- package/bmad/core/workflows/brainstorming/template.md +102 -0
- package/bmad/core/workflows/brainstorming/workflow.yaml +43 -0
- package/bmad/core/workflows/party-mode/instructions.md +188 -0
- package/bmad/core/workflows/party-mode/workflow.yaml +23 -0
- package/bmad/docs/claude-code-instructions.md +25 -0
- package/bmad/docs/codex-instructions.md +21 -0
- package/bmd/README.md +193 -0
- package/bmd/agents/cli-chief-sidecar/instructions.md +102 -0
- package/bmd/agents/cli-chief-sidecar/knowledge/README.md +68 -0
- package/bmd/agents/cli-chief-sidecar/knowledge/cli-reference.md +123 -0
- package/bmd/agents/cli-chief-sidecar/memories.md +53 -0
- package/bmd/agents/cli-chief.agent.yaml +126 -0
- package/bmd/agents/doc-keeper-sidecar/instructions.md +177 -0
- package/bmd/agents/doc-keeper-sidecar/knowledge/README.md +81 -0
- package/bmd/agents/doc-keeper-sidecar/memories.md +88 -0
- package/bmd/agents/doc-keeper.agent.yaml +137 -0
- package/bmd/agents/release-chief-sidecar/instructions.md +164 -0
- package/bmd/agents/release-chief-sidecar/knowledge/README.md +82 -0
- package/bmd/agents/release-chief-sidecar/memories.md +73 -0
- package/bmd/agents/release-chief.agent.yaml +127 -0
- package/bmd/bmad-custom-module-installer-plan.md +1176 -0
- package/bmd/config.yaml +12 -0
- package/docs/bmad-brownfield-guide.md +1260 -0
- package/docs/conversion-report-shard-doc-2025-10-26.md +188 -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 +21 -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/opencode.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 +186 -0
- package/docs/installers-bundlers/installers-modules-platforms-reference.md +327 -0
- package/docs/installers-bundlers/web-bundler-usage.md +54 -0
- package/docs/v4-to-v6-upgrade.md +225 -0
- package/eslint.config.mjs +21 -9
- package/package.json +32 -36
- package/prettier.config.mjs +1 -1
- package/src/core/_module-installer/install-config.yaml +28 -0
- package/src/core/_module-installer/installer.js +68 -0
- package/src/core/agents/bmad-master.agent.yaml +39 -0
- package/src/core/agents/bmad-web-orchestrator.agent.xml +122 -0
- package/src/core/tasks/adv-elicit-methods.csv +39 -0
- package/src/core/tasks/adv-elicit.xml +104 -0
- package/src/core/tasks/index-docs.xml +65 -0
- package/src/core/tasks/validate-workflow.xml +89 -0
- package/src/core/tasks/workflow.xml +166 -0
- package/src/core/tools/shard-doc.xml +100 -0
- package/src/core/workflows/brainstorming/README.md +271 -0
- package/src/core/workflows/brainstorming/brain-methods.csv +36 -0
- package/src/core/workflows/brainstorming/instructions.md +314 -0
- package/src/core/workflows/brainstorming/template.md +102 -0
- package/src/core/workflows/brainstorming/workflow.yaml +43 -0
- package/src/core/workflows/party-mode/instructions.md +188 -0
- package/src/core/workflows/party-mode/workflow.yaml +23 -0
- package/src/modules/bmb/README.md +132 -0
- package/src/modules/bmb/_module-installer/install-config.yaml +26 -0
- package/src/modules/bmb/agents/bmad-builder.agent.yaml +58 -0
- package/src/modules/bmb/workflows/audit-workflow/checklist.md +143 -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 +262 -0
- package/src/modules/bmb/workflows/convert-legacy/checklist.md +205 -0
- package/src/modules/bmb/workflows/convert-legacy/instructions.md +377 -0
- package/src/modules/bmb/workflows/convert-legacy/workflow.yaml +34 -0
- package/src/modules/bmb/workflows/create-agent/README.md +320 -0
- package/src/modules/bmb/workflows/create-agent/agent-architecture.md +419 -0
- package/src/modules/bmb/workflows/create-agent/agent-command-patterns.md +759 -0
- package/src/modules/bmb/workflows/create-agent/agent-types.md +292 -0
- package/src/modules/bmb/workflows/create-agent/brainstorm-context.md +174 -0
- package/src/modules/bmb/workflows/create-agent/checklist.md +62 -0
- package/src/modules/bmb/workflows/create-agent/communication-styles.md +202 -0
- package/src/modules/bmb/workflows/create-agent/instructions.md +430 -0
- package/src/modules/bmb/workflows/create-agent/workflow.yaml +49 -0
- package/src/modules/bmb/workflows/create-module/README.md +220 -0
- package/src/modules/bmb/workflows/create-module/brainstorm-context.md +137 -0
- package/src/modules/bmb/workflows/create-module/checklist.md +244 -0
- 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 +231 -0
- package/src/modules/bmb/workflows/create-module/instructions.md +581 -0
- package/src/modules/bmb/workflows/create-module/module-structure.md +366 -0
- package/src/modules/bmb/workflows/create-module/workflow.yaml +44 -0
- package/src/modules/bmb/workflows/create-workflow/README.md +277 -0
- package/src/modules/bmb/workflows/create-workflow/brainstorm-context.md +197 -0
- package/src/modules/bmb/workflows/create-workflow/checklist.md +94 -0
- package/src/modules/bmb/workflows/create-workflow/instructions.md +716 -0
- package/src/modules/bmb/workflows/create-workflow/workflow-creation-guide.md +1150 -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 +13 -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 +65 -0
- package/src/modules/bmb/workflows/create-workflow/workflow.yaml +42 -0
- 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 +35 -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 +339 -0
- package/src/modules/bmb/workflows/edit-module/workflow.yaml +36 -0
- package/src/modules/bmb/workflows/edit-workflow/README.md +119 -0
- package/src/modules/bmb/workflows/edit-workflow/checklist.md +70 -0
- package/src/modules/bmb/workflows/edit-workflow/instructions.md +342 -0
- package/src/modules/bmb/workflows/edit-workflow/workflow.yaml +29 -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 +267 -0
- package/src/modules/bmb/workflows/module-brief/template.md +275 -0
- package/src/modules/bmb/workflows/module-brief/workflow.yaml +31 -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 +265 -0
- package/src/modules/bmb/workflows/redoc/workflow.yaml +34 -0
- package/src/modules/bmm/README.md +141 -0
- package/src/modules/bmm/_module-installer/assets/bmm-kb.md +1 -0
- package/src/modules/bmm/_module-installer/assets/technical-decisions.md +30 -0
- package/src/modules/bmm/_module-installer/install-config.yaml +74 -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.agent.yaml +43 -0
- package/src/modules/bmm/agents/architect.agent.yaml +41 -0
- package/src/modules/bmm/agents/dev.agent.yaml +43 -0
- package/src/modules/bmm/agents/game-architect.agent.yaml +35 -0
- package/src/modules/bmm/agents/game-designer.agent.yaml +47 -0
- package/src/modules/bmm/agents/game-dev.agent.yaml +39 -0
- package/src/modules/bmm/agents/pm.agent.yaml +50 -0
- package/src/modules/bmm/agents/sm.agent.yaml +67 -0
- package/src/modules/bmm/agents/tea.agent.yaml +59 -0
- package/src/modules/bmm/agents/ux-designer.agent.yaml +33 -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/bmad-analysis/api-documenter.md +102 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/bmad-analysis/codebase-analyzer.md +82 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/bmad-analysis/data-analyst.md +101 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/bmad-analysis/pattern-detector.md +84 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/bmad-planning/dependency-mapper.md +83 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/bmad-planning/epic-optimizer.md +81 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/bmad-planning/requirements-analyst.md +61 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/bmad-planning/technical-decisions-curator.md +168 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/bmad-planning/trend-spotter.md +115 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/bmad-planning/user-journey-mapper.md +123 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/bmad-planning/user-researcher.md +72 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/bmad-research/market-researcher.md +51 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/bmad-research/tech-debt-auditor.md +106 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/bmad-review/document-reviewer.md +102 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/bmad-review/technical-evaluator.md +68 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/bmad-review/test-coverage-analyzer.md +108 -0
- package/src/modules/bmm/tasks/daily-standup.xml +85 -0
- package/src/modules/bmm/tasks/retrospective.xml +104 -0
- package/src/modules/bmm/teams/team-fullstack.yaml +11 -0
- package/src/modules/bmm/teams/team-gamedev.yaml +14 -0
- package/src/modules/bmm/testarch/README.md +311 -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-game/README.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 +109 -0
- package/src/modules/bmm/workflows/1-analysis/brainstorm-game/workflow.yaml +41 -0
- package/src/modules/bmm/workflows/1-analysis/brainstorm-project/README.md +29 -0
- package/src/modules/bmm/workflows/1-analysis/brainstorm-project/instructions.md +91 -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 +39 -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 +357 -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 +44 -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 +321 -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 +43 -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 +433 -0
- package/src/modules/bmm/workflows/1-analysis/research/instructions-market.md +613 -0
- package/src/modules/bmm/workflows/1-analysis/research/instructions-router.md +125 -0
- package/src/modules/bmm/workflows/1-analysis/research/instructions-technical.md +501 -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 +49 -0
- package/src/modules/bmm/workflows/2-plan-workflows/README.md +258 -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 +1283 -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 +42 -0
- package/src/modules/bmm/workflows/2-plan-workflows/gdd/README.md +222 -0
- package/src/modules/bmm/workflows/2-plan-workflows/gdd/checklist.md +148 -0
- package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/action-platformer.md +45 -0
- package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/adventure.md +84 -0
- package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/card-game.md +76 -0
- package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/fighting.md +89 -0
- package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/horror.md +86 -0
- package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/idle-incremental.md +78 -0
- package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/metroidvania.md +87 -0
- package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/moba.md +74 -0
- package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/party-game.md +79 -0
- package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/puzzle.md +58 -0
- package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/racing.md +88 -0
- package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/rhythm.md +79 -0
- package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/roguelike.md +69 -0
- package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/rpg.md +70 -0
- package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/sandbox.md +79 -0
- package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/shooter.md +62 -0
- package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/simulation.md +73 -0
- package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/sports.md +75 -0
- package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/strategy.md +71 -0
- package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/survival.md +79 -0
- package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/text-based.md +91 -0
- package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/tower-defense.md +79 -0
- package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/turn-based-tactics.md +88 -0
- package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/visual-novel.md +89 -0
- package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types.csv +25 -0
- package/src/modules/bmm/workflows/2-plan-workflows/gdd/gdd-template.md +153 -0
- package/src/modules/bmm/workflows/2-plan-workflows/gdd/instructions-gdd.md +475 -0
- package/src/modules/bmm/workflows/2-plan-workflows/gdd/workflow.yaml +67 -0
- package/src/modules/bmm/workflows/2-plan-workflows/narrative/checklist.md +139 -0
- package/src/modules/bmm/workflows/2-plan-workflows/narrative/instructions-narrative.md +557 -0
- package/src/modules/bmm/workflows/2-plan-workflows/narrative/narrative-template.md +195 -0
- package/src/modules/bmm/workflows/2-plan-workflows/narrative/workflow.yaml +38 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/checklist.md +117 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/epics-template.md +63 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/instructions.md +449 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/prd-template.md +62 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/workflow.yaml +46 -0
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/checklist.md +107 -0
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/epics-template.md +11 -0
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/instructions-level0-story.md +167 -0
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/instructions-level1-stories.md +278 -0
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/instructions.md +269 -0
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/tech-spec-template.md +55 -0
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/user-story-template.md +56 -0
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/workflow.yaml +52 -0
- package/src/modules/bmm/workflows/3-solutioning/README.md +1 -0
- package/src/modules/bmm/workflows/3-solutioning/architecture/architecture-patterns.yaml +347 -0
- package/src/modules/bmm/workflows/3-solutioning/architecture/architecture-template.md +103 -0
- package/src/modules/bmm/workflows/3-solutioning/architecture/checklist.md +244 -0
- package/src/modules/bmm/workflows/3-solutioning/architecture/decision-catalog.yaml +222 -0
- package/src/modules/bmm/workflows/3-solutioning/architecture/instructions.md +703 -0
- package/src/modules/bmm/workflows/3-solutioning/architecture/pattern-categories.csv +13 -0
- package/src/modules/bmm/workflows/3-solutioning/architecture/readme.md +318 -0
- package/src/modules/bmm/workflows/3-solutioning/architecture/workflow.yaml +54 -0
- package/src/modules/bmm/workflows/3-solutioning/solutioning-gate-check/README.md +177 -0
- package/src/modules/bmm/workflows/3-solutioning/solutioning-gate-check/checklist.md +175 -0
- package/src/modules/bmm/workflows/3-solutioning/solutioning-gate-check/instructions.md +273 -0
- package/src/modules/bmm/workflows/3-solutioning/solutioning-gate-check/template.md +146 -0
- package/src/modules/bmm/workflows/3-solutioning/solutioning-gate-check/validation-criteria.yaml +189 -0
- package/src/modules/bmm/workflows/3-solutioning/solutioning-gate-check/workflow.yaml +40 -0
- package/src/modules/bmm/workflows/4-implementation/README.md +221 -0
- package/src/modules/bmm/workflows/4-implementation/code-review/README.md +69 -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 +391 -0
- package/src/modules/bmm/workflows/4-implementation/code-review/workflow.yaml +56 -0
- package/src/modules/bmm/workflows/4-implementation/correct-course/README.md +73 -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 +201 -0
- package/src/modules/bmm/workflows/4-implementation/correct-course/workflow.yaml +45 -0
- package/src/modules/bmm/workflows/4-implementation/create-story/README.md +129 -0
- package/src/modules/bmm/workflows/4-implementation/create-story/checklist.md +240 -0
- package/src/modules/bmm/workflows/4-implementation/create-story/instructions.md +252 -0
- package/src/modules/bmm/workflows/4-implementation/create-story/template.md +51 -0
- package/src/modules/bmm/workflows/4-implementation/create-story/workflow.yaml +49 -0
- package/src/modules/bmm/workflows/4-implementation/dev-story/AUDIT-REPORT.md +367 -0
- package/src/modules/bmm/workflows/4-implementation/dev-story/README.md +206 -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 +262 -0
- package/src/modules/bmm/workflows/4-implementation/dev-story/workflow.yaml +28 -0
- package/src/modules/bmm/workflows/4-implementation/epic-tech-context/README.md +195 -0
- 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 +160 -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 +34 -0
- package/src/modules/bmm/workflows/4-implementation/retrospective/README.md +77 -0
- package/src/modules/bmm/workflows/4-implementation/retrospective/instructions.md +479 -0
- package/src/modules/bmm/workflows/4-implementation/retrospective/workflow.yaml +45 -0
- package/src/modules/bmm/workflows/4-implementation/sprint-planning/README.md +156 -0
- package/src/modules/bmm/workflows/4-implementation/sprint-planning/checklist.md +33 -0
- package/src/modules/bmm/workflows/4-implementation/sprint-planning/instructions.md +221 -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 +41 -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 +201 -0
- package/src/modules/bmm/workflows/4-implementation/story-context/workflow.yaml +32 -0
- package/src/modules/bmm/workflows/4-implementation/story-done/instructions.md +111 -0
- package/src/modules/bmm/workflows/4-implementation/story-done/workflow.yaml +27 -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 +27 -0
- package/src/modules/bmm/workflows/README.md +577 -0
- package/src/modules/bmm/workflows/document-project/README.md +444 -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/README.md +38 -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 +36 -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/testarch/README.md +26 -0
- package/src/modules/bmm/workflows/testarch/atdd/README.md +672 -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 +54 -0
- package/src/modules/bmm/workflows/testarch/automate/README.md +869 -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 +63 -0
- package/src/modules/bmm/workflows/testarch/ci/README.md +493 -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 +55 -0
- package/src/modules/bmm/workflows/testarch/framework/README.md +340 -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 +55 -0
- package/src/modules/bmm/workflows/testarch/nfr-assess/README.md +469 -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 +58 -0
- package/src/modules/bmm/workflows/testarch/test-design/README.md +493 -0
- package/src/modules/bmm/workflows/testarch/test-design/checklist.md +234 -0
- package/src/modules/bmm/workflows/testarch/test-design/instructions.md +621 -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 +54 -0
- package/src/modules/bmm/workflows/testarch/test-review/README.md +775 -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 +55 -0
- package/src/modules/bmm/workflows/testarch/trace/README.md +802 -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 +68 -0
- package/src/modules/bmm/workflows/workflow-status/README.md +241 -0
- package/src/modules/bmm/workflows/workflow-status/init/instructions.md +297 -0
- package/src/modules/bmm/workflows/workflow-status/init/workflow.yaml +28 -0
- package/src/modules/bmm/workflows/workflow-status/instructions.md +324 -0
- package/src/modules/bmm/workflows/workflow-status/paths/brownfield-level-0.yaml +54 -0
- package/src/modules/bmm/workflows/workflow-status/paths/brownfield-level-1.yaml +58 -0
- package/src/modules/bmm/workflows/workflow-status/paths/brownfield-level-2.yaml +76 -0
- package/src/modules/bmm/workflows/workflow-status/paths/brownfield-level-3.yaml +95 -0
- package/src/modules/bmm/workflows/workflow-status/paths/brownfield-level-4.yaml +88 -0
- package/src/modules/bmm/workflows/workflow-status/paths/game-design.yaml +75 -0
- package/src/modules/bmm/workflows/workflow-status/paths/greenfield-level-0.yaml +45 -0
- package/src/modules/bmm/workflows/workflow-status/paths/greenfield-level-1.yaml +49 -0
- package/src/modules/bmm/workflows/workflow-status/paths/greenfield-level-2.yaml +78 -0
- package/src/modules/bmm/workflows/workflow-status/paths/greenfield-level-3.yaml +73 -0
- package/src/modules/bmm/workflows/workflow-status/paths/greenfield-level-4.yaml +75 -0
- package/src/modules/bmm/workflows/workflow-status/project-levels.yaml +59 -0
- package/src/modules/bmm/workflows/workflow-status/workflow-status-template.md +30 -0
- package/src/modules/bmm/workflows/workflow-status/workflow.yaml +30 -0
- package/src/modules/cis/_module-installer/install-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.agent.yaml +23 -0
- package/src/modules/cis/agents/creative-problem-solver.agent.yaml +23 -0
- package/src/modules/cis/agents/design-thinking-coach.agent.yaml +23 -0
- package/src/modules/cis/agents/innovation-strategist.agent.yaml +23 -0
- package/src/modules/cis/agents/storyteller.agent.yaml +23 -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/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 +43 -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 +43 -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 +43 -0
- package/src/modules/cis/workflows/storytelling/README.md +58 -0
- package/src/modules/cis/workflows/storytelling/instructions.md +283 -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 +43 -0
- package/src/utility/models/agent-activation-ide.xml +51 -0
- package/src/utility/models/agent-activation-web.xml +60 -0
- package/src/utility/models/agent-config-template.md +23 -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 +15 -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/persona/principles-as-string.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/unit-test-schema.js +133 -0
- package/tools/bmad-npx-wrapper.js +100 -13
- package/tools/cli/README.md +590 -0
- package/tools/cli/bmad-cli.js +40 -0
- package/tools/cli/bundlers/bundle-web.js +179 -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 +1479 -0
- package/tools/cli/commands/build.js +458 -0
- package/tools/cli/commands/install.js +82 -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 +590 -0
- package/tools/cli/installers/lib/core/dependency-resolver.js +725 -0
- package/tools/cli/installers/lib/core/detector.js +274 -0
- package/tools/cli/installers/lib/core/ide-config-manager.js +152 -0
- package/tools/cli/installers/lib/core/installer.js +2095 -0
- package/tools/cli/installers/lib/core/manifest-generator.js +776 -0
- package/tools/cli/installers/lib/core/manifest.js +536 -0
- package/tools/cli/installers/lib/ide/_base-ide.js +572 -0
- package/tools/cli/installers/lib/ide/auggie.js +336 -0
- package/tools/cli/installers/lib/ide/claude-code.js +449 -0
- package/tools/cli/installers/lib/ide/cline.js +223 -0
- package/tools/cli/installers/lib/ide/codex.js +234 -0
- package/tools/cli/installers/lib/ide/crush.js +276 -0
- package/tools/cli/installers/lib/ide/cursor.js +292 -0
- package/tools/cli/installers/lib/ide/gemini.js +156 -0
- package/tools/cli/installers/lib/ide/github-copilot.js +290 -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 +194 -0
- package/tools/cli/installers/lib/ide/opencode.js +213 -0
- package/tools/cli/installers/lib/ide/qwen.js +290 -0
- package/tools/cli/installers/lib/ide/roo.js +288 -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/task-tool-command-generator.js +119 -0
- package/tools/cli/installers/lib/ide/trae.js +278 -0
- package/tools/cli/installers/lib/ide/windsurf.js +201 -0
- package/tools/cli/installers/lib/ide/workflow-command-generator.js +235 -0
- package/tools/cli/installers/lib/ide/workflow-command-template.md +15 -0
- package/tools/cli/installers/lib/modules/manager.js +568 -0
- 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 +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 +591 -0
- package/tools/cli/lib/xml-handler.js +228 -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/lib/yaml-xml-builder.js +439 -0
- package/tools/cli/regenerate-manifests.js +28 -0
- package/tools/cli/test-yaml-builder.js +43 -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/format-workflow-md.js +263 -0
- package/tools/platform-codes.yaml +133 -0
- package/tools/schema/agent.js +231 -0
- package/tools/validate-agent-schema.js +110 -0
- package/tools/validate-bundles.js +87 -0
- package/v6-open-items.md +23 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -22
- 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/data/test-levels-framework.md +0 -146
- package/bmad-core/data/test-priorities-matrix.md +0 -172
- 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 -33
- 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,1479 @@
|
|
|
1
|
+
const path = require('node:path');
|
|
2
|
+
const fs = require('fs-extra');
|
|
3
|
+
const chalk = require('chalk');
|
|
4
|
+
const yaml = require('js-yaml');
|
|
5
|
+
const { DependencyResolver } = require('../installers/lib/core/dependency-resolver');
|
|
6
|
+
const { XmlHandler } = require('../lib/xml-handler');
|
|
7
|
+
const { YamlXmlBuilder } = require('../lib/yaml-xml-builder');
|
|
8
|
+
const { AgentPartyGenerator } = require('../lib/agent-party-generator');
|
|
9
|
+
const xml2js = require('xml2js');
|
|
10
|
+
const { getProjectRoot, getSourcePath, getModulePath } = require('../lib/project-root');
|
|
11
|
+
|
|
12
|
+
class WebBundler {
|
|
13
|
+
constructor(sourceDir = null, outputDir = 'web-bundles') {
|
|
14
|
+
this.sourceDir = sourceDir || getSourcePath();
|
|
15
|
+
this.outputDir = path.isAbsolute(outputDir) ? outputDir : path.join(getProjectRoot(), outputDir);
|
|
16
|
+
this.modulesPath = getSourcePath('modules');
|
|
17
|
+
this.utilityPath = getSourcePath('utility');
|
|
18
|
+
|
|
19
|
+
this.dependencyResolver = new DependencyResolver();
|
|
20
|
+
this.xmlHandler = new XmlHandler();
|
|
21
|
+
this.yamlBuilder = new YamlXmlBuilder();
|
|
22
|
+
|
|
23
|
+
// Cache for resolved dependencies to avoid duplicates
|
|
24
|
+
this.dependencyCache = new Map();
|
|
25
|
+
|
|
26
|
+
// Discovered agents and teams for manifest generation
|
|
27
|
+
this.discoveredAgents = [];
|
|
28
|
+
this.discoveredTeams = [];
|
|
29
|
+
|
|
30
|
+
// Temporary directory for generated manifests
|
|
31
|
+
this.tempDir = path.join(process.cwd(), '.bundler-temp');
|
|
32
|
+
this.tempManifestDir = path.join(this.tempDir, 'bmad', '_cfg');
|
|
33
|
+
|
|
34
|
+
// Bundle statistics
|
|
35
|
+
this.stats = {
|
|
36
|
+
totalAgents: 0,
|
|
37
|
+
bundledAgents: 0,
|
|
38
|
+
skippedAgents: 0,
|
|
39
|
+
failedAgents: 0,
|
|
40
|
+
invalidXml: 0,
|
|
41
|
+
warnings: [],
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Main entry point to bundle all modules
|
|
47
|
+
*/
|
|
48
|
+
async bundleAll() {
|
|
49
|
+
console.log(chalk.cyan.bold('═══════════════════════════════════════════════'));
|
|
50
|
+
console.log(chalk.cyan.bold(' 🚀 Web Bundle Generation'));
|
|
51
|
+
console.log(chalk.cyan.bold('═══════════════════════════════════════════════\n'));
|
|
52
|
+
|
|
53
|
+
try {
|
|
54
|
+
// Pre-discover all modules to generate complete manifests
|
|
55
|
+
const modules = await this.discoverModules();
|
|
56
|
+
for (const module of modules) {
|
|
57
|
+
await this.preDiscoverModule(module);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Create temporary manifest files
|
|
61
|
+
await this.createTempManifests();
|
|
62
|
+
|
|
63
|
+
// Process all modules
|
|
64
|
+
for (const module of modules) {
|
|
65
|
+
await this.bundleModule(module);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Display summary
|
|
69
|
+
this.displaySummary();
|
|
70
|
+
} finally {
|
|
71
|
+
// Clean up temp files
|
|
72
|
+
await this.cleanupTempFiles();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Bundle a specific module
|
|
78
|
+
*/
|
|
79
|
+
async bundleModule(moduleName) {
|
|
80
|
+
const modulePath = path.join(this.modulesPath, moduleName);
|
|
81
|
+
|
|
82
|
+
if (!(await fs.pathExists(modulePath))) {
|
|
83
|
+
console.log(chalk.yellow(`Module ${moduleName} not found`));
|
|
84
|
+
return { module: moduleName, agents: [], teams: [] };
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
console.log(chalk.bold(`\n📦 Bundling module: ${moduleName}`));
|
|
88
|
+
|
|
89
|
+
const results = {
|
|
90
|
+
module: moduleName,
|
|
91
|
+
agents: [],
|
|
92
|
+
teams: [],
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
// Pre-discover all agents and teams for manifest generation
|
|
96
|
+
await this.preDiscoverModule(moduleName);
|
|
97
|
+
|
|
98
|
+
// Ensure temp manifests exist (might not exist if called directly)
|
|
99
|
+
if (!(await fs.pathExists(this.tempManifestDir))) {
|
|
100
|
+
await this.createTempManifests();
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Process agents
|
|
104
|
+
const agents = await this.discoverAgents(modulePath);
|
|
105
|
+
for (const agent of agents) {
|
|
106
|
+
try {
|
|
107
|
+
await this.bundleAgent(moduleName, agent, false); // false = don't track again
|
|
108
|
+
results.agents.push(agent);
|
|
109
|
+
} catch (error) {
|
|
110
|
+
console.error(` Failed to bundle agent ${agent}:`, error.message);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Process teams
|
|
115
|
+
const teams = await this.discoverTeams(modulePath);
|
|
116
|
+
for (const team of teams) {
|
|
117
|
+
try {
|
|
118
|
+
await this.bundleTeam(moduleName, team);
|
|
119
|
+
results.teams.push(team);
|
|
120
|
+
} catch (error) {
|
|
121
|
+
console.error(` Failed to bundle team ${team}:`, error.message);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
return results;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Bundle a single agent
|
|
130
|
+
*/
|
|
131
|
+
async bundleAgent(moduleName, agentFile, shouldTrack = true) {
|
|
132
|
+
const agentName = agentFile.endsWith('.agent.yaml') ? path.basename(agentFile, '.agent.yaml') : path.basename(agentFile, '.md');
|
|
133
|
+
this.stats.totalAgents++;
|
|
134
|
+
|
|
135
|
+
console.log(chalk.dim(` → Processing: ${agentName}`));
|
|
136
|
+
|
|
137
|
+
const agentPath = path.join(this.modulesPath, moduleName, 'agents', agentFile);
|
|
138
|
+
|
|
139
|
+
// Check if agent file exists
|
|
140
|
+
if (!(await fs.pathExists(agentPath))) {
|
|
141
|
+
this.stats.failedAgents++;
|
|
142
|
+
console.log(chalk.red(` ✗ Agent file not found`));
|
|
143
|
+
throw new Error(`Agent file not found: ${agentPath}`);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
let content;
|
|
147
|
+
let agentXml;
|
|
148
|
+
|
|
149
|
+
// Handle YAML agents - build in-memory to XML
|
|
150
|
+
if (agentFile.endsWith('.agent.yaml')) {
|
|
151
|
+
// Build agent from YAML (no customize file for web bundles)
|
|
152
|
+
const xmlContent = await this.yamlBuilder.buildFromYaml(agentPath, null, {
|
|
153
|
+
includeMetadata: false, // Don't include build metadata in web bundles
|
|
154
|
+
forWebBundle: true, // Use web-specific activation fragments
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
content = xmlContent;
|
|
158
|
+
agentXml = this.extractAgentXml(xmlContent);
|
|
159
|
+
} else {
|
|
160
|
+
// Legacy MD format - read and extract XML
|
|
161
|
+
content = await fs.readFile(agentPath, 'utf8');
|
|
162
|
+
agentXml = this.extractAgentXml(content);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
if (!agentXml) {
|
|
166
|
+
this.stats.failedAgents++;
|
|
167
|
+
console.log(chalk.red(` ✗ No agent XML found in ${agentFile}`));
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// Check if agent has bundle="false" attribute
|
|
172
|
+
if (this.shouldSkipBundling(agentXml)) {
|
|
173
|
+
this.stats.skippedAgents++;
|
|
174
|
+
console.log(chalk.gray(` ⊘ Skipped (bundle="false")`));
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// Process {project-root} references in agent XML
|
|
179
|
+
agentXml = this.processProjectRootReferences(agentXml);
|
|
180
|
+
|
|
181
|
+
// Track for manifest generation BEFORE generating manifests (if not pre-discovered)
|
|
182
|
+
if (shouldTrack) {
|
|
183
|
+
const agentDetails = AgentPartyGenerator.extractAgentDetails(content, moduleName, agentName);
|
|
184
|
+
if (agentDetails) {
|
|
185
|
+
this.discoveredAgents.push(agentDetails);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// Resolve dependencies with warning tracking
|
|
190
|
+
const dependencyWarnings = [];
|
|
191
|
+
const { dependencies, skippedWorkflows } = await this.resolveAgentDependencies(agentXml, moduleName, dependencyWarnings);
|
|
192
|
+
|
|
193
|
+
if (dependencyWarnings.length > 0) {
|
|
194
|
+
this.stats.warnings.push({ agent: agentName, warnings: dependencyWarnings });
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// Remove commands for skipped workflows from agent XML
|
|
198
|
+
if (skippedWorkflows.length > 0) {
|
|
199
|
+
agentXml = this.removeSkippedWorkflowCommands(agentXml, skippedWorkflows);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// Build the bundle (no manifests for individual agents)
|
|
203
|
+
const bundle = this.buildAgentBundle(agentXml, dependencies);
|
|
204
|
+
|
|
205
|
+
// Validate XML
|
|
206
|
+
const isValid = await this.validateXml(bundle);
|
|
207
|
+
if (!isValid) {
|
|
208
|
+
this.stats.invalidXml++;
|
|
209
|
+
console.log(chalk.red(` ⚠ Invalid XML generated!`));
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// Write bundle to output
|
|
213
|
+
const outputPath = path.join(this.outputDir, moduleName, 'agents', `${agentName}.xml`);
|
|
214
|
+
await fs.ensureDir(path.dirname(outputPath));
|
|
215
|
+
await fs.writeFile(outputPath, bundle, 'utf8');
|
|
216
|
+
|
|
217
|
+
this.stats.bundledAgents++;
|
|
218
|
+
const statusIcon = isValid ? chalk.green('✓') : chalk.yellow('⚠');
|
|
219
|
+
console.log(` ${statusIcon} Bundled: ${agentName}.xml${isValid ? '' : chalk.yellow(' (invalid XML)')}`);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Bundle a team - includes orchestrator and all agents with their dependencies
|
|
224
|
+
*/
|
|
225
|
+
async bundleTeam(moduleName, teamFile) {
|
|
226
|
+
const teamName = path.basename(teamFile, path.extname(teamFile));
|
|
227
|
+
console.log(chalk.dim(` → Processing team: ${teamName}`));
|
|
228
|
+
|
|
229
|
+
const teamPath = path.join(this.modulesPath, moduleName, 'teams', teamFile);
|
|
230
|
+
|
|
231
|
+
// Check if team file exists
|
|
232
|
+
if (!(await fs.pathExists(teamPath))) {
|
|
233
|
+
console.log(chalk.red(` ✗ Team file not found`));
|
|
234
|
+
throw new Error(`Team file not found: ${teamPath}`);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// Read and parse team YAML
|
|
238
|
+
const teamContent = await fs.readFile(teamPath, 'utf8');
|
|
239
|
+
const teamConfig = yaml.load(teamContent);
|
|
240
|
+
|
|
241
|
+
if (!teamConfig || !teamConfig.bundle) {
|
|
242
|
+
console.log(chalk.red(` ✗ Invalid team configuration`));
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// Start building the team bundle
|
|
247
|
+
const dependencies = new Map();
|
|
248
|
+
const processed = new Set();
|
|
249
|
+
const allAgentXmls = [];
|
|
250
|
+
const warnings = [];
|
|
251
|
+
|
|
252
|
+
// 1. First, always add the bmad-web-orchestrator (XML file only, no transformation needed)
|
|
253
|
+
const orchestratorXmlPath = path.join(this.sourceDir, 'core', 'agents', 'bmad-web-orchestrator.agent.xml');
|
|
254
|
+
|
|
255
|
+
if (await fs.pathExists(orchestratorXmlPath)) {
|
|
256
|
+
// Read the XML file directly - no transformation needed
|
|
257
|
+
const xmlContent = await fs.readFile(orchestratorXmlPath, 'utf8');
|
|
258
|
+
let orchestratorXml = xmlContent.trim();
|
|
259
|
+
|
|
260
|
+
// Process {project-root} references
|
|
261
|
+
orchestratorXml = this.processProjectRootReferences(orchestratorXml);
|
|
262
|
+
|
|
263
|
+
// Inject help/exit menu items only (orchestrator has its own activation)
|
|
264
|
+
orchestratorXml = this.injectHelpExitMenuItems(orchestratorXml);
|
|
265
|
+
|
|
266
|
+
// Resolve orchestrator dependencies
|
|
267
|
+
const { dependencies: orchDeps } = await this.resolveAgentDependencies(orchestratorXml, 'core', warnings);
|
|
268
|
+
|
|
269
|
+
// Merge orchestrator dependencies
|
|
270
|
+
for (const [id, content] of orchDeps) {
|
|
271
|
+
if (!dependencies.has(id)) {
|
|
272
|
+
dependencies.set(id, content);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// Add orchestrator XML first
|
|
277
|
+
allAgentXmls.push(orchestratorXml);
|
|
278
|
+
console.log(chalk.gray(` + Added orchestrator: bmad-web-orchestrator`));
|
|
279
|
+
} else {
|
|
280
|
+
console.log(chalk.yellow(` ⚠ Orchestrator not found at: ${orchestratorXmlPath}`));
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
// 2. Determine which agents to include
|
|
284
|
+
let agentsToBundle = [];
|
|
285
|
+
|
|
286
|
+
if (teamConfig.agents === '*' || (Array.isArray(teamConfig.agents) && teamConfig.agents.includes('*'))) {
|
|
287
|
+
// Include all agents from the module
|
|
288
|
+
const agentsPath = path.join(this.modulesPath, moduleName, 'agents');
|
|
289
|
+
if (await fs.pathExists(agentsPath)) {
|
|
290
|
+
const agentFiles = await fs.readdir(agentsPath);
|
|
291
|
+
agentsToBundle = agentFiles
|
|
292
|
+
.filter((file) => file.endsWith('.agent.yaml') || (file.endsWith('.md') && !file.toLowerCase().includes('readme')))
|
|
293
|
+
.map((file) => file.replace(/\.(agent\.yaml|md)$/, ''));
|
|
294
|
+
}
|
|
295
|
+
} else if (Array.isArray(teamConfig.agents)) {
|
|
296
|
+
// Include specific agents listed
|
|
297
|
+
agentsToBundle = teamConfig.agents;
|
|
298
|
+
} else {
|
|
299
|
+
console.log(chalk.yellow(` ⚠ No agents specified in team configuration`));
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
// 3. Process each agent and their dependencies
|
|
303
|
+
for (const agentName of agentsToBundle) {
|
|
304
|
+
// Try YAML first, then MD
|
|
305
|
+
let agentPath = path.join(this.modulesPath, moduleName, 'agents', `${agentName}.agent.yaml`);
|
|
306
|
+
let isYaml = await fs.pathExists(agentPath);
|
|
307
|
+
|
|
308
|
+
if (!isYaml) {
|
|
309
|
+
agentPath = path.join(this.modulesPath, moduleName, 'agents', `${agentName}.md`);
|
|
310
|
+
if (!(await fs.pathExists(agentPath))) {
|
|
311
|
+
console.log(chalk.yellow(` ⚠ Agent not found: ${agentName}`));
|
|
312
|
+
continue;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
let agentXml;
|
|
317
|
+
|
|
318
|
+
if (isYaml) {
|
|
319
|
+
// Build YAML agent in-memory - skip activation for team agents (orchestrator handles it)
|
|
320
|
+
const xmlContent = await this.yamlBuilder.buildFromYaml(agentPath, null, {
|
|
321
|
+
includeMetadata: false,
|
|
322
|
+
skipActivation: true, // Skip activation for team agents
|
|
323
|
+
});
|
|
324
|
+
agentXml = this.extractAgentXml(xmlContent);
|
|
325
|
+
} else {
|
|
326
|
+
// Read legacy MD agent
|
|
327
|
+
const agentContent = await fs.readFile(agentPath, 'utf8');
|
|
328
|
+
agentXml = this.extractAgentXml(agentContent);
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
if (!agentXml) {
|
|
332
|
+
console.log(chalk.yellow(` ⚠ No XML found in agent: ${agentName}`));
|
|
333
|
+
continue;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
// Skip agents with bundle="false"
|
|
337
|
+
if (this.shouldSkipBundling(agentXml)) {
|
|
338
|
+
console.log(chalk.gray(` ⊘ Skipped agent (bundle="false"): ${agentName}`));
|
|
339
|
+
continue;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
// Process {project-root} references
|
|
343
|
+
agentXml = this.processProjectRootReferences(agentXml);
|
|
344
|
+
|
|
345
|
+
// Resolve agent dependencies
|
|
346
|
+
const agentWarnings = [];
|
|
347
|
+
const { dependencies: agentDeps, skippedWorkflows } = await this.resolveAgentDependencies(agentXml, moduleName, agentWarnings);
|
|
348
|
+
|
|
349
|
+
if (agentWarnings.length > 0) {
|
|
350
|
+
warnings.push({ agent: agentName, warnings: agentWarnings });
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
// Remove commands for skipped workflows from agent XML
|
|
354
|
+
if (skippedWorkflows.length > 0) {
|
|
355
|
+
agentXml = this.removeSkippedWorkflowCommands(agentXml, skippedWorkflows);
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
// Merge agent dependencies (deduplicate)
|
|
359
|
+
for (const [id, content] of agentDeps) {
|
|
360
|
+
if (!dependencies.has(id)) {
|
|
361
|
+
dependencies.set(id, content);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
// Skip web activation injection for team agents - orchestrator handles everything
|
|
366
|
+
// Only inject help/exit menu items if missing
|
|
367
|
+
agentXml = this.injectHelpExitMenuItems(agentXml);
|
|
368
|
+
|
|
369
|
+
// Add agent XML to the collection
|
|
370
|
+
allAgentXmls.push(agentXml);
|
|
371
|
+
console.log(chalk.gray(` + Added agent: ${agentName}`));
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
// 4. Build the team bundle XML
|
|
375
|
+
const bundle = this.buildTeamBundle(teamConfig.bundle, allAgentXmls, dependencies);
|
|
376
|
+
|
|
377
|
+
// 5. Validate XML
|
|
378
|
+
const isValid = await this.validateXml(bundle);
|
|
379
|
+
if (!isValid) {
|
|
380
|
+
console.log(chalk.red(` ⚠ Invalid XML generated for team!`));
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
// 6. Write bundle to output
|
|
384
|
+
const outputPath = path.join(this.outputDir, moduleName, 'teams', `${teamName}.xml`);
|
|
385
|
+
await fs.ensureDir(path.dirname(outputPath));
|
|
386
|
+
await fs.writeFile(outputPath, bundle, 'utf8');
|
|
387
|
+
|
|
388
|
+
const statusIcon = isValid ? chalk.green('✓') : chalk.yellow('⚠');
|
|
389
|
+
console.log(` ${statusIcon} Bundled team: ${teamName}.xml${isValid ? '' : chalk.yellow(' (invalid XML)')}`);
|
|
390
|
+
|
|
391
|
+
// Track warnings
|
|
392
|
+
if (warnings.length > 0) {
|
|
393
|
+
this.stats.warnings.push(...warnings);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
/**
|
|
398
|
+
* Build the final team bundle XML
|
|
399
|
+
*/
|
|
400
|
+
buildTeamBundle(teamMetadata, agentXmls, dependencies) {
|
|
401
|
+
const parts = ['<?xml version="1.0" encoding="UTF-8"?>', '<team-bundle>', ' <!-- Agent Definitions -->', ' <agents>'];
|
|
402
|
+
|
|
403
|
+
for (const agentXml of agentXmls) {
|
|
404
|
+
// Indent each agent XML properly (add 4 spaces to each line)
|
|
405
|
+
const indentedAgent = agentXml
|
|
406
|
+
.split('\n')
|
|
407
|
+
.map((line) => ' ' + line)
|
|
408
|
+
.join('\n');
|
|
409
|
+
parts.push(indentedAgent);
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
parts.push(' </agents>');
|
|
413
|
+
|
|
414
|
+
// Add all dependencies
|
|
415
|
+
if (dependencies && dependencies.size > 0) {
|
|
416
|
+
parts.push('', ' <!-- Shared Dependencies -->', ' <dependencies>');
|
|
417
|
+
|
|
418
|
+
for (const [id, content] of dependencies) {
|
|
419
|
+
// All dependencies are now consistently wrapped in <file> elements
|
|
420
|
+
// Indent properly (add 4 spaces to each line)
|
|
421
|
+
const indentedContent = content
|
|
422
|
+
.split('\n')
|
|
423
|
+
.map((line) => ' ' + line)
|
|
424
|
+
.join('\n');
|
|
425
|
+
parts.push(indentedContent);
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
parts.push(' </dependencies>');
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
parts.push('</team-bundle>');
|
|
432
|
+
|
|
433
|
+
return parts.join('\n');
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
/**
|
|
437
|
+
* Pre-discover all agents and teams in a module for manifest generation
|
|
438
|
+
*/
|
|
439
|
+
async preDiscoverModule(moduleName) {
|
|
440
|
+
const modulePath = path.join(this.modulesPath, moduleName);
|
|
441
|
+
|
|
442
|
+
// Clear any previously discovered agents for this module
|
|
443
|
+
this.discoveredAgents = this.discoveredAgents.filter((a) => a.module !== moduleName);
|
|
444
|
+
|
|
445
|
+
// Discover agents
|
|
446
|
+
const agentsPath = path.join(modulePath, 'agents');
|
|
447
|
+
if (await fs.pathExists(agentsPath)) {
|
|
448
|
+
const files = await fs.readdir(agentsPath);
|
|
449
|
+
for (const file of files) {
|
|
450
|
+
if (file.endsWith('.agent.yaml') || (file.endsWith('.md') && !file.toLowerCase().includes('readme'))) {
|
|
451
|
+
const agentPath = path.join(agentsPath, file);
|
|
452
|
+
let content;
|
|
453
|
+
|
|
454
|
+
if (file.endsWith('.agent.yaml')) {
|
|
455
|
+
// Build YAML agent in-memory
|
|
456
|
+
content = await this.yamlBuilder.buildFromYaml(agentPath, null, {
|
|
457
|
+
includeMetadata: false,
|
|
458
|
+
});
|
|
459
|
+
} else {
|
|
460
|
+
// Read legacy MD agent
|
|
461
|
+
content = await fs.readFile(agentPath, 'utf8');
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
const agentXml = this.extractAgentXml(content);
|
|
465
|
+
|
|
466
|
+
if (agentXml) {
|
|
467
|
+
// Skip agents with bundle="false"
|
|
468
|
+
if (this.shouldSkipBundling(agentXml)) {
|
|
469
|
+
continue;
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
const agentName = file.endsWith('.agent.yaml') ? path.basename(file, '.agent.yaml') : path.basename(file, '.md');
|
|
473
|
+
// Use the shared generator to extract agent details (pass full content)
|
|
474
|
+
const agentDetails = AgentPartyGenerator.extractAgentDetails(content, moduleName, agentName);
|
|
475
|
+
if (agentDetails) {
|
|
476
|
+
this.discoveredAgents.push(agentDetails);
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
// TODO: Discover teams when implemented
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
/**
|
|
487
|
+
* Extract agent XML from markdown content
|
|
488
|
+
*/
|
|
489
|
+
extractAgentXml(content) {
|
|
490
|
+
// Try 4 backticks first (can contain 3 backtick blocks inside)
|
|
491
|
+
let match = content.match(/````xml\s*([\s\S]*?)````/);
|
|
492
|
+
if (!match) {
|
|
493
|
+
// Fall back to 3 backticks if no 4-backtick block found
|
|
494
|
+
match = content.match(/```xml\s*([\s\S]*?)```/);
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
if (match) {
|
|
498
|
+
const xmlContent = match[1];
|
|
499
|
+
const agentMatch = xmlContent.match(/<agent[^>]*>[\s\S]*?<\/agent>/);
|
|
500
|
+
return agentMatch ? agentMatch[0] : null;
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
// Fall back to direct extraction
|
|
504
|
+
match = content.match(/<agent[^>]*>[\s\S]*?<\/agent>/);
|
|
505
|
+
return match ? match[0] : null;
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
/**
|
|
509
|
+
* Resolve all dependencies for an agent
|
|
510
|
+
*/
|
|
511
|
+
async resolveAgentDependencies(agentXml, moduleName, warnings = []) {
|
|
512
|
+
const dependencies = new Map();
|
|
513
|
+
const processed = new Set();
|
|
514
|
+
const skippedWorkflows = [];
|
|
515
|
+
|
|
516
|
+
// Extract file references from agent XML
|
|
517
|
+
const { refs, workflowRefs } = this.extractFileReferences(agentXml);
|
|
518
|
+
|
|
519
|
+
// Process regular file references
|
|
520
|
+
for (const ref of refs) {
|
|
521
|
+
await this.processFileDependency(ref, dependencies, processed, moduleName, warnings);
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
// Process workflow references with special handling
|
|
525
|
+
for (const workflowRef of workflowRefs) {
|
|
526
|
+
const result = await this.processWorkflowDependency(workflowRef, dependencies, processed, moduleName, warnings);
|
|
527
|
+
if (result && result.skipped) {
|
|
528
|
+
skippedWorkflows.push(workflowRef);
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
return { dependencies, skippedWorkflows };
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
/**
|
|
536
|
+
* Extract file references from agent XML
|
|
537
|
+
*/
|
|
538
|
+
extractFileReferences(xml) {
|
|
539
|
+
const refs = new Set();
|
|
540
|
+
const workflowRefs = new Set();
|
|
541
|
+
|
|
542
|
+
// Match various file reference patterns
|
|
543
|
+
const patterns = [
|
|
544
|
+
/exec="([^"]+)"/g, // Command exec paths
|
|
545
|
+
/tmpl="([^"]+)"/g, // Template paths
|
|
546
|
+
/data="([^"]+)"/g, // Data file paths
|
|
547
|
+
/file="([^"]+)"/g, // Generic file refs
|
|
548
|
+
/src="([^"]+)"/g, // Source paths
|
|
549
|
+
/system-prompts="([^"]+)"/g,
|
|
550
|
+
/tools="([^"]+)"/g,
|
|
551
|
+
/knowledge="([^"]+)"/g,
|
|
552
|
+
/{project-root}\/([^"'\s<>]+)/g,
|
|
553
|
+
];
|
|
554
|
+
|
|
555
|
+
for (const pattern of patterns) {
|
|
556
|
+
let match;
|
|
557
|
+
while ((match = pattern.exec(xml)) !== null) {
|
|
558
|
+
let filePath = match[1];
|
|
559
|
+
// Remove {project-root} prefix if present
|
|
560
|
+
filePath = filePath.replace(/^{project-root}\//, '');
|
|
561
|
+
|
|
562
|
+
// Skip obvious placeholder/example paths
|
|
563
|
+
if (filePath && !filePath.includes('path/to/') && !filePath.includes('example')) {
|
|
564
|
+
refs.add(filePath);
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
// Extract workflow references - both 'workflow' and 'run-workflow' attributes
|
|
570
|
+
const workflowPatterns = [
|
|
571
|
+
/workflow="([^"]+)"/g, // Menu items with workflow attribute
|
|
572
|
+
/run-workflow="([^"]+)"/g, // Commands with run-workflow attribute
|
|
573
|
+
/validate-workflow="([^"]+)"/g, // Validation workflow references
|
|
574
|
+
];
|
|
575
|
+
|
|
576
|
+
for (const pattern of workflowPatterns) {
|
|
577
|
+
let match;
|
|
578
|
+
while ((match = pattern.exec(xml)) !== null) {
|
|
579
|
+
let workflowPath = match[1];
|
|
580
|
+
workflowPath = workflowPath.replace(/^{project-root}\//, '');
|
|
581
|
+
|
|
582
|
+
// Skip obvious placeholder/example paths
|
|
583
|
+
if (workflowPath && workflowPath.endsWith('.yaml') && !workflowPath.includes('path/to/') && !workflowPath.includes('example')) {
|
|
584
|
+
workflowRefs.add(workflowPath);
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
return { refs: [...refs], workflowRefs: [...workflowRefs] };
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
/**
|
|
593
|
+
* Remove commands from agent XML that reference skipped workflows
|
|
594
|
+
*/
|
|
595
|
+
removeSkippedWorkflowCommands(agentXml, skippedWorkflows) {
|
|
596
|
+
let modifiedXml = agentXml;
|
|
597
|
+
|
|
598
|
+
// For each skipped workflow, find and remove the corresponding <c> command
|
|
599
|
+
for (const workflowPath of skippedWorkflows) {
|
|
600
|
+
// Match: <c cmd="..." run-workflow="workflowPath">...</c>
|
|
601
|
+
// Need to escape special regex characters in the path
|
|
602
|
+
const escapedPath = workflowPath.replaceAll(/[.*+?^${}()|[\]\\]/g, String.raw`\$&`);
|
|
603
|
+
|
|
604
|
+
// Pattern to match the command line with this workflow
|
|
605
|
+
const pattern = new RegExp(`\\s*<c\\s+cmd="[^"]*"\\s+run-workflow="[^"]*${escapedPath}"[^>]*>.*?</c>\\s*`, 'gs');
|
|
606
|
+
|
|
607
|
+
modifiedXml = modifiedXml.replace(pattern, '');
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
return modifiedXml;
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
/**
|
|
614
|
+
* Process a file dependency recursively
|
|
615
|
+
*/
|
|
616
|
+
async processFileDependency(filePath, dependencies, processed, moduleName, warnings = []) {
|
|
617
|
+
// Skip if already processed
|
|
618
|
+
if (processed.has(filePath)) {
|
|
619
|
+
return;
|
|
620
|
+
}
|
|
621
|
+
processed.add(filePath);
|
|
622
|
+
|
|
623
|
+
// Skip agent-manifest.csv manifest for web bundles (agents are already bundled)
|
|
624
|
+
if (filePath === 'bmad/_cfg/agent-manifest.csv' || filePath.endsWith('/agent-manifest.csv')) {
|
|
625
|
+
return;
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
// Handle wildcard patterns
|
|
629
|
+
if (filePath.includes('*')) {
|
|
630
|
+
await this.processWildcardDependency(filePath, dependencies, processed, moduleName, warnings);
|
|
631
|
+
return;
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
// Resolve actual file path
|
|
635
|
+
const actualPath = this.resolveFilePath(filePath, moduleName);
|
|
636
|
+
|
|
637
|
+
if (!actualPath || !(await fs.pathExists(actualPath))) {
|
|
638
|
+
warnings.push(filePath);
|
|
639
|
+
return;
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
// Read file content
|
|
643
|
+
let content = await fs.readFile(actualPath, 'utf8');
|
|
644
|
+
|
|
645
|
+
// Process {project-root} references
|
|
646
|
+
content = this.processProjectRootReferences(content);
|
|
647
|
+
|
|
648
|
+
// Extract dependencies from frontmatter if present
|
|
649
|
+
const frontmatterMatch = content.match(/^---\s*\n([\s\S]*?)\n---/);
|
|
650
|
+
if (frontmatterMatch) {
|
|
651
|
+
const frontmatter = frontmatterMatch[1];
|
|
652
|
+
// Look for dependencies in frontmatter
|
|
653
|
+
const depMatch = frontmatter.match(/dependencies:\s*\[(.*?)\]/);
|
|
654
|
+
if (depMatch) {
|
|
655
|
+
const deps = depMatch[1].match(/['"]([^'"]+)['"]/g);
|
|
656
|
+
if (deps) {
|
|
657
|
+
for (const dep of deps) {
|
|
658
|
+
const depPath = dep.replaceAll(/['"]/g, '').replace(/^{project-root}\//, '');
|
|
659
|
+
if (depPath && !processed.has(depPath)) {
|
|
660
|
+
await this.processFileDependency(depPath, dependencies, processed, moduleName, warnings);
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
// Look for template references
|
|
666
|
+
const templateMatch = frontmatter.match(/template:\s*\[(.*?)\]/);
|
|
667
|
+
if (templateMatch) {
|
|
668
|
+
const templates = templateMatch[1].match(/['"]([^'"]+)['"]/g);
|
|
669
|
+
if (templates) {
|
|
670
|
+
for (const template of templates) {
|
|
671
|
+
const templatePath = template.replaceAll(/['"]/g, '').replace(/^{project-root}\//, '');
|
|
672
|
+
if (templatePath && !processed.has(templatePath)) {
|
|
673
|
+
await this.processFileDependency(templatePath, dependencies, processed, moduleName, warnings);
|
|
674
|
+
}
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
// Extract XML from markdown if applicable
|
|
681
|
+
const ext = path.extname(actualPath).toLowerCase();
|
|
682
|
+
let processedContent = content;
|
|
683
|
+
|
|
684
|
+
switch (ext) {
|
|
685
|
+
case '.md': {
|
|
686
|
+
// Try to extract XML from markdown - handle both 3 and 4 backtick blocks
|
|
687
|
+
// First try 4 backticks (which can contain 3 backtick blocks inside)
|
|
688
|
+
let xmlMatches = [...content.matchAll(/````xml\s*([\s\S]*?)````/g)];
|
|
689
|
+
|
|
690
|
+
// If no 4-backtick blocks, try 3 backticks
|
|
691
|
+
if (xmlMatches.length === 0) {
|
|
692
|
+
xmlMatches = [...content.matchAll(/```xml\s*([\s\S]*?)```/g)];
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
const xmlBlocks = [];
|
|
696
|
+
|
|
697
|
+
for (const match of xmlMatches) {
|
|
698
|
+
if (match[1]) {
|
|
699
|
+
xmlBlocks.push(match[1].trim());
|
|
700
|
+
}
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
if (xmlBlocks.length > 0) {
|
|
704
|
+
// For XML content, just include it directly (it's already valid XML)
|
|
705
|
+
processedContent = xmlBlocks.join('\n\n');
|
|
706
|
+
} else {
|
|
707
|
+
// No XML blocks found, skip non-XML markdown files
|
|
708
|
+
return;
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
break;
|
|
712
|
+
}
|
|
713
|
+
case '.csv': {
|
|
714
|
+
// CSV files need special handling - convert to XML file-index
|
|
715
|
+
const lines = content.split('\n').filter((line) => line.trim());
|
|
716
|
+
if (lines.length === 0) return;
|
|
717
|
+
|
|
718
|
+
const headers = lines[0].split(',').map((h) => h.trim());
|
|
719
|
+
const rows = lines.slice(1);
|
|
720
|
+
|
|
721
|
+
const indexParts = [`<file-index id="${filePath}">`];
|
|
722
|
+
indexParts.push(' <items>');
|
|
723
|
+
|
|
724
|
+
// Track files referenced in CSV for additional bundling
|
|
725
|
+
const referencedFiles = new Set();
|
|
726
|
+
|
|
727
|
+
for (const row of rows) {
|
|
728
|
+
const values = row.split(',').map((v) => v.trim());
|
|
729
|
+
if (values.every((v) => !v)) continue;
|
|
730
|
+
|
|
731
|
+
indexParts.push(' <item>');
|
|
732
|
+
for (const [i, header] of headers.entries()) {
|
|
733
|
+
const value = values[i] || '';
|
|
734
|
+
const tagName = header.toLowerCase().replaceAll(/[^a-z0-9]/g, '_');
|
|
735
|
+
indexParts.push(` <${tagName}>${value}</${tagName}>`);
|
|
736
|
+
|
|
737
|
+
// Track referenced files
|
|
738
|
+
if (header.toLowerCase().includes('file') && value.endsWith('.md')) {
|
|
739
|
+
// Build path relative to CSV location
|
|
740
|
+
const csvDir = path.dirname(actualPath);
|
|
741
|
+
const refPath = path.join(csvDir, value);
|
|
742
|
+
if (fs.existsSync(refPath)) {
|
|
743
|
+
const refId = filePath.replace('index.csv', value);
|
|
744
|
+
referencedFiles.add(refId);
|
|
745
|
+
}
|
|
746
|
+
}
|
|
747
|
+
}
|
|
748
|
+
indexParts.push(' </item>');
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
indexParts.push(' </items>', '</file-index>');
|
|
752
|
+
|
|
753
|
+
// Store the XML version wrapped in a file element
|
|
754
|
+
const csvXml = indexParts.join('\n');
|
|
755
|
+
const wrappedCsv = `<file id="${filePath}" type="xml">\n${csvXml}\n</file>`;
|
|
756
|
+
dependencies.set(filePath, wrappedCsv);
|
|
757
|
+
|
|
758
|
+
// Process referenced files from CSV
|
|
759
|
+
for (const refId of referencedFiles) {
|
|
760
|
+
if (!processed.has(refId)) {
|
|
761
|
+
await this.processFileDependency(refId, dependencies, processed, moduleName, warnings);
|
|
762
|
+
}
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
return;
|
|
766
|
+
}
|
|
767
|
+
case '.xml': {
|
|
768
|
+
// XML files can be included directly
|
|
769
|
+
processedContent = content;
|
|
770
|
+
break;
|
|
771
|
+
}
|
|
772
|
+
default: {
|
|
773
|
+
// For other non-XML file types, skip them
|
|
774
|
+
return;
|
|
775
|
+
}
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
// Determine file type for wrapping
|
|
779
|
+
let fileType = 'text';
|
|
780
|
+
if (ext === '.xml' || (ext === '.md' && processedContent.trim().startsWith('<'))) {
|
|
781
|
+
fileType = 'xml';
|
|
782
|
+
} else
|
|
783
|
+
switch (ext) {
|
|
784
|
+
case '.yaml':
|
|
785
|
+
case '.yml': {
|
|
786
|
+
fileType = 'yaml';
|
|
787
|
+
|
|
788
|
+
break;
|
|
789
|
+
}
|
|
790
|
+
case '.json': {
|
|
791
|
+
fileType = 'json';
|
|
792
|
+
|
|
793
|
+
break;
|
|
794
|
+
}
|
|
795
|
+
case '.md': {
|
|
796
|
+
fileType = 'md';
|
|
797
|
+
|
|
798
|
+
break;
|
|
799
|
+
}
|
|
800
|
+
// No default
|
|
801
|
+
}
|
|
802
|
+
|
|
803
|
+
// Wrap content in file element and store
|
|
804
|
+
const wrappedContent = this.wrapContentInXml(processedContent, filePath, fileType);
|
|
805
|
+
dependencies.set(filePath, wrappedContent);
|
|
806
|
+
|
|
807
|
+
// Recursively scan for more dependencies
|
|
808
|
+
const { refs: nestedRefs } = this.extractFileReferences(processedContent);
|
|
809
|
+
for (const ref of nestedRefs) {
|
|
810
|
+
await this.processFileDependency(ref, dependencies, processed, moduleName, warnings);
|
|
811
|
+
}
|
|
812
|
+
}
|
|
813
|
+
|
|
814
|
+
/**
|
|
815
|
+
* Process a workflow YAML file and its bundle files
|
|
816
|
+
*/
|
|
817
|
+
async processWorkflowDependency(workflowPath, dependencies, processed, moduleName, warnings = []) {
|
|
818
|
+
// Skip if already processed
|
|
819
|
+
if (processed.has(workflowPath)) {
|
|
820
|
+
return { skipped: false };
|
|
821
|
+
}
|
|
822
|
+
processed.add(workflowPath);
|
|
823
|
+
|
|
824
|
+
// Resolve actual file path
|
|
825
|
+
const actualPath = this.resolveFilePath(workflowPath, moduleName);
|
|
826
|
+
|
|
827
|
+
if (!actualPath || !(await fs.pathExists(actualPath))) {
|
|
828
|
+
warnings.push(workflowPath);
|
|
829
|
+
return { skipped: true };
|
|
830
|
+
}
|
|
831
|
+
|
|
832
|
+
// Read and parse YAML file
|
|
833
|
+
const yamlContent = await fs.readFile(actualPath, 'utf8');
|
|
834
|
+
let workflowConfig;
|
|
835
|
+
|
|
836
|
+
try {
|
|
837
|
+
workflowConfig = yaml.load(yamlContent);
|
|
838
|
+
} catch (error) {
|
|
839
|
+
warnings.push(`${workflowPath} (invalid YAML: ${error.message})`);
|
|
840
|
+
return { skipped: true };
|
|
841
|
+
}
|
|
842
|
+
|
|
843
|
+
// Check if web_bundle is explicitly set to false
|
|
844
|
+
if (workflowConfig.web_bundle === false) {
|
|
845
|
+
// Mark this workflow as skipped so we can remove the command from agent
|
|
846
|
+
return { skipped: true, workflowPath };
|
|
847
|
+
}
|
|
848
|
+
|
|
849
|
+
// Create YAML content with only web_bundle section (flattened)
|
|
850
|
+
let bundleYamlContent;
|
|
851
|
+
if (workflowConfig.web_bundle && typeof workflowConfig.web_bundle === 'object') {
|
|
852
|
+
// Only include the web_bundle content, flattened to root level
|
|
853
|
+
bundleYamlContent = yaml.dump(workflowConfig.web_bundle);
|
|
854
|
+
} else {
|
|
855
|
+
// If no web_bundle section, include full YAML
|
|
856
|
+
bundleYamlContent = yamlContent;
|
|
857
|
+
}
|
|
858
|
+
|
|
859
|
+
// Include the YAML file with only web_bundle content, wrapped in XML
|
|
860
|
+
const yamlId = workflowPath.replace(/^{project-root}\//, '');
|
|
861
|
+
const wrappedYaml = this.wrapContentInXml(bundleYamlContent, yamlId, 'yaml');
|
|
862
|
+
dependencies.set(yamlId, wrappedYaml);
|
|
863
|
+
|
|
864
|
+
// Always include core workflow task when processing workflows
|
|
865
|
+
await this.includeCoreWorkflowFiles(dependencies, processed, moduleName, warnings);
|
|
866
|
+
|
|
867
|
+
// Check if advanced elicitation is enabled
|
|
868
|
+
if (workflowConfig.web_bundle && workflowConfig.web_bundle.use_advanced_elicitation) {
|
|
869
|
+
await this.includeAdvancedElicitationFiles(dependencies, processed, moduleName, warnings);
|
|
870
|
+
}
|
|
871
|
+
|
|
872
|
+
// Process web_bundle_files if they exist
|
|
873
|
+
if (workflowConfig.web_bundle && workflowConfig.web_bundle.web_bundle_files) {
|
|
874
|
+
const bundleFiles = workflowConfig.web_bundle.web_bundle_files;
|
|
875
|
+
|
|
876
|
+
for (const bundleFilePath of bundleFiles) {
|
|
877
|
+
if (processed.has(bundleFilePath)) {
|
|
878
|
+
continue;
|
|
879
|
+
}
|
|
880
|
+
|
|
881
|
+
const bundleActualPath = this.resolveFilePath(bundleFilePath, moduleName);
|
|
882
|
+
|
|
883
|
+
if (!bundleActualPath || !(await fs.pathExists(bundleActualPath))) {
|
|
884
|
+
warnings.push(bundleFilePath);
|
|
885
|
+
continue;
|
|
886
|
+
}
|
|
887
|
+
|
|
888
|
+
// Check if this is another workflow.yaml file - if so, recursively process it
|
|
889
|
+
if (bundleFilePath.endsWith('workflow.yaml')) {
|
|
890
|
+
// Recursively process this workflow and its dependencies
|
|
891
|
+
await this.processWorkflowDependency(bundleFilePath, dependencies, processed, moduleName, warnings);
|
|
892
|
+
} else {
|
|
893
|
+
// Regular file - process normally
|
|
894
|
+
processed.add(bundleFilePath);
|
|
895
|
+
|
|
896
|
+
// Read the file content
|
|
897
|
+
const fileContent = await fs.readFile(bundleActualPath, 'utf8');
|
|
898
|
+
const fileExt = path.extname(bundleActualPath).toLowerCase().replace('.', '');
|
|
899
|
+
|
|
900
|
+
// Wrap in XML with proper escaping
|
|
901
|
+
const wrappedContent = this.wrapContentInXml(fileContent, bundleFilePath, fileExt);
|
|
902
|
+
dependencies.set(bundleFilePath, wrappedContent);
|
|
903
|
+
}
|
|
904
|
+
}
|
|
905
|
+
}
|
|
906
|
+
|
|
907
|
+
return { skipped: false };
|
|
908
|
+
}
|
|
909
|
+
|
|
910
|
+
/**
|
|
911
|
+
* Include core workflow task files
|
|
912
|
+
*/
|
|
913
|
+
async includeCoreWorkflowFiles(dependencies, processed, moduleName, warnings = []) {
|
|
914
|
+
const coreWorkflowPath = 'bmad/core/tasks/workflow.xml';
|
|
915
|
+
|
|
916
|
+
if (processed.has(coreWorkflowPath)) {
|
|
917
|
+
return;
|
|
918
|
+
}
|
|
919
|
+
processed.add(coreWorkflowPath);
|
|
920
|
+
|
|
921
|
+
const actualPath = this.resolveFilePath(coreWorkflowPath, moduleName);
|
|
922
|
+
|
|
923
|
+
if (!actualPath || !(await fs.pathExists(actualPath))) {
|
|
924
|
+
warnings.push(coreWorkflowPath);
|
|
925
|
+
return;
|
|
926
|
+
}
|
|
927
|
+
|
|
928
|
+
const fileContent = await fs.readFile(actualPath, 'utf8');
|
|
929
|
+
const wrappedContent = this.wrapContentInXml(fileContent, coreWorkflowPath, 'xml');
|
|
930
|
+
dependencies.set(coreWorkflowPath, wrappedContent);
|
|
931
|
+
}
|
|
932
|
+
|
|
933
|
+
/**
|
|
934
|
+
* Include advanced elicitation files
|
|
935
|
+
*/
|
|
936
|
+
async includeAdvancedElicitationFiles(dependencies, processed, moduleName, warnings = []) {
|
|
937
|
+
const elicitationFiles = ['bmad/core/tasks/adv-elicit.xml', 'bmad/core/tasks/adv-elicit-methods.csv'];
|
|
938
|
+
|
|
939
|
+
for (const filePath of elicitationFiles) {
|
|
940
|
+
if (processed.has(filePath)) {
|
|
941
|
+
continue;
|
|
942
|
+
}
|
|
943
|
+
processed.add(filePath);
|
|
944
|
+
|
|
945
|
+
const actualPath = this.resolveFilePath(filePath, moduleName);
|
|
946
|
+
|
|
947
|
+
if (!actualPath || !(await fs.pathExists(actualPath))) {
|
|
948
|
+
warnings.push(filePath);
|
|
949
|
+
continue;
|
|
950
|
+
}
|
|
951
|
+
|
|
952
|
+
const fileContent = await fs.readFile(actualPath, 'utf8');
|
|
953
|
+
const fileExt = path.extname(actualPath).toLowerCase().replace('.', '');
|
|
954
|
+
const wrappedContent = this.wrapContentInXml(fileContent, filePath, fileExt);
|
|
955
|
+
dependencies.set(filePath, wrappedContent);
|
|
956
|
+
}
|
|
957
|
+
}
|
|
958
|
+
|
|
959
|
+
/**
|
|
960
|
+
* Wrap file content in XML with proper escaping
|
|
961
|
+
*/
|
|
962
|
+
wrapContentInXml(content, id, type = 'text') {
|
|
963
|
+
// For XML files, include directly without CDATA (they're already valid XML)
|
|
964
|
+
if (type === 'xml') {
|
|
965
|
+
// XML files can be included directly as they're already well-formed
|
|
966
|
+
// Just wrap in a file element
|
|
967
|
+
return `<file id="${id}" type="${type}">\n${content}\n</file>`;
|
|
968
|
+
}
|
|
969
|
+
|
|
970
|
+
// For all other file types, use CDATA to preserve content exactly
|
|
971
|
+
// Escape any ]]> sequences in the content by splitting CDATA sections
|
|
972
|
+
// Replace ]]> with ]]]]><![CDATA[> to properly escape it within CDATA
|
|
973
|
+
const escapedContent = content.replaceAll(']]>', ']]]]><![CDATA[>');
|
|
974
|
+
|
|
975
|
+
// Use CDATA to preserve content exactly as-is, including special characters
|
|
976
|
+
return `<file id="${id}" type="${type}"><![CDATA[${escapedContent}]]></file>`;
|
|
977
|
+
}
|
|
978
|
+
|
|
979
|
+
/**
|
|
980
|
+
* Process wildcard dependency patterns
|
|
981
|
+
*/
|
|
982
|
+
async processWildcardDependency(pattern, dependencies, processed, moduleName, warnings = []) {
|
|
983
|
+
// Remove {project-root} prefix
|
|
984
|
+
pattern = pattern.replace(/^{project-root}\//, '');
|
|
985
|
+
|
|
986
|
+
// Get directory and file pattern
|
|
987
|
+
const lastSlash = pattern.lastIndexOf('/');
|
|
988
|
+
const dirPath = pattern.slice(0, Math.max(0, lastSlash));
|
|
989
|
+
const filePattern = pattern.slice(Math.max(0, lastSlash + 1));
|
|
990
|
+
|
|
991
|
+
// Resolve directory path without checking file existence
|
|
992
|
+
let dir;
|
|
993
|
+
if (dirPath.startsWith('bmad/')) {
|
|
994
|
+
// Remove bmad/ prefix
|
|
995
|
+
const actualPath = dirPath.replace(/^bmad\//, '');
|
|
996
|
+
|
|
997
|
+
// Try different path mappings for directories
|
|
998
|
+
const possibleDirs = [
|
|
999
|
+
// Try as module path: bmad/cis/... -> src/modules/cis/...
|
|
1000
|
+
path.join(this.sourceDir, 'modules', actualPath),
|
|
1001
|
+
// Try as direct path: bmad/core/... -> src/core/...
|
|
1002
|
+
path.join(this.sourceDir, actualPath),
|
|
1003
|
+
];
|
|
1004
|
+
|
|
1005
|
+
for (const testDir of possibleDirs) {
|
|
1006
|
+
if (fs.existsSync(testDir)) {
|
|
1007
|
+
dir = testDir;
|
|
1008
|
+
break;
|
|
1009
|
+
}
|
|
1010
|
+
}
|
|
1011
|
+
}
|
|
1012
|
+
|
|
1013
|
+
if (!dir) {
|
|
1014
|
+
warnings.push(`${pattern} (could not resolve directory)`);
|
|
1015
|
+
return;
|
|
1016
|
+
}
|
|
1017
|
+
if (!(await fs.pathExists(dir))) {
|
|
1018
|
+
warnings.push(pattern);
|
|
1019
|
+
return;
|
|
1020
|
+
}
|
|
1021
|
+
|
|
1022
|
+
// Read directory and match files
|
|
1023
|
+
const files = await fs.readdir(dir);
|
|
1024
|
+
let matchedFiles = [];
|
|
1025
|
+
|
|
1026
|
+
if (filePattern === '*.*') {
|
|
1027
|
+
matchedFiles = files;
|
|
1028
|
+
} else if (filePattern.startsWith('*.')) {
|
|
1029
|
+
const ext = filePattern.slice(1);
|
|
1030
|
+
matchedFiles = files.filter((f) => f.endsWith(ext));
|
|
1031
|
+
} else {
|
|
1032
|
+
// Simple glob matching
|
|
1033
|
+
const regex = new RegExp('^' + filePattern.replace('*', '.*') + '$');
|
|
1034
|
+
matchedFiles = files.filter((f) => regex.test(f));
|
|
1035
|
+
}
|
|
1036
|
+
|
|
1037
|
+
// Process each matched file
|
|
1038
|
+
for (const file of matchedFiles) {
|
|
1039
|
+
const fullPath = dirPath + '/' + file;
|
|
1040
|
+
if (!processed.has(fullPath)) {
|
|
1041
|
+
await this.processFileDependency(fullPath, dependencies, processed, moduleName, warnings);
|
|
1042
|
+
}
|
|
1043
|
+
}
|
|
1044
|
+
}
|
|
1045
|
+
|
|
1046
|
+
/**
|
|
1047
|
+
* Resolve file path relative to project
|
|
1048
|
+
*/
|
|
1049
|
+
resolveFilePath(filePath, moduleName) {
|
|
1050
|
+
// Remove {project-root} prefix
|
|
1051
|
+
filePath = filePath.replace(/^{project-root}\//, '');
|
|
1052
|
+
|
|
1053
|
+
// Check temp directory first for _cfg files
|
|
1054
|
+
if (filePath.startsWith('bmad/_cfg/')) {
|
|
1055
|
+
const filename = filePath.split('/').pop();
|
|
1056
|
+
const tempPath = path.join(this.tempManifestDir, filename);
|
|
1057
|
+
if (fs.existsSync(tempPath)) {
|
|
1058
|
+
return tempPath;
|
|
1059
|
+
}
|
|
1060
|
+
}
|
|
1061
|
+
|
|
1062
|
+
// Handle different path patterns for bmad files
|
|
1063
|
+
// bmad/cis/tasks/brain-session.md -> src/modules/cis/tasks/brain-session.md
|
|
1064
|
+
// bmad/core/tasks/create-doc.md -> src/core/tasks/create-doc.md
|
|
1065
|
+
// bmad/bmm/templates/brief.md -> src/modules/bmm/templates/brief.md
|
|
1066
|
+
|
|
1067
|
+
let actualPath = filePath;
|
|
1068
|
+
|
|
1069
|
+
if (filePath.startsWith('bmad/')) {
|
|
1070
|
+
// Remove bmad/ prefix
|
|
1071
|
+
actualPath = filePath.replace(/^bmad\//, '');
|
|
1072
|
+
|
|
1073
|
+
// Check if it's a module-specific file (cis, bmm, etc) or core file
|
|
1074
|
+
const parts = actualPath.split('/');
|
|
1075
|
+
const firstPart = parts[0];
|
|
1076
|
+
|
|
1077
|
+
// Try different path mappings
|
|
1078
|
+
const possiblePaths = [
|
|
1079
|
+
// Try in temp directory first
|
|
1080
|
+
path.join(this.tempDir, filePath),
|
|
1081
|
+
// Try as module path: bmad/cis/... -> src/modules/cis/...
|
|
1082
|
+
path.join(this.sourceDir, 'modules', actualPath),
|
|
1083
|
+
// Try as direct path: bmad/core/... -> src/core/...
|
|
1084
|
+
path.join(this.sourceDir, actualPath),
|
|
1085
|
+
// Try without any prefix in src
|
|
1086
|
+
path.join(this.sourceDir, parts.slice(1).join('/')),
|
|
1087
|
+
// Try in project root
|
|
1088
|
+
path.join(this.sourceDir, '..', actualPath),
|
|
1089
|
+
// Try original with bmad
|
|
1090
|
+
path.join(this.sourceDir, '..', filePath),
|
|
1091
|
+
];
|
|
1092
|
+
|
|
1093
|
+
for (const testPath of possiblePaths) {
|
|
1094
|
+
if (fs.existsSync(testPath)) {
|
|
1095
|
+
return testPath;
|
|
1096
|
+
}
|
|
1097
|
+
}
|
|
1098
|
+
}
|
|
1099
|
+
|
|
1100
|
+
// Try standard paths for non-bmad files
|
|
1101
|
+
const basePaths = [
|
|
1102
|
+
this.sourceDir, // src directory
|
|
1103
|
+
path.join(this.modulesPath, moduleName), // Current module
|
|
1104
|
+
path.join(this.sourceDir, '..'), // Project root
|
|
1105
|
+
];
|
|
1106
|
+
|
|
1107
|
+
for (const basePath of basePaths) {
|
|
1108
|
+
const fullPath = path.join(basePath, actualPath);
|
|
1109
|
+
if (fs.existsSync(fullPath)) {
|
|
1110
|
+
return fullPath;
|
|
1111
|
+
}
|
|
1112
|
+
}
|
|
1113
|
+
|
|
1114
|
+
return null;
|
|
1115
|
+
}
|
|
1116
|
+
|
|
1117
|
+
/**
|
|
1118
|
+
* Process and remove {project-root} references
|
|
1119
|
+
*/
|
|
1120
|
+
processProjectRootReferences(content) {
|
|
1121
|
+
// Remove {project-root}/ prefix (with slash)
|
|
1122
|
+
content = content.replaceAll('{project-root}/', '');
|
|
1123
|
+
// Also remove {project-root} without slash
|
|
1124
|
+
content = content.replaceAll('{project-root}', '');
|
|
1125
|
+
return content;
|
|
1126
|
+
}
|
|
1127
|
+
|
|
1128
|
+
/**
|
|
1129
|
+
* Escape special XML characters in text content
|
|
1130
|
+
*/
|
|
1131
|
+
escapeXmlText(text) {
|
|
1132
|
+
return text
|
|
1133
|
+
.replaceAll('&', '&')
|
|
1134
|
+
.replaceAll('<', '<')
|
|
1135
|
+
.replaceAll('>', '>')
|
|
1136
|
+
.replaceAll('"', '"')
|
|
1137
|
+
.replaceAll("'", ''');
|
|
1138
|
+
}
|
|
1139
|
+
|
|
1140
|
+
/**
|
|
1141
|
+
* Escape XML content while preserving XML tags
|
|
1142
|
+
*/
|
|
1143
|
+
escapeXmlContent(content) {
|
|
1144
|
+
const tagPattern = /<([^>]+)>/g;
|
|
1145
|
+
const parts = [];
|
|
1146
|
+
let lastIndex = 0;
|
|
1147
|
+
let match;
|
|
1148
|
+
|
|
1149
|
+
while ((match = tagPattern.exec(content)) !== null) {
|
|
1150
|
+
if (match.index > lastIndex) {
|
|
1151
|
+
parts.push(this.escapeXmlText(content.slice(lastIndex, match.index)));
|
|
1152
|
+
}
|
|
1153
|
+
parts.push('<' + match[1] + '>');
|
|
1154
|
+
lastIndex = match.index + match[0].length;
|
|
1155
|
+
}
|
|
1156
|
+
|
|
1157
|
+
if (lastIndex < content.length) {
|
|
1158
|
+
parts.push(this.escapeXmlText(content.slice(lastIndex)));
|
|
1159
|
+
}
|
|
1160
|
+
|
|
1161
|
+
return parts.join('');
|
|
1162
|
+
}
|
|
1163
|
+
|
|
1164
|
+
/**
|
|
1165
|
+
* Inject help and exit menu items into agent XML
|
|
1166
|
+
*/
|
|
1167
|
+
injectHelpExitMenuItems(agentXml) {
|
|
1168
|
+
// Check if menu already has help and exit
|
|
1169
|
+
const hasHelp = agentXml.includes('cmd="*help"') || agentXml.includes('trigger="*help"');
|
|
1170
|
+
const hasExit = agentXml.includes('cmd="*exit"') || agentXml.includes('trigger="*exit"');
|
|
1171
|
+
|
|
1172
|
+
if (hasHelp && hasExit) {
|
|
1173
|
+
return agentXml; // Already has both, skip injection
|
|
1174
|
+
}
|
|
1175
|
+
|
|
1176
|
+
// Find the menu section
|
|
1177
|
+
const menuMatch = agentXml.match(/(<menu>[\s\S]*?<\/menu>)/);
|
|
1178
|
+
if (!menuMatch) {
|
|
1179
|
+
return agentXml; // No menu found, skip injection
|
|
1180
|
+
}
|
|
1181
|
+
|
|
1182
|
+
const menuContent = menuMatch[1];
|
|
1183
|
+
const menuClosingMatch = menuContent.match(/(\s*)<\/menu>/);
|
|
1184
|
+
if (!menuClosingMatch) {
|
|
1185
|
+
return agentXml;
|
|
1186
|
+
}
|
|
1187
|
+
|
|
1188
|
+
const indent = menuClosingMatch[1];
|
|
1189
|
+
const menuItems = [];
|
|
1190
|
+
|
|
1191
|
+
if (!hasHelp) {
|
|
1192
|
+
menuItems.push(`${indent}<item cmd="*help">Show numbered menu</item>`);
|
|
1193
|
+
}
|
|
1194
|
+
|
|
1195
|
+
if (!hasExit) {
|
|
1196
|
+
menuItems.push(`${indent}<item cmd="*exit">Exit with confirmation</item>`);
|
|
1197
|
+
}
|
|
1198
|
+
|
|
1199
|
+
if (menuItems.length === 0) {
|
|
1200
|
+
return agentXml;
|
|
1201
|
+
}
|
|
1202
|
+
|
|
1203
|
+
// Inject menu items before closing </menu> tag
|
|
1204
|
+
const newMenuContent = menuContent.replace(/(\s*)<\/menu>/, `\n${menuItems.join('\n')}\n${indent}</menu>`);
|
|
1205
|
+
return agentXml.replace(menuContent, newMenuContent);
|
|
1206
|
+
}
|
|
1207
|
+
|
|
1208
|
+
/**
|
|
1209
|
+
* Inject web activation instructions into agent XML
|
|
1210
|
+
*/
|
|
1211
|
+
injectWebActivation(agentXml) {
|
|
1212
|
+
// First, always inject help/exit menu items
|
|
1213
|
+
agentXml = this.injectHelpExitMenuItems(agentXml);
|
|
1214
|
+
|
|
1215
|
+
// Load the web activation template
|
|
1216
|
+
const activationPath = path.join(this.sourceDir, 'utility', 'models', 'agent-activation-web.xml');
|
|
1217
|
+
|
|
1218
|
+
if (!fs.existsSync(activationPath)) {
|
|
1219
|
+
console.warn(chalk.yellow('Warning: agent-activation-web.xml not found, skipping activation injection'));
|
|
1220
|
+
return agentXml;
|
|
1221
|
+
}
|
|
1222
|
+
|
|
1223
|
+
const activationXml = fs.readFileSync(activationPath, 'utf8');
|
|
1224
|
+
|
|
1225
|
+
// For web bundles, ALWAYS replace existing activation with web activation
|
|
1226
|
+
// This is because fragment-based activation assumes filesystem access which won't work in web bundles
|
|
1227
|
+
const hasActivation = agentXml.includes('<activation');
|
|
1228
|
+
|
|
1229
|
+
if (hasActivation) {
|
|
1230
|
+
// Replace existing activation block with web activation
|
|
1231
|
+
const injectedXml = agentXml.replace(/<activation[^>]*>[\s\S]*?<\/activation>/, activationXml);
|
|
1232
|
+
return injectedXml;
|
|
1233
|
+
}
|
|
1234
|
+
|
|
1235
|
+
// Check for critical-actions block (legacy)
|
|
1236
|
+
const hasCriticalActions = agentXml.includes('<critical-actions');
|
|
1237
|
+
|
|
1238
|
+
if (hasCriticalActions) {
|
|
1239
|
+
// Replace critical-actions block with activation
|
|
1240
|
+
const injectedXml = agentXml.replace(/<critical-actions>[\s\S]*?<\/critical-actions>/, activationXml);
|
|
1241
|
+
return injectedXml;
|
|
1242
|
+
}
|
|
1243
|
+
|
|
1244
|
+
// If no critical-actions, inject before closing </agent> tag
|
|
1245
|
+
const closingTagMatch = agentXml.match(/(\s*)<\/agent>/);
|
|
1246
|
+
if (!closingTagMatch) {
|
|
1247
|
+
console.warn(chalk.yellow('Warning: Could not find </agent> tag for activation injection'));
|
|
1248
|
+
return agentXml;
|
|
1249
|
+
}
|
|
1250
|
+
|
|
1251
|
+
// Inject the activation block before the closing </agent> tag
|
|
1252
|
+
// Properly indent each line of the activation XML
|
|
1253
|
+
const indent = closingTagMatch[1];
|
|
1254
|
+
const indentedActivation = activationXml
|
|
1255
|
+
.split('\n')
|
|
1256
|
+
.map((line) => (line.trim() ? indent + line : ''))
|
|
1257
|
+
.join('\n');
|
|
1258
|
+
|
|
1259
|
+
const injectedXml = agentXml.replace(/(\s*)<\/agent>/, `\n${indentedActivation}\n${indent}</agent>`);
|
|
1260
|
+
|
|
1261
|
+
return injectedXml;
|
|
1262
|
+
}
|
|
1263
|
+
|
|
1264
|
+
/**
|
|
1265
|
+
* Build the final agent bundle XML
|
|
1266
|
+
*/
|
|
1267
|
+
buildAgentBundle(agentXml, dependencies) {
|
|
1268
|
+
// Web activation is now handled by fragments during YAML building
|
|
1269
|
+
// agentXml = this.injectWebActivation(agentXml);
|
|
1270
|
+
|
|
1271
|
+
const parts = [
|
|
1272
|
+
'<?xml version="1.0" encoding="UTF-8"?>',
|
|
1273
|
+
'<agent-bundle>',
|
|
1274
|
+
' <!-- Agent Definition -->',
|
|
1275
|
+
' ' + agentXml.replaceAll('\n', '\n '),
|
|
1276
|
+
];
|
|
1277
|
+
|
|
1278
|
+
// Add dependencies (all are now consistently wrapped in <file> elements)
|
|
1279
|
+
if (dependencies && dependencies.size > 0) {
|
|
1280
|
+
parts.push('\n <!-- Dependencies -->');
|
|
1281
|
+
for (const [id, content] of dependencies) {
|
|
1282
|
+
// All dependencies are now wrapped in <file> elements
|
|
1283
|
+
// Indent properly
|
|
1284
|
+
const indentedContent = content
|
|
1285
|
+
.split('\n')
|
|
1286
|
+
.map((line) => ' ' + line)
|
|
1287
|
+
.join('\n');
|
|
1288
|
+
parts.push(indentedContent);
|
|
1289
|
+
}
|
|
1290
|
+
}
|
|
1291
|
+
|
|
1292
|
+
parts.push('</agent-bundle>');
|
|
1293
|
+
|
|
1294
|
+
return parts.join('\n');
|
|
1295
|
+
}
|
|
1296
|
+
|
|
1297
|
+
/**
|
|
1298
|
+
* Discover all modules
|
|
1299
|
+
*/
|
|
1300
|
+
async discoverModules() {
|
|
1301
|
+
const modules = [];
|
|
1302
|
+
|
|
1303
|
+
if (!(await fs.pathExists(this.modulesPath))) {
|
|
1304
|
+
console.log(chalk.yellow('No modules directory found'));
|
|
1305
|
+
return modules;
|
|
1306
|
+
}
|
|
1307
|
+
|
|
1308
|
+
const entries = await fs.readdir(this.modulesPath, { withFileTypes: true });
|
|
1309
|
+
|
|
1310
|
+
for (const entry of entries) {
|
|
1311
|
+
if (entry.isDirectory()) {
|
|
1312
|
+
modules.push(entry.name);
|
|
1313
|
+
}
|
|
1314
|
+
}
|
|
1315
|
+
|
|
1316
|
+
return modules;
|
|
1317
|
+
}
|
|
1318
|
+
|
|
1319
|
+
/**
|
|
1320
|
+
* Discover agents in a module
|
|
1321
|
+
*/
|
|
1322
|
+
async discoverAgents(modulePath) {
|
|
1323
|
+
const agents = [];
|
|
1324
|
+
const agentsPath = path.join(modulePath, 'agents');
|
|
1325
|
+
|
|
1326
|
+
if (!(await fs.pathExists(agentsPath))) {
|
|
1327
|
+
return agents;
|
|
1328
|
+
}
|
|
1329
|
+
|
|
1330
|
+
const files = await fs.readdir(agentsPath);
|
|
1331
|
+
|
|
1332
|
+
for (const file of files) {
|
|
1333
|
+
// Look for .agent.yaml files (new format) or .md files (legacy format)
|
|
1334
|
+
if (file.endsWith('.agent.yaml') || (file.endsWith('.md') && !file.toLowerCase().includes('readme'))) {
|
|
1335
|
+
agents.push(file);
|
|
1336
|
+
}
|
|
1337
|
+
}
|
|
1338
|
+
|
|
1339
|
+
return agents;
|
|
1340
|
+
}
|
|
1341
|
+
|
|
1342
|
+
/**
|
|
1343
|
+
* Discover all teams in a module
|
|
1344
|
+
*/
|
|
1345
|
+
async discoverTeams(modulePath) {
|
|
1346
|
+
const teams = [];
|
|
1347
|
+
const teamsPath = path.join(modulePath, 'teams');
|
|
1348
|
+
|
|
1349
|
+
if (!(await fs.pathExists(teamsPath))) {
|
|
1350
|
+
return teams;
|
|
1351
|
+
}
|
|
1352
|
+
|
|
1353
|
+
const files = await fs.readdir(teamsPath);
|
|
1354
|
+
|
|
1355
|
+
for (const file of files) {
|
|
1356
|
+
if (file.endsWith('.yaml') || file.endsWith('.yml')) {
|
|
1357
|
+
teams.push(file);
|
|
1358
|
+
}
|
|
1359
|
+
}
|
|
1360
|
+
|
|
1361
|
+
return teams;
|
|
1362
|
+
}
|
|
1363
|
+
|
|
1364
|
+
/**
|
|
1365
|
+
* Extract agent name from XML
|
|
1366
|
+
*/
|
|
1367
|
+
getAgentName(xml) {
|
|
1368
|
+
const match = xml.match(/<agent[^>]*name="([^"]+)"/);
|
|
1369
|
+
return match ? match[1] : 'Unknown';
|
|
1370
|
+
}
|
|
1371
|
+
|
|
1372
|
+
/**
|
|
1373
|
+
* Extract agent description from XML
|
|
1374
|
+
*/
|
|
1375
|
+
getAgentDescription(xml) {
|
|
1376
|
+
const match = xml.match(/<description>([^<]+)<\/description>/);
|
|
1377
|
+
return match ? match[1] : '';
|
|
1378
|
+
}
|
|
1379
|
+
|
|
1380
|
+
/**
|
|
1381
|
+
* Check if agent should be skipped for bundling
|
|
1382
|
+
*/
|
|
1383
|
+
shouldSkipBundling(xml) {
|
|
1384
|
+
// Check for bundle="false" attribute in the agent tag
|
|
1385
|
+
const match = xml.match(/<agent[^>]*bundle="false"[^>]*>/);
|
|
1386
|
+
return match !== null;
|
|
1387
|
+
}
|
|
1388
|
+
|
|
1389
|
+
/**
|
|
1390
|
+
* Create temporary manifest files
|
|
1391
|
+
*/
|
|
1392
|
+
async createTempManifests() {
|
|
1393
|
+
// Ensure temp directory exists
|
|
1394
|
+
await fs.ensureDir(this.tempManifestDir);
|
|
1395
|
+
|
|
1396
|
+
// Generate agent-manifest.csv using shared generator
|
|
1397
|
+
const agentPartyPath = path.join(this.tempManifestDir, 'agent-manifest.csv');
|
|
1398
|
+
await AgentPartyGenerator.writeAgentParty(agentPartyPath, this.discoveredAgents, { forWeb: true });
|
|
1399
|
+
|
|
1400
|
+
console.log(chalk.dim(' ✓ Created temporary manifest files'));
|
|
1401
|
+
}
|
|
1402
|
+
|
|
1403
|
+
/**
|
|
1404
|
+
* Clean up temporary files
|
|
1405
|
+
*/
|
|
1406
|
+
async cleanupTempFiles() {
|
|
1407
|
+
if (await fs.pathExists(this.tempDir)) {
|
|
1408
|
+
await fs.remove(this.tempDir);
|
|
1409
|
+
console.log(chalk.dim('\n✓ Cleaned up temporary files'));
|
|
1410
|
+
}
|
|
1411
|
+
}
|
|
1412
|
+
|
|
1413
|
+
/**
|
|
1414
|
+
* Validate XML content
|
|
1415
|
+
*/
|
|
1416
|
+
async validateXml(xmlContent) {
|
|
1417
|
+
try {
|
|
1418
|
+
await xml2js.parseStringPromise(xmlContent, {
|
|
1419
|
+
strict: true,
|
|
1420
|
+
explicitArray: false,
|
|
1421
|
+
});
|
|
1422
|
+
return true;
|
|
1423
|
+
} catch {
|
|
1424
|
+
return false;
|
|
1425
|
+
}
|
|
1426
|
+
}
|
|
1427
|
+
|
|
1428
|
+
/**
|
|
1429
|
+
* Display summary statistics
|
|
1430
|
+
*/
|
|
1431
|
+
displaySummary() {
|
|
1432
|
+
console.log(chalk.cyan.bold('\n═══════════════════════════════════════════════'));
|
|
1433
|
+
console.log(chalk.cyan.bold(' SUMMARY'));
|
|
1434
|
+
console.log(chalk.cyan.bold('═══════════════════════════════════════════════\n'));
|
|
1435
|
+
|
|
1436
|
+
console.log(chalk.bold('Bundle Statistics:'));
|
|
1437
|
+
console.log(` Total agents found: ${this.stats.totalAgents}`);
|
|
1438
|
+
console.log(` Successfully bundled: ${chalk.green(this.stats.bundledAgents)}`);
|
|
1439
|
+
console.log(` Skipped (bundle=false): ${chalk.gray(this.stats.skippedAgents)}`);
|
|
1440
|
+
|
|
1441
|
+
if (this.stats.failedAgents > 0) {
|
|
1442
|
+
console.log(` Failed to bundle: ${chalk.red(this.stats.failedAgents)}`);
|
|
1443
|
+
}
|
|
1444
|
+
|
|
1445
|
+
if (this.stats.invalidXml > 0) {
|
|
1446
|
+
console.log(` Invalid XML bundles: ${chalk.yellow(this.stats.invalidXml)}`);
|
|
1447
|
+
}
|
|
1448
|
+
|
|
1449
|
+
// Display warnings summary
|
|
1450
|
+
if (this.stats.warnings.length > 0) {
|
|
1451
|
+
console.log(chalk.yellow('\n⚠ Missing Dependencies by Agent:'));
|
|
1452
|
+
|
|
1453
|
+
// Group and display warnings by agent
|
|
1454
|
+
for (const agentWarning of this.stats.warnings) {
|
|
1455
|
+
if (agentWarning && agentWarning.warnings && agentWarning.warnings.length > 0) {
|
|
1456
|
+
console.log(chalk.bold(`\n ${agentWarning.agent}:`));
|
|
1457
|
+
// Display unique warnings for this agent
|
|
1458
|
+
const uniqueWarnings = [...new Set(agentWarning.warnings)];
|
|
1459
|
+
for (const warning of uniqueWarnings) {
|
|
1460
|
+
console.log(chalk.dim(` • ${warning}`));
|
|
1461
|
+
}
|
|
1462
|
+
}
|
|
1463
|
+
}
|
|
1464
|
+
}
|
|
1465
|
+
|
|
1466
|
+
// Final status
|
|
1467
|
+
if (this.stats.invalidXml > 0) {
|
|
1468
|
+
console.log(chalk.yellow('\n⚠ Some bundles have invalid XML. Please review the output.'));
|
|
1469
|
+
} else if (this.stats.failedAgents > 0) {
|
|
1470
|
+
console.log(chalk.yellow('\n⚠ Some agents failed to bundle. Please review the errors.'));
|
|
1471
|
+
} else {
|
|
1472
|
+
console.log(chalk.green('\n✨ All bundles generated successfully!'));
|
|
1473
|
+
}
|
|
1474
|
+
|
|
1475
|
+
console.log(chalk.cyan.bold('\n═══════════════════════════════════════════════\n'));
|
|
1476
|
+
}
|
|
1477
|
+
}
|
|
1478
|
+
|
|
1479
|
+
module.exports = { WebBundler };
|