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
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# DO NOT EDIT -- overwritten on every update.
|
|
2
|
+
#
|
|
3
|
+
# Saga, the WDS Analyst, is the hardcoded identity of this agent.
|
|
4
|
+
# Customize the persona and menu below to shape behavior without
|
|
5
|
+
# changing who the agent is.
|
|
6
|
+
|
|
7
|
+
[agent]
|
|
8
|
+
# non-configurable skill frontmatter, create a custom agent if you need a new name/title
|
|
9
|
+
name = "Saga"
|
|
10
|
+
title = "WDS Analyst"
|
|
11
|
+
|
|
12
|
+
# --- Configurable below. Overrides merge per BMad structural rules: ---
|
|
13
|
+
# scalars: override wins • arrays (persistent_facts, principles, activation_steps_*): append
|
|
14
|
+
# arrays-of-tables with `code`/`id`: replace matching items, append new ones.
|
|
15
|
+
|
|
16
|
+
icon = "📚"
|
|
17
|
+
|
|
18
|
+
activation_steps_prepend = []
|
|
19
|
+
activation_steps_append = []
|
|
20
|
+
|
|
21
|
+
persistent_facts = [
|
|
22
|
+
"file:{project-root}/**/project-context.md",
|
|
23
|
+
]
|
|
24
|
+
|
|
25
|
+
role = "Strategic Business Analyst + Product Discovery Partner"
|
|
26
|
+
identity = "Saga, goddess of stories and wisdom. Treats analysis like a treasure hunt — excited by clues, thrilled by patterns. Builds understanding through conversation, not interrogation. Creates the North Star documents (Product Brief + Trigger Map) that coordinate all teams from vision to delivery."
|
|
27
|
+
communication_style = "Asks questions that spark 'aha!' moments while structuring insights with precision. Listens deeply, reflects back naturally, confirms understanding before moving forward. Professional, direct, efficient — analysis feels like working with a skilled colleague."
|
|
28
|
+
|
|
29
|
+
principles = [
|
|
30
|
+
"Domain: Phases 1 (Product Brief), 2 (Trigger Mapping). Hand over other domains to specialist agents.",
|
|
31
|
+
"Replaces BMM Mary (Analyst) when WDS is installed.",
|
|
32
|
+
"Discovery through conversation — one question at a time, listen deeply.",
|
|
33
|
+
"Connect business goals to user psychology through trigger mapping.",
|
|
34
|
+
"Alliterative persona names for user archetypes (e.g. Harriet the Hairdresser).",
|
|
35
|
+
"Load micro-guides when entering workflows: discovery-conversation.md, trigger-mapping.md, strategic-documentation.md, dream-up-approach.md",
|
|
36
|
+
"When generating artifacts (not pure discovery), offer Dream Up mode selection: Workshop, Suggest, or Dream.",
|
|
37
|
+
"In Suggest/Dream modes: extract context from prior phases, load quality standards, execute self-review generation loop.",
|
|
38
|
+
"HARM: Producing output that looks complete but doesn't follow the template. The user must then correct what should have been right — wasting time, money, and trust. Plausible-looking wrong output is worse than no output. Custom formats break the pipeline for every phase downstream.",
|
|
39
|
+
"HELP: Reading the actual template into context before writing. Discussing decisions with the user. Delivering artifacts that the next phase can consume without auditing. The user's time goes to decisions, not corrections.",
|
|
40
|
+
]
|
|
41
|
+
|
|
42
|
+
[[agent.menu]]
|
|
43
|
+
code = "AS"
|
|
44
|
+
description = "Alignment & Signoff: Secure stakeholder alignment before starting the project (Phase 0)"
|
|
45
|
+
skill = "bmad-wds-alignment"
|
|
46
|
+
|
|
47
|
+
[[agent.menu]]
|
|
48
|
+
code = "PB"
|
|
49
|
+
description = "Product Brief: Create comprehensive product brief with strategic foundation (Phase 1)"
|
|
50
|
+
skill = "bmad-wds-project-brief"
|
|
51
|
+
|
|
52
|
+
[[agent.menu]]
|
|
53
|
+
code = "TM"
|
|
54
|
+
description = "Trigger Mapping: Create trigger map with user psychology and business goals (Phase 2)"
|
|
55
|
+
skill = "bmad-wds-trigger-mapping"
|
|
56
|
+
|
|
57
|
+
[[agent.menu]]
|
|
58
|
+
code = "BP"
|
|
59
|
+
description = "Brainstorm Project: Guided brainstorming session to explore project vision and goals"
|
|
60
|
+
skill = "bmad-brainstorming"
|
|
61
|
+
|
|
62
|
+
[[agent.menu]]
|
|
63
|
+
code = "RS"
|
|
64
|
+
description = "Research: Conduct market, domain, competitive, or technical research"
|
|
65
|
+
skill = "bmad-market-research"
|
|
66
|
+
|
|
67
|
+
[[agent.menu]]
|
|
68
|
+
code = "DP"
|
|
69
|
+
description = "Document Project: Analyze existing project to produce useful documentation (brownfield projects)"
|
|
70
|
+
skill = "bmad-document-project"
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
module,skill,display-name,menu-code,description,action,args,phase,
|
|
2
|
-
Web Design Studio,bmad-wds-idun,Wake Idun,IDUN,Setup and governance agent. Interviews org to configure Agent Space and authority model
|
|
3
|
-
Web Design Studio,bmad-wds-saga,Wake Saga,SAGA,Strategic Analyst agent for Phases 1-2. Scans repos and offers next steps
|
|
4
|
-
Web Design Studio,bmad-wds-freya,Wake Freya,FREYA,UX Designer agent for Phases 3-4. Checks prerequisites and offers next steps
|
|
5
|
-
Web Design Studio,bmad-wds-alignment,Alignment & Signoff,AS,Stakeholder buy-in pitch and service agreement. Skip if building your own product
|
|
6
|
-
Web Design Studio,bmad-wds-project-brief,Project Brief,PB,Define product vision positioning and success criteria. Every design decision traces back to this
|
|
7
|
-
Web Design Studio,bmad-wds-trigger-mapping,Trigger Mapping,TM,Map business goals to user psychology. Create personas and score features against driving forces
|
|
8
|
-
Web Design Studio,bmad-wds-platform-requirements,Platform Requirements,PR,Technical boundaries: platforms devices integrations constraints. Skip for simple landing pages
|
|
9
|
-
Web Design Studio,bmad-wds-outline-scenarios,Outline Scenarios,OS,Define user journeys as persona+goal+outcome. Each connects to a Trigger Map driving force
|
|
10
|
-
Web Design Studio,bmad-wds-conceptual-sketching,Conceptual Sketching,CS,Fast rough visual exploration before detailed specification. Skip for straightforward scenarios
|
|
11
|
-
Web Design Studio,bmad-wds-storyboarding,Storyboarding,SB,Sequence the user journey through screens with entry points transitions and error paths. Skip for simple scenarios
|
|
12
|
-
Web Design Studio,bmad-wds-conceptual-specs,Conceptual Specifications,SP,Document every design decision for every element on every page. Developers build directly from this
|
|
13
|
-
Web Design Studio,bmad-wds-functional-components,Functional Components,FI,Extract reusable patterns from specs into component definitions. Skip if Design System Mode None
|
|
14
|
-
Web Design Studio,bmad-wds-visual-design,Visual Design,VD,Transform specs into styled HTML prototypes with Figma round-trips
|
|
15
|
-
Web Design Studio,bmad-wds-design-system,Design System,DS,Manage component library and design tokens. Skip if Design System Mode None
|
|
16
|
-
Web Design Studio,bmad-wds-design-delivery,Design Delivery,DD,Validate specs are complete and package as DD yaml files for development handoff
|
|
17
|
-
Web Design Studio,bmad-wds-agentic-development,Agentic Development,AD,Iterative build-verify cycle with design log tracking and browser verification
|
|
18
|
-
Web Design Studio,bmad-wds-usability-testing,Acceptance Testing,AT,Test on real users in their environment with retrospective think-aloud sessions
|
|
19
|
-
Web Design Studio,bmad-wds-product-evolution,Product Evolution,PE,Continuous improvement: feedback to Trigger Map to spec update to code to verify
|
|
1
|
+
module,skill,display-name,menu-code,description,action,args,phase,preceded-by,followed-by,required,output-location,outputs
|
|
2
|
+
Web Design Studio,bmad-wds-idun,Wake Idun,IDUN,Setup and governance agent. Interviews org to configure Agent Space and authority model.,,,0-wds-agents,,,false,,
|
|
3
|
+
Web Design Studio,bmad-wds-saga,Wake Saga,SAGA,Strategic Analyst agent for Phases 1-2. Scans repos and offers next steps.,,,0-wds-agents,,,false,,
|
|
4
|
+
Web Design Studio,bmad-wds-freya,Wake Freya,FREYA,UX Designer agent for Phases 3-4. Checks prerequisites and offers next steps.,,,0-wds-agents,,,false,,
|
|
5
|
+
Web Design Studio,bmad-wds-alignment,Alignment & Signoff,AS,Stakeholder buy-in pitch and service agreement. Skip if building your own product.,,,0-wds-pitch,,,false,design_artifacts/A-Product-Brief,pitch service-agreement signoff
|
|
6
|
+
Web Design Studio,bmad-wds-project-brief,Project Brief,PB,Define product vision positioning and success criteria. Every design decision traces back to this.,,,1-wds-strategy,,,true,design_artifacts/A-Product-Brief,project-brief.md
|
|
7
|
+
Web Design Studio,bmad-wds-trigger-mapping,Trigger Mapping,TM,Map business goals to user psychology. Create personas and score features against driving forces.,,,1-wds-strategy,bmad-wds-project-brief,,true,design_artifacts/B-Trigger-Map,trigger-map.md personas/ feature-impact-analysis.md
|
|
8
|
+
Web Design Studio,bmad-wds-platform-requirements,Platform Requirements,PR,Technical boundaries: platforms devices integrations constraints. Skip for simple landing pages.,,,1-wds-strategy,bmad-wds-project-brief,,false,design_artifacts/A-Product-Brief,platform-requirements.md
|
|
9
|
+
Web Design Studio,bmad-wds-outline-scenarios,Outline Scenarios,OS,Define user journeys as persona+goal+outcome. Each connects to a Trigger Map driving force.,,,2-wds-design,bmad-wds-trigger-mapping,,true,design_artifacts/C-UX-Scenarios,scenario-overview.md
|
|
10
|
+
Web Design Studio,bmad-wds-conceptual-sketching,Conceptual Sketching,CS,Fast rough visual exploration before detailed specification. Skip for straightforward scenarios.,,,2-wds-design,bmad-wds-outline-scenarios,,false,design_artifacts/C-UX-Scenarios,sketches
|
|
11
|
+
Web Design Studio,bmad-wds-storyboarding,Storyboarding,SB,Sequence the user journey through screens with entry points transitions and error paths. Skip for simple scenarios.,,,2-wds-design,bmad-wds-outline-scenarios,,false,design_artifacts/C-UX-Scenarios,storyboards
|
|
12
|
+
Web Design Studio,bmad-wds-conceptual-specs,Conceptual Specifications,SP,Document every design decision for every element on every page. Developers build directly from this.,,,2-wds-design,bmad-wds-outline-scenarios,,true,design_artifacts/C-UX-Scenarios,page-specs scenario-specs
|
|
13
|
+
Web Design Studio,bmad-wds-functional-components,Functional Components,FI,Extract reusable patterns from specs into component definitions. Skip if Design System Mode None.,,,2-wds-design,bmad-wds-conceptual-specs,,false,design_artifacts/C-UX-Scenarios,component-candidates
|
|
14
|
+
Web Design Studio,bmad-wds-visual-design,Visual Design,VD,Transform specs into styled HTML prototypes with Figma round-trips.,,,2-wds-design,bmad-wds-conceptual-specs,,false,design_artifacts/C-UX-Scenarios,html-prototypes visual-designs
|
|
15
|
+
Web Design Studio,bmad-wds-design-system,Design System,DS,Manage component library and design tokens. Skip if Design System Mode None.,,,2-wds-design,bmad-wds-functional-components,,false,design_artifacts/D-Design-System,components/ design-tokens.md
|
|
16
|
+
Web Design Studio,bmad-wds-design-delivery,Design Delivery,DD,Validate specs are complete and package as DD yaml files for development handoff.,,,2-wds-design,bmad-wds-conceptual-specs,,true,design_artifacts/E-Development,delivery-package acceptance-criteria
|
|
17
|
+
Web Design Studio,bmad-wds-agentic-development,Agentic Development,AD,Iterative build-verify cycle with design log tracking and browser verification.,,,3-wds-build,bmad-wds-design-delivery,,false,_progress/agent-experiences,experience-documents
|
|
18
|
+
Web Design Studio,bmad-wds-usability-testing,Acceptance Testing,AT,Test on real users in their environment with retrospective think-aloud sessions.,,,3-wds-build,bmad-wds-agentic-development,,false,design_artifacts/E-Development,test-results findings
|
|
19
|
+
Web Design Studio,bmad-wds-product-evolution,Product Evolution,PE,Continuous improvement: feedback to Trigger Map to spec update to code to verify.,,,3-wds-build,bmad-wds-usability-testing,,false,design_artifacts,updated-artifacts
|
|
@@ -127,6 +127,34 @@ directories:
|
|
|
127
127
|
- "{design_artifacts}"
|
|
128
128
|
- "{project_knowledge}"
|
|
129
129
|
|
|
130
|
+
# Agent roster — essence only. External skills (party-mode, retrospective,
|
|
131
|
+
# advanced-elicitation, help catalog) read these descriptors to route, display,
|
|
132
|
+
# and embody agents. Full persona and behavior live in each agent's
|
|
133
|
+
# customize.toml. `team` controls which named team(s) an agent belongs to;
|
|
134
|
+
# users can add their own agents (real or fictional) via
|
|
135
|
+
# _bmad/custom/config.toml or _bmad/custom/config.user.toml.
|
|
136
|
+
agents:
|
|
137
|
+
- code: wds-agent-freya-ux
|
|
138
|
+
name: Freya
|
|
139
|
+
title: WDS Designer
|
|
140
|
+
icon: "🎨"
|
|
141
|
+
team: ux-design
|
|
142
|
+
description: "Norse goddess of beauty, magic, and strategy, thinks WITH you not FOR you, starts with WHY before HOW — design without strategy is decoration, creates artifacts developers can trust: detailed specs, prototypes, and design systems. Speaks as a creative collaborator with strategic depth — asks WHY? before WHAT?, explores one challenge deeply rather than skimming many, leads with decisions and follows with rationale."
|
|
143
|
+
|
|
144
|
+
- code: wds-agent-saga-analyst
|
|
145
|
+
name: Saga
|
|
146
|
+
title: WDS Analyst
|
|
147
|
+
icon: "📚"
|
|
148
|
+
team: ux-design
|
|
149
|
+
description: "Goddess of stories and wisdom, treats analysis like a treasure hunt — excited by clues, thrilled by patterns, builds understanding through conversation not interrogation, creates the North Star documents (Product Brief + Trigger Map). Asks questions that spark aha! moments while structuring insights with precision — listens deeply, reflects back naturally, confirms understanding before moving forward."
|
|
150
|
+
|
|
151
|
+
- code: wds-agent-mimir-builder
|
|
152
|
+
name: Mimir
|
|
153
|
+
title: WDS Builder
|
|
154
|
+
icon: "🔨"
|
|
155
|
+
team: ux-design
|
|
156
|
+
description: "God of wisdom and deep knowledge — the well beneath the world tree. Implementation agent who owns the tech audit, the PRD, and the build loop. Methodical, precise, empirical. Reads Freya's Work Orders, writes formal requirements, and implements them one atomic verified task at a time. Reads the spec completely before writing a line of code. Plans before acting. Verifies before moving on."
|
|
157
|
+
|
|
130
158
|
# WDS folder structure to create within design_artifacts directory
|
|
131
159
|
wds_folders:
|
|
132
160
|
- A-Product-Brief
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
# WDS Scaffold Scripts
|
|
2
|
+
|
|
3
|
+
Node.js scripts that enforce deterministic output from AI agents. Agents provide content via CLI flags; scripts produce structure.
|
|
4
|
+
|
|
5
|
+
All scripts use only Node.js stdlib (no external dependencies). Run from the project root.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Scripts
|
|
10
|
+
|
|
11
|
+
### `wds-init-scenario.js` — Initialize a scenario
|
|
12
|
+
|
|
13
|
+
Creates the scenario folder and a README index file.
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
node src/scripts/wds-init-scenario.js \
|
|
17
|
+
--scenario "01 New User Onboarding" \
|
|
18
|
+
--description "New user first visit to account creation"
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Output: `C-UX-Scenarios/01-new-user-onboarding/README.md`
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
### `wds-init-page.js` — Initialize a page spec
|
|
26
|
+
|
|
27
|
+
Creates a new page spec file with all required sections pre-filled with placeholders.
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
node src/scripts/wds-init-page.js \
|
|
31
|
+
--page "01 Start" \
|
|
32
|
+
--scenario "01 New User Onboarding" \
|
|
33
|
+
--platform "Mobile web" \
|
|
34
|
+
--visibility "Public"
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Output:
|
|
38
|
+
- `C-UX-Scenarios/01-new-user-onboarding/01-start/01-start.md`
|
|
39
|
+
- `C-UX-Scenarios/01-new-user-onboarding/01-start/sketches/`
|
|
40
|
+
|
|
41
|
+
After creating all pages in a scenario, run `wds-nav.js` to wire up navigation links.
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
### `wds-nav.js` — Update navigation links
|
|
46
|
+
|
|
47
|
+
Scans pages in a scenario (sorted by name) and writes correct prev/next navigation rows into each page spec.
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
# One scenario
|
|
51
|
+
node src/scripts/wds-nav.js --scenario "01 New User Onboarding"
|
|
52
|
+
|
|
53
|
+
# All scenarios
|
|
54
|
+
node src/scripts/wds-nav.js --all
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Run this after adding or removing pages, or after reordering page numbers.
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
### `wds-add-object.js` — Append an object spec
|
|
62
|
+
|
|
63
|
+
Appends a structured object spec block to a page spec under a named section.
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
node src/scripts/wds-add-object.js \
|
|
67
|
+
--page "C-UX-Scenarios/01-new-user-onboarding/01-start/01-start.md" \
|
|
68
|
+
--section "Hero" \
|
|
69
|
+
--object "Primary Headline" \
|
|
70
|
+
--component "H1 heading" \
|
|
71
|
+
--se "Välkommen" \
|
|
72
|
+
--en "Welcome" \
|
|
73
|
+
--behavior "Static display"
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Object ID is auto-derived: `start-hero-primary-headline`
|
|
77
|
+
|
|
78
|
+
The section heading (`### Section: Hero`) is created if it doesn't already exist.
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
### `wds-add-spacing.js` — Append a spacing object
|
|
83
|
+
|
|
84
|
+
Appends a spacing notation entry to the `## Spacing` section of a page spec.
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
node src/scripts/wds-add-spacing.js \
|
|
88
|
+
--page "C-UX-Scenarios/01-new-user-onboarding/01-start/01-start.md" \
|
|
89
|
+
--direction v \
|
|
90
|
+
--type space \
|
|
91
|
+
--size xl \
|
|
92
|
+
--reason "major section boundary between hero and features"
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Valid directions: `v` (vertical), `h` (horizontal)
|
|
96
|
+
Valid types: `space`, `separator`, `line`
|
|
97
|
+
Valid sizes: `zero`, `sm`, `md`, `lg`, `xl`, `2xl`, `3xl`, `flex`
|
|
98
|
+
|
|
99
|
+
Spacing ID is auto-derived: `start-v-space-xl`
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
### `wds-validate.js` — Validate page specs
|
|
104
|
+
|
|
105
|
+
Checks page spec files for structural correctness.
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
# Single page
|
|
109
|
+
node src/scripts/wds-validate.js \
|
|
110
|
+
--page "C-UX-Scenarios/01-new-user-onboarding/01-start/01-start.md"
|
|
111
|
+
|
|
112
|
+
# All pages in a scenario
|
|
113
|
+
node src/scripts/wds-validate.js --scenario "01 New User Onboarding"
|
|
114
|
+
|
|
115
|
+
# All scenarios
|
|
116
|
+
node src/scripts/wds-validate.js --all
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
Validates:
|
|
120
|
+
- Required sections present
|
|
121
|
+
- Object IDs are kebab-case with correct page prefix
|
|
122
|
+
- No duplicate Object IDs
|
|
123
|
+
- Navigation rows (3 expected)
|
|
124
|
+
- Metadata table has all required properties
|
|
125
|
+
- Sketches folder exists
|
|
126
|
+
- SE + EN content present for each object
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## How agents use these scripts
|
|
131
|
+
|
|
132
|
+
1. Agent calls `wds-init-scenario.js` with scenario name and description
|
|
133
|
+
2. Agent calls `wds-init-page.js` for each page in the scenario
|
|
134
|
+
3. Agent calls `wds-nav.js` to wire navigation after all pages exist
|
|
135
|
+
4. Agent calls `wds-add-object.js` for each UI object, providing Swedish and English content
|
|
136
|
+
5. Agent calls `wds-add-spacing.js` for each spacing decision
|
|
137
|
+
6. Agent calls `wds-validate.js` to confirm the spec is structurally correct before handoff
|
|
138
|
+
|
|
139
|
+
The agent never writes raw markdown — it only supplies content as flag values. The scripts own all structural decisions.
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## File location convention
|
|
144
|
+
|
|
145
|
+
```
|
|
146
|
+
C-UX-Scenarios/
|
|
147
|
+
{scenario-slug}/
|
|
148
|
+
README.md
|
|
149
|
+
{page-slug}/
|
|
150
|
+
{page-slug}.md
|
|
151
|
+
sketches/
|
|
152
|
+
{page-slug}-concept.jpg
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
Example: `C-UX-Scenarios/01-new-user-onboarding/02-signup/02-signup.md`
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
// wds-add-object.js — WDS scaffold: append an object spec block to a page spec file
|
|
2
|
+
// Usage: node src/scripts/wds-add-object.js --page "C-UX-Scenarios/01-onboarding/01-start/01-start.md" \
|
|
3
|
+
// --section "Hero" --object "Primary Headline" --component "H1 heading" \
|
|
4
|
+
// --se "Välkommen" --en "Welcome"
|
|
5
|
+
|
|
6
|
+
'use strict';
|
|
7
|
+
|
|
8
|
+
const fs = require('node:fs');
|
|
9
|
+
const path = require('node:path');
|
|
10
|
+
|
|
11
|
+
function parseArgs(argv) {
|
|
12
|
+
const args = {};
|
|
13
|
+
for (let i = 0; i < argv.length; i++) {
|
|
14
|
+
if (argv[i].startsWith('--')) {
|
|
15
|
+
const key = argv[i].slice(2);
|
|
16
|
+
const value = argv[i + 1] && !argv[i + 1].startsWith('--') ? argv[i + 1] : true;
|
|
17
|
+
args[key] = value;
|
|
18
|
+
if (value !== true) i++;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return args;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function toSlug(str) {
|
|
25
|
+
return str.toLowerCase().replaceAll(/\s+/g, '-');
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function printUsage() {
|
|
29
|
+
process.stdout.write(
|
|
30
|
+
[
|
|
31
|
+
'Usage: node src/scripts/wds-add-object.js --page <path> --section <name> --object <name> [options]',
|
|
32
|
+
'',
|
|
33
|
+
'Required:',
|
|
34
|
+
' --page Path to the page spec .md file',
|
|
35
|
+
' --section Section name (e.g. "Hero")',
|
|
36
|
+
' --object Object name (e.g. "Primary Headline")',
|
|
37
|
+
'',
|
|
38
|
+
'Optional:',
|
|
39
|
+
' --component Component name (default: "—")',
|
|
40
|
+
' --translation Translation key (auto-derived if omitted)',
|
|
41
|
+
' --se Swedish text content',
|
|
42
|
+
' --en English text content',
|
|
43
|
+
' --behavior Behavior description (e.g. "onClick: submit form")',
|
|
44
|
+
' --component-path Path to component file (default: "—")',
|
|
45
|
+
'',
|
|
46
|
+
].join('\n'),
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Derive page slug from file path: "01-start/01-start.md" -> "01-start"
|
|
51
|
+
function pageSlugFromPath(filePath) {
|
|
52
|
+
const base = path.basename(filePath, '.md');
|
|
53
|
+
return base;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Derive Object ID: pageSlug + sectionSlug + objectSlug
|
|
57
|
+
// e.g. page=01-start, section=Hero, object=Primary Headline -> 01-start-hero-primary-headline
|
|
58
|
+
function deriveObjectId(pageSlug, sectionName, objectName) {
|
|
59
|
+
// Strip leading page number from pageSlug for ID prefix
|
|
60
|
+
// "01-start" -> "start", "02-signup" -> "signup"
|
|
61
|
+
const slugParts = pageSlug.split('-');
|
|
62
|
+
const pagePrefix = slugParts.length > 1 ? slugParts.slice(1).join('-') : pageSlug;
|
|
63
|
+
const sectionSlug = toSlug(sectionName);
|
|
64
|
+
const objectSlug = toSlug(objectName);
|
|
65
|
+
return `${pagePrefix}-${sectionSlug}-${objectSlug}`;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function buildObjectBlock({ objectName, objectId, component, componentPath, translationKey, se, en, behavior }) {
|
|
69
|
+
const compDisplay = componentPath && componentPath !== '—' ? `[${component}](${componentPath})` : component || '—';
|
|
70
|
+
|
|
71
|
+
const lines = [
|
|
72
|
+
`#### ${objectName}`,
|
|
73
|
+
'',
|
|
74
|
+
`**OBJECT ID:** \`${objectId}\``,
|
|
75
|
+
'',
|
|
76
|
+
'| Property | Value |',
|
|
77
|
+
'|----------|-------|',
|
|
78
|
+
`| Component | ${compDisplay} |`,
|
|
79
|
+
`| Translation Key | \`${translationKey}\` |`,
|
|
80
|
+
`| SE | "${se || '—'}" |`,
|
|
81
|
+
`| EN | "${en || '—'}" |`,
|
|
82
|
+
`| Behavior | ${behavior || '—'} |`,
|
|
83
|
+
'',
|
|
84
|
+
];
|
|
85
|
+
|
|
86
|
+
return lines.join('\n');
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Insert content after a section heading. Creates the section heading if it doesn't exist.
|
|
90
|
+
function insertUnderSection(content, sectionHeading, objectBlock) {
|
|
91
|
+
const lines = content.split('\n');
|
|
92
|
+
const headingLine = `### Section: ${sectionHeading}`;
|
|
93
|
+
const headingIdx = lines.findIndex((l) => l.trim() === headingLine);
|
|
94
|
+
|
|
95
|
+
if (headingIdx === -1) {
|
|
96
|
+
// Section doesn't exist — append it before the next ## heading after ## Page Sections
|
|
97
|
+
const pageSectionsIdx = lines.findIndex((l) => l.trim() === '## Page Sections');
|
|
98
|
+
if (pageSectionsIdx === -1) {
|
|
99
|
+
// Just append at end before last nav row
|
|
100
|
+
return content + `\n${headingLine}\n\n${objectBlock}\n`;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Find end of ## Page Sections block
|
|
104
|
+
let insertIdx = pageSectionsIdx + 1;
|
|
105
|
+
while (insertIdx < lines.length) {
|
|
106
|
+
const t = lines[insertIdx].trim();
|
|
107
|
+
if (t.startsWith('## ') || t === '---') break;
|
|
108
|
+
insertIdx++;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const before = lines.slice(0, insertIdx);
|
|
112
|
+
const after = lines.slice(insertIdx);
|
|
113
|
+
return [...before, '', headingLine, '', objectBlock, ...after].join('\n');
|
|
114
|
+
} else {
|
|
115
|
+
// Find the end of this section (next ### or ## or end of file)
|
|
116
|
+
let insertIdx = headingIdx + 1;
|
|
117
|
+
// Skip blank lines after heading
|
|
118
|
+
while (insertIdx < lines.length && lines[insertIdx].trim() === '') insertIdx++;
|
|
119
|
+
// Skip comment lines
|
|
120
|
+
while (insertIdx < lines.length && lines[insertIdx].trim().startsWith('<!--')) insertIdx++;
|
|
121
|
+
|
|
122
|
+
// Find end of section
|
|
123
|
+
let endIdx = insertIdx;
|
|
124
|
+
while (endIdx < lines.length) {
|
|
125
|
+
const t = lines[endIdx].trim();
|
|
126
|
+
if (t.startsWith('### ') || t.startsWith('## ') || t === '---') break;
|
|
127
|
+
endIdx++;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Insert object block before end of section
|
|
131
|
+
const before = lines.slice(0, endIdx);
|
|
132
|
+
const after = lines.slice(endIdx);
|
|
133
|
+
return [...before, '', objectBlock, ...after].join('\n');
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function main() {
|
|
138
|
+
const args = parseArgs(process.argv.slice(2));
|
|
139
|
+
|
|
140
|
+
if (args.help) {
|
|
141
|
+
printUsage();
|
|
142
|
+
process.exit(0);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
if (!args.page || !args.section || !args.object) {
|
|
146
|
+
process.stderr.write('Error: --page, --section, and --object are required.\n\n');
|
|
147
|
+
printUsage();
|
|
148
|
+
process.exit(1);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
const filePath = path.resolve(args.page);
|
|
152
|
+
|
|
153
|
+
if (!fs.existsSync(filePath)) {
|
|
154
|
+
process.stderr.write(`Error: File not found: ${filePath}\n`);
|
|
155
|
+
process.exit(1);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
const pageSlug = pageSlugFromPath(filePath);
|
|
159
|
+
const objectId = deriveObjectId(pageSlug, args.section, args.object);
|
|
160
|
+
|
|
161
|
+
// Auto-derive translation key from objectId
|
|
162
|
+
const translationKey = args.translation || objectId.replaceAll('-', '.');
|
|
163
|
+
|
|
164
|
+
const objectBlock = buildObjectBlock({
|
|
165
|
+
objectName: args.object,
|
|
166
|
+
objectId,
|
|
167
|
+
component: args.component || '—',
|
|
168
|
+
componentPath: args['component-path'] || '—',
|
|
169
|
+
translationKey,
|
|
170
|
+
se: args.se || '',
|
|
171
|
+
en: args.en || '',
|
|
172
|
+
behavior: args.behavior || '—',
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
let content;
|
|
176
|
+
try {
|
|
177
|
+
content = fs.readFileSync(filePath, 'utf8');
|
|
178
|
+
} catch (error) {
|
|
179
|
+
process.stderr.write(`Error reading file: ${error.message}\n`);
|
|
180
|
+
process.exit(1);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// Check for duplicate object ID
|
|
184
|
+
if (content.includes(`\`${objectId}\``)) {
|
|
185
|
+
process.stderr.write(`Error: Object ID already exists in file: ${objectId}\n`);
|
|
186
|
+
process.exit(1);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
const updated = insertUnderSection(content, args.section, objectBlock);
|
|
190
|
+
|
|
191
|
+
try {
|
|
192
|
+
fs.writeFileSync(filePath, updated, 'utf8');
|
|
193
|
+
} catch (error) {
|
|
194
|
+
process.stderr.write(`Error writing file: ${error.message}\n`);
|
|
195
|
+
process.exit(1);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
process.stdout.write(`✓ Added object ${objectId}\n`);
|
|
199
|
+
process.stdout.write(` File: ${filePath}\n`);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
main();
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
// wds-add-spacing.js — WDS scaffold: append a spacing object to a page spec file
|
|
2
|
+
// Usage: node src/scripts/wds-add-spacing.js --page "C-UX-Scenarios/01-onboarding/01-start/01-start.md" \
|
|
3
|
+
// --direction v --type space --size xl --reason "major section boundary between hero and features"
|
|
4
|
+
|
|
5
|
+
'use strict';
|
|
6
|
+
|
|
7
|
+
const fs = require('node:fs');
|
|
8
|
+
const path = require('node:path');
|
|
9
|
+
|
|
10
|
+
function parseArgs(argv) {
|
|
11
|
+
const args = {};
|
|
12
|
+
for (let i = 0; i < argv.length; i++) {
|
|
13
|
+
if (argv[i].startsWith('--')) {
|
|
14
|
+
const key = argv[i].slice(2);
|
|
15
|
+
const value = argv[i + 1] && !argv[i + 1].startsWith('--') ? argv[i + 1] : true;
|
|
16
|
+
args[key] = value;
|
|
17
|
+
if (value !== true) i++;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return args;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function printUsage() {
|
|
24
|
+
process.stdout.write(
|
|
25
|
+
[
|
|
26
|
+
'Usage: node src/scripts/wds-add-spacing.js --page <path> --direction <v|h> --type <type> --size <size> [options]',
|
|
27
|
+
'',
|
|
28
|
+
'Required:',
|
|
29
|
+
' --page Path to the page spec .md file',
|
|
30
|
+
' --direction v (vertical) or h (horizontal)',
|
|
31
|
+
' --type space | separator | line',
|
|
32
|
+
' --size zero | sm | md | lg | xl | 2xl | 3xl | flex',
|
|
33
|
+
'',
|
|
34
|
+
'Optional:',
|
|
35
|
+
' --reason Why this spacing exists',
|
|
36
|
+
'',
|
|
37
|
+
'Valid directions: v, h',
|
|
38
|
+
'Valid types: space, separator, line',
|
|
39
|
+
'Valid sizes: zero, sm, md, lg, xl, 2xl, 3xl, flex',
|
|
40
|
+
'',
|
|
41
|
+
].join('\n'),
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const VALID_DIRECTIONS = ['v', 'h'];
|
|
46
|
+
const VALID_TYPES = ['space', 'separator', 'line'];
|
|
47
|
+
const VALID_SIZES = ['zero', 'sm', 'md', 'lg', 'xl', '2xl', '3xl', 'flex'];
|
|
48
|
+
|
|
49
|
+
// Derive page prefix from slug: "01-start" -> "start"
|
|
50
|
+
function pagePrefix(slug) {
|
|
51
|
+
const parts = slug.split('-');
|
|
52
|
+
return parts.length > 1 ? parts.slice(1).join('-') : slug;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function pageSlugFromPath(filePath) {
|
|
56
|
+
return path.basename(filePath, '.md');
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function buildSpacingBlock(spacingId, reason) {
|
|
60
|
+
const icon = '↕';
|
|
61
|
+
const reasonText = reason ? ` — ${reason}` : '';
|
|
62
|
+
return `#### ${icon} \`${spacingId}\`${reasonText}\n`;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function appendToSpacingSection(content, spacingBlock) {
|
|
66
|
+
const lines = content.split('\n');
|
|
67
|
+
const spacingIdx = lines.findIndex((l) => l.trim() === '## Spacing');
|
|
68
|
+
|
|
69
|
+
if (spacingIdx === -1) {
|
|
70
|
+
// No spacing section — append before first ## after metadata
|
|
71
|
+
return content + `\n## Spacing\n\n${spacingBlock}\n`;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Find end of spacing section (next ## or ---)
|
|
75
|
+
let endIdx = spacingIdx + 1;
|
|
76
|
+
while (endIdx < lines.length) {
|
|
77
|
+
const t = lines[endIdx].trim();
|
|
78
|
+
if ((t.startsWith('## ') && t !== '## Spacing') || t === '---') break;
|
|
79
|
+
endIdx++;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Insert just before the end marker
|
|
83
|
+
const before = lines.slice(0, endIdx);
|
|
84
|
+
const after = lines.slice(endIdx);
|
|
85
|
+
return [...before, spacingBlock, ...after].join('\n');
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function main() {
|
|
89
|
+
const args = parseArgs(process.argv.slice(2));
|
|
90
|
+
|
|
91
|
+
if (args.help) {
|
|
92
|
+
printUsage();
|
|
93
|
+
process.exit(0);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
if (!args.page || !args.direction || !args.type || args.size === 0) {
|
|
97
|
+
process.stderr.write('Error: --page, --direction, --type, and --size are required.\n\n');
|
|
98
|
+
printUsage();
|
|
99
|
+
process.exit(1);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
if (!VALID_DIRECTIONS.includes(args.direction)) {
|
|
103
|
+
process.stderr.write(`Error: Invalid direction "${args.direction}". Must be: ${VALID_DIRECTIONS.join(', ')}\n`);
|
|
104
|
+
process.exit(1);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if (!VALID_TYPES.includes(args.type)) {
|
|
108
|
+
process.stderr.write(`Error: Invalid type "${args.type}". Must be: ${VALID_TYPES.join(', ')}\n`);
|
|
109
|
+
process.exit(1);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if (!VALID_SIZES.includes(args.size)) {
|
|
113
|
+
process.stderr.write(`Error: Invalid size "${args.size}". Must be: ${VALID_SIZES.join(', ')}\n`);
|
|
114
|
+
process.exit(1);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
const filePath = path.resolve(args.page);
|
|
118
|
+
|
|
119
|
+
if (!fs.existsSync(filePath)) {
|
|
120
|
+
process.stderr.write(`Error: File not found: ${filePath}\n`);
|
|
121
|
+
process.exit(1);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const slug = pageSlugFromPath(filePath);
|
|
125
|
+
const prefix = pagePrefix(slug);
|
|
126
|
+
const spacingId = `${prefix}-${args.direction}-${args.type}-${args.size}`;
|
|
127
|
+
const reason = args.reason || '';
|
|
128
|
+
|
|
129
|
+
let content;
|
|
130
|
+
try {
|
|
131
|
+
content = fs.readFileSync(filePath, 'utf8');
|
|
132
|
+
} catch (error) {
|
|
133
|
+
process.stderr.write(`Error reading file: ${error.message}\n`);
|
|
134
|
+
process.exit(1);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// Check for duplicate spacing ID
|
|
138
|
+
if (content.includes(`\`${spacingId}\``)) {
|
|
139
|
+
process.stderr.write(`Error: Spacing ID already exists in file: ${spacingId}\n`);
|
|
140
|
+
process.stderr.write('Use a different combination of direction/type/size or manually edit the file.\n');
|
|
141
|
+
process.exit(1);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
const spacingBlock = buildSpacingBlock(spacingId, reason);
|
|
145
|
+
const updated = appendToSpacingSection(content, spacingBlock);
|
|
146
|
+
|
|
147
|
+
try {
|
|
148
|
+
fs.writeFileSync(filePath, updated, 'utf8');
|
|
149
|
+
} catch (error) {
|
|
150
|
+
process.stderr.write(`Error writing file: ${error.message}\n`);
|
|
151
|
+
process.exit(1);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
process.stdout.write(`✓ Added spacing object ${spacingId}\n`);
|
|
155
|
+
process.stdout.write(` File: ${filePath}\n`);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
main();
|