bmad-method 6.0.0-alpha.12 → 6.0.0-alpha.13
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/.github/workflows/bundle-latest.yaml +79 -27
- package/CHANGELOG.md +159 -1
- package/README.md +3 -1
- package/custom/src/agents/commit-poet/commit-poet.agent.yaml +129 -0
- package/custom/src/agents/commit-poet/installation-guide.md +36 -0
- package/custom/src/agents/toolsmith/installation-guide.md +36 -0
- package/custom/src/agents/toolsmith/toolsmith-sidecar/instructions.md +70 -0
- package/custom/src/agents/toolsmith/toolsmith-sidecar/knowledge/bundlers.md +111 -0
- package/custom/src/agents/toolsmith/toolsmith-sidecar/knowledge/deploy.md +70 -0
- package/custom/src/agents/toolsmith/toolsmith-sidecar/knowledge/docs.md +114 -0
- package/custom/src/agents/toolsmith/toolsmith-sidecar/knowledge/installers.md +134 -0
- package/custom/src/agents/toolsmith/toolsmith-sidecar/knowledge/modules.md +161 -0
- package/custom/src/agents/toolsmith/toolsmith-sidecar/knowledge/tests.md +103 -0
- package/custom/src/agents/toolsmith/toolsmith-sidecar/memories.md +17 -0
- package/custom/src/agents/toolsmith/toolsmith.agent.yaml +108 -0
- package/docs/custom-agent-installation.md +31 -17
- package/docs/ide-info/rovo-dev.md +388 -0
- package/docs/index.md +6 -81
- package/docs/installers-bundlers/installers-modules-platforms-reference.md +1 -1
- package/package.json +1 -1
- package/src/core/agents/bmad-master.agent.yaml +1 -1
- package/src/core/agents/bmad-web-orchestrator.agent.xml +1 -1
- package/src/core/tasks/advanced-elicitation-methods.csv +51 -21
- package/src/core/tasks/advanced-elicitation.xml +18 -8
- package/src/core/tasks/workflow.xml +36 -71
- package/src/core/workflows/brainstorming/brain-methods.csv +62 -36
- package/src/core/workflows/brainstorming/steps/step-01-session-setup.md +196 -0
- package/src/core/workflows/brainstorming/steps/step-01b-continue.md +121 -0
- package/src/core/workflows/brainstorming/steps/step-02a-user-selected.md +224 -0
- package/src/core/workflows/brainstorming/steps/step-02b-ai-recommended.md +236 -0
- package/src/core/workflows/brainstorming/steps/step-02c-random-selection.md +208 -0
- package/src/core/workflows/brainstorming/steps/step-02d-progressive-flow.md +263 -0
- package/src/core/workflows/brainstorming/steps/step-03-technique-execution.md +339 -0
- package/src/core/workflows/brainstorming/steps/step-04-idea-organization.md +302 -0
- package/src/core/workflows/brainstorming/template.md +13 -104
- package/src/core/workflows/brainstorming/workflow.md +51 -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 +203 -0
- package/src/core/workflows/party-mode/steps/step-03-graceful-exit.md +159 -0
- package/src/core/workflows/party-mode/workflow.md +207 -0
- package/src/modules/bmb/README.md +153 -86
- package/src/modules/bmb/_module-installer/install-config.yaml +3 -3
- package/src/modules/bmb/agents/bmad-builder.agent.yaml +45 -31
- package/src/modules/bmb/docs/{agent-menu-patterns.md → agents/agent-menu-patterns.md} +1 -1
- package/src/modules/bmb/docs/agents/kb.csv +0 -0
- package/src/modules/bmb/docs/{module-agent-architecture.md → agents/module-agent-architecture.md} +1 -1
- package/src/modules/bmb/docs/{simple-agent-architecture.md → agents/simple-agent-architecture.md} +1 -1
- package/src/modules/bmb/docs/workflows/architecture.md +220 -0
- package/src/modules/bmb/docs/workflows/common-workflow-tools.csv +19 -0
- package/src/modules/bmb/docs/workflows/csv-data-file-standards.md +206 -0
- package/src/modules/bmb/docs/workflows/index.md +45 -0
- package/src/modules/bmb/docs/workflows/intent-vs-prescriptive-spectrum.md +220 -0
- package/src/modules/bmb/docs/workflows/kb.csv +0 -0
- package/src/modules/bmb/docs/workflows/step-template.md +283 -0
- package/src/modules/bmb/docs/workflows/terms.md +97 -0
- package/src/modules/bmb/docs/workflows/workflow-template.md +152 -0
- package/src/modules/bmb/reference/agents/module-examples/README.md +1 -1
- package/src/modules/bmb/reference/agents/module-examples/security-engineer.agent.yaml +2 -2
- package/src/modules/bmb/reference/agents/module-examples/trend-analyst.agent.yaml +1 -1
- package/src/modules/bmb/reference/workflows/meal-prep-nutrition/data/dietary-restrictions.csv +18 -0
- package/src/modules/bmb/reference/workflows/meal-prep-nutrition/data/macro-calculator.csv +16 -0
- package/src/modules/bmb/reference/workflows/meal-prep-nutrition/data/recipe-database.csv +28 -0
- package/src/modules/bmb/reference/workflows/meal-prep-nutrition/steps/step-01-init.md +177 -0
- package/src/modules/bmb/reference/workflows/meal-prep-nutrition/steps/step-01b-continue.md +150 -0
- package/src/modules/bmb/reference/workflows/meal-prep-nutrition/steps/step-02-profile.md +164 -0
- package/src/modules/bmb/reference/workflows/meal-prep-nutrition/steps/step-03-assessment.md +152 -0
- package/src/modules/bmb/reference/workflows/meal-prep-nutrition/steps/step-04-strategy.md +182 -0
- package/src/modules/bmb/reference/workflows/meal-prep-nutrition/steps/step-05-shopping.md +167 -0
- package/src/modules/bmb/reference/workflows/meal-prep-nutrition/steps/step-06-prep-schedule.md +194 -0
- package/src/modules/bmb/reference/workflows/meal-prep-nutrition/templates/assessment-section.md +25 -0
- package/src/modules/bmb/reference/workflows/meal-prep-nutrition/templates/nutrition-plan.md +68 -0
- package/src/modules/bmb/reference/workflows/meal-prep-nutrition/templates/prep-schedule-section.md +29 -0
- package/src/modules/bmb/reference/workflows/meal-prep-nutrition/templates/profile-section.md +47 -0
- package/src/modules/bmb/reference/workflows/meal-prep-nutrition/templates/shopping-section.md +37 -0
- package/src/modules/bmb/reference/workflows/meal-prep-nutrition/templates/strategy-section.md +18 -0
- package/src/modules/bmb/reference/workflows/meal-prep-nutrition/workflow.md +58 -0
- package/src/modules/bmb/workflows/create-agent/data/info-and-installation-guide.md +17 -0
- package/src/modules/bmb/workflows/create-agent/data/reference/README.md +3 -0
- package/src/modules/bmb/workflows/create-agent/data/reference/agents/expert-examples/journal-keeper/README.md +242 -0
- package/src/modules/bmb/workflows/create-agent/data/reference/agents/expert-examples/journal-keeper/journal-keeper-sidecar/breakthroughs.md +24 -0
- package/src/modules/bmb/workflows/create-agent/data/reference/agents/expert-examples/journal-keeper/journal-keeper-sidecar/instructions.md +108 -0
- package/src/modules/bmb/workflows/create-agent/data/reference/agents/expert-examples/journal-keeper/journal-keeper-sidecar/memories.md +46 -0
- package/src/modules/bmb/workflows/create-agent/data/reference/agents/expert-examples/journal-keeper/journal-keeper-sidecar/mood-patterns.md +39 -0
- package/src/modules/bmb/workflows/create-agent/data/reference/agents/expert-examples/journal-keeper/journal-keeper.agent.yaml +152 -0
- package/src/modules/bmb/workflows/create-agent/data/reference/agents/module-examples/README.md +50 -0
- package/src/modules/bmb/workflows/create-agent/data/reference/agents/module-examples/security-engineer.agent.yaml +53 -0
- package/src/modules/bmb/workflows/create-agent/data/reference/agents/module-examples/trend-analyst.agent.yaml +57 -0
- package/src/modules/bmb/workflows/create-agent/data/reference/agents/simple-examples/README.md +223 -0
- package/src/modules/bmb/workflows/create-agent/data/reference/agents/simple-examples/commit-poet.agent.yaml +126 -0
- package/src/modules/bmb/workflows/create-agent/data/reference/workflows/meal-prep-nutrition/data/dietary-restrictions.csv +18 -0
- package/src/modules/bmb/workflows/create-agent/data/reference/workflows/meal-prep-nutrition/data/macro-calculator.csv +16 -0
- package/src/modules/bmb/workflows/create-agent/data/reference/workflows/meal-prep-nutrition/data/recipe-database.csv +28 -0
- package/src/modules/bmb/workflows/create-agent/data/reference/workflows/meal-prep-nutrition/steps/step-01-init.md +177 -0
- package/src/modules/bmb/workflows/create-agent/data/reference/workflows/meal-prep-nutrition/steps/step-01b-continue.md +150 -0
- package/src/modules/bmb/workflows/create-agent/data/reference/workflows/meal-prep-nutrition/steps/step-02-profile.md +164 -0
- package/src/modules/bmb/workflows/create-agent/data/reference/workflows/meal-prep-nutrition/steps/step-03-assessment.md +152 -0
- package/src/modules/bmb/workflows/create-agent/data/reference/workflows/meal-prep-nutrition/steps/step-04-strategy.md +182 -0
- package/src/modules/bmb/workflows/create-agent/data/reference/workflows/meal-prep-nutrition/steps/step-05-shopping.md +167 -0
- package/src/modules/bmb/workflows/create-agent/data/reference/workflows/meal-prep-nutrition/steps/step-06-prep-schedule.md +194 -0
- package/src/modules/bmb/workflows/create-agent/data/reference/workflows/meal-prep-nutrition/templates/assessment-section.md +25 -0
- package/src/modules/bmb/workflows/create-agent/data/reference/workflows/meal-prep-nutrition/templates/nutrition-plan.md +68 -0
- package/src/modules/bmb/workflows/create-agent/data/reference/workflows/meal-prep-nutrition/templates/prep-schedule-section.md +29 -0
- package/src/modules/bmb/workflows/create-agent/data/reference/workflows/meal-prep-nutrition/templates/profile-section.md +47 -0
- package/src/modules/bmb/workflows/create-agent/data/reference/workflows/meal-prep-nutrition/templates/shopping-section.md +37 -0
- package/src/modules/bmb/workflows/create-agent/data/reference/workflows/meal-prep-nutrition/templates/strategy-section.md +18 -0
- package/src/modules/bmb/workflows/create-agent/data/reference/workflows/meal-prep-nutrition/workflow.md +58 -0
- package/src/modules/bmb/workflows/create-agent/data/validation-complete.md +305 -0
- package/src/modules/bmb/workflows/create-agent/steps/step-01-brainstorm.md +145 -0
- package/src/modules/bmb/workflows/create-agent/steps/step-02-discover.md +210 -0
- package/src/modules/bmb/workflows/create-agent/steps/step-03-persona.md +260 -0
- package/src/modules/bmb/workflows/create-agent/steps/step-04-commands.md +237 -0
- package/src/modules/bmb/workflows/create-agent/steps/step-05-name.md +231 -0
- package/src/modules/bmb/workflows/create-agent/steps/step-06-build.md +224 -0
- package/src/modules/bmb/workflows/create-agent/steps/step-07-validate.md +234 -0
- package/src/modules/bmb/workflows/create-agent/steps/step-08-setup.md +179 -0
- package/src/modules/bmb/workflows/create-agent/steps/step-09-customize.md +197 -0
- package/src/modules/bmb/workflows/create-agent/steps/step-10-build-tools.md +180 -0
- package/src/modules/bmb/workflows/create-agent/steps/step-11-celebrate.md +222 -0
- package/src/modules/bmb/workflows/create-agent/templates/agent_commands.md +21 -0
- package/src/modules/bmb/workflows/create-agent/templates/agent_persona.md +25 -0
- package/src/modules/bmb/workflows/create-agent/templates/agent_purpose_and_type.md +23 -0
- package/src/modules/bmb/workflows/create-agent/workflow.md +91 -0
- package/src/modules/bmb/workflows/create-workflow/steps/step-01-init.md +168 -0
- package/src/modules/bmb/workflows/create-workflow/steps/step-02-gather.md +233 -0
- package/src/modules/bmb/workflows/create-workflow/steps/step-03-tools-overview.md +127 -0
- package/src/modules/bmb/workflows/create-workflow/steps/step-04-core-tools.md +145 -0
- package/src/modules/bmb/workflows/create-workflow/steps/step-05-memory-requirements.md +136 -0
- package/src/modules/bmb/workflows/create-workflow/steps/step-06-external-tools.md +154 -0
- package/src/modules/bmb/workflows/create-workflow/steps/step-07-installation-guidance.md +159 -0
- package/src/modules/bmb/workflows/create-workflow/steps/step-08-tools-summary.md +167 -0
- package/src/modules/bmb/workflows/create-workflow/steps/step-09-design.md +239 -0
- package/src/modules/bmb/workflows/create-workflow/steps/step-10-plan-review.md +215 -0
- package/src/modules/bmb/workflows/create-workflow/steps/step-11-build.md +262 -0
- package/src/modules/bmb/workflows/create-workflow/steps/step-12-review.md +270 -0
- package/src/modules/bmb/workflows/create-workflow/templates/build-summary.md +36 -0
- package/src/modules/bmb/workflows/create-workflow/templates/completion-section.md +39 -0
- package/src/modules/bmb/workflows/create-workflow/templates/content-template.md +21 -0
- package/src/modules/bmb/workflows/create-workflow/templates/design-section.md +53 -0
- package/src/modules/bmb/workflows/create-workflow/templates/project-info.md +18 -0
- package/src/modules/bmb/workflows/create-workflow/templates/requirements-section.md +47 -0
- package/src/modules/bmb/workflows/create-workflow/templates/review-section.md +56 -0
- package/src/modules/bmb/workflows/create-workflow/templates/step-file.md +139 -0
- package/src/modules/bmb/workflows/create-workflow/templates/workflow-plan.md +54 -0
- package/src/modules/bmb/workflows/create-workflow/templates/workflow.md +58 -0
- package/src/modules/bmb/workflows/create-workflow/workflow.md +58 -0
- package/src/modules/bmb/workflows/edit-agent/steps/step-01-discover-intent.md +134 -0
- package/src/modules/bmb/workflows/edit-agent/steps/step-02-analyze-agent.md +202 -0
- package/src/modules/bmb/workflows/edit-agent/steps/step-03-propose-changes.md +157 -0
- package/src/modules/bmb/workflows/edit-agent/steps/step-04-apply-changes.md +150 -0
- package/src/modules/bmb/workflows/edit-agent/steps/step-05-validate.md +150 -0
- package/src/modules/bmb/workflows/edit-agent/workflow.md +58 -0
- package/src/modules/bmb/workflows/edit-workflow/steps/step-01-analyze.md +221 -0
- package/src/modules/bmb/workflows/edit-workflow/steps/step-02-discover.md +253 -0
- package/src/modules/bmb/workflows/edit-workflow/steps/step-03-improve.md +217 -0
- package/src/modules/bmb/workflows/edit-workflow/steps/step-04-validate.md +193 -0
- package/src/modules/bmb/workflows/edit-workflow/steps/step-05-compliance-check.md +245 -0
- package/src/modules/bmb/workflows/edit-workflow/templates/completion-summary.md +75 -0
- package/src/modules/bmb/workflows/edit-workflow/templates/improvement-goals.md +68 -0
- package/src/modules/bmb/workflows/edit-workflow/templates/improvement-log.md +40 -0
- package/src/modules/bmb/workflows/edit-workflow/templates/validation-results.md +51 -0
- package/src/modules/bmb/workflows/edit-workflow/templates/workflow-analysis.md +56 -0
- package/src/modules/bmb/workflows/edit-workflow/workflow.md +58 -0
- package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-01-validate-goal.md +152 -0
- package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-02-workflow-validation.md +243 -0
- package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-03-step-validation.md +274 -0
- package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-04-file-validation.md +295 -0
- package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-05-intent-spectrum-validation.md +264 -0
- package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-06-web-subprocess-validation.md +360 -0
- package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-07-holistic-analysis.md +258 -0
- package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-08-generate-report.md +301 -0
- package/src/modules/bmb/workflows/workflow-compliance-check/templates/compliance-report.md +140 -0
- package/src/modules/bmb/workflows/workflow-compliance-check/workflow.md +58 -0
- package/src/modules/bmgd/agents/game-architect.agent.yaml +1 -1
- package/src/modules/bmgd/agents/game-designer.agent.yaml +1 -1
- package/src/modules/bmgd/agents/game-dev.agent.yaml +1 -1
- package/src/modules/bmgd/agents/game-scrum-master.agent.yaml +1 -1
- package/src/modules/bmm/_module-installer/install-config.yaml +9 -15
- package/src/modules/bmm/agents/analyst.agent.yaml +14 -14
- package/src/modules/bmm/agents/architect.agent.yaml +12 -10
- package/src/modules/bmm/agents/dev.agent.yaml +20 -16
- package/src/modules/bmm/agents/pm.agent.yaml +13 -31
- package/src/modules/bmm/agents/quick-flow-solo-dev.agent.yaml +36 -0
- package/src/modules/bmm/agents/sm.agent.yaml +13 -31
- package/src/modules/bmm/agents/tea.agent.yaml +10 -7
- package/src/modules/bmm/agents/tech-writer.agent.yaml +7 -20
- package/src/modules/bmm/agents/ux-designer.agent.yaml +12 -10
- package/src/modules/bmm/data/README.md +29 -0
- package/src/modules/bmm/data/project-context-template.md +40 -0
- package/src/modules/bmm/docs/README.md +21 -9
- package/src/modules/bmm/docs/agents-guide.md +69 -23
- package/src/modules/bmm/docs/bmad-quick-flow.md +528 -0
- package/src/modules/bmm/docs/brownfield-guide.md +9 -10
- package/src/modules/bmm/docs/enterprise-agentic-development.md +1 -1
- package/src/modules/bmm/docs/glossary.md +5 -5
- package/src/modules/bmm/docs/images/workflow-method-greenfield.excalidraw +909 -1654
- package/src/modules/bmm/docs/images/workflow-method-greenfield.svg +2 -2
- package/src/modules/bmm/docs/quick-flow-solo-dev.md +337 -0
- package/src/modules/bmm/docs/scale-adaptive-system.md +5 -5
- package/src/modules/bmm/docs/test-architecture.md +84 -18
- package/src/modules/bmm/docs/workflows-analysis.md +36 -140
- package/src/modules/bmm/docs/workflows-implementation.md +32 -157
- package/src/modules/bmm/docs/workflows-planning.md +51 -212
- package/src/modules/bmm/docs/workflows-solutioning.md +24 -69
- package/src/modules/bmm/teams/default-party.csv +15 -14
- package/src/modules/bmm/teams/team-fullstack.yaml +0 -1
- package/src/modules/bmm/testarch/knowledge/api-request.md +303 -0
- package/src/modules/bmm/testarch/knowledge/auth-session.md +356 -0
- package/src/modules/bmm/testarch/knowledge/burn-in.md +273 -0
- package/src/modules/bmm/testarch/knowledge/file-utils.md +260 -0
- package/src/modules/bmm/testarch/knowledge/fixtures-composition.md +382 -0
- package/src/modules/bmm/testarch/knowledge/intercept-network-call.md +280 -0
- package/src/modules/bmm/testarch/knowledge/log.md +294 -0
- package/src/modules/bmm/testarch/knowledge/network-error-monitor.md +272 -0
- package/src/modules/bmm/testarch/knowledge/network-recorder.md +265 -0
- package/src/modules/bmm/testarch/knowledge/overview.md +284 -0
- package/src/modules/bmm/testarch/knowledge/recurse.md +296 -0
- package/src/modules/bmm/testarch/tea-index.csv +11 -0
- package/src/modules/bmm/workflows/1-analysis/product-brief/product-brief.template.md +8 -0
- package/src/modules/bmm/workflows/1-analysis/product-brief/steps/step-01-init.md +192 -0
- package/src/modules/bmm/workflows/1-analysis/product-brief/steps/step-01b-continue.md +167 -0
- package/src/modules/bmm/workflows/1-analysis/product-brief/steps/step-02-vision.md +203 -0
- package/src/modules/bmm/workflows/1-analysis/product-brief/steps/step-03-users.md +206 -0
- package/src/modules/bmm/workflows/1-analysis/product-brief/steps/step-04-metrics.md +209 -0
- package/src/modules/bmm/workflows/1-analysis/product-brief/steps/step-05-scope.md +223 -0
- package/src/modules/bmm/workflows/1-analysis/product-brief/steps/step-06-complete.md +199 -0
- package/src/modules/bmm/workflows/1-analysis/product-brief/workflow.md +58 -0
- package/src/modules/bmm/workflows/1-analysis/research/domain-steps/step-01-init.md +136 -0
- package/src/modules/bmm/workflows/1-analysis/research/domain-steps/step-02-domain-analysis.md +228 -0
- package/src/modules/bmm/workflows/1-analysis/research/domain-steps/step-03-competitive-landscape.md +237 -0
- package/src/modules/bmm/workflows/1-analysis/research/domain-steps/step-04-regulatory-focus.md +205 -0
- package/src/modules/bmm/workflows/1-analysis/research/domain-steps/step-05-technical-trends.md +233 -0
- package/src/modules/bmm/workflows/1-analysis/research/domain-steps/step-06-research-synthesis.md +443 -0
- package/src/modules/bmm/workflows/1-analysis/research/market-steps/step-01-init.md +182 -0
- package/src/modules/bmm/workflows/1-analysis/research/market-steps/step-02-customer-behavior.md +235 -0
- package/src/modules/bmm/workflows/1-analysis/research/market-steps/step-02-customer-insights.md +198 -0
- package/src/modules/bmm/workflows/1-analysis/research/market-steps/step-03-customer-pain-points.md +247 -0
- package/src/modules/bmm/workflows/1-analysis/research/market-steps/step-04-customer-decisions.md +257 -0
- package/src/modules/bmm/workflows/1-analysis/research/market-steps/step-05-competitive-analysis.md +175 -0
- package/src/modules/bmm/workflows/1-analysis/research/market-steps/step-06-research-completion.md +475 -0
- package/src/modules/bmm/workflows/1-analysis/research/research.template.md +16 -0
- package/src/modules/bmm/workflows/1-analysis/research/technical-steps/step-01-init.md +136 -0
- package/src/modules/bmm/workflows/1-analysis/research/technical-steps/step-02-technical-overview.md +237 -0
- package/src/modules/bmm/workflows/1-analysis/research/technical-steps/step-03-integration-patterns.md +246 -0
- package/src/modules/bmm/workflows/1-analysis/research/technical-steps/step-04-architectural-patterns.md +200 -0
- package/src/modules/bmm/workflows/1-analysis/research/technical-steps/step-05-implementation-research.md +237 -0
- package/src/modules/bmm/workflows/1-analysis/research/technical-steps/step-06-research-synthesis.md +486 -0
- package/src/modules/bmm/workflows/1-analysis/research/workflow.md +198 -0
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-01-init.md +159 -0
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-01b-continue.md +126 -0
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-02-discovery.md +209 -0
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-03-core-experience.md +215 -0
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-04-emotional-response.md +218 -0
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-05-inspiration.md +233 -0
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-06-design-system.md +251 -0
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-07-defining-experience.md +253 -0
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-08-visual-foundation.md +223 -0
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-09-design-directions.md +223 -0
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-10-user-journeys.md +240 -0
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-11-component-strategy.md +247 -0
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-12-ux-patterns.md +236 -0
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-13-responsive-accessibility.md +263 -0
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-14-complete.md +226 -0
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/ux-design-template.md +6 -138
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/workflow.md +53 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/prd-template.md +5 -200
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-01-init.md +161 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-01b-continue.md +123 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-02-discovery.md +275 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-03-success.md +271 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-04-journeys.md +272 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-05-domain.md +249 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-06-innovation.md +240 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-07-project-type.md +236 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-08-scoping.md +280 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-09-functional.md +251 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-10-nonfunctional.md +275 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-11-complete.md +210 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/workflow.md +61 -0
- package/src/modules/bmm/workflows/3-solutioning/architecture/architecture-decision-template.md +13 -0
- package/src/modules/bmm/workflows/3-solutioning/architecture/data/domain-complexity.csv +11 -0
- package/src/modules/bmm/workflows/3-solutioning/architecture/data/project-types.csv +7 -0
- package/src/modules/bmm/workflows/3-solutioning/architecture/steps/step-01-init.md +194 -0
- package/src/modules/bmm/workflows/3-solutioning/architecture/steps/step-01b-continue.md +163 -0
- package/src/modules/bmm/workflows/3-solutioning/architecture/steps/step-02-context.md +223 -0
- package/src/modules/bmm/workflows/3-solutioning/architecture/steps/step-03-starter.md +330 -0
- package/src/modules/bmm/workflows/3-solutioning/architecture/steps/step-04-decisions.md +317 -0
- package/src/modules/bmm/workflows/3-solutioning/architecture/steps/step-05-patterns.md +358 -0
- package/src/modules/bmm/workflows/3-solutioning/architecture/steps/step-06-structure.md +378 -0
- package/src/modules/bmm/workflows/3-solutioning/architecture/steps/step-07-validation.md +358 -0
- package/src/modules/bmm/workflows/3-solutioning/architecture/steps/step-08-complete.md +351 -0
- package/src/modules/bmm/workflows/3-solutioning/architecture/workflow.md +48 -0
- package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/instructions.md +247 -476
- package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/workflow.yaml +8 -18
- package/src/modules/bmm/workflows/4-implementation/code-review/instructions.xml +176 -0
- package/src/modules/bmm/workflows/4-implementation/code-review/workflow.yaml +4 -11
- package/src/modules/bmm/workflows/4-implementation/create-story/checklist.md +332 -214
- package/src/modules/bmm/workflows/4-implementation/create-story/instructions.xml +324 -0
- package/src/modules/bmm/workflows/4-implementation/create-story/workflow.yaml +21 -34
- package/src/modules/bmm/workflows/4-implementation/dev-story/checklist.md +65 -23
- package/src/modules/bmm/workflows/4-implementation/dev-story/instructions.xml +406 -0
- package/src/modules/bmm/workflows/4-implementation/dev-story/workflow.yaml +6 -37
- package/src/modules/bmm/workflows/4-implementation/sprint-planning/sprint-status-template.yaml +4 -3
- package/src/modules/bmm/workflows/4-implementation/sprint-planning/workflow.yaml +2 -0
- package/src/modules/bmm/workflows/bmad-quick-flow/create-tech-spec/instructions.md +115 -0
- package/src/modules/bmm/workflows/bmad-quick-flow/create-tech-spec/workflow.yaml +26 -0
- package/src/modules/bmm/workflows/bmad-quick-flow/quick-dev/checklist.md +25 -0
- package/src/modules/bmm/workflows/bmad-quick-flow/quick-dev/instructions.md +105 -0
- package/src/modules/bmm/workflows/bmad-quick-flow/quick-dev/workflow.yaml +29 -0
- package/src/modules/bmm/workflows/generate-project-context/project-context-template.md +20 -0
- package/src/modules/bmm/workflows/generate-project-context/steps/step-01-discover.md +193 -0
- package/src/modules/bmm/workflows/generate-project-context/steps/step-02-generate.md +317 -0
- package/src/modules/bmm/workflows/generate-project-context/steps/step-03-complete.md +277 -0
- package/src/modules/bmm/workflows/generate-project-context/workflow.md +48 -0
- package/src/modules/bmm/workflows/testarch/atdd/instructions.md +23 -3
- package/src/modules/bmm/workflows/testarch/automate/instructions.md +23 -2
- package/src/modules/bmm/workflows/testarch/ci/instructions.md +18 -1
- package/src/modules/bmm/workflows/testarch/framework/instructions.md +27 -1
- package/src/modules/bmm/workflows/testarch/test-design/instructions.md +8 -2
- package/src/modules/bmm/workflows/testarch/test-review/instructions.md +28 -8
- package/src/modules/bmm/workflows/workflow-status/init/instructions.md +66 -54
- package/src/modules/bmm/workflows/workflow-status/instructions.md +11 -4
- package/src/modules/bmm/workflows/workflow-status/paths/enterprise-brownfield.yaml +3 -2
- package/src/modules/bmm/workflows/workflow-status/paths/enterprise-greenfield.yaml +3 -2
- package/src/modules/bmm/workflows/workflow-status/paths/method-brownfield.yaml +3 -2
- package/src/modules/bmm/workflows/workflow-status/paths/method-greenfield.yaml +3 -2
- package/src/modules/cis/agents/README.md +1 -1
- package/src/modules/cis/agents/brainstorming-coach.agent.yaml +3 -2
- package/src/modules/cis/agents/creative-problem-solver.agent.yaml +2 -1
- package/src/modules/cis/agents/design-thinking-coach.agent.yaml +2 -1
- package/src/modules/cis/agents/innovation-strategist.agent.yaml +2 -1
- package/src/modules/cis/agents/presentation-master.agent.yaml +3 -2
- package/src/modules/cis/agents/storyteller.agent.yaml +2 -1
- package/src/modules/cis/teams/default-party.csv +6 -5
- package/src/utility/models/agent-activation-ide.xml +4 -4
- package/src/utility/models/agent-activation-web.xml +1 -11
- package/src/utility/models/fragments/activation-rules.xml +5 -6
- package/src/utility/models/fragments/handler-exec.xml +6 -5
- package/src/utility/models/fragments/handler-multi.xml +14 -0
- package/test/README.md +1 -1
- package/test/fixtures/agent-schema/valid/menu-commands/all-command-types.agent.yaml +1 -3
- package/tools/cli/README.md +1 -0
- package/tools/cli/bundlers/web-bundler.js +3 -14
- package/tools/cli/commands/agent-install.js +8 -8
- package/tools/cli/commands/cleanup.js +141 -0
- package/tools/cli/commands/install.js +48 -3
- package/tools/cli/installers/lib/core/config-collector.js +24 -0
- package/tools/cli/installers/lib/core/installer.js +612 -43
- package/tools/cli/installers/lib/ide/antigravity.js +51 -7
- package/tools/cli/installers/lib/ide/auggie.js +53 -0
- package/tools/cli/installers/lib/ide/claude-code.js +1 -6
- package/tools/cli/installers/lib/ide/cline.js +49 -0
- package/tools/cli/installers/lib/ide/codex.js +2 -2
- package/tools/cli/installers/lib/ide/crush.js +47 -0
- package/tools/cli/installers/lib/ide/gemini.js +47 -0
- package/tools/cli/installers/lib/ide/github-copilot.js +59 -48
- package/tools/cli/installers/lib/ide/iflow.js +47 -0
- package/tools/cli/installers/lib/ide/kilo.js +74 -0
- package/tools/cli/installers/lib/ide/qwen.js +54 -0
- package/tools/cli/installers/lib/ide/roo.js +71 -0
- package/tools/cli/installers/lib/ide/rovo-dev.js +290 -0
- package/tools/cli/installers/lib/ide/trae.js +47 -0
- package/tools/cli/lib/agent/compiler.js +156 -22
- package/tools/cli/lib/agent/installer.js +13 -3
- package/tools/cli/lib/agent-analyzer.js +46 -18
- package/tools/cli/lib/ui.js +204 -9
- package/tools/cli/lib/yaml-xml-builder.js +123 -24
- package/tools/platform-codes.yaml +12 -0
- package/tools/schema/agent.js +169 -20
- package/src/core/tasks/adv-elicit-methods.csv +0 -39
- package/src/core/workflows/brainstorming/README.md +0 -261
- package/src/core/workflows/brainstorming/instructions.md +0 -315
- package/src/core/workflows/brainstorming/workflow.yaml +0 -38
- package/src/core/workflows/party-mode/instructions.md +0 -183
- package/src/core/workflows/party-mode/workflow.yaml +0 -28
- package/src/modules/bmb/workflows/audit-workflow/checklist.md +0 -142
- package/src/modules/bmb/workflows/audit-workflow/instructions.md +0 -341
- package/src/modules/bmb/workflows/audit-workflow/template.md +0 -118
- package/src/modules/bmb/workflows/audit-workflow/workflow.yaml +0 -25
- package/src/modules/bmb/workflows/convert-legacy/README.md +0 -262
- package/src/modules/bmb/workflows/convert-legacy/checklist.md +0 -205
- package/src/modules/bmb/workflows/convert-legacy/instructions.md +0 -377
- package/src/modules/bmb/workflows/convert-legacy/workflow.yaml +0 -30
- package/src/modules/bmb/workflows/create-agent/instructions.md +0 -519
- package/src/modules/bmb/workflows/create-agent/workflow.yaml +0 -55
- package/src/modules/bmb/workflows/create-workflow/README.md +0 -277
- package/src/modules/bmb/workflows/create-workflow/brainstorm-context.md +0 -197
- package/src/modules/bmb/workflows/create-workflow/checklist.md +0 -94
- package/src/modules/bmb/workflows/create-workflow/instructions.md +0 -725
- package/src/modules/bmb/workflows/create-workflow/workflow-creation-guide.md +0 -1327
- package/src/modules/bmb/workflows/create-workflow/workflow-template/checklist.md +0 -24
- package/src/modules/bmb/workflows/create-workflow/workflow-template/instructions.md +0 -15
- package/src/modules/bmb/workflows/create-workflow/workflow-template/template.md +0 -9
- package/src/modules/bmb/workflows/create-workflow/workflow-template/workflow.yaml +0 -61
- package/src/modules/bmb/workflows/create-workflow/workflow.yaml +0 -41
- package/src/modules/bmb/workflows/edit-agent/README.md +0 -239
- package/src/modules/bmb/workflows/edit-agent/instructions.md +0 -654
- package/src/modules/bmb/workflows/edit-agent/workflow.yaml +0 -49
- package/src/modules/bmb/workflows/edit-workflow/README.md +0 -119
- package/src/modules/bmb/workflows/edit-workflow/checklist.md +0 -70
- package/src/modules/bmb/workflows/edit-workflow/instructions.md +0 -342
- package/src/modules/bmb/workflows/edit-workflow/workflow.yaml +0 -27
- package/src/modules/bmm/_module-installer/assets/bmm-kb.md +0 -1
- package/src/modules/bmm/_module-installer/assets/technical-decisions.md +0 -30
- package/src/modules/bmm/docs/quick-spec-flow.md +0 -652
- package/src/modules/bmm/workflows/1-analysis/brainstorm-project/instructions.md +0 -112
- package/src/modules/bmm/workflows/1-analysis/brainstorm-project/project-context.md +0 -25
- package/src/modules/bmm/workflows/1-analysis/brainstorm-project/workflow.yaml +0 -39
- package/src/modules/bmm/workflows/1-analysis/domain-research/instructions.md +0 -425
- package/src/modules/bmm/workflows/1-analysis/domain-research/template.md +0 -180
- package/src/modules/bmm/workflows/1-analysis/domain-research/workflow.yaml +0 -56
- package/src/modules/bmm/workflows/1-analysis/product-brief/checklist.md +0 -115
- package/src/modules/bmm/workflows/1-analysis/product-brief/instructions.md +0 -524
- package/src/modules/bmm/workflows/1-analysis/product-brief/template.md +0 -181
- package/src/modules/bmm/workflows/1-analysis/product-brief/workflow.yaml +0 -61
- package/src/modules/bmm/workflows/1-analysis/research/checklist-deep-prompt.md +0 -144
- package/src/modules/bmm/workflows/1-analysis/research/checklist-technical.md +0 -249
- package/src/modules/bmm/workflows/1-analysis/research/checklist.md +0 -299
- package/src/modules/bmm/workflows/1-analysis/research/claude-code/injections.yaml +0 -114
- package/src/modules/bmm/workflows/1-analysis/research/instructions-deep-prompt.md +0 -438
- package/src/modules/bmm/workflows/1-analysis/research/instructions-market.md +0 -675
- package/src/modules/bmm/workflows/1-analysis/research/instructions-router.md +0 -134
- package/src/modules/bmm/workflows/1-analysis/research/instructions-technical.md +0 -534
- package/src/modules/bmm/workflows/1-analysis/research/template-deep-prompt.md +0 -94
- package/src/modules/bmm/workflows/1-analysis/research/template-market.md +0 -347
- package/src/modules/bmm/workflows/1-analysis/research/template-technical.md +0 -245
- package/src/modules/bmm/workflows/1-analysis/research/workflow.yaml +0 -62
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/checklist.md +0 -310
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/instructions.md +0 -1308
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/workflow.yaml +0 -93
- package/src/modules/bmm/workflows/2-plan-workflows/prd/checklist.md +0 -346
- package/src/modules/bmm/workflows/2-plan-workflows/prd/instructions.md +0 -703
- package/src/modules/bmm/workflows/2-plan-workflows/prd/workflow.yaml +0 -78
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/checklist.md +0 -217
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/epics-template.md +0 -74
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/instructions-generate-stories.md +0 -436
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/instructions.md +0 -980
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/tech-spec-template.md +0 -181
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/user-story-template.md +0 -90
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/workflow.yaml +0 -60
- package/src/modules/bmm/workflows/3-solutioning/architecture/architecture-patterns.yaml +0 -321
- package/src/modules/bmm/workflows/3-solutioning/architecture/architecture-template.md +0 -103
- package/src/modules/bmm/workflows/3-solutioning/architecture/checklist.md +0 -240
- package/src/modules/bmm/workflows/3-solutioning/architecture/decision-catalog.yaml +0 -222
- package/src/modules/bmm/workflows/3-solutioning/architecture/instructions.md +0 -768
- package/src/modules/bmm/workflows/3-solutioning/architecture/pattern-categories.csv +0 -13
- package/src/modules/bmm/workflows/3-solutioning/architecture/workflow.yaml +0 -100
- package/src/modules/bmm/workflows/4-implementation/code-review/backlog_template.md +0 -12
- package/src/modules/bmm/workflows/4-implementation/code-review/checklist.md +0 -22
- package/src/modules/bmm/workflows/4-implementation/code-review/instructions.md +0 -398
- package/src/modules/bmm/workflows/4-implementation/create-story/instructions.md +0 -256
- package/src/modules/bmm/workflows/4-implementation/dev-story/instructions.md +0 -267
- package/src/modules/bmm/workflows/4-implementation/epic-tech-context/checklist.md +0 -17
- package/src/modules/bmm/workflows/4-implementation/epic-tech-context/instructions.md +0 -164
- package/src/modules/bmm/workflows/4-implementation/epic-tech-context/template.md +0 -76
- package/src/modules/bmm/workflows/4-implementation/epic-tech-context/workflow.yaml +0 -58
- package/src/modules/bmm/workflows/4-implementation/story-context/checklist.md +0 -16
- package/src/modules/bmm/workflows/4-implementation/story-context/context-template.xml +0 -34
- package/src/modules/bmm/workflows/4-implementation/story-context/instructions.md +0 -209
- package/src/modules/bmm/workflows/4-implementation/story-context/workflow.yaml +0 -63
- package/src/modules/bmm/workflows/4-implementation/story-done/instructions.md +0 -111
- package/src/modules/bmm/workflows/4-implementation/story-done/workflow.yaml +0 -28
- package/src/modules/bmm/workflows/4-implementation/story-ready/instructions.md +0 -117
- package/src/modules/bmm/workflows/4-implementation/story-ready/workflow.yaml +0 -25
- package/src/modules/bmm/workflows/workflow-status/paths/quick-flow-brownfield.yaml +0 -58
- package/src/modules/bmm/workflows/workflow-status/paths/quick-flow-greenfield.yaml +0 -47
- /package/src/modules/bmb/docs/{agent-compilation.md → agents/agent-compilation.md} +0 -0
- /package/src/modules/bmb/docs/{expert-agent-architecture.md → agents/expert-agent-architecture.md} +0 -0
- /package/src/modules/bmb/docs/{index.md → agents/index.md} +0 -0
- /package/src/modules/bmb/docs/{understanding-agent-types.md → agents/understanding-agent-types.md} +0 -0
- /package/src/modules/bmb/reference/{readme.md → README.md} +0 -0
- /package/src/modules/bmb/workflows/create-agent/{agent-validation-checklist.md → data/agent-validation-checklist.md} +0 -0
- /package/src/modules/bmb/workflows/create-agent/{brainstorm-context.md → data/brainstorm-context.md} +0 -0
- /package/src/modules/bmb/workflows/create-agent/{communication-presets.csv → data/communication-presets.csv} +0 -0
- /package/src/modules/bmb/{workflows → workflows-legacy}/create-module/README.md +0 -0
- /package/src/modules/bmb/{workflows → workflows-legacy}/create-module/brainstorm-context.md +0 -0
- /package/src/modules/bmb/{workflows → workflows-legacy}/create-module/checklist.md +0 -0
- /package/src/modules/bmb/{workflows → workflows-legacy}/create-module/installer-templates/install-config.yaml +0 -0
- /package/src/modules/bmb/{workflows → workflows-legacy}/create-module/installer-templates/installer.js +0 -0
- /package/src/modules/bmb/{workflows → workflows-legacy}/create-module/instructions.md +0 -0
- /package/src/modules/bmb/{workflows → workflows-legacy}/create-module/module-structure.md +0 -0
- /package/src/modules/bmb/{workflows → workflows-legacy}/create-module/workflow.yaml +0 -0
- /package/src/modules/bmb/{workflows → workflows-legacy}/edit-module/README.md +0 -0
- /package/src/modules/bmb/{workflows → workflows-legacy}/edit-module/checklist.md +0 -0
- /package/src/modules/bmb/{workflows → workflows-legacy}/edit-module/instructions.md +0 -0
- /package/src/modules/bmb/{workflows → workflows-legacy}/edit-module/workflow.yaml +0 -0
- /package/src/modules/bmb/{workflows → workflows-legacy}/module-brief/README.md +0 -0
- /package/src/modules/bmb/{workflows → workflows-legacy}/module-brief/checklist.md +0 -0
- /package/src/modules/bmb/{workflows → workflows-legacy}/module-brief/instructions.md +0 -0
- /package/src/modules/bmb/{workflows → workflows-legacy}/module-brief/template.md +0 -0
- /package/src/modules/bmb/{workflows → workflows-legacy}/module-brief/workflow.yaml +0 -0
- /package/src/modules/bmm/{workflows/techdoc → data}/documentation-standards.md +0 -0
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
# Fixtures Composition with mergeTests
|
|
2
|
+
|
|
3
|
+
## Principle
|
|
4
|
+
|
|
5
|
+
Combine multiple Playwright fixtures using `mergeTests` to create a unified test object with all capabilities. Build composable test infrastructure by merging playwright-utils fixtures with custom project fixtures.
|
|
6
|
+
|
|
7
|
+
## Rationale
|
|
8
|
+
|
|
9
|
+
Using fixtures from multiple sources requires combining them:
|
|
10
|
+
|
|
11
|
+
- Importing from multiple fixture files is verbose
|
|
12
|
+
- Name conflicts between fixtures
|
|
13
|
+
- Duplicate fixture definitions
|
|
14
|
+
- No clear single test object
|
|
15
|
+
|
|
16
|
+
Playwright's `mergeTests` provides:
|
|
17
|
+
|
|
18
|
+
- **Single test object**: All fixtures in one import
|
|
19
|
+
- **Conflict resolution**: Handles name collisions automatically
|
|
20
|
+
- **Composition pattern**: Mix utilities, custom fixtures, third-party fixtures
|
|
21
|
+
- **Type safety**: Full TypeScript support for merged fixtures
|
|
22
|
+
- **Maintainability**: One place to manage all fixtures
|
|
23
|
+
|
|
24
|
+
## Pattern Examples
|
|
25
|
+
|
|
26
|
+
### Example 1: Basic Fixture Merging
|
|
27
|
+
|
|
28
|
+
**Context**: Combine multiple playwright-utils fixtures into single test object.
|
|
29
|
+
|
|
30
|
+
**Implementation**:
|
|
31
|
+
|
|
32
|
+
```typescript
|
|
33
|
+
// playwright/support/merged-fixtures.ts
|
|
34
|
+
import { mergeTests } from '@playwright/test';
|
|
35
|
+
import { test as apiRequestFixture } from '@seontechnologies/playwright-utils/api-request/fixtures';
|
|
36
|
+
import { test as authFixture } from '@seontechnologies/playwright-utils/auth-session/fixtures';
|
|
37
|
+
import { test as recurseFixture } from '@seontechnologies/playwright-utils/recurse/fixtures';
|
|
38
|
+
|
|
39
|
+
// Merge all fixtures
|
|
40
|
+
export const test = mergeTests(apiRequestFixture, authFixture, recurseFixture);
|
|
41
|
+
|
|
42
|
+
export { expect } from '@playwright/test';
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
```typescript
|
|
46
|
+
// In your tests - import from merged fixtures
|
|
47
|
+
import { test, expect } from '../support/merged-fixtures';
|
|
48
|
+
|
|
49
|
+
test('all utilities available', async ({
|
|
50
|
+
apiRequest, // From api-request fixture
|
|
51
|
+
authToken, // From auth fixture
|
|
52
|
+
recurse, // From recurse fixture
|
|
53
|
+
}) => {
|
|
54
|
+
// All fixtures available in single test signature
|
|
55
|
+
const { body } = await apiRequest({
|
|
56
|
+
method: 'GET',
|
|
57
|
+
path: '/api/protected',
|
|
58
|
+
headers: { Authorization: `Bearer ${authToken}` },
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
await recurse(
|
|
62
|
+
() => apiRequest({ method: 'GET', path: `/status/${body.id}` }),
|
|
63
|
+
(res) => res.body.ready === true,
|
|
64
|
+
);
|
|
65
|
+
});
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
**Key Points**:
|
|
69
|
+
|
|
70
|
+
- Create one `merged-fixtures.ts` per project
|
|
71
|
+
- Import test object from merged fixtures in all test files
|
|
72
|
+
- All utilities available without multiple imports
|
|
73
|
+
- Type-safe access to all fixtures
|
|
74
|
+
|
|
75
|
+
### Example 2: Combining with Custom Fixtures
|
|
76
|
+
|
|
77
|
+
**Context**: Add project-specific fixtures alongside playwright-utils.
|
|
78
|
+
|
|
79
|
+
**Implementation**:
|
|
80
|
+
|
|
81
|
+
```typescript
|
|
82
|
+
// playwright/support/custom-fixtures.ts - Your project fixtures
|
|
83
|
+
import { test as base } from '@playwright/test';
|
|
84
|
+
import { createUser } from './factories/user-factory';
|
|
85
|
+
import { seedDatabase } from './helpers/db-seeder';
|
|
86
|
+
|
|
87
|
+
export const test = base.extend({
|
|
88
|
+
// Custom fixture 1: Auto-seeded user
|
|
89
|
+
testUser: async ({ request }, use) => {
|
|
90
|
+
const user = await createUser({ role: 'admin' });
|
|
91
|
+
await seedDatabase('users', [user]);
|
|
92
|
+
await use(user);
|
|
93
|
+
// Cleanup happens automatically
|
|
94
|
+
},
|
|
95
|
+
|
|
96
|
+
// Custom fixture 2: Database helpers
|
|
97
|
+
db: async ({}, use) => {
|
|
98
|
+
await use({
|
|
99
|
+
seed: seedDatabase,
|
|
100
|
+
clear: () => seedDatabase.truncate(),
|
|
101
|
+
});
|
|
102
|
+
},
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
// playwright/support/merged-fixtures.ts - Combine everything
|
|
106
|
+
import { mergeTests } from '@playwright/test';
|
|
107
|
+
import { test as apiRequestFixture } from '@seontechnologies/playwright-utils/api-request/fixtures';
|
|
108
|
+
import { test as authFixture } from '@seontechnologies/playwright-utils/auth-session/fixtures';
|
|
109
|
+
import { test as customFixtures } from './custom-fixtures';
|
|
110
|
+
|
|
111
|
+
export const test = mergeTests(
|
|
112
|
+
apiRequestFixture,
|
|
113
|
+
authFixture,
|
|
114
|
+
customFixtures, // Your project fixtures
|
|
115
|
+
);
|
|
116
|
+
|
|
117
|
+
export { expect } from '@playwright/test';
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
```typescript
|
|
121
|
+
// In tests - all fixtures available
|
|
122
|
+
import { test, expect } from '../support/merged-fixtures';
|
|
123
|
+
|
|
124
|
+
test('using mixed fixtures', async ({
|
|
125
|
+
apiRequest, // playwright-utils
|
|
126
|
+
authToken, // playwright-utils
|
|
127
|
+
testUser, // custom
|
|
128
|
+
db, // custom
|
|
129
|
+
}) => {
|
|
130
|
+
// Use playwright-utils
|
|
131
|
+
const { body } = await apiRequest({
|
|
132
|
+
method: 'GET',
|
|
133
|
+
path: `/api/users/${testUser.id}`,
|
|
134
|
+
headers: { Authorization: `Bearer ${authToken}` },
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
// Use custom fixture
|
|
138
|
+
await db.clear();
|
|
139
|
+
});
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
**Key Points**:
|
|
143
|
+
|
|
144
|
+
- Custom fixtures extend `base` test
|
|
145
|
+
- Merge custom with playwright-utils fixtures
|
|
146
|
+
- All available in one test signature
|
|
147
|
+
- Maintainable separation of concerns
|
|
148
|
+
|
|
149
|
+
### Example 3: Full Utility Suite Integration
|
|
150
|
+
|
|
151
|
+
**Context**: Production setup with all core playwright-utils and custom fixtures.
|
|
152
|
+
|
|
153
|
+
**Implementation**:
|
|
154
|
+
|
|
155
|
+
```typescript
|
|
156
|
+
// playwright/support/merged-fixtures.ts
|
|
157
|
+
import { mergeTests } from '@playwright/test';
|
|
158
|
+
|
|
159
|
+
// Playwright utils fixtures
|
|
160
|
+
import { test as apiRequestFixture } from '@seontechnologies/playwright-utils/api-request/fixtures';
|
|
161
|
+
import { test as authFixture } from '@seontechnologies/playwright-utils/auth-session/fixtures';
|
|
162
|
+
import { test as interceptFixture } from '@seontechnologies/playwright-utils/intercept-network-call/fixtures';
|
|
163
|
+
import { test as recurseFixture } from '@seontechnologies/playwright-utils/recurse/fixtures';
|
|
164
|
+
import { test as networkRecorderFixture } from '@seontechnologies/playwright-utils/network-recorder/fixtures';
|
|
165
|
+
|
|
166
|
+
// Custom project fixtures
|
|
167
|
+
import { test as customFixtures } from './custom-fixtures';
|
|
168
|
+
|
|
169
|
+
// Merge everything
|
|
170
|
+
export const test = mergeTests(apiRequestFixture, authFixture, interceptFixture, recurseFixture, networkRecorderFixture, customFixtures);
|
|
171
|
+
|
|
172
|
+
export { expect } from '@playwright/test';
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
```typescript
|
|
176
|
+
// In tests
|
|
177
|
+
import { test, expect } from '../support/merged-fixtures';
|
|
178
|
+
|
|
179
|
+
test('full integration', async ({
|
|
180
|
+
page,
|
|
181
|
+
context,
|
|
182
|
+
apiRequest,
|
|
183
|
+
authToken,
|
|
184
|
+
interceptNetworkCall,
|
|
185
|
+
recurse,
|
|
186
|
+
networkRecorder,
|
|
187
|
+
testUser, // custom
|
|
188
|
+
}) => {
|
|
189
|
+
// All utilities + custom fixtures available
|
|
190
|
+
await networkRecorder.setup(context);
|
|
191
|
+
|
|
192
|
+
const usersCall = interceptNetworkCall({ url: '**/api/users' });
|
|
193
|
+
|
|
194
|
+
await page.goto('/users');
|
|
195
|
+
const { responseJson } = await usersCall;
|
|
196
|
+
|
|
197
|
+
expect(responseJson).toContainEqual(expect.objectContaining({ id: testUser.id }));
|
|
198
|
+
});
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
**Key Points**:
|
|
202
|
+
|
|
203
|
+
- One merged-fixtures.ts for entire project
|
|
204
|
+
- Combine all playwright-utils you use
|
|
205
|
+
- Add custom project fixtures
|
|
206
|
+
- Single import in all test files
|
|
207
|
+
|
|
208
|
+
### Example 4: Fixture Override Pattern
|
|
209
|
+
|
|
210
|
+
**Context**: Override default options for specific test files or describes.
|
|
211
|
+
|
|
212
|
+
**Implementation**:
|
|
213
|
+
|
|
214
|
+
```typescript
|
|
215
|
+
import { test, expect } from '../support/merged-fixtures';
|
|
216
|
+
|
|
217
|
+
// Override auth options for entire file
|
|
218
|
+
test.use({
|
|
219
|
+
authOptions: {
|
|
220
|
+
userIdentifier: 'admin',
|
|
221
|
+
environment: 'staging',
|
|
222
|
+
},
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
test('uses admin on staging', async ({ authToken }) => {
|
|
226
|
+
// Token is for admin user on staging environment
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
// Override for specific describe block
|
|
230
|
+
test.describe('manager tests', () => {
|
|
231
|
+
test.use({
|
|
232
|
+
authOptions: {
|
|
233
|
+
userIdentifier: 'manager',
|
|
234
|
+
},
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
test('manager can access reports', async ({ page }) => {
|
|
238
|
+
// Uses manager token
|
|
239
|
+
await page.goto('/reports');
|
|
240
|
+
});
|
|
241
|
+
});
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
**Key Points**:
|
|
245
|
+
|
|
246
|
+
- `test.use()` overrides fixture options
|
|
247
|
+
- Can override at file or describe level
|
|
248
|
+
- Options merge with defaults
|
|
249
|
+
- Type-safe overrides
|
|
250
|
+
|
|
251
|
+
### Example 5: Avoiding Fixture Conflicts
|
|
252
|
+
|
|
253
|
+
**Context**: Handle name collisions when merging fixtures with same names.
|
|
254
|
+
|
|
255
|
+
**Implementation**:
|
|
256
|
+
|
|
257
|
+
```typescript
|
|
258
|
+
// If two fixtures have same name, last one wins
|
|
259
|
+
import { test as fixture1 } from './fixture1'; // has 'user' fixture
|
|
260
|
+
import { test as fixture2 } from './fixture2'; // also has 'user' fixture
|
|
261
|
+
|
|
262
|
+
const test = mergeTests(fixture1, fixture2);
|
|
263
|
+
// fixture2's 'user' overrides fixture1's 'user'
|
|
264
|
+
|
|
265
|
+
// Better: Rename fixtures before merging
|
|
266
|
+
import { test as base } from '@playwright/test';
|
|
267
|
+
import { test as fixture1 } from './fixture1';
|
|
268
|
+
|
|
269
|
+
const fixture1Renamed = base.extend({
|
|
270
|
+
user1: fixture1._extend.user, // Rename to avoid conflict
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
const test = mergeTests(fixture1Renamed, fixture2);
|
|
274
|
+
// Now both 'user1' and 'user' available
|
|
275
|
+
|
|
276
|
+
// Best: Design fixtures without conflicts
|
|
277
|
+
// - Prefix custom fixtures: 'myAppUser', 'myAppDb'
|
|
278
|
+
// - Playwright-utils uses descriptive names: 'apiRequest', 'authToken'
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
**Key Points**:
|
|
282
|
+
|
|
283
|
+
- Last fixture wins in conflicts
|
|
284
|
+
- Rename fixtures to avoid collisions
|
|
285
|
+
- Design fixtures with unique names
|
|
286
|
+
- Playwright-utils uses descriptive names (no conflicts)
|
|
287
|
+
|
|
288
|
+
## Recommended Project Structure
|
|
289
|
+
|
|
290
|
+
```
|
|
291
|
+
playwright/
|
|
292
|
+
├── support/
|
|
293
|
+
│ ├── merged-fixtures.ts # ⭐ Single test object for project
|
|
294
|
+
│ ├── custom-fixtures.ts # Your project-specific fixtures
|
|
295
|
+
│ ├── auth/
|
|
296
|
+
│ │ ├── auth-fixture.ts # Auth wrapper (if needed)
|
|
297
|
+
│ │ └── custom-auth-provider.ts
|
|
298
|
+
│ ├── fixtures/
|
|
299
|
+
│ │ ├── user-fixture.ts
|
|
300
|
+
│ │ ├── db-fixture.ts
|
|
301
|
+
│ │ └── api-fixture.ts
|
|
302
|
+
│ └── utils/
|
|
303
|
+
│ └── factories/
|
|
304
|
+
└── tests/
|
|
305
|
+
├── api/
|
|
306
|
+
│ └── users.spec.ts # import { test } from '../../support/merged-fixtures'
|
|
307
|
+
├── e2e/
|
|
308
|
+
│ └── login.spec.ts # import { test } from '../../support/merged-fixtures'
|
|
309
|
+
└── component/
|
|
310
|
+
└── button.spec.ts # import { test } from '../../support/merged-fixtures'
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
## Benefits of Fixture Composition
|
|
314
|
+
|
|
315
|
+
**Compared to direct imports:**
|
|
316
|
+
|
|
317
|
+
```typescript
|
|
318
|
+
// ❌ Without mergeTests (verbose)
|
|
319
|
+
import { test as base } from '@playwright/test';
|
|
320
|
+
import { apiRequest } from '@seontechnologies/playwright-utils/api-request';
|
|
321
|
+
import { getAuthToken } from './auth';
|
|
322
|
+
import { createUser } from './factories';
|
|
323
|
+
|
|
324
|
+
test('verbose', async ({ request }) => {
|
|
325
|
+
const token = await getAuthToken();
|
|
326
|
+
const user = await createUser();
|
|
327
|
+
const response = await apiRequest({ request, method: 'GET', path: '/api/users' });
|
|
328
|
+
// Manual wiring everywhere
|
|
329
|
+
});
|
|
330
|
+
|
|
331
|
+
// ✅ With mergeTests (clean)
|
|
332
|
+
import { test } from '../support/merged-fixtures';
|
|
333
|
+
|
|
334
|
+
test('clean', async ({ apiRequest, authToken, testUser }) => {
|
|
335
|
+
const { body } = await apiRequest({ method: 'GET', path: '/api/users' });
|
|
336
|
+
// All fixtures auto-wired
|
|
337
|
+
});
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
**Reduction:** ~10 lines per test → ~2 lines
|
|
341
|
+
|
|
342
|
+
## Related Fragments
|
|
343
|
+
|
|
344
|
+
- `overview.md` - Installation and design principles
|
|
345
|
+
- `api-request.md`, `auth-session.md`, `recurse.md` - Utilities to merge
|
|
346
|
+
- `network-recorder.md`, `intercept-network-call.md`, `log.md` - Additional utilities
|
|
347
|
+
|
|
348
|
+
## Anti-Patterns
|
|
349
|
+
|
|
350
|
+
**❌ Importing test from multiple fixture files:**
|
|
351
|
+
|
|
352
|
+
```typescript
|
|
353
|
+
import { test } from '@seontechnologies/playwright-utils/api-request/fixtures';
|
|
354
|
+
// Also need auth...
|
|
355
|
+
import { test as authTest } from '@seontechnologies/playwright-utils/auth-session/fixtures';
|
|
356
|
+
// Name conflict! Which test to use?
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
**✅ Use merged fixtures:**
|
|
360
|
+
|
|
361
|
+
```typescript
|
|
362
|
+
import { test } from '../support/merged-fixtures';
|
|
363
|
+
// All utilities available, no conflicts
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
**❌ Merging too many fixtures (kitchen sink):**
|
|
367
|
+
|
|
368
|
+
```typescript
|
|
369
|
+
// Merging 20+ fixtures makes test signature huge
|
|
370
|
+
const test = mergeTests(...20 different fixtures)
|
|
371
|
+
|
|
372
|
+
test('my test', async ({ fixture1, fixture2, ..., fixture20 }) => {
|
|
373
|
+
// Cognitive overload
|
|
374
|
+
})
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
**✅ Merge only what you actually use:**
|
|
378
|
+
|
|
379
|
+
```typescript
|
|
380
|
+
// Merge the 4-6 fixtures your project actually needs
|
|
381
|
+
const test = mergeTests(apiRequestFixture, authFixture, recurseFixture, customFixtures);
|
|
382
|
+
```
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
# Intercept Network Call Utility
|
|
2
|
+
|
|
3
|
+
## Principle
|
|
4
|
+
|
|
5
|
+
Intercept network requests with a single declarative call that returns a Promise. Automatically parse JSON responses, support both spy (observe) and stub (mock) patterns, and use powerful glob pattern matching for URL filtering.
|
|
6
|
+
|
|
7
|
+
## Rationale
|
|
8
|
+
|
|
9
|
+
Vanilla Playwright's network interception requires multiple steps:
|
|
10
|
+
|
|
11
|
+
- `page.route()` to setup, `page.waitForResponse()` to capture
|
|
12
|
+
- Manual JSON parsing
|
|
13
|
+
- Verbose syntax for conditional handling
|
|
14
|
+
- Complex filter predicates
|
|
15
|
+
|
|
16
|
+
The `interceptNetworkCall` utility provides:
|
|
17
|
+
|
|
18
|
+
- **Single declarative call**: Setup and wait in one statement
|
|
19
|
+
- **Automatic JSON parsing**: Response pre-parsed, strongly typed
|
|
20
|
+
- **Flexible URL patterns**: Glob matching with picomatch
|
|
21
|
+
- **Spy or stub modes**: Observe real traffic or mock responses
|
|
22
|
+
- **Concise API**: Reduces boilerplate by 60-70%
|
|
23
|
+
|
|
24
|
+
## Pattern Examples
|
|
25
|
+
|
|
26
|
+
### Example 1: Spy on Network (Observe Real Traffic)
|
|
27
|
+
|
|
28
|
+
**Context**: Capture and inspect real API responses for validation.
|
|
29
|
+
|
|
30
|
+
**Implementation**:
|
|
31
|
+
|
|
32
|
+
```typescript
|
|
33
|
+
import { test } from '@seontechnologies/playwright-utils/intercept-network-call/fixtures';
|
|
34
|
+
|
|
35
|
+
test('should spy on users API', async ({ page, interceptNetworkCall }) => {
|
|
36
|
+
// Setup interception BEFORE navigation
|
|
37
|
+
const usersCall = interceptNetworkCall({
|
|
38
|
+
url: '**/api/users', // Glob pattern
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
await page.goto('/dashboard');
|
|
42
|
+
|
|
43
|
+
// Wait for response and access parsed data
|
|
44
|
+
const { responseJson, status } = await usersCall;
|
|
45
|
+
|
|
46
|
+
expect(status).toBe(200);
|
|
47
|
+
expect(responseJson).toHaveLength(10);
|
|
48
|
+
expect(responseJson[0]).toHaveProperty('name');
|
|
49
|
+
});
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
**Key Points**:
|
|
53
|
+
|
|
54
|
+
- Intercept before navigation (critical for race-free tests)
|
|
55
|
+
- Returns Promise with `{ responseJson, status, requestBody }`
|
|
56
|
+
- Glob patterns (`**` matches any path segment)
|
|
57
|
+
- JSON automatically parsed
|
|
58
|
+
|
|
59
|
+
### Example 2: Stub Network (Mock Response)
|
|
60
|
+
|
|
61
|
+
**Context**: Mock API responses for testing UI behavior without backend.
|
|
62
|
+
|
|
63
|
+
**Implementation**:
|
|
64
|
+
|
|
65
|
+
```typescript
|
|
66
|
+
test('should stub users API', async ({ page, interceptNetworkCall }) => {
|
|
67
|
+
const mockUsers = [
|
|
68
|
+
{ id: 1, name: 'Test User 1' },
|
|
69
|
+
{ id: 2, name: 'Test User 2' },
|
|
70
|
+
];
|
|
71
|
+
|
|
72
|
+
const usersCall = interceptNetworkCall({
|
|
73
|
+
url: '**/api/users',
|
|
74
|
+
fulfillResponse: {
|
|
75
|
+
status: 200,
|
|
76
|
+
body: mockUsers,
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
await page.goto('/dashboard');
|
|
81
|
+
await usersCall;
|
|
82
|
+
|
|
83
|
+
// UI shows mocked data
|
|
84
|
+
await expect(page.getByText('Test User 1')).toBeVisible();
|
|
85
|
+
await expect(page.getByText('Test User 2')).toBeVisible();
|
|
86
|
+
});
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
**Key Points**:
|
|
90
|
+
|
|
91
|
+
- `fulfillResponse` mocks the API
|
|
92
|
+
- No backend needed
|
|
93
|
+
- Test UI logic in isolation
|
|
94
|
+
- Status code and body fully controllable
|
|
95
|
+
|
|
96
|
+
### Example 3: Conditional Response Handling
|
|
97
|
+
|
|
98
|
+
**Context**: Different responses based on request method or parameters.
|
|
99
|
+
|
|
100
|
+
**Implementation**:
|
|
101
|
+
|
|
102
|
+
```typescript
|
|
103
|
+
test('conditional mocking', async ({ page, interceptNetworkCall }) => {
|
|
104
|
+
await interceptNetworkCall({
|
|
105
|
+
url: '**/api/data',
|
|
106
|
+
handler: async (route, request) => {
|
|
107
|
+
if (request.method() === 'POST') {
|
|
108
|
+
// Mock POST success
|
|
109
|
+
await route.fulfill({
|
|
110
|
+
status: 201,
|
|
111
|
+
body: JSON.stringify({ id: 'new-id', success: true }),
|
|
112
|
+
});
|
|
113
|
+
} else if (request.method() === 'GET') {
|
|
114
|
+
// Mock GET with data
|
|
115
|
+
await route.fulfill({
|
|
116
|
+
status: 200,
|
|
117
|
+
body: JSON.stringify([{ id: 1, name: 'Item' }]),
|
|
118
|
+
});
|
|
119
|
+
} else {
|
|
120
|
+
// Let other methods through
|
|
121
|
+
await route.continue();
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
await page.goto('/data-page');
|
|
127
|
+
});
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
**Key Points**:
|
|
131
|
+
|
|
132
|
+
- `handler` function for complex logic
|
|
133
|
+
- Access full `route` and `request` objects
|
|
134
|
+
- Can mock, continue, or abort
|
|
135
|
+
- Flexible for advanced scenarios
|
|
136
|
+
|
|
137
|
+
### Example 4: Error Simulation
|
|
138
|
+
|
|
139
|
+
**Context**: Testing error handling in UI when API fails.
|
|
140
|
+
|
|
141
|
+
**Implementation**:
|
|
142
|
+
|
|
143
|
+
```typescript
|
|
144
|
+
test('should handle API errors gracefully', async ({ page, interceptNetworkCall }) => {
|
|
145
|
+
// Simulate 500 error
|
|
146
|
+
const errorCall = interceptNetworkCall({
|
|
147
|
+
url: '**/api/users',
|
|
148
|
+
fulfillResponse: {
|
|
149
|
+
status: 500,
|
|
150
|
+
body: { error: 'Internal Server Error' },
|
|
151
|
+
},
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
await page.goto('/dashboard');
|
|
155
|
+
await errorCall;
|
|
156
|
+
|
|
157
|
+
// Verify UI shows error state
|
|
158
|
+
await expect(page.getByText('Failed to load users')).toBeVisible();
|
|
159
|
+
await expect(page.getByTestId('retry-button')).toBeVisible();
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
// Simulate network timeout
|
|
163
|
+
test('should handle timeout', async ({ page, interceptNetworkCall }) => {
|
|
164
|
+
await interceptNetworkCall({
|
|
165
|
+
url: '**/api/slow',
|
|
166
|
+
handler: async (route) => {
|
|
167
|
+
// Never respond - simulates timeout
|
|
168
|
+
await new Promise(() => {});
|
|
169
|
+
},
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
await page.goto('/slow-page');
|
|
173
|
+
|
|
174
|
+
// UI should show timeout error
|
|
175
|
+
await expect(page.getByText('Request timed out')).toBeVisible({ timeout: 10000 });
|
|
176
|
+
});
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
**Key Points**:
|
|
180
|
+
|
|
181
|
+
- Mock error statuses (4xx, 5xx)
|
|
182
|
+
- Test timeout scenarios
|
|
183
|
+
- Validate error UI states
|
|
184
|
+
- No real failures needed
|
|
185
|
+
|
|
186
|
+
### Example 5: Multiple Intercepts (Order Matters!)
|
|
187
|
+
|
|
188
|
+
**Context**: Intercepting different endpoints in same test - setup order is critical.
|
|
189
|
+
|
|
190
|
+
**Implementation**:
|
|
191
|
+
|
|
192
|
+
```typescript
|
|
193
|
+
test('multiple intercepts', async ({ page, interceptNetworkCall }) => {
|
|
194
|
+
// ✅ CORRECT: Setup all intercepts BEFORE navigation
|
|
195
|
+
const usersCall = interceptNetworkCall({ url: '**/api/users' });
|
|
196
|
+
const productsCall = interceptNetworkCall({ url: '**/api/products' });
|
|
197
|
+
const ordersCall = interceptNetworkCall({ url: '**/api/orders' });
|
|
198
|
+
|
|
199
|
+
// THEN navigate
|
|
200
|
+
await page.goto('/dashboard');
|
|
201
|
+
|
|
202
|
+
// Wait for all (or specific ones)
|
|
203
|
+
const [users, products] = await Promise.all([usersCall, productsCall]);
|
|
204
|
+
|
|
205
|
+
expect(users.responseJson).toHaveLength(10);
|
|
206
|
+
expect(products.responseJson).toHaveLength(50);
|
|
207
|
+
});
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
**Key Points**:
|
|
211
|
+
|
|
212
|
+
- Setup all intercepts before triggering actions
|
|
213
|
+
- Use `Promise.all()` to wait for multiple calls
|
|
214
|
+
- Order: intercept → navigate → await
|
|
215
|
+
- Prevents race conditions
|
|
216
|
+
|
|
217
|
+
## URL Pattern Matching
|
|
218
|
+
|
|
219
|
+
**Supported glob patterns:**
|
|
220
|
+
|
|
221
|
+
```typescript
|
|
222
|
+
'**/api/users'; // Any path ending with /api/users
|
|
223
|
+
'/api/users'; // Exact match
|
|
224
|
+
'**/users/*'; // Any users sub-path
|
|
225
|
+
'**/api/{users,products}'; // Either users or products
|
|
226
|
+
'**/api/users?id=*'; // With query params
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
**Uses picomatch library** - same pattern syntax as Playwright's `page.route()` but cleaner API.
|
|
230
|
+
|
|
231
|
+
## Comparison with Vanilla Playwright
|
|
232
|
+
|
|
233
|
+
| Vanilla Playwright | intercept-network-call |
|
|
234
|
+
| ----------------------------------------------------------- | ------------------------------------------------------------ |
|
|
235
|
+
| `await page.route('/api/users', route => route.continue())` | `const call = interceptNetworkCall({ url: '**/api/users' })` |
|
|
236
|
+
| `const resp = await page.waitForResponse('/api/users')` | (Combined in single statement) |
|
|
237
|
+
| `const json = await resp.json()` | `const { responseJson } = await call` |
|
|
238
|
+
| `const status = resp.status()` | `const { status } = await call` |
|
|
239
|
+
| Complex filter predicates | Simple glob patterns |
|
|
240
|
+
|
|
241
|
+
**Reduction:** ~5-7 lines → ~2-3 lines per interception
|
|
242
|
+
|
|
243
|
+
## Related Fragments
|
|
244
|
+
|
|
245
|
+
- `network-first.md` - Core pattern: intercept before navigate
|
|
246
|
+
- `network-recorder.md` - HAR-based offline testing
|
|
247
|
+
- `overview.md` - Fixture composition basics
|
|
248
|
+
|
|
249
|
+
## Anti-Patterns
|
|
250
|
+
|
|
251
|
+
**❌ Intercepting after navigation:**
|
|
252
|
+
|
|
253
|
+
```typescript
|
|
254
|
+
await page.goto('/dashboard'); // Navigation starts
|
|
255
|
+
const usersCall = interceptNetworkCall({ url: '**/api/users' }); // Too late!
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
**✅ Intercept before navigate:**
|
|
259
|
+
|
|
260
|
+
```typescript
|
|
261
|
+
const usersCall = interceptNetworkCall({ url: '**/api/users' }); // First
|
|
262
|
+
await page.goto('/dashboard'); // Then navigate
|
|
263
|
+
const { responseJson } = await usersCall; // Then await
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
**❌ Ignoring the returned Promise:**
|
|
267
|
+
|
|
268
|
+
```typescript
|
|
269
|
+
interceptNetworkCall({ url: '**/api/users' }); // Not awaited!
|
|
270
|
+
await page.goto('/dashboard');
|
|
271
|
+
// No deterministic wait - race condition
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
**✅ Always await the intercept:**
|
|
275
|
+
|
|
276
|
+
```typescript
|
|
277
|
+
const usersCall = interceptNetworkCall({ url: '**/api/users' });
|
|
278
|
+
await page.goto('/dashboard');
|
|
279
|
+
await usersCall; // Deterministic wait
|
|
280
|
+
```
|