bmad-fh 6.0.0-alpha.052779ef
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 +54 -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 +400 -0
- package/src/core/lib/scope/index.js +30 -0
- package/src/core/lib/scope/scope-context.js +301 -0
- package/src/core/lib/scope/scope-initializer.js +456 -0
- package/src/core/lib/scope/scope-manager.js +512 -0
- package/src/core/lib/scope/scope-migrator.js +434 -0
- package/src/core/lib/scope/scope-sync.js +483 -0
- package/src/core/lib/scope/scope-validator.js +294 -0
- package/src/core/lib/scope/state-lock.js +336 -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 +439 -0
- package/test/test-scope-system.js +781 -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 +273 -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,473 @@
|
|
|
1
|
+
<!-- Powered by BMAD-CORE™ -->
|
|
2
|
+
|
|
3
|
+
# Test Levels Framework
|
|
4
|
+
|
|
5
|
+
Comprehensive guide for determining appropriate test levels (unit, integration, E2E) for different scenarios.
|
|
6
|
+
|
|
7
|
+
## Test Level Decision Matrix
|
|
8
|
+
|
|
9
|
+
### Unit Tests
|
|
10
|
+
|
|
11
|
+
**When to use:**
|
|
12
|
+
|
|
13
|
+
- Testing pure functions and business logic
|
|
14
|
+
- Algorithm correctness
|
|
15
|
+
- Input validation and data transformation
|
|
16
|
+
- Error handling in isolated components
|
|
17
|
+
- Complex calculations or state machines
|
|
18
|
+
|
|
19
|
+
**Characteristics:**
|
|
20
|
+
|
|
21
|
+
- Fast execution (immediate feedback)
|
|
22
|
+
- No external dependencies (DB, API, file system)
|
|
23
|
+
- Highly maintainable and stable
|
|
24
|
+
- Easy to debug failures
|
|
25
|
+
|
|
26
|
+
**Example scenarios:**
|
|
27
|
+
|
|
28
|
+
```yaml
|
|
29
|
+
unit_test:
|
|
30
|
+
component: 'PriceCalculator'
|
|
31
|
+
scenario: 'Calculate discount with multiple rules'
|
|
32
|
+
justification: 'Complex business logic with multiple branches'
|
|
33
|
+
mock_requirements: 'None - pure function'
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### Integration Tests
|
|
37
|
+
|
|
38
|
+
**When to use:**
|
|
39
|
+
|
|
40
|
+
- Component interaction verification
|
|
41
|
+
- Database operations and transactions
|
|
42
|
+
- API endpoint contracts
|
|
43
|
+
- Service-to-service communication
|
|
44
|
+
- Middleware and interceptor behavior
|
|
45
|
+
|
|
46
|
+
**Characteristics:**
|
|
47
|
+
|
|
48
|
+
- Moderate execution time
|
|
49
|
+
- Tests component boundaries
|
|
50
|
+
- May use test databases or containers
|
|
51
|
+
- Validates system integration points
|
|
52
|
+
|
|
53
|
+
**Example scenarios:**
|
|
54
|
+
|
|
55
|
+
```yaml
|
|
56
|
+
integration_test:
|
|
57
|
+
components: ['UserService', 'AuthRepository']
|
|
58
|
+
scenario: 'Create user with role assignment'
|
|
59
|
+
justification: 'Critical data flow between service and persistence'
|
|
60
|
+
test_environment: 'In-memory database'
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### End-to-End Tests
|
|
64
|
+
|
|
65
|
+
**When to use:**
|
|
66
|
+
|
|
67
|
+
- Critical user journeys
|
|
68
|
+
- Cross-system workflows
|
|
69
|
+
- Visual regression testing
|
|
70
|
+
- Compliance and regulatory requirements
|
|
71
|
+
- Final validation before release
|
|
72
|
+
|
|
73
|
+
**Characteristics:**
|
|
74
|
+
|
|
75
|
+
- Slower execution
|
|
76
|
+
- Tests complete workflows
|
|
77
|
+
- Requires full environment setup
|
|
78
|
+
- Most realistic but most brittle
|
|
79
|
+
|
|
80
|
+
**Example scenarios:**
|
|
81
|
+
|
|
82
|
+
```yaml
|
|
83
|
+
e2e_test:
|
|
84
|
+
journey: 'Complete checkout process'
|
|
85
|
+
scenario: 'User purchases with saved payment method'
|
|
86
|
+
justification: 'Revenue-critical path requiring full validation'
|
|
87
|
+
environment: 'Staging with test payment gateway'
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Test Level Selection Rules
|
|
91
|
+
|
|
92
|
+
### Favor Unit Tests When:
|
|
93
|
+
|
|
94
|
+
- Logic can be isolated
|
|
95
|
+
- No side effects involved
|
|
96
|
+
- Fast feedback needed
|
|
97
|
+
- High cyclomatic complexity
|
|
98
|
+
|
|
99
|
+
### Favor Integration Tests When:
|
|
100
|
+
|
|
101
|
+
- Testing persistence layer
|
|
102
|
+
- Validating service contracts
|
|
103
|
+
- Testing middleware/interceptors
|
|
104
|
+
- Component boundaries critical
|
|
105
|
+
|
|
106
|
+
### Favor E2E Tests When:
|
|
107
|
+
|
|
108
|
+
- User-facing critical paths
|
|
109
|
+
- Multi-system interactions
|
|
110
|
+
- Regulatory compliance scenarios
|
|
111
|
+
- Visual regression important
|
|
112
|
+
|
|
113
|
+
## Anti-patterns to Avoid
|
|
114
|
+
|
|
115
|
+
- E2E testing for business logic validation
|
|
116
|
+
- Unit testing framework behavior
|
|
117
|
+
- Integration testing third-party libraries
|
|
118
|
+
- Duplicate coverage across levels
|
|
119
|
+
|
|
120
|
+
## Duplicate Coverage Guard
|
|
121
|
+
|
|
122
|
+
**Before adding any test, check:**
|
|
123
|
+
|
|
124
|
+
1. Is this already tested at a lower level?
|
|
125
|
+
2. Can a unit test cover this instead of integration?
|
|
126
|
+
3. Can an integration test cover this instead of E2E?
|
|
127
|
+
|
|
128
|
+
**Coverage overlap is only acceptable when:**
|
|
129
|
+
|
|
130
|
+
- Testing different aspects (unit: logic, integration: interaction, e2e: user experience)
|
|
131
|
+
- Critical paths requiring defense in depth
|
|
132
|
+
- Regression prevention for previously broken functionality
|
|
133
|
+
|
|
134
|
+
## Test Naming Conventions
|
|
135
|
+
|
|
136
|
+
- Unit: `test_{component}_{scenario}`
|
|
137
|
+
- Integration: `test_{flow}_{interaction}`
|
|
138
|
+
- E2E: `test_{journey}_{outcome}`
|
|
139
|
+
|
|
140
|
+
## Test ID Format
|
|
141
|
+
|
|
142
|
+
`{EPIC}.{STORY}-{LEVEL}-{SEQ}`
|
|
143
|
+
|
|
144
|
+
Examples:
|
|
145
|
+
|
|
146
|
+
- `1.3-UNIT-001`
|
|
147
|
+
- `1.3-INT-002`
|
|
148
|
+
- `1.3-E2E-001`
|
|
149
|
+
|
|
150
|
+
## Real Code Examples
|
|
151
|
+
|
|
152
|
+
### Example 1: E2E Test (Full User Journey)
|
|
153
|
+
|
|
154
|
+
**Scenario**: User logs in, navigates to dashboard, and places an order.
|
|
155
|
+
|
|
156
|
+
```typescript
|
|
157
|
+
// tests/e2e/checkout-flow.spec.ts
|
|
158
|
+
import { test, expect } from '@playwright/test';
|
|
159
|
+
import { createUser, createProduct } from '../test-utils/factories';
|
|
160
|
+
|
|
161
|
+
test.describe('Checkout Flow', () => {
|
|
162
|
+
test('user can complete purchase with saved payment method', async ({ page, apiRequest }) => {
|
|
163
|
+
// Setup: Seed data via API (fast!)
|
|
164
|
+
const user = createUser({ email: 'buyer@example.com', hasSavedCard: true });
|
|
165
|
+
const product = createProduct({ name: 'Widget', price: 29.99, stock: 10 });
|
|
166
|
+
|
|
167
|
+
await apiRequest.post('/api/users', { data: user });
|
|
168
|
+
await apiRequest.post('/api/products', { data: product });
|
|
169
|
+
|
|
170
|
+
// Network-first: Intercept BEFORE action
|
|
171
|
+
const loginPromise = page.waitForResponse('**/api/auth/login');
|
|
172
|
+
const cartPromise = page.waitForResponse('**/api/cart');
|
|
173
|
+
const orderPromise = page.waitForResponse('**/api/orders');
|
|
174
|
+
|
|
175
|
+
// Step 1: Login
|
|
176
|
+
await page.goto('/login');
|
|
177
|
+
await page.fill('[data-testid="email"]', user.email);
|
|
178
|
+
await page.fill('[data-testid="password"]', 'password123');
|
|
179
|
+
await page.click('[data-testid="login-button"]');
|
|
180
|
+
await loginPromise;
|
|
181
|
+
|
|
182
|
+
// Assert: Dashboard visible
|
|
183
|
+
await expect(page).toHaveURL('/dashboard');
|
|
184
|
+
await expect(page.getByText(`Welcome, ${user.name}`)).toBeVisible();
|
|
185
|
+
|
|
186
|
+
// Step 2: Add product to cart
|
|
187
|
+
await page.goto(`/products/${product.id}`);
|
|
188
|
+
await page.click('[data-testid="add-to-cart"]');
|
|
189
|
+
await cartPromise;
|
|
190
|
+
await expect(page.getByText('Added to cart')).toBeVisible();
|
|
191
|
+
|
|
192
|
+
// Step 3: Checkout with saved payment
|
|
193
|
+
await page.goto('/checkout');
|
|
194
|
+
await expect(page.getByText('Visa ending in 1234')).toBeVisible(); // Saved card
|
|
195
|
+
await page.click('[data-testid="use-saved-card"]');
|
|
196
|
+
await page.click('[data-testid="place-order"]');
|
|
197
|
+
await orderPromise;
|
|
198
|
+
|
|
199
|
+
// Assert: Order confirmation
|
|
200
|
+
await expect(page.getByText('Order Confirmed')).toBeVisible();
|
|
201
|
+
await expect(page.getByText(/Order #\d+/)).toBeVisible();
|
|
202
|
+
await expect(page.getByText('$29.99')).toBeVisible();
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
**Key Points (E2E)**:
|
|
208
|
+
|
|
209
|
+
- Tests complete user journey across multiple pages
|
|
210
|
+
- API setup for data (fast), UI for assertions (user-centric)
|
|
211
|
+
- Network-first interception to prevent flakiness
|
|
212
|
+
- Validates critical revenue path end-to-end
|
|
213
|
+
|
|
214
|
+
### Example 2: Integration Test (API/Service Layer)
|
|
215
|
+
|
|
216
|
+
**Scenario**: UserService creates user and assigns role via AuthRepository.
|
|
217
|
+
|
|
218
|
+
```typescript
|
|
219
|
+
// tests/integration/user-service.spec.ts
|
|
220
|
+
import { test, expect } from '@playwright/test';
|
|
221
|
+
import { createUser } from '../test-utils/factories';
|
|
222
|
+
|
|
223
|
+
test.describe('UserService Integration', () => {
|
|
224
|
+
test('should create user with admin role via API', async ({ request }) => {
|
|
225
|
+
const userData = createUser({ role: 'admin' });
|
|
226
|
+
|
|
227
|
+
// Direct API call (no UI)
|
|
228
|
+
const response = await request.post('/api/users', {
|
|
229
|
+
data: userData,
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
expect(response.status()).toBe(201);
|
|
233
|
+
|
|
234
|
+
const createdUser = await response.json();
|
|
235
|
+
expect(createdUser.id).toBeTruthy();
|
|
236
|
+
expect(createdUser.email).toBe(userData.email);
|
|
237
|
+
expect(createdUser.role).toBe('admin');
|
|
238
|
+
|
|
239
|
+
// Verify database state
|
|
240
|
+
const getResponse = await request.get(`/api/users/${createdUser.id}`);
|
|
241
|
+
expect(getResponse.status()).toBe(200);
|
|
242
|
+
|
|
243
|
+
const fetchedUser = await getResponse.json();
|
|
244
|
+
expect(fetchedUser.role).toBe('admin');
|
|
245
|
+
expect(fetchedUser.permissions).toContain('user:delete');
|
|
246
|
+
expect(fetchedUser.permissions).toContain('user:update');
|
|
247
|
+
|
|
248
|
+
// Cleanup
|
|
249
|
+
await request.delete(`/api/users/${createdUser.id}`);
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
test('should validate email uniqueness constraint', async ({ request }) => {
|
|
253
|
+
const userData = createUser({ email: 'duplicate@example.com' });
|
|
254
|
+
|
|
255
|
+
// Create first user
|
|
256
|
+
const response1 = await request.post('/api/users', { data: userData });
|
|
257
|
+
expect(response1.status()).toBe(201);
|
|
258
|
+
|
|
259
|
+
const user1 = await response1.json();
|
|
260
|
+
|
|
261
|
+
// Attempt duplicate email
|
|
262
|
+
const response2 = await request.post('/api/users', { data: userData });
|
|
263
|
+
expect(response2.status()).toBe(409); // Conflict
|
|
264
|
+
const error = await response2.json();
|
|
265
|
+
expect(error.message).toContain('Email already exists');
|
|
266
|
+
|
|
267
|
+
// Cleanup
|
|
268
|
+
await request.delete(`/api/users/${user1.id}`);
|
|
269
|
+
});
|
|
270
|
+
});
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
**Key Points (Integration)**:
|
|
274
|
+
|
|
275
|
+
- Tests service layer + database interaction
|
|
276
|
+
- No UI involved—pure API validation
|
|
277
|
+
- Business logic focus (role assignment, constraints)
|
|
278
|
+
- Faster than E2E, more realistic than unit tests
|
|
279
|
+
|
|
280
|
+
### Example 3: Component Test (Isolated UI Component)
|
|
281
|
+
|
|
282
|
+
**Scenario**: Test button component in isolation with props and user interactions.
|
|
283
|
+
|
|
284
|
+
```typescript
|
|
285
|
+
// src/components/Button.cy.tsx (Cypress Component Test)
|
|
286
|
+
import { Button } from './Button';
|
|
287
|
+
|
|
288
|
+
describe('Button Component', () => {
|
|
289
|
+
it('should render with correct label', () => {
|
|
290
|
+
cy.mount(<Button label="Click Me" />);
|
|
291
|
+
cy.contains('Click Me').should('be.visible');
|
|
292
|
+
});
|
|
293
|
+
|
|
294
|
+
it('should call onClick handler when clicked', () => {
|
|
295
|
+
const onClickSpy = cy.stub().as('onClick');
|
|
296
|
+
cy.mount(<Button label="Submit" onClick={onClickSpy} />);
|
|
297
|
+
|
|
298
|
+
cy.get('button').click();
|
|
299
|
+
cy.get('@onClick').should('have.been.calledOnce');
|
|
300
|
+
});
|
|
301
|
+
|
|
302
|
+
it('should be disabled when disabled prop is true', () => {
|
|
303
|
+
cy.mount(<Button label="Disabled" disabled={true} />);
|
|
304
|
+
cy.get('button').should('be.disabled');
|
|
305
|
+
cy.get('button').should('have.attr', 'aria-disabled', 'true');
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
it('should show loading spinner when loading', () => {
|
|
309
|
+
cy.mount(<Button label="Loading" loading={true} />);
|
|
310
|
+
cy.get('[data-testid="spinner"]').should('be.visible');
|
|
311
|
+
cy.get('button').should('be.disabled');
|
|
312
|
+
});
|
|
313
|
+
|
|
314
|
+
it('should apply variant styles correctly', () => {
|
|
315
|
+
cy.mount(<Button label="Primary" variant="primary" />);
|
|
316
|
+
cy.get('button').should('have.class', 'btn-primary');
|
|
317
|
+
|
|
318
|
+
cy.mount(<Button label="Secondary" variant="secondary" />);
|
|
319
|
+
cy.get('button').should('have.class', 'btn-secondary');
|
|
320
|
+
});
|
|
321
|
+
});
|
|
322
|
+
|
|
323
|
+
// Playwright Component Test equivalent
|
|
324
|
+
import { test, expect } from '@playwright/experimental-ct-react';
|
|
325
|
+
import { Button } from './Button';
|
|
326
|
+
|
|
327
|
+
test.describe('Button Component', () => {
|
|
328
|
+
test('should call onClick handler when clicked', async ({ mount }) => {
|
|
329
|
+
let clicked = false;
|
|
330
|
+
const component = await mount(
|
|
331
|
+
<Button label="Submit" onClick={() => { clicked = true; }} />
|
|
332
|
+
);
|
|
333
|
+
|
|
334
|
+
await component.getByRole('button').click();
|
|
335
|
+
expect(clicked).toBe(true);
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
test('should be disabled when loading', async ({ mount }) => {
|
|
339
|
+
const component = await mount(<Button label="Loading" loading={true} />);
|
|
340
|
+
await expect(component.getByRole('button')).toBeDisabled();
|
|
341
|
+
await expect(component.getByTestId('spinner')).toBeVisible();
|
|
342
|
+
});
|
|
343
|
+
});
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
**Key Points (Component)**:
|
|
347
|
+
|
|
348
|
+
- Tests UI component in isolation (no full app)
|
|
349
|
+
- Props + user interactions + visual states
|
|
350
|
+
- Faster than E2E, more realistic than unit tests for UI
|
|
351
|
+
- Great for design system components
|
|
352
|
+
|
|
353
|
+
### Example 4: Unit Test (Pure Function)
|
|
354
|
+
|
|
355
|
+
**Scenario**: Test pure business logic function without framework dependencies.
|
|
356
|
+
|
|
357
|
+
```typescript
|
|
358
|
+
// src/utils/price-calculator.test.ts (Jest/Vitest)
|
|
359
|
+
import { calculateDiscount, applyTaxes, calculateTotal } from './price-calculator';
|
|
360
|
+
|
|
361
|
+
describe('PriceCalculator', () => {
|
|
362
|
+
describe('calculateDiscount', () => {
|
|
363
|
+
it('should apply percentage discount correctly', () => {
|
|
364
|
+
const result = calculateDiscount(100, { type: 'percentage', value: 20 });
|
|
365
|
+
expect(result).toBe(80);
|
|
366
|
+
});
|
|
367
|
+
|
|
368
|
+
it('should apply fixed amount discount correctly', () => {
|
|
369
|
+
const result = calculateDiscount(100, { type: 'fixed', value: 15 });
|
|
370
|
+
expect(result).toBe(85);
|
|
371
|
+
});
|
|
372
|
+
|
|
373
|
+
it('should not apply discount below zero', () => {
|
|
374
|
+
const result = calculateDiscount(10, { type: 'fixed', value: 20 });
|
|
375
|
+
expect(result).toBe(0);
|
|
376
|
+
});
|
|
377
|
+
|
|
378
|
+
it('should handle no discount', () => {
|
|
379
|
+
const result = calculateDiscount(100, { type: 'none', value: 0 });
|
|
380
|
+
expect(result).toBe(100);
|
|
381
|
+
});
|
|
382
|
+
});
|
|
383
|
+
|
|
384
|
+
describe('applyTaxes', () => {
|
|
385
|
+
it('should calculate tax correctly for US', () => {
|
|
386
|
+
const result = applyTaxes(100, { country: 'US', rate: 0.08 });
|
|
387
|
+
expect(result).toBe(108);
|
|
388
|
+
});
|
|
389
|
+
|
|
390
|
+
it('should calculate tax correctly for EU (VAT)', () => {
|
|
391
|
+
const result = applyTaxes(100, { country: 'DE', rate: 0.19 });
|
|
392
|
+
expect(result).toBe(119);
|
|
393
|
+
});
|
|
394
|
+
|
|
395
|
+
it('should handle zero tax rate', () => {
|
|
396
|
+
const result = applyTaxes(100, { country: 'US', rate: 0 });
|
|
397
|
+
expect(result).toBe(100);
|
|
398
|
+
});
|
|
399
|
+
});
|
|
400
|
+
|
|
401
|
+
describe('calculateTotal', () => {
|
|
402
|
+
it('should calculate total with discount and taxes', () => {
|
|
403
|
+
const items = [
|
|
404
|
+
{ price: 50, quantity: 2 }, // 100
|
|
405
|
+
{ price: 30, quantity: 1 }, // 30
|
|
406
|
+
];
|
|
407
|
+
const discount = { type: 'percentage', value: 10 }; // -13
|
|
408
|
+
const tax = { country: 'US', rate: 0.08 }; // +9.36
|
|
409
|
+
|
|
410
|
+
const result = calculateTotal(items, discount, tax);
|
|
411
|
+
expect(result).toBeCloseTo(126.36, 2);
|
|
412
|
+
});
|
|
413
|
+
|
|
414
|
+
it('should handle empty items array', () => {
|
|
415
|
+
const result = calculateTotal([], { type: 'none', value: 0 }, { country: 'US', rate: 0 });
|
|
416
|
+
expect(result).toBe(0);
|
|
417
|
+
});
|
|
418
|
+
|
|
419
|
+
it('should calculate correctly without discount or tax', () => {
|
|
420
|
+
const items = [{ price: 25, quantity: 4 }];
|
|
421
|
+
const result = calculateTotal(items, { type: 'none', value: 0 }, { country: 'US', rate: 0 });
|
|
422
|
+
expect(result).toBe(100);
|
|
423
|
+
});
|
|
424
|
+
});
|
|
425
|
+
});
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
**Key Points (Unit)**:
|
|
429
|
+
|
|
430
|
+
- Pure function testing—no framework dependencies
|
|
431
|
+
- Fast execution (milliseconds)
|
|
432
|
+
- Edge case coverage (zero, negative, empty inputs)
|
|
433
|
+
- High cyclomatic complexity handled at unit level
|
|
434
|
+
|
|
435
|
+
## When to Use Which Level
|
|
436
|
+
|
|
437
|
+
| Scenario | Unit | Integration | E2E |
|
|
438
|
+
| ---------------------- | ------------- | ----------------- | ------------- |
|
|
439
|
+
| Pure business logic | ✅ Primary | ❌ Overkill | ❌ Overkill |
|
|
440
|
+
| Database operations | ❌ Can't test | ✅ Primary | ❌ Overkill |
|
|
441
|
+
| API contracts | ❌ Can't test | ✅ Primary | ⚠️ Supplement |
|
|
442
|
+
| User journeys | ❌ Can't test | ❌ Can't test | ✅ Primary |
|
|
443
|
+
| Component props/events | ✅ Partial | ⚠️ Component test | ❌ Overkill |
|
|
444
|
+
| Visual regression | ❌ Can't test | ⚠️ Component test | ✅ Primary |
|
|
445
|
+
| Error handling (logic) | ✅ Primary | ⚠️ Integration | ❌ Overkill |
|
|
446
|
+
| Error handling (UI) | ❌ Partial | ⚠️ Component test | ✅ Primary |
|
|
447
|
+
|
|
448
|
+
## Anti-Pattern Examples
|
|
449
|
+
|
|
450
|
+
**❌ BAD: E2E test for business logic**
|
|
451
|
+
|
|
452
|
+
```typescript
|
|
453
|
+
// DON'T DO THIS
|
|
454
|
+
test('calculate discount via UI', async ({ page }) => {
|
|
455
|
+
await page.goto('/calculator');
|
|
456
|
+
await page.fill('[data-testid="price"]', '100');
|
|
457
|
+
await page.fill('[data-testid="discount"]', '20');
|
|
458
|
+
await page.click('[data-testid="calculate"]');
|
|
459
|
+
await expect(page.getByText('$80')).toBeVisible();
|
|
460
|
+
});
|
|
461
|
+
// Problem: Slow, brittle, tests logic that should be unit tested
|
|
462
|
+
```
|
|
463
|
+
|
|
464
|
+
**✅ GOOD: Unit test for business logic**
|
|
465
|
+
|
|
466
|
+
```typescript
|
|
467
|
+
test('calculate discount', () => {
|
|
468
|
+
expect(calculateDiscount(100, 20)).toBe(80);
|
|
469
|
+
});
|
|
470
|
+
// Fast, reliable, isolated
|
|
471
|
+
```
|
|
472
|
+
|
|
473
|
+
_Source: Murat Testing Philosophy (test pyramid), existing test-levels-framework.md structure._
|