ma-agents 3.6.2 → 3.9.0
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/CONTRIBUTING.md +139 -0
- package/README.md +26 -11
- package/bin/cli.js +138 -37
- package/docs/deployment/vllm-nemotron.md +4 -2
- package/lib/.bmad-extension-plugin.build-1264-1777348888201/.claude-plugin/marketplace.json +109 -0
- package/lib/{bmad-extension → .bmad-extension-plugin.build-1264-1777348888201/skills}/module-help.csv +5 -5
- package/lib/.bmad-extension-plugin.build-1264-1777348888201/skills/module.yaml +20 -0
- package/lib/.bmad-extension-plugin.build-24696-1777348768444/.claude-plugin/marketplace.json +109 -0
- package/lib/.bmad-extension-plugin.build-24696-1777348768444/skills/module-help.csv +62 -0
- package/lib/.bmad-extension-plugin.build-24696-1777348768444/skills/module.yaml +20 -0
- package/lib/.bmad-extension-plugin.build-25428-1777348694953/.claude-plugin/marketplace.json +109 -0
- package/lib/.bmad-extension-plugin.build-25428-1777348694953/skills/module-help.csv +62 -0
- package/lib/.bmad-extension-plugin.build-25428-1777348694953/skills/module.yaml +20 -0
- package/lib/agents.js +32 -10
- package/lib/bmad-cache/bmb/.claude-plugin/marketplace.json +4 -11
- package/lib/bmad-cache/bmb/README.md +1 -1
- package/lib/bmad-cache/bmb/_git_preserved/index +0 -0
- package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-6ecd9fc6445b1281449c5ec49a6c5794708e662e.idx +0 -0
- package/lib/bmad-cache/bmb/_git_preserved/objects/pack/{pack-554778ad4e7254827618ebd2497c3f4bce9054a4.pack → pack-6ecd9fc6445b1281449c5ec49a6c5794708e662e.pack} +0 -0
- package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-6ecd9fc6445b1281449c5ec49a6c5794708e662e.rev +0 -0
- package/lib/bmad-cache/bmb/_git_preserved/packed-refs +1 -1
- package/lib/bmad-cache/bmb/_git_preserved/refs/heads/main +1 -1
- package/lib/bmad-cache/bmb/_git_preserved/refs/tags/v1.7.0 +1 -0
- package/lib/bmad-cache/bmb/_git_preserved/shallow +1 -1
- package/lib/bmad-cache/bmb/package-lock.json +2 -2
- package/lib/bmad-cache/bmb/package.json +2 -7
- package/lib/bmad-cache/bmb/skills/bmad-agent-builder/assets/customize-template.toml +62 -0
- package/lib/bmad-cache/bmb/skills/bmad-agent-builder/assets/sample-customize-analyst.toml +87 -0
- package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/assets/customize-template.toml +56 -0
- package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/assets/sample-customize-product-brief.toml +51 -0
- package/lib/bmad-cache/bmb/tools/validate-doc-links.cjs +6 -1
- package/lib/bmad-cache/bmb/website/astro.config.mjs +5 -1
- package/lib/bmad-cache/cache-manifest.json +13 -11
- package/lib/bmad-cache/cis/.claude-plugin/marketplace.json +1 -1
- package/lib/bmad-cache/cis/README.md +1 -1
- package/lib/bmad-cache/cis/_git_preserved/index +0 -0
- package/lib/bmad-cache/cis/_git_preserved/objects/pack/pack-cad8ff313ea5db860ddcc7780f03917dcba1da8d.idx +0 -0
- package/lib/bmad-cache/cis/_git_preserved/objects/pack/{pack-39c4fd66f4e0eb3f4d93665318df04cd356b0297.pack → pack-cad8ff313ea5db860ddcc7780f03917dcba1da8d.pack} +0 -0
- package/lib/bmad-cache/cis/_git_preserved/objects/pack/pack-cad8ff313ea5db860ddcc7780f03917dcba1da8d.rev +0 -0
- package/lib/bmad-cache/cis/_git_preserved/packed-refs +1 -1
- package/lib/bmad-cache/cis/_git_preserved/refs/heads/main +1 -1
- package/lib/bmad-cache/cis/_git_preserved/shallow +1 -1
- package/lib/bmad-cache/cis/package.json +1 -1
- package/lib/bmad-cache/cis/src/module.yaml +49 -0
- package/lib/bmad-cache/cis/src/skills/bmad-cis-agent-brainstorming-coach/customize.toml +38 -0
- package/lib/bmad-cache/cis/src/skills/bmad-cis-agent-creative-problem-solver/customize.toml +38 -0
- package/lib/bmad-cache/cis/src/skills/bmad-cis-agent-design-thinking-coach/customize.toml +39 -0
- package/lib/bmad-cache/cis/src/skills/bmad-cis-agent-innovation-strategist/customize.toml +38 -0
- package/lib/bmad-cache/cis/src/skills/bmad-cis-agent-presentation-master/customize.toml +73 -0
- package/lib/bmad-cache/cis/src/skills/bmad-cis-agent-storyteller/customize.toml +60 -0
- package/lib/bmad-cache/cis/src/skills/bmad-cis-design-thinking/customize.toml +41 -0
- package/lib/bmad-cache/cis/src/skills/bmad-cis-innovation-strategy/customize.toml +41 -0
- package/lib/bmad-cache/cis/src/skills/bmad-cis-problem-solving/customize.toml +42 -0
- package/lib/bmad-cache/cis/src/skills/bmad-cis-storytelling/customize.toml +41 -0
- package/lib/bmad-cache/cis/tools/build-docs.mjs +8 -0
- package/lib/bmad-cache/cis/website/astro.config.mjs +34 -4
- package/lib/bmad-cache/cis/website/src/content/config.ts +2 -1
- package/lib/bmad-cache/cis/website/src/content/i18n/zh-CN.json +28 -0
- package/lib/bmad-cache/cis/website/src/lib/locales.mjs +27 -0
- package/lib/bmad-cache/gds/.claude-plugin/marketplace.json +7 -6
- package/lib/bmad-cache/gds/README.md +5 -3
- package/lib/bmad-cache/gds/_git_preserved/index +0 -0
- package/lib/bmad-cache/gds/_git_preserved/objects/pack/pack-c1322f7c8531a89dc4f3f34c4955d194f286c1e6.idx +0 -0
- package/lib/bmad-cache/gds/_git_preserved/objects/pack/{pack-ac967149d58fba215d07238ad8881bdbdad5c9c3.pack → pack-c1322f7c8531a89dc4f3f34c4955d194f286c1e6.pack} +0 -0
- package/lib/bmad-cache/gds/_git_preserved/objects/pack/pack-c1322f7c8531a89dc4f3f34c4955d194f286c1e6.rev +0 -0
- package/lib/bmad-cache/gds/_git_preserved/packed-refs +1 -1
- package/lib/bmad-cache/gds/_git_preserved/refs/heads/main +1 -1
- package/lib/bmad-cache/gds/_git_preserved/shallow +1 -1
- package/lib/bmad-cache/gds/package.json +1 -1
- package/lib/bmad-cache/gds/src/agents/gds-agent-game-architect/customize.toml +57 -0
- package/lib/bmad-cache/gds/src/agents/gds-agent-game-designer/customize.toml +59 -0
- package/lib/bmad-cache/gds/src/agents/gds-agent-game-dev/customize.toml +129 -0
- package/lib/bmad-cache/gds/src/agents/gds-agent-game-solo-dev/customize.toml +60 -0
- package/lib/bmad-cache/gds/src/agents/gds-agent-tech-writer/customize.toml +65 -0
- package/lib/bmad-cache/gds/src/module-help.csv +4 -4
- package/lib/bmad-cache/gds/src/module.yaml +43 -1
- package/lib/bmad-cache/gds/src/workflows/1-preproduction/gds-brainstorm-game/customize.toml +41 -0
- package/lib/bmad-cache/gds/src/workflows/1-preproduction/gds-create-game-brief/customize.toml +41 -0
- package/lib/bmad-cache/gds/src/workflows/1-preproduction/research/gds-domain-research/customize.toml +41 -0
- package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-gdd/customize.toml +41 -0
- package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-narrative/customize.toml +41 -0
- package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-prd/customize.toml +41 -0
- package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-ux-design/customize.toml +41 -0
- package/lib/bmad-cache/gds/src/workflows/2-design/gds-edit-gdd/customize.toml +41 -0
- package/lib/bmad-cache/gds/src/workflows/2-design/gds-edit-prd/customize.toml +41 -0
- package/lib/bmad-cache/gds/src/workflows/2-design/gds-validate-gdd/customize.toml +41 -0
- package/lib/bmad-cache/gds/src/workflows/2-design/gds-validate-gdd/data/genre-complexity.csv +26 -0
- package/lib/bmad-cache/gds/src/workflows/2-design/gds-validate-prd/customize.toml +41 -0
- package/lib/bmad-cache/gds/src/workflows/2-design/gds-validate-prd/data/domain-complexity.csv +15 -0
- package/lib/bmad-cache/gds/src/workflows/2-design/gds-validate-prd/data/project-types.csv +11 -0
- package/lib/bmad-cache/gds/src/workflows/3-technical/gds-check-implementation-readiness/customize.toml +41 -0
- package/lib/bmad-cache/gds/src/workflows/3-technical/gds-create-epics-and-stories/customize.toml +41 -0
- package/lib/bmad-cache/gds/src/workflows/3-technical/gds-game-architecture/customize.toml +41 -0
- package/lib/bmad-cache/gds/src/workflows/3-technical/gds-generate-project-context/customize.toml +41 -0
- package/lib/bmad-cache/gds/src/workflows/4-production/gds-code-review/customize.toml +41 -0
- package/lib/bmad-cache/gds/src/workflows/4-production/gds-correct-course/customize.toml +41 -0
- package/lib/bmad-cache/gds/src/workflows/4-production/gds-create-story/customize.toml +41 -0
- package/lib/bmad-cache/gds/src/workflows/4-production/gds-dev-story/customize.toml +41 -0
- package/lib/bmad-cache/gds/src/workflows/4-production/gds-retrospective/customize.toml +41 -0
- package/lib/bmad-cache/gds/src/workflows/4-production/gds-sprint-planning/customize.toml +41 -0
- package/lib/bmad-cache/gds/src/workflows/4-production/gds-sprint-status/customize.toml +41 -0
- package/lib/bmad-cache/gds/src/workflows/gametest/gds-e2e-scaffold/customize.toml +41 -0
- package/lib/bmad-cache/gds/src/workflows/gametest/gds-performance-test/customize.toml +41 -0
- package/lib/bmad-cache/gds/src/workflows/gametest/gds-playtest-plan/customize.toml +41 -0
- package/lib/bmad-cache/gds/src/workflows/gametest/gds-test-automate/customize.toml +41 -0
- package/lib/bmad-cache/gds/src/workflows/gametest/gds-test-design/customize.toml +41 -0
- package/lib/bmad-cache/gds/src/workflows/gametest/gds-test-framework/customize.toml +41 -0
- package/lib/bmad-cache/gds/src/workflows/gametest/gds-test-review/customize.toml +41 -0
- package/lib/bmad-cache/gds/src/workflows/gds-document-project/customize.toml +41 -0
- package/lib/bmad-cache/gds/src/workflows/gds-quick-flow/gds-quick-dev/customize.toml +41 -0
- package/lib/bmad-cache/tea/.claude-plugin/marketplace.json +1 -1
- package/lib/bmad-cache/tea/.github/CODE_OF_CONDUCT.md +128 -0
- package/lib/bmad-cache/tea/.github/FUNDING.yaml +15 -0
- package/lib/bmad-cache/tea/.github/ISSUE_TEMPLATE/config.yaml +11 -0
- package/lib/bmad-cache/tea/.github/ISSUE_TEMPLATE/feature_request.md +70 -0
- package/lib/bmad-cache/tea/.github/ISSUE_TEMPLATE/issue.md +61 -0
- package/lib/bmad-cache/tea/.github/workflows/docs.yaml +66 -0
- package/lib/bmad-cache/tea/.github/workflows/manual-release.yaml +216 -0
- package/lib/bmad-cache/tea/.github/workflows/quality.yaml +117 -0
- package/lib/bmad-cache/tea/.vscode/settings.json +47 -0
- package/lib/bmad-cache/tea/README.md +63 -55
- package/lib/bmad-cache/tea/_git_preserved/index +0 -0
- package/lib/bmad-cache/tea/_git_preserved/objects/pack/pack-9b16db8eb5022c18cef1f0a27d63b6e0f4bc2b2a.idx +0 -0
- package/lib/bmad-cache/tea/_git_preserved/objects/pack/{pack-e75385cd52b693dbb8a3b2afb50058952543b3a2.pack → pack-9b16db8eb5022c18cef1f0a27d63b6e0f4bc2b2a.pack} +0 -0
- package/lib/bmad-cache/tea/_git_preserved/objects/pack/pack-9b16db8eb5022c18cef1f0a27d63b6e0f4bc2b2a.rev +0 -0
- package/lib/bmad-cache/tea/_git_preserved/packed-refs +1 -1
- package/lib/bmad-cache/tea/_git_preserved/refs/heads/main +1 -1
- package/lib/bmad-cache/tea/_git_preserved/shallow +1 -1
- package/lib/bmad-cache/tea/docs/explanation/engagement-models.md +1 -1
- package/lib/bmad-cache/tea/docs/explanation/tea-overview.md +1 -1
- package/lib/bmad-cache/tea/docs/glossary/index.md +1 -1
- package/lib/bmad-cache/tea/docs/how-to/customization/extend-tea-with-custom-workflows.md +29 -0
- package/lib/bmad-cache/tea/docs/how-to/workflows/run-trace.md +27 -20
- package/lib/bmad-cache/tea/docs/how-to/workflows/teach-me-testing.md +2 -2
- package/lib/bmad-cache/tea/docs/reference/commands.md +3 -3
- package/lib/bmad-cache/tea/docs/reference/troubleshooting.md +36 -0
- package/lib/bmad-cache/tea/docs/tutorials/learn-testing-tea-academy.md +1 -1
- package/lib/bmad-cache/tea/package-lock.json +2 -2
- package/lib/bmad-cache/tea/package.json +3 -3
- package/lib/bmad-cache/tea/src/agents/bmad-tea/SKILL.md +54 -44
- package/lib/bmad-cache/tea/src/agents/bmad-tea/customize.toml +104 -0
- package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/contract-testing.md +32 -15
- package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/pact-broker-webhooks.md +237 -0
- package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/pact-consumer-framework-setup.md +134 -12
- package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/pact-mcp.md +1 -0
- package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/pactjs-utils-consumer-helpers.md +111 -1
- package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/pactjs-utils-overview.md +15 -12
- package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/pactjs-utils-provider-verifier.md +83 -1
- package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/pactjs-utils-zod-to-pact.md +262 -0
- package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/webhook-module-setup.md +122 -0
- package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/webhook-providers.md +155 -0
- package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/webhook-risk-guidance.md +114 -0
- package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/webhook-template-matchers.md +160 -0
- package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/webhook-testing-fundamentals.md +42 -0
- package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/webhook-timeout-error.md +130 -0
- package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/webhook-waiting-querying.md +167 -0
- package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/tea-index.csv +13 -4
- package/lib/bmad-cache/tea/src/module.yaml +8 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/README.md +5 -3
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/SKILL.md +124 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/checklist.md +3 -2
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/customize.toml +40 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/instructions.md +7 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/steps-c/step-01-init.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/steps-c/step-01b-continue.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/steps-c/step-02-assess.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/steps-c/step-04-session-01.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/steps-c/step-04-session-02.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/steps-c/step-04-session-03.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/steps-c/step-04-session-04.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/steps-c/step-04-session-05.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/steps-c/step-04-session-06.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/steps-c/step-04-session-07.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/steps-c/step-05-completion.md +8 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/steps-e/step-e-01-assess-workflow.md +2 -2
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/steps-e/step-e-02-apply-edits.md +9 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/steps-v/step-v-01-validate.md +12 -3
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/SKILL.md +80 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/customize.toml +40 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/instructions.md +2 -2
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/contract-testing.md +32 -15
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/pact-broker-webhooks.md +237 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/pact-consumer-framework-setup.md +134 -12
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/pact-mcp.md +1 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/pactjs-utils-consumer-helpers.md +111 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/pactjs-utils-overview.md +15 -12
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/pactjs-utils-provider-verifier.md +83 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/pactjs-utils-zod-to-pact.md +262 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/webhook-module-setup.md +122 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/webhook-providers.md +155 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/webhook-risk-guidance.md +114 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/webhook-template-matchers.md +160 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/webhook-testing-fundamentals.md +42 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/webhook-timeout-error.md +130 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/knowledge/webhook-waiting-querying.md +167 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/tea-index.csv +13 -4
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/steps-c/step-01-preflight-and-context.md +3 -3
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/steps-c/step-02-generation-mode.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/steps-c/step-03-test-strategy.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/steps-c/step-04-generate-tests.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/steps-c/step-04a-subagent-api-failing.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/steps-c/step-04c-aggregate.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/steps-c/step-05-validate-and-complete.md +8 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/steps-e/step-01-assess.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/steps-e/step-02-apply-edit.md +8 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/steps-v/step-01-validate.md +9 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/SKILL.md +80 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/customize.toml +40 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/instructions.md +2 -2
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/contract-testing.md +18 -2
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/pact-broker-webhooks.md +237 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/pact-consumer-framework-setup.md +134 -12
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/pact-mcp.md +1 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/pactjs-utils-consumer-helpers.md +111 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/pactjs-utils-provider-verifier.md +83 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/webhook-module-setup.md +122 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/webhook-providers.md +155 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/webhook-risk-guidance.md +114 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/webhook-template-matchers.md +160 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/webhook-testing-fundamentals.md +42 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/webhook-timeout-error.md +130 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/knowledge/webhook-waiting-querying.md +167 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/tea-index.csv +12 -4
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/steps-c/step-01-preflight-and-context.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/steps-c/step-02-identify-targets.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/steps-c/step-03-generate-tests.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/steps-c/step-03a-subagent-api.md +9 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/steps-c/step-03c-aggregate.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/steps-c/step-04-validate-and-summarize.md +8 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/steps-e/step-01-assess.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/steps-e/step-02-apply-edit.md +8 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/steps-v/step-01-validate.md +9 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/SKILL.md +80 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/customize.toml +40 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/instructions.md +2 -2
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/contract-testing.md +18 -2
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/pact-broker-webhooks.md +237 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/pact-consumer-framework-setup.md +134 -12
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/pact-mcp.md +1 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/pactjs-utils-consumer-helpers.md +111 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/pactjs-utils-provider-verifier.md +83 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/webhook-module-setup.md +122 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/webhook-providers.md +155 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/webhook-risk-guidance.md +114 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/webhook-template-matchers.md +160 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/webhook-testing-fundamentals.md +42 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/webhook-timeout-error.md +130 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/knowledge/webhook-waiting-querying.md +167 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/tea-index.csv +12 -4
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/steps-c/step-01-preflight.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/steps-c/step-02-generate-pipeline.md +15 -7
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/steps-c/step-03-configure-quality-gates.md +7 -2
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/steps-c/step-04-validate-and-summary.md +8 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/steps-e/step-01-assess.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/steps-e/step-02-apply-edit.md +8 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/steps-v/step-01-validate.md +9 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/SKILL.md +80 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/customize.toml +40 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/instructions.md +2 -2
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/contract-testing.md +18 -2
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/pact-broker-webhooks.md +237 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/pact-consumer-framework-setup.md +134 -12
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/pact-mcp.md +1 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/pactjs-utils-consumer-helpers.md +111 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/pactjs-utils-provider-verifier.md +83 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/webhook-module-setup.md +122 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/webhook-providers.md +155 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/webhook-risk-guidance.md +114 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/webhook-template-matchers.md +160 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/webhook-testing-fundamentals.md +42 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/webhook-timeout-error.md +130 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/knowledge/webhook-waiting-querying.md +167 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/tea-index.csv +12 -4
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/steps-c/step-01-preflight.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/steps-c/step-02-select-framework.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/steps-c/step-03-scaffold-framework.md +11 -7
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/steps-c/step-04-docs-and-scripts.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/steps-c/step-05-validate-and-summary.md +8 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/steps-e/step-01-assess.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/steps-e/step-02-apply-edit.md +8 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/steps-v/step-01-validate.md +9 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/SKILL.md +80 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/customize.toml +40 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/instructions.md +2 -2
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/contract-testing.md +18 -2
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/pact-broker-webhooks.md +237 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/pact-consumer-framework-setup.md +134 -12
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/pact-mcp.md +1 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/pactjs-utils-consumer-helpers.md +111 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/pactjs-utils-provider-verifier.md +83 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/webhook-module-setup.md +122 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/webhook-providers.md +155 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/webhook-risk-guidance.md +114 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/webhook-template-matchers.md +160 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/webhook-testing-fundamentals.md +42 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/webhook-timeout-error.md +130 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/knowledge/webhook-waiting-querying.md +167 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/tea-index.csv +12 -4
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-01-load-context.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-02-define-thresholds.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-03-gather-evidence.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-04-evaluate-and-score.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-04e-aggregate-nfr.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-05-generate-report.md +8 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-e/step-01-assess.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-e/step-02-apply-edit.md +8 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-v/step-01-validate.md +9 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/SKILL.md +82 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/customize.toml +40 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/instructions.md +2 -2
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/contract-testing.md +18 -2
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/pact-broker-webhooks.md +237 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/pact-consumer-framework-setup.md +134 -12
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/pact-mcp.md +1 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/pactjs-utils-consumer-helpers.md +111 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/pactjs-utils-provider-verifier.md +83 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/webhook-module-setup.md +122 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/webhook-providers.md +155 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/webhook-risk-guidance.md +114 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/webhook-template-matchers.md +160 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/webhook-testing-fundamentals.md +42 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/webhook-timeout-error.md +130 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/knowledge/webhook-waiting-querying.md +167 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/tea-index.csv +12 -4
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/steps-c/step-01-detect-mode.md +7 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/steps-c/step-01b-resume.md +29 -15
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/steps-c/step-02-load-context.md +7 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/steps-c/step-03-risk-and-testability.md +7 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/steps-c/step-04-coverage-plan.md +7 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/steps-c/step-05-generate-output.md +14 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/steps-e/step-01-assess.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/steps-e/step-02-apply-edit.md +8 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/steps-v/step-01-validate.md +9 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/test-design-architecture-template.md +3 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/test-design-qa-template.md +3 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/test-design-template.md +3 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/SKILL.md +80 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/customize.toml +40 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/instructions.md +2 -2
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/contract-testing.md +18 -2
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/pact-broker-webhooks.md +237 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/pact-consumer-framework-setup.md +134 -12
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/pact-mcp.md +1 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/pactjs-utils-consumer-helpers.md +111 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/pactjs-utils-provider-verifier.md +83 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/webhook-module-setup.md +122 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/webhook-providers.md +155 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/webhook-risk-guidance.md +114 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/webhook-template-matchers.md +160 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/webhook-testing-fundamentals.md +42 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/webhook-timeout-error.md +130 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/knowledge/webhook-waiting-querying.md +167 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/tea-index.csv +12 -4
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/steps-c/step-01-load-context.md +3 -3
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/steps-c/step-02-discover-tests.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/steps-c/step-03-quality-evaluation.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/steps-c/step-03a-subagent-determinism.md +43 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/steps-c/step-03f-aggregate-scores.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/steps-c/step-04-generate-report.md +8 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/steps-e/step-01-assess.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/steps-e/step-02-apply-edit.md +8 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/steps-v/step-01-validate.md +9 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/SKILL.md +82 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/checklist.md +42 -18
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/customize.toml +40 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/instructions.md +6 -4
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/contract-testing.md +18 -2
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/pact-broker-webhooks.md +237 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/pact-consumer-framework-setup.md +134 -12
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/pact-mcp.md +1 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/pactjs-utils-consumer-helpers.md +111 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/pactjs-utils-provider-verifier.md +83 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/webhook-module-setup.md +122 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/webhook-providers.md +155 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/webhook-risk-guidance.md +114 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/webhook-template-matchers.md +160 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/webhook-testing-fundamentals.md +42 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/webhook-timeout-error.md +130 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/knowledge/webhook-waiting-querying.md +167 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/tea-index.csv +12 -4
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/steps-c/step-01-load-context.md +74 -13
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/steps-c/step-01b-resume.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/steps-c/step-02-discover-tests.md +24 -4
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/steps-c/step-03-map-criteria.md +15 -11
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/steps-c/step-04-analyze-gaps.md +210 -3
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/steps-c/step-05-gate-decision.md +477 -62
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/steps-e/step-01-assess.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/steps-e/step-02-apply-edit.md +8 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/steps-v/step-01-validate.md +9 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/trace-template.md +10 -2
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/workflow-plan.md +14 -11
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/workflow.yaml +24 -0
- package/lib/bmad-cache/tea/test/test-installation-components.js +210 -66
- package/lib/bmad-cache/tea/test/test-knowledge-base.js +6 -1
- package/lib/bmad-cache/tea/test/test-release-metadata.js +71 -0
- package/lib/bmad-cache/tea/tools/validate-agent-schema.js +73 -0
- package/lib/bmad-customize/bmm-qa.customize.yaml +1 -1
- package/lib/bmad-extension/.claude-plugin/marketplace.json.template +117 -0
- package/lib/bmad-extension/skills/add-sprint/SKILL.md +39 -0
- package/lib/bmad-extension/skills/add-to-sprint/SKILL.md +39 -0
- package/lib/bmad-extension/skills/bmad-dev-story/workflow.md +39 -0
- package/lib/bmad-extension/skills/bmad-sprint-planning/workflow.md +41 -0
- package/lib/bmad-extension/skills/bmad-sprint-status/workflow.md +39 -0
- package/lib/bmad-extension/skills/cleanup-done/SKILL.md +39 -0
- package/lib/bmad-extension/skills/close-sprint/SKILL.md +39 -0
- package/lib/bmad-extension/skills/generate-backlog/SKILL.md +41 -0
- package/lib/bmad-extension/skills/ma-agent-cyber/.gitkeep +0 -0
- package/lib/bmad-extension/skills/ma-agent-cyber/SKILL.md +49 -0
- package/lib/bmad-extension/skills/ma-agent-cyber/bmad-skill-manifest.yaml +11 -0
- package/lib/bmad-extension/skills/ma-agent-devops/.gitkeep +0 -0
- package/lib/bmad-extension/skills/ma-agent-devops/SKILL.md +49 -0
- package/lib/bmad-extension/skills/ma-agent-devops/bmad-skill-manifest.yaml +11 -0
- package/lib/bmad-extension/skills/ma-agent-ml/.gitkeep +0 -0
- package/lib/bmad-extension/skills/ma-agent-ml/SKILL.md +59 -0
- package/lib/bmad-extension/skills/ma-agent-ml/bmad-skill-manifest.yaml +11 -0
- package/lib/bmad-extension/skills/ma-agent-sqa/.gitkeep +0 -0
- package/lib/bmad-extension/skills/ma-agent-sqa/SKILL.md +59 -0
- package/lib/bmad-extension/skills/ma-agent-sqa/bmad-skill-manifest.yaml +11 -0
- package/lib/bmad-extension/skills/ma-agent-sre/.gitkeep +0 -0
- package/lib/bmad-extension/skills/ma-agent-sre/SKILL.md +49 -0
- package/lib/bmad-extension/skills/ma-agent-sre/bmad-skill-manifest.yaml +11 -0
- package/lib/bmad-extension/skills/modify-sprint/SKILL.md +39 -0
- package/lib/bmad-extension/skills/module-help.csv +62 -0
- package/lib/bmad-extension/skills/module.yaml +20 -0
- package/lib/bmad-extension/skills/prioritize-backlog/SKILL.md +39 -0
- package/lib/bmad-extension/skills/remove-from-sprint/SKILL.md +39 -0
- package/lib/bmad-extension/skills/sprint-status-view/SKILL.md +39 -0
- package/lib/bmad-extension-plugin/.claude-plugin/marketplace.json +109 -0
- package/lib/bmad-extension-plugin/skills/add-sprint/SKILL.md +214 -0
- package/lib/bmad-extension-plugin/skills/add-sprint/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension-plugin/skills/add-to-sprint/SKILL.md +282 -0
- package/lib/bmad-extension-plugin/skills/add-to-sprint/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension-plugin/skills/bmad-dev-story/SKILL.md +6 -0
- package/lib/bmad-extension-plugin/skills/bmad-dev-story/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension-plugin/skills/bmad-dev-story/checklist.md +80 -0
- package/lib/bmad-extension-plugin/skills/bmad-dev-story/workflow.md +548 -0
- package/lib/bmad-extension-plugin/skills/bmad-sprint-planning/SKILL.md +6 -0
- package/lib/bmad-extension-plugin/skills/bmad-sprint-planning/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension-plugin/skills/bmad-sprint-planning/checklist.md +74 -0
- package/lib/bmad-extension-plugin/skills/bmad-sprint-planning/sprint-status-template.yaml +89 -0
- package/lib/bmad-extension-plugin/skills/bmad-sprint-planning/workflow.md +413 -0
- package/lib/bmad-extension-plugin/skills/bmad-sprint-status/SKILL.md +6 -0
- package/lib/bmad-extension-plugin/skills/bmad-sprint-status/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension-plugin/skills/bmad-sprint-status/workflow.md +473 -0
- package/lib/bmad-extension-plugin/skills/cleanup-done/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/cleanup-done/SKILL.md +254 -0
- package/lib/bmad-extension-plugin/skills/cleanup-done/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension-plugin/skills/close-sprint/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/close-sprint/SKILL.md +418 -0
- package/lib/bmad-extension-plugin/skills/close-sprint/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension-plugin/skills/create-bug-story/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/create-bug-story/SKILL.md +195 -0
- package/lib/bmad-extension-plugin/skills/create-bug-story/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension-plugin/skills/cyber-generate-certs/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/cyber-generate-certs/SKILL.md +27 -0
- package/lib/bmad-extension-plugin/skills/cyber-generate-certs/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension-plugin/skills/cyber-immunity-estimation/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/cyber-immunity-estimation/SKILL.md +29 -0
- package/lib/bmad-extension-plugin/skills/cyber-immunity-estimation/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension-plugin/skills/cyber-security-audit/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/cyber-security-audit/SKILL.md +27 -0
- package/lib/bmad-extension-plugin/skills/cyber-security-audit/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension-plugin/skills/cyber-vault-secrets/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/cyber-vault-secrets/SKILL.md +28 -0
- package/lib/bmad-extension-plugin/skills/cyber-vault-secrets/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension-plugin/skills/cyber-verify-docker-users/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/cyber-verify-docker-users/SKILL.md +23 -0
- package/lib/bmad-extension-plugin/skills/cyber-verify-docker-users/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension-plugin/skills/cyber-verify-image-signature/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/cyber-verify-image-signature/SKILL.md +22 -0
- package/lib/bmad-extension-plugin/skills/cyber-verify-image-signature/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension-plugin/skills/cyber-vulnerability-scan/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/cyber-vulnerability-scan/SKILL.md +28 -0
- package/lib/bmad-extension-plugin/skills/cyber-vulnerability-scan/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension-plugin/skills/devops-configure-infrastructure/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/devops-configure-infrastructure/SKILL.md +27 -0
- package/lib/bmad-extension-plugin/skills/devops-configure-infrastructure/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension-plugin/skills/devops-disconnected-deployment/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/devops-disconnected-deployment/SKILL.md +27 -0
- package/lib/bmad-extension-plugin/skills/devops-disconnected-deployment/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension-plugin/skills/devops-docker-compose-setup/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/devops-docker-compose-setup/SKILL.md +26 -0
- package/lib/bmad-extension-plugin/skills/devops-docker-compose-setup/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension-plugin/skills/devops-manage-helm/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/devops-manage-helm/SKILL.md +28 -0
- package/lib/bmad-extension-plugin/skills/devops-manage-helm/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension-plugin/skills/devops-sign-docker-image/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/devops-sign-docker-image/SKILL.md +24 -0
- package/lib/bmad-extension-plugin/skills/devops-sign-docker-image/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension-plugin/skills/generate-backlog/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/generate-backlog/SKILL.md +236 -0
- package/lib/bmad-extension-plugin/skills/generate-backlog/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension-plugin/skills/ma-agent-cyber/.gitkeep +0 -0
- package/lib/{bmad-extension/skills/bmad-ma-agent-cyber → bmad-extension-plugin/skills/ma-agent-cyber}/SKILL.md +1 -1
- package/lib/{bmad-extension/skills/bmad-ma-agent-cyber → bmad-extension-plugin/skills/ma-agent-cyber}/bmad-skill-manifest.yaml +1 -1
- package/lib/bmad-extension-plugin/skills/ma-agent-devops/.gitkeep +0 -0
- package/lib/{bmad-extension/skills/bmad-ma-agent-devops → bmad-extension-plugin/skills/ma-agent-devops}/SKILL.md +1 -1
- package/lib/{bmad-extension/skills/bmad-ma-agent-devops → bmad-extension-plugin/skills/ma-agent-devops}/bmad-skill-manifest.yaml +1 -1
- package/lib/bmad-extension-plugin/skills/ma-agent-ml/.gitkeep +0 -0
- package/lib/{bmad-extension/skills/bmad-ma-agent-ml → bmad-extension-plugin/skills/ma-agent-ml}/SKILL.md +1 -1
- package/lib/{bmad-extension/skills/bmad-ma-agent-ml → bmad-extension-plugin/skills/ma-agent-ml}/bmad-skill-manifest.yaml +1 -1
- package/lib/bmad-extension-plugin/skills/ma-agent-sqa/.gitkeep +0 -0
- package/lib/{bmad-extension/skills/bmad-ma-agent-sqa → bmad-extension-plugin/skills/ma-agent-sqa}/SKILL.md +1 -1
- package/lib/{bmad-extension/skills/bmad-ma-agent-sqa → bmad-extension-plugin/skills/ma-agent-sqa}/bmad-skill-manifest.yaml +1 -1
- package/lib/bmad-extension-plugin/skills/ma-agent-sre/.gitkeep +0 -0
- package/lib/{bmad-extension/skills/bmad-ma-agent-sre → bmad-extension-plugin/skills/ma-agent-sre}/SKILL.md +1 -1
- package/lib/{bmad-extension/skills/bmad-ma-agent-sre → bmad-extension-plugin/skills/ma-agent-sre}/bmad-skill-manifest.yaml +1 -1
- package/lib/bmad-extension-plugin/skills/mil498-ocd/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/mil498-ocd/SKILL.md +30 -0
- package/lib/bmad-extension-plugin/skills/mil498-ocd/bmad-skill-manifest.yaml +5 -0
- package/lib/bmad-extension-plugin/skills/mil498-ocd/prompts/01-discover-project-artifacts.md +26 -0
- package/lib/bmad-extension-plugin/skills/mil498-ocd/prompts/02-load-template.md +10 -0
- package/lib/bmad-extension-plugin/skills/mil498-ocd/prompts/03-generate-document.md +90 -0
- package/lib/bmad-extension-plugin/skills/mil498-ocd/prompts/04-validate.md +14 -0
- package/lib/bmad-extension-plugin/skills/mil498-ocd/prompts/05-review.md +15 -0
- package/lib/bmad-extension-plugin/skills/mil498-ocd/prompts/06-save.md +15 -0
- package/lib/bmad-extension-plugin/skills/mil498-ocd/template.md +169 -0
- package/lib/bmad-extension-plugin/skills/mil498-requirement-quality/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/mil498-requirement-quality/SKILL.md +105 -0
- package/lib/bmad-extension-plugin/skills/mil498-requirement-quality/bmad-skill-manifest.yaml +5 -0
- package/lib/bmad-extension-plugin/skills/mil498-sdd/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/mil498-sdd/SKILL.md +30 -0
- package/lib/bmad-extension-plugin/skills/mil498-sdd/bmad-skill-manifest.yaml +5 -0
- package/lib/bmad-extension-plugin/skills/mil498-sdd/prompts/01-discover-project-artifacts.md +50 -0
- package/lib/bmad-extension-plugin/skills/mil498-sdd/prompts/02-load-template.md +10 -0
- package/lib/bmad-extension-plugin/skills/mil498-sdd/prompts/03-generate-document.md +98 -0
- package/lib/bmad-extension-plugin/skills/mil498-sdd/prompts/04-validate.md +16 -0
- package/lib/bmad-extension-plugin/skills/mil498-sdd/prompts/05-review.md +15 -0
- package/lib/bmad-extension-plugin/skills/mil498-sdd/prompts/06-save.md +19 -0
- package/lib/bmad-extension-plugin/skills/mil498-sdd/template.md +163 -0
- package/lib/bmad-extension-plugin/skills/mil498-sdp/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/mil498-sdp/SKILL.md +30 -0
- package/lib/bmad-extension-plugin/skills/mil498-sdp/bmad-skill-manifest.yaml +5 -0
- package/lib/bmad-extension-plugin/skills/mil498-sdp/prompts/01-discover-project-artifacts.md +32 -0
- package/lib/bmad-extension-plugin/skills/mil498-sdp/prompts/02-load-template.md +10 -0
- package/lib/bmad-extension-plugin/skills/mil498-sdp/prompts/03-generate-document.md +187 -0
- package/lib/bmad-extension-plugin/skills/mil498-sdp/prompts/04-validate.md +13 -0
- package/lib/bmad-extension-plugin/skills/mil498-sdp/prompts/05-review.md +15 -0
- package/lib/bmad-extension-plugin/skills/mil498-sdp/prompts/06-save.md +14 -0
- package/lib/bmad-extension-plugin/skills/mil498-sdp/template.md +307 -0
- package/lib/bmad-extension-plugin/skills/mil498-srs/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/mil498-srs/SKILL.md +30 -0
- package/lib/bmad-extension-plugin/skills/mil498-srs/bmad-skill-manifest.yaml +5 -0
- package/lib/bmad-extension-plugin/skills/mil498-srs/prompts/01-discover-project-artifacts.md +42 -0
- package/lib/bmad-extension-plugin/skills/mil498-srs/prompts/02-load-template.md +10 -0
- package/lib/bmad-extension-plugin/skills/mil498-srs/prompts/03-generate-document.md +100 -0
- package/lib/bmad-extension-plugin/skills/mil498-srs/prompts/04-validate.md +16 -0
- package/lib/bmad-extension-plugin/skills/mil498-srs/prompts/05-review.md +15 -0
- package/lib/bmad-extension-plugin/skills/mil498-srs/prompts/06-save.md +18 -0
- package/lib/bmad-extension-plugin/skills/mil498-srs/template.md +219 -0
- package/lib/bmad-extension-plugin/skills/mil498-ssdd/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/mil498-ssdd/SKILL.md +32 -0
- package/lib/bmad-extension-plugin/skills/mil498-ssdd/bmad-skill-manifest.yaml +5 -0
- package/lib/bmad-extension-plugin/skills/mil498-ssdd/prompts/01-discover-project-artifacts.md +32 -0
- package/lib/bmad-extension-plugin/skills/mil498-ssdd/prompts/02-load-template.md +10 -0
- package/lib/bmad-extension-plugin/skills/mil498-ssdd/prompts/03-csci-discovery-interview.md +43 -0
- package/lib/bmad-extension-plugin/skills/mil498-ssdd/prompts/04-generate-document.md +96 -0
- package/lib/bmad-extension-plugin/skills/mil498-ssdd/prompts/05-validate.md +18 -0
- package/lib/bmad-extension-plugin/skills/mil498-ssdd/prompts/06-review.md +16 -0
- package/lib/bmad-extension-plugin/skills/mil498-ssdd/prompts/07-save.md +16 -0
- package/lib/bmad-extension-plugin/skills/mil498-ssdd/template.md +154 -0
- package/lib/bmad-extension-plugin/skills/mil498-sss/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/mil498-sss/SKILL.md +31 -0
- package/lib/bmad-extension-plugin/skills/mil498-sss/bmad-skill-manifest.yaml +5 -0
- package/lib/bmad-extension-plugin/skills/mil498-sss/prompts/01-discover-project-artifacts.md +31 -0
- package/lib/bmad-extension-plugin/skills/mil498-sss/prompts/02-load-template.md +10 -0
- package/lib/bmad-extension-plugin/skills/mil498-sss/prompts/03-generate-document.md +108 -0
- package/lib/bmad-extension-plugin/skills/mil498-sss/prompts/04-validate.md +16 -0
- package/lib/bmad-extension-plugin/skills/mil498-sss/prompts/05-review.md +15 -0
- package/lib/bmad-extension-plugin/skills/mil498-sss/prompts/06-save.md +15 -0
- package/lib/bmad-extension-plugin/skills/mil498-sss/template.md +225 -0
- package/lib/bmad-extension-plugin/skills/mil498-std/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/mil498-std/SKILL.md +30 -0
- package/lib/bmad-extension-plugin/skills/mil498-std/bmad-skill-manifest.yaml +5 -0
- package/lib/bmad-extension-plugin/skills/mil498-std/prompts/01-discover-project-artifacts.md +42 -0
- package/lib/bmad-extension-plugin/skills/mil498-std/prompts/02-load-template.md +10 -0
- package/lib/bmad-extension-plugin/skills/mil498-std/prompts/03-generate-document.md +117 -0
- package/lib/bmad-extension-plugin/skills/mil498-std/prompts/04-validate.md +15 -0
- package/lib/bmad-extension-plugin/skills/mil498-std/prompts/05-review.md +15 -0
- package/lib/bmad-extension-plugin/skills/mil498-std/prompts/06-save.md +15 -0
- package/lib/bmad-extension-plugin/skills/mil498-std/template.md +188 -0
- package/lib/bmad-extension-plugin/skills/ml-advise/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/ml-advise/SKILL.md +76 -0
- package/lib/bmad-extension-plugin/skills/ml-advise/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension-plugin/skills/ml-advise/skill.json +7 -0
- package/lib/bmad-extension-plugin/skills/ml-analysis/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/ml-analysis/SKILL.md +60 -0
- package/lib/bmad-extension-plugin/skills/ml-analysis/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension-plugin/skills/ml-analysis/skill.json +7 -0
- package/lib/bmad-extension-plugin/skills/ml-architecture/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/ml-architecture/SKILL.md +55 -0
- package/lib/bmad-extension-plugin/skills/ml-architecture/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension-plugin/skills/ml-architecture/skill.json +7 -0
- package/lib/bmad-extension-plugin/skills/ml-detailed-design/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/ml-detailed-design/SKILL.md +67 -0
- package/lib/bmad-extension-plugin/skills/ml-detailed-design/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension-plugin/skills/ml-detailed-design/skill.json +7 -0
- package/lib/bmad-extension-plugin/skills/ml-eda/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/ml-eda/SKILL.md +56 -0
- package/lib/bmad-extension-plugin/skills/ml-eda/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension-plugin/skills/ml-eda/scripts/baseline_classifier.py +522 -0
- package/lib/bmad-extension-plugin/skills/ml-eda/scripts/class_weights_calculator.py +295 -0
- package/lib/bmad-extension-plugin/skills/ml-eda/scripts/clustering_explorer.py +383 -0
- package/lib/bmad-extension-plugin/skills/ml-eda/scripts/eda_analyzer.py +654 -0
- package/lib/bmad-extension-plugin/skills/ml-eda/skill.json +7 -0
- package/lib/bmad-extension-plugin/skills/ml-experiment/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/ml-experiment/SKILL.md +74 -0
- package/lib/bmad-extension-plugin/skills/ml-experiment/assets/advanced_trainer_configs.py +430 -0
- package/lib/bmad-extension-plugin/skills/ml-experiment/assets/quick_trainer_setup.py +233 -0
- package/lib/bmad-extension-plugin/skills/ml-experiment/assets/template_datamodule.py +219 -0
- package/lib/bmad-extension-plugin/skills/ml-experiment/assets/template_gnn_module.py +341 -0
- package/lib/bmad-extension-plugin/skills/ml-experiment/assets/template_lightning_module.py +158 -0
- package/lib/bmad-extension-plugin/skills/ml-experiment/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension-plugin/skills/ml-experiment/skill.json +7 -0
- package/lib/bmad-extension-plugin/skills/ml-hparam/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/ml-hparam/SKILL.md +81 -0
- package/lib/bmad-extension-plugin/skills/ml-hparam/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension-plugin/skills/ml-hparam/skill.json +7 -0
- package/lib/bmad-extension-plugin/skills/ml-ideation/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/ml-ideation/SKILL.md +50 -0
- package/lib/bmad-extension-plugin/skills/ml-ideation/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension-plugin/skills/ml-ideation/scripts/validate_ml_prd.py +287 -0
- package/lib/bmad-extension-plugin/skills/ml-ideation/skill.json +7 -0
- package/lib/bmad-extension-plugin/skills/ml-infra/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/ml-infra/SKILL.md +58 -0
- package/lib/bmad-extension-plugin/skills/ml-infra/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension-plugin/skills/ml-infra/skill.json +7 -0
- package/lib/bmad-extension-plugin/skills/ml-retrospective/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/ml-retrospective/SKILL.md +63 -0
- package/lib/bmad-extension-plugin/skills/ml-retrospective/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension-plugin/skills/ml-retrospective/skill.json +7 -0
- package/lib/bmad-extension-plugin/skills/ml-revision/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/ml-revision/SKILL.md +82 -0
- package/lib/bmad-extension-plugin/skills/ml-revision/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension-plugin/skills/ml-revision/skill.json +7 -0
- package/lib/bmad-extension-plugin/skills/ml-techspec/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/ml-techspec/SKILL.md +80 -0
- package/lib/bmad-extension-plugin/skills/ml-techspec/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension-plugin/skills/ml-techspec/skill.json +7 -0
- package/lib/bmad-extension-plugin/skills/modify-sprint/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/modify-sprint/SKILL.md +350 -0
- package/lib/bmad-extension-plugin/skills/modify-sprint/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension-plugin/skills/module-help.csv +62 -0
- package/lib/bmad-extension-plugin/skills/module.yaml +20 -0
- package/lib/bmad-extension-plugin/skills/prioritize-backlog/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/prioritize-backlog/SKILL.md +256 -0
- package/lib/bmad-extension-plugin/skills/prioritize-backlog/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension-plugin/skills/project-context-expansion/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/project-context-expansion/SKILL.md +238 -0
- package/lib/bmad-extension-plugin/skills/project-context-expansion/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension-plugin/skills/remove-from-sprint/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/remove-from-sprint/SKILL.md +223 -0
- package/lib/bmad-extension-plugin/skills/remove-from-sprint/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension-plugin/skills/sprint-status-view/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/sprint-status-view/SKILL.md +216 -0
- package/lib/bmad-extension-plugin/skills/sprint-status-view/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension-plugin/skills/sqa-audit/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/sqa-audit/SKILL.md +279 -0
- package/lib/bmad-extension-plugin/skills/sqa-audit/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension-plugin/skills/sqa-ieee12207/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/sqa-ieee12207/SKILL.md +374 -0
- package/lib/bmad-extension-plugin/skills/sqa-ieee12207/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension-plugin/skills/sqa-requirements-quality/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/sqa-requirements-quality/SKILL.md +244 -0
- package/lib/bmad-extension-plugin/skills/sqa-requirements-quality/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension-plugin/skills/sre-check-deployment-status/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/sre-check-deployment-status/SKILL.md +32 -0
- package/lib/bmad-extension-plugin/skills/sre-check-deployment-status/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension-plugin/skills/sre-check-secrets/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/sre-check-secrets/SKILL.md +23 -0
- package/lib/bmad-extension-plugin/skills/sre-check-secrets/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension-plugin/skills/sre-check-system-status/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/sre-check-system-status/SKILL.md +27 -0
- package/lib/bmad-extension-plugin/skills/sre-check-system-status/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension-plugin/skills/sre-day-2-ops/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/sre-day-2-ops/SKILL.md +26 -0
- package/lib/bmad-extension-plugin/skills/sre-day-2-ops/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension-plugin/skills/sre-deployment-strategies/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/sre-deployment-strategies/SKILL.md +28 -0
- package/lib/bmad-extension-plugin/skills/sre-deployment-strategies/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension-plugin/skills/sre-fix-deployments/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/sre-fix-deployments/SKILL.md +25 -0
- package/lib/bmad-extension-plugin/skills/sre-fix-deployments/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension-plugin/skills/sre-gitops-status/.gitkeep +0 -0
- package/lib/bmad-extension-plugin/skills/sre-gitops-status/SKILL.md +25 -0
- package/lib/bmad-extension-plugin/skills/sre-gitops-status/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad.js +1375 -372
- package/lib/installer.js +367 -2
- package/package.json +23 -5
- package/scripts/build-bmad-cache.js +250 -47
- package/scripts/build-plugin.js +574 -0
- package/skills/add-sprint/SKILL.md +39 -0
- package/skills/add-to-sprint/SKILL.md +39 -0
- package/skills/bmad-sprint-planning/SKILL.md +41 -0
- package/skills/bmad-sprint-status/SKILL.md +39 -0
- package/skills/cleanup-done/SKILL.md +39 -0
- package/skills/close-sprint/SKILL.md +39 -0
- package/skills/generate-backlog/SKILL.md +41 -0
- package/skills/modify-sprint/SKILL.md +39 -0
- package/skills/prioritize-backlog/SKILL.md +39 -0
- package/skills/remove-from-sprint/SKILL.md +39 -0
- package/skills/sprint-status-view/SKILL.md +39 -0
- package/skills/story-status-lookup/SKILL.md +38 -21
- package/.ma-agents.json +0 -10
- package/AGENTS.md +0 -97
- package/AiAudit.md +0 -12
- package/DEVELOPMENT.md +0 -173
- package/MANIFEST.yaml +0 -3
- package/_bmad-output/implementation-artifacts/16-4-validation-report.md +0 -79
- package/_bmad-output/implementation-artifacts/17-10-rework-generate-backlog.md +0 -237
- package/_bmad-output/implementation-artifacts/17-11-rework-add-to-sprint.md +0 -339
- package/_bmad-output/implementation-artifacts/17-12-rework-remove-from-sprint.md +0 -348
- package/_bmad-output/implementation-artifacts/17-13-rework-sprint-status-view.md +0 -383
- package/_bmad-output/implementation-artifacts/17-14-rework-cleanup-done.md +0 -348
- package/_bmad-output/implementation-artifacts/17-15-rework-bmad-sprint-planning.md +0 -385
- package/_bmad-output/implementation-artifacts/17-16-rework-add-sprint.md +0 -362
- package/_bmad-output/implementation-artifacts/17-17-rework-modify-sprint.md +0 -477
- package/_bmad-output/implementation-artifacts/17-18-rework-bmad-dev-story.md +0 -377
- package/_bmad-output/implementation-artifacts/17-19-rework-story-status-lookup.md +0 -301
- package/_bmad-output/implementation-artifacts/17-20-rework-bmad-sprint-status.md +0 -508
- package/_bmad-output/implementation-artifacts/17-21-new-close-sprint.md +0 -455
- package/_bmad-output/implementation-artifacts/17-22-jira-adapter-pattern.md +0 -325
- package/_bmad-output/implementation-artifacts/17-23-migration-deprecation-old-files.md +0 -403
- package/_bmad-output/implementation-artifacts/17-24-rework-prioritize-backlog.md +0 -344
- package/_bmad-output/implementation-artifacts/17-9-unified-sprint-status-schema.md +0 -279
- package/_bmad-output/implementation-artifacts/19-1-knowledge-graph-core-library.md +0 -239
- package/_bmad-output/implementation-artifacts/19-2-graph-emission-create-prd.md +0 -171
- package/_bmad-output/implementation-artifacts/19-3-graph-emission-create-architecture-epics.md +0 -179
- package/_bmad-output/implementation-artifacts/19-4-graph-emission-create-story-remaining.md +0 -190
- package/_bmad-output/implementation-artifacts/19-5-open-graph-skill.md +0 -213
- package/_bmad-output/implementation-artifacts/19-6-interactive-visualization-renderer.md +0 -259
- package/_bmad-output/implementation-artifacts/19-7-llm-writability-validation-tests.md +0 -280
- package/_bmad-output/implementation-artifacts/21-1-install-time-profile-prompt.md +0 -181
- package/_bmad-output/implementation-artifacts/21-10-profile-reconfigure.md +0 -161
- package/_bmad-output/implementation-artifacts/21-11-profile-uninstall.md +0 -150
- package/_bmad-output/implementation-artifacts/21-2-universal-instruction-block-expansion.md +0 -253
- package/_bmad-output/implementation-artifacts/21-3-roomodes-template-bmad-modes.md +0 -229
- package/_bmad-output/implementation-artifacts/21-4-agents-md-template-opencode.md +0 -275
- package/_bmad-output/implementation-artifacts/21-5-clinerules-template-extension.md +0 -221
- package/_bmad-output/implementation-artifacts/21-6-onprem-layered-guardrails.md +0 -287
- package/_bmad-output/implementation-artifacts/21-7-bmad-persona-phase-prefix.md +0 -258
- package/_bmad-output/implementation-artifacts/21-8-vllm-reference-doc-readme.md +0 -158
- package/_bmad-output/implementation-artifacts/21-9-tests-validation.md +0 -368
- package/_bmad-output/implementation-artifacts/4-1-vs-agent-registry-entry.md +0 -173
- package/_bmad-output/implementation-artifacts/4-2-vs-skill-template-format.md +0 -129
- package/_bmad-output/implementation-artifacts/5-5-explicit-parameter-passing.md +0 -274
- package/_bmad-output/implementation-artifacts/5-6-fix-space-in-path-bug.md +0 -186
- package/_bmad-output/implementation-artifacts/7-1-test-infrastructure-setup.md +0 -144
- package/_bmad-output/implementation-artifacts/7-2-installer-pipeline-tests.md +0 -132
- package/_bmad-output/implementation-artifacts/7-3-bmad-pipeline-tests.md +0 -119
- package/_bmad-output/implementation-artifacts/7-4-cli-command-routing-tests.md +0 -162
- package/_bmad-output/implementation-artifacts/bug-bmad-recompile-fails-on-airgapped-network.md +0 -112
- package/_bmad-output/implementation-artifacts/bug-experimentalwarning-about-commonjs-loading-es-module-during-install.md +0 -57
- package/_bmad-output/implementation-artifacts/deferred-work.md +0 -9
- package/_bmad-output/implementation-artifacts/done/1-1-ci-cd-yes-flag.md +0 -200
- package/_bmad-output/implementation-artifacts/done/10-1-ensure-bmad-output-not-gitignored.md +0 -172
- package/_bmad-output/implementation-artifacts/done/10-2-document-bmad-output-policy.md +0 -102
- package/_bmad-output/implementation-artifacts/done/11-1-auto-bug-detection-skill.md +0 -119
- package/_bmad-output/implementation-artifacts/done/11-2-bug-story-extension-workflow.md +0 -132
- package/_bmad-output/implementation-artifacts/done/11-3-integrate-bug-detection-code-review.md +0 -111
- package/_bmad-output/implementation-artifacts/done/12-1-add-sprint-workflow.md +0 -126
- package/_bmad-output/implementation-artifacts/done/12-2-add-to-sprint-workflow.md +0 -137
- package/_bmad-output/implementation-artifacts/done/12-3-modify-sprint-workflow.md +0 -127
- package/_bmad-output/implementation-artifacts/done/12-4-sprint-status-assigned-items.md +0 -129
- package/_bmad-output/implementation-artifacts/done/13-1-project-context-template-and-generator.md +0 -179
- package/_bmad-output/implementation-artifacts/done/13-2-install-pipeline-integration.md +0 -138
- package/_bmad-output/implementation-artifacts/done/13-3-bmad-critical-actions-update.md +0 -150
- package/_bmad-output/implementation-artifacts/done/13-4-retrospective-expansion-trigger.md +0 -128
- package/_bmad-output/implementation-artifacts/done/13-5-document-project-context-generation.md +0 -118
- package/_bmad-output/implementation-artifacts/done/15-1-bump-bmad-method-to-6-2-1.md +0 -132
- package/_bmad-output/implementation-artifacts/done/15-2-restructure-extension-module.md +0 -174
- package/_bmad-output/implementation-artifacts/done/15-3-convert-custom-agents-to-skill-folders.md +0 -183
- package/_bmad-output/implementation-artifacts/done/15-4-convert-mil498-workflows-to-skill-md.md +0 -252
- package/_bmad-output/implementation-artifacts/done/15-5-convert-sre-devops-cyber-workflows.md +0 -232
- package/_bmad-output/implementation-artifacts/done/15-6-separate-built-in-agent-customizations.md +0 -163
- package/_bmad-output/implementation-artifacts/done/15-7-migration-detection-and-upgrade-path.md +0 -133
- package/_bmad-output/implementation-artifacts/done/15-8-validate-migrated-agents-and-workflows.md +0 -172
- package/_bmad-output/implementation-artifacts/done/15-8-validation-report.md +0 -342
- package/_bmad-output/implementation-artifacts/done/16-1-repository-layout-wizard.md +0 -223
- package/_bmad-output/implementation-artifacts/done/16-2-config-storage-and-cross-reference.md +0 -180
- package/_bmad-output/implementation-artifacts/done/16-3-project-context-multi-repo-section.md +0 -136
- package/_bmad-output/implementation-artifacts/done/16-4-validate-cross-repo-path-resolution.md +0 -137
- package/_bmad-output/implementation-artifacts/done/16-4-validation-report.md +0 -79
- package/_bmad-output/implementation-artifacts/done/16-5-fix-config-lost-on-update.md +0 -110
- package/_bmad-output/implementation-artifacts/done/16-6-repo-sync-check-skill.md +0 -116
- package/_bmad-output/implementation-artifacts/done/16-7-portable-path-storage.md +0 -109
- package/_bmad-output/implementation-artifacts/done/16-8-cicd-remote-mode.md +0 -97
- package/_bmad-output/implementation-artifacts/done/16-9-reconfigure-layout-workflow.md +0 -125
- package/_bmad-output/implementation-artifacts/done/17-1-sprint-entity-model.md +0 -322
- package/_bmad-output/implementation-artifacts/done/17-2-flat-backlog-model.md +0 -264
- package/_bmad-output/implementation-artifacts/done/17-3-bug-as-story-type.md +0 -208
- package/_bmad-output/implementation-artifacts/done/17-4-backlog-to-sprint-workflow.md +0 -209
- package/_bmad-output/implementation-artifacts/done/17-5-sprint-to-backlog-workflow.md +0 -221
- package/_bmad-output/implementation-artifacts/done/17-6-done-item-cleanup.md +0 -273
- package/_bmad-output/implementation-artifacts/done/17-7-multi-criteria-prioritization.md +0 -235
- package/_bmad-output/implementation-artifacts/done/17-8-rework-sprint-status-display.md +0 -285
- package/_bmad-output/implementation-artifacts/done/2-1-cpp-coding-standards-skill.md +0 -188
- package/_bmad-output/implementation-artifacts/done/2-2-csharp-coding-standards-skill.md +0 -211
- package/_bmad-output/implementation-artifacts/done/2-3-python-coding-standards-skill.md +0 -189
- package/_bmad-output/implementation-artifacts/done/3-1-skill-scaffolding-tool.md +0 -184
- package/_bmad-output/implementation-artifacts/done/3-2-skill-validation-tool.md +0 -178
- package/_bmad-output/implementation-artifacts/done/3-3-mandatory-skill-designation.md +0 -136
- package/_bmad-output/implementation-artifacts/done/3-4-bmad-persona-customization-tooling.md +0 -141
- package/_bmad-output/implementation-artifacts/done/3-5-specialized-agent-development-tooling.md +0 -145
- package/_bmad-output/implementation-artifacts/done/5-1-bmad-method-direct-dependency.md +0 -188
- package/_bmad-output/implementation-artifacts/done/5-2-bmad-cache-build-script.md +0 -219
- package/_bmad-output/implementation-artifacts/done/5-3-pre-populate-bmad-cache.md +0 -234
- package/_bmad-output/implementation-artifacts/done/5-4-validate-bundled-installation.md +0 -274
- package/_bmad-output/implementation-artifacts/done/6-1-methodology-presentation-bundle.md +0 -173
- package/_bmad-output/implementation-artifacts/done/8-1-move-instruction-injection-to-top.md +0 -131
- package/_bmad-output/implementation-artifacts/done/8-2-agent-aware-injection-strategy.md +0 -124
- package/_bmad-output/implementation-artifacts/done/8-3-create-bmad-extension-module.md +0 -187
- package/_bmad-output/implementation-artifacts/done/8-4-integration-verification.md +0 -102
- package/_bmad-output/implementation-artifacts/done/8-5-per-agent-enforcement-hooks-research.md +0 -126
- package/_bmad-output/implementation-artifacts/done/8-6-context-persistence-research.md +0 -101
- package/_bmad-output/implementation-artifacts/done/9-1-register-opencode-agent.md +0 -73
- package/_bmad-output/implementation-artifacts/done/9-2-json-merge-injection.md +0 -91
- package/_bmad-output/implementation-artifacts/done/9-3-json-merge-existing.md +0 -113
- package/_bmad-output/implementation-artifacts/done/9-4-json-error-handling.md +0 -90
- package/_bmad-output/implementation-artifacts/epic-11-12-shared-guardrails.md +0 -53
- package/_bmad-output/implementation-artifacts/epic-15-adversarial-fixes.md +0 -287
- package/_bmad-output/implementation-artifacts/epic-16-adversarial-review.md +0 -49
- package/_bmad-output/implementation-artifacts/epic-16-edge-case-review.md +0 -230
- package/_bmad-output/implementation-artifacts/epic-17-adversarial-review.md +0 -37
- package/_bmad-output/implementation-artifacts/epic-17-edge-case-review.md +0 -140
- package/_bmad-output/implementation-artifacts/sprint-status.yaml +0 -139
- package/_bmad-output/planning-artifacts/adapter-pattern-spec.md +0 -508
- package/_bmad-output/planning-artifacts/architecture.md +0 -2023
- package/_bmad-output/planning-artifacts/domain-research-roocode-2026-03-31.md +0 -295
- package/_bmad-output/planning-artifacts/epics.md +0 -4232
- package/_bmad-output/planning-artifacts/mil498-workflow-audit.md +0 -290
- package/_bmad-output/planning-artifacts/prd.md +0 -811
- package/_bmad-output/planning-artifacts/product-brief-agents-2026-03-08.md +0 -214
- package/_bmad-output/planning-artifacts/sprint-status-schema.md +0 -506
- package/_bmad-output/planning-artifacts/validation-report-prd-2026-04-07.md +0 -330
- package/_bmad-output/project-context.md +0 -47
- package/agents.code-workspace +0 -11
- package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-554778ad4e7254827618ebd2497c3f4bce9054a4.idx +0 -0
- package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-554778ad4e7254827618ebd2497c3f4bce9054a4.rev +0 -0
- package/lib/bmad-cache/cis/_git_preserved/objects/pack/pack-39c4fd66f4e0eb3f4d93665318df04cd356b0297.idx +0 -0
- package/lib/bmad-cache/cis/_git_preserved/objects/pack/pack-39c4fd66f4e0eb3f4d93665318df04cd356b0297.rev +0 -0
- package/lib/bmad-cache/cis/src/skills/bmad-cis-agent-brainstorming-coach/bmad-skill-manifest.yaml +0 -11
- package/lib/bmad-cache/cis/src/skills/bmad-cis-agent-creative-problem-solver/bmad-skill-manifest.yaml +0 -11
- package/lib/bmad-cache/cis/src/skills/bmad-cis-agent-design-thinking-coach/bmad-skill-manifest.yaml +0 -11
- package/lib/bmad-cache/cis/src/skills/bmad-cis-agent-innovation-strategist/bmad-skill-manifest.yaml +0 -11
- package/lib/bmad-cache/cis/src/skills/bmad-cis-agent-presentation-master/bmad-skill-manifest.yaml +0 -11
- package/lib/bmad-cache/cis/src/skills/bmad-cis-agent-storyteller/bmad-skill-manifest.yaml +0 -11
- package/lib/bmad-cache/cis/src/skills/bmad-cis-design-thinking/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/cis/src/skills/bmad-cis-innovation-strategy/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/cis/src/skills/bmad-cis-problem-solving/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/cis/src/skills/bmad-cis-storytelling/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/gds/_git_preserved/objects/pack/pack-ac967149d58fba215d07238ad8881bdbdad5c9c3.idx +0 -0
- package/lib/bmad-cache/gds/_git_preserved/objects/pack/pack-ac967149d58fba215d07238ad8881bdbdad5c9c3.rev +0 -0
- package/lib/bmad-cache/gds/src/agents/gds-agent-game-architect/bmad-skill-manifest.yaml +0 -11
- package/lib/bmad-cache/gds/src/agents/gds-agent-game-designer/bmad-skill-manifest.yaml +0 -11
- package/lib/bmad-cache/gds/src/agents/gds-agent-game-dev/bmad-skill-manifest.yaml +0 -11
- package/lib/bmad-cache/gds/src/agents/gds-agent-game-qa/bmad-skill-manifest.yaml +0 -11
- package/lib/bmad-cache/gds/src/agents/gds-agent-game-scrum-master/bmad-skill-manifest.yaml +0 -11
- package/lib/bmad-cache/gds/src/agents/gds-agent-game-solo-dev/bmad-skill-manifest.yaml +0 -11
- package/lib/bmad-cache/gds/src/agents/gds-agent-tech-writer/bmad-skill-manifest.yaml +0 -11
- package/lib/bmad-cache/gds/src/workflows/1-preproduction/gds-brainstorm-game/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/gds/src/workflows/1-preproduction/gds-create-game-brief/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/gds/src/workflows/1-preproduction/research/bmad-skill-manifest.yaml +0 -9
- package/lib/bmad-cache/gds/src/workflows/1-preproduction/research/gds-domain-research/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/gds/src/workflows/2-design/create-prd/bmad-skill-manifest.yaml +0 -14
- package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-gdd/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-narrative/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-ux-design/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/gds/src/workflows/3-technical/gds-check-implementation-readiness/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/gds/src/workflows/3-technical/gds-create-epics-and-stories/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/gds/src/workflows/3-technical/gds-game-architecture/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/gds/src/workflows/3-technical/gds-generate-project-context/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/gds/src/workflows/4-production/gds-code-review/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/gds/src/workflows/4-production/gds-correct-course/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/gds/src/workflows/4-production/gds-create-story/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/gds/src/workflows/4-production/gds-dev-story/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/gds/src/workflows/4-production/gds-retrospective/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/gds/src/workflows/4-production/gds-sprint-planning/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/gds/src/workflows/4-production/gds-sprint-status/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/gds/src/workflows/gametest/gds-e2e-scaffold/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/gds/src/workflows/gametest/gds-performance-test/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/gds/src/workflows/gametest/gds-playtest-plan/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/gds/src/workflows/gametest/gds-test-automate/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/gds/src/workflows/gametest/gds-test-design/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/gds/src/workflows/gametest/gds-test-framework/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/gds/src/workflows/gametest/gds-test-review/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/gds/src/workflows/gds-document-project/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/gds/src/workflows/gds-quick-flow/gds-quick-dev/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/gds/src/workflows/gds-quick-flow/gds-quick-dev-new-preview/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/gds/src/workflows/gds-quick-flow/gds-quick-spec/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/tea/_git_preserved/objects/pack/pack-e75385cd52b693dbb8a3b2afb50058952543b3a2.idx +0 -0
- package/lib/bmad-cache/tea/_git_preserved/objects/pack/pack-e75385cd52b693dbb8a3b2afb50058952543b3a2.rev +0 -0
- package/lib/bmad-cache/tea/_git_preserved/refs/tags/v1.10.0 +0 -1
- package/lib/bmad-cache/tea/src/agents/bmad-tea/bmad-skill-manifest.yaml +0 -14
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/workflow.md +0 -90
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/workflow.md +0 -41
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/workflow.md +0 -41
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/workflow.md +0 -41
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/workflow.md +0 -41
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/workflow.md +0 -41
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/workflow.md +0 -41
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/workflow.md +0 -41
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/workflow.md +0 -41
- package/lib/bmad-customizations/bmm-demerzel.customize.yaml +0 -36
- package/lib/bmad-customizations/demerzel.md +0 -32
- package/lib/bmad-customize/bmm-quick-flow-solo-dev.customize.yaml +0 -8
- package/lib/bmad-extension/module.yaml +0 -5
- package/out.txt +0 -0
- package/test/agent-injection-strategy.test.js +0 -129
- package/test/agents-md.test.js +0 -398
- package/test/bmad-extension.test.js +0 -283
- package/test/bmad-output-policy.test.js +0 -119
- package/test/bmad-persona-phase-prefix.test.js +0 -271
- package/test/bmad-version-bump.test.js +0 -313
- package/test/build-bmad-args.test.js +0 -368
- package/test/cicd-remote-mode.test.js +0 -224
- package/test/clinerules.test.js +0 -339
- package/test/config-layout.test.js +0 -230
- package/test/config-lost-on-update.test.js +0 -363
- package/test/config-storage.test.js +0 -275
- package/test/convert-agents-to-skills.test.js +0 -255
- package/test/create-agent.test.js +0 -232
- package/test/cross-repo-validation.test.js +0 -201
- package/test/enforcement-hooks.test.js +0 -324
- package/test/experimental-warning.test.js +0 -314
- package/test/extension-module-restructure.test.js +0 -407
- package/test/fixtures/README.md +0 -74
- package/test/fixtures/empty-project/README.md +0 -5
- package/test/fixtures/empty-project/package.json +0 -5
- package/test/fixtures/onprem-profile-baseline/.gitkeep +0 -2
- package/test/fixtures/standard-profile-baseline/.gitkeep +0 -2
- package/test/generate-project-context.test.js +0 -483
- package/test/instruction-block.test.js +0 -388
- package/test/instruction-injection.test.js +0 -336
- package/test/integration-verification.test.js +0 -433
- package/test/migration-validation.test.js +0 -506
- package/test/migration.test.js +0 -832
- package/test/offline-recompile.test.js +0 -267
- package/test/onprem-injection.test.js +0 -441
- package/test/onprem-layer.test.js +0 -419
- package/test/opencode-agent.test.js +0 -150
- package/test/opencode-json-error.test.js +0 -260
- package/test/opencode-json-injection.test.js +0 -264
- package/test/opencode-json-merge.test.js +0 -318
- package/test/portable-paths.test.js +0 -268
- package/test/profile.test.js +0 -301
- package/test/reconfigure.test.js +0 -436
- package/test/repo-layout.test.js +0 -246
- package/test/roo-code-agent.test.js +0 -166
- package/test/roo-code-injection.test.js +0 -172
- package/test/roomodes.test.js +0 -343
- package/test/skill-authoring.test.js +0 -272
- package/test/skill-customize-agent.test.js +0 -253
- package/test/skill-mandatory.test.js +0 -235
- package/test/skill-validation.test.js +0 -378
- package/test/story-15-5-workflow-skills.test.js +0 -311
- package/test/uninstall.test.js +0 -402
- package/test/yes-flag.test.js +0 -200
- /package/lib/bmad-cache/gds/src/{gametest → agents/gds-agent-game-dev/gametest}/qa-index.csv +0 -0
- /package/lib/bmad-cache/gds/src/workflows/2-design/{create-prd → gds-create-prd}/data/domain-complexity.csv +0 -0
- /package/lib/bmad-cache/gds/src/workflows/2-design/{create-prd → gds-create-prd}/data/project-types.csv +0 -0
- /package/lib/{bmad-extension/skills/bmad-ma-agent-cyber → bmad-extension-plugin/skills/add-sprint}/.gitkeep +0 -0
- /package/lib/{bmad-extension/skills/bmad-ma-agent-devops → bmad-extension-plugin/skills/add-to-sprint}/.gitkeep +0 -0
- /package/lib/{bmad-extension/skills/bmad-ma-agent-ml → bmad-extension-plugin/skills/bmad-dev-story}/.gitkeep +0 -0
- /package/lib/{bmad-extension/skills/bmad-ma-agent-sqa → bmad-extension-plugin/skills/bmad-sprint-planning}/.gitkeep +0 -0
- /package/lib/{bmad-extension/skills/bmad-ma-agent-sre → bmad-extension-plugin/skills/bmad-sprint-status}/.gitkeep +0 -0
|
@@ -58,6 +58,8 @@ scripts/
|
|
|
58
58
|
|
|
59
59
|
```typescript
|
|
60
60
|
// vitest.config.pact.ts
|
|
61
|
+
// See pact-consumer-framework-setup.md Example 2 "Key Points" for rationale on
|
|
62
|
+
// fileParallelism + pool:forks + singleFork. Do not remove those three settings.
|
|
61
63
|
import { defineConfig } from 'vitest/config';
|
|
62
64
|
|
|
63
65
|
export default defineConfig({
|
|
@@ -65,13 +67,20 @@ export default defineConfig({
|
|
|
65
67
|
environment: 'node',
|
|
66
68
|
include: ['tests/contract/**/*.pacttest.ts'],
|
|
67
69
|
testTimeout: 30000,
|
|
70
|
+
fileParallelism: false,
|
|
71
|
+
pool: 'forks',
|
|
72
|
+
poolOptions: { forks: { singleFork: true } },
|
|
68
73
|
},
|
|
69
74
|
});
|
|
70
75
|
```
|
|
71
76
|
|
|
72
77
|
**Key Points**:
|
|
73
78
|
|
|
74
|
-
-
|
|
79
|
+
- **`fileParallelism: false` is required** — primary defense against non-deterministic pact generation. Without it, parallel workers race on the shared pact JSON file and corrupt interactions. Symptom: local runs pass, CI randomly fails with `Cannot change pact content for already published pact`. See Example 10 for the determinism gate that enforces byte-stability across re-runs.
|
|
80
|
+
- **`pool: 'forks'` + `singleFork: true` is required for multi-file consumer suites** — same config the provider side uses (`pactjs-utils-provider-verifier.md` Example 7). Best current understanding: the `@pact-foundation/pact` napi-rs binding is not robust across Vitest worker threads sharing a process; with the default threads pool (Vitest v1) and multiple `.pacttest.ts` files on the same consumer+provider pair, we observed reproducible "request was expected but not received" flakes on Linux CI only. `singleFork: true` serializes every pact file into one forked subprocess and eliminated the flake on two repos (`pactjs-utils`, `seon-mcp-server`). Vitest v2+ defaults to `forks`, but set the pool explicitly so the contract does not drift with Vitest version bumps.
|
|
81
|
+
- **Single-file consumer suites** (one `.pacttest.ts` per consumer+provider pair) have not been observed to flake under default threads pool, because FFI state is not shared across files when there is only one file. Adding `pool: 'forks'` is still recommended — it future-proofs you the moment a second file is added — but a suite passing today with only `fileParallelism: false` is not broken.
|
|
82
|
+
- **Interacting settings**: leave `isolate` at its default (`true`). Do NOT set `sequence.concurrent: true`, `maxConcurrency > 1`, or `maxWorkers > 1` in this config — they defeat the serialization this rule relies on. `hookTimeout` may be raised if mock-server startup is slow, but keep `testTimeout` ≥ `hookTimeout`.
|
|
83
|
+
- Do NOT add `setupFiles`, `coverage`, or other settings from the unit test config
|
|
75
84
|
- Keep it minimal — Pact tests run in Node environment with extended timeout
|
|
76
85
|
- 30 second timeout accommodates Pact mock server startup and interaction verification
|
|
77
86
|
- Use a dedicated config file (`vitest.config.pact.ts`), not the main vitest config
|
|
@@ -87,7 +96,8 @@ export default defineConfig({
|
|
|
87
96
|
```json
|
|
88
97
|
{
|
|
89
98
|
"scripts": {
|
|
90
|
-
"test:pact:consumer": "
|
|
99
|
+
"test:pact:consumer": "./scripts/check-pact-determinism.sh 'npm run test:pact:consumer:run' 3 ./pacts",
|
|
100
|
+
"test:pact:consumer:run": "vitest run --config vitest.config.pact.ts",
|
|
91
101
|
"publish:pact": ". ./scripts/env-setup.sh && ./scripts/publish-pact.sh",
|
|
92
102
|
"can:i:deploy:consumer": ". ./scripts/env-setup.sh && PACTICIPANT=<service-name> ./scripts/can-i-deploy.sh",
|
|
93
103
|
"record:consumer:deployment": ". ./scripts/env-setup.sh && PACTICIPANT=<service-name> ./scripts/record-deployment.sh"
|
|
@@ -99,6 +109,8 @@ Replace `<service-name>` with the consumer's pacticipant name (e.g., `my-fronten
|
|
|
99
109
|
|
|
100
110
|
**Key Points**:
|
|
101
111
|
|
|
112
|
+
- **`test:pact:consumer` IS the determinism gate** — it runs the inner command 3× and fails if pact output is not byte-stable. This is the command CI and developers run before pushing. See Example 10 for the `check-pact-determinism.sh` script itself.
|
|
113
|
+
- **`test:pact:consumer:run` is the fast inner command** for TDD loops (a single pass of the suite, no gate). Developers can iterate with this; CI always goes through the outer gated script.
|
|
102
114
|
- Use colon-separated naming: `test:pact:consumer`, NOT `test:contract` or `test:contract:consumer`
|
|
103
115
|
- Broker scripts source `env-setup.sh` inline in package.json (`. ./scripts/env-setup.sh && ...`)
|
|
104
116
|
- `PACTICIPANT` is set per-script invocation, not globally
|
|
@@ -127,13 +139,19 @@ export GITHUB_SHA="${GITHUB_SHA:-$(git rev-parse --short HEAD)}"
|
|
|
127
139
|
export GITHUB_BRANCH="${GITHUB_BRANCH:-$(git rev-parse --abbrev-ref HEAD)}"
|
|
128
140
|
```
|
|
129
141
|
|
|
130
|
-
#### `scripts/publish-pact.sh` — Publish Pacts to Broker
|
|
142
|
+
#### `scripts/publish-pact.sh` — Publish Pacts to Broker (with defense-in-depth normalization)
|
|
131
143
|
|
|
132
144
|
```bash
|
|
133
145
|
#!/bin/bash
|
|
134
|
-
# Publish generated pact files to PactFlow/Pact Broker
|
|
146
|
+
# Publish generated pact files to PactFlow/Pact Broker.
|
|
135
147
|
#
|
|
136
|
-
#
|
|
148
|
+
# Before publish, normalize each pact JSON: sort interactions by (description, provider state name,
|
|
149
|
+
# method, path) and sort object keys via `jq -S`. This gives byte-stable output to the broker even
|
|
150
|
+
# if the PactV4 generator produces ordering drift between runs. Paired with scripts/check-pact-determinism.sh
|
|
151
|
+
# as defense-in-depth — the gate catches drift pre-publish; normalization ensures "Cannot change pact
|
|
152
|
+
# content" from PactFlow never fires on ordering-only changes that slip past the gate.
|
|
153
|
+
#
|
|
154
|
+
# Requires: PACT_BROKER_BASE_URL, PACT_BROKER_TOKEN, GITHUB_SHA, GITHUB_BRANCH, jq
|
|
137
155
|
# -e: exit on error -u: error on undefined vars -o pipefail: fail if any pipe segment fails
|
|
138
156
|
set -euo pipefail
|
|
139
157
|
|
|
@@ -141,6 +159,14 @@ set -euo pipefail
|
|
|
141
159
|
|
|
142
160
|
PACT_DIR="./pacts"
|
|
143
161
|
|
|
162
|
+
# Defense-in-depth: normalize interaction order for byte-stable publishes.
|
|
163
|
+
for f in "$PACT_DIR"/*.json; do
|
|
164
|
+
tmp="$(mktemp)"
|
|
165
|
+
jq -S '.interactions |= sort_by(.description, (.providerStates[0].name // ""), .request.method, .request.path)' \
|
|
166
|
+
"$f" > "$tmp"
|
|
167
|
+
mv "$tmp" "$f"
|
|
168
|
+
done
|
|
169
|
+
|
|
144
170
|
pact-broker publish "$PACT_DIR" \
|
|
145
171
|
--consumer-app-version="$GITHUB_SHA" \
|
|
146
172
|
--branch="$GITHUB_BRANCH" \
|
|
@@ -203,6 +229,7 @@ fi
|
|
|
203
229
|
- Use `PACTICIPANT` env var (required via `${PACTICIPANT:?...}`), not hardcoded service names
|
|
204
230
|
- `can-i-deploy` includes `--retry-while-unknown=10 --retry-interval=30` (waits for provider verification)
|
|
205
231
|
- `record-deployment` has branch guard (only records on main/master)
|
|
232
|
+
- **`publish-pact.sh` normalizes interactions with `jq -S` + `sort_by(...)` before publishing** — defense-in-depth alongside the determinism gate (Example 10). The gate catches drift; normalization ensures byte-stable payload to the broker regardless of generator quirks. Keep both; they protect against different failure modes.
|
|
206
233
|
- Do NOT invent custom env vars like `PACT_CONSUMER_VERSION` or `PACT_BREAKING_CHANGE` in scripts — those are handled by `env-setup.sh` and the CI detect-breaking-change action respectively
|
|
207
234
|
|
|
208
235
|
---
|
|
@@ -249,11 +276,11 @@ jobs:
|
|
|
249
276
|
- name: Install dependencies
|
|
250
277
|
run: npm ci
|
|
251
278
|
|
|
252
|
-
# (1) Generate pact files
|
|
253
|
-
- name:
|
|
279
|
+
# (1) Generate pact files — runs the determinism gate (3 runs + byte-stable check via jq)
|
|
280
|
+
- name: Consumer pact tests (determinism gate)
|
|
254
281
|
run: npm run test:pact:consumer
|
|
255
282
|
|
|
256
|
-
# (2) Publish pacts to broker
|
|
283
|
+
# (2) Publish pacts to broker (publish-pact.sh also normalizes interaction order as defense-in-depth)
|
|
257
284
|
- name: Publish pacts to PactFlow
|
|
258
285
|
run: npm run publish:pact
|
|
259
286
|
|
|
@@ -274,6 +301,8 @@ jobs:
|
|
|
274
301
|
|
|
275
302
|
**Key Points**:
|
|
276
303
|
|
|
304
|
+
- **1:1 local/CI parity is a hard rule**: every CI step is `npm run <same-name-a-dev-uses>`. Never let CI invoke `vitest` or `pact-broker` directly — that divergence is how "works on my machine" slips in. The determinism gate, publish, can-i-deploy, and record-deployment are all the same commands a developer runs locally.
|
|
305
|
+
- **The determinism gate is its own visible step, not a side-effect of publish.** A failing gate must be debuggable from the CI log without re-running. Do not fold it into a `prepublish:pact` hook — folding hides the failure inside a publish log and makes attribution harder.
|
|
277
306
|
- **Workflow-level `env` block** for broker secrets and git vars — not per-step
|
|
278
307
|
- **`detect-breaking-change` step** runs before install to set `PACT_BREAKING_CHANGE` env var
|
|
279
308
|
- **Step numbering skips (3)** — step 3 is the webhook-triggered provider verification (happens externally)
|
|
@@ -596,12 +625,102 @@ pact-logs/
|
|
|
596
625
|
|
|
597
626
|
---
|
|
598
627
|
|
|
628
|
+
### Example 10: Determinism Gate Script (Primary Defense)
|
|
629
|
+
|
|
630
|
+
**Context**: Even with `fileParallelism: false` (Example 2) and one-interaction-per-`it()` (see `pactjs-utils-consumer-helpers.md`), the PactV4 Rust FFI layer can occasionally produce byte-different pact JSON between runs — interaction ordering drift, nested matcher serialization quirks, or `Date` / random-value matchers that weren't locked down. This causes PactFlow to reject re-publishes of the same consumer SHA with `Cannot change pact content for already published pact`. The determinism gate runs the consumer suite N times locally and in CI, hashes the normalized pact files, and fails fast if drift is detected — before any publish is attempted.
|
|
631
|
+
|
|
632
|
+
**Implementation**:
|
|
633
|
+
|
|
634
|
+
#### `scripts/check-pact-determinism.sh`
|
|
635
|
+
|
|
636
|
+
```bash
|
|
637
|
+
#!/bin/bash
|
|
638
|
+
# Run a pact consumer command N times and fail if the generated pact files are not byte-stable.
|
|
639
|
+
# Primary defense against PactV4 non-deterministic output.
|
|
640
|
+
#
|
|
641
|
+
# Usage: ./scripts/check-pact-determinism.sh "<cmd>" [runs] [pact-dir]
|
|
642
|
+
# Example: ./scripts/check-pact-determinism.sh 'npm run test:pact:consumer:run' 3 ./pacts
|
|
643
|
+
#
|
|
644
|
+
# Requires: jq installed on the runner (ubuntu-latest has it; macOS users need `brew install jq`).
|
|
645
|
+
set -euo pipefail
|
|
646
|
+
|
|
647
|
+
CMD="${1:?usage: ./scripts/check-pact-determinism.sh \"<cmd>\" [runs] [pact-dir]}"
|
|
648
|
+
RUNS="${PACT_DETERMINISM_RUNS:-${2:-3}}"
|
|
649
|
+
PACT_DIR="${3:-./pacts}"
|
|
650
|
+
|
|
651
|
+
TMP_DIR="$(mktemp -d)"
|
|
652
|
+
trap 'rm -rf "$TMP_DIR"' EXIT
|
|
653
|
+
|
|
654
|
+
hash_pact_file() {
|
|
655
|
+
# Sort interactions by (description, first provider state name, method, path), sort keys with -S.
|
|
656
|
+
# The sorted output is what we hash — so ordering-only drift does NOT count as non-determinism here.
|
|
657
|
+
# (The gate catches deeper drift; ordering drift is handled by publish-pact.sh normalization.)
|
|
658
|
+
jq -S '.interactions |= sort_by(.description, (.providerStates[0].name // ""), .request.method, .request.path)' "$1" \
|
|
659
|
+
| shasum -a 256 | awk '{print $1}'
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
for run in $(seq 1 "$RUNS"); do
|
|
663
|
+
echo "→ determinism run $run/$RUNS"
|
|
664
|
+
rm -f "$PACT_DIR"/*.json 2>/dev/null || true
|
|
665
|
+
eval "$CMD" >"$TMP_DIR/run-$run.log" 2>&1 || {
|
|
666
|
+
echo "❌ run $run failed — dumping log:"
|
|
667
|
+
cat "$TMP_DIR/run-$run.log"
|
|
668
|
+
exit 1
|
|
669
|
+
}
|
|
670
|
+
: > "$TMP_DIR/run-$run.hashes"
|
|
671
|
+
for f in "$PACT_DIR"/*.json; do
|
|
672
|
+
[ -f "$f" ] || continue
|
|
673
|
+
printf '%s %s\n' "$(hash_pact_file "$f")" "$(basename "$f")" >> "$TMP_DIR/run-$run.hashes"
|
|
674
|
+
done
|
|
675
|
+
sort -o "$TMP_DIR/run-$run.hashes" "$TMP_DIR/run-$run.hashes"
|
|
676
|
+
done
|
|
677
|
+
|
|
678
|
+
# Compare every subsequent run against run 1.
|
|
679
|
+
FAIL=0
|
|
680
|
+
for run in $(seq 2 "$RUNS"); do
|
|
681
|
+
if ! diff -q "$TMP_DIR/run-1.hashes" "$TMP_DIR/run-$run.hashes" >/dev/null; then
|
|
682
|
+
FAIL=1
|
|
683
|
+
echo ""
|
|
684
|
+
echo "❌ Pact output differs between run 1 and run $run:"
|
|
685
|
+
diff "$TMP_DIR/run-1.hashes" "$TMP_DIR/run-$run.hashes" || true
|
|
686
|
+
fi
|
|
687
|
+
done
|
|
688
|
+
|
|
689
|
+
if [ "$FAIL" -ne 0 ]; then
|
|
690
|
+
echo ""
|
|
691
|
+
echo "Pact output is non-deterministic across $RUNS runs. Likely causes:"
|
|
692
|
+
echo " • multiple .addInteraction() chained in a single it() block (PactV4 FFI drops one non-deterministically)"
|
|
693
|
+
echo " • fileParallelism: true in vitest.config.pact.ts (workers race on shared pact JSON)"
|
|
694
|
+
echo " • missing pool: 'forks' + singleFork: true (threads pool shares FFI state across files on Linux CI)"
|
|
695
|
+
echo " • Date / random matchers that don't lock a stable example value"
|
|
696
|
+
echo " • provider state params mutating between runs (e.g. Date.now())"
|
|
697
|
+
exit 1
|
|
698
|
+
fi
|
|
699
|
+
|
|
700
|
+
echo "✅ Pact output is byte-stable across $RUNS runs."
|
|
701
|
+
```
|
|
702
|
+
|
|
703
|
+
**Key Points**:
|
|
704
|
+
|
|
705
|
+
- **Wire this script into `test:pact:consumer`** (see Example 3). The outer script IS the gate; the inner `test:pact:consumer:run` is the single-pass command for TDD loops.
|
|
706
|
+
- **Default 3 runs** is the sweet spot — 2 runs miss intermittent drops, >3 slows CI without catching more. Override with an env var or the positional arg if you're actively debugging a flake.
|
|
707
|
+
- **Treat gate failures as a P0 bug, not a "retry until green" condition.** Find the source of non-determinism (chained `addInteraction`, unsorted interactions, Date-dependent matchers). Do not raise `RUNS` to 10 to mask the symptom.
|
|
708
|
+
- **Requires `jq`** — installed by default on `ubuntu-latest`. For macOS local dev, document `brew install jq` in the project README.
|
|
709
|
+
- **In CI, make this its own visible step** (see Example 5 step (1) naming). Do not fold into a `prepublish:pact` hook — that hides the failure inside a publish log.
|
|
710
|
+
- **Defense-in-depth with `publish-pact.sh` normalization** (Example 4): the gate catches pre-publish drift; the publish-time `jq` sort ensures any ordering-only drift that slipped past the gate still produces a byte-stable payload to PactFlow.
|
|
711
|
+
|
|
712
|
+
---
|
|
713
|
+
|
|
599
714
|
## Validation Checklist
|
|
600
715
|
|
|
601
716
|
Before presenting the consumer CDC framework to the user, verify:
|
|
602
717
|
|
|
603
|
-
- [ ] `vitest.config.pact.ts` is minimal
|
|
604
|
-
- [ ]
|
|
718
|
+
- [ ] `vitest.config.pact.ts` is minimal **and sets `fileParallelism: false` AND `pool: 'forks'` with `poolOptions.forks.singleFork: true`** (`fileParallelism: false` prevents shared pact JSON corruption from parallel workers; forks + `singleFork: true` eliminates the Linux-CI "request was expected but not received" flake observed once a second `.pacttest.ts` is added — see Example 2 Key Points for evidence, mechanism qualifier, and single-file exception)
|
|
719
|
+
- [ ] `vitest.config.pact.ts` does NOT set `sequence.concurrent: true`, `maxConcurrency > 1`, `maxWorkers > 1`, or `isolate: false` — all four defeat the serialization the rule relies on
|
|
720
|
+
- [ ] `package.json` splits `test:pact:consumer` (gated determinism runner) and `test:pact:consumer:run` (inner single-pass command)
|
|
721
|
+
- [ ] `scripts/check-pact-determinism.sh` is present, hashes via `jq -S` + `sort_by`, defaults to 3 runs, and is the body of the `test:pact:consumer` script
|
|
722
|
+
- [ ] `scripts/publish-pact.sh` normalizes interactions with `jq -S '.interactions |= sort_by(.description, (.providerStates[0].name // ""), .request.method, .request.path)'` before the `pact-broker publish` call (defense-in-depth alongside the gate)
|
|
723
|
+
- [ ] Script names match pactjs-utils (`test:pact:consumer`, `test:pact:consumer:run`, `publish:pact`, `can:i:deploy:consumer`, `record:consumer:deployment`)
|
|
605
724
|
- [ ] Scripts source `env-setup.sh` inline in package.json
|
|
606
725
|
- [ ] Shell scripts use `pact-broker` not `npx pact-broker`
|
|
607
726
|
- [ ] Shell scripts use `PACTICIPANT` env var pattern
|
|
@@ -611,6 +730,8 @@ Before presenting the consumer CDC framework to the user, verify:
|
|
|
611
730
|
- [ ] CI workflow named `contract-test-consumer.yml`
|
|
612
731
|
- [ ] CI has workflow-level env block (not per-step)
|
|
613
732
|
- [ ] CI has `detect-breaking-change` step before install
|
|
733
|
+
- [ ] CI step (1) is the determinism gate (calls `npm run test:pact:consumer`) — its own visible step, not folded into publish
|
|
734
|
+
- [ ] CI steps are 1:1 with developer commands — every CI step calls `npm run <same-name>` a dev would run locally (no direct `vitest` or `pact-broker` invocation)
|
|
614
735
|
- [ ] CI step numbering skips (3) — webhook-triggered provider verification
|
|
615
736
|
- [ ] CI can-i-deploy has `PACT_BREAKING_CHANGE != 'true'` condition
|
|
616
737
|
- [ ] CI has NO upload-artifact step
|
|
@@ -629,7 +750,8 @@ Before presenting the consumer CDC framework to the user, verify:
|
|
|
629
750
|
## Related Fragments
|
|
630
751
|
|
|
631
752
|
- `pactjs-utils-overview.md` — Library decision tree and installation
|
|
632
|
-
- `pactjs-utils-consumer-helpers.md` — `createProviderState`, `toJsonMap`, `setJsonContent`,
|
|
633
|
-
- `pactjs-utils-provider-verifier.md` — Provider-side verification patterns
|
|
753
|
+
- `pactjs-utils-consumer-helpers.md` — `createProviderState`, `toJsonMap`, `setJsonContent`, `setJsonBody`, **one-interaction-per-`it()` rule**
|
|
754
|
+
- `pactjs-utils-provider-verifier.md` — Provider-side verification patterns; consumer and provider BOTH require `pool: 'forks'` + `singleFork: true` — same FFI-safety rule applies on both sides
|
|
634
755
|
- `pactjs-utils-request-filter.md` — Auth injection for provider verification
|
|
756
|
+
- `pact-broker-webhooks.md` — PactFlow → GitHub webhook auth pattern (dedicated user, classic PAT, PactFlow secret) and staleness monitoring
|
|
635
757
|
- `contract-testing.md` — Foundational CDC patterns and resilience coverage
|
|
@@ -180,6 +180,7 @@ During CI workflow design, reference the can-i-deploy tool:
|
|
|
180
180
|
|
|
181
181
|
- `pactjs-utils-overview.md` — runtime utilities that pact tests import
|
|
182
182
|
- `pactjs-utils-provider-verifier.md` — verifier options that reference broker config
|
|
183
|
+
- `pact-broker-webhooks.md` — PactFlow → GitHub webhook auth pattern and staleness monitoring; `Metrics - All` / `Matrix` MCP tools are useful here for dashboards
|
|
183
184
|
- `contract-testing.md` — foundational contract testing patterns
|
|
184
185
|
|
|
185
186
|
## Anti-Patterns
|
|
@@ -185,6 +185,86 @@ await pact
|
|
|
185
185
|
- Use `setJsonBody` when you only need `jsonBody` and want the shorter `.willRespondWith(status, setJsonBody(...))` form
|
|
186
186
|
- `setJsonBody` is equivalent to `setJsonContent({ body: ... })`
|
|
187
187
|
|
|
188
|
+
### Example 6: One `addInteraction()` per `it()` Block (PactV4 Determinism Rule)
|
|
189
|
+
|
|
190
|
+
**Context**: PactV4's `pact.addInteraction()` feeds the Rust FFI layer that writes interactions to the pact JSON. Chaining multiple `.addInteraction()...executeTest()` blocks inside a single `it()` — or otherwise registering multiple interactions before a single `executeTest` — causes the FFI to **non-deterministically drop whole interactions** (not individual fields) in roughly 1 out of N runs. The pattern passes locally, then fails intermittently in CI or at publish time with `Cannot change pact content for already published pact` once the dropped interaction reappears on a re-run.
|
|
191
|
+
|
|
192
|
+
**Rule**: Exactly one `pact.addInteraction()` per `it()` block. For N interactions, write N `it()` blocks, or use `it.each(...)`.
|
|
193
|
+
|
|
194
|
+
```typescript
|
|
195
|
+
// ❌ WRONG — two addInteraction() inside one it() — FFI non-deterministically drops one
|
|
196
|
+
it('handles movie lookup scenarios', async () => {
|
|
197
|
+
await pact
|
|
198
|
+
.addInteraction()
|
|
199
|
+
.given('movie exists')
|
|
200
|
+
.uponReceiving('a request to get movie by id')
|
|
201
|
+
.withRequest('GET', '/movies/1')
|
|
202
|
+
.willRespondWith(200, setJsonBody({ id: integer(1), name: string('The Matrix') }))
|
|
203
|
+
.executeTest(async (mockServer) => {
|
|
204
|
+
/* ... */
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
// Sometimes this second interaction never makes it to the pact JSON:
|
|
208
|
+
await pact
|
|
209
|
+
.addInteraction()
|
|
210
|
+
.given('no movies exist')
|
|
211
|
+
.uponReceiving('a request for an empty list')
|
|
212
|
+
.withRequest('GET', '/movies')
|
|
213
|
+
.willRespondWith(200, setJsonBody([]))
|
|
214
|
+
.executeTest(async (mockServer) => {
|
|
215
|
+
/* ... */
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
// ✅ RIGHT — one addInteraction() per it()
|
|
220
|
+
it('gets a movie by id', async () => {
|
|
221
|
+
await pact
|
|
222
|
+
.addInteraction()
|
|
223
|
+
.given('movie exists')
|
|
224
|
+
.uponReceiving('a request to get movie by id')
|
|
225
|
+
.withRequest('GET', '/movies/1')
|
|
226
|
+
.willRespondWith(200, setJsonBody({ id: integer(1), name: string('The Matrix') }))
|
|
227
|
+
.executeTest(async (mockServer) => {
|
|
228
|
+
/* ... */
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
it('returns empty list when no movies exist', async () => {
|
|
233
|
+
await pact
|
|
234
|
+
.addInteraction()
|
|
235
|
+
.given('no movies exist')
|
|
236
|
+
.uponReceiving('a request for an empty list')
|
|
237
|
+
.withRequest('GET', '/movies')
|
|
238
|
+
.willRespondWith(200, setJsonBody([]))
|
|
239
|
+
.executeTest(async (mockServer) => {
|
|
240
|
+
/* ... */
|
|
241
|
+
});
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
// ✅ RIGHT — parameterized via it.each for data-driven coverage
|
|
245
|
+
it.each([
|
|
246
|
+
{ id: 1, name: 'The Matrix' },
|
|
247
|
+
{ id: 2, name: 'Inception' },
|
|
248
|
+
])('gets movie $id', async ({ id, name }) => {
|
|
249
|
+
await pact
|
|
250
|
+
.addInteraction()
|
|
251
|
+
.given('movie exists', { id, name })
|
|
252
|
+
.uponReceiving(`a request to get movie ${id}`)
|
|
253
|
+
.withRequest('GET', `/movies/${id}`)
|
|
254
|
+
.willRespondWith(200, setJsonBody({ id: integer(id), name: string(name) }))
|
|
255
|
+
.executeTest(async (mockServer) => {
|
|
256
|
+
/* ... */
|
|
257
|
+
});
|
|
258
|
+
});
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
**Key Points**:
|
|
262
|
+
|
|
263
|
+
- **This rule stacks with two other MANDATORY vitest settings**: `fileParallelism: false` AND `pool: 'forks'` with `poolOptions.forks.singleFork: true`. All three are required and address different failure modes — `fileParallelism: false` prevents parallel workers from racing on the shared pact JSON; `pool: 'forks'` + `singleFork: true` prevents the Pact Rust FFI from leaking state across files (manifests as "request was expected but not received" flakes on Linux CI only); one-interaction-per-`it()` prevents the FFI from dropping interactions within a single test body.
|
|
264
|
+
- Symptom of violating this rule: the pact file is byte-different between otherwise-identical runs; `scripts/check-pact-determinism.sh` flags drift; PactFlow rejects a republish with `Cannot change pact content`.
|
|
265
|
+
- The rule applies to both HTTP consumer pacts (`PactV4`) and message consumer pacts (`MessageConsumerPact`).
|
|
266
|
+
- See `pact-consumer-framework-setup.md` Example 10 for the determinism gate that automatically catches violations of this rule.
|
|
267
|
+
|
|
188
268
|
## Key Points
|
|
189
269
|
|
|
190
270
|
- **Spread pattern**: Always use `...createProviderState()` — the tuple spreads into `.given(stateName, params)`
|
|
@@ -198,11 +278,13 @@ await pact
|
|
|
198
278
|
- **Body shorthand**: `setJsonBody` keeps body-only responses concise and readable
|
|
199
279
|
- **Matchers check type, not value**: `string('My movie')` means "any string", `integer(1)` means "any integer". The example values are arbitrary — the provider can return different values and verification still passes as long as the type matches. Use matchers only in `.willRespondWith()` (responses), never in `.withRequest()` (requests) — Postel's Law applies.
|
|
200
280
|
- **Reuse test values across files**: Interactions are uniquely identified by `uponReceiving` + `.given()`, not by placeholder values. Two test files can both use `testId: 100` without conflicting. On the provider side, shared values simplify state handlers — idempotent handlers (check if exists, create if not) only need to ensure one record exists. Use different values only when testing different states of the same entity type (e.g., `movieExists(100)` for happy paths vs. `movieNotFound(999)` for error paths).
|
|
281
|
+
- **One `addInteraction()` per `it()` block (MANDATORY for PactV4)**: Multiple interactions inside one `it()` cause the Rust FFI to non-deterministically drop interactions. Use one `it()` per interaction or `it.each(...)` for parameterized cases. See Example 6 and the determinism gate in `pact-consumer-framework-setup.md` Example 10.
|
|
201
282
|
|
|
202
283
|
## Related Fragments
|
|
203
284
|
|
|
204
285
|
- `pactjs-utils-overview.md` — installation, decision tree, design philosophy
|
|
205
|
-
- `pactjs-utils-provider-verifier.md` — provider-side state handler implementation
|
|
286
|
+
- `pactjs-utils-provider-verifier.md` — provider-side state handler implementation; same `pool: 'forks'` + `singleFork: true` rule as consumer
|
|
287
|
+
- `pact-consumer-framework-setup.md` — Vitest `fileParallelism: false` + `pool: 'forks'` + `singleFork: true` config, determinism gate (Example 10), and CI wiring
|
|
206
288
|
- `contract-testing.md` — foundational patterns with raw Pact.js
|
|
207
289
|
|
|
208
290
|
## Anti-Patterns
|
|
@@ -267,4 +349,32 @@ provider.given(...createProviderState({ name: STATES.USER_EXISTS, params: { id:
|
|
|
267
349
|
.willRespondWith(200, setJsonBody({ status: 200 }));
|
|
268
350
|
```
|
|
269
351
|
|
|
352
|
+
### Wrong: Multiple `addInteraction()` in a single `it()`
|
|
353
|
+
|
|
354
|
+
```typescript
|
|
355
|
+
// ❌ PactV4 FFI non-deterministically drops one of these interactions ~1/N runs
|
|
356
|
+
it('handles both success and empty list', async () => {
|
|
357
|
+
await pact.addInteraction().uponReceiving('get movie').withRequest(/* ... */).executeTest(/* ... */);
|
|
358
|
+
await pact.addInteraction().uponReceiving('empty list').withRequest(/* ... */).executeTest(/* ... */);
|
|
359
|
+
});
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
### Right: One `addInteraction()` per `it()` (or use `it.each`)
|
|
363
|
+
|
|
364
|
+
```typescript
|
|
365
|
+
// ✅ Deterministic pact JSON — FFI receives one interaction per test
|
|
366
|
+
it('gets a movie', async () => {
|
|
367
|
+
await pact
|
|
368
|
+
.addInteraction() /* ... */
|
|
369
|
+
.executeTest(/* ... */);
|
|
370
|
+
});
|
|
371
|
+
it('returns empty list', async () => {
|
|
372
|
+
await pact
|
|
373
|
+
.addInteraction() /* ... */
|
|
374
|
+
.executeTest(/* ... */);
|
|
375
|
+
});
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
See Example 6 above for the full rationale and the determinism gate that enforces this rule.
|
|
379
|
+
|
|
270
380
|
_Source: @seontechnologies/pactjs-utils consumer-helpers module, pactjs-utils sample-app consumer tests_
|
|
@@ -220,6 +220,54 @@ const tags = getProviderVersionTags();
|
|
|
220
220
|
// tags = ['local']
|
|
221
221
|
```
|
|
222
222
|
|
|
223
|
+
### Example 7: Provider Vitest Configuration (Required for Multi-File Verification)
|
|
224
|
+
|
|
225
|
+
**Context**: The Pact Rust FFI that powers the JS `Verifier` holds process-wide state (native handles for messages, matchers, mocks). Vitest's default parallel file workers each spin up their own FFI instance and quickly corrupt that state — causing `MessagePact`/`Verifier` errors like `"Unable to get the MessageHandle"`, or non-deterministic verification passes/fails — as soon as you have more than one provider `.spec.ts` file.
|
|
226
|
+
|
|
227
|
+
**Rule**: Provider verification suites **must** run in a single fork. Use Vitest's `forks` pool with `singleFork: true` in `vitest.config.contract.ts` (or equivalent).
|
|
228
|
+
|
|
229
|
+
```typescript
|
|
230
|
+
// vitest.config.contract.ts — provider verification config
|
|
231
|
+
import { defineConfig } from 'vitest/config';
|
|
232
|
+
|
|
233
|
+
export default defineConfig({
|
|
234
|
+
test: {
|
|
235
|
+
environment: 'node',
|
|
236
|
+
include: ['tests/contract/**/*.spec.ts'],
|
|
237
|
+
testTimeout: 60000,
|
|
238
|
+
// MANDATORY for multi-file provider verification.
|
|
239
|
+
// The Pact Rust FFI backing the Verifier holds process-wide state; parallel workers corrupt it
|
|
240
|
+
// and produce flaky verification results / "Unable to get the MessageHandle" errors.
|
|
241
|
+
// This is especially important for message providers (Kafka/async) where verifier construction
|
|
242
|
+
// allocates native handles per file — singleFork keeps them in one process so state is coherent.
|
|
243
|
+
pool: 'forks',
|
|
244
|
+
poolOptions: {
|
|
245
|
+
forks: {
|
|
246
|
+
singleFork: true,
|
|
247
|
+
},
|
|
248
|
+
},
|
|
249
|
+
},
|
|
250
|
+
});
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
**Key Points**:
|
|
254
|
+
|
|
255
|
+
- **Required for message providers** (`buildMessageVerifierOptions`) — the message-handle FFI state is almost guaranteed to corrupt under parallel workers.
|
|
256
|
+
- **Required for HTTP providers with multiple contract test files** — even if each file works in isolation, running them together in parallel produces intermittent failures.
|
|
257
|
+
- `pool: 'forks'` (rather than `threads`) + `singleFork: true` is the exact combo that keeps all verifier runs in a single child process with a single FFI instance.
|
|
258
|
+
- Treat `pool: 'forks'` + `singleFork: true` as the required baseline for all provider suites, including single-file HTTP-only ones. A suite that works today with one file will flake the moment a second file is added, and removing the setting later introduces a regression window.
|
|
259
|
+
- **The same `pool: 'forks'` + `singleFork: true` rule applies on the consumer side.** Consumer `vitest.config.pact.ts` sets it alongside `fileParallelism: false` — see `pact-consumer-framework-setup.md` Example 2. The rule is needed on either side wherever more than one pact test file exists per consumer+provider pair.
|
|
260
|
+
- Use a dedicated `vitest.config.contract.ts` so unit tests still get full parallelism — only contract tests pay the serialization cost.
|
|
261
|
+
- Related `package.json` entry:
|
|
262
|
+
|
|
263
|
+
```json
|
|
264
|
+
{
|
|
265
|
+
"scripts": {
|
|
266
|
+
"test:pact:provider": "vitest run --config vitest.config.contract.ts"
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
```
|
|
270
|
+
|
|
223
271
|
## Environment Variables Reference
|
|
224
272
|
|
|
225
273
|
| Variable | Required | Description | Default |
|
|
@@ -241,12 +289,15 @@ const tags = getProviderVersionTags();
|
|
|
241
289
|
- **Webhook support**: `PACT_PAYLOAD_URL` takes precedence — verifies only the specific pact that triggered the webhook
|
|
242
290
|
- **State handler types**: Both `async (params) => void` and `{ setup: async (params) => void, teardown: async () => void }` are supported
|
|
243
291
|
- **Version publishing**: Verification results are published by default (`publishVerificationResult` defaults to `true`)
|
|
292
|
+
- **Provider Vitest config is MANDATORY for multi-file suites**: Set `pool: 'forks'` + `poolOptions.forks.singleFork: true` in `vitest.config.contract.ts`. Without this the Rust FFI corrupts under parallel workers (see Example 7).
|
|
244
293
|
|
|
245
294
|
## Related Fragments
|
|
246
295
|
|
|
247
296
|
- `pactjs-utils-overview.md` — installation, decision tree, design philosophy
|
|
248
|
-
- `pactjs-utils-consumer-helpers.md` — consumer-side state parameter creation
|
|
297
|
+
- `pactjs-utils-consumer-helpers.md` — consumer-side state parameter creation, **one-interaction-per-`it()` rule**
|
|
249
298
|
- `pactjs-utils-request-filter.md` — auth injection for provider verification
|
|
299
|
+
- `pact-consumer-framework-setup.md` — consumer-side framework setup, Vitest `fileParallelism: false`, determinism gate
|
|
300
|
+
- `pact-broker-webhooks.md` — PactFlow → GitHub webhook auth/staleness for webhook-triggered provider verification (`contract_requiring_verification_published`)
|
|
250
301
|
- `contract-testing.md` — foundational patterns with raw Pact.js
|
|
251
302
|
|
|
252
303
|
## Anti-Patterns
|
|
@@ -312,4 +363,35 @@ const opts = buildVerifierOptions({
|
|
|
312
363
|
// Selectors chosen automatically based on environment
|
|
313
364
|
```
|
|
314
365
|
|
|
366
|
+
### Wrong: Parallel Vitest workers for provider verification
|
|
367
|
+
|
|
368
|
+
```typescript
|
|
369
|
+
// ❌ vitest.config.contract.ts — uses default parallel workers
|
|
370
|
+
import { defineConfig } from 'vitest/config';
|
|
371
|
+
export default defineConfig({
|
|
372
|
+
test: {
|
|
373
|
+
environment: 'node',
|
|
374
|
+
include: ['tests/contract/**/*.spec.ts'],
|
|
375
|
+
// NO pool/singleFork config — defaults to parallel file workers
|
|
376
|
+
},
|
|
377
|
+
});
|
|
378
|
+
// Symptoms: "Unable to get the MessageHandle", non-deterministic verification pass/fail,
|
|
379
|
+
// green locally on single-file run but red in CI with multiple files
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
### Right: Single fork for provider verification
|
|
383
|
+
|
|
384
|
+
```typescript
|
|
385
|
+
// ✅ vitest.config.contract.ts — serializes provider verification files
|
|
386
|
+
import { defineConfig } from 'vitest/config';
|
|
387
|
+
export default defineConfig({
|
|
388
|
+
test: {
|
|
389
|
+
environment: 'node',
|
|
390
|
+
include: ['tests/contract/**/*.spec.ts'],
|
|
391
|
+
pool: 'forks',
|
|
392
|
+
poolOptions: { forks: { singleFork: true } },
|
|
393
|
+
},
|
|
394
|
+
});
|
|
395
|
+
```
|
|
396
|
+
|
|
315
397
|
_Source: @seontechnologies/pactjs-utils provider-verifier module, pact-js-example-provider CI workflows_
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# Webhook Module Setup
|
|
2
|
+
|
|
3
|
+
## Principle
|
|
4
|
+
|
|
5
|
+
Wire the provider once in a central fixtures file using the `webhookProviderFixture + webhookFixture + mergeTests` pattern. Tests that request `webhookRegistry` get automatic setup and teardown; tests that don't pay nothing (Playwright lazy fixture evaluation).
|
|
6
|
+
|
|
7
|
+
## Fixture Wiring Pattern
|
|
8
|
+
|
|
9
|
+
### WireMock Provider (recommended for most setups)
|
|
10
|
+
|
|
11
|
+
The WireMock provider works with any backend that implements the `/__admin/requests` API format — not just actual WireMock. The playwright-utils sample app's Express backend uses this exact format.
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
// playwright/support/merged-fixtures.ts
|
|
15
|
+
import { test as base, mergeTests } from '@playwright/test';
|
|
16
|
+
import { test as webhookFixture } from '@seontechnologies/playwright-utils/webhook/fixtures';
|
|
17
|
+
import { WireMockWebhookProvider } from '@seontechnologies/playwright-utils/webhook';
|
|
18
|
+
import { API_URL } from '../config/local.config';
|
|
19
|
+
|
|
20
|
+
// Lazy-initialized by Playwright — no cost for tests that don't request webhookRegistry.
|
|
21
|
+
const webhookProviderFixture = base.extend<{
|
|
22
|
+
webhookProvider: WireMockWebhookProvider;
|
|
23
|
+
}>({
|
|
24
|
+
webhookProvider: async ({ request }, use) => {
|
|
25
|
+
const provider = new WireMockWebhookProvider(API_URL, request);
|
|
26
|
+
await use(provider);
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
const test = mergeTests(
|
|
31
|
+
base,
|
|
32
|
+
// ...your other fixtures...
|
|
33
|
+
webhookFixture,
|
|
34
|
+
webhookProviderFixture,
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
// Use matched-only cleanup project-wide: each test only deletes the webhooks it
|
|
38
|
+
// matched, so a parallel worker's teardown cannot wipe the shared journal while
|
|
39
|
+
// another test is still mid-flight (fullyParallel: true race condition).
|
|
40
|
+
test.use({ webhookConfig: { cleanupStrategy: 'matched-only' } });
|
|
41
|
+
|
|
42
|
+
export { test };
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
This is the exact pattern used in the playwright-utils E2E suite (`playwright/support/merged-fixtures.ts`).
|
|
46
|
+
|
|
47
|
+
### MockServer Provider
|
|
48
|
+
|
|
49
|
+
```typescript
|
|
50
|
+
import { MockServerWebhookProvider } from '@seontechnologies/playwright-utils/webhook';
|
|
51
|
+
|
|
52
|
+
const webhookProviderFixture = base.extend<{
|
|
53
|
+
webhookProvider: MockServerWebhookProvider;
|
|
54
|
+
}>({
|
|
55
|
+
webhookProvider: async ({ request }, use) => {
|
|
56
|
+
await use(new MockServerWebhookProvider(API_URL, request));
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
const test = mergeTests(base, /* ...other fixtures... */ webhookFixture, webhookProviderFixture);
|
|
61
|
+
|
|
62
|
+
// MockServer has no delete-by-ID on log entries — use full-reset for explicit cleanup
|
|
63
|
+
test.use({ webhookConfig: { cleanupStrategy: 'full-reset' } });
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### Mockoon Provider
|
|
67
|
+
|
|
68
|
+
```typescript
|
|
69
|
+
import { MockoonWebhookProvider } from '@seontechnologies/playwright-utils/webhook';
|
|
70
|
+
|
|
71
|
+
const webhookProviderFixture = base.extend<{
|
|
72
|
+
webhookProvider: MockoonWebhookProvider;
|
|
73
|
+
}>({
|
|
74
|
+
webhookProvider: async ({ request }, use) => {
|
|
75
|
+
await use(new MockoonWebhookProvider(API_URL, request));
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
const test = mergeTests(base, /* ...other fixtures... */ webhookFixture, webhookProviderFixture);
|
|
80
|
+
|
|
81
|
+
// Mockoon has no delete-by-ID on log entries — use full-reset for explicit cleanup
|
|
82
|
+
test.use({ webhookConfig: { cleanupStrategy: 'full-reset' } });
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Cleanup Strategy Decision
|
|
86
|
+
|
|
87
|
+
| Strategy | Behaviour | When to choose |
|
|
88
|
+
| ------------------------ | ------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------- |
|
|
89
|
+
| `'full-reset'` (default) | Calls `provider.resetJournal()` — wipes the entire mock server journal | Safe only for serial execution or when each worker has an isolated provider instance |
|
|
90
|
+
| `'matched-only'` | Calls `provider.deleteById(id)` for each webhook matched by `waitFor`/`waitForCount` | Required for `fullyParallel: true` with a shared journal **when the provider supports `deleteById`** (e.g. WireMock) |
|
|
91
|
+
|
|
92
|
+
**The race condition under `fullyParallel: true`**: Worker A finishes and calls `resetJournal()`. Worker B is mid-poll waiting for its webhook. Worker A's reset just deleted Worker B's webhook — the poll times out with `WebhookTimeoutError`. Use `matched-only` to avoid this — but only when the provider supports `deleteById`.
|
|
93
|
+
|
|
94
|
+
**MockServer and Mockoon limitation**: Neither supports `deleteById` — their implementations are no-ops. The `startedAt` timestamp filter isolates _reads_ inside `waitFor`/`waitForCount`, but `cleanup()` with `full-reset` still calls `resetJournal()`, which wipes the entire journal. This means the teardown race exists for these providers too under `fullyParallel: true`. For parallel suites with MockServer or Mockoon, either run serially (`workers: 1`) or provision an isolated mock server instance per worker.
|
|
95
|
+
|
|
96
|
+
## Fixture Lifecycle
|
|
97
|
+
|
|
98
|
+
The fixture calls these in order:
|
|
99
|
+
|
|
100
|
+
1. `provider.setup?.()` — optional health check or stub registration
|
|
101
|
+
2. Tests run with `webhookRegistry` available
|
|
102
|
+
3. `registry.cleanup()` — deletes matched webhooks (`matched-only`) or resets journal (`full-reset`)
|
|
103
|
+
4. `provider.teardown?.()` — optional resource cleanup
|
|
104
|
+
|
|
105
|
+
Both cleanup and teardown failures are caught and logged as warnings — they don't mask actual test failures.
|
|
106
|
+
|
|
107
|
+
## WebhookRegistryConfig Options
|
|
108
|
+
|
|
109
|
+
```typescript
|
|
110
|
+
type WebhookRegistryConfig = {
|
|
111
|
+
defaultTimeout?: number; // default: 30000 ms
|
|
112
|
+
defaultInterval?: number; // default: 1000 ms
|
|
113
|
+
cleanupStrategy?: 'matched-only' | 'full-reset'; // default: 'full-reset'
|
|
114
|
+
};
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## Related Fragments
|
|
118
|
+
|
|
119
|
+
- `webhook-testing-fundamentals.md` — Why webhook tests are hard
|
|
120
|
+
- `webhook-template-matchers.md` — Template building and matcher patterns
|
|
121
|
+
- `webhook-providers.md` — WireMock, MockServer, Mockoon, custom provider details
|
|
122
|
+
- `fixtures-composition.md` — mergeTests pattern
|