siesa-agents 2.1.40 → 2.1.41
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/README.md +147 -147
- package/bin/install.js +534 -534
- package/bin/prepare-publish.js +26 -26
- package/bin/restore-folders.js +26 -26
- package/bmad/_config/agent-manifest.csv +20 -20
- package/bmad/_config/agents/bmb-agent-builder.customize.yaml +41 -41
- package/bmad/_config/agents/bmb-module-builder.customize.yaml +41 -41
- package/bmad/_config/agents/bmb-workflow-builder.customize.yaml +41 -41
- package/bmad/_config/files-manifest.csv +469 -469
- package/bmad/_config/ides/claude-code.yaml +6 -6
- package/bmad/_config/manifest.yaml +14 -14
- package/bmad/_config/task-manifest.csv +6 -6
- package/bmad/_config/tool-manifest.csv +1 -1
- package/bmad/_config/workflow-manifest.csv +45 -45
- package/bmad/_memory/config.yaml +11 -11
- package/bmad/bmb/README.md +25 -25
- package/bmad/bmb/agents/agent-builder.md +57 -57
- package/bmad/bmb/agents/module-builder.md +60 -60
- package/bmad/bmb/agents/workflow-builder.md +56 -56
- package/bmad/bmb/config.yaml +12 -12
- package/bmad/bmb/docs/workflows/architecture.md +220 -220
- package/bmad/bmb/docs/workflows/common-workflow-tools.csv +18 -18
- package/bmad/bmb/docs/workflows/csv-data-file-standards.md +206 -206
- package/bmad/bmb/docs/workflows/intent-vs-prescriptive-spectrum.md +220 -220
- package/bmad/bmb/docs/workflows/step-file-rules.md +469 -469
- package/bmad/bmb/docs/workflows/templates/step-01-init-continuable-template.md +241 -241
- package/bmad/bmb/docs/workflows/templates/step-1b-template.md +223 -223
- package/bmad/bmb/docs/workflows/templates/step-file.md +139 -139
- package/bmad/bmb/docs/workflows/templates/step-template.md +290 -290
- package/bmad/bmb/docs/workflows/templates/workflow-template.md +104 -104
- package/bmad/bmb/docs/workflows/templates/workflow.md +58 -58
- package/bmad/bmb/docs/workflows/terms.md +97 -97
- package/bmad/bmb/reference/agents/simple-examples/README.md +223 -223
- package/bmad/bmb/reference/readme.md +3 -3
- package/bmad/bmb/reference/workflows/meal-prep-nutrition/data/dietary-restrictions.csv +17 -17
- package/bmad/bmb/reference/workflows/meal-prep-nutrition/data/macro-calculator.csv +15 -15
- package/bmad/bmb/reference/workflows/meal-prep-nutrition/data/recipe-database.csv +27 -27
- package/bmad/bmb/reference/workflows/meal-prep-nutrition/steps/step-01-init.md +177 -177
- package/bmad/bmb/reference/workflows/meal-prep-nutrition/steps/step-01b-continue.md +121 -121
- package/bmad/bmb/reference/workflows/meal-prep-nutrition/steps/step-02-profile.md +165 -165
- package/bmad/bmb/reference/workflows/meal-prep-nutrition/steps/step-03-assessment.md +154 -154
- package/bmad/bmb/reference/workflows/meal-prep-nutrition/steps/step-04-strategy.md +183 -183
- package/bmad/bmb/reference/workflows/meal-prep-nutrition/steps/step-05-shopping.md +168 -168
- package/bmad/bmb/reference/workflows/meal-prep-nutrition/steps/step-06-prep-schedule.md +195 -195
- package/bmad/bmb/reference/workflows/meal-prep-nutrition/templates/assessment-section.md +25 -25
- package/bmad/bmb/reference/workflows/meal-prep-nutrition/templates/nutrition-plan.md +68 -68
- package/bmad/bmb/reference/workflows/meal-prep-nutrition/templates/prep-schedule-section.md +29 -29
- package/bmad/bmb/reference/workflows/meal-prep-nutrition/templates/profile-section.md +47 -47
- package/bmad/bmb/reference/workflows/meal-prep-nutrition/templates/shopping-section.md +37 -37
- package/bmad/bmb/reference/workflows/meal-prep-nutrition/templates/strategy-section.md +18 -18
- package/bmad/bmb/reference/workflows/meal-prep-nutrition/workflow.md +59 -59
- package/bmad/bmb/workflows/agent/data/agent-compilation.md +273 -273
- package/bmad/bmb/workflows/agent/data/agent-menu-patterns.md +233 -233
- package/bmad/bmb/workflows/agent/data/agent-metadata.md +208 -208
- package/bmad/bmb/workflows/agent/data/brainstorm-context.md +146 -146
- package/bmad/bmb/workflows/agent/data/communication-presets.csv +61 -61
- package/bmad/bmb/workflows/agent/data/critical-actions.md +120 -120
- package/bmad/bmb/workflows/agent/data/expert-agent-architecture.md +236 -236
- package/bmad/bmb/workflows/agent/data/expert-agent-validation.md +173 -173
- package/bmad/bmb/workflows/agent/data/module-agent-validation.md +124 -124
- package/bmad/bmb/workflows/agent/data/persona-properties.md +266 -266
- package/bmad/bmb/workflows/agent/data/principles-crafting.md +292 -292
- package/bmad/bmb/workflows/agent/data/reference/expert-examples/journal-keeper/journal-keeper-sidecar/entries/yy-mm-dd-entry-template.md +16 -16
- package/bmad/bmb/workflows/agent/data/reference/module-examples/architect.md +68 -68
- package/bmad/bmb/workflows/agent/data/simple-agent-architecture.md +204 -204
- package/bmad/bmb/workflows/agent/data/simple-agent-validation.md +132 -132
- package/bmad/bmb/workflows/agent/data/understanding-agent-types.md +222 -222
- package/bmad/bmb/workflows/agent/steps-c/step-01-brainstorm.md +126 -126
- package/bmad/bmb/workflows/agent/steps-c/step-02-discovery.md +168 -168
- package/bmad/bmb/workflows/agent/steps-c/step-03-type-metadata.md +294 -294
- package/bmad/bmb/workflows/agent/steps-c/step-04-persona.md +210 -210
- package/bmad/bmb/workflows/agent/steps-c/step-05-commands-menu.md +176 -176
- package/bmad/bmb/workflows/agent/steps-c/step-06-activation.md +275 -275
- package/bmad/bmb/workflows/agent/steps-c/step-07a-build-simple.md +185 -185
- package/bmad/bmb/workflows/agent/steps-c/step-07b-build-expert.md +201 -201
- package/bmad/bmb/workflows/agent/steps-c/step-07c-build-module.md +258 -258
- package/bmad/bmb/workflows/agent/steps-c/step-08a-plan-traceability.md +203 -203
- package/bmad/bmb/workflows/agent/steps-c/step-08b-metadata-validation.md +135 -135
- package/bmad/bmb/workflows/agent/steps-c/step-08c-persona-validation.md +161 -161
- package/bmad/bmb/workflows/agent/steps-c/step-08d-menu-validation.md +158 -158
- package/bmad/bmb/workflows/agent/steps-c/step-08e-structure-validation.md +306 -306
- package/bmad/bmb/workflows/agent/steps-c/step-08f-sidecar-validation.md +462 -462
- package/bmad/bmb/workflows/agent/steps-c/step-09-celebrate.md +244 -244
- package/bmad/bmb/workflows/agent/steps-e/e-01-load-existing.md +214 -214
- package/bmad/bmb/workflows/agent/steps-e/e-02-discover-edits.md +191 -191
- package/bmad/bmb/workflows/agent/steps-e/e-03a-validate-metadata.md +78 -78
- package/bmad/bmb/workflows/agent/steps-e/e-03b-validate-persona.md +76 -76
- package/bmad/bmb/workflows/agent/steps-e/e-03c-validate-menu.md +75 -75
- package/bmad/bmb/workflows/agent/steps-e/e-03d-validate-structure.md +75 -75
- package/bmad/bmb/workflows/agent/steps-e/e-03e-validate-sidecar.md +78 -78
- package/bmad/bmb/workflows/agent/steps-e/e-03f-validation-summary.md +119 -119
- package/bmad/bmb/workflows/agent/steps-e/e-04-type-metadata.md +122 -122
- package/bmad/bmb/workflows/agent/steps-e/e-05-persona.md +132 -132
- package/bmad/bmb/workflows/agent/steps-e/e-06-commands-menu.md +120 -120
- package/bmad/bmb/workflows/agent/steps-e/e-07-activation.md +122 -122
- package/bmad/bmb/workflows/agent/steps-e/e-08a-edit-simple.md +134 -134
- package/bmad/bmb/workflows/agent/steps-e/e-08b-edit-expert.md +117 -117
- package/bmad/bmb/workflows/agent/steps-e/e-08c-edit-module.md +120 -120
- package/bmad/bmb/workflows/agent/steps-e/e-09a-validate-metadata.md +70 -70
- package/bmad/bmb/workflows/agent/steps-e/e-09b-validate-persona.md +70 -70
- package/bmad/bmb/workflows/agent/steps-e/e-09c-validate-menu.md +69 -69
- package/bmad/bmb/workflows/agent/steps-e/e-09d-validate-structure.md +69 -69
- package/bmad/bmb/workflows/agent/steps-e/e-09e-validate-sidecar.md +70 -70
- package/bmad/bmb/workflows/agent/steps-e/e-09f-validation-summary.md +111 -111
- package/bmad/bmb/workflows/agent/steps-e/e-10-celebrate.md +150 -150
- package/bmad/bmb/workflows/agent/steps-v/v-01-load-review.md +128 -128
- package/bmad/bmb/workflows/agent/steps-v/v-02a-validate-metadata.md +73 -73
- package/bmad/bmb/workflows/agent/steps-v/v-02b-validate-persona.md +72 -72
- package/bmad/bmb/workflows/agent/steps-v/v-02c-validate-menu.md +71 -71
- package/bmad/bmb/workflows/agent/steps-v/v-02d-validate-structure.md +71 -71
- package/bmad/bmb/workflows/agent/steps-v/v-02e-validate-sidecar.md +76 -76
- package/bmad/bmb/workflows/agent/steps-v/v-03-summary.md +100 -100
- package/bmad/bmb/workflows/agent/templates/agent-plan.template.md +5 -5
- package/bmad/bmb/workflows/agent/templates/expert-agent-template/expert-agent.template.md +76 -76
- package/bmad/bmb/workflows/agent/templates/simple-agent.template.md +71 -71
- package/bmad/bmb/workflows/agent/workflow.md +123 -123
- package/bmad/bmb/workflows/create-module/steps/step-01-init.md +156 -156
- package/bmad/bmb/workflows/create-module/steps/step-01b-continue.md +170 -170
- package/bmad/bmb/workflows/create-module/steps/step-02-concept.md +218 -218
- package/bmad/bmb/workflows/create-module/steps/step-03-components.md +268 -268
- package/bmad/bmb/workflows/create-module/steps/step-04-structure.md +229 -229
- package/bmad/bmb/workflows/create-module/steps/step-05-config.md +234 -234
- package/bmad/bmb/workflows/create-module/steps/step-06-agents.md +297 -297
- package/bmad/bmb/workflows/create-module/steps/step-07-workflows.md +229 -229
- package/bmad/bmb/workflows/create-module/steps/step-08-installer.md +187 -187
- package/bmad/bmb/workflows/create-module/steps/step-09-documentation.md +310 -310
- package/bmad/bmb/workflows/create-module/steps/step-10-roadmap.md +338 -338
- package/bmad/bmb/workflows/create-module/steps/step-11-validate.md +336 -336
- package/bmad/bmb/workflows/create-module/templates/agent.template.md +313 -313
- package/bmad/bmb/workflows/create-module/templates/installer.template.js +47 -47
- package/bmad/bmb/workflows/create-module/templates/module-plan.template.md +5 -5
- package/bmad/bmb/workflows/create-module/templates/module.template.yaml +53 -53
- package/bmad/bmb/workflows/create-module/templates/workflow-plan-template.md +23 -23
- package/bmad/bmb/workflows/create-module/validation.md +126 -126
- package/bmad/bmb/workflows/create-module/workflow.md +56 -56
- package/bmad/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/data/dietary-restrictions.csv +17 -17
- package/bmad/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/data/macro-calculator.csv +15 -15
- package/bmad/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/data/recipe-database.csv +27 -27
- package/bmad/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/steps/step-01-init.md +177 -177
- package/bmad/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/steps/step-01b-continue.md +150 -150
- package/bmad/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/steps/step-02-profile.md +164 -164
- package/bmad/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/steps/step-03-assessment.md +152 -152
- package/bmad/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/steps/step-04-strategy.md +182 -182
- package/bmad/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/steps/step-05-shopping.md +167 -167
- package/bmad/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/steps/step-06-prep-schedule.md +194 -194
- package/bmad/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/templates/assessment-section.md +25 -25
- package/bmad/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/templates/nutrition-plan.md +68 -68
- package/bmad/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/templates/prep-schedule-section.md +29 -29
- package/bmad/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/templates/profile-section.md +47 -47
- package/bmad/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/templates/shopping-section.md +37 -37
- package/bmad/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/templates/strategy-section.md +18 -18
- package/bmad/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/workflow.md +58 -58
- package/bmad/bmb/workflows/create-workflow/steps/step-01-init.md +158 -158
- package/bmad/bmb/workflows/create-workflow/steps/step-02-gather.md +212 -212
- package/bmad/bmb/workflows/create-workflow/steps/step-03-tools-configuration.md +251 -251
- package/bmad/bmb/workflows/create-workflow/steps/step-04-plan-review.md +217 -217
- package/bmad/bmb/workflows/create-workflow/steps/step-05-output-format-design.md +290 -290
- package/bmad/bmb/workflows/create-workflow/steps/step-06-design.md +272 -272
- package/bmad/bmb/workflows/create-workflow/steps/step-07-build.md +323 -323
- package/bmad/bmb/workflows/create-workflow/steps/step-08-review.md +285 -285
- package/bmad/bmb/workflows/create-workflow/steps/step-09-complete.md +188 -188
- package/bmad/bmb/workflows/create-workflow/workflow.md +59 -59
- package/bmad/bmb/workflows/edit-workflow/steps/step-01-analyze.md +217 -217
- package/bmad/bmb/workflows/edit-workflow/steps/step-02-discover.md +254 -254
- package/bmad/bmb/workflows/edit-workflow/steps/step-03-improve.md +218 -218
- package/bmad/bmb/workflows/edit-workflow/steps/step-04-validate.md +194 -194
- package/bmad/bmb/workflows/edit-workflow/steps/step-05-compliance-check.md +246 -246
- package/bmad/bmb/workflows/edit-workflow/templates/completion-summary.md +75 -75
- package/bmad/bmb/workflows/edit-workflow/templates/improvement-goals.md +68 -68
- package/bmad/bmb/workflows/edit-workflow/templates/improvement-log.md +40 -40
- package/bmad/bmb/workflows/edit-workflow/templates/validation-results.md +51 -51
- package/bmad/bmb/workflows/edit-workflow/templates/workflow-analysis.md +56 -56
- package/bmad/bmb/workflows/edit-workflow/workflow.md +59 -59
- package/bmad/bmb/workflows/workflow-compliance-check/steps/step-01-validate-goal.md +153 -153
- package/bmad/bmb/workflows/workflow-compliance-check/steps/step-02-workflow-validation.md +244 -244
- package/bmad/bmb/workflows/workflow-compliance-check/steps/step-03-step-validation.md +275 -275
- package/bmad/bmb/workflows/workflow-compliance-check/steps/step-04-file-validation.md +296 -296
- package/bmad/bmb/workflows/workflow-compliance-check/steps/step-05-intent-spectrum-validation.md +265 -265
- package/bmad/bmb/workflows/workflow-compliance-check/steps/step-06-web-subprocess-validation.md +361 -361
- package/bmad/bmb/workflows/workflow-compliance-check/steps/step-07-holistic-analysis.md +259 -259
- package/bmad/bmb/workflows/workflow-compliance-check/steps/step-08-generate-report.md +302 -302
- package/bmad/bmb/workflows/workflow-compliance-check/templates/compliance-report.md +140 -140
- package/bmad/bmb/workflows/workflow-compliance-check/workflow.md +59 -59
- package/bmad/bmb/workflows-legacy/edit-module/README.md +171 -171
- package/bmad/bmb/workflows-legacy/edit-module/checklist.md +163 -163
- package/bmad/bmb/workflows-legacy/edit-module/instructions.md +340 -340
- package/bmad/bmb/workflows-legacy/edit-module/workflow.yaml +32 -32
- package/bmad/bmb/workflows-legacy/module-brief/README.md +264 -264
- package/bmad/bmb/workflows-legacy/module-brief/checklist.md +116 -116
- package/bmad/bmb/workflows-legacy/module-brief/instructions.md +268 -268
- package/bmad/bmb/workflows-legacy/module-brief/template.md +275 -275
- package/bmad/bmb/workflows-legacy/module-brief/workflow.yaml +34 -34
- package/bmad/bmm/agents/analyst.md +76 -76
- package/bmad/bmm/agents/architect.md +68 -68
- package/bmad/bmm/agents/dev.md +70 -70
- package/bmad/bmm/agents/pm.md +70 -70
- package/bmad/bmm/agents/quick-flow-solo-dev.md +68 -68
- package/bmad/bmm/agents/sm.md +71 -71
- package/bmad/bmm/agents/tea.md +71 -71
- package/bmad/bmm/agents/tech-writer.md +72 -72
- package/bmad/bmm/agents/ux-designer.md +68 -68
- package/bmad/bmm/config.yaml +18 -18
- package/bmad/bmm/data/README.md +29 -29
- package/bmad/bmm/data/documentation-standards.md +262 -262
- package/bmad/bmm/data/project-context-template.md +40 -40
- package/bmad/bmm/teams/default-party.csv +21 -21
- package/bmad/bmm/teams/team-fullstack.yaml +12 -12
- package/bmad/bmm/testarch/knowledge/api-request.md +303 -303
- package/bmad/bmm/testarch/knowledge/auth-session.md +356 -356
- package/bmad/bmm/testarch/knowledge/burn-in.md +273 -273
- package/bmad/bmm/testarch/knowledge/ci-burn-in.md +675 -675
- package/bmad/bmm/testarch/knowledge/component-tdd.md +486 -486
- package/bmad/bmm/testarch/knowledge/contract-testing.md +957 -957
- package/bmad/bmm/testarch/knowledge/data-factories.md +500 -500
- package/bmad/bmm/testarch/knowledge/email-auth.md +721 -721
- package/bmad/bmm/testarch/knowledge/error-handling.md +725 -725
- package/bmad/bmm/testarch/knowledge/feature-flags.md +750 -750
- package/bmad/bmm/testarch/knowledge/file-utils.md +260 -260
- package/bmad/bmm/testarch/knowledge/fixture-architecture.md +401 -401
- package/bmad/bmm/testarch/knowledge/fixtures-composition.md +382 -382
- package/bmad/bmm/testarch/knowledge/intercept-network-call.md +280 -280
- package/bmad/bmm/testarch/knowledge/log.md +294 -294
- package/bmad/bmm/testarch/knowledge/network-error-monitor.md +272 -272
- package/bmad/bmm/testarch/knowledge/network-first.md +486 -486
- package/bmad/bmm/testarch/knowledge/network-recorder.md +265 -265
- package/bmad/bmm/testarch/knowledge/nfr-criteria.md +670 -670
- package/bmad/bmm/testarch/knowledge/overview.md +283 -283
- package/bmad/bmm/testarch/knowledge/playwright-config.md +730 -730
- package/bmad/bmm/testarch/knowledge/probability-impact.md +601 -601
- package/bmad/bmm/testarch/knowledge/recurse.md +296 -296
- package/bmad/bmm/testarch/knowledge/risk-governance.md +615 -615
- package/bmad/bmm/testarch/knowledge/selective-testing.md +732 -732
- package/bmad/bmm/testarch/knowledge/selector-resilience.md +527 -527
- package/bmad/bmm/testarch/knowledge/test-healing-patterns.md +644 -644
- package/bmad/bmm/testarch/knowledge/test-levels-framework.md +473 -473
- package/bmad/bmm/testarch/knowledge/test-priorities-matrix.md +373 -373
- package/bmad/bmm/testarch/knowledge/test-quality.md +664 -664
- package/bmad/bmm/testarch/knowledge/timing-debugging.md +372 -372
- package/bmad/bmm/testarch/knowledge/visual-debugging.md +524 -524
- package/bmad/bmm/testarch/tea-index.csv +33 -33
- package/bmad/bmm/workflows/1-analysis/create-product-brief/product-brief.template.md +10 -10
- package/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-01-init.md +182 -182
- package/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-01b-continue.md +166 -166
- package/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-02-vision.md +204 -204
- package/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-03-users.md +207 -207
- package/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-04-metrics.md +210 -210
- package/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-05-scope.md +224 -224
- package/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-06-complete.md +199 -199
- package/bmad/bmm/workflows/1-analysis/create-product-brief/workflow.md +58 -58
- package/bmad/bmm/workflows/1-analysis/research/domain-steps/step-01-init.md +137 -137
- package/bmad/bmm/workflows/1-analysis/research/domain-steps/step-02-domain-analysis.md +229 -229
- package/bmad/bmm/workflows/1-analysis/research/domain-steps/step-03-competitive-landscape.md +238 -238
- package/bmad/bmm/workflows/1-analysis/research/domain-steps/step-04-regulatory-focus.md +206 -206
- package/bmad/bmm/workflows/1-analysis/research/domain-steps/step-05-technical-trends.md +234 -234
- package/bmad/bmm/workflows/1-analysis/research/domain-steps/step-06-research-synthesis.md +443 -443
- package/bmad/bmm/workflows/1-analysis/research/market-steps/step-01-init.md +182 -182
- package/bmad/bmm/workflows/1-analysis/research/market-steps/step-02-customer-behavior.md +237 -237
- package/bmad/bmm/workflows/1-analysis/research/market-steps/step-02-customer-insights.md +200 -200
- package/bmad/bmm/workflows/1-analysis/research/market-steps/step-03-customer-pain-points.md +249 -249
- package/bmad/bmm/workflows/1-analysis/research/market-steps/step-04-customer-decisions.md +259 -259
- package/bmad/bmm/workflows/1-analysis/research/market-steps/step-05-competitive-analysis.md +177 -177
- package/bmad/bmm/workflows/1-analysis/research/market-steps/step-06-research-completion.md +475 -475
- package/bmad/bmm/workflows/1-analysis/research/research.template.md +29 -29
- package/bmad/bmm/workflows/1-analysis/research/technical-steps/step-01-init.md +137 -137
- package/bmad/bmm/workflows/1-analysis/research/technical-steps/step-02-technical-overview.md +239 -239
- package/bmad/bmm/workflows/1-analysis/research/technical-steps/step-03-integration-patterns.md +248 -248
- package/bmad/bmm/workflows/1-analysis/research/technical-steps/step-04-architectural-patterns.md +202 -202
- package/bmad/bmm/workflows/1-analysis/research/technical-steps/step-05-implementation-research.md +239 -239
- package/bmad/bmm/workflows/1-analysis/research/technical-steps/step-06-research-synthesis.md +486 -486
- package/bmad/bmm/workflows/1-analysis/research/workflow.md +173 -173
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-01-init.md +135 -135
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-01b-continue.md +127 -127
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-02-discovery.md +190 -190
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-03-core-experience.md +216 -216
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-04-emotional-response.md +219 -219
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-05-inspiration.md +234 -234
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-06-design-system.md +252 -252
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-07-defining-experience.md +254 -254
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-08-visual-foundation.md +224 -224
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-09-design-directions.md +224 -224
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-10-user-journeys.md +241 -241
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-11-component-strategy.md +248 -248
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-12-ux-patterns.md +237 -237
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-13-responsive-accessibility.md +264 -264
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-14-complete.md +228 -228
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/ux-design-template.md +13 -13
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/workflow.md +43 -43
- package/bmad/bmm/workflows/2-plan-workflows/prd/domain-complexity.csv +12 -12
- package/bmad/bmm/workflows/2-plan-workflows/prd/prd-template.md +11 -11
- package/bmad/bmm/workflows/2-plan-workflows/prd/project-types.csv +10 -10
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps/step-01-init.md +197 -197
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps/step-01b-continue.md +166 -166
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps/step-02-discovery.md +421 -421
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps/step-03-success.md +290 -290
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps/step-04-journeys.md +291 -291
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps/step-05-domain.md +271 -271
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps/step-06-innovation.md +262 -262
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps/step-07-project-type.md +258 -258
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps/step-08-scoping.md +299 -299
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps/step-09-functional.md +270 -270
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps/step-10-nonfunctional.md +294 -294
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps/step-11-complete.md +186 -186
- package/bmad/bmm/workflows/2-plan-workflows/prd/workflow.md +63 -63
- package/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-01-document-discovery.md +190 -190
- package/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-02-prd-analysis.md +178 -178
- package/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-03-epic-coverage-validation.md +179 -179
- package/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-04-ux-alignment.md +139 -139
- package/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-05-epic-quality-review.md +252 -252
- package/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-06-final-assessment.md +133 -133
- package/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/templates/readiness-report-template.md +4 -4
- package/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/workflow.md +55 -55
- package/bmad/bmm/workflows/3-solutioning/create-architecture/architecture-decision-template.md +12 -12
- package/bmad/bmm/workflows/3-solutioning/create-architecture/data/company-standards/architecture-patterns.md +415 -415
- package/bmad/bmm/workflows/3-solutioning/create-architecture/data/company-standards/backend-standards.md +811 -811
- package/bmad/bmm/workflows/3-solutioning/create-architecture/data/company-standards/frontend-standards.md +375 -375
- package/bmad/bmm/workflows/3-solutioning/create-architecture/data/company-standards/technical-preferences-ux.md +422 -422
- package/bmad/bmm/workflows/3-solutioning/create-architecture/data/company-standards/technology-stack.md +235 -235
- package/bmad/bmm/workflows/3-solutioning/create-architecture/data/domain-complexity.csv +10 -10
- package/bmad/bmm/workflows/3-solutioning/create-architecture/data/project-types.csv +6 -6
- package/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-01-init.md +166 -166
- package/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-01b-continue.md +164 -164
- package/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-02-context.md +224 -224
- package/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-03-starter.md +342 -342
- package/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-04-decisions.md +328 -328
- package/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-05-patterns.md +368 -368
- package/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-06-structure.md +379 -379
- package/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-07-validation.md +366 -366
- package/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-08-complete.md +352 -352
- package/bmad/bmm/workflows/3-solutioning/create-architecture/workflow.md +51 -51
- package/bmad/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-01-validate-prerequisites.md +259 -259
- package/bmad/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-02-design-epics.md +233 -233
- package/bmad/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-03-create-stories.md +272 -272
- package/bmad/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-04-final-validation.md +145 -145
- package/bmad/bmm/workflows/3-solutioning/create-epics-and-stories/templates/epics-template.md +57 -57
- package/bmad/bmm/workflows/3-solutioning/create-epics-and-stories/workflow.md +59 -59
- package/bmad/bmm/workflows/4-implementation/code-review/checklist.md +23 -23
- package/bmad/bmm/workflows/4-implementation/code-review/instructions.xml +224 -224
- package/bmad/bmm/workflows/4-implementation/code-review/workflow.yaml +49 -49
- package/bmad/bmm/workflows/4-implementation/correct-course/checklist.md +279 -279
- package/bmad/bmm/workflows/4-implementation/correct-course/instructions.md +206 -206
- package/bmad/bmm/workflows/4-implementation/correct-course/workflow.yaml +58 -58
- package/bmad/bmm/workflows/4-implementation/create-story/checklist.md +358 -358
- package/bmad/bmm/workflows/4-implementation/create-story/steps/step-01-determine-story.md +85 -85
- package/bmad/bmm/workflows/4-implementation/create-story/steps/step-02-analyze.md +67 -67
- package/bmad/bmm/workflows/4-implementation/create-story/steps/step-03-architecture.md +71 -71
- package/bmad/bmm/workflows/4-implementation/create-story/steps/step-04-web-research.md +58 -58
- package/bmad/bmm/workflows/4-implementation/create-story/steps/step-05-create-file.md +76 -76
- package/bmad/bmm/workflows/4-implementation/create-story/steps/step-06-finalize.md +66 -66
- package/bmad/bmm/workflows/4-implementation/create-story/template.md +49 -49
- package/bmad/bmm/workflows/4-implementation/create-story/workflow.md +58 -58
- package/bmad/bmm/workflows/4-implementation/create-story/workflow.yaml.bak +63 -63
- package/bmad/bmm/workflows/4-implementation/dev-story/checklist.md +85 -85
- package/bmad/bmm/workflows/4-implementation/dev-story/instructions.xml +470 -470
- package/bmad/bmm/workflows/4-implementation/dev-story/workflow.yaml +25 -25
- package/bmad/bmm/workflows/4-implementation/retrospective/instructions.md +1443 -1443
- package/bmad/bmm/workflows/4-implementation/retrospective/workflow.yaml +56 -56
- package/bmad/bmm/workflows/4-implementation/sprint-planning/checklist.md +33 -33
- package/bmad/bmm/workflows/4-implementation/sprint-planning/instructions.md +225 -225
- package/bmad/bmm/workflows/4-implementation/sprint-planning/sprint-status-template.yaml +55 -55
- package/bmad/bmm/workflows/4-implementation/sprint-planning/workflow.yaml +52 -52
- package/bmad/bmm/workflows/4-implementation/sprint-status/instructions.md +229 -229
- package/bmad/bmm/workflows/4-implementation/sprint-status/workflow.yaml +34 -34
- package/bmad/bmm/workflows/bmad-quick-flow/create-tech-spec/steps/step-01-understand.md +189 -189
- package/bmad/bmm/workflows/bmad-quick-flow/create-tech-spec/steps/step-02-investigate.md +144 -144
- package/bmad/bmm/workflows/bmad-quick-flow/create-tech-spec/steps/step-03-generate.md +128 -128
- package/bmad/bmm/workflows/bmad-quick-flow/create-tech-spec/steps/step-04-review.md +173 -173
- package/bmad/bmm/workflows/bmad-quick-flow/create-tech-spec/tech-spec-template.md +74 -74
- package/bmad/bmm/workflows/bmad-quick-flow/create-tech-spec/workflow.md +79 -79
- package/bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-01-mode-detection.md +156 -156
- package/bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-02-context-gathering.md +120 -120
- package/bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-03-execute.md +113 -113
- package/bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-04-self-check.md +113 -113
- package/bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-05-adversarial-review.md +106 -106
- package/bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-06-resolve-findings.md +140 -140
- package/bmad/bmm/workflows/bmad-quick-flow/quick-dev/workflow.md +52 -52
- package/bmad/bmm/workflows/document-project/checklist.md +245 -245
- package/bmad/bmm/workflows/document-project/documentation-requirements.csv +12 -12
- package/bmad/bmm/workflows/document-project/instructions.md +221 -221
- package/bmad/bmm/workflows/document-project/templates/deep-dive-template.md +345 -345
- package/bmad/bmm/workflows/document-project/templates/index-template.md +169 -169
- package/bmad/bmm/workflows/document-project/templates/project-overview-template.md +103 -103
- package/bmad/bmm/workflows/document-project/templates/project-scan-report-schema.json +160 -160
- package/bmad/bmm/workflows/document-project/templates/source-tree-template.md +135 -135
- package/bmad/bmm/workflows/document-project/workflow.yaml +28 -28
- package/bmad/bmm/workflows/document-project/workflows/deep-dive-instructions.md +298 -298
- package/bmad/bmm/workflows/document-project/workflows/deep-dive.yaml +31 -31
- package/bmad/bmm/workflows/document-project/workflows/full-scan-instructions.md +1106 -1106
- package/bmad/bmm/workflows/document-project/workflows/full-scan.yaml +31 -31
- package/bmad/bmm/workflows/excalidraw-diagrams/_shared/excalidraw-library.json +90 -90
- package/bmad/bmm/workflows/excalidraw-diagrams/_shared/excalidraw-templates.yaml +127 -127
- package/bmad/bmm/workflows/excalidraw-diagrams/create-dataflow/checklist.md +39 -39
- package/bmad/bmm/workflows/excalidraw-diagrams/create-dataflow/instructions.md +130 -130
- package/bmad/bmm/workflows/excalidraw-diagrams/create-dataflow/workflow.yaml +25 -25
- package/bmad/bmm/workflows/excalidraw-diagrams/create-diagram/checklist.md +43 -43
- package/bmad/bmm/workflows/excalidraw-diagrams/create-diagram/instructions.md +141 -141
- package/bmad/bmm/workflows/excalidraw-diagrams/create-diagram/workflow.yaml +25 -25
- package/bmad/bmm/workflows/excalidraw-diagrams/create-flowchart/checklist.md +49 -49
- package/bmad/bmm/workflows/excalidraw-diagrams/create-flowchart/instructions.md +241 -241
- package/bmad/bmm/workflows/excalidraw-diagrams/create-flowchart/workflow.yaml +25 -25
- package/bmad/bmm/workflows/excalidraw-diagrams/create-wireframe/checklist.md +38 -38
- package/bmad/bmm/workflows/excalidraw-diagrams/create-wireframe/instructions.md +133 -133
- package/bmad/bmm/workflows/excalidraw-diagrams/create-wireframe/workflow.yaml +25 -25
- package/bmad/bmm/workflows/generate-project-context/project-context-template.md +21 -21
- package/bmad/bmm/workflows/generate-project-context/steps/step-01-discover.md +218 -218
- package/bmad/bmm/workflows/generate-project-context/steps/step-02-generate.md +318 -318
- package/bmad/bmm/workflows/generate-project-context/steps/step-03-complete.md +278 -278
- package/bmad/bmm/workflows/generate-project-context/workflow.md +50 -50
- package/bmad/bmm/workflows/testarch/atdd/atdd-checklist-template.md +364 -364
- package/bmad/bmm/workflows/testarch/atdd/checklist.md +374 -374
- package/bmad/bmm/workflows/testarch/atdd/instructions.md +806 -806
- package/bmad/bmm/workflows/testarch/atdd/workflow.yaml +45 -45
- package/bmad/bmm/workflows/testarch/automate/checklist.md +582 -582
- package/bmad/bmm/workflows/testarch/automate/instructions.md +1324 -1324
- package/bmad/bmm/workflows/testarch/automate/workflow.yaml +52 -52
- package/bmad/bmm/workflows/testarch/ci/checklist.md +248 -248
- package/bmad/bmm/workflows/testarch/ci/github-actions-template.yaml +198 -198
- package/bmad/bmm/workflows/testarch/ci/gitlab-ci-template.yaml +149 -149
- package/bmad/bmm/workflows/testarch/ci/instructions.md +536 -536
- package/bmad/bmm/workflows/testarch/ci/workflow.yaml +45 -45
- package/bmad/bmm/workflows/testarch/framework/checklist.md +321 -321
- package/bmad/bmm/workflows/testarch/framework/instructions.md +481 -481
- package/bmad/bmm/workflows/testarch/framework/workflow.yaml +47 -47
- package/bmad/bmm/workflows/testarch/nfr-assess/checklist.md +407 -407
- package/bmad/bmm/workflows/testarch/nfr-assess/instructions.md +722 -722
- package/bmad/bmm/workflows/testarch/nfr-assess/nfr-report-template.md +445 -445
- package/bmad/bmm/workflows/testarch/nfr-assess/workflow.yaml +47 -47
- package/bmad/bmm/workflows/testarch/test-design/checklist.md +235 -235
- package/bmad/bmm/workflows/testarch/test-design/instructions.md +788 -788
- package/bmad/bmm/workflows/testarch/test-design/test-design-template.md +294 -294
- package/bmad/bmm/workflows/testarch/test-design/workflow.yaml +54 -54
- package/bmad/bmm/workflows/testarch/test-review/checklist.md +472 -472
- package/bmad/bmm/workflows/testarch/test-review/instructions.md +628 -628
- package/bmad/bmm/workflows/testarch/test-review/test-review-template.md +390 -390
- package/bmad/bmm/workflows/testarch/test-review/workflow.yaml +46 -46
- package/bmad/bmm/workflows/testarch/trace/checklist.md +655 -655
- package/bmad/bmm/workflows/testarch/trace/instructions.md +1047 -1047
- package/bmad/bmm/workflows/testarch/trace/trace-template.md +675 -675
- package/bmad/bmm/workflows/testarch/trace/workflow.yaml +55 -55
- package/bmad/bmm/workflows/workflow-status/init/instructions.md +346 -346
- package/bmad/bmm/workflows/workflow-status/init/workflow.yaml +28 -28
- package/bmad/bmm/workflows/workflow-status/instructions.md +395 -395
- package/bmad/bmm/workflows/workflow-status/paths/enterprise-brownfield.yaml +103 -103
- package/bmad/bmm/workflows/workflow-status/paths/enterprise-greenfield.yaml +100 -100
- package/bmad/bmm/workflows/workflow-status/paths/method-brownfield.yaml +103 -103
- package/bmad/bmm/workflows/workflow-status/paths/method-greenfield.yaml +100 -100
- package/bmad/bmm/workflows/workflow-status/project-levels.yaml +59 -59
- package/bmad/bmm/workflows/workflow-status/workflow-status-template.yaml +24 -24
- package/bmad/bmm/workflows/workflow-status/workflow.yaml +30 -30
- package/bmad/cis/agents/brainstorming-coach.md +60 -60
- package/bmad/cis/agents/creative-problem-solver.md +60 -60
- package/bmad/cis/agents/design-thinking-coach.md +60 -60
- package/bmad/cis/agents/innovation-strategist.md +60 -60
- package/bmad/cis/agents/presentation-master.md +66 -66
- package/bmad/cis/agents/storyteller/storyteller.md +57 -57
- package/bmad/cis/config.yaml +11 -11
- package/bmad/cis/teams/creative-squad.yaml +7 -7
- package/bmad/cis/teams/default-party.csv +12 -12
- package/bmad/cis/workflows/README.md +139 -139
- package/bmad/cis/workflows/design-thinking/README.md +56 -56
- package/bmad/cis/workflows/design-thinking/design-methods.csv +30 -30
- package/bmad/cis/workflows/design-thinking/instructions.md +202 -202
- package/bmad/cis/workflows/design-thinking/template.md +111 -111
- package/bmad/cis/workflows/design-thinking/workflow.yaml +27 -27
- package/bmad/cis/workflows/innovation-strategy/README.md +56 -56
- package/bmad/cis/workflows/innovation-strategy/innovation-frameworks.csv +30 -30
- package/bmad/cis/workflows/innovation-strategy/instructions.md +276 -276
- package/bmad/cis/workflows/innovation-strategy/template.md +189 -189
- package/bmad/cis/workflows/innovation-strategy/workflow.yaml +27 -27
- package/bmad/cis/workflows/problem-solving/README.md +56 -56
- package/bmad/cis/workflows/problem-solving/instructions.md +252 -252
- package/bmad/cis/workflows/problem-solving/solving-methods.csv +30 -30
- package/bmad/cis/workflows/problem-solving/template.md +165 -165
- package/bmad/cis/workflows/problem-solving/workflow.yaml +27 -27
- package/bmad/cis/workflows/storytelling/README.md +58 -58
- package/bmad/cis/workflows/storytelling/instructions.md +293 -293
- package/bmad/cis/workflows/storytelling/story-types.csv +25 -25
- package/bmad/cis/workflows/storytelling/template.md +113 -113
- package/bmad/cis/workflows/storytelling/workflow.yaml +27 -27
- package/bmad/core/agents/bmad-master.md +57 -57
- package/bmad/core/config.yaml +9 -9
- package/bmad/core/resources/excalidraw/README.md +160 -160
- package/bmad/core/resources/excalidraw/excalidraw-helpers.md +127 -127
- package/bmad/core/resources/excalidraw/library-loader.md +50 -50
- package/bmad/core/resources/excalidraw/validate-json-instructions.md +79 -79
- package/bmad/core/tasks/index-docs.xml +64 -64
- package/bmad/core/tasks/review-adversarial-general.xml +41 -41
- package/bmad/core/tasks/shard-doc.xml +108 -108
- package/bmad/core/tasks/validate-workflow.xml +88 -88
- package/bmad/core/tasks/workflow.xml +234 -234
- package/bmad/core/workflows/advanced-elicitation/methods.csv +51 -51
- package/bmad/core/workflows/advanced-elicitation/workflow.xml +116 -116
- package/bmad/core/workflows/brainstorming/brain-methods.csv +61 -61
- package/bmad/core/workflows/brainstorming/steps/step-01-session-setup.md +197 -197
- package/bmad/core/workflows/brainstorming/steps/step-01b-continue.md +122 -122
- package/bmad/core/workflows/brainstorming/steps/step-02a-user-selected.md +225 -225
- package/bmad/core/workflows/brainstorming/steps/step-02b-ai-recommended.md +237 -237
- package/bmad/core/workflows/brainstorming/steps/step-02c-random-selection.md +209 -209
- package/bmad/core/workflows/brainstorming/steps/step-02d-progressive-flow.md +264 -264
- package/bmad/core/workflows/brainstorming/steps/step-03-technique-execution.md +340 -340
- package/bmad/core/workflows/brainstorming/steps/step-04-idea-organization.md +303 -303
- package/bmad/core/workflows/brainstorming/template.md +15 -15
- package/bmad/core/workflows/brainstorming/workflow.md +51 -51
- package/bmad/core/workflows/party-mode/steps/step-01-agent-loading.md +139 -139
- package/bmad/core/workflows/party-mode/steps/step-02-discussion-orchestration.md +204 -204
- package/bmad/core/workflows/party-mode/steps/step-03-graceful-exit.md +159 -159
- package/bmad/core/workflows/party-mode/workflow.md +206 -206
- package/claude/hooks/file-restriction-hook.py +51 -51
- package/claude/hooks/track-agent.py +67 -67
- package/claude/settings.local.json +76 -76
- package/gemini/commands/BMad/agents/analyst.toml +6 -0
- package/gemini/commands/BMad/agents/architect.toml +6 -0
- package/gemini/commands/BMad/agents/bmad-master.toml +6 -0
- package/gemini/commands/BMad/agents/bmad-orchestrator.toml +6 -0
- package/gemini/commands/BMad/agents/dev.toml +6 -0
- package/gemini/commands/BMad/agents/pm.toml +6 -0
- package/gemini/commands/BMad/agents/po.toml +6 -0
- package/gemini/commands/BMad/agents/qa.toml +6 -0
- package/gemini/commands/BMad/agents/sm.toml +6 -0
- package/gemini/commands/BMad/agents/ux-expert.toml +6 -0
- package/gemini/commands/BMad/tasks/advanced-elicitation.toml +6 -0
- package/gemini/commands/BMad/tasks/apply-qa-fixes.toml +6 -0
- package/gemini/commands/BMad/tasks/brownfield-create-epic.toml +6 -0
- package/gemini/commands/BMad/tasks/brownfield-create-story.toml +6 -0
- package/gemini/commands/BMad/tasks/correct-course.toml +6 -0
- package/gemini/commands/BMad/tasks/create-brownfield-story.toml +6 -0
- package/gemini/commands/BMad/tasks/create-deep-research-prompt.toml +6 -0
- package/gemini/commands/BMad/tasks/create-doc.toml +6 -0
- package/gemini/commands/BMad/tasks/create-next-story.toml +6 -0
- package/gemini/commands/BMad/tasks/document-project.toml +6 -0
- package/gemini/commands/BMad/tasks/execute-checklist.toml +6 -0
- package/gemini/commands/BMad/tasks/facilitate-brainstorming-session.toml +6 -0
- package/gemini/commands/BMad/tasks/generate-ai-frontend-prompt.toml +6 -0
- package/gemini/commands/BMad/tasks/index-docs.toml +6 -0
- package/gemini/commands/BMad/tasks/kb-mode-interaction.toml +6 -0
- package/gemini/commands/BMad/tasks/nfr-assess.toml +6 -0
- package/gemini/commands/BMad/tasks/qa-gate.toml +6 -0
- package/gemini/commands/BMad/tasks/review-story.toml +6 -0
- package/gemini/commands/BMad/tasks/risk-profile.toml +6 -0
- package/gemini/commands/BMad/tasks/shard-doc.toml +6 -0
- package/gemini/commands/BMad/tasks/test-design.toml +6 -0
- package/gemini/commands/BMad/tasks/trace-requirements.toml +6 -0
- package/gemini/commands/BMad/tasks/validate-next-story.toml +6 -0
- package/github/workflows/publish.yml +150 -150
- package/index.js +9 -9
- package/mcp.json +14 -14
- package/package.json +41 -40
- package/resources/images/Siesa_Logosimbolo_Azul.svg +24 -24
- package/resources/images/Siesa_Logosimbolo_Blanco.svg +24 -24
- package/resources/images/Siesa_Simbolo_Azul.svg +14 -14
- package/resources/images/Siesa_Simbolo_Blanco.svg +14 -14
- package/vscode/mcp.json +15 -15
- package/vscode/settings.json +12 -12
|
@@ -1,401 +1,401 @@
|
|
|
1
|
-
# Fixture Architecture Playbook
|
|
2
|
-
|
|
3
|
-
## Principle
|
|
4
|
-
|
|
5
|
-
Build test helpers as pure functions first, then wrap them in framework-specific fixtures. Compose capabilities using `mergeTests` (Playwright) or layered commands (Cypress) instead of inheritance. Each fixture should solve one isolated concern (auth, API, logs, network).
|
|
6
|
-
|
|
7
|
-
## Rationale
|
|
8
|
-
|
|
9
|
-
Traditional Page Object Models create tight coupling through inheritance chains (`BasePage → LoginPage → AdminPage`). When base classes change, all descendants break. Pure functions with fixture wrappers provide:
|
|
10
|
-
|
|
11
|
-
- **Testability**: Pure functions run in unit tests without framework overhead
|
|
12
|
-
- **Composability**: Mix capabilities freely via `mergeTests`, no inheritance constraints
|
|
13
|
-
- **Reusability**: Export fixtures via package subpaths for cross-project sharing
|
|
14
|
-
- **Maintainability**: One concern per fixture = clear responsibility boundaries
|
|
15
|
-
|
|
16
|
-
## Pattern Examples
|
|
17
|
-
|
|
18
|
-
### Example 1: Pure Function → Fixture Pattern
|
|
19
|
-
|
|
20
|
-
**Context**: When building any test helper, always start with a pure function that accepts all dependencies explicitly. Then wrap it in a Playwright fixture or Cypress command.
|
|
21
|
-
|
|
22
|
-
**Implementation**:
|
|
23
|
-
|
|
24
|
-
```typescript
|
|
25
|
-
// playwright/support/helpers/api-request.ts
|
|
26
|
-
// Step 1: Pure function (ALWAYS FIRST!)
|
|
27
|
-
type ApiRequestParams = {
|
|
28
|
-
request: APIRequestContext;
|
|
29
|
-
method: 'GET' | 'POST' | 'PUT' | 'DELETE';
|
|
30
|
-
url: string;
|
|
31
|
-
data?: unknown;
|
|
32
|
-
headers?: Record<string, string>;
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
export async function apiRequest({
|
|
36
|
-
request,
|
|
37
|
-
method,
|
|
38
|
-
url,
|
|
39
|
-
data,
|
|
40
|
-
headers = {}
|
|
41
|
-
}: ApiRequestParams) {
|
|
42
|
-
const response = await request.fetch(url, {
|
|
43
|
-
method,
|
|
44
|
-
data,
|
|
45
|
-
headers: {
|
|
46
|
-
'Content-Type': 'application/json',
|
|
47
|
-
...headers
|
|
48
|
-
}
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
if (!response.ok()) {
|
|
52
|
-
throw new Error(`API request failed: ${response.status()} ${await response.text()}`);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
return response.json();
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
// Step 2: Fixture wrapper
|
|
59
|
-
// playwright/support/fixtures/api-request-fixture.ts
|
|
60
|
-
import { test as base } from '@playwright/test';
|
|
61
|
-
import { apiRequest } from '../helpers/api-request';
|
|
62
|
-
|
|
63
|
-
export const test = base.extend<{ apiRequest: typeof apiRequest }>({
|
|
64
|
-
apiRequest: async ({ request }, use) => {
|
|
65
|
-
// Inject framework dependency, expose pure function
|
|
66
|
-
await use((params) => apiRequest({ request, ...params }));
|
|
67
|
-
}
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
// Step 3: Package exports for reusability
|
|
71
|
-
// package.json
|
|
72
|
-
{
|
|
73
|
-
"exports": {
|
|
74
|
-
"./api-request": "./playwright/support/helpers/api-request.ts",
|
|
75
|
-
"./api-request/fixtures": "./playwright/support/fixtures/api-request-fixture.ts"
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
**Key Points**:
|
|
81
|
-
|
|
82
|
-
- Pure function is unit-testable without Playwright running
|
|
83
|
-
- Framework dependency (`request`) injected at fixture boundary
|
|
84
|
-
- Fixture exposes the pure function to test context
|
|
85
|
-
- Package subpath exports enable `import { apiRequest } from 'my-fixtures/api-request'`
|
|
86
|
-
|
|
87
|
-
### Example 2: Composable Fixture System with mergeTests
|
|
88
|
-
|
|
89
|
-
**Context**: When building comprehensive test capabilities, compose multiple focused fixtures instead of creating monolithic helper classes. Each fixture provides one capability.
|
|
90
|
-
|
|
91
|
-
**Implementation**:
|
|
92
|
-
|
|
93
|
-
```typescript
|
|
94
|
-
// playwright/support/fixtures/merged-fixtures.ts
|
|
95
|
-
import { test as base, mergeTests } from '@playwright/test';
|
|
96
|
-
import { test as apiRequestFixture } from './api-request-fixture';
|
|
97
|
-
import { test as networkFixture } from './network-fixture';
|
|
98
|
-
import { test as authFixture } from './auth-fixture';
|
|
99
|
-
import { test as logFixture } from './log-fixture';
|
|
100
|
-
|
|
101
|
-
// Compose all fixtures for comprehensive capabilities
|
|
102
|
-
export const test = mergeTests(base, apiRequestFixture, networkFixture, authFixture, logFixture);
|
|
103
|
-
|
|
104
|
-
export { expect } from '@playwright/test';
|
|
105
|
-
|
|
106
|
-
// Example usage in tests:
|
|
107
|
-
// import { test, expect } from './support/fixtures/merged-fixtures';
|
|
108
|
-
//
|
|
109
|
-
// test('user can create order', async ({ page, apiRequest, auth, network }) => {
|
|
110
|
-
// await auth.loginAs('customer@example.com');
|
|
111
|
-
// await network.interceptRoute('POST', '**/api/orders', { id: 123 });
|
|
112
|
-
// await page.goto('/checkout');
|
|
113
|
-
// await page.click('[data-testid="submit-order"]');
|
|
114
|
-
// await expect(page.getByText('Order #123')).toBeVisible();
|
|
115
|
-
// });
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
**Individual Fixture Examples**:
|
|
119
|
-
|
|
120
|
-
```typescript
|
|
121
|
-
// network-fixture.ts
|
|
122
|
-
export const test = base.extend({
|
|
123
|
-
network: async ({ page }, use) => {
|
|
124
|
-
const interceptedRoutes = new Map();
|
|
125
|
-
|
|
126
|
-
const interceptRoute = async (method: string, url: string, response: unknown) => {
|
|
127
|
-
await page.route(url, (route) => {
|
|
128
|
-
if (route.request().method() === method) {
|
|
129
|
-
route.fulfill({ body: JSON.stringify(response) });
|
|
130
|
-
}
|
|
131
|
-
});
|
|
132
|
-
interceptedRoutes.set(`${method}:${url}`, response);
|
|
133
|
-
};
|
|
134
|
-
|
|
135
|
-
await use({ interceptRoute });
|
|
136
|
-
|
|
137
|
-
// Cleanup
|
|
138
|
-
interceptedRoutes.clear();
|
|
139
|
-
},
|
|
140
|
-
});
|
|
141
|
-
|
|
142
|
-
// auth-fixture.ts
|
|
143
|
-
export const test = base.extend({
|
|
144
|
-
auth: async ({ page, context }, use) => {
|
|
145
|
-
const loginAs = async (email: string) => {
|
|
146
|
-
// Use API to setup auth (fast!)
|
|
147
|
-
const token = await getAuthToken(email);
|
|
148
|
-
await context.addCookies([
|
|
149
|
-
{
|
|
150
|
-
name: 'auth_token',
|
|
151
|
-
value: token,
|
|
152
|
-
domain: 'localhost',
|
|
153
|
-
path: '/',
|
|
154
|
-
},
|
|
155
|
-
]);
|
|
156
|
-
};
|
|
157
|
-
|
|
158
|
-
await use({ loginAs });
|
|
159
|
-
},
|
|
160
|
-
});
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
**Key Points**:
|
|
164
|
-
|
|
165
|
-
- `mergeTests` combines fixtures without inheritance
|
|
166
|
-
- Each fixture has single responsibility (network, auth, logs)
|
|
167
|
-
- Tests import merged fixture and access all capabilities
|
|
168
|
-
- No coupling between fixtures—add/remove freely
|
|
169
|
-
|
|
170
|
-
### Example 3: Framework-Agnostic HTTP Helper
|
|
171
|
-
|
|
172
|
-
**Context**: When building HTTP helpers, keep them framework-agnostic. Accept all params explicitly so they work in unit tests, Playwright, Cypress, or any context.
|
|
173
|
-
|
|
174
|
-
**Implementation**:
|
|
175
|
-
|
|
176
|
-
```typescript
|
|
177
|
-
// shared/helpers/http-helper.ts
|
|
178
|
-
// Pure, framework-agnostic function
|
|
179
|
-
type HttpHelperParams = {
|
|
180
|
-
baseUrl: string;
|
|
181
|
-
endpoint: string;
|
|
182
|
-
method: 'GET' | 'POST' | 'PUT' | 'DELETE';
|
|
183
|
-
body?: unknown;
|
|
184
|
-
headers?: Record<string, string>;
|
|
185
|
-
token?: string;
|
|
186
|
-
};
|
|
187
|
-
|
|
188
|
-
export async function makeHttpRequest({ baseUrl, endpoint, method, body, headers = {}, token }: HttpHelperParams): Promise<unknown> {
|
|
189
|
-
const url = `${baseUrl}${endpoint}`;
|
|
190
|
-
const requestHeaders = {
|
|
191
|
-
'Content-Type': 'application/json',
|
|
192
|
-
...(token && { Authorization: `Bearer ${token}` }),
|
|
193
|
-
...headers,
|
|
194
|
-
};
|
|
195
|
-
|
|
196
|
-
const response = await fetch(url, {
|
|
197
|
-
method,
|
|
198
|
-
headers: requestHeaders,
|
|
199
|
-
body: body ? JSON.stringify(body) : undefined,
|
|
200
|
-
});
|
|
201
|
-
|
|
202
|
-
if (!response.ok) {
|
|
203
|
-
const errorText = await response.text();
|
|
204
|
-
throw new Error(`HTTP ${method} ${url} failed: ${response.status} ${errorText}`);
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
return response.json();
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
// Playwright fixture wrapper
|
|
211
|
-
// playwright/support/fixtures/http-fixture.ts
|
|
212
|
-
import { test as base } from '@playwright/test';
|
|
213
|
-
import { makeHttpRequest } from '../../shared/helpers/http-helper';
|
|
214
|
-
|
|
215
|
-
export const test = base.extend({
|
|
216
|
-
httpHelper: async ({}, use) => {
|
|
217
|
-
const baseUrl = process.env.API_BASE_URL || 'http://localhost:3000';
|
|
218
|
-
|
|
219
|
-
await use((params) => makeHttpRequest({ baseUrl, ...params }));
|
|
220
|
-
},
|
|
221
|
-
});
|
|
222
|
-
|
|
223
|
-
// Cypress command wrapper
|
|
224
|
-
// cypress/support/commands.ts
|
|
225
|
-
import { makeHttpRequest } from '../../shared/helpers/http-helper';
|
|
226
|
-
|
|
227
|
-
Cypress.Commands.add('apiRequest', (params) => {
|
|
228
|
-
const baseUrl = Cypress.env('API_BASE_URL') || 'http://localhost:3000';
|
|
229
|
-
return cy.wrap(makeHttpRequest({ baseUrl, ...params }));
|
|
230
|
-
});
|
|
231
|
-
```
|
|
232
|
-
|
|
233
|
-
**Key Points**:
|
|
234
|
-
|
|
235
|
-
- Pure function uses only standard `fetch`, no framework dependencies
|
|
236
|
-
- Unit tests call `makeHttpRequest` directly with all params
|
|
237
|
-
- Playwright and Cypress wrappers inject framework-specific config
|
|
238
|
-
- Same logic runs everywhere—zero duplication
|
|
239
|
-
|
|
240
|
-
### Example 4: Fixture Cleanup Pattern
|
|
241
|
-
|
|
242
|
-
**Context**: When fixtures create resources (data, files, connections), ensure automatic cleanup in fixture teardown. Tests must not leak state.
|
|
243
|
-
|
|
244
|
-
**Implementation**:
|
|
245
|
-
|
|
246
|
-
```typescript
|
|
247
|
-
// playwright/support/fixtures/database-fixture.ts
|
|
248
|
-
import { test as base } from '@playwright/test';
|
|
249
|
-
import { seedDatabase, deleteRecord } from '../helpers/db-helpers';
|
|
250
|
-
|
|
251
|
-
type DatabaseFixture = {
|
|
252
|
-
seedUser: (userData: Partial<User>) => Promise<User>;
|
|
253
|
-
seedOrder: (orderData: Partial<Order>) => Promise<Order>;
|
|
254
|
-
};
|
|
255
|
-
|
|
256
|
-
export const test = base.extend<DatabaseFixture>({
|
|
257
|
-
seedUser: async ({}, use) => {
|
|
258
|
-
const createdUsers: string[] = [];
|
|
259
|
-
|
|
260
|
-
const seedUser = async (userData: Partial<User>) => {
|
|
261
|
-
const user = await seedDatabase('users', userData);
|
|
262
|
-
createdUsers.push(user.id);
|
|
263
|
-
return user;
|
|
264
|
-
};
|
|
265
|
-
|
|
266
|
-
await use(seedUser);
|
|
267
|
-
|
|
268
|
-
// Auto-cleanup: Delete all users created during test
|
|
269
|
-
for (const userId of createdUsers) {
|
|
270
|
-
await deleteRecord('users', userId);
|
|
271
|
-
}
|
|
272
|
-
createdUsers.length = 0;
|
|
273
|
-
},
|
|
274
|
-
|
|
275
|
-
seedOrder: async ({}, use) => {
|
|
276
|
-
const createdOrders: string[] = [];
|
|
277
|
-
|
|
278
|
-
const seedOrder = async (orderData: Partial<Order>) => {
|
|
279
|
-
const order = await seedDatabase('orders', orderData);
|
|
280
|
-
createdOrders.push(order.id);
|
|
281
|
-
return order;
|
|
282
|
-
};
|
|
283
|
-
|
|
284
|
-
await use(seedOrder);
|
|
285
|
-
|
|
286
|
-
// Auto-cleanup: Delete all orders
|
|
287
|
-
for (const orderId of createdOrders) {
|
|
288
|
-
await deleteRecord('orders', orderId);
|
|
289
|
-
}
|
|
290
|
-
createdOrders.length = 0;
|
|
291
|
-
},
|
|
292
|
-
});
|
|
293
|
-
|
|
294
|
-
// Example usage:
|
|
295
|
-
// test('user can place order', async ({ seedUser, seedOrder, page }) => {
|
|
296
|
-
// const user = await seedUser({ email: 'test@example.com' });
|
|
297
|
-
// const order = await seedOrder({ userId: user.id, total: 100 });
|
|
298
|
-
//
|
|
299
|
-
// await page.goto(`/orders/${order.id}`);
|
|
300
|
-
// await expect(page.getByText('Order Total: $100')).toBeVisible();
|
|
301
|
-
//
|
|
302
|
-
// // No manual cleanup needed—fixture handles it automatically
|
|
303
|
-
// });
|
|
304
|
-
```
|
|
305
|
-
|
|
306
|
-
**Key Points**:
|
|
307
|
-
|
|
308
|
-
- Track all created resources in array during test execution
|
|
309
|
-
- Teardown (after `use()`) deletes all tracked resources
|
|
310
|
-
- Tests don't manually clean up—happens automatically
|
|
311
|
-
- Prevents test pollution and flakiness from shared state
|
|
312
|
-
|
|
313
|
-
### Anti-Pattern: Inheritance-Based Page Objects
|
|
314
|
-
|
|
315
|
-
**Problem**:
|
|
316
|
-
|
|
317
|
-
```typescript
|
|
318
|
-
// ❌ BAD: Page Object Model with inheritance
|
|
319
|
-
class BasePage {
|
|
320
|
-
constructor(public page: Page) {}
|
|
321
|
-
|
|
322
|
-
async navigate(url: string) {
|
|
323
|
-
await this.page.goto(url);
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
async clickButton(selector: string) {
|
|
327
|
-
await this.page.click(selector);
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
class LoginPage extends BasePage {
|
|
332
|
-
async login(email: string, password: string) {
|
|
333
|
-
await this.navigate('/login');
|
|
334
|
-
await this.page.fill('#email', email);
|
|
335
|
-
await this.page.fill('#password', password);
|
|
336
|
-
await this.clickButton('#submit');
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
class AdminPage extends LoginPage {
|
|
341
|
-
async accessAdminPanel() {
|
|
342
|
-
await this.login('admin@example.com', 'admin123');
|
|
343
|
-
await this.navigate('/admin');
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
```
|
|
347
|
-
|
|
348
|
-
**Why It Fails**:
|
|
349
|
-
|
|
350
|
-
- Changes to `BasePage` break all descendants (`LoginPage`, `AdminPage`)
|
|
351
|
-
- `AdminPage` inherits unnecessary `login` details—tight coupling
|
|
352
|
-
- Cannot compose capabilities (e.g., admin + reporting features require multiple inheritance)
|
|
353
|
-
- Hard to test `BasePage` methods in isolation
|
|
354
|
-
- Hidden state in class instances leads to unpredictable behavior
|
|
355
|
-
|
|
356
|
-
**Better Approach**: Use pure functions + fixtures
|
|
357
|
-
|
|
358
|
-
```typescript
|
|
359
|
-
// ✅ GOOD: Pure functions with fixture composition
|
|
360
|
-
// helpers/navigation.ts
|
|
361
|
-
export async function navigate(page: Page, url: string) {
|
|
362
|
-
await page.goto(url);
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
// helpers/auth.ts
|
|
366
|
-
export async function login(page: Page, email: string, password: string) {
|
|
367
|
-
await page.fill('[data-testid="email"]', email);
|
|
368
|
-
await page.fill('[data-testid="password"]', password);
|
|
369
|
-
await page.click('[data-testid="submit"]');
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
// fixtures/admin-fixture.ts
|
|
373
|
-
export const test = base.extend({
|
|
374
|
-
adminPage: async ({ page }, use) => {
|
|
375
|
-
await login(page, 'admin@example.com', 'admin123');
|
|
376
|
-
await navigate(page, '/admin');
|
|
377
|
-
await use(page);
|
|
378
|
-
},
|
|
379
|
-
});
|
|
380
|
-
|
|
381
|
-
// Tests import exactly what they need—no inheritance
|
|
382
|
-
```
|
|
383
|
-
|
|
384
|
-
## Integration Points
|
|
385
|
-
|
|
386
|
-
- **Used in workflows**: `*atdd` (test generation), `*automate` (test expansion), `*framework` (initial setup)
|
|
387
|
-
- **Related fragments**:
|
|
388
|
-
- `data-factories.md` - Factory functions for test data
|
|
389
|
-
- `network-first.md` - Network interception patterns
|
|
390
|
-
- `test-quality.md` - Deterministic test design principles
|
|
391
|
-
|
|
392
|
-
## Helper Function Reuse Guidelines
|
|
393
|
-
|
|
394
|
-
When deciding whether to create a fixture, follow these rules:
|
|
395
|
-
|
|
396
|
-
- **3+ uses** → Create fixture with subpath export (shared across tests/projects)
|
|
397
|
-
- **2-3 uses** → Create utility module (shared within project)
|
|
398
|
-
- **1 use** → Keep inline (avoid premature abstraction)
|
|
399
|
-
- **Complex logic** → Factory function pattern (dynamic data generation)
|
|
400
|
-
|
|
401
|
-
_Source: Murat Testing Philosophy (lines 74-122), SEON production patterns, Playwright fixture docs._
|
|
1
|
+
# Fixture Architecture Playbook
|
|
2
|
+
|
|
3
|
+
## Principle
|
|
4
|
+
|
|
5
|
+
Build test helpers as pure functions first, then wrap them in framework-specific fixtures. Compose capabilities using `mergeTests` (Playwright) or layered commands (Cypress) instead of inheritance. Each fixture should solve one isolated concern (auth, API, logs, network).
|
|
6
|
+
|
|
7
|
+
## Rationale
|
|
8
|
+
|
|
9
|
+
Traditional Page Object Models create tight coupling through inheritance chains (`BasePage → LoginPage → AdminPage`). When base classes change, all descendants break. Pure functions with fixture wrappers provide:
|
|
10
|
+
|
|
11
|
+
- **Testability**: Pure functions run in unit tests without framework overhead
|
|
12
|
+
- **Composability**: Mix capabilities freely via `mergeTests`, no inheritance constraints
|
|
13
|
+
- **Reusability**: Export fixtures via package subpaths for cross-project sharing
|
|
14
|
+
- **Maintainability**: One concern per fixture = clear responsibility boundaries
|
|
15
|
+
|
|
16
|
+
## Pattern Examples
|
|
17
|
+
|
|
18
|
+
### Example 1: Pure Function → Fixture Pattern
|
|
19
|
+
|
|
20
|
+
**Context**: When building any test helper, always start with a pure function that accepts all dependencies explicitly. Then wrap it in a Playwright fixture or Cypress command.
|
|
21
|
+
|
|
22
|
+
**Implementation**:
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
// playwright/support/helpers/api-request.ts
|
|
26
|
+
// Step 1: Pure function (ALWAYS FIRST!)
|
|
27
|
+
type ApiRequestParams = {
|
|
28
|
+
request: APIRequestContext;
|
|
29
|
+
method: 'GET' | 'POST' | 'PUT' | 'DELETE';
|
|
30
|
+
url: string;
|
|
31
|
+
data?: unknown;
|
|
32
|
+
headers?: Record<string, string>;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
export async function apiRequest({
|
|
36
|
+
request,
|
|
37
|
+
method,
|
|
38
|
+
url,
|
|
39
|
+
data,
|
|
40
|
+
headers = {}
|
|
41
|
+
}: ApiRequestParams) {
|
|
42
|
+
const response = await request.fetch(url, {
|
|
43
|
+
method,
|
|
44
|
+
data,
|
|
45
|
+
headers: {
|
|
46
|
+
'Content-Type': 'application/json',
|
|
47
|
+
...headers
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
if (!response.ok()) {
|
|
52
|
+
throw new Error(`API request failed: ${response.status()} ${await response.text()}`);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return response.json();
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Step 2: Fixture wrapper
|
|
59
|
+
// playwright/support/fixtures/api-request-fixture.ts
|
|
60
|
+
import { test as base } from '@playwright/test';
|
|
61
|
+
import { apiRequest } from '../helpers/api-request';
|
|
62
|
+
|
|
63
|
+
export const test = base.extend<{ apiRequest: typeof apiRequest }>({
|
|
64
|
+
apiRequest: async ({ request }, use) => {
|
|
65
|
+
// Inject framework dependency, expose pure function
|
|
66
|
+
await use((params) => apiRequest({ request, ...params }));
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
// Step 3: Package exports for reusability
|
|
71
|
+
// package.json
|
|
72
|
+
{
|
|
73
|
+
"exports": {
|
|
74
|
+
"./api-request": "./playwright/support/helpers/api-request.ts",
|
|
75
|
+
"./api-request/fixtures": "./playwright/support/fixtures/api-request-fixture.ts"
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
**Key Points**:
|
|
81
|
+
|
|
82
|
+
- Pure function is unit-testable without Playwright running
|
|
83
|
+
- Framework dependency (`request`) injected at fixture boundary
|
|
84
|
+
- Fixture exposes the pure function to test context
|
|
85
|
+
- Package subpath exports enable `import { apiRequest } from 'my-fixtures/api-request'`
|
|
86
|
+
|
|
87
|
+
### Example 2: Composable Fixture System with mergeTests
|
|
88
|
+
|
|
89
|
+
**Context**: When building comprehensive test capabilities, compose multiple focused fixtures instead of creating monolithic helper classes. Each fixture provides one capability.
|
|
90
|
+
|
|
91
|
+
**Implementation**:
|
|
92
|
+
|
|
93
|
+
```typescript
|
|
94
|
+
// playwright/support/fixtures/merged-fixtures.ts
|
|
95
|
+
import { test as base, mergeTests } from '@playwright/test';
|
|
96
|
+
import { test as apiRequestFixture } from './api-request-fixture';
|
|
97
|
+
import { test as networkFixture } from './network-fixture';
|
|
98
|
+
import { test as authFixture } from './auth-fixture';
|
|
99
|
+
import { test as logFixture } from './log-fixture';
|
|
100
|
+
|
|
101
|
+
// Compose all fixtures for comprehensive capabilities
|
|
102
|
+
export const test = mergeTests(base, apiRequestFixture, networkFixture, authFixture, logFixture);
|
|
103
|
+
|
|
104
|
+
export { expect } from '@playwright/test';
|
|
105
|
+
|
|
106
|
+
// Example usage in tests:
|
|
107
|
+
// import { test, expect } from './support/fixtures/merged-fixtures';
|
|
108
|
+
//
|
|
109
|
+
// test('user can create order', async ({ page, apiRequest, auth, network }) => {
|
|
110
|
+
// await auth.loginAs('customer@example.com');
|
|
111
|
+
// await network.interceptRoute('POST', '**/api/orders', { id: 123 });
|
|
112
|
+
// await page.goto('/checkout');
|
|
113
|
+
// await page.click('[data-testid="submit-order"]');
|
|
114
|
+
// await expect(page.getByText('Order #123')).toBeVisible();
|
|
115
|
+
// });
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
**Individual Fixture Examples**:
|
|
119
|
+
|
|
120
|
+
```typescript
|
|
121
|
+
// network-fixture.ts
|
|
122
|
+
export const test = base.extend({
|
|
123
|
+
network: async ({ page }, use) => {
|
|
124
|
+
const interceptedRoutes = new Map();
|
|
125
|
+
|
|
126
|
+
const interceptRoute = async (method: string, url: string, response: unknown) => {
|
|
127
|
+
await page.route(url, (route) => {
|
|
128
|
+
if (route.request().method() === method) {
|
|
129
|
+
route.fulfill({ body: JSON.stringify(response) });
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
interceptedRoutes.set(`${method}:${url}`, response);
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
await use({ interceptRoute });
|
|
136
|
+
|
|
137
|
+
// Cleanup
|
|
138
|
+
interceptedRoutes.clear();
|
|
139
|
+
},
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
// auth-fixture.ts
|
|
143
|
+
export const test = base.extend({
|
|
144
|
+
auth: async ({ page, context }, use) => {
|
|
145
|
+
const loginAs = async (email: string) => {
|
|
146
|
+
// Use API to setup auth (fast!)
|
|
147
|
+
const token = await getAuthToken(email);
|
|
148
|
+
await context.addCookies([
|
|
149
|
+
{
|
|
150
|
+
name: 'auth_token',
|
|
151
|
+
value: token,
|
|
152
|
+
domain: 'localhost',
|
|
153
|
+
path: '/',
|
|
154
|
+
},
|
|
155
|
+
]);
|
|
156
|
+
};
|
|
157
|
+
|
|
158
|
+
await use({ loginAs });
|
|
159
|
+
},
|
|
160
|
+
});
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
**Key Points**:
|
|
164
|
+
|
|
165
|
+
- `mergeTests` combines fixtures without inheritance
|
|
166
|
+
- Each fixture has single responsibility (network, auth, logs)
|
|
167
|
+
- Tests import merged fixture and access all capabilities
|
|
168
|
+
- No coupling between fixtures—add/remove freely
|
|
169
|
+
|
|
170
|
+
### Example 3: Framework-Agnostic HTTP Helper
|
|
171
|
+
|
|
172
|
+
**Context**: When building HTTP helpers, keep them framework-agnostic. Accept all params explicitly so they work in unit tests, Playwright, Cypress, or any context.
|
|
173
|
+
|
|
174
|
+
**Implementation**:
|
|
175
|
+
|
|
176
|
+
```typescript
|
|
177
|
+
// shared/helpers/http-helper.ts
|
|
178
|
+
// Pure, framework-agnostic function
|
|
179
|
+
type HttpHelperParams = {
|
|
180
|
+
baseUrl: string;
|
|
181
|
+
endpoint: string;
|
|
182
|
+
method: 'GET' | 'POST' | 'PUT' | 'DELETE';
|
|
183
|
+
body?: unknown;
|
|
184
|
+
headers?: Record<string, string>;
|
|
185
|
+
token?: string;
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
export async function makeHttpRequest({ baseUrl, endpoint, method, body, headers = {}, token }: HttpHelperParams): Promise<unknown> {
|
|
189
|
+
const url = `${baseUrl}${endpoint}`;
|
|
190
|
+
const requestHeaders = {
|
|
191
|
+
'Content-Type': 'application/json',
|
|
192
|
+
...(token && { Authorization: `Bearer ${token}` }),
|
|
193
|
+
...headers,
|
|
194
|
+
};
|
|
195
|
+
|
|
196
|
+
const response = await fetch(url, {
|
|
197
|
+
method,
|
|
198
|
+
headers: requestHeaders,
|
|
199
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
if (!response.ok) {
|
|
203
|
+
const errorText = await response.text();
|
|
204
|
+
throw new Error(`HTTP ${method} ${url} failed: ${response.status} ${errorText}`);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
return response.json();
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// Playwright fixture wrapper
|
|
211
|
+
// playwright/support/fixtures/http-fixture.ts
|
|
212
|
+
import { test as base } from '@playwright/test';
|
|
213
|
+
import { makeHttpRequest } from '../../shared/helpers/http-helper';
|
|
214
|
+
|
|
215
|
+
export const test = base.extend({
|
|
216
|
+
httpHelper: async ({}, use) => {
|
|
217
|
+
const baseUrl = process.env.API_BASE_URL || 'http://localhost:3000';
|
|
218
|
+
|
|
219
|
+
await use((params) => makeHttpRequest({ baseUrl, ...params }));
|
|
220
|
+
},
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
// Cypress command wrapper
|
|
224
|
+
// cypress/support/commands.ts
|
|
225
|
+
import { makeHttpRequest } from '../../shared/helpers/http-helper';
|
|
226
|
+
|
|
227
|
+
Cypress.Commands.add('apiRequest', (params) => {
|
|
228
|
+
const baseUrl = Cypress.env('API_BASE_URL') || 'http://localhost:3000';
|
|
229
|
+
return cy.wrap(makeHttpRequest({ baseUrl, ...params }));
|
|
230
|
+
});
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
**Key Points**:
|
|
234
|
+
|
|
235
|
+
- Pure function uses only standard `fetch`, no framework dependencies
|
|
236
|
+
- Unit tests call `makeHttpRequest` directly with all params
|
|
237
|
+
- Playwright and Cypress wrappers inject framework-specific config
|
|
238
|
+
- Same logic runs everywhere—zero duplication
|
|
239
|
+
|
|
240
|
+
### Example 4: Fixture Cleanup Pattern
|
|
241
|
+
|
|
242
|
+
**Context**: When fixtures create resources (data, files, connections), ensure automatic cleanup in fixture teardown. Tests must not leak state.
|
|
243
|
+
|
|
244
|
+
**Implementation**:
|
|
245
|
+
|
|
246
|
+
```typescript
|
|
247
|
+
// playwright/support/fixtures/database-fixture.ts
|
|
248
|
+
import { test as base } from '@playwright/test';
|
|
249
|
+
import { seedDatabase, deleteRecord } from '../helpers/db-helpers';
|
|
250
|
+
|
|
251
|
+
type DatabaseFixture = {
|
|
252
|
+
seedUser: (userData: Partial<User>) => Promise<User>;
|
|
253
|
+
seedOrder: (orderData: Partial<Order>) => Promise<Order>;
|
|
254
|
+
};
|
|
255
|
+
|
|
256
|
+
export const test = base.extend<DatabaseFixture>({
|
|
257
|
+
seedUser: async ({}, use) => {
|
|
258
|
+
const createdUsers: string[] = [];
|
|
259
|
+
|
|
260
|
+
const seedUser = async (userData: Partial<User>) => {
|
|
261
|
+
const user = await seedDatabase('users', userData);
|
|
262
|
+
createdUsers.push(user.id);
|
|
263
|
+
return user;
|
|
264
|
+
};
|
|
265
|
+
|
|
266
|
+
await use(seedUser);
|
|
267
|
+
|
|
268
|
+
// Auto-cleanup: Delete all users created during test
|
|
269
|
+
for (const userId of createdUsers) {
|
|
270
|
+
await deleteRecord('users', userId);
|
|
271
|
+
}
|
|
272
|
+
createdUsers.length = 0;
|
|
273
|
+
},
|
|
274
|
+
|
|
275
|
+
seedOrder: async ({}, use) => {
|
|
276
|
+
const createdOrders: string[] = [];
|
|
277
|
+
|
|
278
|
+
const seedOrder = async (orderData: Partial<Order>) => {
|
|
279
|
+
const order = await seedDatabase('orders', orderData);
|
|
280
|
+
createdOrders.push(order.id);
|
|
281
|
+
return order;
|
|
282
|
+
};
|
|
283
|
+
|
|
284
|
+
await use(seedOrder);
|
|
285
|
+
|
|
286
|
+
// Auto-cleanup: Delete all orders
|
|
287
|
+
for (const orderId of createdOrders) {
|
|
288
|
+
await deleteRecord('orders', orderId);
|
|
289
|
+
}
|
|
290
|
+
createdOrders.length = 0;
|
|
291
|
+
},
|
|
292
|
+
});
|
|
293
|
+
|
|
294
|
+
// Example usage:
|
|
295
|
+
// test('user can place order', async ({ seedUser, seedOrder, page }) => {
|
|
296
|
+
// const user = await seedUser({ email: 'test@example.com' });
|
|
297
|
+
// const order = await seedOrder({ userId: user.id, total: 100 });
|
|
298
|
+
//
|
|
299
|
+
// await page.goto(`/orders/${order.id}`);
|
|
300
|
+
// await expect(page.getByText('Order Total: $100')).toBeVisible();
|
|
301
|
+
//
|
|
302
|
+
// // No manual cleanup needed—fixture handles it automatically
|
|
303
|
+
// });
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
**Key Points**:
|
|
307
|
+
|
|
308
|
+
- Track all created resources in array during test execution
|
|
309
|
+
- Teardown (after `use()`) deletes all tracked resources
|
|
310
|
+
- Tests don't manually clean up—happens automatically
|
|
311
|
+
- Prevents test pollution and flakiness from shared state
|
|
312
|
+
|
|
313
|
+
### Anti-Pattern: Inheritance-Based Page Objects
|
|
314
|
+
|
|
315
|
+
**Problem**:
|
|
316
|
+
|
|
317
|
+
```typescript
|
|
318
|
+
// ❌ BAD: Page Object Model with inheritance
|
|
319
|
+
class BasePage {
|
|
320
|
+
constructor(public page: Page) {}
|
|
321
|
+
|
|
322
|
+
async navigate(url: string) {
|
|
323
|
+
await this.page.goto(url);
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
async clickButton(selector: string) {
|
|
327
|
+
await this.page.click(selector);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
class LoginPage extends BasePage {
|
|
332
|
+
async login(email: string, password: string) {
|
|
333
|
+
await this.navigate('/login');
|
|
334
|
+
await this.page.fill('#email', email);
|
|
335
|
+
await this.page.fill('#password', password);
|
|
336
|
+
await this.clickButton('#submit');
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
class AdminPage extends LoginPage {
|
|
341
|
+
async accessAdminPanel() {
|
|
342
|
+
await this.login('admin@example.com', 'admin123');
|
|
343
|
+
await this.navigate('/admin');
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
**Why It Fails**:
|
|
349
|
+
|
|
350
|
+
- Changes to `BasePage` break all descendants (`LoginPage`, `AdminPage`)
|
|
351
|
+
- `AdminPage` inherits unnecessary `login` details—tight coupling
|
|
352
|
+
- Cannot compose capabilities (e.g., admin + reporting features require multiple inheritance)
|
|
353
|
+
- Hard to test `BasePage` methods in isolation
|
|
354
|
+
- Hidden state in class instances leads to unpredictable behavior
|
|
355
|
+
|
|
356
|
+
**Better Approach**: Use pure functions + fixtures
|
|
357
|
+
|
|
358
|
+
```typescript
|
|
359
|
+
// ✅ GOOD: Pure functions with fixture composition
|
|
360
|
+
// helpers/navigation.ts
|
|
361
|
+
export async function navigate(page: Page, url: string) {
|
|
362
|
+
await page.goto(url);
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
// helpers/auth.ts
|
|
366
|
+
export async function login(page: Page, email: string, password: string) {
|
|
367
|
+
await page.fill('[data-testid="email"]', email);
|
|
368
|
+
await page.fill('[data-testid="password"]', password);
|
|
369
|
+
await page.click('[data-testid="submit"]');
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
// fixtures/admin-fixture.ts
|
|
373
|
+
export const test = base.extend({
|
|
374
|
+
adminPage: async ({ page }, use) => {
|
|
375
|
+
await login(page, 'admin@example.com', 'admin123');
|
|
376
|
+
await navigate(page, '/admin');
|
|
377
|
+
await use(page);
|
|
378
|
+
},
|
|
379
|
+
});
|
|
380
|
+
|
|
381
|
+
// Tests import exactly what they need—no inheritance
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
## Integration Points
|
|
385
|
+
|
|
386
|
+
- **Used in workflows**: `*atdd` (test generation), `*automate` (test expansion), `*framework` (initial setup)
|
|
387
|
+
- **Related fragments**:
|
|
388
|
+
- `data-factories.md` - Factory functions for test data
|
|
389
|
+
- `network-first.md` - Network interception patterns
|
|
390
|
+
- `test-quality.md` - Deterministic test design principles
|
|
391
|
+
|
|
392
|
+
## Helper Function Reuse Guidelines
|
|
393
|
+
|
|
394
|
+
When deciding whether to create a fixture, follow these rules:
|
|
395
|
+
|
|
396
|
+
- **3+ uses** → Create fixture with subpath export (shared across tests/projects)
|
|
397
|
+
- **2-3 uses** → Create utility module (shared within project)
|
|
398
|
+
- **1 use** → Keep inline (avoid premature abstraction)
|
|
399
|
+
- **Complex logic** → Factory function pattern (dynamic data generation)
|
|
400
|
+
|
|
401
|
+
_Source: Murat Testing Philosophy (lines 74-122), SEON production patterns, Playwright fixture docs._
|