observer-ggboy-bmad-method 6.0.0-alpha.23
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/.coderabbit.yaml +40 -0
- package/.github/CODE_OF_CONDUCT.md +128 -0
- package/.github/FUNDING.yaml +15 -0
- package/.github/ISSUE_TEMPLATE/config.yaml +8 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +22 -0
- package/.github/ISSUE_TEMPLATE/issue.md +32 -0
- package/.github/scripts/discord-helpers.sh +34 -0
- package/.github/workflows/bundle-latest.yaml +330 -0
- package/.github/workflows/discord.yaml +90 -0
- package/.github/workflows/docs.yaml +63 -0
- package/.github/workflows/manual-release.yaml +190 -0
- package/.github/workflows/quality.yaml +115 -0
- package/.health-status.json +7 -0
- package/.husky/pre-commit +20 -0
- package/.markdownlint-cli2.yaml +41 -0
- package/.nvmrc +1 -0
- package/.prettierignore +9 -0
- package/.vscode/settings.json +97 -0
- package/CHANGELOG.md +1394 -0
- package/CNAME +1 -0
- package/CONTRIBUTING.md +167 -0
- package/CONTRIBUTORS.md +32 -0
- package/LICENSE +30 -0
- package/README.md +100 -0
- package/SECURITY.md +85 -0
- package/TRADEMARK.md +55 -0
- package/Wordmark.png +0 -0
- package/banner-bmad-method.png +0 -0
- package/bmad-method-6.0.0-alpha.23.tgz +0 -0
- package/docs/404.md +9 -0
- package/docs/_README_WORKFLOW_DIAGRAMS.md +40 -0
- package/docs/_STYLE_GUIDE.md +367 -0
- package/docs/_archive/customize-workflows.md +30 -0
- package/docs/_archive/getting-started-bmadv4.md +247 -0
- package/docs/_archive/vendor-workflows.md +52 -0
- package/docs/downloads.md +72 -0
- package/docs/explanation/agents/barry-quick-flow.md +328 -0
- package/docs/explanation/agents/index.md +19 -0
- package/docs/explanation/architecture/four-phases.md +107 -0
- package/docs/explanation/architecture/preventing-agent-conflicts.md +111 -0
- package/docs/explanation/architecture/why-solutioning-matters.md +75 -0
- package/docs/explanation/bmm/index.md +131 -0
- package/docs/explanation/core/index.md +18 -0
- package/docs/explanation/core-concepts/agent-roles.md +179 -0
- package/docs/explanation/core-concepts/index.md +35 -0
- package/docs/explanation/core-concepts/what-are-agents.md +97 -0
- package/docs/explanation/core-concepts/what-are-modules.md +85 -0
- package/docs/explanation/core-concepts/what-are-workflows.md +204 -0
- package/docs/explanation/faq/brownfield-faq.md +73 -0
- package/docs/explanation/faq/getting-started-faq.md +67 -0
- package/docs/explanation/faq/implementation-faq.md +52 -0
- package/docs/explanation/faq/index.md +16 -0
- package/docs/explanation/faq/levels-and-tracks-faq.md +52 -0
- package/docs/explanation/faq/planning-faq.md +41 -0
- package/docs/explanation/faq/tools-faq.md +277 -0
- package/docs/explanation/faq/workflows-faq.md +61 -0
- package/docs/explanation/features/advanced-elicitation.md +95 -0
- package/docs/explanation/features/brainstorming-techniques.md +92 -0
- package/docs/explanation/features/party-mode.md +95 -0
- package/docs/explanation/features/quick-flow.md +149 -0
- package/docs/explanation/features/tea-overview.md +410 -0
- package/docs/explanation/features/web-bundles.md +34 -0
- package/docs/explanation/philosophy/facilitation-over-generation.md +333 -0
- package/docs/explanation/philosophy/testing-as-engineering.md +112 -0
- package/docs/explanation/tea/engagement-models.md +710 -0
- package/docs/explanation/tea/fixture-architecture.md +457 -0
- package/docs/explanation/tea/knowledge-base-system.md +554 -0
- package/docs/explanation/tea/network-first-patterns.md +853 -0
- package/docs/explanation/tea/risk-based-testing.md +586 -0
- package/docs/explanation/tea/test-quality-standards.md +907 -0
- package/docs/how-to/brownfield/add-feature-to-existing.md +74 -0
- package/docs/how-to/brownfield/document-existing-project.md +66 -0
- package/docs/how-to/brownfield/index.md +84 -0
- package/docs/how-to/brownfield/quick-fix-in-brownfield.md +77 -0
- package/docs/how-to/brownfield/use-tea-for-enterprise.md +525 -0
- package/docs/how-to/brownfield/use-tea-with-existing-tests.md +577 -0
- package/docs/how-to/customization/customize-agents.md +212 -0
- package/docs/how-to/customization/enable-tea-mcp-enhancements.md +424 -0
- package/docs/how-to/customization/index.md +23 -0
- package/docs/how-to/customization/integrate-playwright-utils.md +813 -0
- package/docs/how-to/customization/shard-large-documents.md +101 -0
- package/docs/how-to/get-answers-about-bmad.md +102 -0
- package/docs/how-to/installation/index.md +12 -0
- package/docs/how-to/installation/install-bmad.md +111 -0
- package/docs/how-to/installation/install-custom-modules.md +118 -0
- package/docs/how-to/installation/upgrade-to-v6.md +131 -0
- package/docs/how-to/workflows/bmgd-quick-flow.md +156 -0
- package/docs/how-to/workflows/conduct-research.md +97 -0
- package/docs/how-to/workflows/create-architecture.md +119 -0
- package/docs/how-to/workflows/create-epics-and-stories.md +109 -0
- package/docs/how-to/workflows/create-prd.md +91 -0
- package/docs/how-to/workflows/create-product-brief.md +94 -0
- package/docs/how-to/workflows/create-story.md +102 -0
- package/docs/how-to/workflows/create-ux-design.md +100 -0
- package/docs/how-to/workflows/implement-story.md +97 -0
- package/docs/how-to/workflows/quick-spec.md +122 -0
- package/docs/how-to/workflows/run-atdd.md +436 -0
- package/docs/how-to/workflows/run-automate.md +653 -0
- package/docs/how-to/workflows/run-brainstorming-session.md +73 -0
- package/docs/how-to/workflows/run-code-review.md +89 -0
- package/docs/how-to/workflows/run-implementation-readiness.md +125 -0
- package/docs/how-to/workflows/run-nfr-assess.md +679 -0
- package/docs/how-to/workflows/run-sprint-planning.md +94 -0
- package/docs/how-to/workflows/run-test-design.md +135 -0
- package/docs/how-to/workflows/run-test-review.md +605 -0
- package/docs/how-to/workflows/run-trace.md +883 -0
- package/docs/how-to/workflows/setup-ci.md +712 -0
- package/docs/how-to/workflows/setup-party-mode.md +89 -0
- package/docs/how-to/workflows/setup-test-framework.md +98 -0
- package/docs/index.md +63 -0
- package/docs/reference/agents/index.md +109 -0
- package/docs/reference/configuration/core-tasks.md +67 -0
- package/docs/reference/configuration/global-config.md +28 -0
- package/docs/reference/glossary/index.md +159 -0
- package/docs/reference/tea/commands.md +276 -0
- package/docs/reference/tea/configuration.md +678 -0
- package/docs/reference/tea/knowledge-base.md +340 -0
- package/docs/reference/workflows/core-workflows.md +32 -0
- package/docs/reference/workflows/document-project.md +73 -0
- package/docs/reference/workflows/index.md +12 -0
- package/docs/tutorials/getting-started/getting-started-bmadv6.md +246 -0
- package/docs/tutorials/getting-started/images/workflow-method-greenfield.excalidraw +5034 -0
- package/docs/tutorials/getting-started/images/workflow-method-greenfield.svg +4 -0
- package/docs/tutorials/getting-started/images/workflow-overview.jpg +0 -0
- package/docs/tutorials/getting-started/tea-lite-quickstart.md +444 -0
- package/docs/tutorials/getting-started/workflow-overview.jpg +0 -0
- package/eslint.config.mjs +152 -0
- package/package.json +117 -0
- package/prettier.config.mjs +32 -0
- package/src/bmm/_module-installer/installer.js +48 -0
- package/src/bmm/_module-installer/platform-specifics/claude-code.js +35 -0
- package/src/bmm/_module-installer/platform-specifics/windsurf.js +32 -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/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/data/project-context-template.md +26 -0
- package/src/bmm/module-help.csv +32 -0
- package/src/bmm/module.yaml +44 -0
- package/src/bmm/sub-modules/claude-code/config.yaml +4 -0
- package/src/bmm/sub-modules/claude-code/injections.yaml +242 -0
- package/src/bmm/sub-modules/claude-code/readme.md +87 -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-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/2-plan-workflows/prd/data/domain-complexity.csv +13 -0
- package/src/bmm/workflows/2-plan-workflows/prd/data/prd-purpose.md +197 -0
- package/src/bmm/workflows/2-plan-workflows/prd/data/project-types.csv +11 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-01-init.md +191 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-01b-continue.md +153 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-02-discovery.md +224 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-03-success.md +226 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-04-journeys.md +213 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-05-domain.md +207 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-06-innovation.md +226 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-07-project-type.md +237 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-08-scoping.md +228 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-09-functional.md +231 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-10-nonfunctional.md +242 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-11-polish.md +217 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-12-complete.md +124 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-e/step-e-01-discovery.md +247 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-e/step-e-01b-legacy-conversion.md +208 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-e/step-e-02-review.md +249 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-e/step-e-03-edit.md +253 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-e/step-e-04-complete.md +168 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-01-discovery.md +218 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-02-format-detection.md +191 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-02b-parity-check.md +209 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-03-density-validation.md +174 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-04-brief-coverage-validation.md +214 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-05-measurability-validation.md +228 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-06-traceability-validation.md +217 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-07-implementation-leakage-validation.md +205 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-08-domain-compliance-validation.md +243 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-09-project-type-validation.md +263 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-10-smart-validation.md +209 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-11-holistic-quality-validation.md +264 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-12-completeness-validation.md +242 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-13-report-complete.md +231 -0
- package/src/bmm/workflows/2-plan-workflows/prd/templates/prd-template.md +10 -0
- package/src/bmm/workflows/2-plan-workflows/prd/validation-report-prd-workflow.md +433 -0
- package/src/bmm/workflows/2-plan-workflows/prd/workflow.md +150 -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 +27 -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/quick-dev/data/project-levels.yaml +59 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-01-mode-detection.md +156 -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 +113 -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 +140 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/workflow.md +50 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-01-understand.md +189 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-02-investigate.md +144 -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 +191 -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 +79 -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/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/test/README.md +295 -0
- package/test/adversarial-review-tests/README.md +56 -0
- package/test/adversarial-review-tests/sample-content.md +46 -0
- package/test/adversarial-review-tests/test-cases.yaml +103 -0
- package/test/fixtures/agent-schema/invalid/critical-actions/actions-as-string.agent.yaml +27 -0
- package/test/fixtures/agent-schema/invalid/critical-actions/empty-string-in-actions.agent.yaml +30 -0
- package/test/fixtures/agent-schema/invalid/menu/empty-menu.agent.yaml +22 -0
- package/test/fixtures/agent-schema/invalid/menu/missing-menu.agent.yaml +20 -0
- package/test/fixtures/agent-schema/invalid/menu-commands/empty-command-target.agent.yaml +25 -0
- package/test/fixtures/agent-schema/invalid/menu-commands/no-command-target.agent.yaml +24 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/camel-case.agent.yaml +25 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/compound-invalid-format.agent.yaml +25 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/compound-mismatched-kebab.agent.yaml +25 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/duplicate-triggers.agent.yaml +31 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/empty-trigger.agent.yaml +25 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/leading-asterisk.agent.yaml +25 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/snake-case.agent.yaml +25 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/trigger-with-spaces.agent.yaml +25 -0
- package/test/fixtures/agent-schema/invalid/metadata/empty-module-string.agent.yaml +26 -0
- package/test/fixtures/agent-schema/invalid/metadata/empty-name.agent.yaml +24 -0
- package/test/fixtures/agent-schema/invalid/metadata/extra-metadata-fields.agent.yaml +27 -0
- package/test/fixtures/agent-schema/invalid/metadata/missing-id.agent.yaml +23 -0
- package/test/fixtures/agent-schema/invalid/persona/empty-principles-array.agent.yaml +24 -0
- package/test/fixtures/agent-schema/invalid/persona/empty-string-in-principles.agent.yaml +27 -0
- package/test/fixtures/agent-schema/invalid/persona/extra-persona-fields.agent.yaml +27 -0
- package/test/fixtures/agent-schema/invalid/persona/missing-role.agent.yaml +24 -0
- package/test/fixtures/agent-schema/invalid/prompts/empty-content.agent.yaml +29 -0
- package/test/fixtures/agent-schema/invalid/prompts/extra-prompt-fields.agent.yaml +31 -0
- package/test/fixtures/agent-schema/invalid/prompts/missing-content.agent.yaml +28 -0
- package/test/fixtures/agent-schema/invalid/prompts/missing-id.agent.yaml +28 -0
- package/test/fixtures/agent-schema/invalid/top-level/empty-file.agent.yaml +5 -0
- package/test/fixtures/agent-schema/invalid/top-level/extra-top-level-keys.agent.yaml +28 -0
- package/test/fixtures/agent-schema/invalid/top-level/missing-agent-key.agent.yaml +11 -0
- package/test/fixtures/agent-schema/invalid/yaml-errors/invalid-indentation.agent.yaml +19 -0
- package/test/fixtures/agent-schema/invalid/yaml-errors/malformed-yaml.agent.yaml +18 -0
- package/test/fixtures/agent-schema/valid/critical-actions/empty-critical-actions.agent.yaml +24 -0
- package/test/fixtures/agent-schema/valid/critical-actions/no-critical-actions.agent.yaml +22 -0
- package/test/fixtures/agent-schema/valid/critical-actions/valid-critical-actions.agent.yaml +27 -0
- package/test/fixtures/agent-schema/valid/menu/multiple-menu-items.agent.yaml +31 -0
- package/test/fixtures/agent-schema/valid/menu/single-menu-item.agent.yaml +22 -0
- package/test/fixtures/agent-schema/valid/menu-commands/all-command-types.agent.yaml +38 -0
- package/test/fixtures/agent-schema/valid/menu-commands/multiple-commands.agent.yaml +24 -0
- package/test/fixtures/agent-schema/valid/menu-triggers/compound-triggers.agent.yaml +31 -0
- package/test/fixtures/agent-schema/valid/menu-triggers/kebab-case-triggers.agent.yaml +34 -0
- package/test/fixtures/agent-schema/valid/metadata/core-agent-with-module.agent.yaml +24 -0
- package/test/fixtures/agent-schema/valid/metadata/empty-module-name-in-path.agent.yaml +24 -0
- package/test/fixtures/agent-schema/valid/metadata/malformed-path-treated-as-core.agent.yaml +24 -0
- package/test/fixtures/agent-schema/valid/metadata/module-agent-correct.agent.yaml +24 -0
- package/test/fixtures/agent-schema/valid/metadata/module-agent-missing-module.agent.yaml +23 -0
- package/test/fixtures/agent-schema/valid/metadata/wrong-module-value.agent.yaml +24 -0
- package/test/fixtures/agent-schema/valid/persona/complete-persona.agent.yaml +24 -0
- package/test/fixtures/agent-schema/valid/prompts/empty-prompts.agent.yaml +24 -0
- package/test/fixtures/agent-schema/valid/prompts/no-prompts.agent.yaml +22 -0
- package/test/fixtures/agent-schema/valid/prompts/valid-prompts-minimal.agent.yaml +28 -0
- package/test/fixtures/agent-schema/valid/prompts/valid-prompts-with-description.agent.yaml +30 -0
- package/test/fixtures/agent-schema/valid/top-level/minimal-core-agent.agent.yaml +24 -0
- package/test/test-agent-schema.js +387 -0
- package/test/test-cli-integration.sh +159 -0
- package/test/test-installation-components.js +214 -0
- package/test/unit-test-schema.js +133 -0
- package/tools/bmad-npx-wrapper.js +38 -0
- package/tools/build-docs.js +577 -0
- package/tools/cli/README.md +7 -0
- package/tools/cli/bmad-cli.js +58 -0
- package/tools/cli/commands/install.js +87 -0
- package/tools/cli/commands/status.js +65 -0
- package/tools/cli/external-official-modules.yaml +56 -0
- package/tools/cli/installers/install-messages.yaml +58 -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 +2826 -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/STANDARDIZATION_PLAN.md +208 -0
- package/tools/cli/installers/lib/ide/_base-ide.js +655 -0
- package/tools/cli/installers/lib/ide/antigravity.js +474 -0
- package/tools/cli/installers/lib/ide/auggie.js +244 -0
- package/tools/cli/installers/lib/ide/claude-code.js +506 -0
- package/tools/cli/installers/lib/ide/cline.js +272 -0
- package/tools/cli/installers/lib/ide/codex.js +412 -0
- package/tools/cli/installers/lib/ide/crush.js +149 -0
- package/tools/cli/installers/lib/ide/cursor.js +160 -0
- package/tools/cli/installers/lib/ide/gemini.js +301 -0
- package/tools/cli/installers/lib/ide/github-copilot.js +383 -0
- package/tools/cli/installers/lib/ide/iflow.js +191 -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 +244 -0
- package/tools/cli/installers/lib/ide/opencode.js +257 -0
- package/tools/cli/installers/lib/ide/qwen.js +372 -0
- package/tools/cli/installers/lib/ide/roo.js +273 -0
- package/tools/cli/installers/lib/ide/rovo-dev.js +290 -0
- package/tools/cli/installers/lib/ide/shared/agent-command-generator.js +165 -0
- package/tools/cli/installers/lib/ide/shared/bmad-artifacts.js +158 -0
- package/tools/cli/installers/lib/ide/shared/module-injections.js +136 -0
- package/tools/cli/installers/lib/ide/shared/path-utils.js +165 -0
- package/tools/cli/installers/lib/ide/shared/task-tool-command-generator.js +268 -0
- package/tools/cli/installers/lib/ide/shared/workflow-command-generator.js +293 -0
- package/tools/cli/installers/lib/ide/templates/agent-command-template.md +14 -0
- package/tools/cli/installers/lib/ide/templates/gemini-agent-command.toml +14 -0
- package/tools/cli/installers/lib/ide/templates/gemini-task-command.toml +12 -0
- package/tools/cli/installers/lib/ide/templates/workflow-command-template.md +13 -0
- package/tools/cli/installers/lib/ide/templates/workflow-commander.md +5 -0
- package/tools/cli/installers/lib/ide/trae.js +313 -0
- package/tools/cli/installers/lib/ide/windsurf.js +258 -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/installer.js +716 -0
- package/tools/cli/lib/agent/template-engine.js +152 -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/file-ops.js +204 -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/ui.js +1716 -0
- package/tools/cli/lib/xml-handler.js +177 -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/index.md +2 -0
- package/tools/fix-doc-links.js +288 -0
- package/tools/flattener/aggregate.js +76 -0
- package/tools/flattener/binary.js +80 -0
- package/tools/flattener/discovery.js +71 -0
- package/tools/flattener/files.js +35 -0
- package/tools/flattener/ignoreRules.js +172 -0
- package/tools/flattener/main.js +483 -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/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/validate-agent-schema.js +110 -0
- package/tools/validate-doc-links.js +363 -0
- package/tools/validate-svg-changes.sh +356 -0
- package/website/README.md +76 -0
- package/website/astro.config.mjs +228 -0
- package/website/public/favicon.ico +0 -0
- package/website/public/img/bmad-dark.png +0 -0
- package/website/public/img/bmad-light.png +0 -0
- package/website/public/img/logo.svg +4 -0
- package/website/public/robots.txt +37 -0
- package/website/src/components/Banner.astro +59 -0
- package/website/src/components/Header.astro +121 -0
- package/website/src/components/MobileMenuFooter.astro +53 -0
- package/website/src/content/config.ts +6 -0
- package/website/src/lib/site-url.js +25 -0
- package/website/src/rehype-markdown-links.js +102 -0
- package/website/src/styles/custom.css +485 -0
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
const path = require('node:path');
|
|
2
|
+
const fs = require('fs-extra');
|
|
3
|
+
const chalk = require('chalk');
|
|
4
|
+
const { BaseIdeSetup } = require('./_base-ide');
|
|
5
|
+
const { WorkflowCommandGenerator } = require('./shared/workflow-command-generator');
|
|
6
|
+
const { AgentCommandGenerator } = require('./shared/agent-command-generator');
|
|
7
|
+
const { TaskToolCommandGenerator } = require('./shared/task-tool-command-generator');
|
|
8
|
+
const { getAgentsFromBmad, getTasksFromBmad } = require('./shared/bmad-artifacts');
|
|
9
|
+
const { toDashPath, customAgentDashName } = require('./shared/path-utils');
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Cline IDE setup handler
|
|
13
|
+
* Installs BMAD artifacts to .clinerules/workflows with flattened naming
|
|
14
|
+
*/
|
|
15
|
+
class ClineSetup extends BaseIdeSetup {
|
|
16
|
+
constructor() {
|
|
17
|
+
super('cline', 'Cline', false);
|
|
18
|
+
this.configDir = '.clinerules';
|
|
19
|
+
this.workflowsDir = 'workflows';
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Setup Cline IDE configuration
|
|
24
|
+
* @param {string} projectDir - Project directory
|
|
25
|
+
* @param {string} bmadDir - BMAD installation directory
|
|
26
|
+
* @param {Object} options - Setup options
|
|
27
|
+
*/
|
|
28
|
+
async setup(projectDir, bmadDir, options = {}) {
|
|
29
|
+
console.log(chalk.cyan(`Setting up ${this.name}...`));
|
|
30
|
+
|
|
31
|
+
// Create .clinerules/workflows directory
|
|
32
|
+
const clineDir = path.join(projectDir, this.configDir);
|
|
33
|
+
const workflowsDir = path.join(clineDir, this.workflowsDir);
|
|
34
|
+
|
|
35
|
+
await this.ensureDir(workflowsDir);
|
|
36
|
+
|
|
37
|
+
// Clear old BMAD files
|
|
38
|
+
await this.clearOldBmadFiles(workflowsDir);
|
|
39
|
+
|
|
40
|
+
// Collect all artifacts
|
|
41
|
+
const { artifacts, counts } = await this.collectClineArtifacts(projectDir, bmadDir, options);
|
|
42
|
+
|
|
43
|
+
// Write flattened files
|
|
44
|
+
const written = await this.flattenAndWriteArtifacts(artifacts, workflowsDir);
|
|
45
|
+
|
|
46
|
+
console.log(chalk.green(`✓ ${this.name} configured:`));
|
|
47
|
+
console.log(chalk.dim(` - ${counts.agents} agents installed`));
|
|
48
|
+
console.log(chalk.dim(` - ${counts.tasks} tasks installed`));
|
|
49
|
+
console.log(chalk.dim(` - ${counts.workflows} workflow commands installed`));
|
|
50
|
+
if (counts.workflowLaunchers > 0) {
|
|
51
|
+
console.log(chalk.dim(` - ${counts.workflowLaunchers} workflow launchers installed`));
|
|
52
|
+
}
|
|
53
|
+
console.log(chalk.dim(` - ${written} files written to ${path.relative(projectDir, workflowsDir)}`));
|
|
54
|
+
|
|
55
|
+
// Usage instructions
|
|
56
|
+
console.log(chalk.yellow('\n ⚠️ How to Use Cline Workflows'));
|
|
57
|
+
console.log(chalk.cyan(' BMAD workflows are available as slash commands in Cline'));
|
|
58
|
+
console.log(chalk.dim(' Usage:'));
|
|
59
|
+
console.log(chalk.dim(' - Type / to see available commands'));
|
|
60
|
+
console.log(chalk.dim(' - All BMAD items start with "bmad_"'));
|
|
61
|
+
console.log(chalk.dim(' - Example: /bmad_bmm_pm'));
|
|
62
|
+
|
|
63
|
+
return {
|
|
64
|
+
success: true,
|
|
65
|
+
agents: counts.agents,
|
|
66
|
+
tasks: counts.tasks,
|
|
67
|
+
workflows: counts.workflows,
|
|
68
|
+
workflowLaunchers: counts.workflowLaunchers,
|
|
69
|
+
written,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Detect Cline installation by checking for .clinerules/workflows directory
|
|
75
|
+
*/
|
|
76
|
+
async detect(projectDir) {
|
|
77
|
+
const workflowsDir = path.join(projectDir, this.configDir, this.workflowsDir);
|
|
78
|
+
|
|
79
|
+
if (!(await fs.pathExists(workflowsDir))) {
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const entries = await fs.readdir(workflowsDir);
|
|
84
|
+
return entries.some((entry) => entry.startsWith('bmad'));
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Collect all artifacts for Cline export
|
|
89
|
+
*/
|
|
90
|
+
async collectClineArtifacts(projectDir, bmadDir, options = {}) {
|
|
91
|
+
const selectedModules = options.selectedModules || [];
|
|
92
|
+
const artifacts = [];
|
|
93
|
+
|
|
94
|
+
// Generate agent launchers
|
|
95
|
+
const agentGen = new AgentCommandGenerator(this.bmadFolderName);
|
|
96
|
+
const { artifacts: agentArtifacts } = await agentGen.collectAgentArtifacts(bmadDir, selectedModules);
|
|
97
|
+
|
|
98
|
+
// Process agent launchers with project-specific paths
|
|
99
|
+
for (const agentArtifact of agentArtifacts) {
|
|
100
|
+
const content = agentArtifact.content;
|
|
101
|
+
|
|
102
|
+
artifacts.push({
|
|
103
|
+
type: 'agent',
|
|
104
|
+
module: agentArtifact.module,
|
|
105
|
+
sourcePath: agentArtifact.sourcePath,
|
|
106
|
+
relativePath: agentArtifact.relativePath,
|
|
107
|
+
content,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Get tasks
|
|
112
|
+
const tasks = await getTasksFromBmad(bmadDir, selectedModules);
|
|
113
|
+
for (const task of tasks) {
|
|
114
|
+
const content = await this.readAndProcessWithProject(
|
|
115
|
+
task.path,
|
|
116
|
+
{
|
|
117
|
+
module: task.module,
|
|
118
|
+
name: task.name,
|
|
119
|
+
},
|
|
120
|
+
projectDir,
|
|
121
|
+
);
|
|
122
|
+
|
|
123
|
+
artifacts.push({
|
|
124
|
+
type: 'task',
|
|
125
|
+
module: task.module,
|
|
126
|
+
sourcePath: task.path,
|
|
127
|
+
relativePath: path.join(task.module, 'tasks', `${task.name}.md`),
|
|
128
|
+
content,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Get workflows
|
|
133
|
+
const workflowGenerator = new WorkflowCommandGenerator(this.bmadFolderName);
|
|
134
|
+
const { artifacts: workflowArtifacts, counts: workflowCounts } = await workflowGenerator.collectWorkflowArtifacts(bmadDir);
|
|
135
|
+
artifacts.push(...workflowArtifacts);
|
|
136
|
+
|
|
137
|
+
return {
|
|
138
|
+
artifacts,
|
|
139
|
+
counts: {
|
|
140
|
+
agents: agentArtifacts.length,
|
|
141
|
+
tasks: tasks.length,
|
|
142
|
+
workflows: workflowCounts.commands,
|
|
143
|
+
workflowLaunchers: workflowCounts.launchers,
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Flatten file path to bmad_module_type_name.md format
|
|
150
|
+
* Uses shared toDashPath utility
|
|
151
|
+
*/
|
|
152
|
+
flattenFilename(relativePath) {
|
|
153
|
+
return toDashPath(relativePath);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Write all artifacts with flattened names
|
|
158
|
+
*/
|
|
159
|
+
async flattenAndWriteArtifacts(artifacts, destDir) {
|
|
160
|
+
let written = 0;
|
|
161
|
+
|
|
162
|
+
for (const artifact of artifacts) {
|
|
163
|
+
const flattenedName = this.flattenFilename(artifact.relativePath);
|
|
164
|
+
const targetPath = path.join(destDir, flattenedName);
|
|
165
|
+
await fs.writeFile(targetPath, artifact.content);
|
|
166
|
+
written++;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
return written;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Clear old BMAD files from the workflows directory
|
|
174
|
+
*/
|
|
175
|
+
async clearOldBmadFiles(destDir) {
|
|
176
|
+
if (!(await fs.pathExists(destDir))) {
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
const entries = await fs.readdir(destDir);
|
|
181
|
+
|
|
182
|
+
for (const entry of entries) {
|
|
183
|
+
if (!entry.startsWith('bmad')) {
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
const entryPath = path.join(destDir, entry);
|
|
188
|
+
const stat = await fs.stat(entryPath);
|
|
189
|
+
if (stat.isFile()) {
|
|
190
|
+
await fs.remove(entryPath);
|
|
191
|
+
} else if (stat.isDirectory()) {
|
|
192
|
+
await fs.remove(entryPath);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Read and process file with project-specific paths
|
|
199
|
+
*/
|
|
200
|
+
async readAndProcessWithProject(filePath, metadata, projectDir) {
|
|
201
|
+
const content = await fs.readFile(filePath, 'utf8');
|
|
202
|
+
return super.processContent(content, metadata, projectDir);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Cleanup Cline configuration
|
|
207
|
+
*/
|
|
208
|
+
async cleanup(projectDir) {
|
|
209
|
+
const workflowsDir = path.join(projectDir, this.configDir, this.workflowsDir);
|
|
210
|
+
await this.clearOldBmadFiles(workflowsDir);
|
|
211
|
+
console.log(chalk.dim(`Removed ${this.name} BMAD configuration`));
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Install a custom agent launcher for Cline
|
|
216
|
+
* @param {string} projectDir - Project directory
|
|
217
|
+
* @param {string} agentName - Agent name (e.g., "fred-commit-poet")
|
|
218
|
+
* @param {string} agentPath - Path to compiled agent (relative to project root)
|
|
219
|
+
* @param {Object} metadata - Agent metadata
|
|
220
|
+
* @returns {Object} Installation result
|
|
221
|
+
*/
|
|
222
|
+
async installCustomAgentLauncher(projectDir, agentName, agentPath, metadata) {
|
|
223
|
+
const clineDir = path.join(projectDir, this.configDir);
|
|
224
|
+
const workflowsDir = path.join(clineDir, this.workflowsDir);
|
|
225
|
+
|
|
226
|
+
// Create .clinerules/workflows directory if it doesn't exist
|
|
227
|
+
await fs.ensureDir(workflowsDir);
|
|
228
|
+
|
|
229
|
+
// Create custom agent launcher workflow
|
|
230
|
+
const launcherContent = `name: ${agentName}
|
|
231
|
+
description: Custom BMAD agent: ${agentName}
|
|
232
|
+
|
|
233
|
+
# ${agentName} Custom Agent
|
|
234
|
+
|
|
235
|
+
**⚠️ IMPORTANT**: Run @${agentPath} first to load the complete agent!
|
|
236
|
+
|
|
237
|
+
This is a launcher for the custom BMAD agent "${agentName}".
|
|
238
|
+
|
|
239
|
+
## Usage
|
|
240
|
+
1. First run: \`${agentPath}\` to load the complete agent
|
|
241
|
+
2. Then use this workflow as ${agentName}
|
|
242
|
+
|
|
243
|
+
The agent will follow the persona and instructions from the main agent file.
|
|
244
|
+
|
|
245
|
+
---
|
|
246
|
+
|
|
247
|
+
*Generated by BMAD Method*`;
|
|
248
|
+
|
|
249
|
+
// Use underscore format: bmad_custom_fred-commit-poet.md
|
|
250
|
+
const fileName = customAgentDashName(agentName);
|
|
251
|
+
const launcherPath = path.join(workflowsDir, fileName);
|
|
252
|
+
|
|
253
|
+
// Write the launcher file
|
|
254
|
+
await fs.writeFile(launcherPath, launcherContent, 'utf8');
|
|
255
|
+
|
|
256
|
+
return {
|
|
257
|
+
ide: 'cline',
|
|
258
|
+
path: path.relative(projectDir, launcherPath),
|
|
259
|
+
command: fileName.replace('.md', ''),
|
|
260
|
+
type: 'custom-agent-launcher',
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Utility: Ensure directory exists
|
|
266
|
+
*/
|
|
267
|
+
async ensureDir(dirPath) {
|
|
268
|
+
await fs.ensureDir(dirPath);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
module.exports = { ClineSetup };
|
|
@@ -0,0 +1,412 @@
|
|
|
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
|
+
const entries = await fs.readdir(globalDir);
|
|
158
|
+
if (entries.some((entry) => entry.startsWith('bmad'))) {
|
|
159
|
+
return true;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Check project-specific location
|
|
164
|
+
if (await fs.pathExists(projectSpecificDir)) {
|
|
165
|
+
const entries = await fs.readdir(projectSpecificDir);
|
|
166
|
+
if (entries.some((entry) => entry.startsWith('bmad'))) {
|
|
167
|
+
return true;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
return false;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Collect Claude-style artifacts for Codex export.
|
|
176
|
+
* Returns the normalized artifact list for further processing.
|
|
177
|
+
*/
|
|
178
|
+
async collectClaudeArtifacts(projectDir, bmadDir, options = {}) {
|
|
179
|
+
const selectedModules = options.selectedModules || [];
|
|
180
|
+
const artifacts = [];
|
|
181
|
+
|
|
182
|
+
// Generate agent launchers
|
|
183
|
+
const agentGen = new AgentCommandGenerator(this.bmadFolderName);
|
|
184
|
+
const { artifacts: agentArtifacts } = await agentGen.collectAgentArtifacts(bmadDir, selectedModules);
|
|
185
|
+
|
|
186
|
+
for (const artifact of agentArtifacts) {
|
|
187
|
+
artifacts.push({
|
|
188
|
+
type: 'agent',
|
|
189
|
+
module: artifact.module,
|
|
190
|
+
sourcePath: artifact.sourcePath,
|
|
191
|
+
relativePath: artifact.relativePath,
|
|
192
|
+
content: artifact.content,
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
const tasks = await getTasksFromBmad(bmadDir, selectedModules);
|
|
197
|
+
for (const task of tasks) {
|
|
198
|
+
const content = await this.readAndProcessWithProject(
|
|
199
|
+
task.path,
|
|
200
|
+
{
|
|
201
|
+
module: task.module,
|
|
202
|
+
name: task.name,
|
|
203
|
+
},
|
|
204
|
+
projectDir,
|
|
205
|
+
);
|
|
206
|
+
|
|
207
|
+
artifacts.push({
|
|
208
|
+
type: 'task',
|
|
209
|
+
module: task.module,
|
|
210
|
+
sourcePath: task.path,
|
|
211
|
+
relativePath: path.join(task.module, 'tasks', `${task.name}.md`),
|
|
212
|
+
content,
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
const workflowGenerator = new WorkflowCommandGenerator(this.bmadFolderName);
|
|
217
|
+
const { artifacts: workflowArtifacts, counts: workflowCounts } = await workflowGenerator.collectWorkflowArtifacts(bmadDir);
|
|
218
|
+
artifacts.push(...workflowArtifacts);
|
|
219
|
+
|
|
220
|
+
return {
|
|
221
|
+
artifacts,
|
|
222
|
+
counts: {
|
|
223
|
+
agents: agentArtifacts.length,
|
|
224
|
+
tasks: tasks.length,
|
|
225
|
+
workflows: workflowCounts.commands,
|
|
226
|
+
workflowLaunchers: workflowCounts.launchers,
|
|
227
|
+
},
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
getCodexPromptDir(projectDir = null, location = 'global') {
|
|
232
|
+
if (location === 'project' && projectDir) {
|
|
233
|
+
return path.join(projectDir, '.codex', 'prompts');
|
|
234
|
+
}
|
|
235
|
+
return path.join(os.homedir(), '.codex', 'prompts');
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
async flattenAndWriteArtifacts(artifacts, destDir) {
|
|
239
|
+
let written = 0;
|
|
240
|
+
|
|
241
|
+
for (const artifact of artifacts) {
|
|
242
|
+
const flattenedName = this.flattenFilename(artifact.relativePath);
|
|
243
|
+
const targetPath = path.join(destDir, flattenedName);
|
|
244
|
+
await fs.writeFile(targetPath, artifact.content);
|
|
245
|
+
written++;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
return written;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
async clearOldBmadFiles(destDir) {
|
|
252
|
+
if (!(await fs.pathExists(destDir))) {
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
const entries = await fs.readdir(destDir);
|
|
257
|
+
|
|
258
|
+
for (const entry of entries) {
|
|
259
|
+
if (!entry.startsWith('bmad')) {
|
|
260
|
+
continue;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
const entryPath = path.join(destDir, entry);
|
|
264
|
+
const stat = await fs.stat(entryPath);
|
|
265
|
+
if (stat.isFile()) {
|
|
266
|
+
await fs.remove(entryPath);
|
|
267
|
+
} else if (stat.isDirectory()) {
|
|
268
|
+
await fs.remove(entryPath);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
async readAndProcessWithProject(filePath, metadata, projectDir) {
|
|
274
|
+
const content = await fs.readFile(filePath, 'utf8');
|
|
275
|
+
return super.processContent(content, metadata, projectDir);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/**
|
|
279
|
+
* Get instructions for global installation
|
|
280
|
+
* @returns {string} Instructions text
|
|
281
|
+
*/
|
|
282
|
+
getGlobalInstructions(destDir) {
|
|
283
|
+
const lines = [
|
|
284
|
+
'',
|
|
285
|
+
chalk.bold.cyan('═'.repeat(70)),
|
|
286
|
+
chalk.bold.yellow(' IMPORTANT: Codex Configuration'),
|
|
287
|
+
chalk.bold.cyan('═'.repeat(70)),
|
|
288
|
+
'',
|
|
289
|
+
chalk.white(' /prompts installed globally to your HOME DIRECTORY.'),
|
|
290
|
+
'',
|
|
291
|
+
chalk.yellow(' ⚠️ These prompts reference a specific _bmad path'),
|
|
292
|
+
chalk.dim(" To use with other projects, you'd need to copy the _bmad dir"),
|
|
293
|
+
'',
|
|
294
|
+
chalk.green(' ✓ You can now use /commands in Codex CLI'),
|
|
295
|
+
chalk.dim(' Example: /bmad_bmm_pm'),
|
|
296
|
+
chalk.dim(' Type / to see all available commands'),
|
|
297
|
+
'',
|
|
298
|
+
chalk.bold.cyan('═'.repeat(70)),
|
|
299
|
+
'',
|
|
300
|
+
];
|
|
301
|
+
return lines.join('\n');
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* Get instructions for project-specific installation
|
|
306
|
+
* @param {string} projectDir - Optional project directory
|
|
307
|
+
* @param {string} destDir - Optional destination directory
|
|
308
|
+
* @returns {string} Instructions text
|
|
309
|
+
*/
|
|
310
|
+
getProjectSpecificInstructions(projectDir = null, destDir = null) {
|
|
311
|
+
const isWindows = os.platform() === 'win32';
|
|
312
|
+
|
|
313
|
+
const commonLines = [
|
|
314
|
+
'',
|
|
315
|
+
chalk.bold.cyan('═'.repeat(70)),
|
|
316
|
+
chalk.bold.yellow(' Project-Specific Codex Configuration'),
|
|
317
|
+
chalk.bold.cyan('═'.repeat(70)),
|
|
318
|
+
'',
|
|
319
|
+
chalk.white(' Prompts will be installed to: ') + chalk.cyan(destDir || '<project>/.codex/prompts'),
|
|
320
|
+
'',
|
|
321
|
+
chalk.bold.yellow(' ⚠️ REQUIRED: You must set CODEX_HOME to use these prompts'),
|
|
322
|
+
'',
|
|
323
|
+
];
|
|
324
|
+
|
|
325
|
+
const windowsLines = [
|
|
326
|
+
chalk.bold(' Create a codex.cmd file in your project root:'),
|
|
327
|
+
'',
|
|
328
|
+
chalk.green(' @echo off'),
|
|
329
|
+
chalk.green(' set CODEX_HOME=%~dp0.codex'),
|
|
330
|
+
chalk.green(' codex %*'),
|
|
331
|
+
'',
|
|
332
|
+
chalk.dim(String.raw` Then run: .\codex instead of codex`),
|
|
333
|
+
chalk.dim(' (The %~dp0 gets the directory of the .cmd file)'),
|
|
334
|
+
];
|
|
335
|
+
|
|
336
|
+
const unixLines = [
|
|
337
|
+
chalk.bold(' Add this alias to your ~/.bashrc or ~/.zshrc:'),
|
|
338
|
+
'',
|
|
339
|
+
chalk.green(' alias codex=\'CODEX_HOME="$PWD/.codex" codex\''),
|
|
340
|
+
'',
|
|
341
|
+
chalk.dim(' After adding, run: source ~/.bashrc (or source ~/.zshrc)'),
|
|
342
|
+
chalk.dim(' (The $PWD uses your current working directory)'),
|
|
343
|
+
];
|
|
344
|
+
const closingLines = [
|
|
345
|
+
'',
|
|
346
|
+
chalk.dim(' This tells Codex CLI to use prompts from this project instead of ~/.codex'),
|
|
347
|
+
'',
|
|
348
|
+
chalk.bold.cyan('═'.repeat(70)),
|
|
349
|
+
'',
|
|
350
|
+
];
|
|
351
|
+
|
|
352
|
+
const lines = [...commonLines, ...(isWindows ? windowsLines : unixLines), ...closingLines];
|
|
353
|
+
|
|
354
|
+
return lines.join('\n');
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
/**
|
|
358
|
+
* Cleanup Codex configuration
|
|
359
|
+
*/
|
|
360
|
+
async cleanup(projectDir = null) {
|
|
361
|
+
// Clean both global and project-specific locations
|
|
362
|
+
const globalDir = this.getCodexPromptDir(null, 'global');
|
|
363
|
+
await this.clearOldBmadFiles(globalDir);
|
|
364
|
+
|
|
365
|
+
if (projectDir) {
|
|
366
|
+
const projectSpecificDir = this.getCodexPromptDir(projectDir, 'project');
|
|
367
|
+
await this.clearOldBmadFiles(projectSpecificDir);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
/**
|
|
372
|
+
* Install a custom agent launcher for Codex
|
|
373
|
+
* @param {string} projectDir - Project directory (not used, Codex installs to home)
|
|
374
|
+
* @param {string} agentName - Agent name (e.g., "fred-commit-poet")
|
|
375
|
+
* @param {string} agentPath - Path to compiled agent (relative to project root)
|
|
376
|
+
* @param {Object} metadata - Agent metadata
|
|
377
|
+
* @returns {Object|null} Info about created command
|
|
378
|
+
*/
|
|
379
|
+
async installCustomAgentLauncher(projectDir, agentName, agentPath, metadata) {
|
|
380
|
+
const destDir = this.getCodexPromptDir(projectDir, 'project');
|
|
381
|
+
await fs.ensureDir(destDir);
|
|
382
|
+
|
|
383
|
+
const launcherContent = `---
|
|
384
|
+
name: '${agentName}'
|
|
385
|
+
description: '${agentName} agent'
|
|
386
|
+
---
|
|
387
|
+
|
|
388
|
+
You must fully embody this agent's persona and follow all activation instructions exactly as specified. NEVER break character until given an exit command.
|
|
389
|
+
|
|
390
|
+
<agent-activation CRITICAL="TRUE">
|
|
391
|
+
1. LOAD the FULL agent file from @${agentPath}
|
|
392
|
+
2. READ its entire contents - this contains the complete agent persona, menu, and instructions
|
|
393
|
+
3. FOLLOW every step in the <activation> section precisely
|
|
394
|
+
4. DISPLAY the welcome/greeting as instructed
|
|
395
|
+
5. PRESENT the numbered menu
|
|
396
|
+
6. WAIT for user input before proceeding
|
|
397
|
+
</agent-activation>
|
|
398
|
+
`;
|
|
399
|
+
|
|
400
|
+
// Use underscore format: bmad_custom_fred-commit-poet.md
|
|
401
|
+
const fileName = customAgentDashName(agentName);
|
|
402
|
+
const launcherPath = path.join(destDir, fileName);
|
|
403
|
+
await fs.writeFile(launcherPath, launcherContent, 'utf8');
|
|
404
|
+
|
|
405
|
+
return {
|
|
406
|
+
path: path.relative(projectDir, launcherPath),
|
|
407
|
+
command: `/${fileName.replace('.md', '')}`,
|
|
408
|
+
};
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
module.exports = { CodexSetup };
|