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,730 @@
|
|
|
1
|
+
# Playwright Configuration Guardrails
|
|
2
|
+
|
|
3
|
+
## Principle
|
|
4
|
+
|
|
5
|
+
Load environment configs via a central map (`envConfigMap`), standardize timeouts (action 15s, navigation 30s, expect 10s, test 60s), emit HTML + JUnit reporters, and store artifacts under `test-results/` for CI upload. Keep `.env.example`, `.nvmrc`, and browser dependencies versioned so local and CI runs stay aligned.
|
|
6
|
+
|
|
7
|
+
## Rationale
|
|
8
|
+
|
|
9
|
+
Environment-specific configuration prevents hardcoded URLs, timeouts, and credentials from leaking into tests. A central config map with fail-fast validation catches missing environments early. Standardized timeouts reduce flakiness while remaining long enough for real-world network conditions. Consistent artifact storage (`test-results/`, `playwright-report/`) enables CI pipelines to upload failure evidence automatically. Versioned dependencies (`.nvmrc`, `package.json` browser versions) eliminate "works on my machine" issues between local and CI environments.
|
|
10
|
+
|
|
11
|
+
## Pattern Examples
|
|
12
|
+
|
|
13
|
+
### Example 1: Environment-Based Configuration
|
|
14
|
+
|
|
15
|
+
**Context**: When testing against multiple environments (local, staging, production), use a central config map that loads environment-specific settings and fails fast if `TEST_ENV` is invalid.
|
|
16
|
+
|
|
17
|
+
**Implementation**:
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
// playwright.config.ts - Central config loader
|
|
21
|
+
import { config as dotenvConfig } from 'dotenv';
|
|
22
|
+
import path from 'path';
|
|
23
|
+
|
|
24
|
+
// Load .env from project root
|
|
25
|
+
dotenvConfig({
|
|
26
|
+
path: path.resolve(__dirname, '../../.env'),
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
// Central environment config map
|
|
30
|
+
const envConfigMap = {
|
|
31
|
+
local: require('./playwright/config/local.config').default,
|
|
32
|
+
staging: require('./playwright/config/staging.config').default,
|
|
33
|
+
production: require('./playwright/config/production.config').default,
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
const environment = process.env.TEST_ENV || 'local';
|
|
37
|
+
|
|
38
|
+
// Fail fast if environment not supported
|
|
39
|
+
if (!Object.keys(envConfigMap).includes(environment)) {
|
|
40
|
+
console.error(`❌ No configuration found for environment: ${environment}`);
|
|
41
|
+
console.error(` Available environments: ${Object.keys(envConfigMap).join(', ')}`);
|
|
42
|
+
process.exit(1);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
console.log(`✅ Running tests against: ${environment.toUpperCase()}`);
|
|
46
|
+
|
|
47
|
+
export default envConfigMap[environment as keyof typeof envConfigMap];
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
```typescript
|
|
51
|
+
// playwright/config/base.config.ts - Shared base configuration
|
|
52
|
+
import { defineConfig } from '@playwright/test';
|
|
53
|
+
import path from 'path';
|
|
54
|
+
|
|
55
|
+
export const baseConfig = defineConfig({
|
|
56
|
+
testDir: path.resolve(__dirname, '../tests'),
|
|
57
|
+
outputDir: path.resolve(__dirname, '../../test-results'),
|
|
58
|
+
fullyParallel: true,
|
|
59
|
+
forbidOnly: !!process.env.CI,
|
|
60
|
+
retries: process.env.CI ? 2 : 0,
|
|
61
|
+
workers: process.env.CI ? 1 : undefined,
|
|
62
|
+
reporter: [
|
|
63
|
+
['html', { outputFolder: 'playwright-report', open: 'never' }],
|
|
64
|
+
['junit', { outputFile: 'test-results/results.xml' }],
|
|
65
|
+
['list'],
|
|
66
|
+
],
|
|
67
|
+
use: {
|
|
68
|
+
actionTimeout: 15000,
|
|
69
|
+
navigationTimeout: 30000,
|
|
70
|
+
trace: 'on-first-retry',
|
|
71
|
+
screenshot: 'only-on-failure',
|
|
72
|
+
video: 'retain-on-failure',
|
|
73
|
+
},
|
|
74
|
+
globalSetup: path.resolve(__dirname, '../support/global-setup.ts'),
|
|
75
|
+
timeout: 60000,
|
|
76
|
+
expect: { timeout: 10000 },
|
|
77
|
+
});
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
```typescript
|
|
81
|
+
// playwright/config/local.config.ts - Local environment
|
|
82
|
+
import { defineConfig } from '@playwright/test';
|
|
83
|
+
import { baseConfig } from './base.config';
|
|
84
|
+
|
|
85
|
+
export default defineConfig({
|
|
86
|
+
...baseConfig,
|
|
87
|
+
use: {
|
|
88
|
+
...baseConfig.use,
|
|
89
|
+
baseURL: 'http://localhost:3000',
|
|
90
|
+
video: 'off', // No video locally for speed
|
|
91
|
+
},
|
|
92
|
+
webServer: {
|
|
93
|
+
command: 'npm run dev',
|
|
94
|
+
url: 'http://localhost:3000',
|
|
95
|
+
reuseExistingServer: !process.env.CI,
|
|
96
|
+
timeout: 120000,
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
```typescript
|
|
102
|
+
// playwright/config/staging.config.ts - Staging environment
|
|
103
|
+
import { defineConfig } from '@playwright/test';
|
|
104
|
+
import { baseConfig } from './base.config';
|
|
105
|
+
|
|
106
|
+
export default defineConfig({
|
|
107
|
+
...baseConfig,
|
|
108
|
+
use: {
|
|
109
|
+
...baseConfig.use,
|
|
110
|
+
baseURL: 'https://staging.example.com',
|
|
111
|
+
ignoreHTTPSErrors: true, // Allow self-signed certs in staging
|
|
112
|
+
},
|
|
113
|
+
});
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
```typescript
|
|
117
|
+
// playwright/config/production.config.ts - Production environment
|
|
118
|
+
import { defineConfig } from '@playwright/test';
|
|
119
|
+
import { baseConfig } from './base.config';
|
|
120
|
+
|
|
121
|
+
export default defineConfig({
|
|
122
|
+
...baseConfig,
|
|
123
|
+
retries: 3, // More retries in production
|
|
124
|
+
use: {
|
|
125
|
+
...baseConfig.use,
|
|
126
|
+
baseURL: 'https://example.com',
|
|
127
|
+
video: 'on', // Always record production failures
|
|
128
|
+
},
|
|
129
|
+
});
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
# .env.example - Template for developers
|
|
134
|
+
TEST_ENV=local
|
|
135
|
+
API_KEY=your_api_key_here
|
|
136
|
+
DATABASE_URL=postgresql://localhost:5432/test_db
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
**Key Points**:
|
|
140
|
+
|
|
141
|
+
- Central `envConfigMap` prevents environment misconfiguration
|
|
142
|
+
- Fail-fast validation with clear error message (available envs listed)
|
|
143
|
+
- Base config defines shared settings, environment configs override
|
|
144
|
+
- `.env.example` provides template for required secrets
|
|
145
|
+
- `TEST_ENV=local` as default for local development
|
|
146
|
+
- Production config increases retries and enables video recording
|
|
147
|
+
|
|
148
|
+
### Example 2: Timeout Standards
|
|
149
|
+
|
|
150
|
+
**Context**: When tests fail due to inconsistent timeout settings, standardize timeouts across all tests: action 15s, navigation 30s, expect 10s, test 60s. Expose overrides through fixtures rather than inline literals.
|
|
151
|
+
|
|
152
|
+
**Implementation**:
|
|
153
|
+
|
|
154
|
+
```typescript
|
|
155
|
+
// playwright/config/base.config.ts - Standardized timeouts
|
|
156
|
+
import { defineConfig } from '@playwright/test';
|
|
157
|
+
|
|
158
|
+
export default defineConfig({
|
|
159
|
+
// Global test timeout: 60 seconds
|
|
160
|
+
timeout: 60000,
|
|
161
|
+
|
|
162
|
+
use: {
|
|
163
|
+
// Action timeout: 15 seconds (click, fill, etc.)
|
|
164
|
+
actionTimeout: 15000,
|
|
165
|
+
|
|
166
|
+
// Navigation timeout: 30 seconds (page.goto, page.reload)
|
|
167
|
+
navigationTimeout: 30000,
|
|
168
|
+
},
|
|
169
|
+
|
|
170
|
+
// Expect timeout: 10 seconds (all assertions)
|
|
171
|
+
expect: {
|
|
172
|
+
timeout: 10000,
|
|
173
|
+
},
|
|
174
|
+
});
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
```typescript
|
|
178
|
+
// playwright/support/fixtures/timeout-fixture.ts - Timeout override fixture
|
|
179
|
+
import { test as base } from '@playwright/test';
|
|
180
|
+
|
|
181
|
+
type TimeoutOptions = {
|
|
182
|
+
extendedTimeout: (timeoutMs: number) => Promise<void>;
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
export const test = base.extend<TimeoutOptions>({
|
|
186
|
+
extendedTimeout: async ({}, use, testInfo) => {
|
|
187
|
+
const originalTimeout = testInfo.timeout;
|
|
188
|
+
|
|
189
|
+
await use(async (timeoutMs: number) => {
|
|
190
|
+
testInfo.setTimeout(timeoutMs);
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
// Restore original timeout after test
|
|
194
|
+
testInfo.setTimeout(originalTimeout);
|
|
195
|
+
},
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
export { expect } from '@playwright/test';
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
```typescript
|
|
202
|
+
// Usage in tests - Standard timeouts (implicit)
|
|
203
|
+
import { test, expect } from '@playwright/test';
|
|
204
|
+
|
|
205
|
+
test('user can log in', async ({ page }) => {
|
|
206
|
+
await page.goto('/login'); // Uses 30s navigation timeout
|
|
207
|
+
await page.fill('[data-testid="email"]', 'test@example.com'); // Uses 15s action timeout
|
|
208
|
+
await page.click('[data-testid="login-button"]'); // Uses 15s action timeout
|
|
209
|
+
|
|
210
|
+
await expect(page.getByText('Welcome')).toBeVisible(); // Uses 10s expect timeout
|
|
211
|
+
});
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
```typescript
|
|
215
|
+
// Usage in tests - Per-test timeout override
|
|
216
|
+
import { test, expect } from '../support/fixtures/timeout-fixture';
|
|
217
|
+
|
|
218
|
+
test('slow data processing operation', async ({ page, extendedTimeout }) => {
|
|
219
|
+
// Override default 60s timeout for this slow test
|
|
220
|
+
await extendedTimeout(180000); // 3 minutes
|
|
221
|
+
|
|
222
|
+
await page.goto('/data-processing');
|
|
223
|
+
await page.click('[data-testid="process-large-file"]');
|
|
224
|
+
|
|
225
|
+
// Wait for long-running operation
|
|
226
|
+
await expect(page.getByText('Processing complete')).toBeVisible({
|
|
227
|
+
timeout: 120000, // 2 minutes for assertion
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
```typescript
|
|
233
|
+
// Per-assertion timeout override (inline)
|
|
234
|
+
test('API returns quickly', async ({ page }) => {
|
|
235
|
+
await page.goto('/dashboard');
|
|
236
|
+
|
|
237
|
+
// Override expect timeout for fast API (reduce flakiness detection)
|
|
238
|
+
await expect(page.getByTestId('user-name')).toBeVisible({ timeout: 5000 }); // 5s instead of 10s
|
|
239
|
+
|
|
240
|
+
// Override expect timeout for slow external API
|
|
241
|
+
await expect(page.getByTestId('weather-widget')).toBeVisible({ timeout: 20000 }); // 20s instead of 10s
|
|
242
|
+
});
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
**Key Points**:
|
|
246
|
+
|
|
247
|
+
- **Standardized timeouts**: action 15s, navigation 30s, expect 10s, test 60s (global defaults)
|
|
248
|
+
- Fixture-based override (`extendedTimeout`) for slow tests (preferred over inline)
|
|
249
|
+
- Per-assertion timeout override via `{ timeout: X }` option (use sparingly)
|
|
250
|
+
- Avoid hard waits (`page.waitForTimeout(3000)`) - use event-based waits instead
|
|
251
|
+
- CI environments may need longer timeouts (handle in environment-specific config)
|
|
252
|
+
|
|
253
|
+
### Example 3: Artifact Output Configuration
|
|
254
|
+
|
|
255
|
+
**Context**: When debugging failures in CI, configure artifacts (screenshots, videos, traces, HTML reports) to be captured on failure and stored in consistent locations for upload.
|
|
256
|
+
|
|
257
|
+
**Implementation**:
|
|
258
|
+
|
|
259
|
+
```typescript
|
|
260
|
+
// playwright.config.ts - Artifact configuration
|
|
261
|
+
import { defineConfig } from '@playwright/test';
|
|
262
|
+
import path from 'path';
|
|
263
|
+
|
|
264
|
+
export default defineConfig({
|
|
265
|
+
// Output directory for test artifacts
|
|
266
|
+
outputDir: path.resolve(__dirname, './test-results'),
|
|
267
|
+
|
|
268
|
+
use: {
|
|
269
|
+
// Screenshot on failure only (saves space)
|
|
270
|
+
screenshot: 'only-on-failure',
|
|
271
|
+
|
|
272
|
+
// Video recording on failure + retry
|
|
273
|
+
video: 'retain-on-failure',
|
|
274
|
+
|
|
275
|
+
// Trace recording on first retry (best debugging data)
|
|
276
|
+
trace: 'on-first-retry',
|
|
277
|
+
},
|
|
278
|
+
|
|
279
|
+
reporter: [
|
|
280
|
+
// HTML report (visual, interactive)
|
|
281
|
+
[
|
|
282
|
+
'html',
|
|
283
|
+
{
|
|
284
|
+
outputFolder: 'playwright-report',
|
|
285
|
+
open: 'never', // Don't auto-open in CI
|
|
286
|
+
},
|
|
287
|
+
],
|
|
288
|
+
|
|
289
|
+
// JUnit XML (CI integration)
|
|
290
|
+
[
|
|
291
|
+
'junit',
|
|
292
|
+
{
|
|
293
|
+
outputFile: 'test-results/results.xml',
|
|
294
|
+
},
|
|
295
|
+
],
|
|
296
|
+
|
|
297
|
+
// List reporter (console output)
|
|
298
|
+
['list'],
|
|
299
|
+
],
|
|
300
|
+
});
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
```typescript
|
|
304
|
+
// playwright/support/fixtures/artifact-fixture.ts - Custom artifact capture
|
|
305
|
+
import { test as base } from '@playwright/test';
|
|
306
|
+
import fs from 'fs';
|
|
307
|
+
import path from 'path';
|
|
308
|
+
|
|
309
|
+
export const test = base.extend({
|
|
310
|
+
// Auto-capture console logs on failure
|
|
311
|
+
page: async ({ page }, use, testInfo) => {
|
|
312
|
+
const logs: string[] = [];
|
|
313
|
+
|
|
314
|
+
page.on('console', (msg) => {
|
|
315
|
+
logs.push(`[${msg.type()}] ${msg.text()}`);
|
|
316
|
+
});
|
|
317
|
+
|
|
318
|
+
await use(page);
|
|
319
|
+
|
|
320
|
+
// Save logs on failure
|
|
321
|
+
if (testInfo.status !== testInfo.expectedStatus) {
|
|
322
|
+
const logsPath = path.join(testInfo.outputDir, 'console-logs.txt');
|
|
323
|
+
fs.writeFileSync(logsPath, logs.join('\n'));
|
|
324
|
+
testInfo.attachments.push({
|
|
325
|
+
name: 'console-logs',
|
|
326
|
+
contentType: 'text/plain',
|
|
327
|
+
path: logsPath,
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
},
|
|
331
|
+
});
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
```yaml
|
|
335
|
+
# .github/workflows/e2e.yml - CI artifact upload
|
|
336
|
+
name: E2E Tests
|
|
337
|
+
on: [push, pull_request]
|
|
338
|
+
|
|
339
|
+
jobs:
|
|
340
|
+
test:
|
|
341
|
+
runs-on: ubuntu-latest
|
|
342
|
+
steps:
|
|
343
|
+
- uses: actions/checkout@v4
|
|
344
|
+
- uses: actions/setup-node@v4
|
|
345
|
+
with:
|
|
346
|
+
node-version-file: '.nvmrc'
|
|
347
|
+
|
|
348
|
+
- name: Install dependencies
|
|
349
|
+
run: npm ci
|
|
350
|
+
|
|
351
|
+
- name: Install Playwright browsers
|
|
352
|
+
run: npx playwright install --with-deps
|
|
353
|
+
|
|
354
|
+
- name: Run tests
|
|
355
|
+
run: npm run test
|
|
356
|
+
env:
|
|
357
|
+
TEST_ENV: staging
|
|
358
|
+
|
|
359
|
+
# Upload test artifacts on failure
|
|
360
|
+
- name: Upload test results
|
|
361
|
+
if: failure()
|
|
362
|
+
uses: actions/upload-artifact@v4
|
|
363
|
+
with:
|
|
364
|
+
name: test-results
|
|
365
|
+
path: test-results/
|
|
366
|
+
retention-days: 30
|
|
367
|
+
|
|
368
|
+
- name: Upload Playwright report
|
|
369
|
+
if: failure()
|
|
370
|
+
uses: actions/upload-artifact@v4
|
|
371
|
+
with:
|
|
372
|
+
name: playwright-report
|
|
373
|
+
path: playwright-report/
|
|
374
|
+
retention-days: 30
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
```typescript
|
|
378
|
+
// Example: Custom screenshot on specific condition
|
|
379
|
+
test('capture screenshot on specific error', async ({ page }) => {
|
|
380
|
+
await page.goto('/checkout');
|
|
381
|
+
|
|
382
|
+
try {
|
|
383
|
+
await page.click('[data-testid="submit-payment"]');
|
|
384
|
+
await expect(page.getByText('Order Confirmed')).toBeVisible();
|
|
385
|
+
} catch (error) {
|
|
386
|
+
// Capture custom screenshot with timestamp
|
|
387
|
+
await page.screenshot({
|
|
388
|
+
path: `test-results/payment-error-${Date.now()}.png`,
|
|
389
|
+
fullPage: true,
|
|
390
|
+
});
|
|
391
|
+
throw error;
|
|
392
|
+
}
|
|
393
|
+
});
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
**Key Points**:
|
|
397
|
+
|
|
398
|
+
- `screenshot: 'only-on-failure'` saves space (not every test)
|
|
399
|
+
- `video: 'retain-on-failure'` captures full flow on failures
|
|
400
|
+
- `trace: 'on-first-retry'` provides deep debugging data (network, DOM, console)
|
|
401
|
+
- HTML report at `playwright-report/` (visual debugging)
|
|
402
|
+
- JUnit XML at `test-results/results.xml` (CI integration)
|
|
403
|
+
- CI uploads artifacts on failure with 30-day retention
|
|
404
|
+
- Custom fixture can capture console logs, network logs, etc.
|
|
405
|
+
|
|
406
|
+
### Example 4: Parallelization Configuration
|
|
407
|
+
|
|
408
|
+
**Context**: When tests run slowly in CI, configure parallelization with worker count, sharding, and fully parallel execution to maximize speed while maintaining stability.
|
|
409
|
+
|
|
410
|
+
**Implementation**:
|
|
411
|
+
|
|
412
|
+
```typescript
|
|
413
|
+
// playwright.config.ts - Parallelization settings
|
|
414
|
+
import { defineConfig } from '@playwright/test';
|
|
415
|
+
import os from 'os';
|
|
416
|
+
|
|
417
|
+
export default defineConfig({
|
|
418
|
+
// Run tests in parallel within single file
|
|
419
|
+
fullyParallel: true,
|
|
420
|
+
|
|
421
|
+
// Worker configuration
|
|
422
|
+
workers: process.env.CI
|
|
423
|
+
? 1 // Serial in CI for stability (or 2 for faster CI)
|
|
424
|
+
: os.cpus().length - 1, // Parallel locally (leave 1 CPU for OS)
|
|
425
|
+
|
|
426
|
+
// Prevent accidentally committed .only() from blocking CI
|
|
427
|
+
forbidOnly: !!process.env.CI,
|
|
428
|
+
|
|
429
|
+
// Retry failed tests in CI
|
|
430
|
+
retries: process.env.CI ? 2 : 0,
|
|
431
|
+
|
|
432
|
+
// Shard configuration (split tests across multiple machines)
|
|
433
|
+
shard:
|
|
434
|
+
process.env.SHARD_INDEX && process.env.SHARD_TOTAL
|
|
435
|
+
? {
|
|
436
|
+
current: parseInt(process.env.SHARD_INDEX, 10),
|
|
437
|
+
total: parseInt(process.env.SHARD_TOTAL, 10),
|
|
438
|
+
}
|
|
439
|
+
: undefined,
|
|
440
|
+
});
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
```yaml
|
|
444
|
+
# .github/workflows/e2e-parallel.yml - Sharded CI execution
|
|
445
|
+
name: E2E Tests (Parallel)
|
|
446
|
+
on: [push, pull_request]
|
|
447
|
+
|
|
448
|
+
jobs:
|
|
449
|
+
test:
|
|
450
|
+
runs-on: ubuntu-latest
|
|
451
|
+
strategy:
|
|
452
|
+
fail-fast: false
|
|
453
|
+
matrix:
|
|
454
|
+
shard: [1, 2, 3, 4] # Split tests across 4 machines
|
|
455
|
+
steps:
|
|
456
|
+
- uses: actions/checkout@v4
|
|
457
|
+
- uses: actions/setup-node@v4
|
|
458
|
+
with:
|
|
459
|
+
node-version-file: '.nvmrc'
|
|
460
|
+
|
|
461
|
+
- name: Install dependencies
|
|
462
|
+
run: npm ci
|
|
463
|
+
|
|
464
|
+
- name: Install Playwright browsers
|
|
465
|
+
run: npx playwright install --with-deps
|
|
466
|
+
|
|
467
|
+
- name: Run tests (shard ${{ matrix.shard }})
|
|
468
|
+
run: npm run test
|
|
469
|
+
env:
|
|
470
|
+
SHARD_INDEX: ${{ matrix.shard }}
|
|
471
|
+
SHARD_TOTAL: 4
|
|
472
|
+
TEST_ENV: staging
|
|
473
|
+
|
|
474
|
+
- name: Upload test results
|
|
475
|
+
if: failure()
|
|
476
|
+
uses: actions/upload-artifact@v4
|
|
477
|
+
with:
|
|
478
|
+
name: test-results-shard-${{ matrix.shard }}
|
|
479
|
+
path: test-results/
|
|
480
|
+
```
|
|
481
|
+
|
|
482
|
+
```typescript
|
|
483
|
+
// playwright/config/serial.config.ts - Serial execution for flaky tests
|
|
484
|
+
import { defineConfig } from '@playwright/test';
|
|
485
|
+
import { baseConfig } from './base.config';
|
|
486
|
+
|
|
487
|
+
export default defineConfig({
|
|
488
|
+
...baseConfig,
|
|
489
|
+
|
|
490
|
+
// Disable parallel execution
|
|
491
|
+
fullyParallel: false,
|
|
492
|
+
workers: 1,
|
|
493
|
+
|
|
494
|
+
// Used for: authentication flows, database-dependent tests, feature flag tests
|
|
495
|
+
});
|
|
496
|
+
```
|
|
497
|
+
|
|
498
|
+
```typescript
|
|
499
|
+
// Usage: Force serial execution for specific tests
|
|
500
|
+
import { test } from '@playwright/test';
|
|
501
|
+
|
|
502
|
+
// Serial execution for auth tests (shared session state)
|
|
503
|
+
test.describe.configure({ mode: 'serial' });
|
|
504
|
+
|
|
505
|
+
test.describe('Authentication Flow', () => {
|
|
506
|
+
test('user can log in', async ({ page }) => {
|
|
507
|
+
// First test in serial block
|
|
508
|
+
});
|
|
509
|
+
|
|
510
|
+
test('user can access dashboard', async ({ page }) => {
|
|
511
|
+
// Depends on previous test (serial)
|
|
512
|
+
});
|
|
513
|
+
});
|
|
514
|
+
```
|
|
515
|
+
|
|
516
|
+
```typescript
|
|
517
|
+
// Usage: Parallel execution for independent tests (default)
|
|
518
|
+
import { test } from '@playwright/test';
|
|
519
|
+
|
|
520
|
+
test.describe('Product Catalog', () => {
|
|
521
|
+
test('can view product 1', async ({ page }) => {
|
|
522
|
+
// Runs in parallel with other tests
|
|
523
|
+
});
|
|
524
|
+
|
|
525
|
+
test('can view product 2', async ({ page }) => {
|
|
526
|
+
// Runs in parallel with other tests
|
|
527
|
+
});
|
|
528
|
+
});
|
|
529
|
+
```
|
|
530
|
+
|
|
531
|
+
**Key Points**:
|
|
532
|
+
|
|
533
|
+
- `fullyParallel: true` enables parallel execution within single test file
|
|
534
|
+
- Workers: 1 in CI (stability), N-1 CPUs locally (speed)
|
|
535
|
+
- Sharding splits tests across multiple CI machines (4x faster with 4 shards)
|
|
536
|
+
- `test.describe.configure({ mode: 'serial' })` for dependent tests
|
|
537
|
+
- `forbidOnly: true` in CI prevents `.only()` from blocking pipeline
|
|
538
|
+
- Matrix strategy in CI runs shards concurrently
|
|
539
|
+
|
|
540
|
+
### Example 5: Project Configuration
|
|
541
|
+
|
|
542
|
+
**Context**: When testing across multiple browsers, devices, or configurations, use Playwright projects to run the same tests against different environments (chromium, firefox, webkit, mobile).
|
|
543
|
+
|
|
544
|
+
**Implementation**:
|
|
545
|
+
|
|
546
|
+
```typescript
|
|
547
|
+
// playwright.config.ts - Multiple browser projects
|
|
548
|
+
import { defineConfig, devices } from '@playwright/test';
|
|
549
|
+
|
|
550
|
+
export default defineConfig({
|
|
551
|
+
projects: [
|
|
552
|
+
// Desktop browsers
|
|
553
|
+
{
|
|
554
|
+
name: 'chromium',
|
|
555
|
+
use: { ...devices['Desktop Chrome'] },
|
|
556
|
+
},
|
|
557
|
+
{
|
|
558
|
+
name: 'firefox',
|
|
559
|
+
use: { ...devices['Desktop Firefox'] },
|
|
560
|
+
},
|
|
561
|
+
{
|
|
562
|
+
name: 'webkit',
|
|
563
|
+
use: { ...devices['Desktop Safari'] },
|
|
564
|
+
},
|
|
565
|
+
|
|
566
|
+
// Mobile browsers
|
|
567
|
+
{
|
|
568
|
+
name: 'mobile-chrome',
|
|
569
|
+
use: { ...devices['Pixel 5'] },
|
|
570
|
+
},
|
|
571
|
+
{
|
|
572
|
+
name: 'mobile-safari',
|
|
573
|
+
use: { ...devices['iPhone 13'] },
|
|
574
|
+
},
|
|
575
|
+
|
|
576
|
+
// Tablet
|
|
577
|
+
{
|
|
578
|
+
name: 'tablet',
|
|
579
|
+
use: { ...devices['iPad Pro'] },
|
|
580
|
+
},
|
|
581
|
+
],
|
|
582
|
+
});
|
|
583
|
+
```
|
|
584
|
+
|
|
585
|
+
```typescript
|
|
586
|
+
// playwright.config.ts - Authenticated vs. unauthenticated projects
|
|
587
|
+
import { defineConfig } from '@playwright/test';
|
|
588
|
+
import path from 'path';
|
|
589
|
+
|
|
590
|
+
export default defineConfig({
|
|
591
|
+
projects: [
|
|
592
|
+
// Setup project (runs first, creates auth state)
|
|
593
|
+
{
|
|
594
|
+
name: 'setup',
|
|
595
|
+
testMatch: /global-setup\.ts/,
|
|
596
|
+
},
|
|
597
|
+
|
|
598
|
+
// Authenticated tests (reuse auth state)
|
|
599
|
+
{
|
|
600
|
+
name: 'authenticated',
|
|
601
|
+
dependencies: ['setup'],
|
|
602
|
+
use: {
|
|
603
|
+
storageState: path.resolve(__dirname, './playwright/.auth/user.json'),
|
|
604
|
+
},
|
|
605
|
+
testMatch: /.*authenticated\.spec\.ts/,
|
|
606
|
+
},
|
|
607
|
+
|
|
608
|
+
// Unauthenticated tests (public pages)
|
|
609
|
+
{
|
|
610
|
+
name: 'unauthenticated',
|
|
611
|
+
testMatch: /.*unauthenticated\.spec\.ts/,
|
|
612
|
+
},
|
|
613
|
+
],
|
|
614
|
+
});
|
|
615
|
+
```
|
|
616
|
+
|
|
617
|
+
```typescript
|
|
618
|
+
// playwright/support/global-setup.ts - Setup project for auth
|
|
619
|
+
import { chromium, FullConfig } from '@playwright/test';
|
|
620
|
+
import path from 'path';
|
|
621
|
+
|
|
622
|
+
async function globalSetup(config: FullConfig) {
|
|
623
|
+
const browser = await chromium.launch();
|
|
624
|
+
const page = await browser.newPage();
|
|
625
|
+
|
|
626
|
+
// Perform authentication
|
|
627
|
+
await page.goto('http://localhost:3000/login');
|
|
628
|
+
await page.fill('[data-testid="email"]', 'test@example.com');
|
|
629
|
+
await page.fill('[data-testid="password"]', 'password123');
|
|
630
|
+
await page.click('[data-testid="login-button"]');
|
|
631
|
+
|
|
632
|
+
// Wait for authentication to complete
|
|
633
|
+
await page.waitForURL('**/dashboard');
|
|
634
|
+
|
|
635
|
+
// Save authentication state
|
|
636
|
+
await page.context().storageState({
|
|
637
|
+
path: path.resolve(__dirname, '../.auth/user.json'),
|
|
638
|
+
});
|
|
639
|
+
|
|
640
|
+
await browser.close();
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
export default globalSetup;
|
|
644
|
+
```
|
|
645
|
+
|
|
646
|
+
```bash
|
|
647
|
+
# Run specific project
|
|
648
|
+
npx playwright test --project=chromium
|
|
649
|
+
npx playwright test --project=mobile-chrome
|
|
650
|
+
npx playwright test --project=authenticated
|
|
651
|
+
|
|
652
|
+
# Run multiple projects
|
|
653
|
+
npx playwright test --project=chromium --project=firefox
|
|
654
|
+
|
|
655
|
+
# Run all projects (default)
|
|
656
|
+
npx playwright test
|
|
657
|
+
```
|
|
658
|
+
|
|
659
|
+
```typescript
|
|
660
|
+
// Usage: Project-specific test
|
|
661
|
+
import { test, expect } from '@playwright/test';
|
|
662
|
+
|
|
663
|
+
test('mobile navigation works', async ({ page, isMobile }) => {
|
|
664
|
+
await page.goto('/');
|
|
665
|
+
|
|
666
|
+
if (isMobile) {
|
|
667
|
+
// Open mobile menu
|
|
668
|
+
await page.click('[data-testid="hamburger-menu"]');
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
await page.click('[data-testid="products-link"]');
|
|
672
|
+
await expect(page).toHaveURL(/.*products/);
|
|
673
|
+
});
|
|
674
|
+
```
|
|
675
|
+
|
|
676
|
+
```yaml
|
|
677
|
+
# .github/workflows/e2e-cross-browser.yml - CI cross-browser testing
|
|
678
|
+
name: E2E Tests (Cross-Browser)
|
|
679
|
+
on: [push, pull_request]
|
|
680
|
+
|
|
681
|
+
jobs:
|
|
682
|
+
test:
|
|
683
|
+
runs-on: ubuntu-latest
|
|
684
|
+
strategy:
|
|
685
|
+
fail-fast: false
|
|
686
|
+
matrix:
|
|
687
|
+
project: [chromium, firefox, webkit, mobile-chrome]
|
|
688
|
+
steps:
|
|
689
|
+
- uses: actions/checkout@v4
|
|
690
|
+
- uses: actions/setup-node@v4
|
|
691
|
+
- run: npm ci
|
|
692
|
+
- run: npx playwright install --with-deps
|
|
693
|
+
|
|
694
|
+
- name: Run tests (${{ matrix.project }})
|
|
695
|
+
run: npx playwright test --project=${{ matrix.project }}
|
|
696
|
+
```
|
|
697
|
+
|
|
698
|
+
**Key Points**:
|
|
699
|
+
|
|
700
|
+
- Projects enable testing across browsers, devices, and configurations
|
|
701
|
+
- `devices` from `@playwright/test` provide preset configurations (Pixel 5, iPhone 13, etc.)
|
|
702
|
+
- `dependencies` ensures setup project runs first (auth, data seeding)
|
|
703
|
+
- `storageState` shares authentication across tests (0 seconds auth per test)
|
|
704
|
+
- `testMatch` filters which tests run in which project
|
|
705
|
+
- CI matrix strategy runs projects in parallel (4x faster with 4 projects)
|
|
706
|
+
- `isMobile` context property for conditional logic in tests
|
|
707
|
+
|
|
708
|
+
## Integration Points
|
|
709
|
+
|
|
710
|
+
- **Used in workflows**: `*framework` (config setup), `*ci` (parallelization, artifact upload)
|
|
711
|
+
- **Related fragments**:
|
|
712
|
+
- `fixture-architecture.md` - Fixture-based timeout overrides
|
|
713
|
+
- `ci-burn-in.md` - CI pipeline artifact upload
|
|
714
|
+
- `test-quality.md` - Timeout standards (no hard waits)
|
|
715
|
+
- `data-factories.md` - Per-test isolation (no shared global state)
|
|
716
|
+
|
|
717
|
+
## Configuration Checklist
|
|
718
|
+
|
|
719
|
+
**Before deploying tests, verify**:
|
|
720
|
+
|
|
721
|
+
- [ ] Environment config map with fail-fast validation
|
|
722
|
+
- [ ] Standardized timeouts (action 15s, navigation 30s, expect 10s, test 60s)
|
|
723
|
+
- [ ] Artifact storage at `test-results/` and `playwright-report/`
|
|
724
|
+
- [ ] HTML + JUnit reporters configured
|
|
725
|
+
- [ ] `.env.example`, `.nvmrc`, browser versions committed
|
|
726
|
+
- [ ] Parallelization configured (workers, sharding)
|
|
727
|
+
- [ ] Projects defined for cross-browser/device testing (if needed)
|
|
728
|
+
- [ ] CI uploads artifacts on failure with 30-day retention
|
|
729
|
+
|
|
730
|
+
_Source: Playwright book repo, SEON configuration example, Murat testing philosophy (lines 216-271)._
|