ma-agents 3.12.2 → 3.13.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/bin/cli.js +11 -6
- package/docs/architecture.md +18 -0
- package/lib/bmad-cache/bmb/.claude-plugin/marketplace.json +1 -1
- package/lib/bmad-cache/bmb/_git_preserved/hooks/commit-msg.sample +52 -2
- package/lib/bmad-cache/bmb/_git_preserved/hooks/fsmonitor-watchman.sample +2 -8
- package/lib/bmad-cache/bmb/_git_preserved/index +0 -0
- package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-8f8b045fef5af6911495cf3b2a89f1ed75e120f7.idx +0 -0
- package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-8f8b045fef5af6911495cf3b2a89f1ed75e120f7.pack +0 -0
- package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-8f8b045fef5af6911495cf3b2a89f1ed75e120f7.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/shallow +1 -1
- package/lib/bmad-cache/bmb/package-lock.json +2 -2
- package/lib/bmad-cache/bmb/package.json +1 -1
- package/lib/bmad-cache/bmb/samples/bmad-agent-dream-weaver/assets/module-help.csv +1 -1
- package/lib/bmad-cache/bmb/samples/bmad-agent-dream-weaver/scripts/merge-config.py +33 -0
- package/lib/bmad-cache/bmb/samples/bmad-agent-dream-weaver/scripts/merge-help-csv.py +28 -0
- package/lib/bmad-cache/bmb/samples/sample-module-setup/assets/module-help.csv +1 -1
- package/lib/bmad-cache/bmb/samples/sample-module-setup/scripts/cleanup-legacy.py +28 -0
- package/lib/bmad-cache/bmb/samples/sample-module-setup/scripts/merge-config.py +33 -0
- package/lib/bmad-cache/bmb/samples/sample-module-setup/scripts/merge-help-csv.py +28 -0
- package/lib/bmad-cache/bmb/skills/bmad-bmb-setup/assets/module-help.csv +1 -1
- package/lib/bmad-cache/bmb/skills/bmad-bmb-setup/scripts/cleanup-legacy.py +28 -0
- package/lib/bmad-cache/bmb/skills/bmad-bmb-setup/scripts/merge-config.py +33 -0
- package/lib/bmad-cache/bmb/skills/bmad-bmb-setup/scripts/merge-help-csv.py +28 -0
- package/lib/bmad-cache/bmb/skills/bmad-eval-runner/assets/Dockerfile +29 -0
- package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/docker_setup.py +115 -0
- package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/generate_report.py +184 -0
- package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/pty_runner.py +171 -0
- package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/run_evals.py +492 -0
- package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/run_triggers.py +366 -0
- package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/utils.py +260 -0
- package/lib/bmad-cache/bmb/skills/bmad-module-builder/assets/setup-skill-template/assets/module-help.csv +1 -1
- package/lib/bmad-cache/bmb/skills/bmad-module-builder/assets/setup-skill-template/scripts/cleanup-legacy.py +28 -0
- package/lib/bmad-cache/bmb/skills/bmad-module-builder/assets/setup-skill-template/scripts/merge-config.py +33 -0
- package/lib/bmad-cache/bmb/skills/bmad-module-builder/assets/setup-skill-template/scripts/merge-help-csv.py +28 -0
- package/lib/bmad-cache/bmb/skills/bmad-module-builder/assets/standalone-module-template/merge-config.py +33 -0
- package/lib/bmad-cache/bmb/skills/bmad-module-builder/assets/standalone-module-template/merge-help-csv.py +28 -0
- package/lib/bmad-cache/bmb/skills/bmad-module-builder/scripts/tests/test-validate-module.py +74 -1
- package/lib/bmad-cache/bmb/skills/bmad-module-builder/scripts/validate-module.py +24 -13
- package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/assets/sample-customize-product-brief.toml +48 -33
- package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/extract-report-json.py +287 -0
- package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/generate-html-report.py +57 -8
- package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/prepass-prompt-metrics.py +7 -7
- package/lib/bmad-cache/bmb/skills/module-help.csv +1 -1
- package/lib/bmad-cache/bmb/website/public/img/eval-test-types.png +0 -0
- package/lib/bmad-cache/cache-manifest.json +17 -18
- package/lib/bmad-cache/cis/_git_preserved/hooks/commit-msg.sample +52 -2
- package/lib/bmad-cache/cis/_git_preserved/hooks/fsmonitor-watchman.sample +2 -8
- package/lib/bmad-cache/cis/_git_preserved/index +0 -0
- package/lib/bmad-cache/cis/_git_preserved/objects/pack/pack-18c8290560a98bcb7bf0676e6cc9b2ac5ca2823e.idx +0 -0
- package/lib/bmad-cache/cis/_git_preserved/objects/pack/{pack-42ffc048f54e58ce94c6331bc6be97ebbb7936f2.pack → pack-18c8290560a98bcb7bf0676e6cc9b2ac5ca2823e.pack} +0 -0
- package/lib/bmad-cache/cis/_git_preserved/objects/pack/pack-18c8290560a98bcb7bf0676e6cc9b2ac5ca2823e.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/refs/tags/v0.2.1 +1 -0
- package/lib/bmad-cache/cis/_git_preserved/shallow +1 -1
- package/lib/bmad-cache/cis/package-lock.json +2 -2
- package/lib/bmad-cache/cis/package.json +1 -1
- package/lib/bmad-cache/cis/src/module-help.csv +1 -1
- package/lib/bmad-cache/gds/.claude-plugin/marketplace.json +4 -7
- package/lib/bmad-cache/gds/README.md +3 -1
- package/lib/bmad-cache/gds/_git_preserved/hooks/commit-msg.sample +52 -2
- package/lib/bmad-cache/gds/_git_preserved/hooks/fsmonitor-watchman.sample +2 -8
- package/lib/bmad-cache/gds/_git_preserved/index +0 -0
- package/lib/bmad-cache/gds/_git_preserved/objects/pack/pack-dcb7c556d9bb6b6b70d2301e094eaac6d7300552.idx +0 -0
- package/lib/bmad-cache/gds/_git_preserved/objects/pack/{pack-9427a146a90c00bb542cba038874bf9671ba4dc0.pack → pack-dcb7c556d9bb6b6b70d2301e094eaac6d7300552.pack} +0 -0
- package/lib/bmad-cache/gds/_git_preserved/objects/pack/pack-dcb7c556d9bb6b6b70d2301e094eaac6d7300552.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-designer/customize.toml +5 -5
- package/lib/bmad-cache/gds/src/agents/gds-agent-game-dev/customize.toml +5 -5
- package/lib/bmad-cache/gds/src/agents/gds-agent-game-solo-dev/customize.toml +0 -5
- package/lib/bmad-cache/gds/src/module-help.csv +6 -12
- package/lib/bmad-cache/gds/src/module.yaml +1 -1
- package/lib/bmad-cache/gds/src/workflows/1-preproduction/gds-create-game-brief/customize.toml +97 -22
- package/lib/bmad-cache/gds/src/workflows/2-design/gds-gdd/assets/validation-report-template.html +190 -0
- package/lib/bmad-cache/gds/src/workflows/2-design/gds-gdd/customize.toml +99 -0
- package/lib/bmad-cache/gds/src/workflows/2-design/gds-gdd/scripts/render-validation-html.py +290 -0
- package/lib/bmad-cache/gds/src/workflows/2-design/gds-prd/assets/validation-report-template.html +190 -0
- package/lib/bmad-cache/gds/src/workflows/2-design/gds-prd/customize.toml +84 -0
- package/lib/bmad-cache/gds/src/workflows/2-design/gds-ux/assets/validation-report-template.html +319 -0
- package/lib/bmad-cache/gds/src/workflows/2-design/gds-ux/customize.toml +101 -0
- package/lib/bmad-cache/gds/src/workflows/3-technical/gds-game-architecture/architecture-patterns.yaml +1 -0
- package/lib/bmad-cache/gds/src/workflows/3-technical/gds-game-architecture/decision-catalog.yaml +88 -0
- package/lib/bmad-cache/gds/src/workflows/3-technical/gds-game-architecture/engine-mcps.yaml +124 -2
- package/lib/bmad-cache/gds/src/workflows/4-production/gds-investigate/customize.toml +62 -0
- package/lib/bmad-cache/tea/.claude-plugin/marketplace.json +1 -1
- package/lib/bmad-cache/tea/.github/workflows/docs.yaml +3 -3
- package/lib/bmad-cache/tea/.github/workflows/quality.yaml +10 -10
- package/lib/bmad-cache/tea/AGENTS.md +31 -0
- package/lib/bmad-cache/tea/CHANGELOG.md +42 -1
- package/lib/bmad-cache/tea/README.md +8 -5
- package/lib/bmad-cache/tea/_git_preserved/hooks/commit-msg.sample +52 -2
- package/lib/bmad-cache/tea/_git_preserved/hooks/fsmonitor-watchman.sample +2 -8
- package/lib/bmad-cache/tea/_git_preserved/index +0 -0
- package/lib/bmad-cache/tea/_git_preserved/objects/pack/pack-9e4197e37df7763dd7a05c2965ee921dfd2eb617.idx +0 -0
- package/lib/bmad-cache/tea/_git_preserved/objects/pack/{pack-f0df537f2649464ff6c5aee241165eb9c8664227.pack → pack-9e4197e37df7763dd7a05c2965ee921dfd2eb617.pack} +0 -0
- package/lib/bmad-cache/tea/_git_preserved/objects/pack/pack-9e4197e37df7763dd7a05c2965ee921dfd2eb617.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/refs/tags/v1.19.0 +1 -0
- package/lib/bmad-cache/tea/_git_preserved/shallow +1 -1
- package/lib/bmad-cache/tea/docs/explanation/engagement-models.md +15 -16
- package/lib/bmad-cache/tea/docs/explanation/knowledge-base-system.md +2 -0
- package/lib/bmad-cache/tea/docs/explanation/risk-based-testing.md +1 -1
- package/lib/bmad-cache/tea/docs/explanation/tea-overview.md +88 -52
- package/lib/bmad-cache/tea/docs/explanation/testing-as-engineering.md +13 -12
- package/lib/bmad-cache/tea/docs/glossary/index.md +2 -2
- package/lib/bmad-cache/tea/docs/how-to/brownfield/use-tea-for-enterprise.md +19 -18
- package/lib/bmad-cache/tea/docs/how-to/brownfield/use-tea-with-existing-tests.md +1 -1
- package/lib/bmad-cache/tea/docs/how-to/workflows/run-nfr-assess.md +32 -26
- package/lib/bmad-cache/tea/docs/how-to/workflows/run-test-design.md +20 -14
- package/lib/bmad-cache/tea/docs/how-to/workflows/run-trace.md +3 -3
- package/lib/bmad-cache/tea/docs/index.md +13 -11
- package/lib/bmad-cache/tea/docs/reference/commands.md +37 -13
- package/lib/bmad-cache/tea/docs/reference/knowledge-base.md +2 -2
- package/lib/bmad-cache/tea/package-lock.json +2 -2
- package/lib/bmad-cache/tea/package.json +1 -1
- package/lib/bmad-cache/tea/src/agents/bmad-tea/customize.toml +20 -15
- package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/confidence-gate.md +73 -0
- package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/test-quality.md +1 -0
- package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/tea-index.csv +2 -1
- package/lib/bmad-cache/tea/src/module-help.csv +2 -2
- package/lib/bmad-cache/tea/src/workflows/testarch/README.md +5 -4
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/data/role-paths.yaml +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/data/tea-resources-index.yaml +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/steps-c/step-04-session-01.md +2 -2
- 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/templates/certificate-template.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/tea-index.csv +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/tea-index.csv +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/tea-index.csv +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/tea-index.csv +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/SKILL.md +3 -3
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/checklist.md +11 -11
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/instructions.md +4 -2
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/nfr-report-template.md +5 -5
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/tea-index.csv +1 -1
- 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-01b-resume.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-02-define-thresholds.md +14 -3
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-04-evaluate-and-score.md +7 -7
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-04a-subagent-security.md +4 -4
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-04b-subagent-performance.md +4 -4
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-04c-subagent-reliability.md +4 -4
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-04d-subagent-scalability.md +4 -4
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-04e-aggregate-nfr.md +4 -4
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-05-generate-report.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/workflow-plan.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/workflow.yaml +3 -3
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/checklist.md +23 -3
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/tea-index.csv +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/steps-c/step-02-load-context.md +7 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/steps-c/step-03-risk-and-testability.md +16 -2
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/steps-c/step-04-coverage-plan.md +20 -4
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/steps-c/step-05-generate-output.md +2 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/test-design-architecture-template.md +17 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/test-design-qa-template.md +15 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/test-design-template.md +16 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/tea-index.csv +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/checklist.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/tea-index.csv +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/trace-template.md +1 -1
- package/lib/bmad-cache/tea/test/test-installation-components.js +49 -0
- package/lib/bmad-cache/tea/website/astro.config.mjs +2 -2
- package/lib/bmad-cache/wds/README.md +1 -1
- package/lib/bmad-cache/wds/_git_preserved/hooks/commit-msg.sample +52 -2
- package/lib/bmad-cache/wds/_git_preserved/hooks/fsmonitor-watchman.sample +2 -8
- package/lib/bmad-cache/wds/_git_preserved/index +0 -0
- package/lib/bmad-cache/wds/_git_preserved/objects/pack/pack-656c3d8d5426e73043b6a7f45eedaab74e3c419e.idx +0 -0
- package/lib/bmad-cache/wds/_git_preserved/objects/pack/{pack-96877c1c09123cccb1f91c1412184b11d2b492ad.pack → pack-656c3d8d5426e73043b6a7f45eedaab74e3c419e.pack} +0 -0
- package/lib/bmad-cache/wds/_git_preserved/objects/pack/pack-656c3d8d5426e73043b6a7f45eedaab74e3c419e.rev +0 -0
- package/lib/bmad-cache/wds/_git_preserved/packed-refs +1 -1
- package/lib/bmad-cache/wds/_git_preserved/refs/heads/main +1 -1
- package/lib/bmad-cache/wds/_git_preserved/refs/tags/v0.4.3 +1 -0
- package/lib/bmad-cache/wds/_git_preserved/shallow +1 -1
- package/lib/bmad-cache/wds/eslint.config.mjs +1 -1
- package/lib/bmad-cache/wds/package.json +1 -1
- package/lib/bmad-cache/wds/src/agents/wds-agent-freya-ux/customize.toml +80 -0
- package/lib/bmad-cache/wds/src/agents/wds-agent-mimir-builder/customize.toml +52 -0
- package/lib/bmad-cache/wds/src/agents/wds-agent-saga-analyst/customize.toml +70 -0
- package/lib/bmad-cache/wds/src/module-help.csv +19 -19
- package/lib/bmad-cache/wds/src/module.yaml +28 -0
- package/lib/bmad-cache/wds/src/scripts/README.md +155 -0
- package/lib/bmad-cache/wds/src/scripts/wds-add-object.js +202 -0
- package/lib/bmad-cache/wds/src/scripts/wds-add-spacing.js +158 -0
- package/lib/bmad-cache/wds/src/scripts/wds-init-page.js +229 -0
- package/lib/bmad-cache/wds/src/scripts/wds-init-scenario.js +120 -0
- package/lib/bmad-cache/wds/src/scripts/wds-nav.js +201 -0
- package/lib/bmad-cache/wds/src/scripts/wds-validate.js +301 -0
- package/lib/bmad-cache/wds/src/workflows/wds-3-scenarios/workflow.xml +450 -0
- package/lib/bmad-cache/wds/src/workflows/wds-4-ux-design/workflow-specify.xml +387 -0
- package/lib/bmad-extension/.claude-plugin/marketplace.json.template +1 -1
- package/lib/bmad-extension-plugin/.claude-plugin/marketplace.json +2 -2
- package/lib/bmad.js +91 -7
- package/lib/installer.js +28 -6
- package/lib/mil498-templates/OCD.md +169 -169
- package/lib/mil498-templates/README.md +4 -4
- package/lib/mil498-templates/SDD.md +163 -163
- package/lib/mil498-templates/SDP.md +307 -307
- package/lib/mil498-templates/SRS.md +219 -219
- package/lib/mil498-templates/SSDD.md +154 -154
- package/lib/mil498-templates/SSS.md +225 -225
- package/lib/mil498-templates/STD.md +188 -188
- package/lib/templates/instruction-block-git.template.md +25 -0
- package/package.json +5 -4
- package/scripts/build-bmad-cache.js +143 -42
- package/skills/git-workflow-skill/skill.json +21 -21
- package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-6ecd9fc6445b1281449c5ec49a6c5794708e662e.idx +0 -0
- package/lib/bmad-cache/bmb/_git_preserved/objects/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/refs/remotes/origin/HEAD +0 -1
- package/lib/bmad-cache/bmb/_git_preserved/refs/tags/v1.7.0 +0 -1
- package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/generate-convert-report.py +0 -406
- package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/tests/test_generate_convert_report.py +0 -243
- package/lib/bmad-cache/cis/_git_preserved/objects/pack/pack-42ffc048f54e58ce94c6331bc6be97ebbb7936f2.idx +0 -0
- package/lib/bmad-cache/cis/_git_preserved/objects/pack/pack-42ffc048f54e58ce94c6331bc6be97ebbb7936f2.rev +0 -0
- package/lib/bmad-cache/cis/_git_preserved/refs/remotes/origin/HEAD +0 -1
- package/lib/bmad-cache/gds/_git_preserved/objects/pack/pack-9427a146a90c00bb542cba038874bf9671ba4dc0.idx +0 -0
- package/lib/bmad-cache/gds/_git_preserved/objects/pack/pack-9427a146a90c00bb542cba038874bf9671ba4dc0.rev +0 -0
- package/lib/bmad-cache/gds/_git_preserved/refs/remotes/origin/HEAD +0 -1
- package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-gdd/customize.toml +0 -41
- package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-prd/customize.toml +0 -41
- package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-prd/data/domain-complexity.csv +0 -15
- package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-prd/data/project-types.csv +0 -11
- package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-ux-design/customize.toml +0 -41
- package/lib/bmad-cache/gds/src/workflows/2-design/gds-edit-gdd/customize.toml +0 -41
- package/lib/bmad-cache/gds/src/workflows/2-design/gds-edit-prd/customize.toml +0 -41
- package/lib/bmad-cache/gds/src/workflows/2-design/gds-validate-gdd/customize.toml +0 -41
- package/lib/bmad-cache/gds/src/workflows/2-design/gds-validate-prd/customize.toml +0 -41
- package/lib/bmad-cache/gds/src/workflows/2-design/gds-validate-prd/data/domain-complexity.csv +0 -15
- package/lib/bmad-cache/gds/src/workflows/2-design/gds-validate-prd/data/project-types.csv +0 -11
- package/lib/bmad-cache/tea/_git_preserved/objects/pack/pack-f0df537f2649464ff6c5aee241165eb9c8664227.idx +0 -0
- package/lib/bmad-cache/tea/_git_preserved/objects/pack/pack-f0df537f2649464ff6c5aee241165eb9c8664227.rev +0 -0
- package/lib/bmad-cache/tea/_git_preserved/refs/remotes/origin/HEAD +0 -1
- package/lib/bmad-cache/wds/_git_preserved/objects/pack/pack-96877c1c09123cccb1f91c1412184b11d2b492ad.idx +0 -0
- package/lib/bmad-cache/wds/_git_preserved/objects/pack/pack-96877c1c09123cccb1f91c1412184b11d2b492ad.rev +0 -0
- package/lib/bmad-cache/wds/_git_preserved/refs/remotes/origin/HEAD +0 -1
- package/lib/bmad-cache/wds/src/agents/wds-agent-freya-ux/bmad-skill-manifest.yaml +0 -12
- package/lib/bmad-cache/wds/src/agents/wds-agent-saga-analyst/bmad-skill-manifest.yaml +0 -12
- package/lib/bmad-cache/wds/src/workflows/wds-0-alignment-signoff/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/wds/src/workflows/wds-0-project-setup/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/wds/src/workflows/wds-1-project-brief/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/wds/src/workflows/wds-2-trigger-mapping/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/wds/src/workflows/wds-3-scenarios/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/wds/src/workflows/wds-4-ux-design/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/wds/src/workflows/wds-5-agentic-development/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/wds/src/workflows/wds-6-asset-generation/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/wds/src/workflows/wds-7-design-system/bmad-skill-manifest.yaml +0 -1
- package/lib/bmad-cache/wds/src/workflows/wds-8-product-evolution/bmad-skill-manifest.yaml +0 -1
- /package/lib/bmad-cache/gds/src/workflows/2-design/{gds-create-gdd → gds-gdd/assets}/game-types.csv +0 -0
- /package/lib/bmad-cache/gds/src/workflows/2-design/{gds-validate-gdd/data → gds-gdd/assets}/genre-complexity.csv +0 -0
|
@@ -339,9 +339,42 @@ def write_config(config: dict, config_path: str, verbose: bool = False) -> None:
|
|
|
339
339
|
)
|
|
340
340
|
|
|
341
341
|
|
|
342
|
+
def reject_unresolved_paths(named_paths: list[tuple[str, str]]) -> None:
|
|
343
|
+
"""Exit with a clear error if any path argument still contains the literal
|
|
344
|
+
``{project-root}`` token. That token is meaningful only inside config
|
|
345
|
+
values; filesystem path arguments must be resolved by the caller. Failing
|
|
346
|
+
loudly here prevents silently creating a junk ``{project-root}/`` directory.
|
|
347
|
+
"""
|
|
348
|
+
for name, value in named_paths:
|
|
349
|
+
if value and "{project-root}" in value:
|
|
350
|
+
print(
|
|
351
|
+
json.dumps(
|
|
352
|
+
{
|
|
353
|
+
"status": "error",
|
|
354
|
+
"error": (
|
|
355
|
+
f"Unresolved '{{project-root}}' token in {name} path: {value!r}. "
|
|
356
|
+
"Resolve '{project-root}' to the actual project root before running "
|
|
357
|
+
"this script — it is a filesystem path, not a config value."
|
|
358
|
+
),
|
|
359
|
+
},
|
|
360
|
+
indent=2,
|
|
361
|
+
),
|
|
362
|
+
file=sys.stderr,
|
|
363
|
+
)
|
|
364
|
+
sys.exit(1)
|
|
365
|
+
|
|
366
|
+
|
|
342
367
|
def main():
|
|
343
368
|
args = parse_args()
|
|
344
369
|
|
|
370
|
+
reject_unresolved_paths(
|
|
371
|
+
[
|
|
372
|
+
("--config-path", args.config_path),
|
|
373
|
+
("--user-config-path", args.user_config_path),
|
|
374
|
+
("--legacy-dir", args.legacy_dir),
|
|
375
|
+
]
|
|
376
|
+
)
|
|
377
|
+
|
|
345
378
|
# Load inputs
|
|
346
379
|
module_yaml = load_yaml_file(args.module_yaml)
|
|
347
380
|
if not module_yaml:
|
|
@@ -139,9 +139,37 @@ def cleanup_legacy_csvs(
|
|
|
139
139
|
return deleted
|
|
140
140
|
|
|
141
141
|
|
|
142
|
+
def reject_unresolved_paths(named_paths: list[tuple[str, str]]) -> None:
|
|
143
|
+
"""Exit with a clear error if any path argument still contains the literal
|
|
144
|
+
``{project-root}`` token. That token is meaningful only inside config
|
|
145
|
+
values; filesystem path arguments must be resolved by the caller. Failing
|
|
146
|
+
loudly here prevents silently creating a junk ``{project-root}/`` directory.
|
|
147
|
+
"""
|
|
148
|
+
for name, value in named_paths:
|
|
149
|
+
if value and "{project-root}" in value:
|
|
150
|
+
print(
|
|
151
|
+
json.dumps(
|
|
152
|
+
{
|
|
153
|
+
"status": "error",
|
|
154
|
+
"error": (
|
|
155
|
+
f"Unresolved '{{project-root}}' token in {name} path: {value!r}. "
|
|
156
|
+
"Resolve '{project-root}' to the actual project root before running "
|
|
157
|
+
"this script — it is a filesystem path, not a config value."
|
|
158
|
+
),
|
|
159
|
+
},
|
|
160
|
+
indent=2,
|
|
161
|
+
)
|
|
162
|
+
)
|
|
163
|
+
sys.exit(1)
|
|
164
|
+
|
|
165
|
+
|
|
142
166
|
def main():
|
|
143
167
|
args = parse_args()
|
|
144
168
|
|
|
169
|
+
reject_unresolved_paths(
|
|
170
|
+
[("--target", args.target), ("--legacy-dir", args.legacy_dir)]
|
|
171
|
+
)
|
|
172
|
+
|
|
145
173
|
# Read source entries
|
|
146
174
|
source_header, source_rows = read_csv_rows(args.source)
|
|
147
175
|
if not source_rows:
|
|
@@ -339,9 +339,42 @@ def write_config(config: dict, config_path: str, verbose: bool = False) -> None:
|
|
|
339
339
|
)
|
|
340
340
|
|
|
341
341
|
|
|
342
|
+
def reject_unresolved_paths(named_paths: list[tuple[str, str]]) -> None:
|
|
343
|
+
"""Exit with a clear error if any path argument still contains the literal
|
|
344
|
+
``{project-root}`` token. That token is meaningful only inside config
|
|
345
|
+
values; filesystem path arguments must be resolved by the caller. Failing
|
|
346
|
+
loudly here prevents silently creating a junk ``{project-root}/`` directory.
|
|
347
|
+
"""
|
|
348
|
+
for name, value in named_paths:
|
|
349
|
+
if value and "{project-root}" in value:
|
|
350
|
+
print(
|
|
351
|
+
json.dumps(
|
|
352
|
+
{
|
|
353
|
+
"status": "error",
|
|
354
|
+
"error": (
|
|
355
|
+
f"Unresolved '{{project-root}}' token in {name} path: {value!r}. "
|
|
356
|
+
"Resolve '{project-root}' to the actual project root before running "
|
|
357
|
+
"this script — it is a filesystem path, not a config value."
|
|
358
|
+
),
|
|
359
|
+
},
|
|
360
|
+
indent=2,
|
|
361
|
+
),
|
|
362
|
+
file=sys.stderr,
|
|
363
|
+
)
|
|
364
|
+
sys.exit(1)
|
|
365
|
+
|
|
366
|
+
|
|
342
367
|
def main():
|
|
343
368
|
args = parse_args()
|
|
344
369
|
|
|
370
|
+
reject_unresolved_paths(
|
|
371
|
+
[
|
|
372
|
+
("--config-path", args.config_path),
|
|
373
|
+
("--user-config-path", args.user_config_path),
|
|
374
|
+
("--legacy-dir", args.legacy_dir),
|
|
375
|
+
]
|
|
376
|
+
)
|
|
377
|
+
|
|
345
378
|
# Load inputs
|
|
346
379
|
module_yaml = load_yaml_file(args.module_yaml)
|
|
347
380
|
if not module_yaml:
|
|
@@ -139,9 +139,37 @@ def cleanup_legacy_csvs(
|
|
|
139
139
|
return deleted
|
|
140
140
|
|
|
141
141
|
|
|
142
|
+
def reject_unresolved_paths(named_paths: list[tuple[str, str]]) -> None:
|
|
143
|
+
"""Exit with a clear error if any path argument still contains the literal
|
|
144
|
+
``{project-root}`` token. That token is meaningful only inside config
|
|
145
|
+
values; filesystem path arguments must be resolved by the caller. Failing
|
|
146
|
+
loudly here prevents silently creating a junk ``{project-root}/`` directory.
|
|
147
|
+
"""
|
|
148
|
+
for name, value in named_paths:
|
|
149
|
+
if value and "{project-root}" in value:
|
|
150
|
+
print(
|
|
151
|
+
json.dumps(
|
|
152
|
+
{
|
|
153
|
+
"status": "error",
|
|
154
|
+
"error": (
|
|
155
|
+
f"Unresolved '{{project-root}}' token in {name} path: {value!r}. "
|
|
156
|
+
"Resolve '{project-root}' to the actual project root before running "
|
|
157
|
+
"this script — it is a filesystem path, not a config value."
|
|
158
|
+
),
|
|
159
|
+
},
|
|
160
|
+
indent=2,
|
|
161
|
+
)
|
|
162
|
+
)
|
|
163
|
+
sys.exit(1)
|
|
164
|
+
|
|
165
|
+
|
|
142
166
|
def main():
|
|
143
167
|
args = parse_args()
|
|
144
168
|
|
|
169
|
+
reject_unresolved_paths(
|
|
170
|
+
[("--target", args.target), ("--legacy-dir", args.legacy_dir)]
|
|
171
|
+
)
|
|
172
|
+
|
|
145
173
|
# Read source entries
|
|
146
174
|
source_header, source_rows = read_csv_rows(args.source)
|
|
147
175
|
if not source_rows:
|
|
@@ -12,7 +12,8 @@ from pathlib import Path
|
|
|
12
12
|
|
|
13
13
|
SCRIPT = Path(__file__).resolve().parent.parent / "validate-module.py"
|
|
14
14
|
|
|
15
|
-
CSV_HEADER = "module,skill,display-name,menu-code,description,action,args,phase,
|
|
15
|
+
CSV_HEADER = "module,skill,display-name,menu-code,description,action,args,phase,preceded-by,followed-by,required,output-location,outputs\n"
|
|
16
|
+
LEGACY_CSV_HEADER = "module,skill,display-name,menu-code,description,action,args,phase,after,before,required,output-location,outputs\n"
|
|
16
17
|
|
|
17
18
|
|
|
18
19
|
def create_module(tmp: Path, skills: list[str] | None = None, csv_rows: str = "",
|
|
@@ -162,6 +163,75 @@ def test_empty_csv():
|
|
|
162
163
|
assert len(empty) == 1
|
|
163
164
|
|
|
164
165
|
|
|
166
|
+
def test_canonical_header_accepted():
|
|
167
|
+
"""The canonical preceded-by/followed-by header must NOT produce a header finding."""
|
|
168
|
+
with tempfile.TemporaryDirectory() as tmp:
|
|
169
|
+
tmp = Path(tmp)
|
|
170
|
+
csv_rows = 'Test Module,tst-foo,Do Foo,DF,Does foo,run,,anytime,,,false,output_folder,report\n'
|
|
171
|
+
module_dir = create_module(tmp, skills=["tst-foo"], csv_rows=csv_rows)
|
|
172
|
+
|
|
173
|
+
code, data = run_validate(module_dir)
|
|
174
|
+
assert code == 0, f"expected a clean pass: {data}"
|
|
175
|
+
assert data["status"] == "pass"
|
|
176
|
+
header_findings = [f for f in data["findings"] if f["category"] == "csv-header"]
|
|
177
|
+
assert header_findings == [], f"unexpected header findings: {header_findings}"
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
def test_legacy_after_before_header_flagged():
|
|
181
|
+
"""A module-help.csv using the old after/before column names must be flagged as
|
|
182
|
+
a header mismatch — canonical is preceded-by/followed-by (matches the templates
|
|
183
|
+
and bmad-help). Regression for the CSV_HEADER drift in validate-module.py."""
|
|
184
|
+
with tempfile.TemporaryDirectory() as tmp:
|
|
185
|
+
tmp = Path(tmp)
|
|
186
|
+
module_dir = tmp / "module"
|
|
187
|
+
module_dir.mkdir()
|
|
188
|
+
setup = module_dir / "tst-setup"
|
|
189
|
+
setup.mkdir()
|
|
190
|
+
(setup / "SKILL.md").write_text("---\nname: tst-setup\n---\n# Setup\n")
|
|
191
|
+
(setup / "assets").mkdir()
|
|
192
|
+
(setup / "assets" / "module.yaml").write_text(
|
|
193
|
+
'code: tst\nname: "Test Module"\ndescription: "A test module"\n'
|
|
194
|
+
)
|
|
195
|
+
(setup / "assets" / "module-help.csv").write_text(
|
|
196
|
+
LEGACY_CSV_HEADER
|
|
197
|
+
+ 'Test Module,tst-foo,Do Foo,DF,Does foo,run,,anytime,,,false,output_folder,report\n'
|
|
198
|
+
)
|
|
199
|
+
(module_dir / "tst-foo").mkdir()
|
|
200
|
+
(module_dir / "tst-foo" / "SKILL.md").write_text("---\nname: tst-foo\n---\n# tst-foo\n")
|
|
201
|
+
|
|
202
|
+
code, data = run_validate(module_dir)
|
|
203
|
+
assert code == 1, f"expected fail (high-severity header finding): {data}"
|
|
204
|
+
assert data["status"] == "fail"
|
|
205
|
+
header_findings = [f for f in data["findings"] if f["category"] == "csv-header"]
|
|
206
|
+
assert len(header_findings) == 1, f"expected a csv-header finding: {data['findings']}"
|
|
207
|
+
msg = header_findings[0]["message"]
|
|
208
|
+
# missing the new names, has the legacy ones
|
|
209
|
+
assert "preceded-by" in msg and "followed-by" in msg
|
|
210
|
+
assert "after" in msg and "before" in msg
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
def test_short_row_does_not_crash():
|
|
214
|
+
"""A CSV row with fewer fields than the header must not crash the validator and
|
|
215
|
+
must be reported as a column-count mismatch. DictReader fills the missing
|
|
216
|
+
columns with None by default, so the validator's `.strip()` calls would raise
|
|
217
|
+
AttributeError on a short row — restval="" keeps them safe. Regression test."""
|
|
218
|
+
with tempfile.TemporaryDirectory() as tmp:
|
|
219
|
+
tmp = Path(tmp)
|
|
220
|
+
# Only 5 of the 13 columns present (the remaining 8 are missing entirely).
|
|
221
|
+
csv_rows = 'Test Module,tst-foo,Do Foo,DF,Does foo\n'
|
|
222
|
+
module_dir = create_module(tmp, skills=["tst-foo"], csv_rows=csv_rows)
|
|
223
|
+
|
|
224
|
+
code, data = run_validate(module_dir)
|
|
225
|
+
# Valid JSON with findings means the script completed instead of crashing
|
|
226
|
+
# with an uncaught traceback (which run_validate would surface as raw_*).
|
|
227
|
+
assert "findings" in data, f"validator crashed instead of reporting: {data}"
|
|
228
|
+
# A short row is a medium-severity finding: reported, but non-fatal.
|
|
229
|
+
assert code == 0 and data["status"] == "pass", f"expected non-fatal pass: {data}"
|
|
230
|
+
col_findings = [f for f in data["findings"] if f["category"] == "csv-columns"]
|
|
231
|
+
assert len(col_findings) == 1, f"expected a csv-columns finding: {data['findings']}"
|
|
232
|
+
assert "5 columns" in col_findings[0]["message"]
|
|
233
|
+
|
|
234
|
+
|
|
165
235
|
def create_standalone_module(tmp: Path, skill_name: str = "my-skill",
|
|
166
236
|
csv_rows: str = "", yaml_content: str = "",
|
|
167
237
|
include_setup_md: bool = True,
|
|
@@ -290,6 +360,9 @@ if __name__ == "__main__":
|
|
|
290
360
|
test_invalid_before_after_ref,
|
|
291
361
|
test_missing_yaml_fields,
|
|
292
362
|
test_empty_csv,
|
|
363
|
+
test_canonical_header_accepted,
|
|
364
|
+
test_legacy_after_before_header_flagged,
|
|
365
|
+
test_short_row_does_not_crash,
|
|
293
366
|
test_valid_standalone_module,
|
|
294
367
|
test_standalone_missing_module_setup_md,
|
|
295
368
|
test_standalone_missing_merge_scripts,
|
|
@@ -13,7 +13,7 @@ Performs deterministic structural checks:
|
|
|
13
13
|
- All skill folders have at least one capability entry in the CSV
|
|
14
14
|
- No orphan CSV entries pointing to nonexistent skills
|
|
15
15
|
- Menu codes are unique
|
|
16
|
-
-
|
|
16
|
+
- preceded-by/followed-by references point to real capability entries
|
|
17
17
|
- Required module.yaml fields are present
|
|
18
18
|
- CSV column count is consistent
|
|
19
19
|
"""
|
|
@@ -28,7 +28,7 @@ from pathlib import Path
|
|
|
28
28
|
REQUIRED_YAML_FIELDS = {"code", "name", "description"}
|
|
29
29
|
CSV_HEADER = [
|
|
30
30
|
"module", "skill", "display-name", "menu-code", "description",
|
|
31
|
-
"action", "args", "phase", "
|
|
31
|
+
"action", "args", "phase", "preceded-by", "followed-by", "required",
|
|
32
32
|
"output-location", "outputs",
|
|
33
33
|
]
|
|
34
34
|
|
|
@@ -77,12 +77,22 @@ def parse_yaml_minimal(text: str) -> dict[str, str]:
|
|
|
77
77
|
return result
|
|
78
78
|
|
|
79
79
|
|
|
80
|
-
def parse_csv_rows(csv_text: str) -> tuple[list[str], list[dict[str, str]]]:
|
|
81
|
-
"""Parse CSV text into header
|
|
82
|
-
|
|
80
|
+
def parse_csv_rows(csv_text: str) -> tuple[list[str], list[dict[str, str]], list[int]]:
|
|
81
|
+
"""Parse CSV text into (header, row dicts, raw column count per data row).
|
|
82
|
+
|
|
83
|
+
``restval=""`` fills missing trailing fields in a short row with empty strings
|
|
84
|
+
instead of ``None``, so downstream ``.strip()`` calls stay safe on malformed
|
|
85
|
+
rows. DictReader pads short rows to the header width, so ``len(row)`` cannot
|
|
86
|
+
reveal a field shortfall; the raw per-row column counts from ``csv.reader``
|
|
87
|
+
(blank lines skipped, to stay aligned with DictReader) are returned separately
|
|
88
|
+
for the column-count consistency check.
|
|
89
|
+
"""
|
|
90
|
+
reader = csv.DictReader(StringIO(csv_text), restval="")
|
|
83
91
|
header = reader.fieldnames or []
|
|
84
92
|
rows = list(reader)
|
|
85
|
-
|
|
93
|
+
raw_rows = list(csv.reader(StringIO(csv_text)))
|
|
94
|
+
col_counts = [len(r) for r in raw_rows[1:] if r != []]
|
|
95
|
+
return header, rows, col_counts
|
|
86
96
|
|
|
87
97
|
|
|
88
98
|
def validate(module_dir: Path, verbose: bool = False) -> dict:
|
|
@@ -163,7 +173,7 @@ def validate(module_dir: Path, verbose: bool = False) -> dict:
|
|
|
163
173
|
|
|
164
174
|
# 4. Parse and validate CSV
|
|
165
175
|
csv_text = (csv_dir / "assets" / "module-help.csv").read_text(encoding="utf-8")
|
|
166
|
-
header, rows = parse_csv_rows(csv_text)
|
|
176
|
+
header, rows, col_counts = parse_csv_rows(csv_text)
|
|
167
177
|
|
|
168
178
|
# Check header
|
|
169
179
|
if header != CSV_HEADER:
|
|
@@ -182,11 +192,12 @@ def validate(module_dir: Path, verbose: bool = False) -> dict:
|
|
|
182
192
|
|
|
183
193
|
info["csv_entries"] = len(rows)
|
|
184
194
|
|
|
185
|
-
# 5. Check column count consistency
|
|
195
|
+
# 5. Check column count consistency (using raw field counts: DictReader pads
|
|
196
|
+
# short rows to the header width, so len(row) alone can't detect a shortfall)
|
|
186
197
|
expected_cols = len(CSV_HEADER)
|
|
187
|
-
for i, row in enumerate(rows):
|
|
188
|
-
if
|
|
189
|
-
finding("medium", "csv-columns", f"Row {i + 2} has {
|
|
198
|
+
for i, (row, n_cols) in enumerate(zip(rows, col_counts)):
|
|
199
|
+
if n_cols != expected_cols:
|
|
200
|
+
finding("medium", "csv-columns", f"Row {i + 2} has {n_cols} columns, expected {expected_cols}",
|
|
190
201
|
f"skill={row.get('skill', '?')}")
|
|
191
202
|
|
|
192
203
|
# 6. Collect skills from CSV and filesystem
|
|
@@ -220,7 +231,7 @@ def validate(module_dir: Path, verbose: bool = False) -> dict:
|
|
|
220
231
|
if len(names) > 1:
|
|
221
232
|
finding("high", "duplicate-menu-code", f"Menu code '{code}' used by multiple entries: {', '.join(names)}")
|
|
222
233
|
|
|
223
|
-
# 10.
|
|
234
|
+
# 10. preceded-by/followed-by reference validation
|
|
224
235
|
# Build set of valid capability references (skill:action)
|
|
225
236
|
valid_refs = set()
|
|
226
237
|
for row in rows:
|
|
@@ -231,7 +242,7 @@ def validate(module_dir: Path, verbose: bool = False) -> dict:
|
|
|
231
242
|
|
|
232
243
|
for row in rows:
|
|
233
244
|
display = row.get("display-name", "?")
|
|
234
|
-
for field in ("
|
|
245
|
+
for field in ("preceded-by", "followed-by"):
|
|
235
246
|
value = row.get(field, "").strip()
|
|
236
247
|
if not value:
|
|
237
248
|
continue
|
package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/assets/sample-customize-product-brief.toml
CHANGED
|
@@ -1,51 +1,66 @@
|
|
|
1
|
-
# SAMPLE -- reference copy of bmad-product-brief's customize.toml (from bmm).
|
|
2
|
-
# Use as a worked example when lifting configurables during Configurability Discovery.
|
|
3
|
-
# This is NOT emitted into built skills; it's ground-truth reference for authors.
|
|
4
|
-
|
|
5
1
|
# DO NOT EDIT -- overwritten on every update.
|
|
6
2
|
#
|
|
7
|
-
# Workflow customization surface for bmad-product-brief.
|
|
8
|
-
#
|
|
3
|
+
# Workflow customization surface for bmad-product-brief.
|
|
4
|
+
#
|
|
5
|
+
# Override files (not edited here):
|
|
6
|
+
# {project-root}/_bmad/custom/bmad-product-brief.toml (team)
|
|
7
|
+
# {project-root}/_bmad/custom/bmad-product-brief.user.toml (personal)
|
|
9
8
|
|
|
10
9
|
[workflow]
|
|
11
10
|
|
|
12
11
|
# --- Configurable below. Overrides merge per BMad structural rules: ---
|
|
13
|
-
# scalars: override wins • arrays
|
|
14
|
-
# arrays-of-tables with `code`/`id`: replace matching items, append new ones.
|
|
12
|
+
# scalars: override wins • arrays: append
|
|
15
13
|
|
|
16
14
|
# Steps to run before the standard activation (config load, greet).
|
|
17
|
-
#
|
|
18
|
-
|
|
15
|
+
# Use for pre-flight loads, compliance checks, etc.
|
|
19
16
|
activation_steps_prepend = []
|
|
20
17
|
|
|
21
|
-
# Steps to run after greet but before
|
|
22
|
-
#
|
|
23
|
-
# once the user has been acknowledged.
|
|
24
|
-
|
|
18
|
+
# Steps to run after greet but before the workflow begins.
|
|
19
|
+
# Use for context-heavy setup that should happen once the user has been acknowledged.
|
|
25
20
|
activation_steps_append = []
|
|
26
21
|
|
|
27
22
|
# Persistent facts the workflow keeps in mind for the whole run
|
|
28
23
|
# (standards, compliance constraints, stylistic guardrails).
|
|
29
|
-
#
|
|
30
|
-
#
|
|
31
|
-
#
|
|
32
|
-
#
|
|
33
|
-
# - a
|
|
34
|
-
#
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
persistent_facts = [
|
|
38
|
-
"file:{project-root}/**/project-context.md",
|
|
39
|
-
]
|
|
24
|
+
# Each entry is either a literal sentence, a skill prefixed with `skill:`, or a `file:`-prefixed path/glob
|
|
25
|
+
# whose contents are loaded as facts.
|
|
26
|
+
# Default is empty. Common opt-ins (set in your team/user override TOML):
|
|
27
|
+
# "file:{project-root}/_bmad-output/planning-artifacts/project-context.md" # bmad-generate-project-context output
|
|
28
|
+
# "skill:acme-co:terms-and-conditions" # a skill that contains some relevant info to the documents that may be generated
|
|
29
|
+
# "Elvis has left the building" # generic agent instructions
|
|
30
|
+
persistent_facts = []
|
|
40
31
|
|
|
41
|
-
#
|
|
42
|
-
#
|
|
43
|
-
#
|
|
32
|
+
# Executed when the workflow completes (after the user has been told the
|
|
33
|
+
# brief is ready). Accepts either a string scalar (single instruction)
|
|
34
|
+
# or an array of instructions executed in order. Empty for none.
|
|
35
|
+
on_complete = ""
|
|
44
36
|
|
|
45
|
-
|
|
37
|
+
# Default brief structure. Treated as a starting point — the LLM adapts it
|
|
38
|
+
# to the product, purpose, and domain. Override the path in team/user TOML
|
|
39
|
+
# to enforce a different structure (e.g. regulated-industry, investor-deck).
|
|
40
|
+
brief_template = "assets/brief-template.md"
|
|
46
41
|
|
|
47
|
-
#
|
|
48
|
-
#
|
|
49
|
-
|
|
42
|
+
# Run folder location. The brief, optional addendum, and optional distillate
|
|
43
|
+
# all land inside `{output_dir}/{output_folder_name}/`.
|
|
44
|
+
output_dir = "{planning_artifacts}/briefs"
|
|
45
|
+
output_folder_name = "brief-{project_name}-{date}"
|
|
50
46
|
|
|
51
|
-
|
|
47
|
+
# Document standards applied to human-consumed docs at finalize. Each entry is
|
|
48
|
+
# a `skill:`, `file:`, or plain-text directive; the parent LLM applies the
|
|
49
|
+
# findings before the user sees the draft. Encodes standards, not options.
|
|
50
|
+
#
|
|
51
|
+
# Examples:
|
|
52
|
+
# "skill:bmad-editorial-review-prose"
|
|
53
|
+
# "file:{project-root}/_bmad/style-guides/company-voice.md"
|
|
54
|
+
# "Convert all dates to ISO 8601 format."
|
|
55
|
+
#
|
|
56
|
+
# Suggested order (broader passes first, narrower last):
|
|
57
|
+
# 1. Structural (cuts, reorganization, section sizing)
|
|
58
|
+
# 2. Content/voice/conventions (org standards, tone, terminology, compliance)
|
|
59
|
+
# 3. Prose mechanics (grammar, clarity, typos)
|
|
60
|
+
#
|
|
61
|
+
# Override the array in team/user TOML to add additional standards. Append-only:
|
|
62
|
+
# base entries cannot be removed or replaced (resolver has no removal mechanism).
|
|
63
|
+
doc_standards = [
|
|
64
|
+
"skill:bmad-editorial-review-structure",
|
|
65
|
+
"skill:bmad-editorial-review-prose",
|
|
66
|
+
]
|