bmad-elsabro 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.auto-claude-security.json +209 -0
- package/.claude_settings.json +34 -0
- package/.coderabbit.yaml +40 -0
- package/.nvmrc +1 -0
- package/.prettierignore +9 -0
- package/AI_TEST_GENERATOR_VERIFICATION.md +260 -0
- package/BUDGET_ALERT_TESTING.md +325 -0
- package/CHANGELOG.md +1488 -0
- package/CNAME +1 -0
- package/CONTRIBUTING.md +167 -0
- package/CONTRIBUTORS.md +32 -0
- package/LEGACY_MIGRATION_TESTING.md +428 -0
- package/LICENSE +30 -0
- package/PARTY_MODE_VERIFICATION.md +274 -0
- package/PROJECT_DETECTOR_TESTING.md +288 -0
- package/README.md +236 -0
- package/SECURITY.md +85 -0
- package/TRADEMARK.md +55 -0
- package/WORKFLOW_ROUTER_IMPLEMENTATION.md +379 -0
- package/Wordmark.png +0 -0
- package/banner-bmad-method.png +0 -0
- package/build/icons/512x512.png +0 -0
- package/build-mac.sh +3 -0
- package/docs/404.md +9 -0
- package/docs/_STYLE_GUIDE.md +367 -0
- package/docs/developer/api-reference.md +945 -0
- package/docs/developer/architecture.md +563 -0
- package/docs/developer/contributing.md +831 -0
- package/docs/downloads.md +74 -0
- package/docs/explanation/advanced-elicitation.md +24 -0
- package/docs/explanation/adversarial-review.md +57 -0
- package/docs/explanation/brainstorming.md +31 -0
- package/docs/explanation/brownfield-faq.md +55 -0
- package/docs/explanation/party-mode.md +57 -0
- package/docs/explanation/preventing-agent-conflicts.md +110 -0
- package/docs/explanation/quick-flow.md +27 -0
- package/docs/explanation/why-solutioning-matters.md +75 -0
- package/docs/how-to/brownfield/index.md +84 -0
- package/docs/how-to/brownfield/quick-fix-in-brownfield.md +76 -0
- package/docs/how-to/customize-bmad.md +158 -0
- package/docs/how-to/get-answers-about-bmad.md +102 -0
- package/docs/how-to/install-bmad.md +82 -0
- package/docs/how-to/shard-large-documents.md +101 -0
- package/docs/how-to/upgrade-to-v6.md +131 -0
- package/docs/index.md +56 -0
- package/docs/reference/workflow-map.md +83 -0
- package/docs/tea/explanation/engagement-models.md +710 -0
- package/docs/tea/explanation/fixture-architecture.md +457 -0
- package/docs/tea/explanation/knowledge-base-system.md +554 -0
- package/docs/tea/explanation/network-first-patterns.md +853 -0
- package/docs/tea/explanation/risk-based-testing.md +586 -0
- package/docs/tea/explanation/tea-overview.md +410 -0
- package/docs/tea/explanation/test-quality-standards.md +907 -0
- package/docs/tea/explanation/testing-as-engineering.md +112 -0
- package/docs/tea/glossary/index.md +159 -0
- package/docs/tea/how-to/brownfield/use-tea-for-enterprise.md +525 -0
- package/docs/tea/how-to/brownfield/use-tea-with-existing-tests.md +577 -0
- package/docs/tea/how-to/customization/enable-tea-mcp-enhancements.md +424 -0
- package/docs/tea/how-to/customization/integrate-playwright-utils.md +813 -0
- package/docs/tea/how-to/workflows/run-atdd.md +436 -0
- package/docs/tea/how-to/workflows/run-automate.md +653 -0
- package/docs/tea/how-to/workflows/run-nfr-assess.md +679 -0
- package/docs/tea/how-to/workflows/run-test-design.md +135 -0
- package/docs/tea/how-to/workflows/run-test-review.md +605 -0
- package/docs/tea/how-to/workflows/run-trace.md +883 -0
- package/docs/tea/how-to/workflows/setup-ci.md +712 -0
- package/docs/tea/how-to/workflows/setup-test-framework.md +98 -0
- package/docs/tea/reference/commands.md +276 -0
- package/docs/tea/reference/configuration.md +678 -0
- package/docs/tea/reference/knowledge-base.md +340 -0
- package/docs/tea/tutorials/tea-lite-quickstart.md +444 -0
- package/docs/tutorials/getting-started.md +205 -0
- package/docs/user-guide/getting-started.md +348 -0
- package/docs/user-guide/token-economy.md +601 -0
- package/docs/user-guide/workflows.md +546 -0
- package/electron-builder.yml +75 -0
- package/eslint.config.mjs +152 -0
- package/package.json +162 -0
- package/prettier.config.mjs +32 -0
- package/public/monaco-workers/index.js +21 -0
- package/renderer/App.tsx +311 -0
- package/renderer/components/ChatPanel.tsx +285 -0
- package/renderer/components/CodeEditor.tsx +327 -0
- package/renderer/components/CodeEditor.types.ts +245 -0
- package/renderer/components/FlowSelector.tsx +534 -0
- package/renderer/components/MessageInput.tsx +252 -0
- package/renderer/components/MessageList.tsx +204 -0
- package/renderer/components/MigrationWizard.tsx +896 -0
- package/renderer/components/NotificationCenter.tsx +291 -0
- package/renderer/components/OnboardingWizard.tsx +112 -0
- package/renderer/components/PartyMode.tsx +555 -0
- package/renderer/components/Sidebar.module.css +258 -0
- package/renderer/components/Sidebar.tsx +157 -0
- package/renderer/components/TemplateSelector.tsx +553 -0
- package/renderer/components/Terminal.tsx +523 -0
- package/renderer/components/TestCenter.tsx +364 -0
- package/renderer/components/TokenAnalytics.tsx +607 -0
- package/renderer/components/TokenMonitor.tsx +331 -0
- package/renderer/components/TutorialOverlay.tsx +483 -0
- package/renderer/components/WorkflowEditor.tsx +470 -0
- package/renderer/components/onboarding/Step1Welcome.tsx +72 -0
- package/renderer/components/onboarding/Step2Setup.tsx +193 -0
- package/renderer/components/onboarding/Step3CreateProject.tsx +209 -0
- package/renderer/components/test-center/CoverageDashboard.tsx +588 -0
- package/renderer/components/test-center/ELI5Guide.tsx +521 -0
- package/renderer/components/test-center/TestList.tsx +381 -0
- package/renderer/components/test-center/TestRunner.tsx +431 -0
- package/renderer/components/test-center/TestStepWizard.tsx +1000 -0
- package/renderer/components/test-center/VisualTestBuilder.tsx +460 -0
- package/renderer/components/workflow/DependencyEdge.tsx +200 -0
- package/renderer/components/workflow/StepNode.tsx +234 -0
- package/renderer/components/workflow/StepPalette.tsx +412 -0
- package/renderer/context/ThemeContext.tsx +97 -0
- package/renderer/data/shortcuts.json +94 -0
- package/renderer/data/testing-guides.json +261 -0
- package/renderer/data/tutorials.json +546 -0
- package/renderer/hooks/useKeyboardShortcuts.ts +249 -0
- package/renderer/hooks/useNotifications.ts +267 -0
- package/renderer/hooks/useTheme.ts +149 -0
- package/renderer/hooks/useTokenTracking.ts +464 -0
- package/renderer/hooks/useWorkflowState.ts +309 -0
- package/renderer/index.html +16 -0
- package/renderer/index.tsx +17 -0
- package/renderer/lib/MONACO_OFFLINE_CONFIG.md +153 -0
- package/renderer/lib/chart-utils.ts +472 -0
- package/renderer/lib/file-system-provider.ts +295 -0
- package/renderer/lib/monaco-loader.ts +247 -0
- package/renderer/renderer/components/NOTIFICATION_SYSTEM.md +192 -0
- package/renderer/styles.css +55 -0
- package/renderer/types/css-modules.d.ts +21 -0
- package/renderer/types/electron.d.ts +316 -0
- package/src/bmm/_module-installer/installer.js +48 -0
- package/src/bmm/agents/analyst.agent.yaml +36 -0
- package/src/bmm/agents/architect.agent.yaml +28 -0
- package/src/bmm/agents/dev.agent.yaml +38 -0
- package/src/bmm/agents/parallel-orchestrator.agent.yaml +50 -0
- package/src/bmm/agents/pm.agent.yaml +46 -0
- package/src/bmm/agents/quick-flow-solo-dev.agent.yaml +32 -0
- package/src/bmm/agents/sm.agent.yaml +36 -0
- package/src/bmm/agents/tea.agent.yaml +63 -0
- package/src/bmm/agents/tech-writer/tech-writer-sidecar/documentation-standards.md +224 -0
- package/src/bmm/agents/tech-writer/tech-writer.agent.yaml +45 -0
- package/src/bmm/agents/ux-designer.agent.yaml +26 -0
- package/src/bmm/agents/yolo-dev.agent.yaml +41 -0
- package/src/bmm/data/auto-testing-config.yaml +84 -0
- package/src/bmm/data/guided-mode-instructions.yaml +112 -0
- package/src/bmm/data/parallelization-config.yaml +136 -0
- package/src/bmm/data/project-context-template.md +26 -0
- package/src/bmm/data/speed-profiles.yaml +127 -0
- package/src/bmm/module-help.csv +32 -0
- package/src/bmm/module.yaml +60 -0
- package/src/bmm/teams/default-party.csv +21 -0
- package/src/bmm/teams/team-fullstack.yaml +12 -0
- package/src/bmm/testarch/knowledge/adr-quality-readiness-checklist.md +350 -0
- package/src/bmm/testarch/knowledge/api-request.md +442 -0
- package/src/bmm/testarch/knowledge/api-testing-patterns.md +843 -0
- package/src/bmm/testarch/knowledge/auth-session.md +552 -0
- package/src/bmm/testarch/knowledge/burn-in.md +273 -0
- package/src/bmm/testarch/knowledge/ci-burn-in.md +675 -0
- package/src/bmm/testarch/knowledge/component-tdd.md +486 -0
- package/src/bmm/testarch/knowledge/contract-testing.md +957 -0
- package/src/bmm/testarch/knowledge/data-factories.md +500 -0
- package/src/bmm/testarch/knowledge/email-auth.md +721 -0
- package/src/bmm/testarch/knowledge/error-handling.md +725 -0
- package/src/bmm/testarch/knowledge/feature-flags.md +750 -0
- package/src/bmm/testarch/knowledge/file-utils.md +463 -0
- package/src/bmm/testarch/knowledge/fixture-architecture.md +401 -0
- package/src/bmm/testarch/knowledge/fixtures-composition.md +382 -0
- package/src/bmm/testarch/knowledge/intercept-network-call.md +430 -0
- package/src/bmm/testarch/knowledge/log.md +429 -0
- package/src/bmm/testarch/knowledge/network-error-monitor.md +405 -0
- package/src/bmm/testarch/knowledge/network-first.md +486 -0
- package/src/bmm/testarch/knowledge/network-recorder.md +527 -0
- package/src/bmm/testarch/knowledge/nfr-criteria.md +670 -0
- package/src/bmm/testarch/knowledge/overview.md +286 -0
- package/src/bmm/testarch/knowledge/playwright-config.md +730 -0
- package/src/bmm/testarch/knowledge/probability-impact.md +601 -0
- package/src/bmm/testarch/knowledge/recurse.md +421 -0
- package/src/bmm/testarch/knowledge/risk-governance.md +615 -0
- package/src/bmm/testarch/knowledge/selective-testing.md +732 -0
- package/src/bmm/testarch/knowledge/selector-resilience.md +527 -0
- package/src/bmm/testarch/knowledge/test-healing-patterns.md +644 -0
- package/src/bmm/testarch/knowledge/test-levels-framework.md +473 -0
- package/src/bmm/testarch/knowledge/test-priorities-matrix.md +373 -0
- package/src/bmm/testarch/knowledge/test-quality.md +664 -0
- package/src/bmm/testarch/knowledge/timing-debugging.md +372 -0
- package/src/bmm/testarch/knowledge/visual-debugging.md +524 -0
- package/src/bmm/testarch/tea-index.csv +35 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/product-brief.template.md +10 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-01-init.md +177 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-01b-continue.md +161 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-02-vision.md +199 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-03-users.md +202 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-04-metrics.md +205 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-05-scope.md +219 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-06-complete.md +162 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/workflow.md +58 -0
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-01-init.md +137 -0
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-02-domain-analysis.md +229 -0
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-03-competitive-landscape.md +238 -0
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-04-regulatory-focus.md +206 -0
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-05-technical-trends.md +234 -0
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-06-research-synthesis.md +443 -0
- package/src/bmm/workflows/1-analysis/research/market-steps/step-01-init.md +182 -0
- package/src/bmm/workflows/1-analysis/research/market-steps/step-02-customer-behavior.md +237 -0
- package/src/bmm/workflows/1-analysis/research/market-steps/step-02-customer-insights.md +200 -0
- package/src/bmm/workflows/1-analysis/research/market-steps/step-03-customer-pain-points.md +249 -0
- package/src/bmm/workflows/1-analysis/research/market-steps/step-04-customer-decisions.md +259 -0
- package/src/bmm/workflows/1-analysis/research/market-steps/step-05-competitive-analysis.md +177 -0
- package/src/bmm/workflows/1-analysis/research/market-steps/step-06-research-completion.md +475 -0
- package/src/bmm/workflows/1-analysis/research/research.template.md +29 -0
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-01-init.md +137 -0
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-02-technical-overview.md +239 -0
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-03-integration-patterns.md +248 -0
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-04-architectural-patterns.md +202 -0
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-05-implementation-research.md +239 -0
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-06-research-synthesis.md +486 -0
- package/src/bmm/workflows/1-analysis/research/workflow.md +173 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/data/domain-complexity.csv +13 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/data/prd-purpose.md +197 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/data/project-types.csv +11 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-01-init.md +191 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-01b-continue.md +153 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-02-discovery.md +224 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-03-success.md +226 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-04-journeys.md +213 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-05-domain.md +207 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-06-innovation.md +226 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-07-project-type.md +237 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-08-scoping.md +228 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-09-functional.md +231 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-10-nonfunctional.md +242 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-11-polish.md +217 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-12-complete.md +124 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-01-discovery.md +247 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-01b-legacy-conversion.md +208 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-02-review.md +249 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-03-edit.md +253 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-04-complete.md +168 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-01-discovery.md +218 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-02-format-detection.md +191 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-02b-parity-check.md +209 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-03-density-validation.md +174 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-04-brief-coverage-validation.md +214 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-05-measurability-validation.md +228 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-06-traceability-validation.md +217 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-07-implementation-leakage-validation.md +205 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-08-domain-compliance-validation.md +243 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-09-project-type-validation.md +263 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-10-smart-validation.md +209 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-11-holistic-quality-validation.md +264 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-12-completeness-validation.md +242 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-13-report-complete.md +231 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/templates/prd-template.md +10 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/validation-report-prd-workflow.md +433 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/workflow.md +150 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-01-init.md +135 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-01b-continue.md +127 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-02-discovery.md +190 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-03-core-experience.md +216 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-04-emotional-response.md +219 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-05-inspiration.md +234 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-06-design-system.md +252 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-07-defining-experience.md +254 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-08-visual-foundation.md +224 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-09-design-directions.md +224 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-10-user-journeys.md +241 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-11-component-strategy.md +248 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-12-ux-patterns.md +237 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-13-responsive-accessibility.md +264 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-14-complete.md +171 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/ux-design-template.md +13 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/workflow.md +43 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-01-document-discovery.md +190 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-02-prd-analysis.md +178 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-03-epic-coverage-validation.md +179 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-04-ux-alignment.md +139 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-05-epic-quality-review.md +252 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-06-final-assessment.md +135 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/templates/readiness-report-template.md +4 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/workflow.md +55 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/architecture-decision-template.md +12 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/data/domain-complexity.csv +11 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/data/project-types.csv +7 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-01-init.md +153 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-01b-continue.md +164 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-02-context.md +224 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-03-starter.md +331 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-04-decisions.md +318 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-05-patterns.md +359 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-06-structure.md +379 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-07-validation.md +359 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-08-complete.md +76 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/workflow.md +50 -0
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-01-validate-prerequisites.md +259 -0
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-02-design-epics.md +233 -0
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-03-create-stories.md +272 -0
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-04-final-validation.md +149 -0
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/templates/epics-template.md +57 -0
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/workflow.md +59 -0
- package/src/bmm/workflows/4-implementation/code-review/checklist.md +23 -0
- package/src/bmm/workflows/4-implementation/code-review/instructions.xml +227 -0
- package/src/bmm/workflows/4-implementation/code-review/workflow.yaml +51 -0
- package/src/bmm/workflows/4-implementation/correct-course/checklist.md +288 -0
- package/src/bmm/workflows/4-implementation/correct-course/instructions.md +206 -0
- package/src/bmm/workflows/4-implementation/correct-course/workflow.yaml +60 -0
- package/src/bmm/workflows/4-implementation/create-story/checklist.md +358 -0
- package/src/bmm/workflows/4-implementation/create-story/instructions.xml +345 -0
- package/src/bmm/workflows/4-implementation/create-story/template.md +49 -0
- package/src/bmm/workflows/4-implementation/create-story/workflow.yaml +61 -0
- package/src/bmm/workflows/4-implementation/dev-story/checklist.md +80 -0
- package/src/bmm/workflows/4-implementation/dev-story/instructions.xml +410 -0
- package/src/bmm/workflows/4-implementation/dev-story/workflow.yaml +32 -0
- package/src/bmm/workflows/4-implementation/fix-and-test/workflow.md +197 -0
- package/src/bmm/workflows/4-implementation/retrospective/instructions.md +1443 -0
- package/src/bmm/workflows/4-implementation/retrospective/workflow.yaml +58 -0
- package/src/bmm/workflows/4-implementation/sprint-planning/checklist.md +33 -0
- package/src/bmm/workflows/4-implementation/sprint-planning/instructions.md +225 -0
- package/src/bmm/workflows/4-implementation/sprint-planning/sprint-status-template.yaml +55 -0
- package/src/bmm/workflows/4-implementation/sprint-planning/workflow.yaml +54 -0
- package/src/bmm/workflows/4-implementation/sprint-status/instructions.md +229 -0
- package/src/bmm/workflows/4-implementation/sprint-status/workflow.yaml +36 -0
- package/src/bmm/workflows/bmad-quick-flow/brownfield-fast-track/steps/step-01-detect.md +55 -0
- package/src/bmm/workflows/bmad-quick-flow/brownfield-fast-track/steps/step-02-confirm.md +48 -0
- package/src/bmm/workflows/bmad-quick-flow/brownfield-fast-track/steps/step-03-implement.md +61 -0
- package/src/bmm/workflows/bmad-quick-flow/brownfield-fast-track/workflow.md +41 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-01-mode-detection.md +176 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-02-context-gathering.md +120 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-03-execute.md +153 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-04-self-check.md +113 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-05-adversarial-review.md +106 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-06-resolve-findings.md +149 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/workflow.md +73 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-01-understand.md +192 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-02-investigate.md +145 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-03-generate.md +128 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-04-review.md +201 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/tech-spec-template.md +74 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/workflow.md +93 -0
- package/src/bmm/workflows/bmad-quick-flow/yolo-mode/steps/step-01-rapid-spec.md +54 -0
- package/src/bmm/workflows/bmad-quick-flow/yolo-mode/steps/step-02-ship-it.md +65 -0
- package/src/bmm/workflows/bmad-quick-flow/yolo-mode/workflow.md +54 -0
- package/src/bmm/workflows/document-project/checklist.md +245 -0
- package/src/bmm/workflows/document-project/documentation-requirements.csv +12 -0
- package/src/bmm/workflows/document-project/instructions.md +221 -0
- package/src/bmm/workflows/document-project/templates/deep-dive-template.md +345 -0
- package/src/bmm/workflows/document-project/templates/index-template.md +169 -0
- package/src/bmm/workflows/document-project/templates/project-overview-template.md +103 -0
- package/src/bmm/workflows/document-project/templates/project-scan-report-schema.json +160 -0
- package/src/bmm/workflows/document-project/templates/source-tree-template.md +135 -0
- package/src/bmm/workflows/document-project/workflow.yaml +30 -0
- package/src/bmm/workflows/document-project/workflows/deep-dive-instructions.md +298 -0
- package/src/bmm/workflows/document-project/workflows/deep-dive.yaml +31 -0
- package/src/bmm/workflows/document-project/workflows/full-scan-instructions.md +1106 -0
- package/src/bmm/workflows/document-project/workflows/full-scan.yaml +31 -0
- package/src/bmm/workflows/excalidraw-diagrams/_shared/excalidraw-library.json +90 -0
- package/src/bmm/workflows/excalidraw-diagrams/_shared/excalidraw-templates.yaml +127 -0
- package/src/bmm/workflows/excalidraw-diagrams/create-dataflow/checklist.md +39 -0
- package/src/bmm/workflows/excalidraw-diagrams/create-dataflow/instructions.md +130 -0
- package/src/bmm/workflows/excalidraw-diagrams/create-dataflow/workflow.yaml +27 -0
- package/src/bmm/workflows/excalidraw-diagrams/create-diagram/checklist.md +43 -0
- package/src/bmm/workflows/excalidraw-diagrams/create-diagram/instructions.md +141 -0
- package/src/bmm/workflows/excalidraw-diagrams/create-diagram/workflow.yaml +27 -0
- package/src/bmm/workflows/excalidraw-diagrams/create-flowchart/checklist.md +49 -0
- package/src/bmm/workflows/excalidraw-diagrams/create-flowchart/instructions.md +241 -0
- package/src/bmm/workflows/excalidraw-diagrams/create-flowchart/workflow.yaml +27 -0
- package/src/bmm/workflows/excalidraw-diagrams/create-wireframe/checklist.md +38 -0
- package/src/bmm/workflows/excalidraw-diagrams/create-wireframe/instructions.md +133 -0
- package/src/bmm/workflows/excalidraw-diagrams/create-wireframe/workflow.yaml +27 -0
- package/src/bmm/workflows/parallel-work/parallel-analysis/steps/step-01-parse-target.md +49 -0
- package/src/bmm/workflows/parallel-work/parallel-analysis/steps/step-02-launch-streams.md +135 -0
- package/src/bmm/workflows/parallel-work/parallel-analysis/steps/step-03-sync-point.md +74 -0
- package/src/bmm/workflows/parallel-work/parallel-analysis/steps/step-04-merge-insights.md +179 -0
- package/src/bmm/workflows/parallel-work/parallel-analysis/workflow.md +55 -0
- package/src/bmm/workflows/parallel-work/parallel-generation/workflow.md +109 -0
- package/src/bmm/workflows/parallel-work/parallel-reviews/workflow.md +111 -0
- package/src/bmm/workflows/parallel-work/parallel-stories/workflow.md +112 -0
- package/src/bmm/workflows/parallel-work/sprint-mode/steps/step-01-load-sprint.md +54 -0
- package/src/bmm/workflows/parallel-work/sprint-mode/steps/step-02-plan-execution.md +63 -0
- package/src/bmm/workflows/parallel-work/sprint-mode/steps/step-03-execute-stories.md +112 -0
- package/src/bmm/workflows/parallel-work/sprint-mode/steps/step-04-code-review.md +148 -0
- package/src/bmm/workflows/parallel-work/sprint-mode/steps/step-05-integration-testing.md +200 -0
- package/src/bmm/workflows/parallel-work/sprint-mode/steps/step-06-sprint-report.md +290 -0
- package/src/bmm/workflows/parallel-work/sprint-mode/workflow.md +58 -0
- package/src/bmm/workflows/testarch/atdd/atdd-checklist-template.md +363 -0
- package/src/bmm/workflows/testarch/atdd/checklist.md +374 -0
- package/src/bmm/workflows/testarch/atdd/instructions.md +806 -0
- package/src/bmm/workflows/testarch/atdd/workflow.yaml +47 -0
- package/src/bmm/workflows/testarch/automate/checklist.md +582 -0
- package/src/bmm/workflows/testarch/automate/instructions.md +1324 -0
- package/src/bmm/workflows/testarch/automate/workflow.yaml +54 -0
- package/src/bmm/workflows/testarch/ci/checklist.md +247 -0
- package/src/bmm/workflows/testarch/ci/github-actions-template.yaml +198 -0
- package/src/bmm/workflows/testarch/ci/gitlab-ci-template.yaml +149 -0
- package/src/bmm/workflows/testarch/ci/instructions.md +536 -0
- package/src/bmm/workflows/testarch/ci/workflow.yaml +47 -0
- package/src/bmm/workflows/testarch/framework/checklist.md +320 -0
- package/src/bmm/workflows/testarch/framework/instructions.md +481 -0
- package/src/bmm/workflows/testarch/framework/workflow.yaml +49 -0
- package/src/bmm/workflows/testarch/nfr-assess/checklist.md +407 -0
- package/src/bmm/workflows/testarch/nfr-assess/instructions.md +726 -0
- package/src/bmm/workflows/testarch/nfr-assess/nfr-report-template.md +461 -0
- package/src/bmm/workflows/testarch/nfr-assess/workflow.yaml +49 -0
- package/src/bmm/workflows/testarch/test-design/checklist.md +407 -0
- package/src/bmm/workflows/testarch/test-design/instructions.md +1158 -0
- package/src/bmm/workflows/testarch/test-design/test-design-architecture-template.md +213 -0
- package/src/bmm/workflows/testarch/test-design/test-design-qa-template.md +286 -0
- package/src/bmm/workflows/testarch/test-design/test-design-template.md +294 -0
- package/src/bmm/workflows/testarch/test-design/workflow.yaml +71 -0
- package/src/bmm/workflows/testarch/test-review/checklist.md +472 -0
- package/src/bmm/workflows/testarch/test-review/instructions.md +628 -0
- package/src/bmm/workflows/testarch/test-review/test-review-template.md +390 -0
- package/src/bmm/workflows/testarch/test-review/workflow.yaml +48 -0
- package/src/bmm/workflows/testarch/trace/checklist.md +642 -0
- package/src/bmm/workflows/testarch/trace/instructions.md +1030 -0
- package/src/bmm/workflows/testarch/trace/trace-template.md +675 -0
- package/src/bmm/workflows/testarch/trace/workflow.yaml +57 -0
- package/src/core/_module-installer/installer.js +60 -0
- package/src/core/agents/bmad-master.agent.yaml +29 -0
- package/src/core/module-help.csv +9 -0
- package/src/core/module.yaml +25 -0
- package/src/core/resources/excalidraw/README.md +160 -0
- package/src/core/resources/excalidraw/excalidraw-helpers.md +127 -0
- package/src/core/resources/excalidraw/library-loader.md +50 -0
- package/src/core/resources/excalidraw/validate-json-instructions.md +79 -0
- package/src/core/tasks/editorial-review-prose.xml +100 -0
- package/src/core/tasks/editorial-review-structure.xml +209 -0
- package/src/core/tasks/help.md +62 -0
- package/src/core/tasks/index-docs.xml +65 -0
- package/src/core/tasks/review-adversarial-general.xml +48 -0
- package/src/core/tasks/shard-doc.xml +109 -0
- package/src/core/tasks/workflow.xml +235 -0
- package/src/core/workflows/advanced-elicitation/methods.csv +51 -0
- package/src/core/workflows/advanced-elicitation/workflow.xml +117 -0
- package/src/core/workflows/brainstorming/brain-methods.csv +62 -0
- package/src/core/workflows/brainstorming/steps/step-01-session-setup.md +197 -0
- package/src/core/workflows/brainstorming/steps/step-01b-continue.md +122 -0
- package/src/core/workflows/brainstorming/steps/step-02a-user-selected.md +225 -0
- package/src/core/workflows/brainstorming/steps/step-02b-ai-recommended.md +237 -0
- package/src/core/workflows/brainstorming/steps/step-02c-random-selection.md +209 -0
- package/src/core/workflows/brainstorming/steps/step-02d-progressive-flow.md +264 -0
- package/src/core/workflows/brainstorming/steps/step-03-technique-execution.md +399 -0
- package/src/core/workflows/brainstorming/steps/step-04-idea-organization.md +303 -0
- package/src/core/workflows/brainstorming/template.md +15 -0
- package/src/core/workflows/brainstorming/workflow.md +58 -0
- package/src/core/workflows/party-mode/steps/step-01-agent-loading.md +138 -0
- package/src/core/workflows/party-mode/steps/step-02-discussion-orchestration.md +187 -0
- package/src/core/workflows/party-mode/steps/step-03-graceful-exit.md +157 -0
- package/src/core/workflows/party-mode/workflow.md +194 -0
- package/src/utility/agent-components/activation-rules.txt +6 -0
- package/src/utility/agent-components/activation-steps.txt +14 -0
- package/src/utility/agent-components/agent-command-header.md +1 -0
- package/src/utility/agent-components/agent.customize.template.yaml +41 -0
- package/src/utility/agent-components/handler-action.txt +4 -0
- package/src/utility/agent-components/handler-data.txt +5 -0
- package/src/utility/agent-components/handler-exec.txt +6 -0
- package/src/utility/agent-components/handler-multi.txt +14 -0
- package/src/utility/agent-components/handler-tmpl.txt +5 -0
- package/src/utility/agent-components/handler-validate-workflow.txt +7 -0
- package/src/utility/agent-components/handler-workflow.txt +10 -0
- package/src/utility/agent-components/menu-handlers.txt +6 -0
- package/tools/bmad-npx-wrapper.js +69 -0
- package/tools/build-docs.js +577 -0
- package/tools/cli/README.md +7 -0
- package/tools/cli/bmad-cli.js +65 -0
- package/tools/cli/commands/diagnostics.js +303 -0
- package/tools/cli/commands/install.js +87 -0
- package/tools/cli/commands/module.js +210 -0
- package/tools/cli/commands/status.js +65 -0
- package/tools/cli/commands/uninstall.js +86 -0
- package/tools/cli/external-official-modules.yaml +54 -0
- package/tools/cli/installers/install-messages.yaml +59 -0
- package/tools/cli/installers/lib/core/config-collector.js +1079 -0
- package/tools/cli/installers/lib/core/custom-module-cache.js +259 -0
- package/tools/cli/installers/lib/core/dependency-resolver.js +739 -0
- package/tools/cli/installers/lib/core/detector.js +223 -0
- package/tools/cli/installers/lib/core/ide-config-manager.js +156 -0
- package/tools/cli/installers/lib/core/installer.js +2812 -0
- package/tools/cli/installers/lib/core/manifest-generator.js +1054 -0
- package/tools/cli/installers/lib/core/manifest.js +1036 -0
- package/tools/cli/installers/lib/custom/handler.js +363 -0
- package/tools/cli/installers/lib/ide/_base-ide.js +655 -0
- package/tools/cli/installers/lib/ide/_config-driven.js +450 -0
- package/tools/cli/installers/lib/ide/codex.js +440 -0
- package/tools/cli/installers/lib/ide/kilo.js +250 -0
- package/tools/cli/installers/lib/ide/kiro-cli.js +326 -0
- package/tools/cli/installers/lib/ide/manager.js +271 -0
- package/tools/cli/installers/lib/ide/platform-codes.js +100 -0
- package/tools/cli/installers/lib/ide/platform-codes.yaml +227 -0
- package/tools/cli/installers/lib/ide/shared/agent-command-generator.js +181 -0
- package/tools/cli/installers/lib/ide/shared/bmad-artifacts.js +163 -0
- package/tools/cli/installers/lib/ide/shared/module-injections.js +136 -0
- package/tools/cli/installers/lib/ide/shared/path-utils.js +292 -0
- package/tools/cli/installers/lib/ide/shared/task-tool-command-generator.js +270 -0
- package/tools/cli/installers/lib/ide/shared/workflow-command-generator.js +319 -0
- package/tools/cli/installers/lib/ide/templates/agent-command-template.md +14 -0
- package/tools/cli/installers/lib/ide/templates/combined/antigravity.md +8 -0
- package/tools/cli/installers/lib/ide/templates/combined/default-agent.md +15 -0
- package/tools/cli/installers/lib/ide/templates/combined/default-workflow-yaml.md +14 -0
- package/tools/cli/installers/lib/ide/templates/combined/default-workflow.md +6 -0
- package/tools/cli/installers/lib/ide/templates/combined/gemini-agent.toml +14 -0
- package/tools/cli/installers/lib/ide/templates/combined/gemini-workflow-yaml.toml +16 -0
- package/tools/cli/installers/lib/ide/templates/combined/gemini-workflow.toml +14 -0
- package/tools/cli/installers/lib/ide/templates/combined/rovodev.md +9 -0
- package/tools/cli/installers/lib/ide/templates/combined/trae.md +9 -0
- package/tools/cli/installers/lib/ide/templates/combined/windsurf-workflow.md +10 -0
- package/tools/cli/installers/lib/ide/templates/split/opencode/body.md +10 -0
- package/tools/cli/installers/lib/ide/templates/split/opencode/header.md +4 -0
- package/tools/cli/installers/lib/ide/templates/workflow-command-template.md +13 -0
- package/tools/cli/installers/lib/ide/templates/workflow-commander.md +5 -0
- package/tools/cli/installers/lib/message-loader.js +85 -0
- package/tools/cli/installers/lib/modules/external-manager.js +135 -0
- package/tools/cli/installers/lib/modules/manager.js +1375 -0
- package/tools/cli/lib/activation-builder.js +163 -0
- package/tools/cli/lib/agent/compiler.js +522 -0
- package/tools/cli/lib/agent/compiler.ts +572 -0
- package/tools/cli/lib/agent/installer.js +716 -0
- package/tools/cli/lib/agent/template-engine.js +152 -0
- package/tools/cli/lib/agent/types.ts +155 -0
- package/tools/cli/lib/agent-analyzer.js +109 -0
- package/tools/cli/lib/agent-party-generator.js +194 -0
- package/tools/cli/lib/cli-utils.js +227 -0
- package/tools/cli/lib/config.js +213 -0
- package/tools/cli/lib/config.ts +227 -0
- package/tools/cli/lib/file-ops.js +204 -0
- package/tools/cli/lib/file-ops.ts +215 -0
- package/tools/cli/lib/platform-codes.js +116 -0
- package/tools/cli/lib/project-root.js +77 -0
- package/tools/cli/lib/prompts.js +433 -0
- package/tools/cli/lib/prompts.ts +541 -0
- package/tools/cli/lib/types/config.types.ts +43 -0
- package/tools/cli/lib/types/xml-handler.types.ts +50 -0
- package/tools/cli/lib/ui.js +1660 -0
- package/tools/cli/lib/xml-handler.js +177 -0
- package/tools/cli/lib/xml-handler.ts +188 -0
- package/tools/cli/lib/xml-to-markdown.js +82 -0
- package/tools/cli/lib/yaml-format.js +245 -0
- package/tools/cli/lib/yaml-xml-builder.js +587 -0
- package/tools/docs/BUNDLE_DISTRIBUTION_SETUP.md +95 -0
- package/tools/docs/fix-refs.md +91 -0
- package/tools/docs/index.md +2 -0
- package/tools/fix-doc-links.js +288 -0
- package/tools/flattener/aggregate.js +76 -0
- package/tools/flattener/aggregate.ts +78 -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/files.ts +31 -0
- package/tools/flattener/ignoreRules.js +172 -0
- package/tools/flattener/main.js +483 -0
- package/tools/flattener/main.ts +262 -0
- package/tools/flattener/projectRoot.js +201 -0
- package/tools/flattener/prompts.js +44 -0
- package/tools/flattener/stats.helpers.js +368 -0
- package/tools/flattener/stats.js +75 -0
- package/tools/flattener/test-matrix.js +409 -0
- package/tools/flattener/types.ts +53 -0
- package/tools/flattener/xml.js +82 -0
- package/tools/format-workflow-md.js +263 -0
- package/tools/lib/xml-utils.js +13 -0
- package/tools/maintainer/review-pr-README.md +55 -0
- package/tools/maintainer/review-pr.md +242 -0
- package/tools/migrate-custom-module-paths.js +124 -0
- package/tools/platform-codes.yaml +157 -0
- package/tools/schema/agent.js +491 -0
- package/tools/schema/agent.ts +489 -0
- package/tools/schema/agent.types.ts +31 -0
- package/tools/update-bmad.sh +24 -0
- package/tools/validate-agent-schema.js +110 -0
- package/tools/validate-doc-links.js +371 -0
- package/tools/validate-svg-changes.sh +356 -0
- package/vite-plugin-monaco-editor.ts +108 -0
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
const path = require('node:path');
|
|
2
|
+
const { BaseIdeSetup } = require('./_base-ide');
|
|
3
|
+
const chalk = require('chalk');
|
|
4
|
+
const fs = require('fs-extra');
|
|
5
|
+
const yaml = require('yaml');
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Kiro CLI setup handler for BMad Method
|
|
9
|
+
*/
|
|
10
|
+
class KiroCliSetup extends BaseIdeSetup {
|
|
11
|
+
constructor() {
|
|
12
|
+
super('kiro-cli', 'Kiro CLI', false);
|
|
13
|
+
this.configDir = '.kiro';
|
|
14
|
+
this.agentsDir = 'agents';
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Cleanup old BMAD installation before reinstalling
|
|
19
|
+
* @param {string} projectDir - Project directory
|
|
20
|
+
*/
|
|
21
|
+
async cleanup(projectDir) {
|
|
22
|
+
const bmadAgentsDir = path.join(projectDir, this.configDir, this.agentsDir);
|
|
23
|
+
|
|
24
|
+
if (await fs.pathExists(bmadAgentsDir)) {
|
|
25
|
+
// Remove existing BMad agents
|
|
26
|
+
const files = await fs.readdir(bmadAgentsDir);
|
|
27
|
+
for (const file of files) {
|
|
28
|
+
if (file.startsWith('bmad')) {
|
|
29
|
+
await fs.remove(path.join(bmadAgentsDir, file));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
console.log(chalk.dim(` Cleaned old BMAD agents from ${this.name}`));
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Setup Kiro CLI configuration with BMad agents
|
|
38
|
+
* @param {string} projectDir - Project directory
|
|
39
|
+
* @param {string} bmadDir - BMAD installation directory
|
|
40
|
+
* @param {Object} options - Setup options
|
|
41
|
+
*/
|
|
42
|
+
async setup(projectDir, bmadDir, options = {}) {
|
|
43
|
+
console.log(chalk.cyan(`Setting up ${this.name}...`));
|
|
44
|
+
|
|
45
|
+
await this.cleanup(projectDir);
|
|
46
|
+
|
|
47
|
+
const kiroDir = path.join(projectDir, this.configDir);
|
|
48
|
+
const agentsDir = path.join(kiroDir, this.agentsDir);
|
|
49
|
+
|
|
50
|
+
await this.ensureDir(agentsDir);
|
|
51
|
+
|
|
52
|
+
// Create BMad agents from source YAML files
|
|
53
|
+
await this.createBmadAgentsFromSource(agentsDir, projectDir);
|
|
54
|
+
|
|
55
|
+
console.log(chalk.green(`✓ ${this.name} configured with BMad agents`));
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Create BMad agent definitions from source YAML files
|
|
60
|
+
* @param {string} agentsDir - Agents directory
|
|
61
|
+
* @param {string} projectDir - Project directory
|
|
62
|
+
*/
|
|
63
|
+
async createBmadAgentsFromSource(agentsDir, projectDir) {
|
|
64
|
+
const sourceDir = path.join(__dirname, '../../../../../src/modules');
|
|
65
|
+
|
|
66
|
+
// Find all agent YAML files
|
|
67
|
+
const agentFiles = await this.findAgentFiles(sourceDir);
|
|
68
|
+
|
|
69
|
+
for (const agentFile of agentFiles) {
|
|
70
|
+
try {
|
|
71
|
+
await this.processAgentFile(agentFile, agentsDir, projectDir);
|
|
72
|
+
} catch (error) {
|
|
73
|
+
console.warn(chalk.yellow(`⚠️ Failed to process ${agentFile}: ${error.message}`));
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Find all agent YAML files in modules and core
|
|
80
|
+
* @param {string} sourceDir - Source modules directory
|
|
81
|
+
* @returns {Array} Array of agent file paths
|
|
82
|
+
*/
|
|
83
|
+
async findAgentFiles(sourceDir) {
|
|
84
|
+
const agentFiles = [];
|
|
85
|
+
|
|
86
|
+
// Check core agents
|
|
87
|
+
const coreAgentsDir = path.join(__dirname, '../../../../../src/core/agents');
|
|
88
|
+
if (await fs.pathExists(coreAgentsDir)) {
|
|
89
|
+
const files = await fs.readdir(coreAgentsDir);
|
|
90
|
+
|
|
91
|
+
for (const file of files) {
|
|
92
|
+
if (file.endsWith('.agent.yaml')) {
|
|
93
|
+
agentFiles.push(path.join(coreAgentsDir, file));
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Check module agents
|
|
99
|
+
if (!(await fs.pathExists(sourceDir))) {
|
|
100
|
+
return agentFiles;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const modules = await fs.readdir(sourceDir);
|
|
104
|
+
|
|
105
|
+
for (const module of modules) {
|
|
106
|
+
const moduleAgentsDir = path.join(sourceDir, module, 'agents');
|
|
107
|
+
|
|
108
|
+
if (await fs.pathExists(moduleAgentsDir)) {
|
|
109
|
+
const files = await fs.readdir(moduleAgentsDir);
|
|
110
|
+
|
|
111
|
+
for (const file of files) {
|
|
112
|
+
if (file.endsWith('.agent.yaml')) {
|
|
113
|
+
agentFiles.push(path.join(moduleAgentsDir, file));
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
return agentFiles;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Validate BMad Core compliance
|
|
124
|
+
* @param {Object} agentData - Agent YAML data
|
|
125
|
+
* @returns {boolean} True if compliant
|
|
126
|
+
*/
|
|
127
|
+
validateBmadCompliance(agentData) {
|
|
128
|
+
const requiredFields = ['agent.metadata.id', 'agent.persona.role', 'agent.persona.principles'];
|
|
129
|
+
|
|
130
|
+
for (const field of requiredFields) {
|
|
131
|
+
const keys = field.split('.');
|
|
132
|
+
let current = agentData;
|
|
133
|
+
|
|
134
|
+
for (const key of keys) {
|
|
135
|
+
if (!current || !current[key]) {
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
current = current[key];
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
return true;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Process individual agent YAML file
|
|
147
|
+
* @param {string} agentFile - Path to agent YAML file
|
|
148
|
+
* @param {string} agentsDir - Target agents directory
|
|
149
|
+
* @param {string} projectDir - Project directory
|
|
150
|
+
*/
|
|
151
|
+
async processAgentFile(agentFile, agentsDir, projectDir) {
|
|
152
|
+
const yamlContent = await fs.readFile(agentFile, 'utf8');
|
|
153
|
+
const agentData = yaml.parse(yamlContent);
|
|
154
|
+
|
|
155
|
+
if (!this.validateBmadCompliance(agentData)) {
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// Extract module from file path
|
|
160
|
+
const normalizedPath = path.normalize(agentFile);
|
|
161
|
+
const pathParts = normalizedPath.split(path.sep);
|
|
162
|
+
const basename = path.basename(agentFile, '.agent.yaml');
|
|
163
|
+
|
|
164
|
+
// Find the module name from path
|
|
165
|
+
let moduleName = 'unknown';
|
|
166
|
+
if (pathParts.includes('src')) {
|
|
167
|
+
const srcIndex = pathParts.indexOf('src');
|
|
168
|
+
if (srcIndex + 3 < pathParts.length) {
|
|
169
|
+
const folderAfterSrc = pathParts[srcIndex + 1];
|
|
170
|
+
if (folderAfterSrc === 'core') {
|
|
171
|
+
moduleName = 'core';
|
|
172
|
+
} else if (folderAfterSrc === 'bmm') {
|
|
173
|
+
moduleName = 'bmm';
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// Extract the agent name from the ID path in YAML if available
|
|
179
|
+
let agentBaseName = basename;
|
|
180
|
+
if (agentData.agent && agentData.agent.metadata && agentData.agent.metadata.id) {
|
|
181
|
+
const idPath = agentData.agent.metadata.id;
|
|
182
|
+
agentBaseName = path.basename(idPath, '.md');
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
const agentName = `bmad-${moduleName}-${agentBaseName}`;
|
|
186
|
+
const sanitizedAgentName = this.sanitizeAgentName(agentName);
|
|
187
|
+
|
|
188
|
+
// Create JSON definition
|
|
189
|
+
await this.createAgentDefinitionFromYaml(agentsDir, sanitizedAgentName, agentData);
|
|
190
|
+
|
|
191
|
+
// Create prompt file
|
|
192
|
+
await this.createAgentPromptFromYaml(agentsDir, sanitizedAgentName, agentData, projectDir);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Sanitize agent name for file naming
|
|
197
|
+
* @param {string} name - Agent name
|
|
198
|
+
* @returns {string} Sanitized name
|
|
199
|
+
*/
|
|
200
|
+
sanitizeAgentName(name) {
|
|
201
|
+
return name
|
|
202
|
+
.toLowerCase()
|
|
203
|
+
.replaceAll(/\s+/g, '-')
|
|
204
|
+
.replaceAll(/[^a-z0-9-]/g, '');
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Create agent JSON definition from YAML data
|
|
209
|
+
* @param {string} agentsDir - Agents directory
|
|
210
|
+
* @param {string} agentName - Agent name (role-based)
|
|
211
|
+
* @param {Object} agentData - Agent YAML data
|
|
212
|
+
*/
|
|
213
|
+
async createAgentDefinitionFromYaml(agentsDir, agentName, agentData) {
|
|
214
|
+
const personName = agentData.agent.metadata.name;
|
|
215
|
+
const role = agentData.agent.persona.role;
|
|
216
|
+
|
|
217
|
+
const agentConfig = {
|
|
218
|
+
name: agentName,
|
|
219
|
+
description: `${personName} - ${role}`,
|
|
220
|
+
prompt: `file://./${agentName}-prompt.md`,
|
|
221
|
+
tools: ['*'],
|
|
222
|
+
mcpServers: {},
|
|
223
|
+
useLegacyMcpJson: true,
|
|
224
|
+
resources: [],
|
|
225
|
+
};
|
|
226
|
+
|
|
227
|
+
const agentPath = path.join(agentsDir, `${agentName}.json`);
|
|
228
|
+
await fs.writeJson(agentPath, agentConfig, { spaces: 2 });
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* Create agent prompt from YAML data
|
|
233
|
+
* @param {string} agentsDir - Agents directory
|
|
234
|
+
* @param {string} agentName - Agent name (role-based)
|
|
235
|
+
* @param {Object} agentData - Agent YAML data
|
|
236
|
+
* @param {string} projectDir - Project directory
|
|
237
|
+
*/
|
|
238
|
+
async createAgentPromptFromYaml(agentsDir, agentName, agentData, projectDir) {
|
|
239
|
+
const promptPath = path.join(agentsDir, `${agentName}-prompt.md`);
|
|
240
|
+
|
|
241
|
+
// Generate prompt from YAML data
|
|
242
|
+
const prompt = this.generatePromptFromYaml(agentData);
|
|
243
|
+
await fs.writeFile(promptPath, prompt);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Generate prompt content from YAML data
|
|
248
|
+
* @param {Object} agentData - Agent YAML data
|
|
249
|
+
* @returns {string} Generated prompt
|
|
250
|
+
*/
|
|
251
|
+
generatePromptFromYaml(agentData) {
|
|
252
|
+
const agent = agentData.agent;
|
|
253
|
+
const name = agent.metadata.name;
|
|
254
|
+
const icon = agent.metadata.icon || '🤖';
|
|
255
|
+
const role = agent.persona.role;
|
|
256
|
+
const identity = agent.persona.identity;
|
|
257
|
+
const style = agent.persona.communication_style;
|
|
258
|
+
const principles = agent.persona.principles;
|
|
259
|
+
|
|
260
|
+
let prompt = `# ${name} ${icon}\n\n`;
|
|
261
|
+
prompt += `## Role\n${role}\n\n`;
|
|
262
|
+
|
|
263
|
+
if (identity) {
|
|
264
|
+
prompt += `## Identity\n${identity}\n\n`;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
if (style) {
|
|
268
|
+
prompt += `## Communication Style\n${style}\n\n`;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
if (principles) {
|
|
272
|
+
prompt += `## Principles\n`;
|
|
273
|
+
if (typeof principles === 'string') {
|
|
274
|
+
// Handle multi-line string principles
|
|
275
|
+
prompt += principles + '\n\n';
|
|
276
|
+
} else if (Array.isArray(principles)) {
|
|
277
|
+
// Handle array principles
|
|
278
|
+
for (const principle of principles) {
|
|
279
|
+
prompt += `- ${principle}\n`;
|
|
280
|
+
}
|
|
281
|
+
prompt += '\n';
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// Add menu items if available
|
|
286
|
+
if (agent.menu && agent.menu.length > 0) {
|
|
287
|
+
prompt += `## Available Workflows\n`;
|
|
288
|
+
for (let i = 0; i < agent.menu.length; i++) {
|
|
289
|
+
const item = agent.menu[i];
|
|
290
|
+
prompt += `${i + 1}. **${item.trigger}**: ${item.description}\n`;
|
|
291
|
+
}
|
|
292
|
+
prompt += '\n';
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
prompt += `## Instructions\nYou are ${name}, part of the BMad Method. Follow your role and principles while assisting users with their development needs.\n`;
|
|
296
|
+
|
|
297
|
+
return prompt;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* Check if Kiro CLI is available
|
|
302
|
+
* @returns {Promise<boolean>} True if available
|
|
303
|
+
*/
|
|
304
|
+
async isAvailable() {
|
|
305
|
+
try {
|
|
306
|
+
const { execSync } = require('node:child_process');
|
|
307
|
+
execSync('kiro-cli --version', { stdio: 'ignore' });
|
|
308
|
+
return true;
|
|
309
|
+
} catch {
|
|
310
|
+
return false;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
/**
|
|
315
|
+
* Get installation instructions
|
|
316
|
+
* @returns {string} Installation instructions
|
|
317
|
+
*/
|
|
318
|
+
getInstallInstructions() {
|
|
319
|
+
return `Install Kiro CLI:
|
|
320
|
+
curl -fsSL https://github.com/aws/kiro-cli/releases/latest/download/install.sh | bash
|
|
321
|
+
|
|
322
|
+
Or visit: https://github.com/aws/kiro-cli`;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
module.exports = { KiroCliSetup };
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
const fs = require('fs-extra');
|
|
2
|
+
const path = require('node:path');
|
|
3
|
+
const chalk = require('chalk');
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* IDE Manager - handles IDE-specific setup
|
|
7
|
+
* Dynamically discovers and loads IDE handlers
|
|
8
|
+
*
|
|
9
|
+
* Loading strategy:
|
|
10
|
+
* 1. Custom installer files (codex.js, kilo.js, kiro-cli.js) - for platforms with unique installation logic
|
|
11
|
+
* 2. Config-driven handlers (from platform-codes.yaml) - for standard IDE installation patterns
|
|
12
|
+
*/
|
|
13
|
+
class IdeManager {
|
|
14
|
+
constructor() {
|
|
15
|
+
this.handlers = new Map();
|
|
16
|
+
this._initialized = false;
|
|
17
|
+
this.bmadFolderName = 'bmad'; // Default, can be overridden
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Set the bmad folder name for all IDE handlers
|
|
22
|
+
* @param {string} bmadFolderName - The bmad folder name
|
|
23
|
+
*/
|
|
24
|
+
setBmadFolderName(bmadFolderName) {
|
|
25
|
+
this.bmadFolderName = bmadFolderName;
|
|
26
|
+
// Update all loaded handlers
|
|
27
|
+
for (const handler of this.handlers.values()) {
|
|
28
|
+
if (typeof handler.setBmadFolderName === 'function') {
|
|
29
|
+
handler.setBmadFolderName(bmadFolderName);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Ensure handlers are loaded (lazy loading)
|
|
36
|
+
*/
|
|
37
|
+
async ensureInitialized() {
|
|
38
|
+
if (!this._initialized) {
|
|
39
|
+
await this.loadHandlers();
|
|
40
|
+
this._initialized = true;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Dynamically load all IDE handlers
|
|
46
|
+
* 1. Load custom installer files first (codex.js, kilo.js, kiro-cli.js)
|
|
47
|
+
* 2. Load config-driven handlers from platform-codes.yaml
|
|
48
|
+
*/
|
|
49
|
+
async loadHandlers() {
|
|
50
|
+
// Load custom installer files
|
|
51
|
+
this.loadCustomInstallerFiles();
|
|
52
|
+
|
|
53
|
+
// Load config-driven handlers from platform-codes.yaml
|
|
54
|
+
await this.loadConfigDrivenHandlers();
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Load custom installer files (unique installation logic)
|
|
59
|
+
* These files have special installation patterns that don't fit the config-driven model
|
|
60
|
+
*/
|
|
61
|
+
loadCustomInstallerFiles() {
|
|
62
|
+
const ideDir = __dirname;
|
|
63
|
+
const customFiles = ['codex.js', 'kilo.js', 'kiro-cli.js'];
|
|
64
|
+
|
|
65
|
+
for (const file of customFiles) {
|
|
66
|
+
const filePath = path.join(ideDir, file);
|
|
67
|
+
if (!fs.existsSync(filePath)) continue;
|
|
68
|
+
|
|
69
|
+
try {
|
|
70
|
+
const HandlerModule = require(filePath);
|
|
71
|
+
const HandlerClass = HandlerModule.default || Object.values(HandlerModule)[0];
|
|
72
|
+
|
|
73
|
+
if (HandlerClass) {
|
|
74
|
+
const instance = new HandlerClass();
|
|
75
|
+
if (instance.name && typeof instance.name === 'string') {
|
|
76
|
+
this.handlers.set(instance.name, instance);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
} catch (error) {
|
|
80
|
+
console.log(chalk.yellow(` Warning: Could not load ${file}: ${error.message}`));
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Load config-driven handlers from platform-codes.yaml
|
|
87
|
+
* This creates ConfigDrivenIdeSetup instances for platforms with installer config
|
|
88
|
+
*/
|
|
89
|
+
async loadConfigDrivenHandlers() {
|
|
90
|
+
const { loadPlatformCodes } = require('./platform-codes');
|
|
91
|
+
const platformConfig = await loadPlatformCodes();
|
|
92
|
+
|
|
93
|
+
const { ConfigDrivenIdeSetup } = require('./_config-driven');
|
|
94
|
+
|
|
95
|
+
for (const [platformCode, platformInfo] of Object.entries(platformConfig.platforms)) {
|
|
96
|
+
// Skip if already loaded by custom installer
|
|
97
|
+
if (this.handlers.has(platformCode)) continue;
|
|
98
|
+
|
|
99
|
+
// Skip if no installer config (platform may not need installation)
|
|
100
|
+
if (!platformInfo.installer) continue;
|
|
101
|
+
|
|
102
|
+
const handler = new ConfigDrivenIdeSetup(platformCode, platformInfo);
|
|
103
|
+
handler.setBmadFolderName(this.bmadFolderName);
|
|
104
|
+
this.handlers.set(platformCode, handler);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Get all available IDEs with their metadata
|
|
110
|
+
* @returns {Array} Array of IDE information objects
|
|
111
|
+
*/
|
|
112
|
+
getAvailableIdes() {
|
|
113
|
+
const ides = [];
|
|
114
|
+
|
|
115
|
+
for (const [key, handler] of this.handlers) {
|
|
116
|
+
// Skip handlers without valid names
|
|
117
|
+
const name = handler.displayName || handler.name || key;
|
|
118
|
+
|
|
119
|
+
// Filter out invalid entries (undefined name, empty key, etc.)
|
|
120
|
+
if (!key || !name || typeof key !== 'string' || typeof name !== 'string') {
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
ides.push({
|
|
125
|
+
value: key,
|
|
126
|
+
name: name,
|
|
127
|
+
preferred: handler.preferred || false,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Sort: preferred first, then alphabetical
|
|
132
|
+
ides.sort((a, b) => {
|
|
133
|
+
if (a.preferred && !b.preferred) return -1;
|
|
134
|
+
if (!a.preferred && b.preferred) return 1;
|
|
135
|
+
return a.name.localeCompare(b.name);
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
return ides;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Get preferred IDEs
|
|
143
|
+
* @returns {Array} Array of preferred IDE information
|
|
144
|
+
*/
|
|
145
|
+
getPreferredIdes() {
|
|
146
|
+
return this.getAvailableIdes().filter((ide) => ide.preferred);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Get non-preferred IDEs
|
|
151
|
+
* @returns {Array} Array of non-preferred IDE information
|
|
152
|
+
*/
|
|
153
|
+
getOtherIdes() {
|
|
154
|
+
return this.getAvailableIdes().filter((ide) => !ide.preferred);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Setup IDE configuration
|
|
159
|
+
* @param {string} ideName - Name of the IDE
|
|
160
|
+
* @param {string} projectDir - Project directory
|
|
161
|
+
* @param {string} bmadDir - BMAD installation directory
|
|
162
|
+
* @param {Object} options - Setup options
|
|
163
|
+
*/
|
|
164
|
+
async setup(ideName, projectDir, bmadDir, options = {}) {
|
|
165
|
+
const handler = this.handlers.get(ideName.toLowerCase());
|
|
166
|
+
|
|
167
|
+
if (!handler) {
|
|
168
|
+
console.warn(chalk.yellow(`⚠️ IDE '${ideName}' is not yet supported`));
|
|
169
|
+
console.log(chalk.dim('Supported IDEs:', [...this.handlers.keys()].join(', ')));
|
|
170
|
+
return { success: false, reason: 'unsupported' };
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
try {
|
|
174
|
+
await handler.setup(projectDir, bmadDir, options);
|
|
175
|
+
return { success: true, ide: ideName };
|
|
176
|
+
} catch (error) {
|
|
177
|
+
console.error(chalk.red(`Failed to setup ${ideName}:`), error.message);
|
|
178
|
+
return { success: false, error: error.message };
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Cleanup IDE configurations
|
|
184
|
+
* @param {string} projectDir - Project directory
|
|
185
|
+
*/
|
|
186
|
+
async cleanup(projectDir) {
|
|
187
|
+
const results = [];
|
|
188
|
+
|
|
189
|
+
for (const [name, handler] of this.handlers) {
|
|
190
|
+
try {
|
|
191
|
+
await handler.cleanup(projectDir);
|
|
192
|
+
results.push({ ide: name, success: true });
|
|
193
|
+
} catch (error) {
|
|
194
|
+
results.push({ ide: name, success: false, error: error.message });
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
return results;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Get list of supported IDEs
|
|
203
|
+
* @returns {Array} List of supported IDE names
|
|
204
|
+
*/
|
|
205
|
+
getSupportedIdes() {
|
|
206
|
+
return [...this.handlers.keys()];
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Check if an IDE is supported
|
|
211
|
+
* @param {string} ideName - Name of the IDE
|
|
212
|
+
* @returns {boolean} True if IDE is supported
|
|
213
|
+
*/
|
|
214
|
+
isSupported(ideName) {
|
|
215
|
+
return this.handlers.has(ideName.toLowerCase());
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Detect installed IDEs
|
|
220
|
+
* @param {string} projectDir - Project directory
|
|
221
|
+
* @returns {Array} List of detected IDEs
|
|
222
|
+
*/
|
|
223
|
+
async detectInstalledIdes(projectDir) {
|
|
224
|
+
const detected = [];
|
|
225
|
+
|
|
226
|
+
for (const [name, handler] of this.handlers) {
|
|
227
|
+
if (typeof handler.detect === 'function' && (await handler.detect(projectDir))) {
|
|
228
|
+
detected.push(name);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
return detected;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* Install custom agent launchers for specified IDEs
|
|
237
|
+
* @param {Array} ides - List of IDE names to install for
|
|
238
|
+
* @param {string} projectDir - Project directory
|
|
239
|
+
* @param {string} agentName - Agent name (e.g., "fred-commit-poet")
|
|
240
|
+
* @param {string} agentPath - Path to compiled agent (relative to project root)
|
|
241
|
+
* @param {Object} metadata - Agent metadata
|
|
242
|
+
* @returns {Object} Results for each IDE
|
|
243
|
+
*/
|
|
244
|
+
async installCustomAgentLaunchers(ides, projectDir, agentName, agentPath, metadata) {
|
|
245
|
+
const results = {};
|
|
246
|
+
|
|
247
|
+
for (const ideName of ides) {
|
|
248
|
+
const handler = this.handlers.get(ideName.toLowerCase());
|
|
249
|
+
|
|
250
|
+
if (!handler) {
|
|
251
|
+
console.warn(chalk.yellow(`⚠️ IDE '${ideName}' is not yet supported for custom agent installation`));
|
|
252
|
+
continue;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
try {
|
|
256
|
+
if (typeof handler.installCustomAgentLauncher === 'function') {
|
|
257
|
+
const result = await handler.installCustomAgentLauncher(projectDir, agentName, agentPath, metadata);
|
|
258
|
+
if (result) {
|
|
259
|
+
results[ideName] = result;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
} catch (error) {
|
|
263
|
+
console.warn(chalk.yellow(`⚠️ Failed to install ${ideName} launcher: ${error.message}`));
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
return results;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
module.exports = { IdeManager };
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
const fs = require('fs-extra');
|
|
2
|
+
const path = require('node:path');
|
|
3
|
+
const yaml = require('yaml');
|
|
4
|
+
|
|
5
|
+
const PLATFORM_CODES_PATH = path.join(__dirname, 'platform-codes.yaml');
|
|
6
|
+
|
|
7
|
+
let _cachedPlatformCodes = null;
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Load the platform codes configuration from YAML
|
|
11
|
+
* @returns {Object} Platform codes configuration
|
|
12
|
+
*/
|
|
13
|
+
async function loadPlatformCodes() {
|
|
14
|
+
if (_cachedPlatformCodes) {
|
|
15
|
+
return _cachedPlatformCodes;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
if (!(await fs.pathExists(PLATFORM_CODES_PATH))) {
|
|
19
|
+
throw new Error(`Platform codes configuration not found at: ${PLATFORM_CODES_PATH}`);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const content = await fs.readFile(PLATFORM_CODES_PATH, 'utf8');
|
|
23
|
+
_cachedPlatformCodes = yaml.parse(content);
|
|
24
|
+
return _cachedPlatformCodes;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Get platform information by code
|
|
29
|
+
* @param {string} platformCode - Platform code (e.g., 'claude-code', 'cursor')
|
|
30
|
+
* @returns {Object|null} Platform info or null if not found
|
|
31
|
+
*/
|
|
32
|
+
function getPlatformInfo(platformCode) {
|
|
33
|
+
if (!_cachedPlatformCodes) {
|
|
34
|
+
throw new Error('Platform codes not loaded. Call loadPlatformCodes() first.');
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return _cachedPlatformCodes.platforms[platformCode] || null;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Get all preferred platforms
|
|
42
|
+
* @returns {Promise<Array>} Array of preferred platform codes
|
|
43
|
+
*/
|
|
44
|
+
async function getPreferredPlatforms() {
|
|
45
|
+
const config = await loadPlatformCodes();
|
|
46
|
+
return Object.entries(config.platforms)
|
|
47
|
+
.filter(([_, info]) => info.preferred)
|
|
48
|
+
.map(([code, _]) => code);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Get all platform codes by category
|
|
53
|
+
* @param {string} category - Category to filter by (ide, cli, tool, etc.)
|
|
54
|
+
* @returns {Promise<Array>} Array of platform codes in the category
|
|
55
|
+
*/
|
|
56
|
+
async function getPlatformsByCategory(category) {
|
|
57
|
+
const config = await loadPlatformCodes();
|
|
58
|
+
return Object.entries(config.platforms)
|
|
59
|
+
.filter(([_, info]) => info.category === category)
|
|
60
|
+
.map(([code, _]) => code);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Get all platforms with installer config
|
|
65
|
+
* @returns {Promise<Array>} Array of platform codes that have installer config
|
|
66
|
+
*/
|
|
67
|
+
async function getConfigDrivenPlatforms() {
|
|
68
|
+
const config = await loadPlatformCodes();
|
|
69
|
+
return Object.entries(config.platforms)
|
|
70
|
+
.filter(([_, info]) => info.installer)
|
|
71
|
+
.map(([code, _]) => code);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Get platforms that use custom installers (no installer config)
|
|
76
|
+
* @returns {Promise<Array>} Array of platform codes with custom installers
|
|
77
|
+
*/
|
|
78
|
+
async function getCustomInstallerPlatforms() {
|
|
79
|
+
const config = await loadPlatformCodes();
|
|
80
|
+
return Object.entries(config.platforms)
|
|
81
|
+
.filter(([_, info]) => !info.installer)
|
|
82
|
+
.map(([code, _]) => code);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Clear the cached platform codes (useful for testing)
|
|
87
|
+
*/
|
|
88
|
+
function clearCache() {
|
|
89
|
+
_cachedPlatformCodes = null;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
module.exports = {
|
|
93
|
+
loadPlatformCodes,
|
|
94
|
+
getPlatformInfo,
|
|
95
|
+
getPreferredPlatforms,
|
|
96
|
+
getPlatformsByCategory,
|
|
97
|
+
getConfigDrivenPlatforms,
|
|
98
|
+
getCustomInstallerPlatforms,
|
|
99
|
+
clearCache,
|
|
100
|
+
};
|