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,287 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Deterministic extraction of report-data.json from analysis outputs.
|
|
3
|
+
|
|
4
|
+
Reads scanner outputs (markdown + JSON) and extracts structured data without
|
|
5
|
+
LLM synthesis. Ensures no data loss and completes in <10 seconds.
|
|
6
|
+
|
|
7
|
+
Usage:
|
|
8
|
+
python3 extract-report-json.py {skill-path} {quality-report-dir} -o {output-file}
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import argparse
|
|
14
|
+
import json
|
|
15
|
+
import re
|
|
16
|
+
import sys
|
|
17
|
+
from datetime import datetime, timezone
|
|
18
|
+
from pathlib import Path
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def extract_section(content: str, section_name: str, level: int = 2) -> str | None:
|
|
22
|
+
"""Extract a section from markdown by heading name."""
|
|
23
|
+
pattern = r'^#{' + str(level) + r'}\s+' + re.escape(section_name) + r'\s*\n(.*?)(?=^#{1,' + str(level) + r'}\s|\Z)'
|
|
24
|
+
match = re.search(pattern, content, re.MULTILINE | re.DOTALL)
|
|
25
|
+
return match.group(1).strip() if match else None
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def extract_journeys(content: str) -> list[dict]:
|
|
29
|
+
"""Extract user journey archetypes from enhancement-analysis.md."""
|
|
30
|
+
journeys = []
|
|
31
|
+
# Match ### N. {Name}: {Description}
|
|
32
|
+
pattern = r'^###\s+\d+\.\s+([^:]+):\s+(.+?)(?=^###|\Z)'
|
|
33
|
+
for match in re.finditer(pattern, content, re.MULTILINE | re.DOTALL):
|
|
34
|
+
name = match.group(1).strip()
|
|
35
|
+
section = match.group(2)
|
|
36
|
+
|
|
37
|
+
# Extract narrative (after "Narrative." or "Narrative\n")
|
|
38
|
+
narrative_match = re.search(r'(?:Narrative[:.]\s*)?([^\n]+(?:\n[^*\n][^\n]*)*?)(?=\n\*\*|\n[A-Z])', section)
|
|
39
|
+
summary = narrative_match.group(1).strip() if narrative_match else ""
|
|
40
|
+
|
|
41
|
+
# Extract friction points
|
|
42
|
+
friction_points = []
|
|
43
|
+
friction_section = re.search(r'\*\*Friction points?[:\*]*\*\*\s*\n(.*?)(?=\n\*\*|\n[A-Z]|$)', section, re.DOTALL)
|
|
44
|
+
if friction_section:
|
|
45
|
+
for line in friction_section.group(1).split('\n'):
|
|
46
|
+
line = line.strip()
|
|
47
|
+
if line.startswith('- '):
|
|
48
|
+
friction_points.append(line[2:].strip())
|
|
49
|
+
|
|
50
|
+
# Extract bright spots
|
|
51
|
+
bright_spots = []
|
|
52
|
+
bright_section = re.search(r'\*\*Bright spots?[:\*]*\*\*\s*\n(.*?)(?=\n\*\*|\n[A-Z]|$)', section, re.DOTALL)
|
|
53
|
+
if bright_section:
|
|
54
|
+
for line in bright_section.group(1).split('\n'):
|
|
55
|
+
line = line.strip()
|
|
56
|
+
if line.startswith('- '):
|
|
57
|
+
bright_spots.append(line[2:].strip())
|
|
58
|
+
|
|
59
|
+
journeys.append({
|
|
60
|
+
'archetype': name,
|
|
61
|
+
'summary': summary,
|
|
62
|
+
'friction_points': friction_points,
|
|
63
|
+
'bright_spots': bright_spots
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
return journeys
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def extract_autonomous(content: str) -> dict:
|
|
70
|
+
"""Extract headless/automation assessment from enhancement-analysis.md."""
|
|
71
|
+
assessment_section = extract_section(content, 'Headless Assessment', level=2)
|
|
72
|
+
if not assessment_section:
|
|
73
|
+
return {}
|
|
74
|
+
|
|
75
|
+
# Look for "Current Level:" or "Potential:" pattern
|
|
76
|
+
potential_match = re.search(r'(?:Current Level|Potential)[:\*]*\s*([^\n.]+)', assessment_section)
|
|
77
|
+
potential = potential_match.group(1).strip() if potential_match else "unknown"
|
|
78
|
+
|
|
79
|
+
# Get the rest as notes
|
|
80
|
+
notes = assessment_section
|
|
81
|
+
if potential_match:
|
|
82
|
+
notes = assessment_section[potential_match.end():].strip()
|
|
83
|
+
|
|
84
|
+
return {
|
|
85
|
+
'potential': potential,
|
|
86
|
+
'notes': notes[:200] if notes else "" # Truncate to 200 chars
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def extract_findings_from_md(content: str, source_scanner: str) -> list[dict]:
|
|
91
|
+
"""Extract individual findings from analysis markdown.
|
|
92
|
+
|
|
93
|
+
Handles multiple formats:
|
|
94
|
+
- Architecture: level 4 headings under severity sections (### HIGH, etc)
|
|
95
|
+
- Determinism: bold headings with severity markers [HIGH], [LOW]
|
|
96
|
+
- Customization: bold headings with opportunity markers (HIGH-OPPORTUNITY, etc)
|
|
97
|
+
- Enhancement: numbered findings with severity/opportunity markers
|
|
98
|
+
"""
|
|
99
|
+
findings = []
|
|
100
|
+
|
|
101
|
+
if source_scanner == 'architecture':
|
|
102
|
+
# Architecture format: ### SEVERITY followed by #### N. Title
|
|
103
|
+
severity_pattern = r'^###\s+(CRITICAL|HIGH|MEDIUM|LOW)\s*$'
|
|
104
|
+
severity_sections = re.split(severity_pattern, content, flags=re.MULTILINE)
|
|
105
|
+
|
|
106
|
+
for i in range(1, len(severity_sections), 2):
|
|
107
|
+
severity = severity_sections[i].lower() if i < len(severity_sections) else "medium"
|
|
108
|
+
section_content = severity_sections[i + 1] if i + 1 < len(severity_sections) else ""
|
|
109
|
+
|
|
110
|
+
if not section_content.strip() or section_content.strip() == "None":
|
|
111
|
+
continue
|
|
112
|
+
|
|
113
|
+
# Extract level 4 findings (#### N. Title)
|
|
114
|
+
finding_pattern = r'^####\s+(\d+\.\s+)?(.+?)$'
|
|
115
|
+
for match in re.finditer(finding_pattern, section_content, re.MULTILINE):
|
|
116
|
+
finding_title = match.group(2).strip()
|
|
117
|
+
if finding_title:
|
|
118
|
+
findings.append({
|
|
119
|
+
'title': finding_title,
|
|
120
|
+
'severity': severity,
|
|
121
|
+
'source': source_scanner
|
|
122
|
+
})
|
|
123
|
+
|
|
124
|
+
elif source_scanner == 'determinism':
|
|
125
|
+
# Determinism format: ### **[SEVERITY] Title**
|
|
126
|
+
pattern = r'###\s+\*\*\[([A-Z]+)\]\s+([^*]+)\*\*'
|
|
127
|
+
for match in re.finditer(pattern, content, re.MULTILINE):
|
|
128
|
+
severity = match.group(1).lower()
|
|
129
|
+
title = match.group(2).strip()
|
|
130
|
+
if title:
|
|
131
|
+
findings.append({
|
|
132
|
+
'title': title,
|
|
133
|
+
'severity': severity,
|
|
134
|
+
'source': source_scanner
|
|
135
|
+
})
|
|
136
|
+
|
|
137
|
+
elif source_scanner == 'customization':
|
|
138
|
+
# Customization format: ### N. **Title** (OPPORTUNITY-TYPE)
|
|
139
|
+
pattern = r'###\s+\d+\.\s+\*\*([^*]+)\*\*\s+\(([A-Z-]+)\)'
|
|
140
|
+
for match in re.finditer(pattern, content, re.MULTILINE):
|
|
141
|
+
title = match.group(1).strip()
|
|
142
|
+
opportunity = match.group(2).lower()
|
|
143
|
+
# Map opportunity to severity
|
|
144
|
+
severity = 'high' if 'high' in opportunity else 'medium' if 'medium' in opportunity else 'low'
|
|
145
|
+
if title:
|
|
146
|
+
findings.append({
|
|
147
|
+
'title': title,
|
|
148
|
+
'severity': severity,
|
|
149
|
+
'source': source_scanner
|
|
150
|
+
})
|
|
151
|
+
|
|
152
|
+
elif source_scanner == 'enhancement':
|
|
153
|
+
# Enhancement format: ### LEVEL Findings section followed by #### N. Title
|
|
154
|
+
# Extract opportunity sections (HIGH-OPPORTUNITY, SECONDARY-OPPORTUNITY, etc)
|
|
155
|
+
opportunity_pattern = r'^###\s+([A-Z-]+)\s+(?:Findings|Opportunities?)'
|
|
156
|
+
opportunity_sections = re.split(opportunity_pattern, content, flags=re.MULTILINE)
|
|
157
|
+
|
|
158
|
+
for i in range(1, len(opportunity_sections), 2):
|
|
159
|
+
opportunity = opportunity_sections[i].lower() if i < len(opportunity_sections) else "medium"
|
|
160
|
+
section_content = opportunity_sections[i + 1] if i + 1 < len(opportunity_sections) else ""
|
|
161
|
+
|
|
162
|
+
if not section_content.strip():
|
|
163
|
+
continue
|
|
164
|
+
|
|
165
|
+
# Map opportunity to severity
|
|
166
|
+
severity = 'high' if 'high' in opportunity else 'medium' if 'secondary' in opportunity else 'low'
|
|
167
|
+
|
|
168
|
+
# Extract level 4 findings (#### N. Title)
|
|
169
|
+
finding_pattern = r'^####\s+(\d+\.\s+)?(.+?)$'
|
|
170
|
+
for match in re.finditer(finding_pattern, section_content, re.MULTILINE):
|
|
171
|
+
finding_title = match.group(2).strip()
|
|
172
|
+
if finding_title:
|
|
173
|
+
findings.append({
|
|
174
|
+
'title': finding_title,
|
|
175
|
+
'severity': severity,
|
|
176
|
+
'source': source_scanner
|
|
177
|
+
})
|
|
178
|
+
|
|
179
|
+
return findings
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
def merge_prepass_data(report_dir: Path) -> dict:
|
|
183
|
+
"""Load and merge all prepass JSON data."""
|
|
184
|
+
merged = {}
|
|
185
|
+
|
|
186
|
+
for json_file in report_dir.glob('*-prepass.json'):
|
|
187
|
+
try:
|
|
188
|
+
data = json.loads(json_file.read_text(encoding='utf-8'))
|
|
189
|
+
merged.update(data)
|
|
190
|
+
except Exception:
|
|
191
|
+
pass # Skip if not valid JSON
|
|
192
|
+
|
|
193
|
+
return merged
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
def build_report_json(skill_path: str, quality_report_dir: str) -> dict:
|
|
197
|
+
"""Extract and build complete report-data.json."""
|
|
198
|
+
report_dir = Path(quality_report_dir)
|
|
199
|
+
skill_name = Path(skill_path).name
|
|
200
|
+
timestamp = datetime.now(timezone.utc).isoformat()
|
|
201
|
+
|
|
202
|
+
# Read all analysis files
|
|
203
|
+
architecture_content = (report_dir / 'architecture-analysis.md').read_text(encoding='utf-8') if (report_dir / 'architecture-analysis.md').exists() else ""
|
|
204
|
+
determinism_content = (report_dir / 'determinism-analysis.md').read_text(encoding='utf-8') if (report_dir / 'determinism-analysis.md').exists() else ""
|
|
205
|
+
customization_content = (report_dir / 'customization-analysis.md').read_text(encoding='utf-8') if (report_dir / 'customization-analysis.md').exists() else ""
|
|
206
|
+
enhancement_content = (report_dir / 'enhancement-analysis.md').read_text(encoding='utf-8') if (report_dir / 'enhancement-analysis.md').exists() else ""
|
|
207
|
+
|
|
208
|
+
# Extract assessments
|
|
209
|
+
arch_assessment = extract_section(architecture_content, 'Assessment', level=2) or ""
|
|
210
|
+
det_assessment = extract_section(determinism_content, 'Assessment', level=2) or ""
|
|
211
|
+
cust_assessment = extract_section(customization_content, 'Overall Assessment', level=2) or ""
|
|
212
|
+
enh_assessment = extract_section(enhancement_content, 'Summary', level=2) or ""
|
|
213
|
+
|
|
214
|
+
# Extract journeys and autonomous from enhancement
|
|
215
|
+
journeys = extract_journeys(enhancement_content)
|
|
216
|
+
autonomous = extract_autonomous(enhancement_content)
|
|
217
|
+
|
|
218
|
+
# Build detailed_analysis
|
|
219
|
+
detailed_analysis = {
|
|
220
|
+
'architecture': {
|
|
221
|
+
'assessment': arch_assessment[:500], # First 500 chars
|
|
222
|
+
'findings': extract_findings_from_md(architecture_content, 'architecture')
|
|
223
|
+
},
|
|
224
|
+
'determinism': {
|
|
225
|
+
'assessment': det_assessment[:500],
|
|
226
|
+
'findings': extract_findings_from_md(determinism_content, 'determinism')
|
|
227
|
+
},
|
|
228
|
+
'customization': {
|
|
229
|
+
'assessment': cust_assessment[:500],
|
|
230
|
+
'posture': 'not-opted-in', # From content
|
|
231
|
+
'findings': extract_findings_from_md(customization_content, 'customization')
|
|
232
|
+
},
|
|
233
|
+
'enhancement': {
|
|
234
|
+
'assessment': enh_assessment[:500],
|
|
235
|
+
'journeys': journeys,
|
|
236
|
+
'autonomous': autonomous,
|
|
237
|
+
'findings': extract_findings_from_md(enhancement_content, 'enhancement')
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
# Build basic structure - minimal for now, will be expanded by report creator if needed
|
|
242
|
+
report_data = {
|
|
243
|
+
'meta': {
|
|
244
|
+
'skill_name': skill_name,
|
|
245
|
+
'skill_path': skill_path,
|
|
246
|
+
'timestamp': timestamp,
|
|
247
|
+
'scanner_count': 4
|
|
248
|
+
},
|
|
249
|
+
'narrative': enh_assessment[:150] if enh_assessment else "", # Placeholder
|
|
250
|
+
'grade': 'Good', # Placeholder - report creator sets this
|
|
251
|
+
'broken': [],
|
|
252
|
+
'opportunities': [],
|
|
253
|
+
'strengths': [],
|
|
254
|
+
'recommendations': [],
|
|
255
|
+
'detailed_analysis': detailed_analysis
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
return report_data
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
def main():
|
|
262
|
+
parser = argparse.ArgumentParser(description='Extract report-data.json from analysis outputs')
|
|
263
|
+
parser.add_argument('skill_path', help='Path to the skill being analyzed')
|
|
264
|
+
parser.add_argument('quality_report_dir', help='Directory with analysis outputs and where to write report')
|
|
265
|
+
parser.add_argument('-o', '--output', help='Output file path (default: {quality_report_dir}/report-data.json)')
|
|
266
|
+
|
|
267
|
+
args = parser.parse_args()
|
|
268
|
+
|
|
269
|
+
output_path = args.output or str(Path(args.quality_report_dir) / 'report-data.json')
|
|
270
|
+
|
|
271
|
+
try:
|
|
272
|
+
report_json = build_report_json(args.skill_path, args.quality_report_dir)
|
|
273
|
+
|
|
274
|
+
# Write output
|
|
275
|
+
output_file = Path(output_path)
|
|
276
|
+
output_file.write_text(json.dumps(report_json, indent=2, ensure_ascii=False), encoding='utf-8')
|
|
277
|
+
|
|
278
|
+
print(f'Report JSON written to {output_path}', file=sys.stderr)
|
|
279
|
+
print(json.dumps({'status': 'success', 'output': output_path}, indent=2))
|
|
280
|
+
|
|
281
|
+
except Exception as e:
|
|
282
|
+
print(f'Error: {e}', file=sys.stderr)
|
|
283
|
+
sys.exit(1)
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
if __name__ == '__main__':
|
|
287
|
+
main()
|
|
@@ -179,6 +179,7 @@ h1 { font-size: 1.5rem; margin-bottom: 0.25rem; }
|
|
|
179
179
|
<div id="broken-section"></div>
|
|
180
180
|
<div id="opportunities-section"></div>
|
|
181
181
|
<div id="strengths-section"></div>
|
|
182
|
+
<div id="user-experience-section"></div>
|
|
182
183
|
<div id="recommendations-section"></div>
|
|
183
184
|
<div id="detailed-section"></div>
|
|
184
185
|
|
|
@@ -227,8 +228,10 @@ function normalize(d) {
|
|
|
227
228
|
r.rank = r.rank || i + 1;
|
|
228
229
|
});
|
|
229
230
|
// Fix journeys: persona→archetype, friction→friction_points
|
|
230
|
-
|
|
231
|
-
|
|
231
|
+
// Accept both `enhancement` (new) and `experience` (legacy) section keys
|
|
232
|
+
const expSection = d.detailed_analysis && (d.detailed_analysis.enhancement || d.detailed_analysis.experience);
|
|
233
|
+
if (expSection) {
|
|
234
|
+
expSection.journeys = (expSection.journeys || []).map(j => ({
|
|
232
235
|
archetype: j.archetype || j.persona || j.name || 'Unknown',
|
|
233
236
|
summary: j.summary || j.journey_summary || j.description || j.friction || '',
|
|
234
237
|
friction_points: j.friction_points || (j.friction ? [j.friction] : []),
|
|
@@ -258,6 +261,7 @@ function init() {
|
|
|
258
261
|
renderBroken();
|
|
259
262
|
renderOpportunities();
|
|
260
263
|
renderStrengths();
|
|
264
|
+
renderUserExperience();
|
|
261
265
|
renderRecommendations();
|
|
262
266
|
renderDetailed();
|
|
263
267
|
}
|
|
@@ -348,16 +352,61 @@ function renderRecommendations() {
|
|
|
348
352
|
document.getElementById('recommendations-section').innerHTML = html;
|
|
349
353
|
}
|
|
350
354
|
|
|
355
|
+
function renderUserExperience() {
|
|
356
|
+
const ux = DATA.detailed_analysis && DATA.detailed_analysis.enhancement;
|
|
357
|
+
if (!ux) return;
|
|
358
|
+
let html = `<div class="section"><div class="section-header open" onclick="toggleSection(this)">`;
|
|
359
|
+
html += `<span class="arrow">▶</span><span class="label">User Experience</span>`;
|
|
360
|
+
html += `</div><div class="section-body open">`;
|
|
361
|
+
if (ux.assessment) html += `<p>${esc(ux.assessment)}</p>`;
|
|
362
|
+
if (ux.journeys && ux.journeys.length) {
|
|
363
|
+
html += `<div style="margin:1rem 0"><strong>User Journeys:</strong></div>`;
|
|
364
|
+
ux.journeys.forEach(j => {
|
|
365
|
+
html += `<div style="margin:0.75rem 0;padding:0.75rem;border-left:3px solid var(--accent);background:var(--surface2);">`;
|
|
366
|
+
html += `<div style="font-weight:600;margin-bottom:0.5rem">${esc(j.archetype)}</div>`;
|
|
367
|
+
html += `<p style="margin:0 0 0.5rem 0;font-size:0.95rem">${esc(j.summary || '')}</p>`;
|
|
368
|
+
if (j.friction_points && j.friction_points.length) {
|
|
369
|
+
html += `<div style="color:var(--high);font-size:0.85rem;margin:0.25rem 0"><strong>Friction Points:</strong></div>`;
|
|
370
|
+
html += `<ul style="margin:0.25rem 0 0.5rem 1.25rem;color:var(--high);font-size:0.85rem">`;
|
|
371
|
+
j.friction_points.forEach(fp => { html += `<li>${esc(fp)}</li>`; });
|
|
372
|
+
html += `</ul>`;
|
|
373
|
+
}
|
|
374
|
+
if (j.bright_spots && j.bright_spots.length) {
|
|
375
|
+
html += `<div style="color:var(--strength);font-size:0.85rem;margin:0.25rem 0"><strong>Bright Spots:</strong></div>`;
|
|
376
|
+
html += `<ul style="margin:0.25rem 0 0 1.25rem;color:var(--strength);font-size:0.85rem">`;
|
|
377
|
+
j.bright_spots.forEach(bs => { html += `<li>${esc(bs)}</li>`; });
|
|
378
|
+
html += `</ul>`;
|
|
379
|
+
}
|
|
380
|
+
html += `</div>`;
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
if (ux.autonomous) {
|
|
384
|
+
const a = ux.autonomous;
|
|
385
|
+
html += `<div style="margin:1rem 0;padding:0.75rem;background:var(--surface2);border-left:3px solid var(--suggestion);">`;
|
|
386
|
+
html += `<div style="font-weight:600;margin-bottom:0.5rem">Headless / Automation Potential</div>`;
|
|
387
|
+
html += `<div><strong>${esc(a.potential || '')}</strong>`;
|
|
388
|
+
if (a.notes) html += `: ${esc(a.notes)}`;
|
|
389
|
+
html += `</div></div>`;
|
|
390
|
+
}
|
|
391
|
+
(ux.findings || []).forEach(f => {
|
|
392
|
+
const loc = f.file ? `${f.file}${f.line ? ':'+f.line : ''}` : '';
|
|
393
|
+
html += `<div class="analysis-finding">`;
|
|
394
|
+
if (f.severity) html += `<span class="badge badge-${f.severity}">${esc(f.severity)}</span> `;
|
|
395
|
+
html += `${esc(f.title)}`;
|
|
396
|
+
if (loc) html += ` <span class="item-file">${esc(loc)}</span>`;
|
|
397
|
+
html += `</div>`;
|
|
398
|
+
});
|
|
399
|
+
html += `</div></div>`;
|
|
400
|
+
document.getElementById('user-experience-section').innerHTML = html;
|
|
401
|
+
}
|
|
402
|
+
|
|
351
403
|
function renderDetailed() {
|
|
352
404
|
const da = DATA.detailed_analysis;
|
|
353
405
|
if (!da) return;
|
|
354
406
|
const dims = [
|
|
355
|
-
['
|
|
356
|
-
['
|
|
357
|
-
['
|
|
358
|
-
['efficiency', 'Execution Efficiency'],
|
|
359
|
-
['experience', 'User Experience'],
|
|
360
|
-
['scripts', 'Script Opportunities']
|
|
407
|
+
['architecture', 'Architecture (Structure, Craft, Cohesion)'],
|
|
408
|
+
['determinism', 'Determinism & Distribution'],
|
|
409
|
+
['customization', 'Customization Surface']
|
|
361
410
|
];
|
|
362
411
|
let html = `<div class="section"><div class="section-header" onclick="toggleSection(this)">`;
|
|
363
412
|
html += `<span class="arrow">▶</span><span class="label">Detailed Analysis</span>`;
|
|
@@ -193,14 +193,14 @@ def scan_prompt_metrics(skill_path: Path) -> dict:
|
|
|
193
193
|
data['is_skill_md'] = False
|
|
194
194
|
files_data.append(data)
|
|
195
195
|
|
|
196
|
-
#
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
if
|
|
200
|
-
for f in sorted(
|
|
196
|
+
# References (just sizes, for progressive disclosure assessment)
|
|
197
|
+
references_dir = skill_path / 'references'
|
|
198
|
+
reference_sizes = {}
|
|
199
|
+
if references_dir.exists():
|
|
200
|
+
for f in sorted(references_dir.iterdir()):
|
|
201
201
|
if f.is_file() and f.suffix in ('.md', '.json', '.yaml', '.yml'):
|
|
202
202
|
content = f.read_text(encoding='utf-8')
|
|
203
|
-
|
|
203
|
+
reference_sizes[f.name] = {
|
|
204
204
|
'lines': len(content.split('\n')),
|
|
205
205
|
'tokens': len(content) // 4,
|
|
206
206
|
}
|
|
@@ -243,7 +243,7 @@ def scan_prompt_metrics(skill_path: Path) -> dict:
|
|
|
243
243
|
'total_waste_patterns': total_waste,
|
|
244
244
|
'total_back_references': total_backrefs,
|
|
245
245
|
},
|
|
246
|
-
'
|
|
246
|
+
'reference_sizes': reference_sizes,
|
|
247
247
|
'files': files_data,
|
|
248
248
|
}
|
|
249
249
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
module,skill,display-name,menu-code,description,action,args,phase,
|
|
1
|
+
module,skill,display-name,menu-code,description,action,args,phase,preceded-by,followed-by,required,output-location,outputs
|
|
2
2
|
BMad Builder,_meta,,,,,,,,,false,https://bmad-builder-docs.bmad-method.org/llms.txt,
|
|
3
3
|
BMad Builder,bmad-bmb-setup,Setup Builder Module,SB,"Install or update BMad Builder module config and help entries.",configure,"{-H: headless mode}|{inline values: skip prompts with provided values}",anytime,,,false,{project-root}/_bmad,config.yaml and config.user.yaml
|
|
4
4
|
BMad Builder,bmad-agent-builder,Build an Agent,BA,"Create, edit, or rebuild an agent skill through conversational discovery.",build-process,"{-H: headless mode}|{description: initial agent concept}|{path: existing agent to edit or rebuild}",anytime,,bmad-agent-builder:quality-analysis,false,bmad_builder_output_folder,agent skill
|
|
Binary file
|
|
@@ -1,38 +1,37 @@
|
|
|
1
1
|
{
|
|
2
|
-
"generated": "2026-
|
|
3
|
-
"bmadMethodVersion": "6.
|
|
4
|
-
"registrySchema": "
|
|
2
|
+
"generated": "2026-06-13T15:11:45.601Z",
|
|
3
|
+
"bmadMethodVersion": "6.8.0",
|
|
4
|
+
"registrySchema": "package-root-v68",
|
|
5
5
|
"modules": {
|
|
6
|
+
"tea": {
|
|
7
|
+
"url": "https://github.com/bmad-code-org/bmad-method-test-architecture-enterprise",
|
|
8
|
+
"branch": "main",
|
|
9
|
+
"commitSha": "8734d51f24071ddbcb3617390b5fcddb4128ef77",
|
|
10
|
+
"clonedAt": "2026-06-13T15:11:39.614Z"
|
|
11
|
+
},
|
|
6
12
|
"bmb": {
|
|
7
13
|
"url": "https://github.com/bmad-code-org/bmad-builder",
|
|
8
14
|
"branch": "main",
|
|
9
|
-
"commitSha": "
|
|
10
|
-
"clonedAt": "2026-
|
|
15
|
+
"commitSha": "7cfa7711778f04c5df56f7ae895fabc942fd920c",
|
|
16
|
+
"clonedAt": "2026-06-13T15:11:41.069Z"
|
|
11
17
|
},
|
|
12
18
|
"cis": {
|
|
13
19
|
"url": "https://github.com/bmad-code-org/bmad-module-creative-intelligence-suite",
|
|
14
20
|
"branch": "main",
|
|
15
|
-
"commitSha": "
|
|
16
|
-
"clonedAt": "2026-
|
|
21
|
+
"commitSha": "07a8dd03d196a762f21c241d985293fe5b0f90e7",
|
|
22
|
+
"clonedAt": "2026-06-13T15:11:42.507Z"
|
|
17
23
|
},
|
|
18
24
|
"gds": {
|
|
19
25
|
"url": "https://github.com/bmad-code-org/bmad-module-game-dev-studio.git",
|
|
20
26
|
"branch": "main",
|
|
21
|
-
"commitSha": "
|
|
22
|
-
"clonedAt": "2026-
|
|
23
|
-
},
|
|
24
|
-
"tea": {
|
|
25
|
-
"url": "https://github.com/bmad-code-org/bmad-method-test-architecture-enterprise",
|
|
26
|
-
"branch": "main",
|
|
27
|
-
"commitSha": "b0ee2a5128d0f0b9f32c30a0017722a846518349",
|
|
28
|
-
"clonedAt": "2026-05-01T12:48:59.888Z"
|
|
27
|
+
"commitSha": "46c3a6cddf882af1f918187d6e5748c1edfd9c52",
|
|
28
|
+
"clonedAt": "2026-06-13T15:11:43.930Z"
|
|
29
29
|
},
|
|
30
30
|
"wds": {
|
|
31
31
|
"url": "https://github.com/bmad-code-org/bmad-method-wds-expansion",
|
|
32
32
|
"branch": "main",
|
|
33
|
-
"commitSha": "
|
|
34
|
-
"clonedAt": "2026-
|
|
35
|
-
"retiredUpstream": true
|
|
33
|
+
"commitSha": "cc16f09fcfab26d35635af1491f36a38a8431c8d",
|
|
34
|
+
"clonedAt": "2026-06-13T15:11:45.601Z"
|
|
36
35
|
}
|
|
37
36
|
}
|
|
38
37
|
}
|
|
@@ -15,10 +15,60 @@
|
|
|
15
15
|
# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
|
|
16
16
|
# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
|
|
17
17
|
|
|
18
|
-
# This example catches duplicate Signed-off-by lines
|
|
18
|
+
# This example catches duplicate Signed-off-by lines and messages that
|
|
19
|
+
# would confuse 'git am'.
|
|
20
|
+
|
|
21
|
+
ret=0
|
|
19
22
|
|
|
20
23
|
test "" = "$(grep '^Signed-off-by: ' "$1" |
|
|
21
24
|
sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || {
|
|
22
25
|
echo >&2 Duplicate Signed-off-by lines.
|
|
23
|
-
|
|
26
|
+
ret=1
|
|
24
27
|
}
|
|
28
|
+
|
|
29
|
+
comment_re="$(
|
|
30
|
+
{
|
|
31
|
+
git config --get-regexp "^core\.comment(char|string)\$" ||
|
|
32
|
+
echo '#'
|
|
33
|
+
} | sed -n -e '
|
|
34
|
+
${
|
|
35
|
+
s/^[^ ]* //
|
|
36
|
+
s|[][*./\]|\\&|g
|
|
37
|
+
s/^auto$/[#;@!$%^&|:]/
|
|
38
|
+
p
|
|
39
|
+
}'
|
|
40
|
+
)"
|
|
41
|
+
scissors_line="^${comment_re} -\{8,\} >8 -\{8,\}\$"
|
|
42
|
+
comment_line="^${comment_re}.*"
|
|
43
|
+
blank_line='^[ ]*$'
|
|
44
|
+
# Disallow lines starting with "diff -" or "Index: " in the body of the
|
|
45
|
+
# message. Stop looking if we see a scissors line.
|
|
46
|
+
line="$(sed -n -e "
|
|
47
|
+
# Skip comments and blank lines at the start of the file.
|
|
48
|
+
/${scissors_line}/q
|
|
49
|
+
/${comment_line}/d
|
|
50
|
+
/${blank_line}/d
|
|
51
|
+
# The first paragraph will become the subject header so
|
|
52
|
+
# does not need to be checked.
|
|
53
|
+
: subject
|
|
54
|
+
n
|
|
55
|
+
/${scissors_line}/q
|
|
56
|
+
/${blank_line}/!b subject
|
|
57
|
+
# Check the body of the message for problematic
|
|
58
|
+
# prefixes.
|
|
59
|
+
: body
|
|
60
|
+
n
|
|
61
|
+
/${scissors_line}/q
|
|
62
|
+
/${comment_line}/b body
|
|
63
|
+
/^diff -/{p;q;}
|
|
64
|
+
/^Index: /{p;q;}
|
|
65
|
+
b body
|
|
66
|
+
" "$1")"
|
|
67
|
+
if test -n "$line"
|
|
68
|
+
then
|
|
69
|
+
echo >&2 "Message contains a diff that will confuse 'git am'."
|
|
70
|
+
echo >&2 "To fix this indent the diff."
|
|
71
|
+
ret=1
|
|
72
|
+
fi
|
|
73
|
+
|
|
74
|
+
exit $ret
|
|
@@ -29,8 +29,6 @@ if ($version ne 2) {
|
|
|
29
29
|
|
|
30
30
|
my $git_work_tree = get_working_dir();
|
|
31
31
|
|
|
32
|
-
my $retry = 1;
|
|
33
|
-
|
|
34
32
|
my $json_pkg;
|
|
35
33
|
eval {
|
|
36
34
|
require JSON::XS;
|
|
@@ -123,8 +121,7 @@ sub watchman_query {
|
|
|
123
121
|
sub is_work_tree_watched {
|
|
124
122
|
my ($output) = @_;
|
|
125
123
|
my $error = $output->{error};
|
|
126
|
-
if ($
|
|
127
|
-
$retry--;
|
|
124
|
+
if ($error and $error =~ m/unable to resolve root .* directory (.*) is not watched/) {
|
|
128
125
|
my $response = qx/watchman watch "$git_work_tree"/;
|
|
129
126
|
die "Failed to make watchman watch '$git_work_tree'.\n" .
|
|
130
127
|
"Falling back to scanning...\n" if $? != 0;
|
|
@@ -142,15 +139,12 @@ sub is_work_tree_watched {
|
|
|
142
139
|
# Watchman query just to get it over with now so we won't pay
|
|
143
140
|
# the cost in git to look up each individual file.
|
|
144
141
|
my $o = watchman_clock();
|
|
145
|
-
$error = $
|
|
142
|
+
$error = $o->{error};
|
|
146
143
|
|
|
147
144
|
die "Watchman: $error.\n" .
|
|
148
145
|
"Falling back to scanning...\n" if $error;
|
|
149
146
|
|
|
150
147
|
output_result($o->{clock}, ("/"));
|
|
151
|
-
$last_update_token = $o->{clock};
|
|
152
|
-
|
|
153
|
-
eval { launch_watchman() };
|
|
154
148
|
return 0;
|
|
155
149
|
}
|
|
156
150
|
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
# pack-refs with: peeled fully-peeled sorted
|
|
2
|
-
|
|
2
|
+
07a8dd03d196a762f21c241d985293fe5b0f90e7 refs/remotes/origin/main
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
07a8dd03d196a762f21c241d985293fe5b0f90e7
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
8d7511f8945632987feb14819bddad309df22250
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
07a8dd03d196a762f21c241d985293fe5b0f90e7
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bmad-creative-intelligence-suite",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "bmad-creative-intelligence-suite",
|
|
9
|
-
"version": "0.1
|
|
9
|
+
"version": "0.2.1",
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"devDependencies": {
|
|
12
12
|
"@astrojs/sitemap": "^3.6.0",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/package.json",
|
|
3
3
|
"name": "bmad-creative-intelligence-suite",
|
|
4
|
-
"version": "0.2.
|
|
4
|
+
"version": "0.2.1",
|
|
5
5
|
"private": true,
|
|
6
6
|
"description": "A BMad MEthod Core Module that offers a suite of very creative agents and workflows",
|
|
7
7
|
"keywords": [
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
module,skill,display-name,menu-code,description,action,args,phase,
|
|
1
|
+
module,skill,display-name,menu-code,description,action,args,phase,preceded-by,followed-by,required,output-location,outputs
|
|
2
2
|
Creative Intelligence Suite,_meta,,,,,,,,,false,https://cis-docs.bmad-method.org/llms.txt,
|
|
3
3
|
Creative Intelligence Suite,bmad-cis-innovation-strategy,Innovation Strategy,IS,Identify disruption opportunities and architect business model innovation.,,,anytime,,,false,output_folder,innovation strategy
|
|
4
4
|
Creative Intelligence Suite,bmad-cis-problem-solving,Problem Solving,PS,Apply systematic problem-solving methodologies to crack complex challenges.,,,anytime,,,false,output_folder,problem solution
|