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,813 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Integrate Playwright Utils with TEA"
|
|
3
|
+
description: Add production-ready fixtures and utilities to your TEA-generated tests
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Integrate Playwright Utils with TEA
|
|
7
|
+
|
|
8
|
+
Integrate `@seontechnologies/playwright-utils` with TEA to get production-ready fixtures, utilities, and patterns in your test suite.
|
|
9
|
+
|
|
10
|
+
## What is Playwright Utils?
|
|
11
|
+
|
|
12
|
+
A production-ready utility library that provides:
|
|
13
|
+
- Typed API request helper
|
|
14
|
+
- Authentication session management
|
|
15
|
+
- Network recording and replay (HAR)
|
|
16
|
+
- Network request interception
|
|
17
|
+
- Async polling (recurse)
|
|
18
|
+
- Structured logging
|
|
19
|
+
- File validation (CSV, PDF, XLSX, ZIP)
|
|
20
|
+
- Burn-in testing utilities
|
|
21
|
+
- Network error monitoring
|
|
22
|
+
|
|
23
|
+
**Repository:** [https://github.com/seontechnologies/playwright-utils](https://github.com/seontechnologies/playwright-utils)
|
|
24
|
+
|
|
25
|
+
**npm Package:** `@seontechnologies/playwright-utils`
|
|
26
|
+
|
|
27
|
+
## When to Use This
|
|
28
|
+
|
|
29
|
+
- You want production-ready fixtures (not DIY)
|
|
30
|
+
- Your team benefits from standardized patterns
|
|
31
|
+
- You need utilities like API testing, auth handling, network mocking
|
|
32
|
+
- You want TEA to generate tests using these utilities
|
|
33
|
+
- You're building reusable test infrastructure
|
|
34
|
+
|
|
35
|
+
**Don't use if:**
|
|
36
|
+
- You're just learning testing (keep it simple first)
|
|
37
|
+
- You have your own fixture library
|
|
38
|
+
- You don't need the utilities
|
|
39
|
+
|
|
40
|
+
## Prerequisites
|
|
41
|
+
|
|
42
|
+
- BMad Method installed
|
|
43
|
+
- TEA agent available
|
|
44
|
+
- Test framework setup complete (Playwright)
|
|
45
|
+
- Node.js v18 or later
|
|
46
|
+
|
|
47
|
+
**Note:** Playwright Utils is for Playwright only (not Cypress).
|
|
48
|
+
|
|
49
|
+
## Installation
|
|
50
|
+
|
|
51
|
+
### Step 1: Install Package
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
npm install -D @seontechnologies/playwright-utils
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Step 2: Enable in TEA Config
|
|
58
|
+
|
|
59
|
+
Edit `_bmad/bmm/config.yaml`:
|
|
60
|
+
|
|
61
|
+
```yaml
|
|
62
|
+
tea_use_playwright_utils: true
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
**Note:** If you enabled this during BMad installation, it's already set.
|
|
66
|
+
|
|
67
|
+
### Step 3: Verify Installation
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
# Check package installed
|
|
71
|
+
npm list @seontechnologies/playwright-utils
|
|
72
|
+
|
|
73
|
+
# Check TEA config
|
|
74
|
+
grep tea_use_playwright_utils _bmad/bmm/config.yaml
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Should show:
|
|
78
|
+
```
|
|
79
|
+
@seontechnologies/playwright-utils@2.x.x
|
|
80
|
+
tea_use_playwright_utils: true
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## What Changes When Enabled
|
|
84
|
+
|
|
85
|
+
### *framework Workflow
|
|
86
|
+
|
|
87
|
+
**Vanilla Playwright:**
|
|
88
|
+
```typescript
|
|
89
|
+
// Basic Playwright fixtures only
|
|
90
|
+
import { test, expect } from '@playwright/test';
|
|
91
|
+
|
|
92
|
+
test('api test', async ({ request }) => {
|
|
93
|
+
const response = await request.get('/api/users');
|
|
94
|
+
const users = await response.json();
|
|
95
|
+
expect(response.status()).toBe(200);
|
|
96
|
+
});
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
**With Playwright Utils (Combined Fixtures):**
|
|
100
|
+
```typescript
|
|
101
|
+
// All utilities available via single import
|
|
102
|
+
import { test } from '@seontechnologies/playwright-utils/fixtures';
|
|
103
|
+
import { expect } from '@playwright/test';
|
|
104
|
+
|
|
105
|
+
test('api test', async ({ apiRequest, authToken, log }) => {
|
|
106
|
+
const { status, body } = await apiRequest({
|
|
107
|
+
method: 'GET',
|
|
108
|
+
path: '/api/users',
|
|
109
|
+
headers: { Authorization: `Bearer ${authToken}` }
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
log.info('Fetched users', body);
|
|
113
|
+
expect(status).toBe(200);
|
|
114
|
+
});
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
**With Playwright Utils (Selective Merge):**
|
|
118
|
+
```typescript
|
|
119
|
+
import { mergeTests } from '@playwright/test';
|
|
120
|
+
import { test as apiRequestFixture } from '@seontechnologies/playwright-utils/api-request/fixtures';
|
|
121
|
+
import { test as logFixture } from '@seontechnologies/playwright-utils/log/fixtures';
|
|
122
|
+
|
|
123
|
+
export const test = mergeTests(apiRequestFixture, logFixture);
|
|
124
|
+
export { expect } from '@playwright/test';
|
|
125
|
+
|
|
126
|
+
test('api test', async ({ apiRequest, log }) => {
|
|
127
|
+
log.info('Fetching users');
|
|
128
|
+
const { status, body } = await apiRequest({
|
|
129
|
+
method: 'GET',
|
|
130
|
+
path: '/api/users'
|
|
131
|
+
});
|
|
132
|
+
expect(status).toBe(200);
|
|
133
|
+
});
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### `*atdd` and `*automate` Workflows
|
|
137
|
+
|
|
138
|
+
**Without Playwright Utils:**
|
|
139
|
+
```typescript
|
|
140
|
+
// Manual API calls
|
|
141
|
+
test('should fetch profile', async ({ page, request }) => {
|
|
142
|
+
const response = await request.get('/api/profile');
|
|
143
|
+
const profile = await response.json();
|
|
144
|
+
// Manual parsing and validation
|
|
145
|
+
});
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
**With Playwright Utils:**
|
|
149
|
+
```typescript
|
|
150
|
+
import { test } from '@seontechnologies/playwright-utils/api-request/fixtures';
|
|
151
|
+
|
|
152
|
+
test('should fetch profile', async ({ apiRequest }) => {
|
|
153
|
+
const { status, body } = await apiRequest({
|
|
154
|
+
method: 'GET',
|
|
155
|
+
path: '/api/profile' // 'path' not 'url'
|
|
156
|
+
}).validateSchema(ProfileSchema); // Chained validation
|
|
157
|
+
|
|
158
|
+
expect(status).toBe(200);
|
|
159
|
+
// body is type-safe: { id: string, name: string, email: string }
|
|
160
|
+
});
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### *test-review Workflow
|
|
164
|
+
|
|
165
|
+
**Without Playwright Utils:**
|
|
166
|
+
Reviews against generic Playwright patterns
|
|
167
|
+
|
|
168
|
+
**With Playwright Utils:**
|
|
169
|
+
Reviews against playwright-utils best practices:
|
|
170
|
+
- Fixture composition patterns
|
|
171
|
+
- Utility usage (apiRequest, authSession, etc.)
|
|
172
|
+
- Network-first patterns
|
|
173
|
+
- Structured logging
|
|
174
|
+
|
|
175
|
+
### *ci Workflow
|
|
176
|
+
|
|
177
|
+
**Without Playwright Utils:**
|
|
178
|
+
- Parallel sharding
|
|
179
|
+
- Burn-in loops (basic shell scripts)
|
|
180
|
+
- CI triggers (PR, push, schedule)
|
|
181
|
+
- Artifact collection
|
|
182
|
+
|
|
183
|
+
**With Playwright Utils:**
|
|
184
|
+
Enhanced with smart testing:
|
|
185
|
+
- Burn-in utility (git diff-based, volume control)
|
|
186
|
+
- Selective testing (skip config/docs/types changes)
|
|
187
|
+
- Test prioritization by file changes
|
|
188
|
+
|
|
189
|
+
## Available Utilities
|
|
190
|
+
|
|
191
|
+
### api-request
|
|
192
|
+
|
|
193
|
+
Typed HTTP client with schema validation.
|
|
194
|
+
|
|
195
|
+
**Official Docs:** <https://seontechnologies.github.io/playwright-utils/api-request.html>
|
|
196
|
+
|
|
197
|
+
**Why Use This?**
|
|
198
|
+
|
|
199
|
+
| Vanilla Playwright | api-request Utility |
|
|
200
|
+
|-------------------|---------------------|
|
|
201
|
+
| Manual `await response.json()` | Automatic JSON parsing |
|
|
202
|
+
| `response.status()` + separate body parsing | Returns `{ status, body }` structure |
|
|
203
|
+
| No built-in retry | Automatic retry for 5xx errors |
|
|
204
|
+
| No schema validation | Single-line `.validateSchema()` |
|
|
205
|
+
| Verbose status checking | Clean destructuring |
|
|
206
|
+
|
|
207
|
+
**Usage:**
|
|
208
|
+
```typescript
|
|
209
|
+
import { test } from '@seontechnologies/playwright-utils/api-request/fixtures';
|
|
210
|
+
import { expect } from '@playwright/test';
|
|
211
|
+
import { z } from 'zod';
|
|
212
|
+
|
|
213
|
+
const UserSchema = z.object({
|
|
214
|
+
id: z.string(),
|
|
215
|
+
name: z.string(),
|
|
216
|
+
email: z.string().email()
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
test('should create user', async ({ apiRequest }) => {
|
|
220
|
+
const { status, body } = await apiRequest({
|
|
221
|
+
method: 'POST',
|
|
222
|
+
path: '/api/users', // Note: 'path' not 'url'
|
|
223
|
+
body: { name: 'Test User', email: 'test@example.com' } // Note: 'body' not 'data'
|
|
224
|
+
}).validateSchema(UserSchema); // Chained method (can await separately if needed)
|
|
225
|
+
|
|
226
|
+
expect(status).toBe(201);
|
|
227
|
+
expect(body.id).toBeDefined();
|
|
228
|
+
expect(body.email).toBe('test@example.com');
|
|
229
|
+
});
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
**Benefits:**
|
|
233
|
+
- Returns `{ status, body }` structure
|
|
234
|
+
- Schema validation with `.validateSchema()` chained method
|
|
235
|
+
- Automatic retry for 5xx errors
|
|
236
|
+
- Type-safe response body
|
|
237
|
+
|
|
238
|
+
### auth-session
|
|
239
|
+
|
|
240
|
+
Authentication session management with token persistence.
|
|
241
|
+
|
|
242
|
+
**Official Docs:** <https://seontechnologies.github.io/playwright-utils/auth-session.html>
|
|
243
|
+
|
|
244
|
+
**Why Use This?**
|
|
245
|
+
|
|
246
|
+
| Vanilla Playwright Auth | auth-session |
|
|
247
|
+
|------------------------|--------------|
|
|
248
|
+
| Re-authenticate every test run (slow) | Authenticate once, persist to disk |
|
|
249
|
+
| Single user per setup | Multi-user support (roles, accounts) |
|
|
250
|
+
| No token expiration handling | Automatic token renewal |
|
|
251
|
+
| Manual session management | Provider pattern (flexible auth) |
|
|
252
|
+
|
|
253
|
+
**Usage:**
|
|
254
|
+
```typescript
|
|
255
|
+
import { test } from '@seontechnologies/playwright-utils/auth-session/fixtures';
|
|
256
|
+
import { expect } from '@playwright/test';
|
|
257
|
+
|
|
258
|
+
test('should access protected route', async ({ page, authToken }) => {
|
|
259
|
+
// authToken automatically fetched and persisted
|
|
260
|
+
// No manual login needed - handled by fixture
|
|
261
|
+
|
|
262
|
+
await page.goto('/dashboard');
|
|
263
|
+
await expect(page).toHaveURL('/dashboard');
|
|
264
|
+
|
|
265
|
+
// Token is reused across tests (persisted to disk)
|
|
266
|
+
});
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
**Configuration required** (see auth-session docs for provider setup):
|
|
270
|
+
```typescript
|
|
271
|
+
// global-setup.ts
|
|
272
|
+
import { authStorageInit, setAuthProvider, authGlobalInit } from '@seontechnologies/playwright-utils/auth-session';
|
|
273
|
+
|
|
274
|
+
async function globalSetup() {
|
|
275
|
+
authStorageInit();
|
|
276
|
+
setAuthProvider(myCustomProvider); // Define your auth mechanism
|
|
277
|
+
await authGlobalInit(); // Fetch token once
|
|
278
|
+
}
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
**Benefits:**
|
|
282
|
+
- Token fetched once, reused across all tests
|
|
283
|
+
- Persisted to disk (faster subsequent runs)
|
|
284
|
+
- Multi-user support via `authOptions.userIdentifier`
|
|
285
|
+
- Automatic token renewal if expired
|
|
286
|
+
|
|
287
|
+
### network-recorder
|
|
288
|
+
|
|
289
|
+
Record and replay network traffic (HAR) for offline testing.
|
|
290
|
+
|
|
291
|
+
**Official Docs:** <https://seontechnologies.github.io/playwright-utils/network-recorder.html>
|
|
292
|
+
|
|
293
|
+
**Why Use This?**
|
|
294
|
+
|
|
295
|
+
| Vanilla Playwright HAR | network-recorder |
|
|
296
|
+
|------------------------|------------------|
|
|
297
|
+
| Manual `routeFromHAR()` configuration | Automatic HAR management with `PW_NET_MODE` |
|
|
298
|
+
| Separate record/playback test files | Same test, switch env var |
|
|
299
|
+
| No CRUD detection | Stateful mocking (POST/PUT/DELETE work) |
|
|
300
|
+
| Manual HAR file paths | Auto-organized by test name |
|
|
301
|
+
|
|
302
|
+
**Usage:**
|
|
303
|
+
```typescript
|
|
304
|
+
import { test } from '@seontechnologies/playwright-utils/network-recorder/fixtures';
|
|
305
|
+
|
|
306
|
+
// Record mode: Set environment variable
|
|
307
|
+
process.env.PW_NET_MODE = 'record';
|
|
308
|
+
|
|
309
|
+
test('should work with recorded traffic', async ({ page, context, networkRecorder }) => {
|
|
310
|
+
// Setup recorder (records or replays based on PW_NET_MODE)
|
|
311
|
+
await networkRecorder.setup(context);
|
|
312
|
+
|
|
313
|
+
// Your normal test code
|
|
314
|
+
await page.goto('/dashboard');
|
|
315
|
+
await page.click('#add-item');
|
|
316
|
+
|
|
317
|
+
// First run (record): Saves traffic to HAR file
|
|
318
|
+
// Subsequent runs (playback): Uses HAR file, no backend needed
|
|
319
|
+
});
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
**Switch modes:**
|
|
323
|
+
```bash
|
|
324
|
+
# Record traffic
|
|
325
|
+
PW_NET_MODE=record npx playwright test
|
|
326
|
+
|
|
327
|
+
# Playback traffic (offline)
|
|
328
|
+
PW_NET_MODE=playback npx playwright test
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
**Benefits:**
|
|
332
|
+
- Offline testing (no backend needed)
|
|
333
|
+
- Deterministic responses (same every time)
|
|
334
|
+
- Faster execution (no network latency)
|
|
335
|
+
- Stateful mocking (CRUD operations work)
|
|
336
|
+
|
|
337
|
+
### intercept-network-call
|
|
338
|
+
|
|
339
|
+
Spy or stub network requests with automatic JSON parsing.
|
|
340
|
+
|
|
341
|
+
**Official Docs:** <https://seontechnologies.github.io/playwright-utils/intercept-network-call.html>
|
|
342
|
+
|
|
343
|
+
**Why Use This?**
|
|
344
|
+
|
|
345
|
+
| Vanilla Playwright | interceptNetworkCall |
|
|
346
|
+
|-------------------|----------------------|
|
|
347
|
+
| Route setup + response waiting (separate steps) | Single declarative call |
|
|
348
|
+
| Manual `await response.json()` | Automatic JSON parsing (`responseJson`) |
|
|
349
|
+
| Complex filter predicates | Simple glob patterns (`**/api/**`) |
|
|
350
|
+
| Verbose syntax | Concise, readable API |
|
|
351
|
+
|
|
352
|
+
**Usage:**
|
|
353
|
+
```typescript
|
|
354
|
+
import { test } from '@seontechnologies/playwright-utils/fixtures';
|
|
355
|
+
|
|
356
|
+
test('should handle API errors', async ({ page, interceptNetworkCall }) => {
|
|
357
|
+
// Stub API to return error (set up BEFORE navigation)
|
|
358
|
+
const profileCall = interceptNetworkCall({
|
|
359
|
+
method: 'GET',
|
|
360
|
+
url: '**/api/profile',
|
|
361
|
+
fulfillResponse: {
|
|
362
|
+
status: 500,
|
|
363
|
+
body: { error: 'Server error' }
|
|
364
|
+
}
|
|
365
|
+
});
|
|
366
|
+
|
|
367
|
+
await page.goto('/profile');
|
|
368
|
+
|
|
369
|
+
// Wait for the intercepted response
|
|
370
|
+
const { status, responseJson } = await profileCall;
|
|
371
|
+
|
|
372
|
+
expect(status).toBe(500);
|
|
373
|
+
expect(responseJson.error).toBe('Server error');
|
|
374
|
+
await expect(page.getByText('Server error occurred')).toBeVisible();
|
|
375
|
+
});
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
**Benefits:**
|
|
379
|
+
- Automatic JSON parsing (`responseJson` ready to use)
|
|
380
|
+
- Spy mode (observe real traffic) or stub mode (mock responses)
|
|
381
|
+
- Glob pattern URL matching
|
|
382
|
+
- Returns promise with `{ status, responseJson, requestJson }`
|
|
383
|
+
|
|
384
|
+
### recurse
|
|
385
|
+
|
|
386
|
+
Async polling for eventual consistency (Cypress-style).
|
|
387
|
+
|
|
388
|
+
**Official Docs:** <https://seontechnologies.github.io/playwright-utils/recurse.html>
|
|
389
|
+
|
|
390
|
+
**Why Use This?**
|
|
391
|
+
|
|
392
|
+
| Manual Polling | recurse Utility |
|
|
393
|
+
|----------------|-----------------|
|
|
394
|
+
| `while` loops with `waitForTimeout` | Smart polling with exponential backoff |
|
|
395
|
+
| Hard-coded retry logic | Configurable timeout/interval |
|
|
396
|
+
| No logging visibility | Optional logging with custom messages |
|
|
397
|
+
| Verbose, error-prone | Clean, readable API |
|
|
398
|
+
|
|
399
|
+
**Usage:**
|
|
400
|
+
```typescript
|
|
401
|
+
import { test } from '@seontechnologies/playwright-utils/fixtures';
|
|
402
|
+
|
|
403
|
+
test('should wait for async job completion', async ({ apiRequest, recurse }) => {
|
|
404
|
+
// Start async job
|
|
405
|
+
const { body: job } = await apiRequest({
|
|
406
|
+
method: 'POST',
|
|
407
|
+
path: '/api/jobs'
|
|
408
|
+
});
|
|
409
|
+
|
|
410
|
+
// Poll until complete (smart waiting)
|
|
411
|
+
const completed = await recurse(
|
|
412
|
+
() => apiRequest({ method: 'GET', path: `/api/jobs/${job.id}` }),
|
|
413
|
+
(result) => result.body.status === 'completed',
|
|
414
|
+
{
|
|
415
|
+
timeout: 30000,
|
|
416
|
+
interval: 2000,
|
|
417
|
+
log: 'Waiting for job to complete'
|
|
418
|
+
}
|
|
419
|
+
});
|
|
420
|
+
|
|
421
|
+
expect(completed.body.status).toBe('completed');
|
|
422
|
+
});
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
**Benefits:**
|
|
426
|
+
- Smart polling with configurable interval
|
|
427
|
+
- Handles async jobs, background tasks
|
|
428
|
+
- Optional logging for debugging
|
|
429
|
+
- Better than hard waits or manual polling loops
|
|
430
|
+
|
|
431
|
+
### log
|
|
432
|
+
|
|
433
|
+
Structured logging that integrates with Playwright reports.
|
|
434
|
+
|
|
435
|
+
**Official Docs:** <https://seontechnologies.github.io/playwright-utils/log.html>
|
|
436
|
+
|
|
437
|
+
**Why Use This?**
|
|
438
|
+
|
|
439
|
+
| Console.log / print | log Utility |
|
|
440
|
+
|--------------------|-------------|
|
|
441
|
+
| Not in test reports | Integrated with Playwright reports |
|
|
442
|
+
| No step visualization | `.step()` shows in Playwright UI |
|
|
443
|
+
| Manual object formatting | Logs objects seamlessly |
|
|
444
|
+
| No structured output | JSON artifacts for debugging |
|
|
445
|
+
|
|
446
|
+
**Usage:**
|
|
447
|
+
```typescript
|
|
448
|
+
import { log } from '@seontechnologies/playwright-utils';
|
|
449
|
+
import { test, expect } from '@playwright/test';
|
|
450
|
+
|
|
451
|
+
test('should login', async ({ page }) => {
|
|
452
|
+
await log.info('Starting login test');
|
|
453
|
+
|
|
454
|
+
await page.goto('/login');
|
|
455
|
+
await log.step('Navigated to login page'); // Shows in Playwright UI
|
|
456
|
+
|
|
457
|
+
await page.getByLabel('Email').fill('test@example.com');
|
|
458
|
+
await log.debug('Filled email field');
|
|
459
|
+
|
|
460
|
+
await log.success('Login completed');
|
|
461
|
+
// Logs appear in test output and Playwright reports
|
|
462
|
+
});
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
**Benefits:**
|
|
466
|
+
- Direct import (no fixture needed for basic usage)
|
|
467
|
+
- Structured logs in test reports
|
|
468
|
+
- `.step()` shows in Playwright UI
|
|
469
|
+
- Logs objects seamlessly (no special handling needed)
|
|
470
|
+
- Trace test execution
|
|
471
|
+
|
|
472
|
+
### file-utils
|
|
473
|
+
|
|
474
|
+
Read and validate CSV, PDF, XLSX, ZIP files.
|
|
475
|
+
|
|
476
|
+
**Official Docs:** <https://seontechnologies.github.io/playwright-utils/file-utils.html>
|
|
477
|
+
|
|
478
|
+
**Why Use This?**
|
|
479
|
+
|
|
480
|
+
| Vanilla Playwright | file-utils |
|
|
481
|
+
|-------------------|------------|
|
|
482
|
+
| ~80 lines per CSV flow | ~10 lines end-to-end |
|
|
483
|
+
| Manual download event handling | `handleDownload()` encapsulates all |
|
|
484
|
+
| External parsing libraries | Auto-parsing (CSV, XLSX, PDF, ZIP) |
|
|
485
|
+
| No validation helpers | Built-in validation (headers, row count) |
|
|
486
|
+
|
|
487
|
+
**Usage:**
|
|
488
|
+
```typescript
|
|
489
|
+
import { handleDownload, readCSV } from '@seontechnologies/playwright-utils/file-utils';
|
|
490
|
+
import { expect } from '@playwright/test';
|
|
491
|
+
import path from 'node:path';
|
|
492
|
+
|
|
493
|
+
const DOWNLOAD_DIR = path.join(__dirname, '../downloads');
|
|
494
|
+
|
|
495
|
+
test('should export valid CSV', async ({ page }) => {
|
|
496
|
+
// Handle download and get file path
|
|
497
|
+
const downloadPath = await handleDownload({
|
|
498
|
+
page,
|
|
499
|
+
downloadDir: DOWNLOAD_DIR,
|
|
500
|
+
trigger: () => page.click('button:has-text("Export")')
|
|
501
|
+
});
|
|
502
|
+
|
|
503
|
+
// Read and parse CSV
|
|
504
|
+
const csvResult = await readCSV({ filePath: downloadPath });
|
|
505
|
+
const { data, headers } = csvResult.content;
|
|
506
|
+
|
|
507
|
+
// Validate structure
|
|
508
|
+
expect(headers).toEqual(['Name', 'Email', 'Status']);
|
|
509
|
+
expect(data.length).toBeGreaterThan(0);
|
|
510
|
+
expect(data[0]).toMatchObject({
|
|
511
|
+
Name: expect.any(String),
|
|
512
|
+
Email: expect.any(String),
|
|
513
|
+
Status: expect.any(String)
|
|
514
|
+
});
|
|
515
|
+
});
|
|
516
|
+
```
|
|
517
|
+
|
|
518
|
+
**Benefits:**
|
|
519
|
+
- Handles downloads automatically
|
|
520
|
+
- Auto-parses CSV, XLSX, PDF, ZIP
|
|
521
|
+
- Type-safe access to parsed data
|
|
522
|
+
- Returns structured `{ headers, data }`
|
|
523
|
+
|
|
524
|
+
### burn-in
|
|
525
|
+
|
|
526
|
+
Smart test selection with git diff analysis for CI optimization.
|
|
527
|
+
|
|
528
|
+
**Official Docs:** <https://seontechnologies.github.io/playwright-utils/burn-in.html>
|
|
529
|
+
|
|
530
|
+
**Why Use This?**
|
|
531
|
+
|
|
532
|
+
| Playwright `--only-changed` | burn-in Utility |
|
|
533
|
+
|-----------------------------|-----------------|
|
|
534
|
+
| Config changes trigger all tests | Smart filtering (skip configs, types, docs) |
|
|
535
|
+
| All or nothing | Volume control (run percentage) |
|
|
536
|
+
| No customization | Custom dependency analysis |
|
|
537
|
+
| Slow CI on minor changes | Fast CI with intelligent selection |
|
|
538
|
+
|
|
539
|
+
**Usage:**
|
|
540
|
+
```typescript
|
|
541
|
+
// scripts/burn-in-changed.ts
|
|
542
|
+
import { runBurnIn } from '@seontechnologies/playwright-utils/burn-in';
|
|
543
|
+
|
|
544
|
+
async function main() {
|
|
545
|
+
await runBurnIn({
|
|
546
|
+
configPath: 'playwright.burn-in.config.ts',
|
|
547
|
+
baseBranch: 'main'
|
|
548
|
+
});
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
main().catch(console.error);
|
|
552
|
+
```
|
|
553
|
+
|
|
554
|
+
**Config:**
|
|
555
|
+
```typescript
|
|
556
|
+
// playwright.burn-in.config.ts
|
|
557
|
+
import type { BurnInConfig } from '@seontechnologies/playwright-utils/burn-in';
|
|
558
|
+
|
|
559
|
+
const config: BurnInConfig = {
|
|
560
|
+
skipBurnInPatterns: [
|
|
561
|
+
'**/config/**',
|
|
562
|
+
'**/*.md',
|
|
563
|
+
'**/*types*'
|
|
564
|
+
],
|
|
565
|
+
burnInTestPercentage: 0.3,
|
|
566
|
+
burnIn: {
|
|
567
|
+
repeatEach: 3,
|
|
568
|
+
retries: 1
|
|
569
|
+
}
|
|
570
|
+
};
|
|
571
|
+
|
|
572
|
+
export default config;
|
|
573
|
+
```
|
|
574
|
+
|
|
575
|
+
**Package script:**
|
|
576
|
+
```json
|
|
577
|
+
{
|
|
578
|
+
"scripts": {
|
|
579
|
+
"test:burn-in": "tsx scripts/burn-in-changed.ts"
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
```
|
|
583
|
+
|
|
584
|
+
**Benefits:**
|
|
585
|
+
- **Ensure flake-free tests upfront** - Never deal with test flake again
|
|
586
|
+
- Smart filtering (skip config, types, docs changes)
|
|
587
|
+
- Volume control (run percentage of affected tests)
|
|
588
|
+
- Git diff-based test selection
|
|
589
|
+
- Faster CI feedback
|
|
590
|
+
|
|
591
|
+
### network-error-monitor
|
|
592
|
+
|
|
593
|
+
Automatically detect HTTP 4xx/5xx errors during tests.
|
|
594
|
+
|
|
595
|
+
**Official Docs:** <https://seontechnologies.github.io/playwright-utils/network-error-monitor.html>
|
|
596
|
+
|
|
597
|
+
**Why Use This?**
|
|
598
|
+
|
|
599
|
+
| Vanilla Playwright | network-error-monitor |
|
|
600
|
+
|-------------------|----------------------|
|
|
601
|
+
| UI passes, backend 500 ignored | Auto-fails on any 4xx/5xx |
|
|
602
|
+
| Manual error checking | Zero boilerplate (auto-enabled) |
|
|
603
|
+
| Silent failures slip through | Acts like Sentry for tests |
|
|
604
|
+
| No domino effect prevention | Limits cascading failures |
|
|
605
|
+
|
|
606
|
+
**Usage:**
|
|
607
|
+
```typescript
|
|
608
|
+
import { test } from '@seontechnologies/playwright-utils/network-error-monitor/fixtures';
|
|
609
|
+
|
|
610
|
+
// That's it! Network monitoring is automatically enabled
|
|
611
|
+
test('should not have API errors', async ({ page }) => {
|
|
612
|
+
await page.goto('/dashboard');
|
|
613
|
+
await page.click('button');
|
|
614
|
+
|
|
615
|
+
// Test fails automatically if any HTTP 4xx/5xx errors occur
|
|
616
|
+
// Error message shows: "Network errors detected: 2 request(s) failed"
|
|
617
|
+
// GET 500 https://api.example.com/users
|
|
618
|
+
// POST 503 https://api.example.com/metrics
|
|
619
|
+
});
|
|
620
|
+
```
|
|
621
|
+
|
|
622
|
+
**Opt-out for validation tests:**
|
|
623
|
+
```typescript
|
|
624
|
+
// When testing error scenarios, opt-out with annotation
|
|
625
|
+
test('should show error message on 404',
|
|
626
|
+
{ annotation: [{ type: 'skipNetworkMonitoring' }] }, // Array format
|
|
627
|
+
async ({ page }) => {
|
|
628
|
+
await page.goto('/invalid-page'); // Will 404
|
|
629
|
+
await expect(page.getByText('Page not found')).toBeVisible();
|
|
630
|
+
// Test won't fail on 404 because of annotation
|
|
631
|
+
}
|
|
632
|
+
);
|
|
633
|
+
|
|
634
|
+
// Or opt-out entire describe block
|
|
635
|
+
test.describe('error handling',
|
|
636
|
+
{ annotation: [{ type: 'skipNetworkMonitoring' }] },
|
|
637
|
+
() => {
|
|
638
|
+
test('handles 404', async ({ page }) => {
|
|
639
|
+
// Monitoring disabled for all tests in block
|
|
640
|
+
});
|
|
641
|
+
}
|
|
642
|
+
);
|
|
643
|
+
```
|
|
644
|
+
|
|
645
|
+
**Benefits:**
|
|
646
|
+
- Auto-enabled (zero setup)
|
|
647
|
+
- Catches silent backend failures (500, 503, 504)
|
|
648
|
+
- **Prevents domino effect** (limits cascading failures from one bad endpoint)
|
|
649
|
+
- Opt-out with annotations for validation tests
|
|
650
|
+
- Structured error reporting (JSON artifacts)
|
|
651
|
+
|
|
652
|
+
## Fixture Composition
|
|
653
|
+
|
|
654
|
+
**Option 1: Use Package's Combined Fixtures (Simplest)**
|
|
655
|
+
|
|
656
|
+
```typescript
|
|
657
|
+
// Import all utilities at once
|
|
658
|
+
import { test } from '@seontechnologies/playwright-utils/fixtures';
|
|
659
|
+
import { log } from '@seontechnologies/playwright-utils';
|
|
660
|
+
import { expect } from '@playwright/test';
|
|
661
|
+
|
|
662
|
+
test('api test', async ({ apiRequest, interceptNetworkCall }) => {
|
|
663
|
+
await log.info('Fetching users');
|
|
664
|
+
|
|
665
|
+
const { status, body } = await apiRequest({
|
|
666
|
+
method: 'GET',
|
|
667
|
+
path: '/api/users'
|
|
668
|
+
});
|
|
669
|
+
|
|
670
|
+
expect(status).toBe(200);
|
|
671
|
+
});
|
|
672
|
+
```
|
|
673
|
+
|
|
674
|
+
**Option 2: Create Custom Merged Fixtures (Selective)**
|
|
675
|
+
|
|
676
|
+
**File 1: support/merged-fixtures.ts**
|
|
677
|
+
```typescript
|
|
678
|
+
import { test as base, mergeTests } from '@playwright/test';
|
|
679
|
+
import { test as apiRequest } from '@seontechnologies/playwright-utils/api-request/fixtures';
|
|
680
|
+
import { test as interceptNetworkCall } from '@seontechnologies/playwright-utils/intercept-network-call/fixtures';
|
|
681
|
+
import { test as networkErrorMonitor } from '@seontechnologies/playwright-utils/network-error-monitor/fixtures';
|
|
682
|
+
import { log } from '@seontechnologies/playwright-utils';
|
|
683
|
+
|
|
684
|
+
// Merge only what you need
|
|
685
|
+
export const test = mergeTests(
|
|
686
|
+
base,
|
|
687
|
+
apiRequest,
|
|
688
|
+
interceptNetworkCall,
|
|
689
|
+
networkErrorMonitor
|
|
690
|
+
);
|
|
691
|
+
|
|
692
|
+
export const expect = base.expect;
|
|
693
|
+
export { log };
|
|
694
|
+
```
|
|
695
|
+
|
|
696
|
+
**File 2: tests/api/users.spec.ts**
|
|
697
|
+
```typescript
|
|
698
|
+
import { test, expect, log } from '../support/merged-fixtures';
|
|
699
|
+
|
|
700
|
+
test('api test', async ({ apiRequest, interceptNetworkCall }) => {
|
|
701
|
+
await log.info('Fetching users');
|
|
702
|
+
|
|
703
|
+
const { status, body } = await apiRequest({
|
|
704
|
+
method: 'GET',
|
|
705
|
+
path: '/api/users'
|
|
706
|
+
});
|
|
707
|
+
|
|
708
|
+
expect(status).toBe(200);
|
|
709
|
+
});
|
|
710
|
+
```
|
|
711
|
+
|
|
712
|
+
**Contrast:**
|
|
713
|
+
- Option 1: All utilities available, zero setup
|
|
714
|
+
- Option 2: Pick utilities you need, one central file
|
|
715
|
+
|
|
716
|
+
**See working examples:** <https://github.com/seontechnologies/playwright-utils/tree/main/playwright/support>
|
|
717
|
+
|
|
718
|
+
## Troubleshooting
|
|
719
|
+
|
|
720
|
+
### Import Errors
|
|
721
|
+
|
|
722
|
+
**Problem:** Cannot find module '@seontechnologies/playwright-utils/api-request'
|
|
723
|
+
|
|
724
|
+
**Solution:**
|
|
725
|
+
```bash
|
|
726
|
+
# Verify package installed
|
|
727
|
+
npm list @seontechnologies/playwright-utils
|
|
728
|
+
|
|
729
|
+
# Check package.json has correct version
|
|
730
|
+
"@seontechnologies/playwright-utils": "^2.0.0"
|
|
731
|
+
|
|
732
|
+
# Reinstall if needed
|
|
733
|
+
npm install -D @seontechnologies/playwright-utils
|
|
734
|
+
```
|
|
735
|
+
|
|
736
|
+
### TEA Not Using Utilities
|
|
737
|
+
|
|
738
|
+
**Problem:** TEA generates tests without playwright-utils.
|
|
739
|
+
|
|
740
|
+
**Causes:**
|
|
741
|
+
1. Config not set: `tea_use_playwright_utils: false`
|
|
742
|
+
2. Workflow run before config change
|
|
743
|
+
3. Package not installed
|
|
744
|
+
|
|
745
|
+
**Solution:**
|
|
746
|
+
```bash
|
|
747
|
+
# Check config
|
|
748
|
+
grep tea_use_playwright_utils _bmad/bmm/config.yaml
|
|
749
|
+
|
|
750
|
+
# Should show: tea_use_playwright_utils: true
|
|
751
|
+
|
|
752
|
+
# Start fresh chat (TEA loads config at start)
|
|
753
|
+
```
|
|
754
|
+
|
|
755
|
+
### Type Errors with apiRequest
|
|
756
|
+
|
|
757
|
+
**Problem:** TypeScript errors on apiRequest response.
|
|
758
|
+
|
|
759
|
+
**Cause:** No schema validation.
|
|
760
|
+
|
|
761
|
+
**Solution:**
|
|
762
|
+
```typescript
|
|
763
|
+
// Add Zod schema for type safety
|
|
764
|
+
import { z } from 'zod';
|
|
765
|
+
|
|
766
|
+
const ProfileSchema = z.object({
|
|
767
|
+
id: z.string(),
|
|
768
|
+
name: z.string(),
|
|
769
|
+
email: z.string().email()
|
|
770
|
+
});
|
|
771
|
+
|
|
772
|
+
const { status, body } = await apiRequest({
|
|
773
|
+
method: 'GET',
|
|
774
|
+
path: '/api/profile' // 'path' not 'url'
|
|
775
|
+
}).validateSchema(ProfileSchema); // Chained method
|
|
776
|
+
|
|
777
|
+
expect(status).toBe(200);
|
|
778
|
+
// body is typed as { id: string, name: string, email: string }
|
|
779
|
+
```
|
|
780
|
+
|
|
781
|
+
## Migration Guide
|
|
782
|
+
|
|
783
|
+
## Related Guides
|
|
784
|
+
|
|
785
|
+
**Getting Started:**
|
|
786
|
+
- [TEA Lite Quickstart Tutorial](/docs/tutorials/getting-started/tea-lite-quickstart.md) - Learn TEA basics
|
|
787
|
+
- [How to Set Up Test Framework](/docs/how-to/workflows/setup-test-framework.md) - Initial framework setup
|
|
788
|
+
|
|
789
|
+
**Workflow Guides:**
|
|
790
|
+
- [How to Run ATDD](/docs/how-to/workflows/run-atdd.md) - Generate tests with utilities
|
|
791
|
+
- [How to Run Automate](/docs/how-to/workflows/run-automate.md) - Expand coverage with utilities
|
|
792
|
+
- [How to Run Test Review](/docs/how-to/workflows/run-test-review.md) - Review against PW-Utils patterns
|
|
793
|
+
|
|
794
|
+
**Other Customization:**
|
|
795
|
+
- [Enable MCP Enhancements](/docs/how-to/customization/enable-tea-mcp-enhancements.md) - Live browser verification
|
|
796
|
+
|
|
797
|
+
## Understanding the Concepts
|
|
798
|
+
|
|
799
|
+
- [Testing as Engineering](/docs/explanation/philosophy/testing-as-engineering.md) - **Why Playwright Utils matters** (part of TEA's three-part solution)
|
|
800
|
+
- [Fixture Architecture](/docs/explanation/tea/fixture-architecture.md) - Pure function → fixture pattern
|
|
801
|
+
- [Network-First Patterns](/docs/explanation/tea/network-first-patterns.md) - Network utilities explained
|
|
802
|
+
- [Test Quality Standards](/docs/explanation/tea/test-quality-standards.md) - Patterns PW-Utils enforces
|
|
803
|
+
|
|
804
|
+
## Reference
|
|
805
|
+
|
|
806
|
+
- [TEA Configuration](/docs/reference/tea/configuration.md) - tea_use_playwright_utils option
|
|
807
|
+
- [Knowledge Base Index](/docs/reference/tea/knowledge-base.md) - Playwright Utils fragments
|
|
808
|
+
- [Glossary](/docs/reference/glossary/index.md#test-architect-tea-concepts) - Playwright Utils term
|
|
809
|
+
- [Official PW-Utils Docs](https://seontechnologies.github.io/playwright-utils/) - Complete API reference
|
|
810
|
+
|
|
811
|
+
---
|
|
812
|
+
|
|
813
|
+
Generated with [BMad Method](https://bmad-method.org) - TEA (Test Architect)
|