@zeyue0329/xiaoma-cli 1.0.7 → 1.0.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/FORK_GUIDE.md +106 -0
- package/.github/FUNDING.yaml +15 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +32 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +22 -0
- package/.github/workflows/discord.yaml +26 -0
- package/.github/workflows/format-check.yaml +44 -0
- package/.github/workflows/manual-release.yaml +174 -0
- package/.github/workflows/pr-validation.yaml +55 -0
- package/.husky/pre-commit +3 -0
- package/.vscode/settings.json +26 -1
- package/CHANGELOG.md +686 -0
- package/CONTRIBUTING.md +250 -0
- package/LICENSE +6 -1
- package/common/tasks/create-doc.md +2 -0
- package/common/tasks/execute-checklist.md +2 -7
- package/common/utils/bmad-doc-template.md +7 -5
- package/common/utils/workflow-management.md +2 -0
- package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-designer.txt +2103 -0
- package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-developer.txt +1627 -0
- package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-sm.txt +822 -0
- package/dist/expansion-packs/bmad-2d-phaser-game-dev/teams/phaser-2d-nodejs-game-team.txt +8486 -0
- package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-architect.txt +3210 -0
- package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-designer.txt +3244 -0
- package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-developer.txt +317 -0
- package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-sm.txt +982 -0
- package/dist/expansion-packs/bmad-2d-unity-game-dev/teams/unity-2d-game-team.txt +12854 -0
- package/dist/expansion-packs/bmad-creative-writing/agents/beta-reader.txt +921 -0
- package/dist/expansion-packs/bmad-creative-writing/agents/book-critic.txt +81 -0
- package/dist/expansion-packs/bmad-creative-writing/agents/character-psychologist.txt +886 -0
- package/dist/expansion-packs/bmad-creative-writing/agents/cover-designer.txt +85 -0
- package/dist/expansion-packs/bmad-creative-writing/agents/dialog-specialist.txt +903 -0
- package/dist/expansion-packs/bmad-creative-writing/agents/editor.txt +837 -0
- package/dist/expansion-packs/bmad-creative-writing/agents/genre-specialist.txt +989 -0
- package/dist/expansion-packs/bmad-creative-writing/agents/narrative-designer.txt +888 -0
- package/dist/expansion-packs/bmad-creative-writing/agents/plot-architect.txt +1173 -0
- package/dist/expansion-packs/bmad-creative-writing/agents/world-builder.txt +914 -0
- package/dist/expansion-packs/bmad-creative-writing/teams/agent-team.txt +6071 -0
- package/dist/expansion-packs/bmad-infrastructure-devops/agents/infra-devops-platform.txt +2079 -0
- package/docs/GUIDING-PRINCIPLES.md +91 -0
- package/docs/core-architecture.md +219 -0
- package/docs/enhanced-ide-development-workflow.md +248 -0
- package/docs/expansion-packs.md +200 -0
- package/docs/how-to-contribute-with-pull-requests.md +158 -0
- package/docs/user-guide.md +530 -0
- package/docs/versioning-and-releases.md +155 -0
- package/docs/versions.md +48 -0
- package/docs/working-in-the-brownfield.md +597 -0
- package/eslint.config.mjs +119 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/agent-teams/phaser-2d-nodejs-game-team.yaml +14 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-designer.md +73 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-developer.md +80 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-sm.md +66 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/checklists/game-design-checklist.md +203 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/checklists/game-story-dod-checklist.md +162 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/config.yaml +9 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/data/bmad-kb.md +252 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/data/development-guidelines.md +649 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/tasks/advanced-elicitation.md +112 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/tasks/create-game-story.md +218 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/tasks/game-design-brainstorming.md +292 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-architecture-tmpl.yaml +614 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-brief-tmpl.yaml +357 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-design-doc-tmpl.yaml +344 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-story-tmpl.yaml +254 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/templates/level-design-doc-tmpl.yaml +485 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/workflows/game-dev-greenfield.yaml +184 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/workflows/game-prototype.yaml +176 -0
- package/expansion-packs/bmad-2d-unity-game-dev/agent-teams/unity-2d-game-team.yaml +15 -0
- package/expansion-packs/bmad-2d-unity-game-dev/agents/game-architect.md +82 -0
- package/expansion-packs/bmad-2d-unity-game-dev/agents/game-designer.md +79 -0
- package/expansion-packs/bmad-2d-unity-game-dev/agents/game-developer.md +80 -0
- package/expansion-packs/bmad-2d-unity-game-dev/agents/game-sm.md +67 -0
- package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-architect-checklist.md +393 -0
- package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-change-checklist.md +205 -0
- package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-design-checklist.md +203 -0
- package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-story-dod-checklist.md +126 -0
- package/expansion-packs/bmad-2d-unity-game-dev/config.yaml +7 -0
- package/expansion-packs/bmad-2d-unity-game-dev/data/bmad-kb.md +771 -0
- package/expansion-packs/bmad-2d-unity-game-dev/data/development-guidelines.md +588 -0
- package/expansion-packs/bmad-2d-unity-game-dev/tasks/advanced-elicitation.md +112 -0
- package/expansion-packs/bmad-2d-unity-game-dev/tasks/correct-course-game.md +143 -0
- package/expansion-packs/bmad-2d-unity-game-dev/tasks/create-game-story.md +186 -0
- package/expansion-packs/bmad-2d-unity-game-dev/tasks/game-design-brainstorming.md +292 -0
- package/expansion-packs/bmad-2d-unity-game-dev/tasks/validate-game-story.md +202 -0
- package/expansion-packs/bmad-2d-unity-game-dev/templates/game-architecture-tmpl.yaml +1031 -0
- package/expansion-packs/bmad-2d-unity-game-dev/templates/game-brief-tmpl.yaml +357 -0
- package/expansion-packs/bmad-2d-unity-game-dev/templates/game-design-doc-tmpl.yaml +706 -0
- package/expansion-packs/bmad-2d-unity-game-dev/templates/game-story-tmpl.yaml +257 -0
- package/expansion-packs/bmad-2d-unity-game-dev/templates/level-design-doc-tmpl.yaml +485 -0
- package/expansion-packs/bmad-2d-unity-game-dev/workflows/game-dev-greenfield.yaml +184 -0
- package/expansion-packs/bmad-2d-unity-game-dev/workflows/game-prototype.yaml +176 -0
- package/expansion-packs/bmad-creative-writing/README.md +146 -0
- package/expansion-packs/bmad-creative-writing/agent-teams/agent-team.yaml +20 -0
- package/expansion-packs/bmad-creative-writing/agents/beta-reader.md +94 -0
- package/expansion-packs/bmad-creative-writing/agents/book-critic.md +40 -0
- package/expansion-packs/bmad-creative-writing/agents/character-psychologist.md +93 -0
- package/expansion-packs/bmad-creative-writing/agents/cover-designer.md +46 -0
- package/expansion-packs/bmad-creative-writing/agents/dialog-specialist.md +92 -0
- package/expansion-packs/bmad-creative-writing/agents/editor.md +93 -0
- package/expansion-packs/bmad-creative-writing/agents/genre-specialist.md +95 -0
- package/expansion-packs/bmad-creative-writing/agents/narrative-designer.md +93 -0
- package/expansion-packs/bmad-creative-writing/agents/plot-architect.md +95 -0
- package/expansion-packs/bmad-creative-writing/agents/world-builder.md +94 -0
- package/expansion-packs/bmad-creative-writing/checklists/beta-feedback-closure-checklist.md +23 -0
- package/expansion-packs/bmad-creative-writing/checklists/character-consistency-checklist.md +23 -0
- package/expansion-packs/bmad-creative-writing/checklists/comedic-timing-checklist.md +23 -0
- package/expansion-packs/bmad-creative-writing/checklists/cyberpunk-aesthetic-checklist.md +23 -0
- package/expansion-packs/bmad-creative-writing/checklists/ebook-formatting-checklist.md +21 -0
- package/expansion-packs/bmad-creative-writing/checklists/epic-poetry-meter-checklist.md +23 -0
- package/expansion-packs/bmad-creative-writing/checklists/fantasy-magic-system-checklist.md +23 -0
- package/expansion-packs/bmad-creative-writing/checklists/foreshadowing-payoff-checklist.md +22 -0
- package/expansion-packs/bmad-creative-writing/checklists/genre-tropes-checklist.md +22 -0
- package/expansion-packs/bmad-creative-writing/checklists/historical-accuracy-checklist.md +23 -0
- package/expansion-packs/bmad-creative-writing/checklists/horror-suspense-checklist.md +23 -0
- package/expansion-packs/bmad-creative-writing/checklists/kdp-cover-ready-checklist.md +25 -0
- package/expansion-packs/bmad-creative-writing/checklists/line-edit-quality-checklist.md +23 -0
- package/expansion-packs/bmad-creative-writing/checklists/marketing-copy-checklist.md +23 -0
- package/expansion-packs/bmad-creative-writing/checklists/mystery-clue-trail-checklist.md +23 -0
- package/expansion-packs/bmad-creative-writing/checklists/orbital-mechanics-checklist.md +23 -0
- package/expansion-packs/bmad-creative-writing/checklists/plot-structure-checklist.md +59 -0
- package/expansion-packs/bmad-creative-writing/checklists/publication-readiness-checklist.md +23 -0
- package/expansion-packs/bmad-creative-writing/checklists/romance-emotional-beats-checklist.md +23 -0
- package/expansion-packs/bmad-creative-writing/checklists/scene-quality-checklist.md +23 -0
- package/expansion-packs/bmad-creative-writing/checklists/scifi-technology-plausibility-checklist.md +22 -0
- package/expansion-packs/bmad-creative-writing/checklists/sensitivity-representation-checklist.md +23 -0
- package/expansion-packs/bmad-creative-writing/checklists/steampunk-gadget-checklist.md +23 -0
- package/expansion-packs/bmad-creative-writing/checklists/thriller-pacing-stakes-checklist.md +23 -0
- package/expansion-packs/bmad-creative-writing/checklists/timeline-continuity-checklist.md +23 -0
- package/expansion-packs/bmad-creative-writing/checklists/world-building-continuity-checklist.md +23 -0
- package/expansion-packs/bmad-creative-writing/checklists/ya-appropriateness-checklist.md +23 -0
- package/expansion-packs/bmad-creative-writing/config.yaml +12 -0
- package/expansion-packs/bmad-creative-writing/data/bmad-kb.md +209 -0
- package/expansion-packs/bmad-creative-writing/data/story-structures.md +67 -0
- package/expansion-packs/bmad-creative-writing/docs/brief.md +212 -0
- package/expansion-packs/bmad-creative-writing/tasks/advanced-elicitation.md +119 -0
- package/expansion-packs/bmad-creative-writing/tasks/analyze-reader-feedback.md +23 -0
- package/expansion-packs/bmad-creative-writing/tasks/analyze-story-structure.md +67 -0
- package/expansion-packs/bmad-creative-writing/tasks/assemble-kdp-package.md +29 -0
- package/expansion-packs/bmad-creative-writing/tasks/brainstorm-premise.md +23 -0
- package/expansion-packs/bmad-creative-writing/tasks/build-world.md +24 -0
- package/expansion-packs/bmad-creative-writing/tasks/character-depth-pass.md +22 -0
- package/expansion-packs/bmad-creative-writing/tasks/create-doc.md +103 -0
- package/expansion-packs/bmad-creative-writing/tasks/create-draft-section.md +26 -0
- package/expansion-packs/bmad-creative-writing/tasks/critical-review.md +26 -0
- package/expansion-packs/bmad-creative-writing/tasks/develop-character.md +24 -0
- package/expansion-packs/bmad-creative-writing/tasks/execute-checklist.md +88 -0
- package/expansion-packs/bmad-creative-writing/tasks/expand-premise.md +23 -0
- package/expansion-packs/bmad-creative-writing/tasks/expand-synopsis.md +23 -0
- package/expansion-packs/bmad-creative-writing/tasks/final-polish.md +23 -0
- package/expansion-packs/bmad-creative-writing/tasks/generate-cover-brief.md +25 -0
- package/expansion-packs/bmad-creative-writing/tasks/generate-cover-prompts.md +26 -0
- package/expansion-packs/bmad-creative-writing/tasks/generate-scene-list.md +23 -0
- package/expansion-packs/bmad-creative-writing/tasks/incorporate-feedback.md +25 -0
- package/expansion-packs/bmad-creative-writing/tasks/outline-scenes.md +23 -0
- package/expansion-packs/bmad-creative-writing/tasks/provide-feedback.md +24 -0
- package/expansion-packs/bmad-creative-writing/tasks/publish-chapter.md +23 -0
- package/expansion-packs/bmad-creative-writing/tasks/quick-feedback.md +22 -0
- package/expansion-packs/bmad-creative-writing/tasks/select-next-arc.md +23 -0
- package/expansion-packs/bmad-creative-writing/tasks/workshop-dialog.md +64 -0
- package/expansion-packs/bmad-creative-writing/templates/beta-feedback-form.yaml +97 -0
- package/expansion-packs/bmad-creative-writing/templates/chapter-draft-tmpl.yaml +82 -0
- package/expansion-packs/bmad-creative-writing/templates/character-profile-tmpl.yaml +92 -0
- package/expansion-packs/bmad-creative-writing/templates/cover-design-brief-tmpl.yaml +98 -0
- package/expansion-packs/bmad-creative-writing/templates/premise-brief-tmpl.yaml +78 -0
- package/expansion-packs/bmad-creative-writing/templates/scene-list-tmpl.yaml +55 -0
- package/expansion-packs/bmad-creative-writing/templates/story-outline-tmpl.yaml +96 -0
- package/expansion-packs/bmad-creative-writing/templates/world-guide-tmpl.yaml +89 -0
- package/expansion-packs/bmad-creative-writing/workflows/book-cover-design-workflow.md +218 -0
- package/expansion-packs/bmad-creative-writing/workflows/novel-greenfield-workflow.yaml +56 -0
- package/expansion-packs/bmad-creative-writing/workflows/novel-serial-workflow.yaml +50 -0
- package/expansion-packs/bmad-creative-writing/workflows/novel-snowflake-workflow.yaml +69 -0
- package/expansion-packs/bmad-creative-writing/workflows/novel-writing.yaml +91 -0
- package/expansion-packs/bmad-creative-writing/workflows/screenplay-development.yaml +85 -0
- package/expansion-packs/bmad-creative-writing/workflows/series-planning.yaml +78 -0
- package/expansion-packs/bmad-creative-writing/workflows/short-story-creation.yaml +64 -0
- package/expansion-packs/bmad-infrastructure-devops/README.md +147 -0
- package/expansion-packs/bmad-infrastructure-devops/agents/infra-devops-platform.md +73 -0
- package/expansion-packs/bmad-infrastructure-devops/checklists/infrastructure-checklist.md +486 -0
- package/expansion-packs/bmad-infrastructure-devops/config.yaml +10 -0
- package/expansion-packs/bmad-infrastructure-devops/data/bmad-kb.md +307 -0
- package/expansion-packs/bmad-infrastructure-devops/tasks/review-infrastructure.md +161 -0
- package/expansion-packs/bmad-infrastructure-devops/tasks/validate-infrastructure.md +155 -0
- package/expansion-packs/bmad-infrastructure-devops/templates/infrastructure-architecture-tmpl.yaml +425 -0
- package/expansion-packs/bmad-infrastructure-devops/templates/infrastructure-platform-from-arch-tmpl.yaml +630 -0
- package/implement-fork-friendly-ci.sh +229 -0
- package/package.json +75 -45
- package/prettier.config.mjs +32 -0
- package/test.md +1 -0
- package/tools/builders/web-builder.js +143 -149
- package/tools/bump-all-versions.js +42 -33
- package/tools/bump-expansion-version.js +23 -16
- package/tools/cli.js +15 -15
- package/tools/flattener/aggregate.js +76 -0
- package/tools/flattener/binary.js +80 -0
- package/tools/flattener/discovery.js +71 -0
- package/tools/flattener/files.js +35 -0
- package/tools/flattener/ignoreRules.js +176 -0
- package/tools/flattener/main.js +458 -460
- package/tools/flattener/projectRoot.js +206 -0
- package/tools/flattener/prompts.js +44 -0
- package/tools/flattener/stats.helpers.js +395 -0
- package/tools/flattener/stats.js +80 -0
- package/tools/flattener/test-matrix.js +413 -0
- package/tools/flattener/xml.js +88 -0
- package/tools/installer/README.md +1 -1
- package/tools/installer/bin/xiaoma.js +392 -99
- package/tools/installer/config/ide-agent-config.yaml +1 -1
- package/tools/installer/config/install.config.yaml +60 -9
- package/tools/installer/lib/config-loader.js +55 -51
- package/tools/installer/lib/file-manager.js +92 -114
- package/tools/installer/lib/ide-base-setup.js +57 -56
- package/tools/installer/lib/ide-setup.js +821 -414
- package/tools/installer/lib/installer.js +924 -696
- package/tools/installer/lib/memory-profiler.js +54 -53
- package/tools/installer/lib/module-manager.js +19 -15
- package/tools/installer/lib/resource-locator.js +31 -33
- package/tools/installer/package.json +24 -23
- package/tools/lib/dependency-resolver.js +39 -43
- package/tools/lib/yaml-utils.js +7 -7
- package/tools/md-assets/web-agent-startup-instructions.md +6 -6
- package/tools/preview-release-notes.js +66 -0
- package/tools/setup-hooks.sh +37 -0
- package/tools/shared/bannerArt.js +105 -0
- package/tools/sync-installer-version.js +7 -9
- package/tools/sync-version.sh +23 -0
- package/tools/update-expansion-version.js +14 -15
- package/tools/upgraders/v3-to-v4-upgrader.js +203 -294
- package/tools/version-bump.js +41 -26
- package/tools/xiaoma-npx-wrapper.js +14 -14
- package/tools/yaml-format.js +56 -43
- package/xiaoma-core/agent-teams/team-all.yaml +3 -2
- package/xiaoma-core/agent-teams/team-fullstack.yaml +2 -1
- package/xiaoma-core/agent-teams/team-ide-minimal.yaml +1 -0
- package/xiaoma-core/agent-teams/team-no-ui.yaml +2 -1
- package/xiaoma-core/agents/analyst.md +20 -17
- package/xiaoma-core/agents/architect.md +15 -14
- package/xiaoma-core/agents/{xiaoma-master.md → bmad-master.md} +29 -27
- package/xiaoma-core/agents/{xiaoma-orchestrator.md → bmad-orchestrator.md} +36 -39
- package/xiaoma-core/agents/dev.md +23 -18
- package/xiaoma-core/agents/pm.md +18 -15
- package/xiaoma-core/agents/po.md +13 -10
- package/xiaoma-core/agents/qa.md +46 -24
- package/xiaoma-core/agents/sm.md +11 -8
- package/xiaoma-core/agents/ux-expert.md +10 -7
- package/xiaoma-core/checklists/architect-checklist.md +2 -5
- package/xiaoma-core/checklists/change-checklist.md +4 -2
- package/xiaoma-core/checklists/pm-checklist.md +2 -5
- package/xiaoma-core/checklists/po-master-checklist.md +2 -9
- package/xiaoma-core/checklists/story-dod-checklist.md +2 -7
- package/xiaoma-core/checklists/story-draft-checklist.md +2 -3
- package/xiaoma-core/core-config.yaml +4 -1
- package/xiaoma-core/data/{xiaoma-kb.md → bmad-kb.md} +48 -42
- package/xiaoma-core/data/brainstorming-techniques.md +2 -0
- package/xiaoma-core/data/elicitation-methods.md +22 -0
- package/xiaoma-core/data/technical-preferences.md +2 -0
- package/xiaoma-core/data/test-levels-framework.md +148 -0
- package/xiaoma-core/data/test-priorities-matrix.md +174 -0
- package/xiaoma-core/tasks/advanced-elicitation.md +2 -0
- package/xiaoma-core/tasks/apply-qa-fixes.md +150 -0
- package/xiaoma-core/tasks/brownfield-create-epic.md +2 -0
- package/xiaoma-core/tasks/brownfield-create-story.md +2 -0
- package/xiaoma-core/tasks/correct-course.md +2 -0
- package/xiaoma-core/tasks/create-brownfield-story.md +14 -4
- package/xiaoma-core/tasks/create-deep-research-prompt.md +2 -11
- package/xiaoma-core/tasks/create-next-story.md +3 -1
- package/xiaoma-core/tasks/document-project.md +17 -13
- package/xiaoma-core/tasks/facilitate-brainstorming-session.md +5 -3
- package/xiaoma-core/tasks/generate-ai-frontend-prompt.md +2 -0
- package/xiaoma-core/tasks/index-docs.md +2 -6
- package/xiaoma-core/tasks/kb-mode-interaction.md +17 -15
- package/xiaoma-core/tasks/nfr-assess.md +345 -0
- package/xiaoma-core/tasks/qa-gate.md +163 -0
- package/xiaoma-core/tasks/review-story.md +245 -74
- package/xiaoma-core/tasks/risk-profile.md +355 -0
- package/xiaoma-core/tasks/shard-doc.md +2 -2
- package/xiaoma-core/tasks/test-design.md +176 -0
- package/xiaoma-core/tasks/trace-requirements.md +266 -0
- package/xiaoma-core/tasks/validate-next-story.md +5 -3
- package/xiaoma-core/templates/architecture-tmpl.yaml +50 -49
- package/xiaoma-core/templates/brainstorming-output-tmpl.yaml +5 -5
- package/xiaoma-core/templates/brownfield-architecture-tmpl.yaml +32 -31
- package/xiaoma-core/templates/brownfield-prd-tmpl.yaml +14 -13
- package/xiaoma-core/templates/competitor-analysis-tmpl.yaml +20 -6
- package/xiaoma-core/templates/front-end-architecture-tmpl.yaml +22 -9
- package/xiaoma-core/templates/front-end-spec-tmpl.yaml +25 -24
- package/xiaoma-core/templates/fullstack-architecture-tmpl.yaml +123 -104
- package/xiaoma-core/templates/market-research-tmpl.yaml +3 -2
- package/xiaoma-core/templates/prd-tmpl.yaml +10 -9
- package/xiaoma-core/templates/project-brief-tmpl.yaml +5 -4
- package/xiaoma-core/templates/qa-gate-tmpl.yaml +103 -0
- package/xiaoma-core/templates/story-tmpl.yaml +13 -12
- package/xiaoma-core/workflows/brownfield-fullstack.yaml +13 -12
- package/xiaoma-core/workflows/brownfield-service.yaml +5 -4
- package/xiaoma-core/workflows/brownfield-ui.yaml +5 -4
- package/xiaoma-core/workflows/greenfield-fullstack.yaml +7 -6
- package/xiaoma-core/workflows/greenfield-service.yaml +5 -4
- package/xiaoma-core/workflows/greenfield-ui.yaml +6 -5
- package/.releaserc.json +0 -18
- package/README.md +0 -532
- package/dist/agents/analyst.txt +0 -2882
- package/dist/agents/architect.txt +0 -3543
- package/dist/agents/dev.txt +0 -428
- package/dist/agents/pm.txt +0 -2229
- package/dist/agents/po.txt +0 -1364
- package/dist/agents/qa.txt +0 -386
- package/dist/agents/sm.txt +0 -668
- package/dist/agents/ux-expert.txt +0 -701
- package/dist/agents/xiaoma-master.txt +0 -8756
- package/dist/agents/xiaoma-orchestrator.txt +0 -1490
- package/dist/teams/team-all.txt +0 -11062
- package/dist/teams/team-fullstack.txt +0 -10392
- package/dist/teams/team-ide-minimal.txt +0 -3507
- package/dist/teams/team-no-ui.txt +0 -8951
- package/docs/quick-start.md +0 -179
- package/tools/bmad-npx-wrapper.js +0 -39
- package/tools/installer/package-lock.json +0 -704
- package/tools/semantic-release-sync-installer.js +0 -30
- package/xiaoma-core/bmad-core/user-guide.md +0 -0
- package/xiaoma-core/enhanced-ide-development-workflow.md +0 -43
- package/xiaoma-core/user-guide.md +0 -251
- package/xiaoma-core/working-in-the-brownfield.md +0 -364
|
@@ -1,32 +1,24 @@
|
|
|
1
|
-
const fs = require(
|
|
2
|
-
const path = require(
|
|
3
|
-
const crypto = require(
|
|
4
|
-
const yaml = require(
|
|
5
|
-
const chalk = require(
|
|
6
|
-
const { createReadStream, createWriteStream, promises: fsPromises } = require('fs');
|
|
7
|
-
const { pipeline } = require('stream/promises');
|
|
1
|
+
const fs = require('fs-extra');
|
|
2
|
+
const path = require('node:path');
|
|
3
|
+
const crypto = require('node:crypto');
|
|
4
|
+
const yaml = require('js-yaml');
|
|
5
|
+
const chalk = require('chalk');
|
|
6
|
+
const { createReadStream, createWriteStream, promises: fsPromises } = require('node:fs');
|
|
7
|
+
const { pipeline } = require('node:stream/promises');
|
|
8
8
|
const resourceLocator = require('./resource-locator');
|
|
9
9
|
|
|
10
10
|
class FileManager {
|
|
11
|
-
constructor() {
|
|
12
|
-
this.manifestDir = ".xiaoma-core";
|
|
13
|
-
this.manifestFile = "install-manifest.yaml";
|
|
14
|
-
}
|
|
11
|
+
constructor() {}
|
|
15
12
|
|
|
16
13
|
async copyFile(source, destination) {
|
|
17
14
|
try {
|
|
18
15
|
await fs.ensureDir(path.dirname(destination));
|
|
19
|
-
|
|
16
|
+
|
|
20
17
|
// Use streaming for large files (> 10MB)
|
|
21
18
|
const stats = await fs.stat(source);
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
createWriteStream(destination)
|
|
26
|
-
);
|
|
27
|
-
} else {
|
|
28
|
-
await fs.copy(source, destination);
|
|
29
|
-
}
|
|
19
|
+
await (stats.size > 10 * 1024 * 1024
|
|
20
|
+
? pipeline(createReadStream(source), createWriteStream(destination))
|
|
21
|
+
: fs.copy(source, destination));
|
|
30
22
|
return true;
|
|
31
23
|
} catch (error) {
|
|
32
24
|
console.error(chalk.red(`Failed to copy ${source}:`), error.message);
|
|
@@ -37,32 +29,24 @@ class FileManager {
|
|
|
37
29
|
async copyDirectory(source, destination) {
|
|
38
30
|
try {
|
|
39
31
|
await fs.ensureDir(destination);
|
|
40
|
-
|
|
32
|
+
|
|
41
33
|
// Use streaming copy for large directories
|
|
42
34
|
const files = await resourceLocator.findFiles('**/*', {
|
|
43
35
|
cwd: source,
|
|
44
|
-
nodir: true
|
|
36
|
+
nodir: true,
|
|
45
37
|
});
|
|
46
|
-
|
|
38
|
+
|
|
47
39
|
// Process files in batches to avoid memory issues
|
|
48
40
|
const batchSize = 50;
|
|
49
|
-
for (let
|
|
50
|
-
const batch = files.slice(
|
|
41
|
+
for (let index = 0; index < files.length; index += batchSize) {
|
|
42
|
+
const batch = files.slice(index, index + batchSize);
|
|
51
43
|
await Promise.all(
|
|
52
|
-
batch.map(file =>
|
|
53
|
-
this.copyFile(
|
|
54
|
-
path.join(source, file),
|
|
55
|
-
path.join(destination, file)
|
|
56
|
-
)
|
|
57
|
-
)
|
|
44
|
+
batch.map((file) => this.copyFile(path.join(source, file), path.join(destination, file))),
|
|
58
45
|
);
|
|
59
46
|
}
|
|
60
47
|
return true;
|
|
61
48
|
} catch (error) {
|
|
62
|
-
console.error(
|
|
63
|
-
chalk.red(`Failed to copy directory ${source}:`),
|
|
64
|
-
error.message
|
|
65
|
-
);
|
|
49
|
+
console.error(chalk.red(`Failed to copy directory ${source}:`), error.message);
|
|
66
50
|
return false;
|
|
67
51
|
}
|
|
68
52
|
}
|
|
@@ -73,17 +57,16 @@ class FileManager {
|
|
|
73
57
|
|
|
74
58
|
for (const file of files) {
|
|
75
59
|
const sourcePath = path.join(sourceDir, file);
|
|
76
|
-
const
|
|
60
|
+
const destinationPath = path.join(destDir, file);
|
|
77
61
|
|
|
78
62
|
// Use root replacement if rootValue is provided and file needs it
|
|
79
|
-
const needsRootReplacement =
|
|
80
|
-
|
|
63
|
+
const needsRootReplacement =
|
|
64
|
+
rootValue && (file.endsWith('.md') || file.endsWith('.yaml') || file.endsWith('.yml'));
|
|
65
|
+
|
|
81
66
|
let success = false;
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
success = await this.copyFile(sourcePath, destPath);
|
|
86
|
-
}
|
|
67
|
+
success = await (needsRootReplacement
|
|
68
|
+
? this.copyFileWithRootReplacement(sourcePath, destinationPath, rootValue)
|
|
69
|
+
: this.copyFile(sourcePath, destinationPath));
|
|
87
70
|
|
|
88
71
|
if (success) {
|
|
89
72
|
copied.push(file);
|
|
@@ -97,32 +80,28 @@ class FileManager {
|
|
|
97
80
|
try {
|
|
98
81
|
// Use streaming for hash calculation to reduce memory usage
|
|
99
82
|
const stream = createReadStream(filePath);
|
|
100
|
-
const hash = crypto.createHash(
|
|
101
|
-
|
|
83
|
+
const hash = crypto.createHash('sha256');
|
|
84
|
+
|
|
102
85
|
for await (const chunk of stream) {
|
|
103
86
|
hash.update(chunk);
|
|
104
87
|
}
|
|
105
|
-
|
|
106
|
-
return hash.digest(
|
|
107
|
-
} catch
|
|
88
|
+
|
|
89
|
+
return hash.digest('hex').slice(0, 16);
|
|
90
|
+
} catch {
|
|
108
91
|
return null;
|
|
109
92
|
}
|
|
110
93
|
}
|
|
111
94
|
|
|
112
95
|
async createManifest(installDir, config, files) {
|
|
113
|
-
const manifestPath = path.join(
|
|
114
|
-
installDir,
|
|
115
|
-
this.manifestDir,
|
|
116
|
-
this.manifestFile
|
|
117
|
-
);
|
|
96
|
+
const manifestPath = path.join(installDir, this.manifestDir, this.manifestFile);
|
|
118
97
|
|
|
119
98
|
// Read version from package.json
|
|
120
|
-
let coreVersion =
|
|
99
|
+
let coreVersion = 'unknown';
|
|
121
100
|
try {
|
|
122
101
|
const packagePath = path.join(__dirname, '..', '..', '..', 'package.json');
|
|
123
102
|
const packageJson = require(packagePath);
|
|
124
103
|
coreVersion = packageJson.version;
|
|
125
|
-
} catch
|
|
104
|
+
} catch {
|
|
126
105
|
console.warn("Could not read version from package.json, using 'unknown'");
|
|
127
106
|
}
|
|
128
107
|
|
|
@@ -156,31 +135,23 @@ class FileManager {
|
|
|
156
135
|
}
|
|
157
136
|
|
|
158
137
|
async readManifest(installDir) {
|
|
159
|
-
const manifestPath = path.join(
|
|
160
|
-
installDir,
|
|
161
|
-
this.manifestDir,
|
|
162
|
-
this.manifestFile
|
|
163
|
-
);
|
|
138
|
+
const manifestPath = path.join(installDir, this.manifestDir, this.manifestFile);
|
|
164
139
|
|
|
165
140
|
try {
|
|
166
|
-
const content = await fs.readFile(manifestPath,
|
|
141
|
+
const content = await fs.readFile(manifestPath, 'utf8');
|
|
167
142
|
return yaml.load(content);
|
|
168
|
-
} catch
|
|
143
|
+
} catch {
|
|
169
144
|
return null;
|
|
170
145
|
}
|
|
171
146
|
}
|
|
172
147
|
|
|
173
148
|
async readExpansionPackManifest(installDir, packId) {
|
|
174
|
-
const manifestPath = path.join(
|
|
175
|
-
installDir,
|
|
176
|
-
`.${packId}`,
|
|
177
|
-
this.manifestFile
|
|
178
|
-
);
|
|
149
|
+
const manifestPath = path.join(installDir, `.${packId}`, this.manifestFile);
|
|
179
150
|
|
|
180
151
|
try {
|
|
181
|
-
const content = await fs.readFile(manifestPath,
|
|
152
|
+
const content = await fs.readFile(manifestPath, 'utf8');
|
|
182
153
|
return yaml.load(content);
|
|
183
|
-
} catch
|
|
154
|
+
} catch {
|
|
184
155
|
return null;
|
|
185
156
|
}
|
|
186
157
|
}
|
|
@@ -203,24 +174,24 @@ class FileManager {
|
|
|
203
174
|
async checkFileIntegrity(installDir, manifest) {
|
|
204
175
|
const result = {
|
|
205
176
|
missing: [],
|
|
206
|
-
modified: []
|
|
177
|
+
modified: [],
|
|
207
178
|
};
|
|
208
179
|
|
|
209
180
|
for (const file of manifest.files) {
|
|
210
181
|
const filePath = path.join(installDir, file.path);
|
|
211
|
-
|
|
182
|
+
|
|
212
183
|
// Skip checking the manifest file itself - it will always be different due to timestamps
|
|
213
184
|
if (file.path.endsWith('install-manifest.yaml')) {
|
|
214
185
|
continue;
|
|
215
186
|
}
|
|
216
|
-
|
|
217
|
-
if (
|
|
218
|
-
result.missing.push(file.path);
|
|
219
|
-
} else {
|
|
187
|
+
|
|
188
|
+
if (await this.pathExists(filePath)) {
|
|
220
189
|
const currentHash = await this.calculateFileHash(filePath);
|
|
221
190
|
if (currentHash && currentHash !== file.hash) {
|
|
222
191
|
result.modified.push(file.path);
|
|
223
192
|
}
|
|
193
|
+
} else {
|
|
194
|
+
result.missing.push(file.path);
|
|
224
195
|
}
|
|
225
196
|
}
|
|
226
197
|
|
|
@@ -228,7 +199,7 @@ class FileManager {
|
|
|
228
199
|
}
|
|
229
200
|
|
|
230
201
|
async backupFile(filePath) {
|
|
231
|
-
const backupPath = filePath +
|
|
202
|
+
const backupPath = filePath + '.bak';
|
|
232
203
|
let counter = 1;
|
|
233
204
|
let finalBackupPath = backupPath;
|
|
234
205
|
|
|
@@ -256,7 +227,7 @@ class FileManager {
|
|
|
256
227
|
}
|
|
257
228
|
|
|
258
229
|
async readFile(filePath) {
|
|
259
|
-
return fs.readFile(filePath,
|
|
230
|
+
return fs.readFile(filePath, 'utf8');
|
|
260
231
|
}
|
|
261
232
|
|
|
262
233
|
async writeFile(filePath, content) {
|
|
@@ -269,14 +240,10 @@ class FileManager {
|
|
|
269
240
|
}
|
|
270
241
|
|
|
271
242
|
async createExpansionPackManifest(installDir, packId, config, files) {
|
|
272
|
-
const manifestPath = path.join(
|
|
273
|
-
installDir,
|
|
274
|
-
`.${packId}`,
|
|
275
|
-
this.manifestFile
|
|
276
|
-
);
|
|
243
|
+
const manifestPath = path.join(installDir, `.${packId}`, this.manifestFile);
|
|
277
244
|
|
|
278
245
|
const manifest = {
|
|
279
|
-
version: config.expansionPackVersion || require(
|
|
246
|
+
version: config.expansionPackVersion || require('../../../package.json').version,
|
|
280
247
|
installed_at: new Date().toISOString(),
|
|
281
248
|
install_type: config.installType,
|
|
282
249
|
expansion_pack_id: config.expansionPackId,
|
|
@@ -305,25 +272,25 @@ class FileManager {
|
|
|
305
272
|
}
|
|
306
273
|
|
|
307
274
|
async modifyCoreConfig(installDir, config) {
|
|
308
|
-
const coreConfigPath = path.join(installDir, '.
|
|
309
|
-
|
|
275
|
+
const coreConfigPath = path.join(installDir, '.bmad-core', 'core-config.yaml');
|
|
276
|
+
|
|
310
277
|
try {
|
|
311
278
|
// Read the existing core-config.yaml
|
|
312
279
|
const coreConfigContent = await fs.readFile(coreConfigPath, 'utf8');
|
|
313
280
|
const coreConfig = yaml.load(coreConfigContent);
|
|
314
|
-
|
|
281
|
+
|
|
315
282
|
// Modify sharding settings if provided
|
|
316
283
|
if (config.prdSharded !== undefined) {
|
|
317
284
|
coreConfig.prd.prdSharded = config.prdSharded;
|
|
318
285
|
}
|
|
319
|
-
|
|
286
|
+
|
|
320
287
|
if (config.architectureSharded !== undefined) {
|
|
321
288
|
coreConfig.architecture.architectureSharded = config.architectureSharded;
|
|
322
289
|
}
|
|
323
|
-
|
|
290
|
+
|
|
324
291
|
// Write back the modified config
|
|
325
292
|
await fs.writeFile(coreConfigPath, yaml.dump(coreConfig, { indent: 2 }));
|
|
326
|
-
|
|
293
|
+
|
|
327
294
|
return true;
|
|
328
295
|
} catch (error) {
|
|
329
296
|
console.error(chalk.red(`Failed to modify core-config.yaml:`), error.message);
|
|
@@ -335,31 +302,32 @@ class FileManager {
|
|
|
335
302
|
try {
|
|
336
303
|
// Check file size to determine if we should stream
|
|
337
304
|
const stats = await fs.stat(source);
|
|
338
|
-
|
|
339
|
-
if (stats.size > 5 * 1024 * 1024) {
|
|
305
|
+
|
|
306
|
+
if (stats.size > 5 * 1024 * 1024) {
|
|
307
|
+
// 5MB threshold
|
|
340
308
|
// Use streaming for large files
|
|
341
|
-
const { Transform } = require('stream');
|
|
309
|
+
const { Transform } = require('node:stream');
|
|
342
310
|
const replaceStream = new Transform({
|
|
343
311
|
transform(chunk, encoding, callback) {
|
|
344
|
-
const modified = chunk.toString().
|
|
312
|
+
const modified = chunk.toString().replaceAll('{root}', rootValue);
|
|
345
313
|
callback(null, modified);
|
|
346
|
-
}
|
|
314
|
+
},
|
|
347
315
|
});
|
|
348
|
-
|
|
316
|
+
|
|
349
317
|
await this.ensureDirectory(path.dirname(destination));
|
|
350
318
|
await pipeline(
|
|
351
319
|
createReadStream(source, { encoding: 'utf8' }),
|
|
352
320
|
replaceStream,
|
|
353
|
-
createWriteStream(destination, { encoding: 'utf8' })
|
|
321
|
+
createWriteStream(destination, { encoding: 'utf8' }),
|
|
354
322
|
);
|
|
355
323
|
} else {
|
|
356
324
|
// Regular approach for smaller files
|
|
357
325
|
const content = await fsPromises.readFile(source, 'utf8');
|
|
358
|
-
const updatedContent = content.
|
|
326
|
+
const updatedContent = content.replaceAll('{root}', rootValue);
|
|
359
327
|
await this.ensureDirectory(path.dirname(destination));
|
|
360
328
|
await fsPromises.writeFile(destination, updatedContent, 'utf8');
|
|
361
329
|
}
|
|
362
|
-
|
|
330
|
+
|
|
363
331
|
return true;
|
|
364
332
|
} catch (error) {
|
|
365
333
|
console.error(chalk.red(`Failed to copy ${source} with root replacement:`), error.message);
|
|
@@ -367,45 +335,55 @@ class FileManager {
|
|
|
367
335
|
}
|
|
368
336
|
}
|
|
369
337
|
|
|
370
|
-
async copyDirectoryWithRootReplacement(
|
|
338
|
+
async copyDirectoryWithRootReplacement(
|
|
339
|
+
source,
|
|
340
|
+
destination,
|
|
341
|
+
rootValue,
|
|
342
|
+
fileExtensions = ['.md', '.yaml', '.yml'],
|
|
343
|
+
) {
|
|
371
344
|
try {
|
|
372
345
|
await this.ensureDirectory(destination);
|
|
373
|
-
|
|
346
|
+
|
|
374
347
|
// Get all files in source directory
|
|
375
|
-
const files = await resourceLocator.findFiles('**/*', {
|
|
376
|
-
cwd: source,
|
|
377
|
-
nodir: true
|
|
348
|
+
const files = await resourceLocator.findFiles('**/*', {
|
|
349
|
+
cwd: source,
|
|
350
|
+
nodir: true,
|
|
378
351
|
});
|
|
379
|
-
|
|
352
|
+
|
|
380
353
|
let replacedCount = 0;
|
|
381
|
-
|
|
354
|
+
|
|
382
355
|
for (const file of files) {
|
|
383
356
|
const sourcePath = path.join(source, file);
|
|
384
|
-
const
|
|
385
|
-
|
|
357
|
+
const destinationPath = path.join(destination, file);
|
|
358
|
+
|
|
386
359
|
// Check if this file type should have {root} replacement
|
|
387
|
-
const shouldReplace = fileExtensions.some(
|
|
388
|
-
|
|
360
|
+
const shouldReplace = fileExtensions.some((extension) => file.endsWith(extension));
|
|
361
|
+
|
|
389
362
|
if (shouldReplace) {
|
|
390
|
-
if (await this.copyFileWithRootReplacement(sourcePath,
|
|
363
|
+
if (await this.copyFileWithRootReplacement(sourcePath, destinationPath, rootValue)) {
|
|
391
364
|
replacedCount++;
|
|
392
365
|
}
|
|
393
366
|
} else {
|
|
394
367
|
// Regular copy for files that don't need replacement
|
|
395
|
-
await this.copyFile(sourcePath,
|
|
368
|
+
await this.copyFile(sourcePath, destinationPath);
|
|
396
369
|
}
|
|
397
370
|
}
|
|
398
|
-
|
|
371
|
+
|
|
399
372
|
if (replacedCount > 0) {
|
|
400
373
|
console.log(chalk.dim(` Processed ${replacedCount} files with {root} replacement`));
|
|
401
374
|
}
|
|
402
|
-
|
|
375
|
+
|
|
403
376
|
return true;
|
|
404
377
|
} catch (error) {
|
|
405
|
-
console.error(
|
|
378
|
+
console.error(
|
|
379
|
+
chalk.red(`Failed to copy directory ${source} with root replacement:`),
|
|
380
|
+
error.message,
|
|
381
|
+
);
|
|
406
382
|
return false;
|
|
407
383
|
}
|
|
408
384
|
}
|
|
385
|
+
manifestDir = '.bmad-core';
|
|
386
|
+
manifestFile = 'install-manifest.yaml';
|
|
409
387
|
}
|
|
410
388
|
|
|
411
389
|
module.exports = new FileManager();
|
|
@@ -3,13 +3,13 @@
|
|
|
3
3
|
* Reduces duplication and provides shared methods
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
const path = require(
|
|
7
|
-
const fs = require(
|
|
8
|
-
const yaml = require(
|
|
9
|
-
const chalk = require(
|
|
10
|
-
const fileManager = require(
|
|
11
|
-
const resourceLocator = require(
|
|
12
|
-
const { extractYamlFromAgent } = require(
|
|
6
|
+
const path = require('node:path');
|
|
7
|
+
const fs = require('fs-extra');
|
|
8
|
+
const yaml = require('js-yaml');
|
|
9
|
+
const chalk = require('chalk').default || require('chalk');
|
|
10
|
+
const fileManager = require('./file-manager');
|
|
11
|
+
const resourceLocator = require('./resource-locator');
|
|
12
|
+
const { extractYamlFromAgent } = require('../../lib/yaml-utils');
|
|
13
13
|
|
|
14
14
|
class BaseIdeSetup {
|
|
15
15
|
constructor() {
|
|
@@ -27,19 +27,19 @@ class BaseIdeSetup {
|
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
const allAgents = new Set();
|
|
30
|
-
|
|
30
|
+
|
|
31
31
|
// Get core agents
|
|
32
32
|
const coreAgents = await this.getCoreAgentIds(installDir);
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
for (const id of coreAgents) allAgents.add(id);
|
|
34
|
+
|
|
35
35
|
// Get expansion pack agents
|
|
36
36
|
const expansionPacks = await this.getInstalledExpansionPacks(installDir);
|
|
37
37
|
for (const pack of expansionPacks) {
|
|
38
38
|
const packAgents = await this.getExpansionPackAgents(pack.path);
|
|
39
|
-
|
|
39
|
+
for (const id of packAgents) allAgents.add(id);
|
|
40
40
|
}
|
|
41
|
-
|
|
42
|
-
const result =
|
|
41
|
+
|
|
42
|
+
const result = [...allAgents];
|
|
43
43
|
this._agentCache.set(cacheKey, result);
|
|
44
44
|
return result;
|
|
45
45
|
}
|
|
@@ -50,14 +50,14 @@ class BaseIdeSetup {
|
|
|
50
50
|
async getCoreAgentIds(installDir) {
|
|
51
51
|
const coreAgents = [];
|
|
52
52
|
const corePaths = [
|
|
53
|
-
path.join(installDir,
|
|
54
|
-
path.join(installDir,
|
|
53
|
+
path.join(installDir, '.bmad-core', 'agents'),
|
|
54
|
+
path.join(installDir, 'bmad-core', 'agents'),
|
|
55
55
|
];
|
|
56
56
|
|
|
57
57
|
for (const agentsDir of corePaths) {
|
|
58
58
|
if (await fileManager.pathExists(agentsDir)) {
|
|
59
|
-
const files = await resourceLocator.findFiles(
|
|
60
|
-
coreAgents.push(...files.map(file => path.basename(file,
|
|
59
|
+
const files = await resourceLocator.findFiles('*.md', { cwd: agentsDir });
|
|
60
|
+
coreAgents.push(...files.map((file) => path.basename(file, '.md')));
|
|
61
61
|
break; // Use first found
|
|
62
62
|
}
|
|
63
63
|
}
|
|
@@ -76,13 +76,13 @@ class BaseIdeSetup {
|
|
|
76
76
|
|
|
77
77
|
// Use resource locator for efficient path finding
|
|
78
78
|
let agentPath = await resourceLocator.getAgentPath(agentId);
|
|
79
|
-
|
|
79
|
+
|
|
80
80
|
if (!agentPath) {
|
|
81
81
|
// Check installation-specific paths
|
|
82
82
|
const possiblePaths = [
|
|
83
|
-
path.join(installDir,
|
|
84
|
-
path.join(installDir,
|
|
85
|
-
path.join(installDir,
|
|
83
|
+
path.join(installDir, '.bmad-core', 'agents', `${agentId}.md`),
|
|
84
|
+
path.join(installDir, 'bmad-core', 'agents', `${agentId}.md`),
|
|
85
|
+
path.join(installDir, 'common', 'agents', `${agentId}.md`),
|
|
86
86
|
];
|
|
87
87
|
|
|
88
88
|
for (const testPath of possiblePaths) {
|
|
@@ -113,7 +113,7 @@ class BaseIdeSetup {
|
|
|
113
113
|
const metadata = yaml.load(yamlContent);
|
|
114
114
|
return metadata.agent_name || agentId;
|
|
115
115
|
}
|
|
116
|
-
} catch
|
|
116
|
+
} catch {
|
|
117
117
|
// Fallback to agent ID
|
|
118
118
|
}
|
|
119
119
|
return agentId;
|
|
@@ -129,31 +129,31 @@ class BaseIdeSetup {
|
|
|
129
129
|
}
|
|
130
130
|
|
|
131
131
|
const expansionPacks = [];
|
|
132
|
-
|
|
132
|
+
|
|
133
133
|
// Check for dot-prefixed expansion packs
|
|
134
|
-
const dotExpansions = await resourceLocator.findFiles(
|
|
135
|
-
|
|
134
|
+
const dotExpansions = await resourceLocator.findFiles('.bmad-*', { cwd: installDir });
|
|
135
|
+
|
|
136
136
|
for (const dotExpansion of dotExpansions) {
|
|
137
|
-
if (dotExpansion !==
|
|
137
|
+
if (dotExpansion !== '.bmad-core') {
|
|
138
138
|
const packPath = path.join(installDir, dotExpansion);
|
|
139
|
-
const packName = dotExpansion.
|
|
139
|
+
const packName = dotExpansion.slice(1); // remove the dot
|
|
140
140
|
expansionPacks.push({
|
|
141
141
|
name: packName,
|
|
142
|
-
path: packPath
|
|
142
|
+
path: packPath,
|
|
143
143
|
});
|
|
144
144
|
}
|
|
145
145
|
}
|
|
146
|
-
|
|
146
|
+
|
|
147
147
|
// Check other dot folders that have config.yaml
|
|
148
|
-
const allDotFolders = await resourceLocator.findFiles(
|
|
148
|
+
const allDotFolders = await resourceLocator.findFiles('.*', { cwd: installDir });
|
|
149
149
|
for (const folder of allDotFolders) {
|
|
150
|
-
if (!folder.startsWith(
|
|
150
|
+
if (!folder.startsWith('.bmad-') && folder !== '.bmad-core') {
|
|
151
151
|
const packPath = path.join(installDir, folder);
|
|
152
|
-
const configPath = path.join(packPath,
|
|
152
|
+
const configPath = path.join(packPath, 'config.yaml');
|
|
153
153
|
if (await fileManager.pathExists(configPath)) {
|
|
154
154
|
expansionPacks.push({
|
|
155
|
-
name: folder.
|
|
156
|
-
path: packPath
|
|
155
|
+
name: folder.slice(1), // remove the dot
|
|
156
|
+
path: packPath,
|
|
157
157
|
});
|
|
158
158
|
}
|
|
159
159
|
}
|
|
@@ -167,13 +167,13 @@ class BaseIdeSetup {
|
|
|
167
167
|
* Get expansion pack agents
|
|
168
168
|
*/
|
|
169
169
|
async getExpansionPackAgents(packPath) {
|
|
170
|
-
const agentsDir = path.join(packPath,
|
|
170
|
+
const agentsDir = path.join(packPath, 'agents');
|
|
171
171
|
if (!(await fileManager.pathExists(agentsDir))) {
|
|
172
172
|
return [];
|
|
173
173
|
}
|
|
174
|
-
|
|
175
|
-
const agentFiles = await resourceLocator.findFiles(
|
|
176
|
-
return agentFiles.map(file => path.basename(file,
|
|
174
|
+
|
|
175
|
+
const agentFiles = await resourceLocator.findFiles('*.md', { cwd: agentsDir });
|
|
176
|
+
return agentFiles.map((file) => path.basename(file, '.md'));
|
|
177
177
|
}
|
|
178
178
|
|
|
179
179
|
/**
|
|
@@ -183,27 +183,28 @@ class BaseIdeSetup {
|
|
|
183
183
|
const agentContent = await fileManager.readFile(agentPath);
|
|
184
184
|
const agentTitle = await this.getAgentTitle(agentId, installDir);
|
|
185
185
|
const yamlContent = extractYamlFromAgent(agentContent);
|
|
186
|
-
|
|
187
|
-
let content =
|
|
188
|
-
|
|
186
|
+
|
|
187
|
+
let content = '';
|
|
188
|
+
|
|
189
189
|
if (format === 'mdc') {
|
|
190
190
|
// MDC format for Cursor
|
|
191
|
-
content =
|
|
192
|
-
content +=
|
|
193
|
-
content +=
|
|
194
|
-
content +=
|
|
195
|
-
content +=
|
|
191
|
+
content = '---\n';
|
|
192
|
+
content += 'description: \n';
|
|
193
|
+
content += 'globs: []\n';
|
|
194
|
+
content += 'alwaysApply: false\n';
|
|
195
|
+
content += '---\n\n';
|
|
196
196
|
content += `# ${agentId.toUpperCase()} Agent Rule\n\n`;
|
|
197
197
|
content += `This rule is triggered when the user types \`@${agentId}\` and activates the ${agentTitle} agent persona.\n\n`;
|
|
198
|
-
content +=
|
|
199
|
-
content +=
|
|
200
|
-
|
|
201
|
-
content +=
|
|
202
|
-
content +=
|
|
203
|
-
content +=
|
|
204
|
-
|
|
198
|
+
content += '## Agent Activation\n\n';
|
|
199
|
+
content +=
|
|
200
|
+
'CRITICAL: Read the full YAML, start activation to alter your state of being, follow startup section instructions, stay in this being until told to exit this mode:\n\n';
|
|
201
|
+
content += '```yaml\n';
|
|
202
|
+
content += yamlContent || agentContent.replace(/^#.*$/m, '').trim();
|
|
203
|
+
content += '\n```\n\n';
|
|
204
|
+
content += '## File Reference\n\n';
|
|
205
|
+
const relativePath = path.relative(installDir, agentPath).replaceAll('\\', '/');
|
|
205
206
|
content += `The complete agent definition is available in [${relativePath}](mdc:${relativePath}).\n\n`;
|
|
206
|
-
content +=
|
|
207
|
+
content += '## Usage\n\n';
|
|
207
208
|
content += `When the user types \`@${agentId}\`, activate this ${agentTitle} persona and follow all instructions defined in the YAML configuration above.\n`;
|
|
208
209
|
} else if (format === 'claude') {
|
|
209
210
|
// Claude Code format
|
|
@@ -211,7 +212,7 @@ class BaseIdeSetup {
|
|
|
211
212
|
content += `When this command is used, adopt the following agent persona:\n\n`;
|
|
212
213
|
content += agentContent;
|
|
213
214
|
}
|
|
214
|
-
|
|
215
|
+
|
|
215
216
|
return content;
|
|
216
217
|
}
|
|
217
218
|
|
|
@@ -224,4 +225,4 @@ class BaseIdeSetup {
|
|
|
224
225
|
}
|
|
225
226
|
}
|
|
226
227
|
|
|
227
|
-
module.exports = BaseIdeSetup;
|
|
228
|
+
module.exports = BaseIdeSetup;
|