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,440 @@
|
|
|
1
|
+
const path = require('node:path');
|
|
2
|
+
const fs = require('fs-extra');
|
|
3
|
+
const os = require('node:os');
|
|
4
|
+
const chalk = require('chalk');
|
|
5
|
+
const { BaseIdeSetup } = require('./_base-ide');
|
|
6
|
+
const { WorkflowCommandGenerator } = require('./shared/workflow-command-generator');
|
|
7
|
+
const { AgentCommandGenerator } = require('./shared/agent-command-generator');
|
|
8
|
+
const { TaskToolCommandGenerator } = require('./shared/task-tool-command-generator');
|
|
9
|
+
const { getTasksFromBmad } = require('./shared/bmad-artifacts');
|
|
10
|
+
const { toDashPath, customAgentDashName } = require('./shared/path-utils');
|
|
11
|
+
const prompts = require('../../../lib/prompts');
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Codex setup handler (CLI mode)
|
|
15
|
+
*/
|
|
16
|
+
class CodexSetup extends BaseIdeSetup {
|
|
17
|
+
constructor() {
|
|
18
|
+
super('codex', 'Codex', true); // preferred IDE
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Collect configuration choices before installation
|
|
23
|
+
* @param {Object} options - Configuration options
|
|
24
|
+
* @returns {Object} Collected configuration
|
|
25
|
+
*/
|
|
26
|
+
async collectConfiguration(options = {}) {
|
|
27
|
+
let confirmed = false;
|
|
28
|
+
let installLocation = 'global';
|
|
29
|
+
|
|
30
|
+
while (!confirmed) {
|
|
31
|
+
installLocation = await prompts.select({
|
|
32
|
+
message: 'Where would you like to install Codex CLI prompts?',
|
|
33
|
+
choices: [
|
|
34
|
+
{
|
|
35
|
+
name: 'Global - Simple for single project ' + '(~/.codex/prompts, but references THIS project only)',
|
|
36
|
+
value: 'global',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: `Project-specific - Recommended for real work (requires CODEX_HOME=<project-dir>${path.sep}.codex)`,
|
|
40
|
+
value: 'project',
|
|
41
|
+
},
|
|
42
|
+
],
|
|
43
|
+
default: 'global',
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
// Display detailed instructions for the chosen option
|
|
47
|
+
console.log('');
|
|
48
|
+
if (installLocation === 'project') {
|
|
49
|
+
console.log(this.getProjectSpecificInstructions());
|
|
50
|
+
} else {
|
|
51
|
+
console.log(this.getGlobalInstructions());
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Confirm the choice
|
|
55
|
+
confirmed = await prompts.confirm({
|
|
56
|
+
message: 'Proceed with this installation option?',
|
|
57
|
+
default: true,
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
if (!confirmed) {
|
|
61
|
+
console.log(chalk.yellow("\n Let's choose a different installation option.\n"));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return { installLocation };
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Setup Codex configuration
|
|
70
|
+
* @param {string} projectDir - Project directory
|
|
71
|
+
* @param {string} bmadDir - BMAD installation directory
|
|
72
|
+
* @param {Object} options - Setup options
|
|
73
|
+
*/
|
|
74
|
+
async setup(projectDir, bmadDir, options = {}) {
|
|
75
|
+
console.log(chalk.cyan(`Setting up ${this.name}...`));
|
|
76
|
+
|
|
77
|
+
// Always use CLI mode
|
|
78
|
+
const mode = 'cli';
|
|
79
|
+
|
|
80
|
+
// Get installation location from pre-collected config or default to global
|
|
81
|
+
const installLocation = options.preCollectedConfig?.installLocation || 'global';
|
|
82
|
+
|
|
83
|
+
const { artifacts, counts } = await this.collectClaudeArtifacts(projectDir, bmadDir, options);
|
|
84
|
+
|
|
85
|
+
const destDir = this.getCodexPromptDir(projectDir, installLocation);
|
|
86
|
+
await fs.ensureDir(destDir);
|
|
87
|
+
await this.clearOldBmadFiles(destDir);
|
|
88
|
+
|
|
89
|
+
// Collect artifacts and write using underscore format
|
|
90
|
+
const agentGen = new AgentCommandGenerator(this.bmadFolderName);
|
|
91
|
+
const { artifacts: agentArtifacts } = await agentGen.collectAgentArtifacts(bmadDir, options.selectedModules || []);
|
|
92
|
+
const agentCount = await agentGen.writeDashArtifacts(destDir, agentArtifacts);
|
|
93
|
+
|
|
94
|
+
const tasks = await getTasksFromBmad(bmadDir, options.selectedModules || []);
|
|
95
|
+
const taskArtifacts = [];
|
|
96
|
+
for (const task of tasks) {
|
|
97
|
+
const content = await this.readAndProcessWithProject(
|
|
98
|
+
task.path,
|
|
99
|
+
{
|
|
100
|
+
module: task.module,
|
|
101
|
+
name: task.name,
|
|
102
|
+
},
|
|
103
|
+
projectDir,
|
|
104
|
+
);
|
|
105
|
+
taskArtifacts.push({
|
|
106
|
+
type: 'task',
|
|
107
|
+
module: task.module,
|
|
108
|
+
sourcePath: task.path,
|
|
109
|
+
relativePath: path.join(task.module, 'tasks', `${task.name}.md`),
|
|
110
|
+
content,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const workflowGenerator = new WorkflowCommandGenerator(this.bmadFolderName);
|
|
115
|
+
const { artifacts: workflowArtifacts } = await workflowGenerator.collectWorkflowArtifacts(bmadDir);
|
|
116
|
+
const workflowCount = await workflowGenerator.writeDashArtifacts(destDir, workflowArtifacts);
|
|
117
|
+
|
|
118
|
+
// Also write tasks using underscore format
|
|
119
|
+
const ttGen = new TaskToolCommandGenerator();
|
|
120
|
+
const tasksWritten = await ttGen.writeDashArtifacts(destDir, taskArtifacts);
|
|
121
|
+
|
|
122
|
+
const written = agentCount + workflowCount + tasksWritten;
|
|
123
|
+
|
|
124
|
+
console.log(chalk.green(`✓ ${this.name} configured:`));
|
|
125
|
+
console.log(chalk.dim(` - Mode: CLI`));
|
|
126
|
+
console.log(chalk.dim(` - ${counts.agents} agents exported`));
|
|
127
|
+
console.log(chalk.dim(` - ${counts.tasks} tasks exported`));
|
|
128
|
+
console.log(chalk.dim(` - ${counts.workflows} workflow commands exported`));
|
|
129
|
+
if (counts.workflowLaunchers > 0) {
|
|
130
|
+
console.log(chalk.dim(` - ${counts.workflowLaunchers} workflow launchers exported`));
|
|
131
|
+
}
|
|
132
|
+
console.log(chalk.dim(` - ${written} Codex prompt files written`));
|
|
133
|
+
console.log(chalk.dim(` - Destination: ${destDir}`));
|
|
134
|
+
|
|
135
|
+
return {
|
|
136
|
+
success: true,
|
|
137
|
+
mode,
|
|
138
|
+
artifacts,
|
|
139
|
+
counts,
|
|
140
|
+
destination: destDir,
|
|
141
|
+
written,
|
|
142
|
+
installLocation,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Detect Codex installation by checking for BMAD prompt exports
|
|
148
|
+
*/
|
|
149
|
+
async detect(projectDir) {
|
|
150
|
+
// Check both global and project-specific locations
|
|
151
|
+
const globalDir = this.getCodexPromptDir(null, 'global');
|
|
152
|
+
const projectDir_local = projectDir || process.cwd();
|
|
153
|
+
const projectSpecificDir = this.getCodexPromptDir(projectDir_local, 'project');
|
|
154
|
+
|
|
155
|
+
// Check global location
|
|
156
|
+
if (await fs.pathExists(globalDir)) {
|
|
157
|
+
try {
|
|
158
|
+
const entries = await fs.readdir(globalDir);
|
|
159
|
+
if (entries && entries.some((entry) => entry && typeof entry === 'string' && entry.startsWith('bmad'))) {
|
|
160
|
+
return true;
|
|
161
|
+
}
|
|
162
|
+
} catch {
|
|
163
|
+
// Ignore errors
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// Check project-specific location
|
|
168
|
+
if (await fs.pathExists(projectSpecificDir)) {
|
|
169
|
+
try {
|
|
170
|
+
const entries = await fs.readdir(projectSpecificDir);
|
|
171
|
+
if (entries && entries.some((entry) => entry && typeof entry === 'string' && entry.startsWith('bmad'))) {
|
|
172
|
+
return true;
|
|
173
|
+
}
|
|
174
|
+
} catch {
|
|
175
|
+
// Ignore errors
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Collect Claude-style artifacts for Codex export.
|
|
184
|
+
* Returns the normalized artifact list for further processing.
|
|
185
|
+
*/
|
|
186
|
+
async collectClaudeArtifacts(projectDir, bmadDir, options = {}) {
|
|
187
|
+
const selectedModules = options.selectedModules || [];
|
|
188
|
+
const artifacts = [];
|
|
189
|
+
|
|
190
|
+
// Generate agent launchers
|
|
191
|
+
const agentGen = new AgentCommandGenerator(this.bmadFolderName);
|
|
192
|
+
const { artifacts: agentArtifacts } = await agentGen.collectAgentArtifacts(bmadDir, selectedModules);
|
|
193
|
+
|
|
194
|
+
for (const artifact of agentArtifacts) {
|
|
195
|
+
artifacts.push({
|
|
196
|
+
type: 'agent',
|
|
197
|
+
module: artifact.module,
|
|
198
|
+
sourcePath: artifact.sourcePath,
|
|
199
|
+
relativePath: artifact.relativePath,
|
|
200
|
+
content: artifact.content,
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
const tasks = await getTasksFromBmad(bmadDir, selectedModules);
|
|
205
|
+
for (const task of tasks) {
|
|
206
|
+
const content = await this.readAndProcessWithProject(
|
|
207
|
+
task.path,
|
|
208
|
+
{
|
|
209
|
+
module: task.module,
|
|
210
|
+
name: task.name,
|
|
211
|
+
},
|
|
212
|
+
projectDir,
|
|
213
|
+
);
|
|
214
|
+
|
|
215
|
+
artifacts.push({
|
|
216
|
+
type: 'task',
|
|
217
|
+
module: task.module,
|
|
218
|
+
sourcePath: task.path,
|
|
219
|
+
relativePath: path.join(task.module, 'tasks', `${task.name}.md`),
|
|
220
|
+
content,
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
const workflowGenerator = new WorkflowCommandGenerator(this.bmadFolderName);
|
|
225
|
+
const { artifacts: workflowArtifacts, counts: workflowCounts } = await workflowGenerator.collectWorkflowArtifacts(bmadDir);
|
|
226
|
+
artifacts.push(...workflowArtifacts);
|
|
227
|
+
|
|
228
|
+
return {
|
|
229
|
+
artifacts,
|
|
230
|
+
counts: {
|
|
231
|
+
agents: agentArtifacts.length,
|
|
232
|
+
tasks: tasks.length,
|
|
233
|
+
workflows: workflowCounts.commands,
|
|
234
|
+
workflowLaunchers: workflowCounts.launchers,
|
|
235
|
+
},
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
getCodexPromptDir(projectDir = null, location = 'global') {
|
|
240
|
+
if (location === 'project' && projectDir) {
|
|
241
|
+
return path.join(projectDir, '.codex', 'prompts');
|
|
242
|
+
}
|
|
243
|
+
return path.join(os.homedir(), '.codex', 'prompts');
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
async flattenAndWriteArtifacts(artifacts, destDir) {
|
|
247
|
+
let written = 0;
|
|
248
|
+
|
|
249
|
+
for (const artifact of artifacts) {
|
|
250
|
+
const flattenedName = this.flattenFilename(artifact.relativePath);
|
|
251
|
+
const targetPath = path.join(destDir, flattenedName);
|
|
252
|
+
await fs.writeFile(targetPath, artifact.content);
|
|
253
|
+
written++;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
return written;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
async clearOldBmadFiles(destDir) {
|
|
260
|
+
if (!(await fs.pathExists(destDir))) {
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
let entries;
|
|
265
|
+
try {
|
|
266
|
+
entries = await fs.readdir(destDir);
|
|
267
|
+
} catch (error) {
|
|
268
|
+
// Directory exists but can't be read - skip cleanup
|
|
269
|
+
console.warn(chalk.yellow(`Warning: Could not read directory ${destDir}: ${error.message}`));
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
if (!entries || !Array.isArray(entries)) {
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
for (const entry of entries) {
|
|
278
|
+
// Skip non-strings or undefined entries
|
|
279
|
+
if (!entry || typeof entry !== 'string') {
|
|
280
|
+
continue;
|
|
281
|
+
}
|
|
282
|
+
if (!entry.startsWith('bmad')) {
|
|
283
|
+
continue;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
const entryPath = path.join(destDir, entry);
|
|
287
|
+
try {
|
|
288
|
+
const stat = await fs.stat(entryPath);
|
|
289
|
+
if (stat.isFile()) {
|
|
290
|
+
await fs.remove(entryPath);
|
|
291
|
+
} else if (stat.isDirectory()) {
|
|
292
|
+
await fs.remove(entryPath);
|
|
293
|
+
}
|
|
294
|
+
} catch (error) {
|
|
295
|
+
// Skip files that can't be processed
|
|
296
|
+
console.warn(chalk.dim(` Skipping ${entry}: ${error.message}`));
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
async readAndProcessWithProject(filePath, metadata, projectDir) {
|
|
302
|
+
const content = await fs.readFile(filePath, 'utf8');
|
|
303
|
+
return super.processContent(content, metadata, projectDir);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
/**
|
|
307
|
+
* Get instructions for global installation
|
|
308
|
+
* @returns {string} Instructions text
|
|
309
|
+
*/
|
|
310
|
+
getGlobalInstructions(destDir) {
|
|
311
|
+
const lines = [
|
|
312
|
+
'',
|
|
313
|
+
chalk.bold.cyan('═'.repeat(70)),
|
|
314
|
+
chalk.bold.yellow(' IMPORTANT: Codex Configuration'),
|
|
315
|
+
chalk.bold.cyan('═'.repeat(70)),
|
|
316
|
+
'',
|
|
317
|
+
chalk.white(' /prompts installed globally to your HOME DIRECTORY.'),
|
|
318
|
+
'',
|
|
319
|
+
chalk.yellow(' ⚠️ These prompts reference a specific _bmad path'),
|
|
320
|
+
chalk.dim(" To use with other projects, you'd need to copy the _bmad dir"),
|
|
321
|
+
'',
|
|
322
|
+
chalk.green(' ✓ You can now use /commands in Codex CLI'),
|
|
323
|
+
chalk.dim(' Example: /bmad_bmm_pm'),
|
|
324
|
+
chalk.dim(' Type / to see all available commands'),
|
|
325
|
+
'',
|
|
326
|
+
chalk.bold.cyan('═'.repeat(70)),
|
|
327
|
+
'',
|
|
328
|
+
];
|
|
329
|
+
return lines.join('\n');
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
/**
|
|
333
|
+
* Get instructions for project-specific installation
|
|
334
|
+
* @param {string} projectDir - Optional project directory
|
|
335
|
+
* @param {string} destDir - Optional destination directory
|
|
336
|
+
* @returns {string} Instructions text
|
|
337
|
+
*/
|
|
338
|
+
getProjectSpecificInstructions(projectDir = null, destDir = null) {
|
|
339
|
+
const isWindows = os.platform() === 'win32';
|
|
340
|
+
|
|
341
|
+
const commonLines = [
|
|
342
|
+
'',
|
|
343
|
+
chalk.bold.cyan('═'.repeat(70)),
|
|
344
|
+
chalk.bold.yellow(' Project-Specific Codex Configuration'),
|
|
345
|
+
chalk.bold.cyan('═'.repeat(70)),
|
|
346
|
+
'',
|
|
347
|
+
chalk.white(' Prompts will be installed to: ') + chalk.cyan(destDir || '<project>/.codex/prompts'),
|
|
348
|
+
'',
|
|
349
|
+
chalk.bold.yellow(' ⚠️ REQUIRED: You must set CODEX_HOME to use these prompts'),
|
|
350
|
+
'',
|
|
351
|
+
];
|
|
352
|
+
|
|
353
|
+
const windowsLines = [
|
|
354
|
+
chalk.bold(' Create a codex.cmd file in your project root:'),
|
|
355
|
+
'',
|
|
356
|
+
chalk.green(' @echo off'),
|
|
357
|
+
chalk.green(' set CODEX_HOME=%~dp0.codex'),
|
|
358
|
+
chalk.green(' codex %*'),
|
|
359
|
+
'',
|
|
360
|
+
chalk.dim(String.raw` Then run: .\codex instead of codex`),
|
|
361
|
+
chalk.dim(' (The %~dp0 gets the directory of the .cmd file)'),
|
|
362
|
+
];
|
|
363
|
+
|
|
364
|
+
const unixLines = [
|
|
365
|
+
chalk.bold(' Add this alias to your ~/.bashrc or ~/.zshrc:'),
|
|
366
|
+
'',
|
|
367
|
+
chalk.green(' alias codex=\'CODEX_HOME="$PWD/.codex" codex\''),
|
|
368
|
+
'',
|
|
369
|
+
chalk.dim(' After adding, run: source ~/.bashrc (or source ~/.zshrc)'),
|
|
370
|
+
chalk.dim(' (The $PWD uses your current working directory)'),
|
|
371
|
+
];
|
|
372
|
+
const closingLines = [
|
|
373
|
+
'',
|
|
374
|
+
chalk.dim(' This tells Codex CLI to use prompts from this project instead of ~/.codex'),
|
|
375
|
+
'',
|
|
376
|
+
chalk.bold.cyan('═'.repeat(70)),
|
|
377
|
+
'',
|
|
378
|
+
];
|
|
379
|
+
|
|
380
|
+
const lines = [...commonLines, ...(isWindows ? windowsLines : unixLines), ...closingLines];
|
|
381
|
+
|
|
382
|
+
return lines.join('\n');
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
/**
|
|
386
|
+
* Cleanup Codex configuration
|
|
387
|
+
*/
|
|
388
|
+
async cleanup(projectDir = null) {
|
|
389
|
+
// Clean both global and project-specific locations
|
|
390
|
+
const globalDir = this.getCodexPromptDir(null, 'global');
|
|
391
|
+
await this.clearOldBmadFiles(globalDir);
|
|
392
|
+
|
|
393
|
+
if (projectDir) {
|
|
394
|
+
const projectSpecificDir = this.getCodexPromptDir(projectDir, 'project');
|
|
395
|
+
await this.clearOldBmadFiles(projectSpecificDir);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
/**
|
|
400
|
+
* Install a custom agent launcher for Codex
|
|
401
|
+
* @param {string} projectDir - Project directory (not used, Codex installs to home)
|
|
402
|
+
* @param {string} agentName - Agent name (e.g., "fred-commit-poet")
|
|
403
|
+
* @param {string} agentPath - Path to compiled agent (relative to project root)
|
|
404
|
+
* @param {Object} metadata - Agent metadata
|
|
405
|
+
* @returns {Object|null} Info about created command
|
|
406
|
+
*/
|
|
407
|
+
async installCustomAgentLauncher(projectDir, agentName, agentPath, metadata) {
|
|
408
|
+
const destDir = this.getCodexPromptDir(projectDir, 'project');
|
|
409
|
+
await fs.ensureDir(destDir);
|
|
410
|
+
|
|
411
|
+
const launcherContent = `---
|
|
412
|
+
name: '${agentName}'
|
|
413
|
+
description: '${agentName} agent'
|
|
414
|
+
---
|
|
415
|
+
|
|
416
|
+
You must fully embody this agent's persona and follow all activation instructions exactly as specified. NEVER break character until given an exit command.
|
|
417
|
+
|
|
418
|
+
<agent-activation CRITICAL="TRUE">
|
|
419
|
+
1. LOAD the FULL agent file from @${agentPath}
|
|
420
|
+
2. READ its entire contents - this contains the complete agent persona, menu, and instructions
|
|
421
|
+
3. FOLLOW every step in the <activation> section precisely
|
|
422
|
+
4. DISPLAY the welcome/greeting as instructed
|
|
423
|
+
5. PRESENT the numbered menu
|
|
424
|
+
6. WAIT for user input before proceeding
|
|
425
|
+
</agent-activation>
|
|
426
|
+
`;
|
|
427
|
+
|
|
428
|
+
// Use underscore format: bmad_custom_fred-commit-poet.md
|
|
429
|
+
const fileName = customAgentDashName(agentName);
|
|
430
|
+
const launcherPath = path.join(destDir, fileName);
|
|
431
|
+
await fs.writeFile(launcherPath, launcherContent, 'utf8');
|
|
432
|
+
|
|
433
|
+
return {
|
|
434
|
+
path: path.relative(projectDir, launcherPath),
|
|
435
|
+
command: `/${fileName.replace('.md', '')}`,
|
|
436
|
+
};
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
module.exports = { CodexSetup };
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
const path = require('node:path');
|
|
2
|
+
const { BaseIdeSetup } = require('./_base-ide');
|
|
3
|
+
const chalk = require('chalk');
|
|
4
|
+
const { AgentCommandGenerator } = require('./shared/agent-command-generator');
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* KiloCode IDE setup handler
|
|
8
|
+
* Creates custom modes in .kilocodemodes file (similar to Roo)
|
|
9
|
+
*/
|
|
10
|
+
class KiloSetup extends BaseIdeSetup {
|
|
11
|
+
constructor() {
|
|
12
|
+
super('kilo', 'Kilo Code');
|
|
13
|
+
this.configFile = '.kilocodemodes';
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Setup KiloCode IDE configuration
|
|
18
|
+
* @param {string} projectDir - Project directory
|
|
19
|
+
* @param {string} bmadDir - BMAD installation directory
|
|
20
|
+
* @param {Object} options - Setup options
|
|
21
|
+
*/
|
|
22
|
+
async setup(projectDir, bmadDir, options = {}) {
|
|
23
|
+
console.log(chalk.cyan(`Setting up ${this.name}...`));
|
|
24
|
+
|
|
25
|
+
// Check for existing .kilocodemodes file
|
|
26
|
+
const kiloModesPath = path.join(projectDir, this.configFile);
|
|
27
|
+
let existingModes = [];
|
|
28
|
+
let existingContent = '';
|
|
29
|
+
|
|
30
|
+
if (await this.pathExists(kiloModesPath)) {
|
|
31
|
+
existingContent = await this.readFile(kiloModesPath);
|
|
32
|
+
// Parse existing modes
|
|
33
|
+
const modeMatches = existingContent.matchAll(/- slug: ([\w-]+)/g);
|
|
34
|
+
for (const match of modeMatches) {
|
|
35
|
+
existingModes.push(match[1]);
|
|
36
|
+
}
|
|
37
|
+
console.log(chalk.yellow(`Found existing .kilocodemodes file with ${existingModes.length} modes`));
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Generate agent launchers
|
|
41
|
+
const agentGen = new AgentCommandGenerator(this.bmadFolderName);
|
|
42
|
+
const { artifacts: agentArtifacts } = await agentGen.collectAgentArtifacts(bmadDir, options.selectedModules || []);
|
|
43
|
+
|
|
44
|
+
// Create modes content
|
|
45
|
+
let newModesContent = '';
|
|
46
|
+
let addedCount = 0;
|
|
47
|
+
let skippedCount = 0;
|
|
48
|
+
|
|
49
|
+
for (const artifact of agentArtifacts) {
|
|
50
|
+
const slug = `bmad-${artifact.module}-${artifact.name}`;
|
|
51
|
+
|
|
52
|
+
// Skip if already exists
|
|
53
|
+
if (existingModes.includes(slug)) {
|
|
54
|
+
console.log(chalk.dim(` Skipping ${slug} - already exists`));
|
|
55
|
+
skippedCount++;
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const modeEntry = await this.createModeEntry(artifact, projectDir);
|
|
60
|
+
|
|
61
|
+
newModesContent += modeEntry;
|
|
62
|
+
addedCount++;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Build final content
|
|
66
|
+
let finalContent = '';
|
|
67
|
+
if (existingContent) {
|
|
68
|
+
finalContent = existingContent.trim() + '\n' + newModesContent;
|
|
69
|
+
} else {
|
|
70
|
+
finalContent = 'customModes:\n' + newModesContent;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Write .kilocodemodes file
|
|
74
|
+
await this.writeFile(kiloModesPath, finalContent);
|
|
75
|
+
|
|
76
|
+
console.log(chalk.green(`✓ ${this.name} configured:`));
|
|
77
|
+
console.log(chalk.dim(` - ${addedCount} modes added`));
|
|
78
|
+
if (skippedCount > 0) {
|
|
79
|
+
console.log(chalk.dim(` - ${skippedCount} modes skipped (already exist)`));
|
|
80
|
+
}
|
|
81
|
+
console.log(chalk.dim(` - Configuration file: ${this.configFile}`));
|
|
82
|
+
console.log(chalk.dim('\n Modes will be available when you open this project in KiloCode'));
|
|
83
|
+
|
|
84
|
+
return {
|
|
85
|
+
success: true,
|
|
86
|
+
modes: addedCount,
|
|
87
|
+
skipped: skippedCount,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Create a mode entry for an agent
|
|
93
|
+
*/
|
|
94
|
+
async createModeEntry(artifact, projectDir) {
|
|
95
|
+
// Extract metadata from launcher content
|
|
96
|
+
const titleMatch = artifact.content.match(/title="([^"]+)"/);
|
|
97
|
+
const title = titleMatch ? titleMatch[1] : this.formatTitle(artifact.name);
|
|
98
|
+
|
|
99
|
+
const iconMatch = artifact.content.match(/icon="([^"]+)"/);
|
|
100
|
+
const icon = iconMatch ? iconMatch[1] : '🤖';
|
|
101
|
+
|
|
102
|
+
const whenToUseMatch = artifact.content.match(/whenToUse="([^"]+)"/);
|
|
103
|
+
const whenToUse = whenToUseMatch ? whenToUseMatch[1] : `Use for ${title} tasks`;
|
|
104
|
+
|
|
105
|
+
// Get the activation header from central template
|
|
106
|
+
const activationHeader = await this.getAgentCommandHeader();
|
|
107
|
+
|
|
108
|
+
const roleDefinitionMatch = artifact.content.match(/roleDefinition="([^"]+)"/);
|
|
109
|
+
const roleDefinition = roleDefinitionMatch
|
|
110
|
+
? roleDefinitionMatch[1]
|
|
111
|
+
: `You are a ${title} specializing in ${title.toLowerCase()} tasks.`;
|
|
112
|
+
|
|
113
|
+
// Get relative path
|
|
114
|
+
const relativePath = path.relative(projectDir, artifact.sourcePath).replaceAll('\\', '/');
|
|
115
|
+
|
|
116
|
+
// Build mode entry (KiloCode uses same schema as Roo)
|
|
117
|
+
const slug = `bmad-${artifact.module}-${artifact.name}`;
|
|
118
|
+
let modeEntry = ` - slug: ${slug}\n`;
|
|
119
|
+
modeEntry += ` name: '${icon} ${title}'\n`;
|
|
120
|
+
modeEntry += ` roleDefinition: ${roleDefinition}\n`;
|
|
121
|
+
modeEntry += ` whenToUse: ${whenToUse}\n`;
|
|
122
|
+
modeEntry += ` customInstructions: |\n`;
|
|
123
|
+
modeEntry += ` ${activationHeader} Read the full YAML from ${relativePath} start activation to alter your state of being follow startup section instructions stay in this being until told to exit this mode\n`;
|
|
124
|
+
modeEntry += ` groups:\n`;
|
|
125
|
+
modeEntry += ` - read\n`;
|
|
126
|
+
modeEntry += ` - edit\n`;
|
|
127
|
+
modeEntry += ` - browser\n`;
|
|
128
|
+
modeEntry += ` - command\n`;
|
|
129
|
+
modeEntry += ` - mcp\n`;
|
|
130
|
+
|
|
131
|
+
return modeEntry;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Format name as title
|
|
136
|
+
*/
|
|
137
|
+
formatTitle(name) {
|
|
138
|
+
return name
|
|
139
|
+
.split('-')
|
|
140
|
+
.map((word) => word.charAt(0).toUpperCase() + word.slice(1))
|
|
141
|
+
.join(' ');
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Cleanup KiloCode configuration
|
|
146
|
+
*/
|
|
147
|
+
async cleanup(projectDir) {
|
|
148
|
+
const fs = require('fs-extra');
|
|
149
|
+
const kiloModesPath = path.join(projectDir, this.configFile);
|
|
150
|
+
|
|
151
|
+
if (await fs.pathExists(kiloModesPath)) {
|
|
152
|
+
const content = await fs.readFile(kiloModesPath, 'utf8');
|
|
153
|
+
|
|
154
|
+
// Remove BMAD modes only
|
|
155
|
+
const lines = content.split('\n');
|
|
156
|
+
const filteredLines = [];
|
|
157
|
+
let skipMode = false;
|
|
158
|
+
let removedCount = 0;
|
|
159
|
+
|
|
160
|
+
for (const line of lines) {
|
|
161
|
+
if (/^\s*- slug: bmad-/.test(line)) {
|
|
162
|
+
skipMode = true;
|
|
163
|
+
removedCount++;
|
|
164
|
+
} else if (skipMode && /^\s*- slug: /.test(line)) {
|
|
165
|
+
skipMode = false;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
if (!skipMode) {
|
|
169
|
+
filteredLines.push(line);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
await fs.writeFile(kiloModesPath, filteredLines.join('\n'));
|
|
174
|
+
console.log(chalk.dim(`Removed ${removedCount} BMAD modes from .kilocodemodes`));
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Install a custom agent launcher for Kilo
|
|
180
|
+
* @param {string} projectDir - Project directory
|
|
181
|
+
* @param {string} agentName - Agent name (e.g., "fred-commit-poet")
|
|
182
|
+
* @param {string} agentPath - Path to compiled agent (relative to project root)
|
|
183
|
+
* @param {Object} metadata - Agent metadata
|
|
184
|
+
* @returns {Object} Installation result
|
|
185
|
+
*/
|
|
186
|
+
async installCustomAgentLauncher(projectDir, agentName, agentPath, metadata) {
|
|
187
|
+
const kilocodemodesPath = path.join(projectDir, this.configFile);
|
|
188
|
+
let existingContent = '';
|
|
189
|
+
|
|
190
|
+
// Read existing .kilocodemodes file
|
|
191
|
+
if (await this.pathExists(kilocodemodesPath)) {
|
|
192
|
+
existingContent = await this.readFile(kilocodemodesPath);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// Create custom agent mode entry
|
|
196
|
+
const slug = `bmad-custom-${agentName.toLowerCase()}`;
|
|
197
|
+
const modeEntry = ` - slug: ${slug}
|
|
198
|
+
name: 'BMAD Custom: ${agentName}'
|
|
199
|
+
description: |
|
|
200
|
+
Custom BMAD agent: ${agentName}
|
|
201
|
+
|
|
202
|
+
**⚠️ IMPORTANT**: Run @${agentPath} first to load the complete agent!
|
|
203
|
+
|
|
204
|
+
This is a launcher for the custom BMAD agent "${agentName}". The agent will follow the persona and instructions from the main agent file.
|
|
205
|
+
prompt: |
|
|
206
|
+
@${agentPath}
|
|
207
|
+
always: false
|
|
208
|
+
permissions: all
|
|
209
|
+
`;
|
|
210
|
+
|
|
211
|
+
// Check if mode already exists
|
|
212
|
+
if (existingContent.includes(slug)) {
|
|
213
|
+
return {
|
|
214
|
+
ide: 'kilo',
|
|
215
|
+
path: this.configFile,
|
|
216
|
+
command: agentName,
|
|
217
|
+
type: 'custom-agent-launcher',
|
|
218
|
+
alreadyExists: true,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// Build final content
|
|
223
|
+
let finalContent = '';
|
|
224
|
+
if (existingContent) {
|
|
225
|
+
// Find customModes section or add it
|
|
226
|
+
if (existingContent.includes('customModes:')) {
|
|
227
|
+
// Append to existing customModes
|
|
228
|
+
finalContent = existingContent + modeEntry;
|
|
229
|
+
} else {
|
|
230
|
+
// Add customModes section
|
|
231
|
+
finalContent = existingContent.trim() + '\n\ncustomModes:\n' + modeEntry;
|
|
232
|
+
}
|
|
233
|
+
} else {
|
|
234
|
+
// Create new .kilocodemodes file with customModes
|
|
235
|
+
finalContent = 'customModes:\n' + modeEntry;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// Write .kilocodemodes file
|
|
239
|
+
await this.writeFile(kilocodemodesPath, finalContent);
|
|
240
|
+
|
|
241
|
+
return {
|
|
242
|
+
ide: 'kilo',
|
|
243
|
+
path: this.configFile,
|
|
244
|
+
command: slug,
|
|
245
|
+
type: 'custom-agent-launcher',
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
module.exports = { KiloSetup };
|