bmad-fh 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/.githooks/post-checkout +129 -0
- package/.githooks/pre-commit +63 -0
- package/.githooks/pre-push +135 -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/publish-multi-artifact.yaml +50 -0
- package/.github/workflows/quality.yaml +115 -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 +306 -0
- package/CONTRIBUTORS.md +32 -0
- package/LICENSE +30 -0
- package/README.md +126 -0
- package/SECURITY.md +85 -0
- package/TRADEMARK.md +55 -0
- package/Wordmark.png +0 -0
- package/banner-bmad-method.png +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 +526 -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 +98 -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/migration-guide.md +365 -0
- package/docs/multi-scope-guide.md +379 -0
- package/docs/plans/multi-scope-parallel-artifacts-plan.md +695 -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 +254 -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 +41 -0
- package/src/bmm/agents/architect.agent.yaml +33 -0
- package/src/bmm/agents/dev.agent.yaml +38 -0
- package/src/bmm/agents/pm.agent.yaml +51 -0
- package/src/bmm/agents/quick-flow-solo-dev.agent.yaml +32 -0
- package/src/bmm/agents/sm.agent.yaml +47 -0
- package/src/bmm/agents/tea.agent.yaml +68 -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 +49 -0
- package/src/bmm/agents/ux-designer.agent.yaml +30 -0
- package/src/bmm/data/README.md +29 -0
- package/src/bmm/data/project-context-template.md +40 -0
- package/src/bmm/module.yaml +64 -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/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 +34 -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 +194 -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 +228 -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 +180 -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 +232 -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 +133 -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 +352 -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 +145 -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/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 +52 -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/generate-project-context/project-context-template.md +21 -0
- package/src/bmm/workflows/generate-project-context/steps/step-01-discover.md +184 -0
- package/src/bmm/workflows/generate-project-context/steps/step-02-generate.md +318 -0
- package/src/bmm/workflows/generate-project-context/steps/step-03-complete.md +278 -0
- package/src/bmm/workflows/generate-project-context/workflow.md +49 -0
- package/src/bmm/workflows/testarch/atdd/atdd-checklist-template.md +364 -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 +248 -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 +321 -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 +722 -0
- package/src/bmm/workflows/testarch/nfr-assess/nfr-report-template.md +445 -0
- package/src/bmm/workflows/testarch/nfr-assess/workflow.yaml +49 -0
- package/src/bmm/workflows/testarch/test-design/checklist.md +235 -0
- package/src/bmm/workflows/testarch/test-design/instructions.md +788 -0
- package/src/bmm/workflows/testarch/test-design/test-design-template.md +294 -0
- package/src/bmm/workflows/testarch/test-design/workflow.yaml +56 -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 +655 -0
- package/src/bmm/workflows/testarch/trace/instructions.md +1047 -0
- package/src/bmm/workflows/testarch/trace/trace-template.md +675 -0
- package/src/bmm/workflows/testarch/trace/workflow.yaml +57 -0
- package/src/bmm/workflows/workflow-status/init/instructions.md +346 -0
- package/src/bmm/workflows/workflow-status/init/workflow.yaml +30 -0
- package/src/bmm/workflows/workflow-status/instructions.md +397 -0
- package/src/bmm/workflows/workflow-status/paths/enterprise-brownfield.yaml +103 -0
- package/src/bmm/workflows/workflow-status/paths/enterprise-greenfield.yaml +100 -0
- package/src/bmm/workflows/workflow-status/paths/method-brownfield.yaml +103 -0
- package/src/bmm/workflows/workflow-status/paths/method-greenfield.yaml +100 -0
- package/src/bmm/workflows/workflow-status/project-levels.yaml +59 -0
- package/src/bmm/workflows/workflow-status/workflow-status-template.yaml +24 -0
- package/src/bmm/workflows/workflow-status/workflow.yaml +32 -0
- package/src/core/_module-installer/installer.js +60 -0
- package/src/core/agents/bmad-master.agent.yaml +30 -0
- package/src/core/lib/scope/artifact-resolver.js +298 -0
- package/src/core/lib/scope/event-logger.js +411 -0
- package/src/core/lib/scope/index.js +30 -0
- package/src/core/lib/scope/scope-context.js +307 -0
- package/src/core/lib/scope/scope-initializer.js +458 -0
- package/src/core/lib/scope/scope-manager.js +512 -0
- package/src/core/lib/scope/scope-migrator.js +442 -0
- package/src/core/lib/scope/scope-sync.js +489 -0
- package/src/core/lib/scope/scope-validator.js +299 -0
- package/src/core/lib/scope/state-lock.js +342 -0
- package/src/core/module.yaml +53 -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 +91 -0
- package/src/core/tasks/editorial-review-structure.xml +198 -0
- package/src/core/tasks/index-docs.xml +65 -0
- package/src/core/tasks/review-adversarial-general.xml +46 -0
- package/src/core/tasks/shard-doc.xml +109 -0
- package/src/core/tasks/workflow.xml +277 -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 +28 -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 +19 -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/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/test-scope-e2e.js +450 -0
- package/test/test-scope-system.js +787 -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/scope.js +474 -0
- package/tools/cli/external-official-modules.yaml +41 -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 +2585 -0
- package/tools/cli/installers/lib/core/manifest-generator.js +963 -0
- package/tools/cli/installers/lib/core/manifest.js +590 -0
- package/tools/cli/installers/lib/custom/handler.js +363 -0
- package/tools/cli/installers/lib/ide/_base-ide.js +654 -0
- package/tools/cli/installers/lib/ide/antigravity.js +486 -0
- package/tools/cli/installers/lib/ide/auggie.js +244 -0
- package/tools/cli/installers/lib/ide/claude-code.js +487 -0
- package/tools/cli/installers/lib/ide/cline.js +269 -0
- package/tools/cli/installers/lib/ide/codex.js +375 -0
- package/tools/cli/installers/lib/ide/crush.js +300 -0
- package/tools/cli/installers/lib/ide/cursor.js +169 -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 +270 -0
- package/tools/cli/installers/lib/ide/rovo-dev.js +290 -0
- package/tools/cli/installers/lib/ide/shared/agent-command-generator.js +96 -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/task-tool-command-generator.js +119 -0
- package/tools/cli/installers/lib/ide/shared/workflow-command-generator.js +242 -0
- package/tools/cli/installers/lib/ide/templates/agent-command-template.md +29 -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 +30 -0
- package/tools/cli/installers/lib/ide/templates/workflow-commander.md +45 -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 +133 -0
- package/tools/cli/installers/lib/modules/manager.js +1362 -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 +1591 -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/cli/scripts/migrate-workflows.js +281 -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 +493 -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,263 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BMAD Workflow Markdown Formatter
|
|
3
|
+
*
|
|
4
|
+
* Formats mixed markdown + XML workflow instruction files with:
|
|
5
|
+
* - 2-space XML indentation
|
|
6
|
+
* - Preserved markdown content
|
|
7
|
+
* - Proper tag nesting
|
|
8
|
+
* - Consistent formatting
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
const fs = require('node:fs');
|
|
12
|
+
const path = require('node:path');
|
|
13
|
+
|
|
14
|
+
class WorkflowFormatter {
|
|
15
|
+
constructor(options = {}) {
|
|
16
|
+
this.indentSize = options.indentSize || 2;
|
|
17
|
+
this.preserveMarkdown = options.preserveMarkdown !== false;
|
|
18
|
+
this.verbose = options.verbose || false;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Format a workflow markdown file
|
|
23
|
+
*/
|
|
24
|
+
format(filePath) {
|
|
25
|
+
if (this.verbose) {
|
|
26
|
+
console.log(`Formatting: ${filePath}`);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const content = fs.readFileSync(filePath, 'utf8');
|
|
30
|
+
const formatted = this.formatContent(content);
|
|
31
|
+
|
|
32
|
+
// Only write if content changed
|
|
33
|
+
if (content === formatted) {
|
|
34
|
+
if (this.verbose) {
|
|
35
|
+
console.log(`- No changes: ${filePath}`);
|
|
36
|
+
}
|
|
37
|
+
return false;
|
|
38
|
+
} else {
|
|
39
|
+
fs.writeFileSync(filePath, formatted, 'utf8');
|
|
40
|
+
if (this.verbose) {
|
|
41
|
+
console.log(`✓ Formatted: ${filePath}`);
|
|
42
|
+
}
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Format content string with stateful indentation tracking
|
|
49
|
+
*/
|
|
50
|
+
formatContent(content) {
|
|
51
|
+
const lines = content.split('\n');
|
|
52
|
+
const formatted = [];
|
|
53
|
+
let indentLevel = 0;
|
|
54
|
+
let inCodeBlock = false;
|
|
55
|
+
let checkBlockDepth = 0; // Track nested check blocks
|
|
56
|
+
|
|
57
|
+
for (let i = 0; i < lines.length; i++) {
|
|
58
|
+
const line = lines[i];
|
|
59
|
+
const trimmed = line.trim();
|
|
60
|
+
|
|
61
|
+
// Track code blocks (don't format inside them)
|
|
62
|
+
if (trimmed.startsWith('```')) {
|
|
63
|
+
if (inCodeBlock) {
|
|
64
|
+
inCodeBlock = false;
|
|
65
|
+
} else {
|
|
66
|
+
inCodeBlock = true;
|
|
67
|
+
}
|
|
68
|
+
formatted.push(line);
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Don't format inside code blocks
|
|
73
|
+
if (inCodeBlock) {
|
|
74
|
+
formatted.push(line);
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Handle XML tags
|
|
79
|
+
if (this.isXMLLine(trimmed)) {
|
|
80
|
+
const result = this.formatXMLLine(trimmed, indentLevel, checkBlockDepth, i, lines);
|
|
81
|
+
formatted.push(result.line);
|
|
82
|
+
indentLevel = result.nextIndent;
|
|
83
|
+
checkBlockDepth = result.nextCheckDepth;
|
|
84
|
+
} else if (trimmed === '') {
|
|
85
|
+
// Preserve blank lines
|
|
86
|
+
formatted.push('');
|
|
87
|
+
} else {
|
|
88
|
+
// Markdown content - preserve as-is but maintain current indent if inside XML
|
|
89
|
+
formatted.push(line);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
return formatted.join('\n');
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Check if line contains XML tag
|
|
98
|
+
*/
|
|
99
|
+
isXMLLine(line) {
|
|
100
|
+
return /^<[a-zA-Z-]+(\s|>|\/)/.test(line) || /^<\/[a-zA-Z-]+>/.test(line);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Format a single XML line with context awareness
|
|
105
|
+
*/
|
|
106
|
+
formatXMLLine(line, currentIndent, checkDepth, lineIndex, allLines) {
|
|
107
|
+
const trimmed = line.trim();
|
|
108
|
+
let indent = currentIndent;
|
|
109
|
+
let nextIndent = currentIndent;
|
|
110
|
+
let nextCheckDepth = checkDepth;
|
|
111
|
+
|
|
112
|
+
// Get the tag name
|
|
113
|
+
const tagMatch = trimmed.match(/^<\/?([a-zA-Z-]+)/);
|
|
114
|
+
const tagName = tagMatch ? tagMatch[1] : '';
|
|
115
|
+
|
|
116
|
+
// Closing tag - decrease indent before this line
|
|
117
|
+
if (trimmed.startsWith('</')) {
|
|
118
|
+
indent = Math.max(0, currentIndent - 1);
|
|
119
|
+
nextIndent = indent;
|
|
120
|
+
|
|
121
|
+
// If closing a step, reset check depth
|
|
122
|
+
if (tagName === 'step' || tagName === 'workflow') {
|
|
123
|
+
nextCheckDepth = 0;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// Self-closing tags (opens and closes on same line)
|
|
127
|
+
// EXCEPT <check> tags which create logical blocks
|
|
128
|
+
else if (this.isSelfClosingTag(trimmed) && tagName !== 'check') {
|
|
129
|
+
// These don't change indent level
|
|
130
|
+
indent = currentIndent;
|
|
131
|
+
nextIndent = currentIndent;
|
|
132
|
+
}
|
|
133
|
+
// Opening tags
|
|
134
|
+
else if (trimmed.startsWith('<')) {
|
|
135
|
+
// Check if this is a <check> tag - these create logical blocks
|
|
136
|
+
if (tagName === 'check') {
|
|
137
|
+
indent = currentIndent;
|
|
138
|
+
// Check tags increase indent for following content
|
|
139
|
+
nextIndent = currentIndent + 1;
|
|
140
|
+
nextCheckDepth = checkDepth + 1;
|
|
141
|
+
}
|
|
142
|
+
// <action> tags inside check blocks stay at current indent
|
|
143
|
+
else if (tagName === 'action' && checkDepth > 0) {
|
|
144
|
+
indent = currentIndent;
|
|
145
|
+
nextIndent = currentIndent; // Don't increase further
|
|
146
|
+
}
|
|
147
|
+
// Other tags close check blocks and return to structural level
|
|
148
|
+
else if (checkDepth > 0) {
|
|
149
|
+
// Close all check blocks - return to base structural level
|
|
150
|
+
indent = Math.max(0, currentIndent - checkDepth);
|
|
151
|
+
nextIndent = indent + 1;
|
|
152
|
+
nextCheckDepth = 0;
|
|
153
|
+
}
|
|
154
|
+
// Regular opening tags (no check blocks active)
|
|
155
|
+
else {
|
|
156
|
+
indent = currentIndent;
|
|
157
|
+
nextIndent = currentIndent + 1;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
const indentStr = ' '.repeat(indent * this.indentSize);
|
|
162
|
+
return {
|
|
163
|
+
line: indentStr + trimmed,
|
|
164
|
+
nextIndent: nextIndent,
|
|
165
|
+
nextCheckDepth: nextCheckDepth,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Check if tag opens and closes on same line
|
|
171
|
+
*/
|
|
172
|
+
isSelfClosingTag(line) {
|
|
173
|
+
// Self-closing with />
|
|
174
|
+
if (line.endsWith('/>')) {
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
// Opens and closes on same line: <tag>content</tag>
|
|
178
|
+
const match = line.match(/^<([a-zA-Z-]+)(\s[^>]*)?>.*<\/\1>$/);
|
|
179
|
+
return match !== null;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Check if tag is a block-level structural tag
|
|
184
|
+
*/
|
|
185
|
+
isBlockLevelTag(tagName) {
|
|
186
|
+
return ['step', 'workflow', 'check'].includes(tagName);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* CLI Entry Point
|
|
192
|
+
*/
|
|
193
|
+
function main() {
|
|
194
|
+
const args = process.argv.slice(2);
|
|
195
|
+
|
|
196
|
+
if (args.length === 0 || args.includes('--help') || args.includes('-h')) {
|
|
197
|
+
console.log(`
|
|
198
|
+
BMAD Workflow Markdown Formatter
|
|
199
|
+
|
|
200
|
+
Usage:
|
|
201
|
+
node format-workflow-md.js <file-pattern> [options]
|
|
202
|
+
|
|
203
|
+
Options:
|
|
204
|
+
--verbose, -v Verbose output
|
|
205
|
+
--check, -c Check formatting without writing (exit 1 if changes needed)
|
|
206
|
+
--help, -h Show this help
|
|
207
|
+
|
|
208
|
+
Examples:
|
|
209
|
+
node format-workflow-md.js src/**/instructions.md
|
|
210
|
+
node format-workflow-md.js "src/modules/bmb/**/*.md" --verbose
|
|
211
|
+
node format-workflow-md.js file.md --check
|
|
212
|
+
`);
|
|
213
|
+
process.exit(0);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
const verbose = args.includes('--verbose') || args.includes('-v');
|
|
217
|
+
const check = args.includes('--check') || args.includes('-c');
|
|
218
|
+
|
|
219
|
+
// Remove flags from args
|
|
220
|
+
const files = args.filter((arg) => !arg.startsWith('-'));
|
|
221
|
+
|
|
222
|
+
const formatter = new WorkflowFormatter({ verbose });
|
|
223
|
+
let hasChanges = false;
|
|
224
|
+
let formattedCount = 0;
|
|
225
|
+
|
|
226
|
+
// Process files
|
|
227
|
+
for (const pattern of files) {
|
|
228
|
+
// For now, treat as direct file path
|
|
229
|
+
// TODO: Add glob support for patterns
|
|
230
|
+
if (fs.existsSync(pattern)) {
|
|
231
|
+
const stat = fs.statSync(pattern);
|
|
232
|
+
if (stat.isFile()) {
|
|
233
|
+
const changed = formatter.format(pattern);
|
|
234
|
+
if (changed) {
|
|
235
|
+
hasChanges = true;
|
|
236
|
+
formattedCount++;
|
|
237
|
+
}
|
|
238
|
+
} else if (stat.isDirectory()) {
|
|
239
|
+
console.error(`Error: ${pattern} is a directory. Please specify file paths.`);
|
|
240
|
+
}
|
|
241
|
+
} else {
|
|
242
|
+
console.error(`Error: File not found: ${pattern}`);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
if (verbose || formattedCount > 0) {
|
|
247
|
+
console.log(`\nFormatted ${formattedCount} file(s)`);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
if (check && hasChanges) {
|
|
251
|
+
console.error('\n❌ Some files need formatting. Run without --check to format.');
|
|
252
|
+
process.exit(1);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
process.exit(0);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// Run if called directly
|
|
259
|
+
if (require.main === module) {
|
|
260
|
+
main();
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
module.exports = { WorkflowFormatter };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Escape XML special characters in a string
|
|
3
|
+
* @param {string} text - The text to escape
|
|
4
|
+
* @returns {string} The escaped text
|
|
5
|
+
*/
|
|
6
|
+
function escapeXml(text) {
|
|
7
|
+
if (!text) return '';
|
|
8
|
+
return text.replaceAll('&', '&').replaceAll('<', '<').replaceAll('>', '>').replaceAll('"', '"').replaceAll("'", ''');
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
module.exports = {
|
|
12
|
+
escapeXml,
|
|
13
|
+
};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# Raven's Verdict - Deep PR Review Tool
|
|
2
|
+
|
|
3
|
+
Adversarial code review for GitHub PRs. Works with any LLM agent.
|
|
4
|
+
|
|
5
|
+
> **Status: Experimental.** We're still figuring out how to use this effectively. Expect the workflow to evolve.
|
|
6
|
+
|
|
7
|
+
## How It Works
|
|
8
|
+
|
|
9
|
+
Point your agent at `review-pr.md` and ask it to review a specific PR:
|
|
10
|
+
|
|
11
|
+
> "Read tools/maintainer/review-pr.md and apply it to PR #123"
|
|
12
|
+
|
|
13
|
+
The tool will:
|
|
14
|
+
|
|
15
|
+
1. Check out the PR branch locally
|
|
16
|
+
2. Run an adversarial review (find at least 5 issues)
|
|
17
|
+
3. Transform findings into professional tone
|
|
18
|
+
4. Preview the review and ask before posting
|
|
19
|
+
|
|
20
|
+
See `review-pr.md` for full prompt structure, severity ratings, and sandboxing rules.
|
|
21
|
+
|
|
22
|
+
## When to Use
|
|
23
|
+
|
|
24
|
+
**Good candidates:**
|
|
25
|
+
|
|
26
|
+
- PRs with meaningful logic changes
|
|
27
|
+
- Refactors touching multiple files
|
|
28
|
+
- New features or architectural changes
|
|
29
|
+
|
|
30
|
+
**Skip it for:**
|
|
31
|
+
|
|
32
|
+
- Trivial PRs (typo fixes, version bumps, single-line changes)
|
|
33
|
+
- PRs you've already reviewed manually
|
|
34
|
+
- PRs where you haven't agreed on the approach yet — fix the direction before the implementation
|
|
35
|
+
|
|
36
|
+
## Workflow Tips
|
|
37
|
+
|
|
38
|
+
**Always review before posting.** The preview step exists for a reason:
|
|
39
|
+
|
|
40
|
+
- **[y] Yes** — Post as-is (only if you're confident)
|
|
41
|
+
- **[e] Edit** — Modify findings before posting
|
|
42
|
+
- **[s] Save only** — Write to file, don't post
|
|
43
|
+
|
|
44
|
+
The save option is useful when you want to:
|
|
45
|
+
|
|
46
|
+
- Hand-edit the review before posting
|
|
47
|
+
- Use the findings as input for a second opinion ("Hey Claude, here's what Raven found — what do you think?")
|
|
48
|
+
- Cherry-pick specific findings
|
|
49
|
+
|
|
50
|
+
**Trust but verify.** LLM reviews can miss context or flag non-issues. Skim the findings before they hit the PR.
|
|
51
|
+
|
|
52
|
+
## Prerequisites
|
|
53
|
+
|
|
54
|
+
- `gh` CLI installed and authenticated (`gh auth status`)
|
|
55
|
+
- Any LLM agent capable of running bash commands
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
# Raven's Verdict - Deep PR Review Tool
|
|
2
|
+
|
|
3
|
+
A cynical adversarial review, transformed into cold engineering professionalism.
|
|
4
|
+
|
|
5
|
+
<orientation>
|
|
6
|
+
CRITICAL: Sandboxed Execution Rules
|
|
7
|
+
|
|
8
|
+
Before proceeding, you MUST verify:
|
|
9
|
+
|
|
10
|
+
- [ ] PR number or URL was EXPLICITLY provided in the user's message
|
|
11
|
+
- [ ] You are NOT inferring the PR from conversation history
|
|
12
|
+
- [ ] You are NOT looking at git branches, recent commits, or local state
|
|
13
|
+
- [ ] You are NOT guessing or assuming any PR numbers
|
|
14
|
+
|
|
15
|
+
**If no explicit PR number/URL was provided, STOP immediately and ask:**
|
|
16
|
+
"What PR number or URL should I review?"
|
|
17
|
+
</orientation>
|
|
18
|
+
|
|
19
|
+
<preflight-checks>
|
|
20
|
+
|
|
21
|
+
## Preflight Checks
|
|
22
|
+
|
|
23
|
+
### 0.1 Parse PR Input
|
|
24
|
+
|
|
25
|
+
Extract PR number from user input. Examples of valid formats:
|
|
26
|
+
|
|
27
|
+
- `123` (just the number)
|
|
28
|
+
- `#123` (with hash)
|
|
29
|
+
- `https://github.com/owner/repo/pull/123` (full URL)
|
|
30
|
+
|
|
31
|
+
If a URL specifies a different repository than the current one:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
# Check current repo
|
|
35
|
+
gh repo view --json nameWithOwner -q '.nameWithOwner'
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
If mismatch detected, ask user:
|
|
39
|
+
|
|
40
|
+
> "This PR is from `{detected_repo}` but we're in `{current_repo}`. Proceed with reviewing `{detected_repo}#123`? (y/n)"
|
|
41
|
+
|
|
42
|
+
If user confirms, store `{REPO}` for use in all subsequent `gh` commands.
|
|
43
|
+
|
|
44
|
+
### 0.2 Ensure Clean Checkout
|
|
45
|
+
|
|
46
|
+
Verify the working tree is clean and check out the PR branch.
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
# Check for uncommitted changes
|
|
50
|
+
git status --porcelain
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
If output is non-empty, STOP and tell user:
|
|
54
|
+
|
|
55
|
+
> "You have uncommitted changes. Please commit or stash them before running a PR review."
|
|
56
|
+
|
|
57
|
+
If clean, fetch and checkout the PR branch:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
# Fetch and checkout PR branch
|
|
61
|
+
# For cross-repo PRs, include --repo {REPO}
|
|
62
|
+
gh pr checkout {PR_NUMBER} [--repo {REPO}]
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
If checkout fails, STOP and report the error.
|
|
66
|
+
|
|
67
|
+
Now you're on the PR branch with full access to all files as they exist in the PR.
|
|
68
|
+
|
|
69
|
+
### 0.3 Check PR Size
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
# For cross-repo PRs, include --repo {REPO}
|
|
73
|
+
gh pr view {PR_NUMBER} [--repo {REPO}] --json additions,deletions,changedFiles -q '{"additions": .additions, "deletions": .deletions, "files": .changedFiles}'
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
**Size thresholds:**
|
|
77
|
+
|
|
78
|
+
| Metric | Warning Threshold |
|
|
79
|
+
| ------------- | ----------------- |
|
|
80
|
+
| Files changed | > 50 |
|
|
81
|
+
| Lines changed | > 5000 |
|
|
82
|
+
|
|
83
|
+
If thresholds exceeded, ask user:
|
|
84
|
+
|
|
85
|
+
> "This PR has {X} files and {Y} line changes. That's large.
|
|
86
|
+
>
|
|
87
|
+
> **[f] Focus** - Pick specific files or directories to review
|
|
88
|
+
> **[p] Proceed** - Review everything (may be slow/expensive)
|
|
89
|
+
> **[a] Abort** - Stop here"
|
|
90
|
+
|
|
91
|
+
### 0.4 Note Binary Files
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
# For cross-repo PRs, include --repo {REPO}
|
|
95
|
+
gh pr diff {PR_NUMBER} [--repo {REPO}] --name-only | grep -E '\.(png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot|pdf|zip|tar|gz|bin|exe|dll|so|dylib)$' || echo "No binary files detected"
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Store list of binary files to skip. Note them in final output.
|
|
99
|
+
|
|
100
|
+
</preflight-checks>
|
|
101
|
+
|
|
102
|
+
<adversarial-review>
|
|
103
|
+
|
|
104
|
+
### 1.1 Run Cynical Review
|
|
105
|
+
|
|
106
|
+
**INTERNAL PERSONA - Never post this directly:**
|
|
107
|
+
|
|
108
|
+
Task: You are a cynical, jaded code reviewer with zero patience for sloppy work. This PR was submitted by a clueless weasel and you expect to find problems. Find at least five issues to fix or improve in it. Number them. Be skeptical of everything. Ultrathink.
|
|
109
|
+
|
|
110
|
+
Output format:
|
|
111
|
+
|
|
112
|
+
```markdown
|
|
113
|
+
### [NUMBER]. [FINDING TITLE] [likely]
|
|
114
|
+
|
|
115
|
+
**Severity:** [EMOJI] [LEVEL]
|
|
116
|
+
|
|
117
|
+
[DESCRIPTION - be specific, include file:line references]
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Severity scale:
|
|
121
|
+
|
|
122
|
+
| Level | Emoji | Meaning |
|
|
123
|
+
| -------- | ----- | ------------------------------------------------------- |
|
|
124
|
+
| Critical | 🔴 | Security issue, data loss risk, or broken functionality |
|
|
125
|
+
| Moderate | 🟡 | Bug, performance issue, or significant code smell |
|
|
126
|
+
| Minor | 🟢 | Style, naming, minor improvement opportunity |
|
|
127
|
+
|
|
128
|
+
Likely tag:
|
|
129
|
+
|
|
130
|
+
- Add `[likely]` to findings with high confidence, e.g. with direct evidence
|
|
131
|
+
- Sort findings by severity (Critical → Moderate → Minor), not by confidence
|
|
132
|
+
|
|
133
|
+
</adversarial-review>
|
|
134
|
+
|
|
135
|
+
<tone-transformation>
|
|
136
|
+
|
|
137
|
+
**Transform the cynical output into cold engineering professionalism.**
|
|
138
|
+
|
|
139
|
+
**Transformation rules:**
|
|
140
|
+
|
|
141
|
+
1. Remove all inflammatory language, insults, assumptions about the author
|
|
142
|
+
2. Keep all technical substance, file references, severity ratings and likely tag
|
|
143
|
+
3. Replace accusatory phrasing with neutral observations:
|
|
144
|
+
- ❌ "The author clearly didn't think about..."
|
|
145
|
+
- ✅ "This implementation may not account for..."
|
|
146
|
+
4. Preserve skepticism as healthy engineering caution:
|
|
147
|
+
- ❌ "This will definitely break in production"
|
|
148
|
+
- ✅ "This pattern has historically caused issues in production environments"
|
|
149
|
+
5. Add the suggested fixes.
|
|
150
|
+
6. Keep suggestions actionable and specific
|
|
151
|
+
|
|
152
|
+
Output format after transformation:
|
|
153
|
+
|
|
154
|
+
```markdown
|
|
155
|
+
## PR Review: #{PR_NUMBER}
|
|
156
|
+
|
|
157
|
+
**Title:** {PR_TITLE}
|
|
158
|
+
**Author:** @{AUTHOR}
|
|
159
|
+
**Branch:** {HEAD} → {BASE}
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
### Findings
|
|
164
|
+
|
|
165
|
+
[TRANSFORMED FINDINGS HERE]
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
### Summary
|
|
170
|
+
|
|
171
|
+
**Critical:** {COUNT} | **Moderate:** {COUNT} | **Minor:** {COUNT}
|
|
172
|
+
|
|
173
|
+
[BINARY_FILES_NOTE if any]
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
_Review generated by Raven's Verdict. LLM-produced analysis - findings may be incorrect or lack context. Verify before acting._
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
</tone-transformation>
|
|
181
|
+
|
|
182
|
+
<post-review>
|
|
183
|
+
### 3.1 Preview
|
|
184
|
+
|
|
185
|
+
Display the complete transformed review to the user.
|
|
186
|
+
|
|
187
|
+
```
|
|
188
|
+
══════════════════════════════════════════════════════
|
|
189
|
+
PREVIEW - This will be posted to PR #{PR_NUMBER}
|
|
190
|
+
══════════════════════════════════════════════════════
|
|
191
|
+
|
|
192
|
+
[FULL REVIEW CONTENT]
|
|
193
|
+
|
|
194
|
+
══════════════════════════════════════════════════════
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### 3.2 Confirm
|
|
198
|
+
|
|
199
|
+
Ask user for explicit confirmation:
|
|
200
|
+
|
|
201
|
+
> **Ready to post this review to PR #{PR_NUMBER}?**
|
|
202
|
+
>
|
|
203
|
+
> **[y] Yes** - Post as comment
|
|
204
|
+
> **[n] No** - Abort, do not post
|
|
205
|
+
> **[e] Edit** - Let me modify before posting
|
|
206
|
+
> **[s] Save only** - Save locally, don't post
|
|
207
|
+
|
|
208
|
+
### 3.3 Post or Save
|
|
209
|
+
|
|
210
|
+
**Write review to a temp file, then post:**
|
|
211
|
+
|
|
212
|
+
1. Write the review content to a temp file with a unique name (include PR number to avoid collisions)
|
|
213
|
+
2. Post using `gh pr comment {PR_NUMBER} [--repo {REPO}] --body-file {path}`
|
|
214
|
+
3. Delete the temp file after successful post
|
|
215
|
+
|
|
216
|
+
Do NOT use heredocs or `echo` - Markdown code blocks will break shell parsing. Use your file writing tool instead.
|
|
217
|
+
|
|
218
|
+
**If auth fails or post fails:**
|
|
219
|
+
|
|
220
|
+
1. Display error prominently:
|
|
221
|
+
|
|
222
|
+
```
|
|
223
|
+
⚠️ FAILED TO POST REVIEW
|
|
224
|
+
Error: {ERROR_MESSAGE}
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
2. Keep the temp file and tell the user where it is, so they can post manually with:
|
|
228
|
+
`gh pr comment {PR_NUMBER} [--repo {REPO}] --body-file {path}`
|
|
229
|
+
|
|
230
|
+
**If save only (s):**
|
|
231
|
+
|
|
232
|
+
Keep the temp file and inform user of location.
|
|
233
|
+
|
|
234
|
+
</post-review>
|
|
235
|
+
|
|
236
|
+
<notes>
|
|
237
|
+
- The "cynical asshole" phase is internal only - never posted
|
|
238
|
+
- Tone transform MUST happen before any external output
|
|
239
|
+
- When in doubt, ask the user - never assume
|
|
240
|
+
- If you're unsure about severity, err toward higher severity
|
|
241
|
+
- If you're unsure about confidence, be honest and use Medium or Low
|
|
242
|
+
</notes>
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration script to convert relative paths to absolute paths in custom module manifests
|
|
3
|
+
* This should be run once to update existing installations
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const fs = require('fs-extra');
|
|
7
|
+
const path = require('node:path');
|
|
8
|
+
const yaml = require('yaml');
|
|
9
|
+
const chalk = require('chalk');
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Find BMAD directory in project
|
|
13
|
+
*/
|
|
14
|
+
function findBmadDir(projectDir = process.cwd()) {
|
|
15
|
+
const possibleNames = ['_bmad'];
|
|
16
|
+
|
|
17
|
+
for (const name of possibleNames) {
|
|
18
|
+
const bmadDir = path.join(projectDir, name);
|
|
19
|
+
if (fs.existsSync(bmadDir)) {
|
|
20
|
+
return bmadDir;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Update manifest to use absolute paths
|
|
29
|
+
*/
|
|
30
|
+
async function updateManifest(manifestPath, projectRoot) {
|
|
31
|
+
console.log(chalk.cyan(`\nUpdating manifest: ${manifestPath}`));
|
|
32
|
+
|
|
33
|
+
const content = await fs.readFile(manifestPath, 'utf8');
|
|
34
|
+
const manifest = yaml.parse(content);
|
|
35
|
+
|
|
36
|
+
if (!manifest.customModules || manifest.customModules.length === 0) {
|
|
37
|
+
console.log(chalk.dim(' No custom modules found'));
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
let updated = false;
|
|
42
|
+
|
|
43
|
+
for (const customModule of manifest.customModules) {
|
|
44
|
+
if (customModule.relativePath && !customModule.sourcePath) {
|
|
45
|
+
// Convert relative path to absolute
|
|
46
|
+
const absolutePath = path.resolve(projectRoot, customModule.relativePath);
|
|
47
|
+
customModule.sourcePath = absolutePath;
|
|
48
|
+
|
|
49
|
+
// Remove the old relativePath
|
|
50
|
+
delete customModule.relativePath;
|
|
51
|
+
|
|
52
|
+
console.log(chalk.green(` ✓ Updated ${customModule.id}: ${customModule.relativePath} → ${absolutePath}`));
|
|
53
|
+
updated = true;
|
|
54
|
+
} else if (customModule.sourcePath && !path.isAbsolute(customModule.sourcePath)) {
|
|
55
|
+
// Source path exists but is not absolute
|
|
56
|
+
const absolutePath = path.resolve(customModule.sourcePath);
|
|
57
|
+
customModule.sourcePath = absolutePath;
|
|
58
|
+
|
|
59
|
+
console.log(chalk.green(` ✓ Updated ${customModule.id}: ${customModule.sourcePath} → ${absolutePath}`));
|
|
60
|
+
updated = true;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (updated) {
|
|
65
|
+
// Write back the updated manifest
|
|
66
|
+
const yamlStr = yaml.dump(manifest, {
|
|
67
|
+
indent: 2,
|
|
68
|
+
lineWidth: -1,
|
|
69
|
+
noRefs: true,
|
|
70
|
+
sortKeys: false,
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
await fs.writeFile(manifestPath, yamlStr);
|
|
74
|
+
console.log(chalk.green(' Manifest updated successfully'));
|
|
75
|
+
} else {
|
|
76
|
+
console.log(chalk.dim(' All paths already absolute'));
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return updated;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Main migration function
|
|
84
|
+
*/
|
|
85
|
+
async function migrate(directory) {
|
|
86
|
+
const projectRoot = path.resolve(directory || process.cwd());
|
|
87
|
+
const bmadDir = findBmadDir(projectRoot);
|
|
88
|
+
|
|
89
|
+
if (!bmadDir) {
|
|
90
|
+
console.error(chalk.red('✗ No BMAD installation found in directory'));
|
|
91
|
+
process.exit(1);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
console.log(chalk.blue.bold('🔄 BMAD Custom Module Path Migration'));
|
|
95
|
+
console.log(chalk.dim(`Project: ${projectRoot}`));
|
|
96
|
+
console.log(chalk.dim(`BMAD Directory: ${bmadDir}`));
|
|
97
|
+
|
|
98
|
+
const manifestPath = path.join(bmadDir, '_config', 'manifest.yaml');
|
|
99
|
+
|
|
100
|
+
if (!fs.existsSync(manifestPath)) {
|
|
101
|
+
console.error(chalk.red('✗ No manifest.yaml found'));
|
|
102
|
+
process.exit(1);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const updated = await updateManifest(manifestPath, projectRoot);
|
|
106
|
+
|
|
107
|
+
if (updated) {
|
|
108
|
+
console.log(chalk.green.bold('\n✨ Migration completed successfully!'));
|
|
109
|
+
console.log(chalk.dim('Custom modules now use absolute source paths.'));
|
|
110
|
+
} else {
|
|
111
|
+
console.log(chalk.yellow('\n⚠ No migration needed - paths already absolute'));
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Run migration if called directly
|
|
116
|
+
if (require.main === module) {
|
|
117
|
+
const directory = process.argv[2];
|
|
118
|
+
migrate(directory).catch((error) => {
|
|
119
|
+
console.error(chalk.red('\n✗ Migration failed:'), error.message);
|
|
120
|
+
process.exit(1);
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
module.exports = { migrate };
|