bmad-method 6.0.0-alpha.11 → 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 +167 -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 +3 -2
- 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,303 @@
|
|
|
1
|
+
# API Request Utility
|
|
2
|
+
|
|
3
|
+
## Principle
|
|
4
|
+
|
|
5
|
+
Use typed HTTP client with built-in schema validation and automatic retry for server errors. The utility handles URL resolution, header management, response parsing, and single-line response validation with proper TypeScript support.
|
|
6
|
+
|
|
7
|
+
## Rationale
|
|
8
|
+
|
|
9
|
+
Vanilla Playwright's request API requires boilerplate for common patterns:
|
|
10
|
+
|
|
11
|
+
- Manual JSON parsing (`await response.json()`)
|
|
12
|
+
- Repetitive status code checking
|
|
13
|
+
- No built-in retry logic for transient failures
|
|
14
|
+
- No schema validation
|
|
15
|
+
- Complex URL construction
|
|
16
|
+
|
|
17
|
+
The `apiRequest` utility provides:
|
|
18
|
+
|
|
19
|
+
- **Automatic JSON parsing**: Response body pre-parsed
|
|
20
|
+
- **Built-in retry**: 5xx errors retry with exponential backoff
|
|
21
|
+
- **Schema validation**: Single-line validation (JSON Schema, Zod, OpenAPI)
|
|
22
|
+
- **URL resolution**: Four-tier strategy (explicit > config > Playwright > direct)
|
|
23
|
+
- **TypeScript generics**: Type-safe response bodies
|
|
24
|
+
|
|
25
|
+
## Pattern Examples
|
|
26
|
+
|
|
27
|
+
### Example 1: Basic API Request
|
|
28
|
+
|
|
29
|
+
**Context**: Making authenticated API requests with automatic retry and type safety.
|
|
30
|
+
|
|
31
|
+
**Implementation**:
|
|
32
|
+
|
|
33
|
+
```typescript
|
|
34
|
+
import { test } from '@seontechnologies/playwright-utils/api-request/fixtures';
|
|
35
|
+
|
|
36
|
+
test('should fetch user data', async ({ apiRequest }) => {
|
|
37
|
+
const { status, body } = await apiRequest<User>({
|
|
38
|
+
method: 'GET',
|
|
39
|
+
path: '/api/users/123',
|
|
40
|
+
headers: { Authorization: 'Bearer token' },
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
expect(status).toBe(200);
|
|
44
|
+
expect(body.name).toBe('John Doe'); // TypeScript knows body is User
|
|
45
|
+
});
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
**Key Points**:
|
|
49
|
+
|
|
50
|
+
- Generic type `<User>` provides TypeScript autocomplete for `body`
|
|
51
|
+
- Status and body destructured from response
|
|
52
|
+
- Headers passed as object
|
|
53
|
+
- Automatic retry for 5xx errors (configurable)
|
|
54
|
+
|
|
55
|
+
### Example 2: Schema Validation (Single Line)
|
|
56
|
+
|
|
57
|
+
**Context**: Validate API responses match expected schema with single-line syntax.
|
|
58
|
+
|
|
59
|
+
**Implementation**:
|
|
60
|
+
|
|
61
|
+
```typescript
|
|
62
|
+
import { test } from '@seontechnologies/playwright-utils/api-request/fixtures';
|
|
63
|
+
|
|
64
|
+
test('should validate response schema', async ({ apiRequest }) => {
|
|
65
|
+
// JSON Schema validation
|
|
66
|
+
const response = await apiRequest({
|
|
67
|
+
method: 'GET',
|
|
68
|
+
path: '/api/users/123',
|
|
69
|
+
validateSchema: {
|
|
70
|
+
type: 'object',
|
|
71
|
+
required: ['id', 'name', 'email'],
|
|
72
|
+
properties: {
|
|
73
|
+
id: { type: 'string' },
|
|
74
|
+
name: { type: 'string' },
|
|
75
|
+
email: { type: 'string', format: 'email' },
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
// Throws if schema validation fails
|
|
80
|
+
|
|
81
|
+
// Zod schema validation
|
|
82
|
+
import { z } from 'zod';
|
|
83
|
+
|
|
84
|
+
const UserSchema = z.object({
|
|
85
|
+
id: z.string(),
|
|
86
|
+
name: z.string(),
|
|
87
|
+
email: z.string().email(),
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
const response = await apiRequest({
|
|
91
|
+
method: 'GET',
|
|
92
|
+
path: '/api/users/123',
|
|
93
|
+
validateSchema: UserSchema,
|
|
94
|
+
});
|
|
95
|
+
// Response body is type-safe AND validated
|
|
96
|
+
});
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
**Key Points**:
|
|
100
|
+
|
|
101
|
+
- Single `validateSchema` parameter
|
|
102
|
+
- Supports JSON Schema, Zod, YAML files, OpenAPI specs
|
|
103
|
+
- Throws on validation failure with detailed errors
|
|
104
|
+
- Zero boilerplate validation code
|
|
105
|
+
|
|
106
|
+
### Example 3: POST with Body and Retry Configuration
|
|
107
|
+
|
|
108
|
+
**Context**: Creating resources with custom retry behavior for error testing.
|
|
109
|
+
|
|
110
|
+
**Implementation**:
|
|
111
|
+
|
|
112
|
+
```typescript
|
|
113
|
+
test('should create user', async ({ apiRequest }) => {
|
|
114
|
+
const newUser = {
|
|
115
|
+
name: 'Jane Doe',
|
|
116
|
+
email: 'jane@example.com',
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
const { status, body } = await apiRequest({
|
|
120
|
+
method: 'POST',
|
|
121
|
+
path: '/api/users',
|
|
122
|
+
body: newUser, // Automatically sent as JSON
|
|
123
|
+
headers: { Authorization: 'Bearer token' },
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
expect(status).toBe(201);
|
|
127
|
+
expect(body.id).toBeDefined();
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
// Disable retry for error testing
|
|
131
|
+
test('should handle 500 errors', async ({ apiRequest }) => {
|
|
132
|
+
await expect(
|
|
133
|
+
apiRequest({
|
|
134
|
+
method: 'GET',
|
|
135
|
+
path: '/api/error',
|
|
136
|
+
retryConfig: { maxRetries: 0 }, // Disable retry
|
|
137
|
+
}),
|
|
138
|
+
).rejects.toThrow('Request failed with status 500');
|
|
139
|
+
});
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
**Key Points**:
|
|
143
|
+
|
|
144
|
+
- `body` parameter auto-serializes to JSON
|
|
145
|
+
- Default retry: 5xx errors, 3 retries, exponential backoff
|
|
146
|
+
- Disable retry with `retryConfig: { maxRetries: 0 }`
|
|
147
|
+
- Only 5xx errors retry (4xx errors fail immediately)
|
|
148
|
+
|
|
149
|
+
### Example 4: URL Resolution Strategy
|
|
150
|
+
|
|
151
|
+
**Context**: Flexible URL handling for different environments and test contexts.
|
|
152
|
+
|
|
153
|
+
**Implementation**:
|
|
154
|
+
|
|
155
|
+
```typescript
|
|
156
|
+
// Strategy 1: Explicit baseUrl (highest priority)
|
|
157
|
+
await apiRequest({
|
|
158
|
+
method: 'GET',
|
|
159
|
+
path: '/users',
|
|
160
|
+
baseUrl: 'https://api.example.com', // Uses https://api.example.com/users
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
// Strategy 2: Config baseURL (from fixture)
|
|
164
|
+
import { test } from '@seontechnologies/playwright-utils/api-request/fixtures';
|
|
165
|
+
|
|
166
|
+
test.use({ configBaseUrl: 'https://staging-api.example.com' });
|
|
167
|
+
|
|
168
|
+
test('uses config baseURL', async ({ apiRequest }) => {
|
|
169
|
+
await apiRequest({
|
|
170
|
+
method: 'GET',
|
|
171
|
+
path: '/users', // Uses https://staging-api.example.com/users
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
// Strategy 3: Playwright baseURL (from playwright.config.ts)
|
|
176
|
+
// playwright.config.ts
|
|
177
|
+
export default defineConfig({
|
|
178
|
+
use: {
|
|
179
|
+
baseURL: 'https://api.example.com',
|
|
180
|
+
},
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
test('uses Playwright baseURL', async ({ apiRequest }) => {
|
|
184
|
+
await apiRequest({
|
|
185
|
+
method: 'GET',
|
|
186
|
+
path: '/users', // Uses https://api.example.com/users
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
// Strategy 4: Direct path (full URL)
|
|
191
|
+
await apiRequest({
|
|
192
|
+
method: 'GET',
|
|
193
|
+
path: 'https://api.example.com/users', // Full URL works too
|
|
194
|
+
});
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
**Key Points**:
|
|
198
|
+
|
|
199
|
+
- Four-tier resolution: explicit > config > Playwright > direct
|
|
200
|
+
- Trailing slashes normalized automatically
|
|
201
|
+
- Environment-specific baseUrl easy to configure
|
|
202
|
+
|
|
203
|
+
### Example 5: Integration with Recurse (Polling)
|
|
204
|
+
|
|
205
|
+
**Context**: Waiting for async operations to complete (background jobs, eventual consistency).
|
|
206
|
+
|
|
207
|
+
**Implementation**:
|
|
208
|
+
|
|
209
|
+
```typescript
|
|
210
|
+
import { test } from '@seontechnologies/playwright-utils/fixtures';
|
|
211
|
+
|
|
212
|
+
test('should poll until job completes', async ({ apiRequest, recurse }) => {
|
|
213
|
+
// Create job
|
|
214
|
+
const { body } = await apiRequest({
|
|
215
|
+
method: 'POST',
|
|
216
|
+
path: '/api/jobs',
|
|
217
|
+
body: { type: 'export' },
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
const jobId = body.id;
|
|
221
|
+
|
|
222
|
+
// Poll until ready
|
|
223
|
+
const completedJob = await recurse(
|
|
224
|
+
() => apiRequest({ method: 'GET', path: `/api/jobs/${jobId}` }),
|
|
225
|
+
(response) => response.body.status === 'completed',
|
|
226
|
+
{ timeout: 60000, interval: 2000 },
|
|
227
|
+
);
|
|
228
|
+
|
|
229
|
+
expect(completedJob.body.result).toBeDefined();
|
|
230
|
+
});
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
**Key Points**:
|
|
234
|
+
|
|
235
|
+
- `apiRequest` returns full response object
|
|
236
|
+
- `recurse` polls until predicate returns true
|
|
237
|
+
- Composable utilities work together seamlessly
|
|
238
|
+
|
|
239
|
+
## Comparison with Vanilla Playwright
|
|
240
|
+
|
|
241
|
+
| Vanilla Playwright | playwright-utils apiRequest |
|
|
242
|
+
| ---------------------------------------------- | ---------------------------------------------------------------------------------- |
|
|
243
|
+
| `const resp = await request.get('/api/users')` | `const { status, body } = await apiRequest({ method: 'GET', path: '/api/users' })` |
|
|
244
|
+
| `const body = await resp.json()` | Response already parsed |
|
|
245
|
+
| `expect(resp.ok()).toBeTruthy()` | Status code directly accessible |
|
|
246
|
+
| No retry logic | Auto-retry 5xx errors with backoff |
|
|
247
|
+
| No schema validation | Built-in multi-format validation |
|
|
248
|
+
| Manual error handling | Descriptive error messages |
|
|
249
|
+
|
|
250
|
+
## When to Use
|
|
251
|
+
|
|
252
|
+
**Use apiRequest for:**
|
|
253
|
+
|
|
254
|
+
- ✅ API endpoint testing
|
|
255
|
+
- ✅ Background API calls in UI tests
|
|
256
|
+
- ✅ Schema validation needs
|
|
257
|
+
- ✅ Tests requiring retry logic
|
|
258
|
+
- ✅ Typed API responses
|
|
259
|
+
|
|
260
|
+
**Stick with vanilla Playwright for:**
|
|
261
|
+
|
|
262
|
+
- Simple one-off requests where utility overhead isn't worth it
|
|
263
|
+
- Testing Playwright's native features specifically
|
|
264
|
+
- Legacy tests where migration isn't justified
|
|
265
|
+
|
|
266
|
+
## Related Fragments
|
|
267
|
+
|
|
268
|
+
- `overview.md` - Installation and design principles
|
|
269
|
+
- `auth-session.md` - Authentication token management
|
|
270
|
+
- `recurse.md` - Polling for async operations
|
|
271
|
+
- `fixtures-composition.md` - Combining utilities with mergeTests
|
|
272
|
+
- `log.md` - Logging API requests
|
|
273
|
+
|
|
274
|
+
## Anti-Patterns
|
|
275
|
+
|
|
276
|
+
**❌ Ignoring retry failures:**
|
|
277
|
+
|
|
278
|
+
```typescript
|
|
279
|
+
try {
|
|
280
|
+
await apiRequest({ method: 'GET', path: '/api/unstable' });
|
|
281
|
+
} catch {
|
|
282
|
+
// Silent failure - loses retry information
|
|
283
|
+
}
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
**✅ Let retries happen, handle final failure:**
|
|
287
|
+
|
|
288
|
+
```typescript
|
|
289
|
+
await expect(apiRequest({ method: 'GET', path: '/api/unstable' })).rejects.toThrow(); // Retries happen automatically, then final error caught
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
**❌ Disabling TypeScript benefits:**
|
|
293
|
+
|
|
294
|
+
```typescript
|
|
295
|
+
const response: any = await apiRequest({ method: 'GET', path: '/users' });
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
**✅ Use generic types:**
|
|
299
|
+
|
|
300
|
+
```typescript
|
|
301
|
+
const { body } = await apiRequest<User[]>({ method: 'GET', path: '/users' });
|
|
302
|
+
// body is typed as User[]
|
|
303
|
+
```
|
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
# Auth Session Utility
|
|
2
|
+
|
|
3
|
+
## Principle
|
|
4
|
+
|
|
5
|
+
Persist authentication tokens to disk and reuse across test runs. Support multiple user identifiers, ephemeral authentication, and worker-specific accounts for parallel execution. Fetch tokens once, use everywhere.
|
|
6
|
+
|
|
7
|
+
## Rationale
|
|
8
|
+
|
|
9
|
+
Playwright's built-in authentication works but has limitations:
|
|
10
|
+
|
|
11
|
+
- Re-authenticates for every test run (slow)
|
|
12
|
+
- Single user per project setup
|
|
13
|
+
- No token expiration handling
|
|
14
|
+
- Manual session management
|
|
15
|
+
- Complex setup for multi-user scenarios
|
|
16
|
+
|
|
17
|
+
The `auth-session` utility provides:
|
|
18
|
+
|
|
19
|
+
- **Token persistence**: Authenticate once, reuse across runs
|
|
20
|
+
- **Multi-user support**: Different user identifiers in same test suite
|
|
21
|
+
- **Ephemeral auth**: On-the-fly user authentication without disk persistence
|
|
22
|
+
- **Worker-specific accounts**: Parallel execution with isolated user accounts
|
|
23
|
+
- **Automatic token management**: Checks validity, renews if expired
|
|
24
|
+
- **Flexible provider pattern**: Adapt to any auth system (OAuth2, JWT, custom)
|
|
25
|
+
|
|
26
|
+
## Pattern Examples
|
|
27
|
+
|
|
28
|
+
### Example 1: Basic Auth Session Setup
|
|
29
|
+
|
|
30
|
+
**Context**: Configure global authentication that persists across test runs.
|
|
31
|
+
|
|
32
|
+
**Implementation**:
|
|
33
|
+
|
|
34
|
+
```typescript
|
|
35
|
+
// Step 1: Configure in global-setup.ts
|
|
36
|
+
import { authStorageInit, setAuthProvider, configureAuthSession, authGlobalInit } from '@seontechnologies/playwright-utils/auth-session';
|
|
37
|
+
import myCustomProvider from './auth/custom-auth-provider';
|
|
38
|
+
|
|
39
|
+
async function globalSetup() {
|
|
40
|
+
// Ensure storage directories exist
|
|
41
|
+
authStorageInit();
|
|
42
|
+
|
|
43
|
+
// Configure storage path
|
|
44
|
+
configureAuthSession({
|
|
45
|
+
authStoragePath: process.cwd() + '/playwright/auth-sessions',
|
|
46
|
+
debug: true,
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
// Set custom provider (HOW to authenticate)
|
|
50
|
+
setAuthProvider(myCustomProvider);
|
|
51
|
+
|
|
52
|
+
// Optional: pre-fetch token for default user
|
|
53
|
+
await authGlobalInit();
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export default globalSetup;
|
|
57
|
+
|
|
58
|
+
// Step 2: Create auth fixture
|
|
59
|
+
import { test as base } from '@playwright/test';
|
|
60
|
+
import { createAuthFixtures, setAuthProvider } from '@seontechnologies/playwright-utils/auth-session';
|
|
61
|
+
import myCustomProvider from './custom-auth-provider';
|
|
62
|
+
|
|
63
|
+
// Register provider early
|
|
64
|
+
setAuthProvider(myCustomProvider);
|
|
65
|
+
|
|
66
|
+
export const test = base.extend(createAuthFixtures());
|
|
67
|
+
|
|
68
|
+
// Step 3: Use in tests
|
|
69
|
+
test('authenticated request', async ({ authToken, request }) => {
|
|
70
|
+
const response = await request.get('/api/protected', {
|
|
71
|
+
headers: { Authorization: `Bearer ${authToken}` },
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
expect(response.ok()).toBeTruthy();
|
|
75
|
+
});
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
**Key Points**:
|
|
79
|
+
|
|
80
|
+
- Global setup runs once before all tests
|
|
81
|
+
- Token fetched once, reused across all tests
|
|
82
|
+
- Custom provider defines your auth mechanism
|
|
83
|
+
- Order matters: configure, then setProvider, then init
|
|
84
|
+
|
|
85
|
+
### Example 2: Multi-User Authentication
|
|
86
|
+
|
|
87
|
+
**Context**: Testing with different user roles (admin, regular user, guest) in same test suite.
|
|
88
|
+
|
|
89
|
+
**Implementation**:
|
|
90
|
+
|
|
91
|
+
```typescript
|
|
92
|
+
import { test } from '../support/auth/auth-fixture';
|
|
93
|
+
|
|
94
|
+
// Option 1: Per-test user override
|
|
95
|
+
test('admin actions', async ({ authToken, authOptions }) => {
|
|
96
|
+
// Override default user
|
|
97
|
+
authOptions.userIdentifier = 'admin';
|
|
98
|
+
|
|
99
|
+
const { authToken: adminToken } = await test.step('Get admin token', async () => {
|
|
100
|
+
return { authToken }; // Re-fetches with new identifier
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
// Use admin token
|
|
104
|
+
const response = await request.get('/api/admin/users', {
|
|
105
|
+
headers: { Authorization: `Bearer ${adminToken}` },
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
// Option 2: Parallel execution with different users
|
|
110
|
+
test.describe.parallel('multi-user tests', () => {
|
|
111
|
+
test('user 1 actions', async ({ authToken }) => {
|
|
112
|
+
// Uses default user (e.g., 'user1')
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
test('user 2 actions', async ({ authToken, authOptions }) => {
|
|
116
|
+
authOptions.userIdentifier = 'user2';
|
|
117
|
+
// Uses different token for user2
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
**Key Points**:
|
|
123
|
+
|
|
124
|
+
- Override `authOptions.userIdentifier` per test
|
|
125
|
+
- Tokens cached separately per user identifier
|
|
126
|
+
- Parallel tests isolated with different users
|
|
127
|
+
- Worker-specific accounts possible
|
|
128
|
+
|
|
129
|
+
### Example 3: Ephemeral User Authentication
|
|
130
|
+
|
|
131
|
+
**Context**: Create temporary test users that don't persist to disk (e.g., testing user creation flow).
|
|
132
|
+
|
|
133
|
+
**Implementation**:
|
|
134
|
+
|
|
135
|
+
```typescript
|
|
136
|
+
import { applyUserCookiesToBrowserContext } from '@seontechnologies/playwright-utils/auth-session';
|
|
137
|
+
import { createTestUser } from '../utils/user-factory';
|
|
138
|
+
|
|
139
|
+
test('ephemeral user test', async ({ context, page }) => {
|
|
140
|
+
// Create temporary user (not persisted)
|
|
141
|
+
const ephemeralUser = await createTestUser({
|
|
142
|
+
role: 'admin',
|
|
143
|
+
permissions: ['delete-users'],
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
// Apply auth directly to browser context
|
|
147
|
+
await applyUserCookiesToBrowserContext(context, ephemeralUser);
|
|
148
|
+
|
|
149
|
+
// Page now authenticated as ephemeral user
|
|
150
|
+
await page.goto('/admin/users');
|
|
151
|
+
|
|
152
|
+
await expect(page.getByTestId('delete-user-btn')).toBeVisible();
|
|
153
|
+
|
|
154
|
+
// User and token cleaned up after test
|
|
155
|
+
});
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
**Key Points**:
|
|
159
|
+
|
|
160
|
+
- No disk persistence (ephemeral)
|
|
161
|
+
- Apply cookies directly to context
|
|
162
|
+
- Useful for testing user lifecycle
|
|
163
|
+
- Clean up automatic when test ends
|
|
164
|
+
|
|
165
|
+
### Example 4: Testing Multiple Users in Single Test
|
|
166
|
+
|
|
167
|
+
**Context**: Testing interactions between users (messaging, sharing, collaboration features).
|
|
168
|
+
|
|
169
|
+
**Implementation**:
|
|
170
|
+
|
|
171
|
+
```typescript
|
|
172
|
+
test('user interaction', async ({ browser }) => {
|
|
173
|
+
// User 1 context
|
|
174
|
+
const user1Context = await browser.newContext({
|
|
175
|
+
storageState: './auth-sessions/local/user1/storage-state.json',
|
|
176
|
+
});
|
|
177
|
+
const user1Page = await user1Context.newPage();
|
|
178
|
+
|
|
179
|
+
// User 2 context
|
|
180
|
+
const user2Context = await browser.newContext({
|
|
181
|
+
storageState: './auth-sessions/local/user2/storage-state.json',
|
|
182
|
+
});
|
|
183
|
+
const user2Page = await user2Context.newPage();
|
|
184
|
+
|
|
185
|
+
// User 1 sends message
|
|
186
|
+
await user1Page.goto('/messages');
|
|
187
|
+
await user1Page.fill('#message', 'Hello from user 1');
|
|
188
|
+
await user1Page.click('#send');
|
|
189
|
+
|
|
190
|
+
// User 2 receives message
|
|
191
|
+
await user2Page.goto('/messages');
|
|
192
|
+
await expect(user2Page.getByText('Hello from user 1')).toBeVisible();
|
|
193
|
+
|
|
194
|
+
// Cleanup
|
|
195
|
+
await user1Context.close();
|
|
196
|
+
await user2Context.close();
|
|
197
|
+
});
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
**Key Points**:
|
|
201
|
+
|
|
202
|
+
- Each user has separate browser context
|
|
203
|
+
- Reference storage state files directly
|
|
204
|
+
- Test real-time interactions
|
|
205
|
+
- Clean up contexts after test
|
|
206
|
+
|
|
207
|
+
### Example 5: Worker-Specific Accounts (Parallel Testing)
|
|
208
|
+
|
|
209
|
+
**Context**: Running tests in parallel with isolated user accounts per worker to avoid conflicts.
|
|
210
|
+
|
|
211
|
+
**Implementation**:
|
|
212
|
+
|
|
213
|
+
```typescript
|
|
214
|
+
// playwright.config.ts
|
|
215
|
+
export default defineConfig({
|
|
216
|
+
workers: 4, // 4 parallel workers
|
|
217
|
+
use: {
|
|
218
|
+
// Each worker uses different user
|
|
219
|
+
storageState: async ({}, use, testInfo) => {
|
|
220
|
+
const workerIndex = testInfo.workerIndex;
|
|
221
|
+
const userIdentifier = `worker-${workerIndex}`;
|
|
222
|
+
|
|
223
|
+
await use(`./auth-sessions/local/${userIdentifier}/storage-state.json`);
|
|
224
|
+
},
|
|
225
|
+
},
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
// Tests run in parallel, each worker with its own user
|
|
229
|
+
test('parallel test 1', async ({ page }) => {
|
|
230
|
+
// Worker 0 uses worker-0 account
|
|
231
|
+
await page.goto('/dashboard');
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
test('parallel test 2', async ({ page }) => {
|
|
235
|
+
// Worker 1 uses worker-1 account
|
|
236
|
+
await page.goto('/dashboard');
|
|
237
|
+
});
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
**Key Points**:
|
|
241
|
+
|
|
242
|
+
- Each worker has isolated user account
|
|
243
|
+
- No conflicts in parallel execution
|
|
244
|
+
- Token management automatic per worker
|
|
245
|
+
- Scales to any number of workers
|
|
246
|
+
|
|
247
|
+
## Custom Auth Provider Pattern
|
|
248
|
+
|
|
249
|
+
**Context**: Adapt auth-session to your authentication system (OAuth2, JWT, SAML, custom).
|
|
250
|
+
|
|
251
|
+
**Minimal provider structure**:
|
|
252
|
+
|
|
253
|
+
```typescript
|
|
254
|
+
import { type AuthProvider } from '@seontechnologies/playwright-utils/auth-session';
|
|
255
|
+
|
|
256
|
+
const myCustomProvider: AuthProvider = {
|
|
257
|
+
getEnvironment: (options) => options.environment || 'local',
|
|
258
|
+
|
|
259
|
+
getUserIdentifier: (options) => options.userIdentifier || 'default-user',
|
|
260
|
+
|
|
261
|
+
extractToken: (storageState) => {
|
|
262
|
+
// Extract token from your storage format
|
|
263
|
+
return storageState.cookies.find((c) => c.name === 'auth_token')?.value;
|
|
264
|
+
},
|
|
265
|
+
|
|
266
|
+
extractCookies: (tokenData) => {
|
|
267
|
+
// Convert token to cookies for browser context
|
|
268
|
+
return [
|
|
269
|
+
{
|
|
270
|
+
name: 'auth_token',
|
|
271
|
+
value: tokenData,
|
|
272
|
+
domain: 'example.com',
|
|
273
|
+
path: '/',
|
|
274
|
+
httpOnly: true,
|
|
275
|
+
secure: true,
|
|
276
|
+
},
|
|
277
|
+
];
|
|
278
|
+
},
|
|
279
|
+
|
|
280
|
+
isTokenExpired: (storageState) => {
|
|
281
|
+
// Check if token is expired
|
|
282
|
+
const expiresAt = storageState.cookies.find((c) => c.name === 'expires_at');
|
|
283
|
+
return Date.now() > parseInt(expiresAt?.value || '0');
|
|
284
|
+
},
|
|
285
|
+
|
|
286
|
+
manageAuthToken: async (request, options) => {
|
|
287
|
+
// Main token acquisition logic
|
|
288
|
+
// Return storage state with cookies/localStorage
|
|
289
|
+
},
|
|
290
|
+
};
|
|
291
|
+
|
|
292
|
+
export default myCustomProvider;
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
## Integration with API Request
|
|
296
|
+
|
|
297
|
+
```typescript
|
|
298
|
+
import { test } from '@seontechnologies/playwright-utils/fixtures';
|
|
299
|
+
|
|
300
|
+
test('authenticated API call', async ({ apiRequest, authToken }) => {
|
|
301
|
+
const { status, body } = await apiRequest({
|
|
302
|
+
method: 'GET',
|
|
303
|
+
path: '/api/protected',
|
|
304
|
+
headers: { Authorization: `Bearer ${authToken}` },
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
expect(status).toBe(200);
|
|
308
|
+
});
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
## Related Fragments
|
|
312
|
+
|
|
313
|
+
- `overview.md` - Installation and fixture composition
|
|
314
|
+
- `api-request.md` - Authenticated API requests
|
|
315
|
+
- `fixtures-composition.md` - Merging auth with other utilities
|
|
316
|
+
|
|
317
|
+
## Anti-Patterns
|
|
318
|
+
|
|
319
|
+
**❌ Calling setAuthProvider after globalSetup:**
|
|
320
|
+
|
|
321
|
+
```typescript
|
|
322
|
+
async function globalSetup() {
|
|
323
|
+
configureAuthSession(...)
|
|
324
|
+
await authGlobalInit() // Provider not set yet!
|
|
325
|
+
setAuthProvider(provider) // Too late
|
|
326
|
+
}
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
**✅ Register provider before init:**
|
|
330
|
+
|
|
331
|
+
```typescript
|
|
332
|
+
async function globalSetup() {
|
|
333
|
+
authStorageInit()
|
|
334
|
+
configureAuthSession(...)
|
|
335
|
+
setAuthProvider(provider) // First
|
|
336
|
+
await authGlobalInit() // Then init
|
|
337
|
+
}
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
**❌ Hardcoding storage paths:**
|
|
341
|
+
|
|
342
|
+
```typescript
|
|
343
|
+
const storageState = './auth-sessions/local/user1/storage-state.json'; // Brittle
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
**✅ Use helper functions:**
|
|
347
|
+
|
|
348
|
+
```typescript
|
|
349
|
+
import { getTokenFilePath } from '@seontechnologies/playwright-utils/auth-session';
|
|
350
|
+
|
|
351
|
+
const tokenPath = getTokenFilePath({
|
|
352
|
+
environment: 'local',
|
|
353
|
+
userIdentifier: 'user1',
|
|
354
|
+
tokenFileName: 'storage-state.json',
|
|
355
|
+
});
|
|
356
|
+
```
|