bmad-method 6.0.0-alpha.0 → 6.0.0-alpha.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/ISSUE_TEMPLATE/config.yaml +4 -0
- package/.github/ISSUE_TEMPLATE/idea_submission.md +3 -3
- package/.github/workflows/bundle-latest.yaml +277 -0
- package/.github/workflows/manual-release.yaml +64 -17
- package/.github/workflows/quality.yaml +78 -0
- package/.husky/pre-commit +4 -0
- package/.prettierignore +6 -0
- package/.vscode/settings.json +3 -1
- package/CHANGELOG.md +1211 -2
- package/CONTRIBUTING.md +2 -13
- package/README.md +442 -0
- package/docs/BUNDLE_DISTRIBUTION_SETUP.md +95 -0
- package/docs/agent-customization-guide.md +208 -0
- package/docs/document-sharding-guide.md +449 -0
- package/docs/ide-info/auggie.md +2 -2
- package/docs/ide-info/claude-code.md +4 -4
- package/docs/ide-info/codex.md +9 -20
- package/docs/ide-info/crush.md +1 -1
- package/docs/ide-info/cursor.md +7 -7
- package/docs/ide-info/iflow.md +3 -3
- package/docs/ide-info/opencode.md +24 -0
- package/docs/index.md +227 -0
- package/docs/installers-bundlers/ide-injections.md +2 -12
- package/docs/installers-bundlers/installers-modules-platforms-reference.md +100 -67
- package/docs/v4-to-v6-upgrade.md +227 -0
- package/docs/web-bundles-gemini-gpt-guide.md +473 -0
- package/eslint.config.mjs +6 -2
- package/package.json +13 -6
- package/src/core/_module-installer/install-config.yaml +35 -0
- package/src/core/_module-installer/installer.js +1 -9
- package/src/core/agents/bmad-master.agent.yaml +39 -0
- package/src/core/agents/bmad-web-orchestrator.agent.xml +113 -0
- package/src/core/tasks/advanced-elicitation-methods.csv +21 -0
- package/src/core/tasks/{adv-elicit.md → advanced-elicitation.xml} +11 -14
- package/src/core/tasks/{index-docs.md → index-docs.xml} +6 -10
- package/src/core/tasks/{validate-workflow.md → validate-workflow.xml} +4 -7
- package/src/core/tasks/workflow.xml +270 -0
- package/src/core/tools/shard-doc.xml +109 -0
- package/src/{modules/cis → core}/workflows/brainstorming/README.md +8 -18
- package/src/{modules/cis → core}/workflows/brainstorming/instructions.md +29 -24
- package/src/{modules/cis → core}/workflows/brainstorming/template.md +6 -2
- package/src/{modules/cis → core}/workflows/brainstorming/workflow.yaml +17 -9
- package/src/core/workflows/party-mode/instructions.md +27 -25
- package/src/core/workflows/party-mode/workflow.yaml +14 -10
- package/src/modules/bmb/README.md +194 -0
- package/src/modules/bmb/_module-installer/install-config.yaml +31 -0
- package/src/modules/bmb/agents/bmad-builder.agent.yaml +57 -0
- package/src/modules/bmb/workflows/audit-workflow/checklist.md +142 -0
- package/src/modules/bmb/workflows/audit-workflow/instructions.md +341 -0
- package/src/modules/bmb/workflows/audit-workflow/template.md +118 -0
- package/src/modules/bmb/workflows/audit-workflow/workflow.yaml +25 -0
- package/src/modules/bmb/workflows/convert-legacy/README.md +34 -34
- package/src/modules/bmb/workflows/convert-legacy/checklist.md +22 -21
- package/src/modules/bmb/workflows/convert-legacy/instructions.md +135 -86
- package/src/modules/bmb/workflows/convert-legacy/workflow.yaml +10 -15
- package/src/modules/bmb/workflows/create-agent/README.md +144 -209
- package/src/modules/bmb/workflows/create-agent/agent-architecture.md +68 -65
- package/src/modules/bmb/workflows/create-agent/agent-command-patterns.md +174 -172
- package/src/modules/bmb/workflows/create-agent/agent-types.md +139 -24
- package/src/modules/bmb/workflows/create-agent/brainstorm-context.md +4 -4
- package/src/modules/bmb/workflows/create-agent/checklist.md +30 -102
- package/src/modules/bmb/workflows/create-agent/communication-styles.md +22 -60
- package/src/modules/bmb/workflows/create-agent/instructions.md +339 -221
- package/src/modules/bmb/workflows/create-agent/workflow.yaml +28 -19
- package/src/modules/bmb/workflows/create-module/README.md +164 -153
- package/src/modules/bmb/workflows/create-module/brainstorm-context.md +1 -1
- package/src/modules/bmb/workflows/create-module/checklist.md +21 -31
- package/src/modules/bmb/workflows/create-module/installer-templates/install-config.yaml +92 -0
- package/src/modules/bmb/workflows/create-module/installer-templates/installer.js +1 -1
- package/src/modules/bmb/workflows/create-module/instructions.md +306 -238
- package/src/modules/bmb/workflows/create-module/module-structure.md +135 -45
- package/src/modules/bmb/workflows/create-module/workflow.yaml +32 -27
- package/src/modules/bmb/workflows/create-workflow/README.md +70 -9
- package/src/modules/bmb/workflows/create-workflow/brainstorm-context.md +4 -4
- package/src/modules/bmb/workflows/create-workflow/checklist.md +22 -0
- package/src/modules/bmb/workflows/create-workflow/instructions.md +505 -47
- package/src/modules/bmb/workflows/create-workflow/workflow-creation-guide.md +939 -68
- package/src/modules/bmb/workflows/create-workflow/workflow-template/instructions.md +6 -3
- package/src/modules/bmb/workflows/create-workflow/workflow-template/workflow.yaml +31 -5
- package/src/modules/bmb/workflows/create-workflow/workflow.yaml +16 -17
- package/src/modules/bmb/workflows/edit-agent/README.md +112 -0
- package/src/modules/bmb/workflows/edit-agent/checklist.md +112 -0
- package/src/modules/bmb/workflows/edit-agent/instructions.md +290 -0
- package/src/modules/bmb/workflows/edit-agent/workflow.yaml +33 -0
- package/src/modules/bmb/workflows/edit-module/README.md +187 -0
- package/src/modules/bmb/workflows/edit-module/checklist.md +165 -0
- package/src/modules/bmb/workflows/edit-module/instructions.md +341 -0
- package/src/modules/bmb/workflows/edit-module/workflow.yaml +34 -0
- package/src/modules/bmb/workflows/edit-workflow/README.md +58 -2
- package/src/modules/bmb/workflows/edit-workflow/instructions.md +290 -118
- package/src/modules/bmb/workflows/edit-workflow/workflow.yaml +9 -16
- package/src/modules/bmb/workflows/module-brief/README.md +17 -17
- package/src/modules/bmb/workflows/module-brief/checklist.md +6 -6
- package/src/modules/bmb/workflows/module-brief/instructions.md +10 -7
- package/src/modules/bmb/workflows/module-brief/template.md +9 -9
- package/src/modules/bmb/workflows/module-brief/workflow.yaml +16 -10
- package/src/modules/bmb/workflows/redoc/README.md +5 -5
- package/src/modules/bmb/workflows/redoc/checklist.md +2 -2
- package/src/modules/bmb/workflows/redoc/instructions.md +20 -10
- package/src/modules/bmb/workflows/redoc/workflow.yaml +6 -5
- package/src/modules/bmgd/README.md +208 -0
- package/src/modules/bmgd/_module-installer/install-config.yaml +54 -0
- package/src/modules/bmgd/agents/game-architect.agent.yaml +33 -0
- package/src/modules/bmgd/agents/game-designer.agent.yaml +40 -0
- package/src/modules/bmgd/agents/game-dev.agent.yaml +40 -0
- package/src/modules/bmgd/agents/game-scrum-master.agent.yaml +75 -0
- package/src/modules/bmgd/teams/default-party.csv +10 -0
- package/src/modules/bmgd/teams/team-gamedev.yaml +18 -0
- package/src/modules/{bmm/workflows/1-analysis → bmgd/workflows/1-preproduction}/brainstorm-game/game-context.md +3 -3
- package/src/modules/bmgd/workflows/1-preproduction/brainstorm-game/instructions.md +130 -0
- package/src/modules/bmgd/workflows/1-preproduction/brainstorm-game/workflow.yaml +41 -0
- package/src/modules/{bmm/workflows/1-analysis → bmgd/workflows/1-preproduction}/game-brief/checklist.md +2 -2
- package/src/modules/bmgd/workflows/1-preproduction/game-brief/instructions.md +373 -0
- package/src/modules/{bmm/workflows/1-analysis → bmgd/workflows/1-preproduction}/game-brief/template.md +2 -2
- package/src/modules/bmgd/workflows/1-preproduction/game-brief/workflow.yaml +36 -0
- package/src/modules/bmgd/workflows/2-design/gdd/checklist.md +148 -0
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/action-platformer.md +1 -1
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/adventure.md +1 -1
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/card-game.md +2 -2
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/fighting.md +1 -1
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/horror.md +2 -2
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/idle-incremental.md +1 -1
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/moba.md +4 -4
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/party-game.md +1 -1
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/racing.md +3 -3
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/rhythm.md +1 -1
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/roguelike.md +2 -2
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/rpg.md +3 -3
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/sandbox.md +4 -4
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/shooter.md +3 -3
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/simulation.md +3 -3
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/sports.md +3 -3
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/strategy.md +3 -3
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/survival.md +2 -2
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/text-based.md +3 -3
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/tower-defense.md +5 -5
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/turn-based-tactics.md +4 -4
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/visual-novel.md +1 -1
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/gdd-template.md +6 -12
- package/src/modules/bmgd/workflows/2-design/gdd/instructions-gdd.md +502 -0
- package/src/modules/bmgd/workflows/2-design/gdd/workflow.yaml +81 -0
- package/src/modules/bmgd/workflows/2-design/narrative/checklist.md +139 -0
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/narrative/instructions-narrative.md +99 -12
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/narrative/narrative-template.md +8 -8
- package/src/modules/bmgd/workflows/2-design/narrative/workflow.yaml +32 -0
- package/src/modules/bmgd/workflows/3-technical/game-architecture/architecture-patterns.yaml +321 -0
- package/src/modules/bmgd/workflows/3-technical/game-architecture/architecture-template.md +103 -0
- package/src/modules/bmgd/workflows/3-technical/game-architecture/checklist.md +240 -0
- package/src/modules/bmgd/workflows/3-technical/game-architecture/decision-catalog.yaml +222 -0
- package/src/modules/bmgd/workflows/3-technical/game-architecture/instructions.md +701 -0
- package/src/modules/bmgd/workflows/3-technical/game-architecture/pattern-categories.csv +13 -0
- package/src/modules/bmgd/workflows/3-technical/game-architecture/workflow.yaml +69 -0
- package/src/modules/bmgd/workflows/4-production/code-review/instructions.md +398 -0
- package/src/modules/bmgd/workflows/4-production/code-review/workflow.yaml +61 -0
- package/src/modules/bmgd/workflows/4-production/correct-course/checklist.md +279 -0
- package/src/modules/bmgd/workflows/4-production/correct-course/instructions.md +206 -0
- package/src/modules/bmgd/workflows/4-production/correct-course/workflow.yaml +58 -0
- package/src/modules/bmgd/workflows/4-production/create-story/checklist.md +240 -0
- package/src/modules/bmgd/workflows/4-production/create-story/instructions.md +256 -0
- package/src/modules/bmgd/workflows/4-production/create-story/template.md +51 -0
- package/src/modules/bmgd/workflows/4-production/create-story/workflow.yaml +74 -0
- package/src/modules/bmgd/workflows/4-production/dev-story/checklist.md +38 -0
- package/src/modules/bmgd/workflows/4-production/dev-story/instructions.md +267 -0
- package/src/modules/bmgd/workflows/4-production/dev-story/workflow.yaml +58 -0
- package/src/modules/{bmm/workflows/3-solutioning/tech-spec → bmgd/workflows/4-production/epic-tech-context}/checklist.md +1 -1
- package/src/modules/bmgd/workflows/4-production/epic-tech-context/instructions.md +164 -0
- package/src/modules/{bmm/workflows/3-solutioning/tech-spec → bmgd/workflows/4-production/epic-tech-context}/template.md +1 -1
- package/src/modules/bmgd/workflows/4-production/epic-tech-context/workflow.yaml +58 -0
- package/src/modules/bmgd/workflows/4-production/retrospective/instructions.md +1443 -0
- package/src/modules/bmgd/workflows/4-production/retrospective/workflow.yaml +57 -0
- package/src/modules/bmgd/workflows/4-production/sprint-planning/checklist.md +33 -0
- package/src/modules/bmgd/workflows/4-production/sprint-planning/instructions.md +234 -0
- package/src/modules/bmgd/workflows/4-production/sprint-planning/sprint-status-template.yaml +55 -0
- package/src/modules/bmgd/workflows/4-production/sprint-planning/workflow.yaml +51 -0
- package/src/modules/bmgd/workflows/4-production/story-context/checklist.md +16 -0
- package/src/modules/bmgd/workflows/4-production/story-context/context-template.xml +34 -0
- package/src/modules/bmgd/workflows/4-production/story-context/instructions.md +209 -0
- package/src/modules/bmgd/workflows/4-production/story-context/workflow.yaml +63 -0
- package/src/modules/bmgd/workflows/4-production/story-done/instructions.md +111 -0
- package/src/modules/bmgd/workflows/4-production/story-done/workflow.yaml +28 -0
- package/src/modules/bmgd/workflows/4-production/story-ready/instructions.md +117 -0
- package/src/modules/bmgd/workflows/4-production/story-ready/workflow.yaml +25 -0
- package/src/modules/bmm/README.md +128 -0
- package/src/modules/bmm/_module-installer/install-config.yaml +60 -0
- package/src/modules/bmm/_module-installer/installer.js +3 -3
- package/src/modules/bmm/_module-installer/platform-specifics/claude-code.js +1 -1
- package/src/modules/bmm/_module-installer/platform-specifics/windsurf.js +1 -1
- package/src/modules/bmm/agents/analyst.agent.yaml +49 -0
- package/src/modules/bmm/agents/architect.agent.yaml +42 -0
- package/src/modules/bmm/agents/dev.agent.yaml +40 -0
- package/src/modules/bmm/agents/frame-expert.agent.yaml +42 -0
- package/src/modules/bmm/agents/pm.agent.yaml +64 -0
- package/src/modules/bmm/agents/sm.agent.yaml +73 -0
- package/src/modules/bmm/agents/tea.agent.yaml +67 -0
- package/src/modules/bmm/agents/tech-writer.agent.yaml +68 -0
- package/src/modules/bmm/agents/ux-designer.agent.yaml +39 -0
- package/src/modules/bmm/docs/README.md +236 -0
- package/src/modules/bmm/docs/agents-guide.md +1058 -0
- package/src/modules/bmm/docs/brownfield-guide.md +762 -0
- package/src/modules/bmm/docs/enterprise-agentic-development.md +686 -0
- package/src/modules/bmm/docs/faq.md +588 -0
- package/src/modules/bmm/docs/glossary.md +320 -0
- package/src/modules/bmm/docs/party-mode.md +224 -0
- package/src/modules/bmm/docs/quick-spec-flow.md +652 -0
- package/src/modules/bmm/docs/quick-start.md +376 -0
- package/src/modules/bmm/docs/scale-adaptive-system.md +612 -0
- package/src/modules/bmm/docs/test-architecture.md +396 -0
- package/src/modules/bmm/docs/workflow-architecture-reference.md +366 -0
- package/src/modules/bmm/docs/workflow-document-project-reference.md +489 -0
- package/src/modules/bmm/docs/workflows-analysis.md +370 -0
- package/src/modules/bmm/docs/workflows-implementation.md +286 -0
- package/src/modules/bmm/docs/workflows-planning.md +612 -0
- package/src/modules/bmm/docs/workflows-solutioning.md +554 -0
- package/src/modules/bmm/teams/default-party.csv +20 -0
- package/src/modules/bmm/teams/team-fullstack.yaml +13 -0
- package/src/modules/bmm/testarch/knowledge/ci-burn-in.md +675 -0
- package/src/modules/bmm/testarch/knowledge/component-tdd.md +486 -0
- package/src/modules/bmm/testarch/knowledge/contract-testing.md +957 -0
- package/src/modules/bmm/testarch/knowledge/data-factories.md +500 -0
- package/src/modules/bmm/testarch/knowledge/email-auth.md +721 -0
- package/src/modules/bmm/testarch/knowledge/error-handling.md +725 -0
- package/src/modules/bmm/testarch/knowledge/feature-flags.md +750 -0
- package/src/modules/bmm/testarch/knowledge/fixture-architecture.md +401 -0
- package/src/modules/bmm/testarch/knowledge/network-first.md +486 -0
- package/src/modules/bmm/testarch/knowledge/nfr-criteria.md +670 -0
- package/src/modules/bmm/testarch/knowledge/playwright-config.md +730 -0
- package/src/modules/bmm/testarch/knowledge/probability-impact.md +601 -0
- package/src/modules/bmm/testarch/knowledge/risk-governance.md +615 -0
- package/src/modules/bmm/testarch/knowledge/selective-testing.md +732 -0
- package/src/modules/bmm/testarch/knowledge/selector-resilience.md +527 -0
- package/src/modules/bmm/testarch/knowledge/test-healing-patterns.md +644 -0
- package/src/modules/bmm/testarch/knowledge/test-levels-framework.md +473 -0
- package/src/modules/bmm/testarch/knowledge/test-priorities-matrix.md +373 -0
- package/src/modules/bmm/testarch/knowledge/test-quality.md +664 -0
- package/src/modules/bmm/testarch/knowledge/timing-debugging.md +372 -0
- package/src/modules/bmm/testarch/knowledge/visual-debugging.md +524 -0
- package/src/modules/bmm/testarch/tea-index.csv +22 -0
- package/src/modules/bmm/workflows/1-analysis/brainstorm-project/instructions.md +82 -8
- package/src/modules/bmm/workflows/1-analysis/brainstorm-project/project-context.md +4 -4
- package/src/modules/bmm/workflows/1-analysis/brainstorm-project/workflow.yaml +23 -5
- package/src/modules/bmm/workflows/1-analysis/domain-research/instructions.md +425 -0
- package/src/modules/bmm/workflows/1-analysis/domain-research/template.md +180 -0
- package/src/modules/bmm/workflows/1-analysis/domain-research/workflow.yaml +56 -0
- package/src/modules/bmm/workflows/1-analysis/product-brief/checklist.md +2 -2
- package/src/modules/bmm/workflows/1-analysis/product-brief/instructions.md +418 -247
- package/src/modules/bmm/workflows/1-analysis/product-brief/template.md +93 -77
- package/src/modules/bmm/workflows/1-analysis/product-brief/workflow.yaml +42 -14
- package/src/modules/bmm/workflows/1-analysis/research/checklist-deep-prompt.md +144 -0
- package/src/modules/bmm/workflows/1-analysis/research/checklist-technical.md +249 -0
- package/src/modules/bmm/workflows/1-analysis/research/checklist.md +156 -59
- package/src/modules/bmm/workflows/1-analysis/research/instructions-deep-prompt.md +115 -47
- package/src/modules/bmm/workflows/1-analysis/research/instructions-market.md +236 -114
- package/src/modules/bmm/workflows/1-analysis/research/instructions-router.md +109 -66
- package/src/modules/bmm/workflows/1-analysis/research/instructions-technical.md +147 -55
- package/src/modules/bmm/workflows/1-analysis/research/template-deep-prompt.md +1 -1
- package/src/modules/bmm/workflows/1-analysis/research/template-market.md +38 -2
- package/src/modules/bmm/workflows/1-analysis/research/template-technical.md +36 -1
- package/src/modules/bmm/workflows/1-analysis/research/workflow.yaml +36 -123
- package/src/modules/bmm/workflows/2-plan-workflows/create-epics-and-stories/epics-template.md +80 -0
- package/src/modules/bmm/workflows/2-plan-workflows/create-epics-and-stories/instructions.md +616 -0
- package/src/modules/bmm/workflows/2-plan-workflows/create-epics-and-stories/workflow.yaml +63 -0
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/checklist.md +310 -0
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/instructions.md +1308 -0
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/ux-design-template.md +145 -0
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/workflow.yaml +93 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/checklist.md +346 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/domain-complexity.csv +13 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/instructions.md +703 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/prd-template.md +204 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/project-types.csv +11 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/workflow.yaml +78 -0
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/checklist.md +217 -0
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/epics-template.md +74 -0
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/instructions-generate-stories.md +436 -0
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/instructions.md +980 -0
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/tech-spec-template.md +181 -0
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/user-story-template.md +90 -0
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/workflow.yaml +60 -0
- package/src/modules/bmm/workflows/3-solutioning/architecture/architecture-patterns.yaml +321 -0
- package/src/modules/bmm/workflows/3-solutioning/architecture/architecture-template.md +103 -0
- package/src/modules/bmm/workflows/3-solutioning/architecture/checklist.md +240 -0
- package/src/modules/bmm/workflows/3-solutioning/architecture/decision-catalog.yaml +222 -0
- package/src/modules/bmm/workflows/3-solutioning/architecture/instructions.md +768 -0
- package/src/modules/bmm/workflows/3-solutioning/architecture/pattern-categories.csv +13 -0
- package/src/modules/bmm/workflows/3-solutioning/architecture/workflow.yaml +100 -0
- package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/checklist.md +169 -0
- package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/instructions.md +332 -0
- package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/template.md +146 -0
- package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/workflow.yaml +64 -0
- package/src/modules/bmm/workflows/4-implementation/code-review/backlog_template.md +12 -0
- package/src/modules/bmm/workflows/4-implementation/code-review/checklist.md +22 -0
- package/src/modules/bmm/workflows/4-implementation/code-review/instructions.md +398 -0
- package/src/modules/bmm/workflows/4-implementation/code-review/workflow.yaml +61 -0
- package/src/modules/bmm/workflows/4-implementation/correct-course/checklist.md +6 -6
- package/src/modules/bmm/workflows/4-implementation/correct-course/instructions.md +70 -54
- package/src/modules/bmm/workflows/4-implementation/correct-course/workflow.yaml +44 -21
- package/src/modules/bmm/workflows/4-implementation/create-story/checklist.md +240 -39
- package/src/modules/bmm/workflows/4-implementation/create-story/instructions.md +203 -28
- package/src/modules/bmm/workflows/4-implementation/create-story/template.md +2 -8
- package/src/modules/bmm/workflows/4-implementation/create-story/workflow.yaml +43 -42
- package/src/modules/bmm/workflows/4-implementation/dev-story/checklist.md +1 -1
- package/src/modules/bmm/workflows/4-implementation/dev-story/instructions.md +220 -40
- package/src/modules/bmm/workflows/4-implementation/dev-story/workflow.yaml +43 -38
- package/src/modules/bmm/workflows/4-implementation/epic-tech-context/checklist.md +17 -0
- package/src/modules/bmm/workflows/4-implementation/epic-tech-context/instructions.md +164 -0
- package/src/modules/bmm/workflows/4-implementation/epic-tech-context/template.md +76 -0
- package/src/modules/bmm/workflows/4-implementation/epic-tech-context/workflow.yaml +58 -0
- package/src/modules/bmm/workflows/4-implementation/retrospective/instructions.md +1280 -228
- package/src/modules/bmm/workflows/4-implementation/retrospective/workflow.yaml +41 -25
- package/src/modules/bmm/workflows/4-implementation/sprint-planning/checklist.md +33 -0
- package/src/modules/bmm/workflows/4-implementation/sprint-planning/instructions.md +234 -0
- package/src/modules/bmm/workflows/4-implementation/sprint-planning/sprint-status-template.yaml +55 -0
- package/src/modules/bmm/workflows/4-implementation/sprint-planning/workflow.yaml +51 -0
- package/src/modules/bmm/workflows/4-implementation/story-context/checklist.md +1 -1
- package/src/modules/bmm/workflows/4-implementation/story-context/context-template.xml +1 -1
- package/src/modules/bmm/workflows/4-implementation/story-context/instructions.md +155 -22
- package/src/modules/bmm/workflows/4-implementation/story-context/workflow.yaml +43 -36
- package/src/modules/bmm/workflows/4-implementation/story-done/instructions.md +111 -0
- package/src/modules/bmm/workflows/4-implementation/story-done/workflow.yaml +28 -0
- package/src/modules/bmm/workflows/4-implementation/story-ready/instructions.md +117 -0
- package/src/modules/bmm/workflows/4-implementation/story-ready/workflow.yaml +25 -0
- package/src/modules/bmm/workflows/document-project/checklist.md +245 -0
- package/src/modules/bmm/workflows/document-project/documentation-requirements.csv +12 -0
- package/src/modules/bmm/workflows/document-project/instructions.md +222 -0
- package/src/modules/bmm/workflows/document-project/templates/deep-dive-template.md +345 -0
- package/src/modules/bmm/workflows/document-project/templates/index-template.md +169 -0
- package/src/modules/bmm/workflows/document-project/templates/project-overview-template.md +103 -0
- package/src/modules/bmm/workflows/document-project/templates/project-scan-report-schema.json +160 -0
- package/src/modules/bmm/workflows/document-project/templates/source-tree-template.md +135 -0
- package/src/modules/bmm/workflows/document-project/workflow.yaml +31 -0
- package/src/modules/bmm/workflows/document-project/workflows/deep-dive-instructions.md +298 -0
- package/src/modules/bmm/workflows/document-project/workflows/deep-dive.yaml +31 -0
- package/src/modules/bmm/workflows/document-project/workflows/full-scan-instructions.md +1106 -0
- package/src/modules/bmm/workflows/document-project/workflows/full-scan.yaml +31 -0
- package/src/modules/bmm/workflows/frame-expert/_shared/excalidraw-helpers.md +127 -0
- package/src/modules/bmm/workflows/frame-expert/_shared/excalidraw-library.json +90 -0
- package/src/modules/bmm/workflows/frame-expert/_shared/excalidraw-templates.yaml +127 -0
- package/src/modules/bmm/workflows/frame-expert/_shared/validate-json-instructions.md +79 -0
- package/src/modules/bmm/workflows/frame-expert/create-dataflow/checklist.md +39 -0
- package/src/modules/bmm/workflows/frame-expert/create-dataflow/instructions.md +131 -0
- package/src/modules/bmm/workflows/frame-expert/create-dataflow/workflow.yaml +24 -0
- package/src/modules/bmm/workflows/frame-expert/create-diagram/checklist.md +43 -0
- package/src/modules/bmm/workflows/frame-expert/create-diagram/instructions.md +142 -0
- package/src/modules/bmm/workflows/frame-expert/create-diagram/workflow.yaml +25 -0
- package/src/modules/bmm/workflows/frame-expert/create-flowchart/checklist.md +49 -0
- package/src/modules/bmm/workflows/frame-expert/create-flowchart/instructions.md +242 -0
- package/src/modules/bmm/workflows/frame-expert/create-flowchart/workflow.yaml +28 -0
- package/src/modules/bmm/workflows/frame-expert/create-wireframe/checklist.md +38 -0
- package/src/modules/bmm/workflows/frame-expert/create-wireframe/instructions.md +133 -0
- package/src/modules/bmm/workflows/frame-expert/create-wireframe/workflow.yaml +24 -0
- package/src/modules/bmm/workflows/techdoc/documentation-standards.md +262 -0
- package/src/modules/bmm/workflows/testarch/atdd/atdd-checklist-template.md +363 -0
- package/src/modules/bmm/workflows/testarch/atdd/checklist.md +373 -0
- package/src/modules/bmm/workflows/testarch/atdd/instructions.md +785 -0
- package/src/modules/bmm/workflows/testarch/atdd/workflow.yaml +47 -0
- package/src/modules/bmm/workflows/testarch/automate/checklist.md +580 -0
- package/src/modules/bmm/workflows/testarch/automate/instructions.md +1303 -0
- package/src/modules/bmm/workflows/testarch/automate/workflow.yaml +54 -0
- package/src/modules/bmm/workflows/testarch/ci/checklist.md +246 -0
- package/src/modules/bmm/workflows/testarch/ci/github-actions-template.yaml +165 -0
- package/src/modules/bmm/workflows/testarch/ci/gitlab-ci-template.yaml +128 -0
- package/src/modules/bmm/workflows/testarch/ci/instructions.md +517 -0
- package/src/modules/bmm/workflows/testarch/ci/workflow.yaml +47 -0
- package/src/modules/bmm/workflows/testarch/framework/checklist.md +321 -0
- package/src/modules/bmm/workflows/testarch/framework/instructions.md +455 -0
- package/src/modules/bmm/workflows/testarch/framework/workflow.yaml +49 -0
- package/src/modules/bmm/workflows/testarch/nfr-assess/checklist.md +405 -0
- package/src/modules/bmm/workflows/testarch/nfr-assess/instructions.md +722 -0
- package/src/modules/bmm/workflows/testarch/nfr-assess/nfr-report-template.md +443 -0
- package/src/modules/bmm/workflows/testarch/nfr-assess/workflow.yaml +49 -0
- package/src/modules/bmm/workflows/testarch/test-design/checklist.md +234 -0
- package/src/modules/bmm/workflows/testarch/test-design/instructions.md +782 -0
- package/src/modules/bmm/workflows/testarch/test-design/test-design-template.md +285 -0
- package/src/modules/bmm/workflows/testarch/test-design/workflow.yaml +50 -0
- package/src/modules/bmm/workflows/testarch/test-review/checklist.md +470 -0
- package/src/modules/bmm/workflows/testarch/test-review/instructions.md +608 -0
- package/src/modules/bmm/workflows/testarch/test-review/test-review-template.md +388 -0
- package/src/modules/bmm/workflows/testarch/test-review/workflow.yaml +48 -0
- package/src/modules/bmm/workflows/testarch/trace/checklist.md +654 -0
- package/src/modules/bmm/workflows/testarch/trace/instructions.md +1045 -0
- package/src/modules/bmm/workflows/testarch/trace/trace-template.md +673 -0
- package/src/modules/bmm/workflows/testarch/trace/workflow.yaml +57 -0
- package/src/modules/bmm/workflows/workflow-status/init/instructions.md +334 -0
- package/src/modules/bmm/workflows/workflow-status/init/workflow.yaml +29 -0
- package/src/modules/bmm/workflows/workflow-status/instructions.md +388 -0
- package/src/modules/bmm/workflows/workflow-status/paths/enterprise-brownfield.yaml +138 -0
- package/src/modules/bmm/workflows/workflow-status/paths/enterprise-greenfield.yaml +126 -0
- package/src/modules/bmm/workflows/workflow-status/paths/game-design.yaml +52 -0
- package/src/modules/bmm/workflows/workflow-status/paths/method-brownfield.yaml +122 -0
- package/src/modules/bmm/workflows/workflow-status/paths/method-greenfield.yaml +113 -0
- package/src/modules/bmm/workflows/workflow-status/paths/quick-flow-brownfield.yaml +58 -0
- package/src/modules/bmm/workflows/workflow-status/paths/quick-flow-greenfield.yaml +47 -0
- package/src/modules/bmm/workflows/workflow-status/project-levels.yaml +59 -0
- package/src/modules/bmm/workflows/workflow-status/workflow-status-template.yaml +24 -0
- package/src/modules/bmm/workflows/workflow-status/workflow.yaml +30 -0
- package/src/modules/cis/README.md +153 -0
- package/src/modules/cis/_module-installer/{install-menu-config.yaml → install-config.yaml} +6 -4
- package/src/modules/cis/_module-installer/installer.js +1 -1
- package/src/modules/cis/agents/README.md +1 -1
- package/src/modules/cis/agents/brainstorming-coach.agent.yaml +28 -0
- package/src/modules/cis/agents/creative-problem-solver.agent.yaml +28 -0
- package/src/modules/cis/agents/design-thinking-coach.agent.yaml +28 -0
- package/src/modules/cis/agents/innovation-strategist.agent.yaml +28 -0
- package/src/modules/cis/agents/storyteller.agent.yaml +28 -0
- package/src/modules/cis/teams/creative-squad.yaml +1 -0
- package/src/modules/cis/teams/default-party.csv +11 -0
- package/src/modules/cis/workflows/README.md +102 -30
- package/src/modules/cis/workflows/design-thinking/design-methods.csv +1 -1
- package/src/modules/cis/workflows/design-thinking/instructions.md +4 -2
- package/src/modules/cis/workflows/design-thinking/workflow.yaml +16 -7
- package/src/modules/cis/workflows/innovation-strategy/innovation-frameworks.csv +2 -2
- package/src/modules/cis/workflows/innovation-strategy/instructions.md +7 -5
- package/src/modules/cis/workflows/innovation-strategy/template.md +6 -6
- package/src/modules/cis/workflows/innovation-strategy/workflow.yaml +16 -7
- package/src/modules/cis/workflows/problem-solving/instructions.md +4 -2
- package/src/modules/cis/workflows/problem-solving/solving-methods.csv +6 -6
- package/src/modules/cis/workflows/problem-solving/template.md +3 -3
- package/src/modules/cis/workflows/problem-solving/workflow.yaml +16 -7
- package/src/modules/cis/workflows/storytelling/instructions.md +48 -30
- package/src/modules/cis/workflows/storytelling/template.md +2 -2
- package/src/modules/cis/workflows/storytelling/workflow.yaml +16 -7
- package/src/utility/models/action-command-header.md +0 -0
- package/src/utility/models/agent-activation-ide.xml +4 -4
- package/src/utility/models/agent-activation-web.xml +60 -0
- package/src/utility/models/agent-command-header.md +1 -0
- package/src/utility/models/agent-in-team-activation.xml +3 -0
- package/src/utility/models/fragments/activation-rules.xml +8 -0
- package/src/utility/models/fragments/activation-steps.xml +16 -0
- package/src/utility/models/fragments/handler-action.xml +4 -0
- package/src/utility/models/fragments/handler-data.xml +5 -0
- package/src/utility/models/fragments/handler-exec.xml +5 -0
- package/src/utility/models/fragments/handler-tmpl.xml +5 -0
- package/src/utility/models/fragments/handler-validate-workflow.xml +7 -0
- package/src/utility/models/fragments/handler-workflow.xml +9 -0
- package/src/utility/models/fragments/menu-handlers.xml +6 -0
- package/src/utility/models/fragments/web-bundle-activation-steps.xml +32 -0
- package/src/utility/templates/agent.customize.template.yaml +42 -0
- package/test/README.md +295 -0
- package/test/fixtures/agent-schema/invalid/critical-actions/actions-as-string.agent.yaml +26 -0
- package/test/fixtures/agent-schema/invalid/critical-actions/empty-string-in-actions.agent.yaml +29 -0
- package/test/fixtures/agent-schema/invalid/menu/empty-menu.agent.yaml +21 -0
- package/test/fixtures/agent-schema/invalid/menu/missing-menu.agent.yaml +19 -0
- package/test/fixtures/agent-schema/invalid/menu-commands/empty-command-target.agent.yaml +24 -0
- package/test/fixtures/agent-schema/invalid/menu-commands/no-command-target.agent.yaml +23 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/camel-case.agent.yaml +24 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/duplicate-triggers.agent.yaml +30 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/empty-trigger.agent.yaml +24 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/leading-asterisk.agent.yaml +24 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/snake-case.agent.yaml +24 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/trigger-with-spaces.agent.yaml +24 -0
- package/test/fixtures/agent-schema/invalid/metadata/core-agent-with-module.agent.yaml +26 -0
- package/test/fixtures/agent-schema/invalid/metadata/empty-module-string.agent.yaml +26 -0
- package/test/fixtures/agent-schema/invalid/metadata/empty-name.agent.yaml +24 -0
- package/test/fixtures/agent-schema/invalid/metadata/extra-metadata-fields.agent.yaml +26 -0
- package/test/fixtures/agent-schema/invalid/metadata/missing-id.agent.yaml +23 -0
- package/test/fixtures/agent-schema/invalid/metadata/module-agent-missing-module.agent.yaml +25 -0
- package/test/fixtures/agent-schema/invalid/metadata/wrong-module-value.agent.yaml +26 -0
- package/test/fixtures/agent-schema/invalid/persona/empty-principles-array.agent.yaml +23 -0
- package/test/fixtures/agent-schema/invalid/persona/empty-string-in-principles.agent.yaml +26 -0
- package/test/fixtures/agent-schema/invalid/persona/extra-persona-fields.agent.yaml +26 -0
- package/test/fixtures/agent-schema/invalid/persona/missing-role.agent.yaml +23 -0
- package/test/fixtures/agent-schema/invalid/prompts/empty-content.agent.yaml +28 -0
- package/test/fixtures/agent-schema/invalid/prompts/extra-prompt-fields.agent.yaml +30 -0
- package/test/fixtures/agent-schema/invalid/prompts/missing-content.agent.yaml +27 -0
- package/test/fixtures/agent-schema/invalid/prompts/missing-id.agent.yaml +27 -0
- package/test/fixtures/agent-schema/invalid/top-level/empty-file.agent.yaml +5 -0
- package/test/fixtures/agent-schema/invalid/top-level/extra-top-level-keys.agent.yaml +27 -0
- package/test/fixtures/agent-schema/invalid/top-level/missing-agent-key.agent.yaml +11 -0
- package/test/fixtures/agent-schema/invalid/yaml-errors/invalid-indentation.agent.yaml +19 -0
- package/test/fixtures/agent-schema/invalid/yaml-errors/malformed-yaml.agent.yaml +18 -0
- package/test/fixtures/agent-schema/valid/critical-actions/empty-critical-actions.agent.yaml +23 -0
- package/test/fixtures/agent-schema/valid/critical-actions/no-critical-actions.agent.yaml +21 -0
- package/test/fixtures/agent-schema/valid/critical-actions/valid-critical-actions.agent.yaml +26 -0
- package/test/fixtures/agent-schema/valid/menu/multiple-menu-items.agent.yaml +30 -0
- package/test/fixtures/agent-schema/valid/menu/single-menu-item.agent.yaml +21 -0
- package/test/fixtures/agent-schema/valid/menu-commands/all-command-types.agent.yaml +39 -0
- package/test/fixtures/agent-schema/valid/menu-commands/multiple-commands.agent.yaml +23 -0
- package/test/fixtures/agent-schema/valid/menu-triggers/kebab-case-triggers.agent.yaml +33 -0
- package/test/fixtures/agent-schema/valid/metadata/empty-module-name-in-path.agent.yaml +23 -0
- package/test/fixtures/agent-schema/valid/metadata/malformed-path-treated-as-core.agent.yaml +23 -0
- package/test/fixtures/agent-schema/valid/metadata/module-agent-correct.agent.yaml +23 -0
- package/test/fixtures/agent-schema/valid/persona/complete-persona.agent.yaml +23 -0
- package/test/fixtures/agent-schema/valid/prompts/empty-prompts.agent.yaml +23 -0
- package/test/fixtures/agent-schema/valid/prompts/no-prompts.agent.yaml +21 -0
- package/test/fixtures/agent-schema/valid/prompts/valid-prompts-minimal.agent.yaml +27 -0
- package/test/fixtures/agent-schema/valid/prompts/valid-prompts-with-description.agent.yaml +29 -0
- package/test/fixtures/agent-schema/valid/top-level/minimal-core-agent.agent.yaml +23 -0
- package/test/test-agent-schema.js +387 -0
- package/test/test-cli-integration.sh +159 -0
- package/test/test-installation-components.js +214 -0
- package/test/unit-test-schema.js +133 -0
- package/tools/bmad-npx-wrapper.js +38 -0
- package/tools/cli/README.md +608 -0
- package/tools/cli/bmad-cli.js +0 -2
- package/tools/cli/bundlers/bundle-web.js +24 -2
- package/tools/cli/bundlers/test-bundler.js +1 -1
- package/tools/cli/bundlers/web-bundler.js +944 -49
- package/tools/cli/commands/build.js +458 -0
- package/tools/cli/commands/install.js +46 -8
- package/tools/cli/installers/lib/core/config-collector.js +490 -43
- package/tools/cli/installers/lib/core/dependency-resolver.js +5 -1
- package/tools/cli/installers/lib/core/detector.js +134 -13
- package/tools/cli/installers/lib/core/ide-config-manager.js +154 -0
- package/tools/cli/installers/lib/core/installer.js +1365 -167
- package/tools/cli/installers/lib/core/manifest-generator.js +388 -81
- package/tools/cli/installers/lib/core/manifest.js +100 -44
- package/tools/cli/installers/lib/ide/_base-ide.js +368 -23
- package/tools/cli/installers/lib/ide/auggie.js +100 -192
- package/tools/cli/installers/lib/ide/claude-code.js +167 -321
- package/tools/cli/installers/lib/ide/cline.js +146 -227
- package/tools/cli/installers/lib/ide/codex.js +138 -202
- package/tools/cli/installers/lib/ide/crush.js +108 -72
- package/tools/cli/installers/lib/ide/cursor.js +148 -20
- package/tools/cli/installers/lib/ide/gemini.js +109 -63
- package/tools/cli/installers/lib/ide/github-copilot.js +60 -47
- package/tools/cli/installers/lib/ide/iflow.js +13 -30
- package/tools/cli/installers/lib/ide/kilo.js +20 -16
- package/tools/cli/installers/lib/ide/manager.js +41 -35
- package/tools/cli/installers/lib/ide/opencode.js +212 -0
- package/tools/cli/installers/lib/ide/qwen.js +198 -68
- package/tools/cli/installers/lib/ide/roo.js +27 -62
- package/tools/cli/installers/lib/ide/shared/agent-command-generator.js +90 -0
- package/tools/cli/installers/lib/ide/shared/bmad-artifacts.js +143 -0
- package/tools/cli/installers/lib/ide/shared/module-injections.js +133 -0
- package/tools/cli/installers/lib/ide/shared/task-tool-command-generator.js +119 -0
- package/tools/cli/installers/lib/ide/shared/workflow-command-generator.js +237 -0
- package/tools/cli/installers/lib/ide/templates/agent-command-template.md +14 -0
- package/tools/cli/installers/lib/ide/templates/gemini-agent-command.toml +14 -0
- package/tools/cli/installers/lib/ide/templates/gemini-task-command.toml +12 -0
- package/tools/cli/installers/lib/ide/{workflow-command-template.md → templates/workflow-command-template.md} +7 -5
- package/tools/cli/installers/lib/ide/trae.js +138 -54
- package/tools/cli/installers/lib/ide/windsurf.js +104 -42
- package/tools/cli/installers/lib/modules/manager.js +332 -10
- package/tools/cli/lib/activation-builder.js +168 -0
- package/tools/cli/lib/agent-analyzer.js +81 -0
- package/tools/cli/lib/agent-party-generator.js +3 -3
- package/tools/cli/lib/cli-utils.js +52 -50
- package/tools/cli/lib/config.js +3 -1
- package/tools/cli/lib/ui.js +106 -14
- package/tools/cli/lib/xml-handler.js +47 -1
- package/tools/cli/lib/yaml-format.js +2 -1
- package/tools/cli/lib/yaml-xml-builder.js +507 -0
- package/tools/cli/regenerate-manifests.js +1 -1
- package/tools/cli/test-yaml-builder.js +43 -0
- package/tools/format-workflow-md.js +263 -0
- package/tools/platform-codes.yaml +6 -0
- package/tools/schema/agent.js +240 -0
- package/tools/validate-agent-schema.js +110 -0
- package/v6-open-items.md +17 -0
- package/.github/workflows/format-check.yaml +0 -43
- package/docs/codebase-flattener.md +0 -19
- package/readme.md +0 -216
- package/src/core/_module-installer/install-menu-config.yaml +0 -24
- package/src/core/agents/bmad-master.md +0 -27
- package/src/core/agents/bmad-web-orchestrator.md +0 -71
- package/src/core/tasks/shard-doc.md +0 -57
- package/src/core/tasks/workflow.md +0 -141
- package/src/core/workflows/bmad-init/instructions.md +0 -79
- package/src/core/workflows/bmad-init/workflow.yaml +0 -24
- package/src/modules/bmb/_module-installer/install-menu-config.yaml +0 -16
- package/src/modules/bmb/agents/bmad-builder.md +0 -30
- package/src/modules/bmb/workflows/create-module/installer-templates/install-module-config.yaml +0 -132
- package/src/modules/bmm/_module-installer/install-menu-config.yaml +0 -49
- package/src/modules/bmm/agents/analyst.md +0 -26
- package/src/modules/bmm/agents/architect.md +0 -29
- package/src/modules/bmm/agents/dev.md +0 -61
- package/src/modules/bmm/agents/game-architect.md +0 -26
- package/src/modules/bmm/agents/game-designer.md +0 -27
- package/src/modules/bmm/agents/game-dev.md +0 -28
- package/src/modules/bmm/agents/pm.md +0 -26
- package/src/modules/bmm/agents/po.md +0 -25
- package/src/modules/bmm/agents/sm.md +0 -29
- package/src/modules/bmm/agents/tea.md +0 -32
- package/src/modules/bmm/agents/ux-expert.md +0 -24
- package/src/modules/bmm/sub-modules/claude-code/config.yaml +0 -5
- package/src/modules/bmm/sub-modules/claude-code/injections.yaml +0 -242
- package/src/modules/bmm/sub-modules/claude-code/readme.md +0 -87
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/api-documenter.md +0 -85
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/codebase-analyzer.md +0 -64
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/data-analyst.md +0 -84
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/dependency-mapper.md +0 -67
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/document-reviewer.md +0 -85
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/epic-optimizer.md +0 -66
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/market-researcher.md +0 -34
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/pattern-detector.md +0 -67
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/requirements-analyst.md +0 -61
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/tech-debt-auditor.md +0 -89
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/technical-decisions-curator.md +0 -146
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/technical-evaluator.md +0 -51
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/test-coverage-analyzer.md +0 -91
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/trend-spotter.md +0 -99
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/user-journey-mapper.md +0 -101
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/user-researcher.md +0 -56
- package/src/modules/bmm/tasks/daily-standup.md +0 -91
- package/src/modules/bmm/tasks/retrospective.md +0 -110
- package/src/modules/bmm/teams/team-all.yaml +0 -7
- package/src/modules/bmm/teams/team-dev.yaml +0 -14
- package/src/modules/bmm/teams/team-gamedev.yaml +0 -9
- package/src/modules/bmm/testarch/atdd.md +0 -40
- package/src/modules/bmm/testarch/automate.md +0 -38
- package/src/modules/bmm/testarch/ci.md +0 -39
- package/src/modules/bmm/testarch/framework.md +0 -41
- package/src/modules/bmm/testarch/nfr-assess.md +0 -38
- package/src/modules/bmm/testarch/risk-profile.md +0 -38
- package/src/modules/bmm/testarch/tea-commands.csv +0 -11
- package/src/modules/bmm/testarch/tea-gate.md +0 -38
- package/src/modules/bmm/testarch/tea-knowledge.md +0 -275
- package/src/modules/bmm/testarch/test-design.md +0 -39
- package/src/modules/bmm/testarch/test-levels-framework.md +0 -148
- package/src/modules/bmm/testarch/test-priorities-matrix.md +0 -174
- package/src/modules/bmm/testarch/trace-requirements.md +0 -38
- package/src/modules/bmm/workflows/1-analysis/brainstorm-game/instructions.md +0 -47
- package/src/modules/bmm/workflows/1-analysis/brainstorm-game/workflow.yaml +0 -22
- package/src/modules/bmm/workflows/1-analysis/game-brief/README.md +0 -221
- package/src/modules/bmm/workflows/1-analysis/game-brief/instructions.md +0 -517
- package/src/modules/bmm/workflows/1-analysis/game-brief/workflow.yaml +0 -34
- package/src/modules/bmm/workflows/1-analysis/product-brief/README.md +0 -180
- package/src/modules/bmm/workflows/1-analysis/research/README.md +0 -454
- package/src/modules/bmm/workflows/1-analysis/research/claude-code/sub-agents/bmm-competitor-analyzer.md +0 -259
- package/src/modules/bmm/workflows/1-analysis/research/claude-code/sub-agents/bmm-data-analyst.md +0 -190
- package/src/modules/bmm/workflows/1-analysis/research/claude-code/sub-agents/bmm-market-researcher.md +0 -337
- package/src/modules/bmm/workflows/1-analysis/research/claude-code/sub-agents/bmm-trend-spotter.md +0 -107
- package/src/modules/bmm/workflows/1-analysis/research/claude-code/sub-agents/bmm-user-researcher.md +0 -329
- package/src/modules/bmm/workflows/2-plan/README.md +0 -203
- package/src/modules/bmm/workflows/2-plan/checklist.md +0 -369
- package/src/modules/bmm/workflows/2-plan/gdd/README.md +0 -222
- package/src/modules/bmm/workflows/2-plan/gdd/instructions-gdd.md +0 -480
- package/src/modules/bmm/workflows/2-plan/instructions-router.md +0 -222
- package/src/modules/bmm/workflows/2-plan/prd/analysis-template.md +0 -53
- package/src/modules/bmm/workflows/2-plan/prd/epics-template.md +0 -18
- package/src/modules/bmm/workflows/2-plan/prd/instructions-lg.md +0 -267
- package/src/modules/bmm/workflows/2-plan/prd/instructions-med.md +0 -251
- package/src/modules/bmm/workflows/2-plan/prd/prd-template.md +0 -73
- package/src/modules/bmm/workflows/2-plan/tech-spec/instructions-sm.md +0 -137
- package/src/modules/bmm/workflows/2-plan/tech-spec/tech-spec-template.md +0 -59
- package/src/modules/bmm/workflows/2-plan/ux/instructions-ux.md +0 -360
- package/src/modules/bmm/workflows/2-plan/ux/ux-spec-template.md +0 -162
- package/src/modules/bmm/workflows/2-plan/workflow.yaml +0 -60
- package/src/modules/bmm/workflows/3-solutioning/ADR-template.md +0 -74
- package/src/modules/bmm/workflows/3-solutioning/README.md +0 -565
- package/src/modules/bmm/workflows/3-solutioning/checklist.md +0 -170
- package/src/modules/bmm/workflows/3-solutioning/instructions.md +0 -661
- package/src/modules/bmm/workflows/3-solutioning/project-types/backend-questions.md +0 -490
- package/src/modules/bmm/workflows/3-solutioning/project-types/cli-questions.md +0 -337
- package/src/modules/bmm/workflows/3-solutioning/project-types/data-questions.md +0 -472
- package/src/modules/bmm/workflows/3-solutioning/project-types/desktop-questions.md +0 -299
- package/src/modules/bmm/workflows/3-solutioning/project-types/embedded-questions.md +0 -118
- package/src/modules/bmm/workflows/3-solutioning/project-types/extension-questions.md +0 -374
- package/src/modules/bmm/workflows/3-solutioning/project-types/game-questions.md +0 -133
- package/src/modules/bmm/workflows/3-solutioning/project-types/infra-questions.md +0 -484
- package/src/modules/bmm/workflows/3-solutioning/project-types/library-questions.md +0 -146
- package/src/modules/bmm/workflows/3-solutioning/project-types/mobile-questions.md +0 -110
- package/src/modules/bmm/workflows/3-solutioning/project-types/project-types.csv +0 -12
- package/src/modules/bmm/workflows/3-solutioning/project-types/web-questions.md +0 -136
- package/src/modules/bmm/workflows/3-solutioning/tech-spec/README.md +0 -195
- package/src/modules/bmm/workflows/3-solutioning/tech-spec/instructions.md +0 -73
- package/src/modules/bmm/workflows/3-solutioning/tech-spec/workflow.yaml +0 -51
- package/src/modules/bmm/workflows/3-solutioning/templates/backend-service-architecture.md +0 -66
- package/src/modules/bmm/workflows/3-solutioning/templates/cli-tool-architecture.md +0 -66
- package/src/modules/bmm/workflows/3-solutioning/templates/data-pipeline-architecture.md +0 -66
- package/src/modules/bmm/workflows/3-solutioning/templates/desktop-app-architecture.md +0 -66
- package/src/modules/bmm/workflows/3-solutioning/templates/embedded-firmware-architecture.md +0 -66
- package/src/modules/bmm/workflows/3-solutioning/templates/game-engine-architecture.md +0 -244
- package/src/modules/bmm/workflows/3-solutioning/templates/game-engine-godot-guide.md +0 -428
- package/src/modules/bmm/workflows/3-solutioning/templates/game-engine-unity-guide.md +0 -333
- package/src/modules/bmm/workflows/3-solutioning/templates/game-engine-web-guide.md +0 -528
- package/src/modules/bmm/workflows/3-solutioning/templates/infrastructure-architecture.md +0 -66
- package/src/modules/bmm/workflows/3-solutioning/templates/library-package-architecture.md +0 -66
- package/src/modules/bmm/workflows/3-solutioning/templates/mobile-app-architecture.md +0 -66
- package/src/modules/bmm/workflows/3-solutioning/templates/registry.csv +0 -172
- package/src/modules/bmm/workflows/3-solutioning/templates/web-api-architecture.md +0 -66
- package/src/modules/bmm/workflows/3-solutioning/templates/web-fullstack-architecture.md +0 -277
- package/src/modules/bmm/workflows/3-solutioning/workflow.yaml +0 -65
- package/src/modules/bmm/workflows/4-implementation/create-story/README.md +0 -42
- package/src/modules/bmm/workflows/4-implementation/dev-story/README.md +0 -84
- package/src/modules/bmm/workflows/4-implementation/review-story/README.md +0 -72
- package/src/modules/bmm/workflows/4-implementation/review-story/instructions.md +0 -176
- package/src/modules/bmm/workflows/4-implementation/review-story/workflow.yaml +0 -99
- package/src/modules/bmm/workflows/4-implementation/story-context/README.md +0 -234
- package/src/modules/cis/agents/brainstorming-coach.md +0 -24
- package/src/modules/cis/agents/creative-problem-solver.md +0 -24
- package/src/modules/cis/agents/design-thinking-coach.md +0 -24
- package/src/modules/cis/agents/innovation-strategist.md +0 -24
- package/src/modules/cis/agents/storyteller.md +0 -24
- package/src/modules/cis/readme.md +0 -86
- package/tools/cli/installers/lib/ide/workflow-command-generator.js +0 -162
- package/tools/test-agents/captain-kirk-commander.md +0 -110
- package/tools/test-agents/data-operations-android.md +0 -123
- package/tools/test-agents/geordi-chief-engineer.md +0 -135
- package/tools/test-agents/isabella-martinez-ethicist.md +0 -109
- package/tools/test-agents/marcus-thompson-security.md +0 -109
- package/tools/test-agents/maya-patel-pragmatist.md +0 -82
- package/tools/test-agents/picard-diplomat-captain.md +0 -134
- package/tools/test-agents/spock-science-officer.md +0 -124
- package/tools/test-agents/william-smithers-technocrat.md +0 -71
- package/tools/test-agents/zara-chen-designer.md +0 -94
- /package/src/{modules/cis → core}/workflows/brainstorming/brain-methods.csv +0 -0
- /package/src/modules/{bmm/workflows/1-analysis → bmgd/workflows/1-preproduction}/brainstorm-game/game-brain-methods.csv +0 -0
- /package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/metroidvania.md +0 -0
- /package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/puzzle.md +0 -0
- /package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types.csv +0 -0
- /package/src/modules/{bmm/workflows/4-implementation/review-story → bmgd/workflows/4-production/code-review}/backlog_template.md +0 -0
- /package/src/modules/{bmm/workflows/4-implementation/review-story → bmgd/workflows/4-production/code-review}/checklist.md +0 -0
- /package/src/modules/bmm/_module-installer/assets/{technical-decisions-template.md → technical-decisions.md} +0 -0
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
const path = require('node:path');
|
|
2
2
|
const fs = require('fs-extra');
|
|
3
3
|
const chalk = require('chalk');
|
|
4
|
+
const yaml = require('js-yaml');
|
|
4
5
|
const { DependencyResolver } = require('../installers/lib/core/dependency-resolver');
|
|
5
6
|
const { XmlHandler } = require('../lib/xml-handler');
|
|
7
|
+
const { YamlXmlBuilder } = require('../lib/yaml-xml-builder');
|
|
6
8
|
const { AgentPartyGenerator } = require('../lib/agent-party-generator');
|
|
7
9
|
const xml2js = require('xml2js');
|
|
8
10
|
const { getProjectRoot, getSourcePath, getModulePath } = require('../lib/project-root');
|
|
@@ -16,6 +18,7 @@ class WebBundler {
|
|
|
16
18
|
|
|
17
19
|
this.dependencyResolver = new DependencyResolver();
|
|
18
20
|
this.xmlHandler = new XmlHandler();
|
|
21
|
+
this.yamlBuilder = new YamlXmlBuilder();
|
|
19
22
|
|
|
20
23
|
// Cache for resolved dependencies to avoid duplicates
|
|
21
24
|
this.dependencyCache = new Map();
|
|
@@ -48,8 +51,13 @@ class WebBundler {
|
|
|
48
51
|
console.log(chalk.cyan.bold('═══════════════════════════════════════════════\n'));
|
|
49
52
|
|
|
50
53
|
try {
|
|
51
|
-
//
|
|
54
|
+
// Vendor cross-module workflows FIRST
|
|
52
55
|
const modules = await this.discoverModules();
|
|
56
|
+
for (const module of modules) {
|
|
57
|
+
await this.vendorCrossModuleWorkflows(module);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Pre-discover all modules to generate complete manifests
|
|
53
61
|
for (const module of modules) {
|
|
54
62
|
await this.preDiscoverModule(module);
|
|
55
63
|
}
|
|
@@ -89,6 +97,9 @@ class WebBundler {
|
|
|
89
97
|
teams: [],
|
|
90
98
|
};
|
|
91
99
|
|
|
100
|
+
// Vendor cross-module workflows first (if not already done by bundleAll)
|
|
101
|
+
await this.vendorCrossModuleWorkflows(moduleName);
|
|
102
|
+
|
|
92
103
|
// Pre-discover all agents and teams for manifest generation
|
|
93
104
|
await this.preDiscoverModule(moduleName);
|
|
94
105
|
|
|
@@ -108,16 +119,16 @@ class WebBundler {
|
|
|
108
119
|
}
|
|
109
120
|
}
|
|
110
121
|
|
|
111
|
-
// Process teams
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
122
|
+
// Process teams
|
|
123
|
+
const teams = await this.discoverTeams(modulePath);
|
|
124
|
+
for (const team of teams) {
|
|
125
|
+
try {
|
|
126
|
+
await this.bundleTeam(moduleName, team);
|
|
127
|
+
results.teams.push(team);
|
|
128
|
+
} catch (error) {
|
|
129
|
+
console.error(` Failed to bundle team ${team}:`, error.message);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
121
132
|
|
|
122
133
|
return results;
|
|
123
134
|
}
|
|
@@ -126,11 +137,14 @@ class WebBundler {
|
|
|
126
137
|
* Bundle a single agent
|
|
127
138
|
*/
|
|
128
139
|
async bundleAgent(moduleName, agentFile, shouldTrack = true) {
|
|
129
|
-
const agentName = path.basename(agentFile, '.md');
|
|
140
|
+
const agentName = agentFile.endsWith('.agent.yaml') ? path.basename(agentFile, '.agent.yaml') : path.basename(agentFile, '.md');
|
|
130
141
|
this.stats.totalAgents++;
|
|
131
142
|
|
|
132
143
|
console.log(chalk.dim(` → Processing: ${agentName}`));
|
|
133
144
|
|
|
145
|
+
// Vendor cross-module workflows first (if not already done)
|
|
146
|
+
await this.vendorCrossModuleWorkflows(moduleName);
|
|
147
|
+
|
|
134
148
|
const agentPath = path.join(this.modulesPath, moduleName, 'agents', agentFile);
|
|
135
149
|
|
|
136
150
|
// Check if agent file exists
|
|
@@ -140,11 +154,34 @@ class WebBundler {
|
|
|
140
154
|
throw new Error(`Agent file not found: ${agentPath}`);
|
|
141
155
|
}
|
|
142
156
|
|
|
143
|
-
|
|
144
|
-
|
|
157
|
+
let content;
|
|
158
|
+
let agentXml;
|
|
145
159
|
|
|
146
|
-
//
|
|
147
|
-
|
|
160
|
+
// Handle YAML agents - build in-memory to XML
|
|
161
|
+
if (agentFile.endsWith('.agent.yaml')) {
|
|
162
|
+
// Check for webskip flag in YAML before building
|
|
163
|
+
const yamlContent = await fs.readFile(agentPath, 'utf8');
|
|
164
|
+
const agentYaml = yaml.load(yamlContent);
|
|
165
|
+
|
|
166
|
+
if (agentYaml?.agent?.webskip === true) {
|
|
167
|
+
this.stats.skippedAgents++;
|
|
168
|
+
console.log(chalk.gray(` ⊘ Skipped (webskip="true")`));
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// Build agent from YAML (no customize file for web bundles)
|
|
173
|
+
const xmlContent = await this.yamlBuilder.buildFromYaml(agentPath, null, {
|
|
174
|
+
includeMetadata: false, // Don't include build metadata in web bundles
|
|
175
|
+
forWebBundle: true, // Use web-specific activation fragments
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
content = xmlContent;
|
|
179
|
+
agentXml = this.extractAgentXml(xmlContent);
|
|
180
|
+
} else {
|
|
181
|
+
// Legacy MD format - read and extract XML
|
|
182
|
+
content = await fs.readFile(agentPath, 'utf8');
|
|
183
|
+
agentXml = this.extractAgentXml(content);
|
|
184
|
+
}
|
|
148
185
|
|
|
149
186
|
if (!agentXml) {
|
|
150
187
|
this.stats.failedAgents++;
|
|
@@ -172,12 +209,29 @@ class WebBundler {
|
|
|
172
209
|
|
|
173
210
|
// Resolve dependencies with warning tracking
|
|
174
211
|
const dependencyWarnings = [];
|
|
175
|
-
const dependencies = await this.resolveAgentDependencies(agentXml, moduleName, dependencyWarnings);
|
|
212
|
+
const { dependencies, skippedWorkflows } = await this.resolveAgentDependencies(agentXml, moduleName, dependencyWarnings);
|
|
176
213
|
|
|
177
214
|
if (dependencyWarnings.length > 0) {
|
|
178
215
|
this.stats.warnings.push({ agent: agentName, warnings: dependencyWarnings });
|
|
179
216
|
}
|
|
180
217
|
|
|
218
|
+
// Check for module's default-party.csv and include it as agent manifest
|
|
219
|
+
const defaultPartyPath = path.join(this.modulesPath, moduleName, 'teams', 'default-party.csv');
|
|
220
|
+
if (await fs.pathExists(defaultPartyPath)) {
|
|
221
|
+
const partyContent = await fs.readFile(defaultPartyPath, 'utf8');
|
|
222
|
+
// Process any placeholders in the CSV content
|
|
223
|
+
const processedPartyContent = this.processProjectRootReferences(partyContent);
|
|
224
|
+
// Wrap as text to preserve raw CSV format in CDATA
|
|
225
|
+
const wrappedParty = this.wrapContentInXml(processedPartyContent, 'bmad/_cfg/agent-manifest.csv', 'text');
|
|
226
|
+
dependencies.set('bmad/_cfg/agent-manifest.csv', wrappedParty);
|
|
227
|
+
console.log(chalk.gray(` + Added party manifest from module default-party.csv`));
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// Remove commands for skipped workflows from agent XML
|
|
231
|
+
if (skippedWorkflows.length > 0) {
|
|
232
|
+
agentXml = this.removeSkippedWorkflowCommands(agentXml, skippedWorkflows);
|
|
233
|
+
}
|
|
234
|
+
|
|
181
235
|
// Build the bundle (no manifests for individual agents)
|
|
182
236
|
const bundle = this.buildAgentBundle(agentXml, dependencies);
|
|
183
237
|
|
|
@@ -188,16 +242,356 @@ class WebBundler {
|
|
|
188
242
|
console.log(chalk.red(` ⚠ Invalid XML generated!`));
|
|
189
243
|
}
|
|
190
244
|
|
|
245
|
+
// Format XML for readability
|
|
246
|
+
const formattedBundle = this.formatXml(bundle);
|
|
247
|
+
|
|
191
248
|
// Write bundle to output
|
|
192
249
|
const outputPath = path.join(this.outputDir, moduleName, 'agents', `${agentName}.xml`);
|
|
193
250
|
await fs.ensureDir(path.dirname(outputPath));
|
|
194
|
-
await fs.writeFile(outputPath,
|
|
251
|
+
await fs.writeFile(outputPath, formattedBundle, 'utf8');
|
|
195
252
|
|
|
196
253
|
this.stats.bundledAgents++;
|
|
197
254
|
const statusIcon = isValid ? chalk.green('✓') : chalk.yellow('⚠');
|
|
198
255
|
console.log(` ${statusIcon} Bundled: ${agentName}.xml${isValid ? '' : chalk.yellow(' (invalid XML)')}`);
|
|
199
256
|
}
|
|
200
257
|
|
|
258
|
+
/**
|
|
259
|
+
* Bundle a team - includes orchestrator and all agents with their dependencies
|
|
260
|
+
*/
|
|
261
|
+
async bundleTeam(moduleName, teamFile) {
|
|
262
|
+
const teamName = path.basename(teamFile, path.extname(teamFile));
|
|
263
|
+
console.log(chalk.dim(` → Processing team: ${teamName}`));
|
|
264
|
+
|
|
265
|
+
const teamPath = path.join(this.modulesPath, moduleName, 'teams', teamFile);
|
|
266
|
+
|
|
267
|
+
// Check if team file exists
|
|
268
|
+
if (!(await fs.pathExists(teamPath))) {
|
|
269
|
+
console.log(chalk.red(` ✗ Team file not found`));
|
|
270
|
+
throw new Error(`Team file not found: ${teamPath}`);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
// Read and parse team YAML
|
|
274
|
+
const teamContent = await fs.readFile(teamPath, 'utf8');
|
|
275
|
+
const teamConfig = yaml.load(teamContent);
|
|
276
|
+
|
|
277
|
+
if (!teamConfig || !teamConfig.bundle) {
|
|
278
|
+
console.log(chalk.red(` ✗ Invalid team configuration`));
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
// Start building the team bundle
|
|
283
|
+
const dependencies = new Map();
|
|
284
|
+
const processed = new Set();
|
|
285
|
+
const allAgentXmls = [];
|
|
286
|
+
const warnings = [];
|
|
287
|
+
|
|
288
|
+
// Check if team has a party CSV file (agent manifest)
|
|
289
|
+
const hasPartyFile = teamConfig.party && teamConfig.party.endsWith('.csv');
|
|
290
|
+
if (hasPartyFile) {
|
|
291
|
+
// Load the party CSV and add it as bmad/_cfg/agent-manifest.csv
|
|
292
|
+
const partyPath = path.join(path.dirname(teamPath), teamConfig.party.replace(/^\.\//, ''));
|
|
293
|
+
if (await fs.pathExists(partyPath)) {
|
|
294
|
+
const partyContent = await fs.readFile(partyPath, 'utf8');
|
|
295
|
+
// Process any placeholders in the CSV content
|
|
296
|
+
const processedPartyContent = this.processProjectRootReferences(partyContent);
|
|
297
|
+
// Wrap as text/csv to preserve raw CSV format in CDATA
|
|
298
|
+
const wrappedParty = this.wrapContentInXml(processedPartyContent, 'bmad/_cfg/agent-manifest.csv', 'text');
|
|
299
|
+
dependencies.set('bmad/_cfg/agent-manifest.csv', wrappedParty);
|
|
300
|
+
console.log(chalk.gray(` + Added agent manifest from: ${teamConfig.party}`));
|
|
301
|
+
} else {
|
|
302
|
+
console.log(chalk.yellow(` ⚠ Party file not found: ${partyPath}`));
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
// 1. First, always add the bmad-web-orchestrator (XML file only, no transformation needed)
|
|
307
|
+
const orchestratorXmlPath = path.join(this.sourceDir, 'core', 'agents', 'bmad-web-orchestrator.agent.xml');
|
|
308
|
+
|
|
309
|
+
if (await fs.pathExists(orchestratorXmlPath)) {
|
|
310
|
+
// Read the XML file directly - no transformation needed
|
|
311
|
+
const xmlContent = await fs.readFile(orchestratorXmlPath, 'utf8');
|
|
312
|
+
let orchestratorXml = xmlContent.trim();
|
|
313
|
+
|
|
314
|
+
// Process {project-root} references
|
|
315
|
+
orchestratorXml = this.processProjectRootReferences(orchestratorXml);
|
|
316
|
+
|
|
317
|
+
// Inject help/exit menu items only (orchestrator has its own activation)
|
|
318
|
+
orchestratorXml = this.injectHelpExitMenuItems(orchestratorXml);
|
|
319
|
+
|
|
320
|
+
// Resolve orchestrator dependencies
|
|
321
|
+
const { dependencies: orchDeps } = await this.resolveAgentDependencies(orchestratorXml, 'core', warnings);
|
|
322
|
+
|
|
323
|
+
// Merge orchestrator dependencies
|
|
324
|
+
for (const [id, content] of orchDeps) {
|
|
325
|
+
if (!dependencies.has(id)) {
|
|
326
|
+
dependencies.set(id, content);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
// Add orchestrator XML first
|
|
331
|
+
allAgentXmls.push(orchestratorXml);
|
|
332
|
+
console.log(chalk.gray(` + Added orchestrator: bmad-web-orchestrator`));
|
|
333
|
+
} else {
|
|
334
|
+
console.log(chalk.yellow(` ⚠ Orchestrator not found at: ${orchestratorXmlPath}`));
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
// 2. Determine which agents to include
|
|
338
|
+
let agentsToBundle = [];
|
|
339
|
+
|
|
340
|
+
if (teamConfig.agents === '*' || (Array.isArray(teamConfig.agents) && teamConfig.agents.includes('*'))) {
|
|
341
|
+
// Include all agents from the module
|
|
342
|
+
const agentsPath = path.join(this.modulesPath, moduleName, 'agents');
|
|
343
|
+
if (await fs.pathExists(agentsPath)) {
|
|
344
|
+
const agentFiles = await fs.readdir(agentsPath);
|
|
345
|
+
agentsToBundle = agentFiles
|
|
346
|
+
.filter((file) => file.endsWith('.agent.yaml') || (file.endsWith('.md') && !file.toLowerCase().includes('readme')))
|
|
347
|
+
.map((file) => file.replace(/\.(agent\.yaml|md)$/, ''));
|
|
348
|
+
}
|
|
349
|
+
} else if (Array.isArray(teamConfig.agents)) {
|
|
350
|
+
// Include specific agents listed
|
|
351
|
+
agentsToBundle = teamConfig.agents;
|
|
352
|
+
} else {
|
|
353
|
+
console.log(chalk.yellow(` ⚠ No agents specified in team configuration`));
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
// 3. Process each agent and their dependencies
|
|
357
|
+
for (const agentName of agentsToBundle) {
|
|
358
|
+
// Try YAML first, then MD
|
|
359
|
+
let agentPath = path.join(this.modulesPath, moduleName, 'agents', `${agentName}.agent.yaml`);
|
|
360
|
+
let isYaml = await fs.pathExists(agentPath);
|
|
361
|
+
|
|
362
|
+
if (!isYaml) {
|
|
363
|
+
agentPath = path.join(this.modulesPath, moduleName, 'agents', `${agentName}.md`);
|
|
364
|
+
if (!(await fs.pathExists(agentPath))) {
|
|
365
|
+
console.log(chalk.yellow(` ⚠ Agent not found: ${agentName}`));
|
|
366
|
+
continue;
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
let agentXml;
|
|
371
|
+
|
|
372
|
+
if (isYaml) {
|
|
373
|
+
// Check for webskip flag in YAML
|
|
374
|
+
const yamlContent = await fs.readFile(agentPath, 'utf8');
|
|
375
|
+
const agentYaml = yaml.load(yamlContent);
|
|
376
|
+
|
|
377
|
+
if (agentYaml?.agent?.webskip === true) {
|
|
378
|
+
console.log(chalk.gray(` ⊘ Skipped agent (webskip="true"): ${agentName}`));
|
|
379
|
+
continue;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
// Build YAML agent in-memory - skip activation for team agents (orchestrator handles it)
|
|
383
|
+
const xmlContent = await this.yamlBuilder.buildFromYaml(agentPath, null, {
|
|
384
|
+
includeMetadata: false,
|
|
385
|
+
skipActivation: true, // Skip activation for team agents
|
|
386
|
+
});
|
|
387
|
+
agentXml = this.extractAgentXml(xmlContent);
|
|
388
|
+
} else {
|
|
389
|
+
// Read legacy MD agent
|
|
390
|
+
const agentContent = await fs.readFile(agentPath, 'utf8');
|
|
391
|
+
agentXml = this.extractAgentXml(agentContent);
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
if (!agentXml) {
|
|
395
|
+
console.log(chalk.yellow(` ⚠ No XML found in agent: ${agentName}`));
|
|
396
|
+
continue;
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
// Skip agents with bundle="false"
|
|
400
|
+
if (this.shouldSkipBundling(agentXml)) {
|
|
401
|
+
console.log(chalk.gray(` ⊘ Skipped agent (bundle="false"): ${agentName}`));
|
|
402
|
+
continue;
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
// Process {project-root} references
|
|
406
|
+
agentXml = this.processProjectRootReferences(agentXml);
|
|
407
|
+
|
|
408
|
+
// Resolve agent dependencies
|
|
409
|
+
const agentWarnings = [];
|
|
410
|
+
const { dependencies: agentDeps, skippedWorkflows } = await this.resolveAgentDependencies(agentXml, moduleName, agentWarnings);
|
|
411
|
+
|
|
412
|
+
if (agentWarnings.length > 0) {
|
|
413
|
+
warnings.push({ agent: agentName, warnings: agentWarnings });
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
// Remove commands for skipped workflows from agent XML
|
|
417
|
+
if (skippedWorkflows.length > 0) {
|
|
418
|
+
agentXml = this.removeSkippedWorkflowCommands(agentXml, skippedWorkflows);
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
// Merge agent dependencies (deduplicate)
|
|
422
|
+
for (const [id, content] of agentDeps) {
|
|
423
|
+
if (!dependencies.has(id)) {
|
|
424
|
+
dependencies.set(id, content);
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
// Skip web activation injection for team agents - orchestrator handles everything
|
|
429
|
+
// Only inject help/exit menu items if missing
|
|
430
|
+
agentXml = this.injectHelpExitMenuItems(agentXml);
|
|
431
|
+
|
|
432
|
+
// Add agent XML to the collection
|
|
433
|
+
allAgentXmls.push(agentXml);
|
|
434
|
+
console.log(chalk.gray(` + Added agent: ${agentName}`));
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
// 4. Build the team bundle XML
|
|
438
|
+
const bundle = this.buildTeamBundle(teamConfig.bundle, allAgentXmls, dependencies);
|
|
439
|
+
|
|
440
|
+
// 5. Validate XML
|
|
441
|
+
const isValid = await this.validateXml(bundle);
|
|
442
|
+
if (!isValid) {
|
|
443
|
+
console.log(chalk.red(` ⚠ Invalid XML generated for team!`));
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
// Format XML for readability
|
|
447
|
+
const formattedBundle = this.formatXml(bundle);
|
|
448
|
+
|
|
449
|
+
// 6. Write bundle to output
|
|
450
|
+
const outputPath = path.join(this.outputDir, moduleName, 'teams', `${teamName}.xml`);
|
|
451
|
+
await fs.ensureDir(path.dirname(outputPath));
|
|
452
|
+
await fs.writeFile(outputPath, formattedBundle, 'utf8');
|
|
453
|
+
|
|
454
|
+
const statusIcon = isValid ? chalk.green('✓') : chalk.yellow('⚠');
|
|
455
|
+
console.log(` ${statusIcon} Bundled team: ${teamName}.xml${isValid ? '' : chalk.yellow(' (invalid XML)')}`);
|
|
456
|
+
|
|
457
|
+
// Track warnings
|
|
458
|
+
if (warnings.length > 0) {
|
|
459
|
+
this.stats.warnings.push(...warnings);
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
/**
|
|
464
|
+
* Build the final team bundle XML
|
|
465
|
+
*/
|
|
466
|
+
buildTeamBundle(teamMetadata, agentXmls, dependencies) {
|
|
467
|
+
const parts = ['<?xml version="1.0" encoding="UTF-8"?>', '<team-bundle>', ' <!-- Agent Definitions -->', ' <agents>'];
|
|
468
|
+
|
|
469
|
+
for (const agentXml of agentXmls) {
|
|
470
|
+
// Indent each agent XML properly (add 4 spaces to each line)
|
|
471
|
+
const indentedAgent = agentXml
|
|
472
|
+
.split('\n')
|
|
473
|
+
.map((line) => ' ' + line)
|
|
474
|
+
.join('\n');
|
|
475
|
+
parts.push(indentedAgent);
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
parts.push(' </agents>');
|
|
479
|
+
|
|
480
|
+
// Add all dependencies
|
|
481
|
+
if (dependencies && dependencies.size > 0) {
|
|
482
|
+
parts.push('', ' <!-- Shared Dependencies -->', ' <dependencies>');
|
|
483
|
+
|
|
484
|
+
for (const [id, content] of dependencies) {
|
|
485
|
+
// All dependencies are now consistently wrapped in <file> elements
|
|
486
|
+
// Indent properly (add 4 spaces to each line)
|
|
487
|
+
const indentedContent = content
|
|
488
|
+
.split('\n')
|
|
489
|
+
.map((line) => ' ' + line)
|
|
490
|
+
.join('\n');
|
|
491
|
+
parts.push(indentedContent);
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
parts.push(' </dependencies>');
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
parts.push('</team-bundle>');
|
|
498
|
+
|
|
499
|
+
return parts.join('\n');
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
/**
|
|
503
|
+
* Vendor cross-module workflows for a module
|
|
504
|
+
* Scans source agent YAML files for workflow-install attributes and copies workflows
|
|
505
|
+
*/
|
|
506
|
+
async vendorCrossModuleWorkflows(moduleName) {
|
|
507
|
+
const modulePath = path.join(this.modulesPath, moduleName);
|
|
508
|
+
const agentsPath = path.join(modulePath, 'agents');
|
|
509
|
+
|
|
510
|
+
if (!(await fs.pathExists(agentsPath))) {
|
|
511
|
+
return;
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
// Find all agent YAML files
|
|
515
|
+
const files = await fs.readdir(agentsPath);
|
|
516
|
+
const yamlFiles = files.filter((f) => f.endsWith('.agent.yaml'));
|
|
517
|
+
|
|
518
|
+
for (const agentFile of yamlFiles) {
|
|
519
|
+
const agentPath = path.join(agentsPath, agentFile);
|
|
520
|
+
const agentYaml = yaml.load(await fs.readFile(agentPath, 'utf8'));
|
|
521
|
+
|
|
522
|
+
const menuItems = agentYaml?.agent?.menu || [];
|
|
523
|
+
const workflowInstallItems = menuItems.filter((item) => item['workflow-install']);
|
|
524
|
+
|
|
525
|
+
for (const item of workflowInstallItems) {
|
|
526
|
+
const sourceWorkflowPath = item.workflow;
|
|
527
|
+
const installWorkflowPath = item['workflow-install'];
|
|
528
|
+
|
|
529
|
+
if (!sourceWorkflowPath || !installWorkflowPath) {
|
|
530
|
+
continue;
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
// Parse paths to extract module and workflow location
|
|
534
|
+
// Support both {project-root}/bmad/... and {project-root}/{bmad_folder}/... patterns
|
|
535
|
+
const sourceMatch = sourceWorkflowPath.match(/\{project-root\}\/(?:\{bmad_folder\}|bmad)\/([^/]+)\/workflows\/(.+)/);
|
|
536
|
+
const installMatch = installWorkflowPath.match(/\{project-root\}\/(?:\{bmad_folder\}|bmad)\/([^/]+)\/workflows\/(.+)/);
|
|
537
|
+
|
|
538
|
+
if (!sourceMatch || !installMatch) {
|
|
539
|
+
continue;
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
const sourceModule = sourceMatch[1];
|
|
543
|
+
const sourceWorkflowRelPath = sourceMatch[2];
|
|
544
|
+
const installModule = installMatch[1];
|
|
545
|
+
const installWorkflowRelPath = installMatch[2];
|
|
546
|
+
|
|
547
|
+
// Build actual filesystem paths
|
|
548
|
+
const actualSourceWorkflowPath = path.join(this.modulesPath, sourceModule, 'workflows', sourceWorkflowRelPath);
|
|
549
|
+
const actualDestWorkflowPath = path.join(this.modulesPath, installModule, 'workflows', installWorkflowRelPath);
|
|
550
|
+
|
|
551
|
+
// Check if source workflow exists
|
|
552
|
+
if (!(await fs.pathExists(actualSourceWorkflowPath))) {
|
|
553
|
+
console.log(chalk.yellow(` ⚠ Source workflow not found for vendoring: ${sourceWorkflowPath}`));
|
|
554
|
+
continue;
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
// Check if destination already exists (skip if already vendored)
|
|
558
|
+
if (await fs.pathExists(actualDestWorkflowPath)) {
|
|
559
|
+
continue;
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
// Get workflow directory (workflow.yaml is in a directory with other files)
|
|
563
|
+
const sourceWorkflowDir = path.dirname(actualSourceWorkflowPath);
|
|
564
|
+
const destWorkflowDir = path.dirname(actualDestWorkflowPath);
|
|
565
|
+
|
|
566
|
+
// Copy entire workflow directory
|
|
567
|
+
await fs.copy(sourceWorkflowDir, destWorkflowDir, { overwrite: false });
|
|
568
|
+
|
|
569
|
+
// Update config_source in the vendored workflow.yaml
|
|
570
|
+
const workflowYamlPath = actualDestWorkflowPath;
|
|
571
|
+
if (await fs.pathExists(workflowYamlPath)) {
|
|
572
|
+
await this.updateWorkflowConfigSource(workflowYamlPath, installModule);
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
console.log(chalk.dim(` → Vendored workflow: ${sourceWorkflowRelPath} → ${installModule}/workflows/${installWorkflowRelPath}`));
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
/**
|
|
581
|
+
* Update config_source in a vendored workflow YAML file
|
|
582
|
+
*/
|
|
583
|
+
async updateWorkflowConfigSource(workflowYamlPath, newModuleName) {
|
|
584
|
+
let yamlContent = await fs.readFile(workflowYamlPath, 'utf8');
|
|
585
|
+
|
|
586
|
+
// Replace config_source with new module reference
|
|
587
|
+
// Support both old format (bmad) and new format ({bmad_folder})
|
|
588
|
+
const configSourcePattern = /config_source:\s*["']?\{project-root\}\/(?:\{bmad_folder\}|bmad)\/[^/]+\/config\.yaml["']?/g;
|
|
589
|
+
const newConfigSource = `config_source: "{project-root}/{bmad_folder}/${newModuleName}/config.yaml"`;
|
|
590
|
+
|
|
591
|
+
const updatedYaml = yamlContent.replaceAll(configSourcePattern, newConfigSource);
|
|
592
|
+
await fs.writeFile(workflowYamlPath, updatedYaml, 'utf8');
|
|
593
|
+
}
|
|
594
|
+
|
|
201
595
|
/**
|
|
202
596
|
* Pre-discover all agents and teams in a module for manifest generation
|
|
203
597
|
*/
|
|
@@ -212,9 +606,28 @@ class WebBundler {
|
|
|
212
606
|
if (await fs.pathExists(agentsPath)) {
|
|
213
607
|
const files = await fs.readdir(agentsPath);
|
|
214
608
|
for (const file of files) {
|
|
215
|
-
if (file.endsWith('.md')) {
|
|
609
|
+
if (file.endsWith('.agent.yaml') || (file.endsWith('.md') && !file.toLowerCase().includes('readme'))) {
|
|
216
610
|
const agentPath = path.join(agentsPath, file);
|
|
217
|
-
|
|
611
|
+
let content;
|
|
612
|
+
|
|
613
|
+
if (file.endsWith('.agent.yaml')) {
|
|
614
|
+
// Check for webskip flag in YAML
|
|
615
|
+
const yamlContent = await fs.readFile(agentPath, 'utf8');
|
|
616
|
+
const agentYaml = yaml.load(yamlContent);
|
|
617
|
+
|
|
618
|
+
if (agentYaml?.agent?.webskip === true) {
|
|
619
|
+
continue; // Skip this agent
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
// Build YAML agent in-memory
|
|
623
|
+
content = await this.yamlBuilder.buildFromYaml(agentPath, null, {
|
|
624
|
+
includeMetadata: false,
|
|
625
|
+
});
|
|
626
|
+
} else {
|
|
627
|
+
// Read legacy MD agent
|
|
628
|
+
content = await fs.readFile(agentPath, 'utf8');
|
|
629
|
+
}
|
|
630
|
+
|
|
218
631
|
const agentXml = this.extractAgentXml(content);
|
|
219
632
|
|
|
220
633
|
if (agentXml) {
|
|
@@ -223,7 +636,7 @@ class WebBundler {
|
|
|
223
636
|
continue;
|
|
224
637
|
}
|
|
225
638
|
|
|
226
|
-
const agentName = path.basename(file, '.md');
|
|
639
|
+
const agentName = file.endsWith('.agent.yaml') ? path.basename(file, '.agent.yaml') : path.basename(file, '.md');
|
|
227
640
|
// Use the shared generator to extract agent details (pass full content)
|
|
228
641
|
const agentDetails = AgentPartyGenerator.extractAgentDetails(content, moduleName, agentName);
|
|
229
642
|
if (agentDetails) {
|
|
@@ -265,16 +678,25 @@ class WebBundler {
|
|
|
265
678
|
async resolveAgentDependencies(agentXml, moduleName, warnings = []) {
|
|
266
679
|
const dependencies = new Map();
|
|
267
680
|
const processed = new Set();
|
|
681
|
+
const skippedWorkflows = [];
|
|
268
682
|
|
|
269
683
|
// Extract file references from agent XML
|
|
270
|
-
const
|
|
684
|
+
const { refs, workflowRefs } = this.extractFileReferences(agentXml);
|
|
271
685
|
|
|
272
|
-
// Process
|
|
273
|
-
for (const ref of
|
|
686
|
+
// Process regular file references
|
|
687
|
+
for (const ref of refs) {
|
|
274
688
|
await this.processFileDependency(ref, dependencies, processed, moduleName, warnings);
|
|
275
689
|
}
|
|
276
690
|
|
|
277
|
-
|
|
691
|
+
// Process workflow references with special handling
|
|
692
|
+
for (const workflowRef of workflowRefs) {
|
|
693
|
+
const result = await this.processWorkflowDependency(workflowRef, dependencies, processed, moduleName, warnings);
|
|
694
|
+
if (result && result.skipped) {
|
|
695
|
+
skippedWorkflows.push(workflowRef);
|
|
696
|
+
}
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
return { dependencies, skippedWorkflows };
|
|
278
700
|
}
|
|
279
701
|
|
|
280
702
|
/**
|
|
@@ -282,6 +704,13 @@ class WebBundler {
|
|
|
282
704
|
*/
|
|
283
705
|
extractFileReferences(xml) {
|
|
284
706
|
const refs = new Set();
|
|
707
|
+
const workflowRefs = new Set();
|
|
708
|
+
|
|
709
|
+
// Remove agent id attribute to prevent it from being treated as a dependency
|
|
710
|
+
// The id attribute is just a metadata identifier, not a file reference
|
|
711
|
+
const xmlWithoutAgentId = xml.replace(/<agent[^>]*id="[^"]*"[^>]*>/, (match) => {
|
|
712
|
+
return match.replace(/\sid="[^"]*"/, '');
|
|
713
|
+
});
|
|
285
714
|
|
|
286
715
|
// Match various file reference patterns
|
|
287
716
|
const patterns = [
|
|
@@ -292,36 +721,109 @@ class WebBundler {
|
|
|
292
721
|
/src="([^"]+)"/g, // Source paths
|
|
293
722
|
/system-prompts="([^"]+)"/g,
|
|
294
723
|
/tools="([^"]+)"/g,
|
|
295
|
-
/workflows="([^"]+)"/g,
|
|
296
724
|
/knowledge="([^"]+)"/g,
|
|
297
|
-
/{project-root}\/([^"'\s<>]+)/g,
|
|
725
|
+
/{project-root}\/([^"'\s<>]+)/g, // Legacy {project-root} paths
|
|
726
|
+
/\bbmad\/([^"'\s<>]+)/g, // Direct bmad/ paths (after {bmad_folder} replacement)
|
|
298
727
|
];
|
|
299
728
|
|
|
300
729
|
for (const pattern of patterns) {
|
|
301
730
|
let match;
|
|
302
|
-
|
|
731
|
+
// Use the XML with agent id removed for pattern matching
|
|
732
|
+
while ((match = pattern.exec(xmlWithoutAgentId)) !== null) {
|
|
303
733
|
let filePath = match[1];
|
|
304
734
|
// Remove {project-root} prefix if present
|
|
305
735
|
filePath = filePath.replace(/^{project-root}\//, '');
|
|
306
|
-
if (
|
|
736
|
+
// Remove {bmad_folder} prefix if present (should be rare, mostly replaced already)
|
|
737
|
+
filePath = filePath.replace(/^{bmad_folder}\//, 'bmad/');
|
|
738
|
+
|
|
739
|
+
// For bmad/ pattern, prepend 'bmad/' since it was captured without it
|
|
740
|
+
if (pattern.source.includes(String.raw`\bbmad\/`)) {
|
|
741
|
+
filePath = 'bmad/' + filePath;
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
// Skip obvious placeholder/example paths
|
|
745
|
+
if (filePath && !filePath.includes('path/to/') && !filePath.includes('example') && !filePath.includes('...')) {
|
|
307
746
|
refs.add(filePath);
|
|
308
747
|
}
|
|
309
748
|
}
|
|
310
749
|
}
|
|
311
750
|
|
|
312
|
-
|
|
751
|
+
// Extract workflow references - both 'workflow' and 'run-workflow' attributes
|
|
752
|
+
const workflowPatterns = [
|
|
753
|
+
/workflow="([^"]+)"/g, // Menu items with workflow attribute
|
|
754
|
+
/run-workflow="([^"]+)"/g, // Commands with run-workflow attribute
|
|
755
|
+
/validate-workflow="([^"]+)"/g, // Validation workflow references
|
|
756
|
+
];
|
|
757
|
+
|
|
758
|
+
for (const pattern of workflowPatterns) {
|
|
759
|
+
let match;
|
|
760
|
+
// Use original xml for workflow patterns (they don't conflict with agent id)
|
|
761
|
+
while ((match = pattern.exec(xml)) !== null) {
|
|
762
|
+
let workflowPath = match[1];
|
|
763
|
+
workflowPath = workflowPath.replace(/^{project-root}\//, '');
|
|
764
|
+
// Remove {bmad_folder} prefix if present and replace with bmad
|
|
765
|
+
workflowPath = workflowPath.replace(/^{bmad_folder}\//, 'bmad/');
|
|
766
|
+
|
|
767
|
+
// Skip obvious placeholder/example paths
|
|
768
|
+
if (workflowPath && workflowPath.endsWith('.yaml') && !workflowPath.includes('path/to/') && !workflowPath.includes('example')) {
|
|
769
|
+
workflowRefs.add(workflowPath);
|
|
770
|
+
}
|
|
771
|
+
}
|
|
772
|
+
}
|
|
773
|
+
|
|
774
|
+
return { refs: [...refs], workflowRefs: [...workflowRefs] };
|
|
775
|
+
}
|
|
776
|
+
|
|
777
|
+
/**
|
|
778
|
+
* Remove commands from agent XML that reference skipped workflows
|
|
779
|
+
*/
|
|
780
|
+
removeSkippedWorkflowCommands(agentXml, skippedWorkflows) {
|
|
781
|
+
let modifiedXml = agentXml;
|
|
782
|
+
|
|
783
|
+
// For each skipped workflow, find and remove menu items and commands
|
|
784
|
+
for (const workflowPath of skippedWorkflows) {
|
|
785
|
+
// Need to escape special regex characters in the path
|
|
786
|
+
const escapedPath = workflowPath.replaceAll(/[.*+?^${}()|[\]\\]/g, String.raw`\$&`);
|
|
787
|
+
|
|
788
|
+
// Pattern 1: Remove <item> tags with workflow attribute
|
|
789
|
+
// Match: <item cmd="..." workflow="workflowPath">...</item>
|
|
790
|
+
const itemWorkflowPattern = new RegExp(`\\s*<item\\s+[^>]*workflow="[^"]*${escapedPath}"[^>]*>.*?</item>\\s*`, 'gs');
|
|
791
|
+
modifiedXml = modifiedXml.replace(itemWorkflowPattern, '');
|
|
792
|
+
|
|
793
|
+
// Pattern 2: Remove <item> tags with run-workflow attribute
|
|
794
|
+
// Match: <item cmd="..." run-workflow="workflowPath">...</item>
|
|
795
|
+
const itemRunWorkflowPattern = new RegExp(`\\s*<item\\s+[^>]*run-workflow="[^"]*${escapedPath}"[^>]*>.*?</item>\\s*`, 'gs');
|
|
796
|
+
modifiedXml = modifiedXml.replace(itemRunWorkflowPattern, '');
|
|
797
|
+
|
|
798
|
+
// Pattern 3: Remove <c> tags with run-workflow attribute (legacy)
|
|
799
|
+
// Match: <c cmd="..." run-workflow="workflowPath">...</c>
|
|
800
|
+
const cPattern = new RegExp(`\\s*<c\\s+[^>]*run-workflow="[^"]*${escapedPath}"[^>]*>.*?</c>\\s*`, 'gs');
|
|
801
|
+
modifiedXml = modifiedXml.replace(cPattern, '');
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
return modifiedXml;
|
|
313
805
|
}
|
|
314
806
|
|
|
315
807
|
/**
|
|
316
808
|
* Process a file dependency recursively
|
|
317
809
|
*/
|
|
318
810
|
async processFileDependency(filePath, dependencies, processed, moduleName, warnings = []) {
|
|
811
|
+
// Skip workflow YAML files - they're handled by processWorkflowDependency
|
|
812
|
+
if (filePath.includes('/workflow') && filePath.endsWith('workflow.yaml')) {
|
|
813
|
+
return;
|
|
814
|
+
}
|
|
815
|
+
|
|
319
816
|
// Skip if already processed
|
|
320
817
|
if (processed.has(filePath)) {
|
|
321
818
|
return;
|
|
322
819
|
}
|
|
323
820
|
processed.add(filePath);
|
|
324
821
|
|
|
822
|
+
// Skip agent-manifest.csv manifest for web bundles (agents are already bundled)
|
|
823
|
+
if (filePath === 'bmad/_cfg/agent-manifest.csv' || filePath.endsWith('/agent-manifest.csv')) {
|
|
824
|
+
return;
|
|
825
|
+
}
|
|
826
|
+
|
|
325
827
|
// Handle wildcard patterns
|
|
326
828
|
if (filePath.includes('*')) {
|
|
327
829
|
await this.processWildcardDependency(filePath, dependencies, processed, moduleName, warnings);
|
|
@@ -336,6 +838,13 @@ class WebBundler {
|
|
|
336
838
|
return;
|
|
337
839
|
}
|
|
338
840
|
|
|
841
|
+
// Skip if it's a directory
|
|
842
|
+
const stats = await fs.stat(actualPath);
|
|
843
|
+
if (stats.isDirectory()) {
|
|
844
|
+
// Silently skip directories - they're not file dependencies
|
|
845
|
+
return;
|
|
846
|
+
}
|
|
847
|
+
|
|
339
848
|
// Read file content
|
|
340
849
|
let content = await fs.readFile(actualPath, 'utf8');
|
|
341
850
|
|
|
@@ -352,7 +861,8 @@ class WebBundler {
|
|
|
352
861
|
const deps = depMatch[1].match(/['"]([^'"]+)['"]/g);
|
|
353
862
|
if (deps) {
|
|
354
863
|
for (const dep of deps) {
|
|
355
|
-
|
|
864
|
+
let depPath = dep.replaceAll(/['"]/g, '').replace(/^{project-root}\//, '');
|
|
865
|
+
depPath = depPath.replace(/^{bmad_folder}\//, 'bmad/');
|
|
356
866
|
if (depPath && !processed.has(depPath)) {
|
|
357
867
|
await this.processFileDependency(depPath, dependencies, processed, moduleName, warnings);
|
|
358
868
|
}
|
|
@@ -365,7 +875,8 @@ class WebBundler {
|
|
|
365
875
|
const templates = templateMatch[1].match(/['"]([^'"]+)['"]/g);
|
|
366
876
|
if (templates) {
|
|
367
877
|
for (const template of templates) {
|
|
368
|
-
|
|
878
|
+
let templatePath = template.replaceAll(/['"]/g, '').replace(/^{project-root}\//, '');
|
|
879
|
+
templatePath = templatePath.replace(/^{bmad_folder}\//, 'bmad/');
|
|
369
880
|
if (templatePath && !processed.has(templatePath)) {
|
|
370
881
|
await this.processFileDependency(templatePath, dependencies, processed, moduleName, warnings);
|
|
371
882
|
}
|
|
@@ -447,8 +958,10 @@ class WebBundler {
|
|
|
447
958
|
|
|
448
959
|
indexParts.push(' </items>', '</file-index>');
|
|
449
960
|
|
|
450
|
-
// Store the XML version
|
|
451
|
-
|
|
961
|
+
// Store the XML version wrapped in a file element
|
|
962
|
+
const csvXml = indexParts.join('\n');
|
|
963
|
+
const wrappedCsv = `<file id="${filePath}" type="xml">\n${csvXml}\n</file>`;
|
|
964
|
+
dependencies.set(filePath, wrappedCsv);
|
|
452
965
|
|
|
453
966
|
// Process referenced files from CSV
|
|
454
967
|
for (const refId of referencedFiles) {
|
|
@@ -470,22 +983,232 @@ class WebBundler {
|
|
|
470
983
|
}
|
|
471
984
|
}
|
|
472
985
|
|
|
473
|
-
//
|
|
474
|
-
|
|
986
|
+
// Determine file type for wrapping
|
|
987
|
+
let fileType = 'text';
|
|
988
|
+
if (ext === '.xml' || (ext === '.md' && processedContent.trim().startsWith('<'))) {
|
|
989
|
+
fileType = 'xml';
|
|
990
|
+
} else
|
|
991
|
+
switch (ext) {
|
|
992
|
+
case '.yaml':
|
|
993
|
+
case '.yml': {
|
|
994
|
+
fileType = 'yaml';
|
|
995
|
+
|
|
996
|
+
break;
|
|
997
|
+
}
|
|
998
|
+
case '.json': {
|
|
999
|
+
fileType = 'json';
|
|
1000
|
+
|
|
1001
|
+
break;
|
|
1002
|
+
}
|
|
1003
|
+
case '.md': {
|
|
1004
|
+
fileType = 'md';
|
|
1005
|
+
|
|
1006
|
+
break;
|
|
1007
|
+
}
|
|
1008
|
+
// No default
|
|
1009
|
+
}
|
|
1010
|
+
|
|
1011
|
+
// Wrap content in file element and store
|
|
1012
|
+
const wrappedContent = this.wrapContentInXml(processedContent, filePath, fileType);
|
|
1013
|
+
dependencies.set(filePath, wrappedContent);
|
|
475
1014
|
|
|
476
1015
|
// Recursively scan for more dependencies
|
|
477
|
-
const nestedRefs = this.extractFileReferences(processedContent);
|
|
1016
|
+
const { refs: nestedRefs } = this.extractFileReferences(processedContent);
|
|
478
1017
|
for (const ref of nestedRefs) {
|
|
479
1018
|
await this.processFileDependency(ref, dependencies, processed, moduleName, warnings);
|
|
480
1019
|
}
|
|
481
1020
|
}
|
|
482
1021
|
|
|
1022
|
+
/**
|
|
1023
|
+
* Process a workflow YAML file and its bundle files
|
|
1024
|
+
*/
|
|
1025
|
+
async processWorkflowDependency(workflowPath, dependencies, processed, moduleName, warnings = []) {
|
|
1026
|
+
// Skip if already processed
|
|
1027
|
+
if (processed.has(workflowPath)) {
|
|
1028
|
+
return { skipped: false };
|
|
1029
|
+
}
|
|
1030
|
+
processed.add(workflowPath);
|
|
1031
|
+
|
|
1032
|
+
// Resolve actual file path
|
|
1033
|
+
const actualPath = this.resolveFilePath(workflowPath, moduleName);
|
|
1034
|
+
|
|
1035
|
+
if (!actualPath || !(await fs.pathExists(actualPath))) {
|
|
1036
|
+
warnings.push(workflowPath);
|
|
1037
|
+
return { skipped: true };
|
|
1038
|
+
}
|
|
1039
|
+
|
|
1040
|
+
// Read and parse YAML file
|
|
1041
|
+
const yamlContent = await fs.readFile(actualPath, 'utf8');
|
|
1042
|
+
let workflowConfig;
|
|
1043
|
+
|
|
1044
|
+
try {
|
|
1045
|
+
workflowConfig = yaml.load(yamlContent);
|
|
1046
|
+
} catch (error) {
|
|
1047
|
+
warnings.push(`${workflowPath} (invalid YAML: ${error.message})`);
|
|
1048
|
+
return { skipped: true };
|
|
1049
|
+
}
|
|
1050
|
+
|
|
1051
|
+
// Check if web_bundle is explicitly set to false
|
|
1052
|
+
if (workflowConfig.web_bundle === false) {
|
|
1053
|
+
// Mark this workflow as skipped so we can remove the command from agent
|
|
1054
|
+
return { skipped: true, workflowPath };
|
|
1055
|
+
}
|
|
1056
|
+
|
|
1057
|
+
// Create YAML content with only web_bundle section (flattened)
|
|
1058
|
+
let bundleYamlContent;
|
|
1059
|
+
if (workflowConfig.web_bundle && typeof workflowConfig.web_bundle === 'object') {
|
|
1060
|
+
// Only include the web_bundle content, flattened to root level
|
|
1061
|
+
bundleYamlContent = yaml.dump(workflowConfig.web_bundle);
|
|
1062
|
+
} else {
|
|
1063
|
+
// If no web_bundle section, include full YAML
|
|
1064
|
+
bundleYamlContent = yamlContent;
|
|
1065
|
+
}
|
|
1066
|
+
|
|
1067
|
+
// Process {project-root} and {bmad_folder} references in the YAML content
|
|
1068
|
+
bundleYamlContent = this.processProjectRootReferences(bundleYamlContent);
|
|
1069
|
+
|
|
1070
|
+
// Include the YAML file with only web_bundle content, wrapped in XML
|
|
1071
|
+
// Process the workflow path to create a clean ID
|
|
1072
|
+
let yamlId = workflowPath.replace(/^{project-root}\//, '');
|
|
1073
|
+
yamlId = yamlId.replace(/^{bmad_folder}\//, 'bmad/');
|
|
1074
|
+
const wrappedYaml = this.wrapContentInXml(bundleYamlContent, yamlId, 'yaml');
|
|
1075
|
+
dependencies.set(yamlId, wrappedYaml);
|
|
1076
|
+
|
|
1077
|
+
// Always include core workflow task when processing workflows
|
|
1078
|
+
await this.includeCoreWorkflowFiles(dependencies, processed, moduleName, warnings);
|
|
1079
|
+
|
|
1080
|
+
// Check if advanced elicitation is enabled
|
|
1081
|
+
if (workflowConfig.web_bundle && workflowConfig.web_bundle.use_advanced_elicitation) {
|
|
1082
|
+
await this.includeAdvancedElicitationFiles(dependencies, processed, moduleName, warnings);
|
|
1083
|
+
}
|
|
1084
|
+
|
|
1085
|
+
// Process web_bundle_files if they exist
|
|
1086
|
+
if (workflowConfig.web_bundle && workflowConfig.web_bundle.web_bundle_files) {
|
|
1087
|
+
const bundleFiles = workflowConfig.web_bundle.web_bundle_files;
|
|
1088
|
+
|
|
1089
|
+
for (const bundleFilePath of bundleFiles) {
|
|
1090
|
+
// Process the file path to create a clean ID for checking if already processed
|
|
1091
|
+
let cleanFilePath = bundleFilePath.replace(/^{project-root}\//, '');
|
|
1092
|
+
cleanFilePath = cleanFilePath.replace(/^{bmad_folder}\//, 'bmad/');
|
|
1093
|
+
|
|
1094
|
+
if (processed.has(cleanFilePath)) {
|
|
1095
|
+
continue;
|
|
1096
|
+
}
|
|
1097
|
+
|
|
1098
|
+
const bundleActualPath = this.resolveFilePath(bundleFilePath, moduleName);
|
|
1099
|
+
|
|
1100
|
+
if (!bundleActualPath || !(await fs.pathExists(bundleActualPath))) {
|
|
1101
|
+
// Use the cleaned path in warnings (with {bmad_folder} replaced)
|
|
1102
|
+
warnings.push(cleanFilePath);
|
|
1103
|
+
continue;
|
|
1104
|
+
}
|
|
1105
|
+
|
|
1106
|
+
// Check if this is another workflow.yaml file - if so, recursively process it
|
|
1107
|
+
if (bundleFilePath.endsWith('workflow.yaml')) {
|
|
1108
|
+
// Recursively process this workflow and its dependencies
|
|
1109
|
+
await this.processWorkflowDependency(bundleFilePath, dependencies, processed, moduleName, warnings);
|
|
1110
|
+
} else {
|
|
1111
|
+
// Regular file - process normally
|
|
1112
|
+
processed.add(cleanFilePath);
|
|
1113
|
+
|
|
1114
|
+
// Read the file content
|
|
1115
|
+
let fileContent = await fs.readFile(bundleActualPath, 'utf8');
|
|
1116
|
+
const fileExt = path.extname(bundleActualPath).toLowerCase().replace('.', '');
|
|
1117
|
+
|
|
1118
|
+
// Process {project-root} references before wrapping
|
|
1119
|
+
fileContent = this.processProjectRootReferences(fileContent);
|
|
1120
|
+
|
|
1121
|
+
// Wrap in XML with proper escaping
|
|
1122
|
+
const wrappedContent = this.wrapContentInXml(fileContent, cleanFilePath, fileExt);
|
|
1123
|
+
dependencies.set(cleanFilePath, wrappedContent);
|
|
1124
|
+
}
|
|
1125
|
+
}
|
|
1126
|
+
}
|
|
1127
|
+
|
|
1128
|
+
return { skipped: false };
|
|
1129
|
+
}
|
|
1130
|
+
|
|
1131
|
+
/**
|
|
1132
|
+
* Include core workflow task files
|
|
1133
|
+
*/
|
|
1134
|
+
async includeCoreWorkflowFiles(dependencies, processed, moduleName, warnings = []) {
|
|
1135
|
+
const coreWorkflowPath = 'bmad/core/tasks/workflow.xml';
|
|
1136
|
+
|
|
1137
|
+
if (processed.has(coreWorkflowPath)) {
|
|
1138
|
+
return;
|
|
1139
|
+
}
|
|
1140
|
+
processed.add(coreWorkflowPath);
|
|
1141
|
+
|
|
1142
|
+
const actualPath = this.resolveFilePath(coreWorkflowPath, moduleName);
|
|
1143
|
+
|
|
1144
|
+
if (!actualPath || !(await fs.pathExists(actualPath))) {
|
|
1145
|
+
warnings.push(coreWorkflowPath);
|
|
1146
|
+
return;
|
|
1147
|
+
}
|
|
1148
|
+
|
|
1149
|
+
let fileContent = await fs.readFile(actualPath, 'utf8');
|
|
1150
|
+
// Process {project-root} and {bmad_folder} references
|
|
1151
|
+
fileContent = this.processProjectRootReferences(fileContent);
|
|
1152
|
+
const wrappedContent = this.wrapContentInXml(fileContent, coreWorkflowPath, 'xml');
|
|
1153
|
+
dependencies.set(coreWorkflowPath, wrappedContent);
|
|
1154
|
+
}
|
|
1155
|
+
|
|
1156
|
+
/**
|
|
1157
|
+
* Include advanced elicitation files
|
|
1158
|
+
*/
|
|
1159
|
+
async includeAdvancedElicitationFiles(dependencies, processed, moduleName, warnings = []) {
|
|
1160
|
+
const elicitationFiles = ['bmad/core/tasks/advanced-elicitation.xml', 'bmad/core/tasks/advanced-elicitation-methods.csv'];
|
|
1161
|
+
|
|
1162
|
+
for (const filePath of elicitationFiles) {
|
|
1163
|
+
if (processed.has(filePath)) {
|
|
1164
|
+
continue;
|
|
1165
|
+
}
|
|
1166
|
+
processed.add(filePath);
|
|
1167
|
+
|
|
1168
|
+
const actualPath = this.resolveFilePath(filePath, moduleName);
|
|
1169
|
+
|
|
1170
|
+
if (!actualPath || !(await fs.pathExists(actualPath))) {
|
|
1171
|
+
warnings.push(filePath);
|
|
1172
|
+
continue;
|
|
1173
|
+
}
|
|
1174
|
+
|
|
1175
|
+
let fileContent = await fs.readFile(actualPath, 'utf8');
|
|
1176
|
+
// Process {project-root} and {bmad_folder} references
|
|
1177
|
+
fileContent = this.processProjectRootReferences(fileContent);
|
|
1178
|
+
const fileExt = path.extname(actualPath).toLowerCase().replace('.', '');
|
|
1179
|
+
const wrappedContent = this.wrapContentInXml(fileContent, filePath, fileExt);
|
|
1180
|
+
dependencies.set(filePath, wrappedContent);
|
|
1181
|
+
}
|
|
1182
|
+
}
|
|
1183
|
+
|
|
1184
|
+
/**
|
|
1185
|
+
* Wrap file content in XML with proper escaping
|
|
1186
|
+
*/
|
|
1187
|
+
wrapContentInXml(content, id, type = 'text') {
|
|
1188
|
+
// For XML files, include directly without CDATA (they're already valid XML)
|
|
1189
|
+
if (type === 'xml') {
|
|
1190
|
+
// XML files can be included directly as they're already well-formed
|
|
1191
|
+
// Just wrap in a file element
|
|
1192
|
+
return `<file id="${id}" type="${type}">\n${content}\n</file>`;
|
|
1193
|
+
}
|
|
1194
|
+
|
|
1195
|
+
// For all other file types, use CDATA to preserve content exactly
|
|
1196
|
+
// Escape any ]]> sequences in the content by splitting CDATA sections
|
|
1197
|
+
// Replace ]]> with ]]]]><![CDATA[> to properly escape it within CDATA
|
|
1198
|
+
const escapedContent = content.replaceAll(']]>', ']]]]><![CDATA[>');
|
|
1199
|
+
|
|
1200
|
+
// Use CDATA to preserve content exactly as-is, including special characters
|
|
1201
|
+
return `<file id="${id}" type="${type}"><![CDATA[${escapedContent}]]></file>`;
|
|
1202
|
+
}
|
|
1203
|
+
|
|
483
1204
|
/**
|
|
484
1205
|
* Process wildcard dependency patterns
|
|
485
1206
|
*/
|
|
486
1207
|
async processWildcardDependency(pattern, dependencies, processed, moduleName, warnings = []) {
|
|
487
1208
|
// Remove {project-root} prefix
|
|
488
1209
|
pattern = pattern.replace(/^{project-root}\//, '');
|
|
1210
|
+
// Replace {bmad_folder} with bmad
|
|
1211
|
+
pattern = pattern.replace(/^{bmad_folder}\//, 'bmad/');
|
|
489
1212
|
|
|
490
1213
|
// Get directory and file pattern
|
|
491
1214
|
const lastSlash = pattern.lastIndexOf('/');
|
|
@@ -553,6 +1276,9 @@ class WebBundler {
|
|
|
553
1276
|
resolveFilePath(filePath, moduleName) {
|
|
554
1277
|
// Remove {project-root} prefix
|
|
555
1278
|
filePath = filePath.replace(/^{project-root}\//, '');
|
|
1279
|
+
// Replace {bmad_folder} with bmad
|
|
1280
|
+
filePath = filePath.replace(/^{bmad_folder}\//, 'bmad/');
|
|
1281
|
+
filePath = filePath.replace(/^{bmad_folder}$/, 'bmad');
|
|
556
1282
|
|
|
557
1283
|
// Check temp directory first for _cfg files
|
|
558
1284
|
if (filePath.startsWith('bmad/_cfg/')) {
|
|
@@ -619,13 +1345,15 @@ class WebBundler {
|
|
|
619
1345
|
}
|
|
620
1346
|
|
|
621
1347
|
/**
|
|
622
|
-
* Process and remove {project-root} references
|
|
1348
|
+
* Process and remove {project-root} references and replace {bmad_folder} with bmad
|
|
623
1349
|
*/
|
|
624
1350
|
processProjectRootReferences(content) {
|
|
625
1351
|
// Remove {project-root}/ prefix (with slash)
|
|
626
1352
|
content = content.replaceAll('{project-root}/', '');
|
|
627
1353
|
// Also remove {project-root} without slash
|
|
628
1354
|
content = content.replaceAll('{project-root}', '');
|
|
1355
|
+
// Replace {bmad_folder} with bmad
|
|
1356
|
+
content = content.replaceAll('{bmad_folder}', 'bmad');
|
|
629
1357
|
return content;
|
|
630
1358
|
}
|
|
631
1359
|
|
|
@@ -665,10 +1393,113 @@ class WebBundler {
|
|
|
665
1393
|
return parts.join('');
|
|
666
1394
|
}
|
|
667
1395
|
|
|
1396
|
+
/**
|
|
1397
|
+
* Inject help and exit menu items into agent XML
|
|
1398
|
+
*/
|
|
1399
|
+
injectHelpExitMenuItems(agentXml) {
|
|
1400
|
+
// Check if menu already has help and exit
|
|
1401
|
+
const hasHelp = agentXml.includes('cmd="*help"') || agentXml.includes('trigger="*help"');
|
|
1402
|
+
const hasExit = agentXml.includes('cmd="*exit"') || agentXml.includes('trigger="*exit"');
|
|
1403
|
+
|
|
1404
|
+
if (hasHelp && hasExit) {
|
|
1405
|
+
return agentXml; // Already has both, skip injection
|
|
1406
|
+
}
|
|
1407
|
+
|
|
1408
|
+
// Find the menu section
|
|
1409
|
+
const menuMatch = agentXml.match(/(<menu>[\s\S]*?<\/menu>)/);
|
|
1410
|
+
if (!menuMatch) {
|
|
1411
|
+
return agentXml; // No menu found, skip injection
|
|
1412
|
+
}
|
|
1413
|
+
|
|
1414
|
+
const menuContent = menuMatch[1];
|
|
1415
|
+
const menuClosingMatch = menuContent.match(/(\s*)<\/menu>/);
|
|
1416
|
+
if (!menuClosingMatch) {
|
|
1417
|
+
return agentXml;
|
|
1418
|
+
}
|
|
1419
|
+
|
|
1420
|
+
const indent = menuClosingMatch[1];
|
|
1421
|
+
const menuItems = [];
|
|
1422
|
+
|
|
1423
|
+
if (!hasHelp) {
|
|
1424
|
+
menuItems.push(`${indent}<item cmd="*help">Show numbered menu</item>`);
|
|
1425
|
+
}
|
|
1426
|
+
|
|
1427
|
+
if (!hasExit) {
|
|
1428
|
+
menuItems.push(`${indent}<item cmd="*exit">Exit with confirmation</item>`);
|
|
1429
|
+
}
|
|
1430
|
+
|
|
1431
|
+
if (menuItems.length === 0) {
|
|
1432
|
+
return agentXml;
|
|
1433
|
+
}
|
|
1434
|
+
|
|
1435
|
+
// Inject menu items before closing </menu> tag
|
|
1436
|
+
const newMenuContent = menuContent.replace(/(\s*)<\/menu>/, `\n${menuItems.join('\n')}\n${indent}</menu>`);
|
|
1437
|
+
return agentXml.replace(menuContent, newMenuContent);
|
|
1438
|
+
}
|
|
1439
|
+
|
|
1440
|
+
/**
|
|
1441
|
+
* Inject web activation instructions into agent XML
|
|
1442
|
+
*/
|
|
1443
|
+
injectWebActivation(agentXml) {
|
|
1444
|
+
// First, always inject help/exit menu items
|
|
1445
|
+
agentXml = this.injectHelpExitMenuItems(agentXml);
|
|
1446
|
+
|
|
1447
|
+
// Load the web activation template
|
|
1448
|
+
const activationPath = path.join(this.sourceDir, 'utility', 'models', 'agent-activation-web.xml');
|
|
1449
|
+
|
|
1450
|
+
if (!fs.existsSync(activationPath)) {
|
|
1451
|
+
console.warn(chalk.yellow('Warning: agent-activation-web.xml not found, skipping activation injection'));
|
|
1452
|
+
return agentXml;
|
|
1453
|
+
}
|
|
1454
|
+
|
|
1455
|
+
const activationXml = fs.readFileSync(activationPath, 'utf8');
|
|
1456
|
+
|
|
1457
|
+
// For web bundles, ALWAYS replace existing activation with web activation
|
|
1458
|
+
// This is because fragment-based activation assumes filesystem access which won't work in web bundles
|
|
1459
|
+
const hasActivation = agentXml.includes('<activation');
|
|
1460
|
+
|
|
1461
|
+
if (hasActivation) {
|
|
1462
|
+
// Replace existing activation block with web activation
|
|
1463
|
+
const injectedXml = agentXml.replace(/<activation[^>]*>[\s\S]*?<\/activation>/, activationXml);
|
|
1464
|
+
return injectedXml;
|
|
1465
|
+
}
|
|
1466
|
+
|
|
1467
|
+
// Check for critical-actions block (legacy)
|
|
1468
|
+
const hasCriticalActions = agentXml.includes('<critical-actions');
|
|
1469
|
+
|
|
1470
|
+
if (hasCriticalActions) {
|
|
1471
|
+
// Replace critical-actions block with activation
|
|
1472
|
+
const injectedXml = agentXml.replace(/<critical-actions>[\s\S]*?<\/critical-actions>/, activationXml);
|
|
1473
|
+
return injectedXml;
|
|
1474
|
+
}
|
|
1475
|
+
|
|
1476
|
+
// If no critical-actions, inject before closing </agent> tag
|
|
1477
|
+
const closingTagMatch = agentXml.match(/(\s*)<\/agent>/);
|
|
1478
|
+
if (!closingTagMatch) {
|
|
1479
|
+
console.warn(chalk.yellow('Warning: Could not find </agent> tag for activation injection'));
|
|
1480
|
+
return agentXml;
|
|
1481
|
+
}
|
|
1482
|
+
|
|
1483
|
+
// Inject the activation block before the closing </agent> tag
|
|
1484
|
+
// Properly indent each line of the activation XML
|
|
1485
|
+
const indent = closingTagMatch[1];
|
|
1486
|
+
const indentedActivation = activationXml
|
|
1487
|
+
.split('\n')
|
|
1488
|
+
.map((line) => (line.trim() ? indent + line : ''))
|
|
1489
|
+
.join('\n');
|
|
1490
|
+
|
|
1491
|
+
const injectedXml = agentXml.replace(/(\s*)<\/agent>/, `\n${indentedActivation}\n${indent}</agent>`);
|
|
1492
|
+
|
|
1493
|
+
return injectedXml;
|
|
1494
|
+
}
|
|
1495
|
+
|
|
668
1496
|
/**
|
|
669
1497
|
* Build the final agent bundle XML
|
|
670
1498
|
*/
|
|
671
1499
|
buildAgentBundle(agentXml, dependencies) {
|
|
1500
|
+
// Web activation is now handled by fragments during YAML building
|
|
1501
|
+
// agentXml = this.injectWebActivation(agentXml);
|
|
1502
|
+
|
|
672
1503
|
const parts = [
|
|
673
1504
|
'<?xml version="1.0" encoding="UTF-8"?>',
|
|
674
1505
|
'<agent-bundle>',
|
|
@@ -676,14 +1507,13 @@ class WebBundler {
|
|
|
676
1507
|
' ' + agentXml.replaceAll('\n', '\n '),
|
|
677
1508
|
];
|
|
678
1509
|
|
|
679
|
-
// Add dependencies
|
|
1510
|
+
// Add dependencies (all are now consistently wrapped in <file> elements)
|
|
680
1511
|
if (dependencies && dependencies.size > 0) {
|
|
681
1512
|
parts.push('\n <!-- Dependencies -->');
|
|
682
1513
|
for (const [id, content] of dependencies) {
|
|
683
|
-
//
|
|
684
|
-
const escapedContent = this.escapeXmlContent(content);
|
|
1514
|
+
// All dependencies are now wrapped in <file> elements
|
|
685
1515
|
// Indent properly
|
|
686
|
-
const indentedContent =
|
|
1516
|
+
const indentedContent = content
|
|
687
1517
|
.split('\n')
|
|
688
1518
|
.map((line) => ' ' + line)
|
|
689
1519
|
.join('\n');
|
|
@@ -732,7 +1562,8 @@ class WebBundler {
|
|
|
732
1562
|
const files = await fs.readdir(agentsPath);
|
|
733
1563
|
|
|
734
1564
|
for (const file of files) {
|
|
735
|
-
|
|
1565
|
+
// Look for .agent.yaml files (new format) or .md files (legacy format)
|
|
1566
|
+
if (file.endsWith('.agent.yaml') || (file.endsWith('.md') && !file.toLowerCase().includes('readme'))) {
|
|
736
1567
|
agents.push(file);
|
|
737
1568
|
}
|
|
738
1569
|
}
|
|
@@ -754,7 +1585,7 @@ class WebBundler {
|
|
|
754
1585
|
const files = await fs.readdir(teamsPath);
|
|
755
1586
|
|
|
756
1587
|
for (const file of files) {
|
|
757
|
-
if (file.endsWith('.
|
|
1588
|
+
if (file.endsWith('.yaml') || file.endsWith('.yml')) {
|
|
758
1589
|
teams.push(file);
|
|
759
1590
|
}
|
|
760
1591
|
}
|
|
@@ -794,8 +1625,8 @@ class WebBundler {
|
|
|
794
1625
|
// Ensure temp directory exists
|
|
795
1626
|
await fs.ensureDir(this.tempManifestDir);
|
|
796
1627
|
|
|
797
|
-
// Generate agent-
|
|
798
|
-
const agentPartyPath = path.join(this.tempManifestDir, 'agent-
|
|
1628
|
+
// Generate agent-manifest.csv using shared generator
|
|
1629
|
+
const agentPartyPath = path.join(this.tempManifestDir, 'agent-manifest.csv');
|
|
799
1630
|
await AgentPartyGenerator.writeAgentParty(agentPartyPath, this.discoveredAgents, { forWeb: true });
|
|
800
1631
|
|
|
801
1632
|
console.log(chalk.dim(' ✓ Created temporary manifest files'));
|
|
@@ -826,6 +1657,63 @@ class WebBundler {
|
|
|
826
1657
|
}
|
|
827
1658
|
}
|
|
828
1659
|
|
|
1660
|
+
/**
|
|
1661
|
+
* Format XML content for readability
|
|
1662
|
+
*/
|
|
1663
|
+
formatXml(xml) {
|
|
1664
|
+
const TAB = ' '; // 2 spaces
|
|
1665
|
+
let result = '';
|
|
1666
|
+
let depth = 0;
|
|
1667
|
+
|
|
1668
|
+
// Split by tags while preserving them
|
|
1669
|
+
const parts = xml.split(/(<[^>]+>)/g);
|
|
1670
|
+
|
|
1671
|
+
for (let i = 0; i < parts.length; i++) {
|
|
1672
|
+
const part = parts[i];
|
|
1673
|
+
if (!part) continue;
|
|
1674
|
+
|
|
1675
|
+
if (part.startsWith('<?xml')) {
|
|
1676
|
+
// XML declaration - no indent
|
|
1677
|
+
result += part + '\n';
|
|
1678
|
+
} else if (part.startsWith('<!--')) {
|
|
1679
|
+
// Comment
|
|
1680
|
+
result += TAB.repeat(depth) + part + '\n';
|
|
1681
|
+
} else if (part.startsWith('</')) {
|
|
1682
|
+
// Closing tag - unindent first
|
|
1683
|
+
depth = Math.max(0, depth - 1);
|
|
1684
|
+
result += TAB.repeat(depth) + part + '\n';
|
|
1685
|
+
} else if (part.startsWith('<')) {
|
|
1686
|
+
// Opening or self-closing tag
|
|
1687
|
+
const isSelfClosing = part.endsWith('/>');
|
|
1688
|
+
const tagName = part.match(/<(\w+)/)?.[1];
|
|
1689
|
+
|
|
1690
|
+
// Check if next part is simple text content
|
|
1691
|
+
const nextPart = parts[i + 1];
|
|
1692
|
+
const hasSimpleContent = nextPart && !nextPart.startsWith('<') && nextPart.trim().length > 0 && nextPart.trim().length <= 100;
|
|
1693
|
+
|
|
1694
|
+
if (hasSimpleContent && parts[i + 2] && parts[i + 2] === `</${tagName}>`) {
|
|
1695
|
+
// Simple tag with inline content: <tag>content</tag>
|
|
1696
|
+
result += TAB.repeat(depth) + part + nextPart.trim() + parts[i + 2] + '\n';
|
|
1697
|
+
i += 2; // Skip content and closing tag
|
|
1698
|
+
} else {
|
|
1699
|
+
// Multi-line tag
|
|
1700
|
+
result += TAB.repeat(depth) + part + '\n';
|
|
1701
|
+
if (!isSelfClosing) {
|
|
1702
|
+
depth++;
|
|
1703
|
+
}
|
|
1704
|
+
}
|
|
1705
|
+
} else {
|
|
1706
|
+
// Text content between tags
|
|
1707
|
+
const trimmed = part.trim();
|
|
1708
|
+
if (trimmed) {
|
|
1709
|
+
result += TAB.repeat(depth) + trimmed + '\n';
|
|
1710
|
+
}
|
|
1711
|
+
}
|
|
1712
|
+
}
|
|
1713
|
+
|
|
1714
|
+
return result;
|
|
1715
|
+
}
|
|
1716
|
+
|
|
829
1717
|
/**
|
|
830
1718
|
* Display summary statistics
|
|
831
1719
|
*/
|
|
@@ -837,7 +1725,9 @@ class WebBundler {
|
|
|
837
1725
|
console.log(chalk.bold('Bundle Statistics:'));
|
|
838
1726
|
console.log(` Total agents found: ${this.stats.totalAgents}`);
|
|
839
1727
|
console.log(` Successfully bundled: ${chalk.green(this.stats.bundledAgents)}`);
|
|
840
|
-
|
|
1728
|
+
if (this.stats.skippedAgents > 0) {
|
|
1729
|
+
console.log(` Skipped (webskip/bundle): ${chalk.gray(this.stats.skippedAgents)}`);
|
|
1730
|
+
}
|
|
841
1731
|
|
|
842
1732
|
if (this.stats.failedAgents > 0) {
|
|
843
1733
|
console.log(` Failed to bundle: ${chalk.red(this.stats.failedAgents)}`);
|
|
@@ -848,12 +1738,15 @@ class WebBundler {
|
|
|
848
1738
|
}
|
|
849
1739
|
|
|
850
1740
|
// Display warnings summary
|
|
851
|
-
if
|
|
1741
|
+
// Check if there are actually any warnings with content
|
|
1742
|
+
const hasActualWarnings = this.stats.warnings.some((w) => w && w.warnings && w.warnings.length > 0);
|
|
1743
|
+
|
|
1744
|
+
if (hasActualWarnings) {
|
|
852
1745
|
console.log(chalk.yellow('\n⚠ Missing Dependencies by Agent:'));
|
|
853
1746
|
|
|
854
1747
|
// Group and display warnings by agent
|
|
855
1748
|
for (const agentWarning of this.stats.warnings) {
|
|
856
|
-
if (agentWarning.warnings.length > 0) {
|
|
1749
|
+
if (agentWarning && agentWarning.warnings && agentWarning.warnings.length > 0) {
|
|
857
1750
|
console.log(chalk.bold(`\n ${agentWarning.agent}:`));
|
|
858
1751
|
// Display unique warnings for this agent
|
|
859
1752
|
const uniqueWarnings = [...new Set(agentWarning.warnings)];
|
|
@@ -862,6 +1755,8 @@ class WebBundler {
|
|
|
862
1755
|
}
|
|
863
1756
|
}
|
|
864
1757
|
}
|
|
1758
|
+
} else {
|
|
1759
|
+
console.log(chalk.green('\n✓ No missing dependencies'));
|
|
865
1760
|
}
|
|
866
1761
|
|
|
867
1762
|
// Final status
|