ma-agents 2.22.2 → 3.0.1
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/.opencode/skills/.ma-agents.json +99 -99
- package/lib/bmad-cache/bmb/.claude-plugin/marketplace.json +22 -0
- package/lib/bmad-cache/bmb/.markdownlint-cli2.yaml +1 -0
- package/lib/bmad-cache/bmb/_git_preserved/index +0 -0
- package/lib/bmad-cache/bmb/_git_preserved/logs/HEAD +1 -1
- package/lib/bmad-cache/bmb/_git_preserved/logs/refs/heads/main +1 -1
- package/lib/bmad-cache/bmb/_git_preserved/logs/refs/remotes/origin/HEAD +1 -1
- package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-0de89e0854d5b2b3b3b0c1ee56eee73a739f15e7.idx +0 -0
- package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-0de89e0854d5b2b3b3b0c1ee56eee73a739f15e7.pack +0 -0
- package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-0de89e0854d5b2b3b3b0c1ee56eee73a739f15e7.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 +7 -4
- package/lib/bmad-cache/bmb/skills/bmad-agent-builder/scripts/generate-html-report.py +534 -0
- package/lib/bmad-cache/bmb/{src/skills → skills}/bmad-agent-builder/scripts/prepass-execution-deps.py +4 -35
- package/lib/bmad-cache/bmb/{src/skills → skills}/bmad-agent-builder/scripts/prepass-prompt-metrics.py +2 -75
- package/lib/bmad-cache/bmb/{src/skills → skills}/bmad-agent-builder/scripts/prepass-structure-capabilities.py +3 -194
- package/lib/bmad-cache/bmb/{src/skills → skills}/bmad-agent-builder/scripts/scan-path-standards.py +104 -18
- package/lib/bmad-cache/bmb/skills/bmad-builder-setup/assets/module-help.csv +6 -0
- package/lib/bmad-cache/bmb/skills/bmad-builder-setup/assets/module.yaml +20 -0
- package/lib/bmad-cache/bmb/skills/bmad-builder-setup/scripts/cleanup-legacy.py +259 -0
- package/lib/bmad-cache/bmb/skills/bmad-builder-setup/scripts/merge-config.py +408 -0
- package/lib/bmad-cache/bmb/skills/bmad-builder-setup/scripts/merge-help-csv.py +220 -0
- package/lib/bmad-cache/bmb/skills/bmad-builder-setup/scripts/tests/test-cleanup-legacy.py +429 -0
- package/lib/bmad-cache/bmb/skills/bmad-builder-setup/scripts/tests/test-merge-config.py +644 -0
- package/lib/bmad-cache/bmb/skills/bmad-builder-setup/scripts/tests/test-merge-help-csv.py +237 -0
- package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/generate-html-report.py +539 -0
- package/lib/bmad-cache/bmb/{src/skills → skills}/bmad-workflow-builder/scripts/prepass-execution-deps.py +5 -30
- package/lib/bmad-cache/bmb/{src/skills → skills}/bmad-workflow-builder/scripts/prepass-workflow-integrity.py +0 -5
- package/lib/bmad-cache/bmb/{src/skills → skills}/bmad-workflow-builder/scripts/scan-path-standards.py +103 -16
- package/lib/bmad-cache/bmb/skills/module-help.csv +6 -0
- package/lib/bmad-cache/bmb/skills/module.yaml +20 -0
- package/lib/bmad-cache/bmb/tools/validate-doc-links.cjs +407 -0
- package/lib/bmad-cache/bmb/tools/validate-file-refs.mjs +1 -1
- package/lib/bmad-cache/cache-manifest.json +16 -10
- package/lib/bmad-cache/cis/.claude-plugin/marketplace.json +33 -0
- package/lib/bmad-cache/cis/_git_preserved/index +0 -0
- package/lib/bmad-cache/cis/_git_preserved/logs/HEAD +1 -1
- package/lib/bmad-cache/cis/_git_preserved/logs/refs/heads/main +1 -1
- package/lib/bmad-cache/cis/_git_preserved/logs/refs/remotes/origin/HEAD +1 -1
- package/lib/bmad-cache/cis/_git_preserved/objects/pack/pack-9d60aae6b09bbea0d0c5e79fdbe96e8f66de84e6.idx +0 -0
- package/lib/bmad-cache/cis/_git_preserved/objects/pack/{pack-157d7eb8d527233a8607d926fc74ebf87f2ae0d3.pack → pack-9d60aae6b09bbea0d0c5e79fdbe96e8f66de84e6.pack} +0 -0
- package/lib/bmad-cache/cis/_git_preserved/objects/pack/pack-9d60aae6b09bbea0d0c5e79fdbe96e8f66de84e6.rev +0 -0
- package/lib/bmad-cache/cis/_git_preserved/packed-refs +1 -1
- package/lib/bmad-cache/cis/_git_preserved/refs/heads/main +1 -1
- package/lib/bmad-cache/cis/_git_preserved/shallow +1 -1
- package/lib/bmad-cache/cis/package-lock.json +17015 -0
- package/lib/bmad-cache/cis/package.json +3 -4
- package/lib/bmad-cache/cis/src/module-help.csv +6 -6
- package/lib/bmad-cache/cis/src/skills/bmad-cis-agent-brainstorming-coach/bmad-skill-manifest.yaml +11 -0
- package/lib/bmad-cache/cis/src/skills/bmad-cis-agent-creative-problem-solver/bmad-skill-manifest.yaml +11 -0
- package/lib/bmad-cache/cis/src/skills/bmad-cis-agent-design-thinking-coach/bmad-skill-manifest.yaml +11 -0
- package/lib/bmad-cache/cis/src/skills/bmad-cis-agent-innovation-strategist/bmad-skill-manifest.yaml +11 -0
- package/lib/bmad-cache/cis/src/skills/bmad-cis-agent-presentation-master/bmad-skill-manifest.yaml +11 -0
- package/lib/bmad-cache/cis/src/skills/bmad-cis-agent-storyteller/bmad-skill-manifest.yaml +11 -0
- package/lib/bmad-cache/gds/.claude-plugin/marketplace.json +58 -0
- package/lib/bmad-cache/gds/_git_preserved/index +0 -0
- package/lib/bmad-cache/gds/_git_preserved/logs/HEAD +1 -1
- package/lib/bmad-cache/gds/_git_preserved/logs/refs/heads/main +1 -1
- package/lib/bmad-cache/gds/_git_preserved/logs/refs/remotes/origin/HEAD +1 -1
- package/lib/bmad-cache/gds/_git_preserved/objects/pack/pack-8099a88fca0ad946a573316a00887a2921ca1712.idx +0 -0
- package/lib/bmad-cache/gds/_git_preserved/objects/pack/{pack-44faafb9245b4ca17ad81bd6c9e6fc52fb5915a1.pack → pack-8099a88fca0ad946a573316a00887a2921ca1712.pack} +0 -0
- package/lib/bmad-cache/gds/_git_preserved/objects/pack/pack-8099a88fca0ad946a573316a00887a2921ca1712.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 -0
- package/lib/bmad-cache/gds/src/module-help.csv +35 -35
- package/lib/bmad-cache/tea/.claude-plugin/marketplace.json +33 -0
- package/lib/bmad-cache/tea/CHANGELOG.md +2 -14
- package/lib/bmad-cache/tea/README.md +31 -18
- package/lib/bmad-cache/tea/_git_preserved/index +0 -0
- package/lib/bmad-cache/tea/_git_preserved/objects/pack/pack-d243f64f83b36190434d68872a69a40870c53030.idx +0 -0
- package/lib/bmad-cache/tea/_git_preserved/objects/pack/{pack-96ec1ce3a9ef4c891e00e060795b4434ba8f7163.pack → pack-d243f64f83b36190434d68872a69a40870c53030.pack} +0 -0
- package/lib/bmad-cache/tea/_git_preserved/objects/pack/pack-d243f64f83b36190434d68872a69a40870c53030.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.7.3 +1 -0
- package/lib/bmad-cache/tea/_git_preserved/shallow +1 -1
- package/lib/bmad-cache/tea/docs/explanation/knowledge-base-system.md +5 -5
- package/lib/bmad-cache/tea/docs/explanation/step-file-architecture.md +2 -2
- package/lib/bmad-cache/tea/docs/explanation/tea-overview.md +3 -3
- package/lib/bmad-cache/tea/docs/glossary/index.md +1 -1
- package/lib/bmad-cache/tea/docs/how-to/customization/extend-tea-with-custom-workflows.md +73 -0
- package/lib/bmad-cache/tea/docs/how-to/workflows/teach-me-testing.md +7 -7
- package/lib/bmad-cache/tea/docs/index.md +2 -1
- package/lib/bmad-cache/tea/docs/reference/commands.md +4 -1
- package/lib/bmad-cache/tea/docs/reference/configuration.md +37 -15
- package/lib/bmad-cache/tea/docs/reference/knowledge-base.md +75 -73
- package/lib/bmad-cache/tea/docs/reference/troubleshooting.md +32 -19
- package/lib/bmad-cache/tea/docs/tutorials/learn-testing-tea-academy.md +3 -3
- package/lib/bmad-cache/tea/package-lock.json +2 -2
- package/lib/bmad-cache/tea/package.json +2 -1
- package/lib/bmad-cache/tea/src/agents/bmad-tea/SKILL.md +70 -0
- package/lib/bmad-cache/tea/src/agents/bmad-tea/bmad-skill-manifest.yaml +14 -0
- package/lib/bmad-cache/tea/src/module-help.csv +10 -10
- package/lib/bmad-cache/tea/src/module.yaml +8 -8
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/checklist.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/data/curriculum.yaml +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/data/session-content-map.yaml +26 -14
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/data/tea-resources-index.yaml +108 -73
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/instructions.md +2 -2
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/steps-c/step-03-session-menu.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/steps-c/step-04-session-01.md +3 -3
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/steps-c/step-04-session-07.md +14 -6
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/steps-c/step-05-completion.md +3 -3
- 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-teach-me-testing/workflow-plan-teach-me-testing.md +8 -8
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/atdd-checklist-template.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/steps-c/step-01-preflight-and-context.md +3 -3
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/steps-c/step-04a-subagent-api-failing.md +9 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/steps-c/step-01-preflight-and-context.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/steps-c/step-03b-subagent-e2e.md +2 -2
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/steps-c/step-02-generate-pipeline.md +6 -0
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/steps-c/step-03-configure-quality-gates.md +6 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/steps-c/step-03-scaffold-framework.md +3 -2
- 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-test-design/steps-c/step-02-load-context.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/steps-c/step-01-load-context.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/test-review-template.md +11 -11
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/steps-c/step-01-load-context.md +1 -1
- package/lib/bmad-cache/tea/test/test-installation-components.js +85 -21
- package/lib/bmad-cache/tea/test/test-knowledge-base.js +1 -1
- package/lib/bmad-cache/tea/tools/validate-agent-schema.js +105 -5
- package/lib/bmad-cache/wds/.claude-plugin/marketplace.json +35 -0
- package/lib/bmad-cache/wds/.markdownlint-cli2.yaml +38 -0
- package/lib/bmad-cache/wds/.nvmrc +1 -0
- package/lib/bmad-cache/wds/.prettierignore +9 -0
- package/lib/bmad-cache/wds/LICENSE +27 -0
- package/lib/bmad-cache/wds/README.md +126 -0
- package/lib/bmad-cache/wds/_git_preserved/HEAD +1 -0
- package/lib/bmad-cache/wds/_git_preserved/config +13 -0
- package/lib/bmad-cache/wds/_git_preserved/description +1 -0
- package/lib/bmad-cache/wds/_git_preserved/hooks/applypatch-msg.sample +15 -0
- package/lib/bmad-cache/wds/_git_preserved/hooks/commit-msg.sample +24 -0
- package/lib/bmad-cache/wds/_git_preserved/hooks/fsmonitor-watchman.sample +174 -0
- package/lib/bmad-cache/wds/_git_preserved/hooks/post-update.sample +8 -0
- package/lib/bmad-cache/wds/_git_preserved/hooks/pre-applypatch.sample +14 -0
- package/lib/bmad-cache/wds/_git_preserved/hooks/pre-commit.sample +49 -0
- package/lib/bmad-cache/wds/_git_preserved/hooks/pre-merge-commit.sample +13 -0
- package/lib/bmad-cache/wds/_git_preserved/hooks/pre-push.sample +53 -0
- package/lib/bmad-cache/wds/_git_preserved/hooks/pre-rebase.sample +169 -0
- package/lib/bmad-cache/wds/_git_preserved/hooks/pre-receive.sample +24 -0
- package/lib/bmad-cache/wds/_git_preserved/hooks/prepare-commit-msg.sample +42 -0
- package/lib/bmad-cache/wds/_git_preserved/hooks/push-to-checkout.sample +78 -0
- package/lib/bmad-cache/wds/_git_preserved/hooks/sendemail-validate.sample +77 -0
- package/lib/bmad-cache/wds/_git_preserved/hooks/update.sample +128 -0
- package/lib/bmad-cache/wds/_git_preserved/index +0 -0
- package/lib/bmad-cache/wds/_git_preserved/info/exclude +6 -0
- package/lib/bmad-cache/wds/_git_preserved/logs/HEAD +1 -0
- package/lib/bmad-cache/wds/_git_preserved/logs/refs/heads/main +1 -0
- package/lib/bmad-cache/wds/_git_preserved/logs/refs/remotes/origin/HEAD +1 -0
- package/lib/bmad-cache/wds/_git_preserved/objects/pack/pack-92d32f26e3a97a0786dcea5cb2c24bf90384521c.idx +0 -0
- package/lib/bmad-cache/wds/_git_preserved/objects/pack/pack-92d32f26e3a97a0786dcea5cb2c24bf90384521c.pack +0 -0
- package/lib/bmad-cache/wds/_git_preserved/objects/pack/pack-92d32f26e3a97a0786dcea5cb2c24bf90384521c.rev +0 -0
- package/lib/bmad-cache/wds/_git_preserved/packed-refs +2 -0
- package/lib/bmad-cache/wds/_git_preserved/refs/heads/main +1 -0
- package/lib/bmad-cache/wds/_git_preserved/refs/remotes/origin/HEAD +1 -0
- package/lib/bmad-cache/wds/_git_preserved/shallow +1 -0
- package/lib/bmad-cache/wds/eslint.config.mjs +152 -0
- package/lib/bmad-cache/wds/package.json +82 -0
- package/lib/bmad-cache/wds/prettier.config.mjs +32 -0
- package/lib/bmad-cache/wds/src/agents/wds-agent-freya-ux/bmad-skill-manifest.yaml +12 -0
- package/lib/bmad-cache/wds/src/agents/wds-agent-saga-analyst/bmad-skill-manifest.yaml +12 -0
- package/lib/bmad-cache/wds/src/module-help.csv +18 -0
- package/lib/bmad-cache/wds/src/module.yaml +148 -0
- package/lib/bmad-cache/wds/src/workflows/wds-1-project-brief/bmad-skill-manifest.yaml +1 -0
- package/lib/bmad-cache/wds/src/workflows/wds-1-project-brief/templates/platform-requirements.template.yaml +69 -0
- package/lib/bmad-cache/wds/src/workflows/wds-2-trigger-mapping/bmad-skill-manifest.yaml +1 -0
- package/lib/bmad-cache/wds/src/workflows/wds-3-scenarios/bmad-skill-manifest.yaml +1 -0
- package/lib/bmad-cache/wds/src/workflows/wds-4-ux-design/bmad-skill-manifest.yaml +1 -0
- package/lib/bmad-cache/wds/src/workflows/wds-4-ux-design/templates/design-delivery.template.yaml +104 -0
- package/lib/bmad-cache/wds/src/workflows/wds-4-ux-design/templates/test-scenario.template.yaml +192 -0
- package/lib/bmad-cache/wds/src/workflows/wds-5-agentic-development/bmad-skill-manifest.yaml +1 -0
- package/lib/bmad-cache/wds/src/workflows/wds-5-agentic-development/templates/components/dev-mode.css +164 -0
- package/lib/bmad-cache/wds/src/workflows/wds-5-agentic-development/templates/components/dev-mode.html +18 -0
- package/lib/bmad-cache/wds/src/workflows/wds-5-agentic-development/templates/components/dev-mode.js +430 -0
- package/lib/bmad-cache/wds/src/workflows/wds-5-agentic-development/templates/demo-data-template.json +63 -0
- package/lib/bmad-cache/wds/src/workflows/wds-5-agentic-development/templates/page-template.html +465 -0
- package/lib/bmad-cache/wds/src/workflows/wds-5-agentic-development/templates/work-file-template.yaml +264 -0
- package/lib/bmad-cache/wds/src/workflows/wds-6-asset-generation/bmad-skill-manifest.yaml +1 -0
- package/lib/bmad-cache/wds/src/workflows/wds-7-design-system/bmad-skill-manifest.yaml +1 -0
- package/lib/bmad-cache/wds/src/workflows/wds-7-design-system/templates/catalog.template.html +363 -0
- package/lib/bmad-cache/wds/src/workflows/wds-8-product-evolution/bmad-skill-manifest.yaml +1 -0
- package/lib/bmad-customize/bmm-architect.customize.yaml +6 -0
- package/lib/bmad-customize/bmm-bmad-master.customize.yaml +6 -0
- package/lib/bmad-customize/bmm-dev.customize.yaml +6 -0
- package/lib/bmad-customize/bmm-pm.customize.yaml +6 -0
- package/lib/bmad-customize/bmm-qa.customize.yaml +6 -0
- package/lib/bmad-customize/bmm-sm.customize.yaml +6 -0
- package/lib/bmad-customize/bmm-tech-writer.customize.yaml +6 -0
- package/lib/bmad-customize/bmm-ux-designer.customize.yaml +6 -0
- package/lib/bmad-extension/module-help.csv +37 -7
- package/lib/bmad-extension/module.yaml +4 -2
- package/lib/bmad-extension/skills/add-sprint/.gitkeep +0 -0
- package/lib/bmad-extension/skills/add-sprint/SKILL.md +121 -0
- package/lib/bmad-extension/skills/add-sprint/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension/skills/add-to-sprint/.gitkeep +0 -0
- package/lib/bmad-extension/skills/add-to-sprint/SKILL.md +215 -0
- package/lib/bmad-extension/skills/add-to-sprint/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension/skills/bmad-ma-agent-cyber/.gitkeep +0 -0
- package/lib/bmad-extension/skills/bmad-ma-agent-cyber/SKILL.md +49 -0
- package/lib/bmad-extension/skills/bmad-ma-agent-cyber/bmad-skill-manifest.yaml +11 -0
- package/lib/bmad-extension/skills/bmad-ma-agent-devops/.gitkeep +0 -0
- package/lib/bmad-extension/skills/bmad-ma-agent-devops/SKILL.md +49 -0
- package/lib/bmad-extension/skills/bmad-ma-agent-devops/bmad-skill-manifest.yaml +11 -0
- package/lib/bmad-extension/skills/bmad-ma-agent-mil498/.gitkeep +0 -0
- package/lib/bmad-extension/skills/bmad-ma-agent-mil498/SKILL.md +53 -0
- package/lib/bmad-extension/skills/bmad-ma-agent-mil498/bmad-skill-manifest.yaml +11 -0
- package/lib/bmad-extension/skills/bmad-ma-agent-sre/.gitkeep +0 -0
- package/lib/bmad-extension/skills/bmad-ma-agent-sre/SKILL.md +49 -0
- package/lib/bmad-extension/skills/bmad-ma-agent-sre/bmad-skill-manifest.yaml +11 -0
- package/lib/bmad-extension/skills/create-bug-story/.gitkeep +0 -0
- package/lib/bmad-extension/skills/create-bug-story/SKILL.md +195 -0
- package/lib/bmad-extension/skills/create-bug-story/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension/skills/cyber-generate-certs/.gitkeep +0 -0
- package/lib/bmad-extension/skills/cyber-generate-certs/SKILL.md +27 -0
- package/lib/bmad-extension/skills/cyber-generate-certs/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension/skills/cyber-immunity-estimation/.gitkeep +0 -0
- package/lib/bmad-extension/skills/cyber-immunity-estimation/SKILL.md +29 -0
- package/lib/bmad-extension/skills/cyber-immunity-estimation/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension/skills/cyber-security-audit/.gitkeep +0 -0
- package/lib/bmad-extension/skills/cyber-security-audit/SKILL.md +27 -0
- package/lib/bmad-extension/skills/cyber-security-audit/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension/skills/cyber-vault-secrets/.gitkeep +0 -0
- package/lib/bmad-extension/skills/cyber-vault-secrets/SKILL.md +28 -0
- package/lib/bmad-extension/skills/cyber-vault-secrets/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension/skills/cyber-verify-docker-users/.gitkeep +0 -0
- package/lib/bmad-extension/skills/cyber-verify-docker-users/SKILL.md +23 -0
- package/lib/bmad-extension/skills/cyber-verify-docker-users/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension/skills/cyber-verify-image-signature/.gitkeep +0 -0
- package/lib/bmad-extension/skills/cyber-verify-image-signature/SKILL.md +22 -0
- package/lib/bmad-extension/skills/cyber-verify-image-signature/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension/skills/cyber-vulnerability-scan/.gitkeep +0 -0
- package/lib/bmad-extension/skills/cyber-vulnerability-scan/SKILL.md +28 -0
- package/lib/bmad-extension/skills/cyber-vulnerability-scan/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension/skills/devops-configure-infrastructure/.gitkeep +0 -0
- package/lib/bmad-extension/skills/devops-configure-infrastructure/SKILL.md +27 -0
- package/lib/bmad-extension/skills/devops-configure-infrastructure/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension/skills/devops-disconnected-deployment/.gitkeep +0 -0
- package/lib/bmad-extension/skills/devops-disconnected-deployment/SKILL.md +27 -0
- package/lib/bmad-extension/skills/devops-disconnected-deployment/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension/skills/devops-docker-compose-setup/.gitkeep +0 -0
- package/lib/bmad-extension/skills/devops-docker-compose-setup/SKILL.md +26 -0
- package/lib/bmad-extension/skills/devops-docker-compose-setup/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension/skills/devops-manage-helm/.gitkeep +0 -0
- package/lib/bmad-extension/skills/devops-manage-helm/SKILL.md +28 -0
- package/lib/bmad-extension/skills/devops-manage-helm/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension/skills/devops-sign-docker-image/.gitkeep +0 -0
- package/lib/bmad-extension/skills/devops-sign-docker-image/SKILL.md +24 -0
- package/lib/bmad-extension/skills/devops-sign-docker-image/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension/skills/mil498-ocd/.gitkeep +0 -0
- package/lib/bmad-extension/skills/mil498-ocd/SKILL.md +30 -0
- package/lib/bmad-extension/skills/mil498-ocd/bmad-skill-manifest.yaml +5 -0
- package/lib/bmad-extension/skills/mil498-ocd/prompts/01-discover-project-artifacts.md +26 -0
- package/lib/bmad-extension/skills/mil498-ocd/prompts/02-load-template.md +10 -0
- package/lib/bmad-extension/skills/mil498-ocd/prompts/03-generate-document.md +90 -0
- package/lib/bmad-extension/skills/mil498-ocd/prompts/04-validate.md +14 -0
- package/lib/bmad-extension/skills/mil498-ocd/prompts/05-review.md +15 -0
- package/lib/bmad-extension/skills/mil498-ocd/prompts/06-save.md +15 -0
- package/lib/bmad-extension/skills/mil498-ocd/template.md +169 -0
- package/lib/bmad-extension/skills/mil498-sdd/.gitkeep +0 -0
- package/lib/bmad-extension/skills/mil498-sdd/SKILL.md +30 -0
- package/lib/bmad-extension/skills/mil498-sdd/bmad-skill-manifest.yaml +5 -0
- package/lib/bmad-extension/skills/mil498-sdd/prompts/01-discover-project-artifacts.md +50 -0
- package/lib/bmad-extension/skills/mil498-sdd/prompts/02-load-template.md +10 -0
- package/lib/bmad-extension/skills/mil498-sdd/prompts/03-generate-document.md +98 -0
- package/lib/bmad-extension/skills/mil498-sdd/prompts/04-validate.md +16 -0
- package/lib/bmad-extension/skills/mil498-sdd/prompts/05-review.md +15 -0
- package/lib/bmad-extension/skills/mil498-sdd/prompts/06-save.md +19 -0
- package/lib/bmad-extension/skills/mil498-sdd/template.md +163 -0
- package/lib/bmad-extension/skills/mil498-sdp/.gitkeep +0 -0
- package/lib/bmad-extension/skills/mil498-sdp/SKILL.md +30 -0
- package/lib/bmad-extension/skills/mil498-sdp/bmad-skill-manifest.yaml +5 -0
- package/lib/bmad-extension/skills/mil498-sdp/prompts/01-discover-project-artifacts.md +32 -0
- package/lib/bmad-extension/skills/mil498-sdp/prompts/02-load-template.md +10 -0
- package/lib/bmad-extension/skills/mil498-sdp/prompts/03-generate-document.md +187 -0
- package/lib/bmad-extension/skills/mil498-sdp/prompts/04-validate.md +13 -0
- package/lib/bmad-extension/skills/mil498-sdp/prompts/05-review.md +15 -0
- package/lib/bmad-extension/skills/mil498-sdp/prompts/06-save.md +14 -0
- package/lib/bmad-extension/skills/mil498-sdp/template.md +307 -0
- package/lib/bmad-extension/skills/mil498-srs/.gitkeep +0 -0
- package/lib/bmad-extension/skills/mil498-srs/SKILL.md +30 -0
- package/lib/bmad-extension/skills/mil498-srs/bmad-skill-manifest.yaml +5 -0
- package/lib/bmad-extension/skills/mil498-srs/prompts/01-discover-project-artifacts.md +42 -0
- package/lib/bmad-extension/skills/mil498-srs/prompts/02-load-template.md +10 -0
- package/lib/bmad-extension/skills/mil498-srs/prompts/03-generate-document.md +100 -0
- package/lib/bmad-extension/skills/mil498-srs/prompts/04-validate.md +16 -0
- package/lib/bmad-extension/skills/mil498-srs/prompts/05-review.md +15 -0
- package/lib/bmad-extension/skills/mil498-srs/prompts/06-save.md +18 -0
- package/lib/bmad-extension/skills/mil498-srs/template.md +219 -0
- package/lib/bmad-extension/skills/mil498-ssdd/.gitkeep +0 -0
- package/lib/bmad-extension/skills/mil498-ssdd/SKILL.md +32 -0
- package/lib/bmad-extension/skills/mil498-ssdd/bmad-skill-manifest.yaml +5 -0
- package/lib/bmad-extension/skills/mil498-ssdd/prompts/01-discover-project-artifacts.md +32 -0
- package/lib/bmad-extension/skills/mil498-ssdd/prompts/02-load-template.md +10 -0
- package/lib/bmad-extension/skills/mil498-ssdd/prompts/03-csci-discovery-interview.md +43 -0
- package/lib/bmad-extension/skills/mil498-ssdd/prompts/04-generate-document.md +96 -0
- package/lib/bmad-extension/skills/mil498-ssdd/prompts/05-validate.md +14 -0
- package/lib/bmad-extension/skills/mil498-ssdd/prompts/06-review.md +16 -0
- package/lib/bmad-extension/skills/mil498-ssdd/prompts/07-save.md +16 -0
- package/lib/bmad-extension/skills/mil498-ssdd/template.md +154 -0
- package/lib/bmad-extension/skills/mil498-sss/.gitkeep +0 -0
- package/lib/bmad-extension/skills/mil498-sss/SKILL.md +31 -0
- package/lib/bmad-extension/skills/mil498-sss/bmad-skill-manifest.yaml +5 -0
- package/lib/bmad-extension/skills/mil498-sss/prompts/01-discover-project-artifacts.md +31 -0
- package/lib/bmad-extension/skills/mil498-sss/prompts/02-load-template.md +10 -0
- package/lib/bmad-extension/skills/mil498-sss/prompts/03-generate-document.md +108 -0
- package/lib/bmad-extension/skills/mil498-sss/prompts/04-validate.md +16 -0
- package/lib/bmad-extension/skills/mil498-sss/prompts/05-review.md +15 -0
- package/lib/bmad-extension/skills/mil498-sss/prompts/06-save.md +15 -0
- package/lib/bmad-extension/skills/mil498-sss/template.md +225 -0
- package/lib/bmad-extension/skills/mil498-std/.gitkeep +0 -0
- package/lib/bmad-extension/skills/mil498-std/SKILL.md +30 -0
- package/lib/bmad-extension/skills/mil498-std/bmad-skill-manifest.yaml +5 -0
- package/lib/bmad-extension/skills/mil498-std/prompts/01-discover-project-artifacts.md +42 -0
- package/lib/bmad-extension/skills/mil498-std/prompts/02-load-template.md +10 -0
- package/lib/bmad-extension/skills/mil498-std/prompts/03-generate-document.md +117 -0
- package/lib/bmad-extension/skills/mil498-std/prompts/04-validate.md +15 -0
- package/lib/bmad-extension/skills/mil498-std/prompts/05-review.md +15 -0
- package/lib/bmad-extension/skills/mil498-std/prompts/06-save.md +15 -0
- package/lib/bmad-extension/skills/mil498-std/template.md +188 -0
- package/lib/bmad-extension/skills/modify-sprint/.gitkeep +0 -0
- package/lib/bmad-extension/skills/modify-sprint/SKILL.md +259 -0
- package/lib/bmad-extension/skills/modify-sprint/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension/skills/project-context-expansion/.gitkeep +0 -0
- package/lib/bmad-extension/skills/project-context-expansion/SKILL.md +238 -0
- package/lib/bmad-extension/skills/project-context-expansion/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension/skills/sprint-status-view/.gitkeep +0 -0
- package/lib/bmad-extension/skills/sprint-status-view/SKILL.md +202 -0
- package/lib/bmad-extension/skills/sprint-status-view/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension/skills/sre-check-deployment-status/.gitkeep +0 -0
- package/lib/bmad-extension/skills/sre-check-deployment-status/SKILL.md +32 -0
- package/lib/bmad-extension/skills/sre-check-deployment-status/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension/skills/sre-check-secrets/.gitkeep +0 -0
- package/lib/bmad-extension/skills/sre-check-secrets/SKILL.md +23 -0
- package/lib/bmad-extension/skills/sre-check-secrets/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension/skills/sre-check-system-status/.gitkeep +0 -0
- package/lib/bmad-extension/skills/sre-check-system-status/SKILL.md +27 -0
- package/lib/bmad-extension/skills/sre-check-system-status/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension/skills/sre-day-2-ops/.gitkeep +0 -0
- package/lib/bmad-extension/skills/sre-day-2-ops/SKILL.md +26 -0
- package/lib/bmad-extension/skills/sre-day-2-ops/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension/skills/sre-deployment-strategies/.gitkeep +0 -0
- package/lib/bmad-extension/skills/sre-deployment-strategies/SKILL.md +28 -0
- package/lib/bmad-extension/skills/sre-deployment-strategies/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension/skills/sre-fix-deployments/.gitkeep +0 -0
- package/lib/bmad-extension/skills/sre-fix-deployments/SKILL.md +25 -0
- package/lib/bmad-extension/skills/sre-fix-deployments/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension/skills/sre-gitops-status/.gitkeep +0 -0
- package/lib/bmad-extension/skills/sre-gitops-status/SKILL.md +25 -0
- package/lib/bmad-extension/skills/sre-gitops-status/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad.js +541 -1
- package/package.json +3 -3
- package/test/bmad-extension.test.js +115 -69
- package/test/bmad-version-bump.test.js +313 -0
- package/test/convert-agents-to-skills.test.js +245 -0
- package/test/extension-module-restructure.test.js +359 -0
- package/test/integration-verification.test.js +71 -40
- package/test/migration-validation.test.js +499 -0
- package/test/migration.test.js +832 -0
- package/test/story-15-5-workflow-skills.test.js +311 -0
- package/test/yes-flag.test.js +8 -1
- package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-c6e539e2308f8ed764c5b54b6ab68a67f8a3796b.idx +0 -0
- package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-c6e539e2308f8ed764c5b54b6ab68a67f8a3796b.pack +0 -0
- package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-c6e539e2308f8ed764c5b54b6ab68a67f8a3796b.rev +0 -0
- package/lib/bmad-cache/bmb/samples/bmad-agent-dream-weaver/bmad-manifest.json +0 -62
- package/lib/bmad-cache/bmb/samples/bmad-excalidraw/bmad-manifest.json +0 -18
- package/lib/bmad-cache/bmb/src/module-help.csv +0 -7
- package/lib/bmad-cache/bmb/src/module.yaml +0 -20
- package/lib/bmad-cache/bmb/src/skills/bmad-agent-builder/bmad-manifest.json +0 -24
- package/lib/bmad-cache/bmb/src/skills/bmad-agent-builder/scripts/bmad-manifest-schema.json +0 -103
- package/lib/bmad-cache/bmb/src/skills/bmad-agent-builder/scripts/generate-html-report.py +0 -1002
- package/lib/bmad-cache/bmb/src/skills/bmad-agent-builder/scripts/manifest.py +0 -420
- package/lib/bmad-cache/bmb/src/skills/bmad-workflow-builder/bmad-manifest.json +0 -23
- package/lib/bmad-cache/bmb/src/skills/bmad-workflow-builder/scripts/bmad-manifest-schema.json +0 -103
- package/lib/bmad-cache/bmb/src/skills/bmad-workflow-builder/scripts/generate-html-report.py +0 -1002
- package/lib/bmad-cache/bmb/src/skills/bmad-workflow-builder/scripts/manifest.py +0 -420
- package/lib/bmad-cache/cis/_git_preserved/objects/pack/pack-157d7eb8d527233a8607d926fc74ebf87f2ae0d3.idx +0 -0
- package/lib/bmad-cache/cis/_git_preserved/objects/pack/pack-157d7eb8d527233a8607d926fc74ebf87f2ae0d3.rev +0 -0
- package/lib/bmad-cache/cis/src/agents/brainstorming-coach.agent.yaml +0 -21
- package/lib/bmad-cache/cis/src/agents/creative-problem-solver.agent.yaml +0 -21
- package/lib/bmad-cache/cis/src/agents/design-thinking-coach.agent.yaml +0 -21
- package/lib/bmad-cache/cis/src/agents/innovation-strategist.agent.yaml +0 -21
- package/lib/bmad-cache/cis/src/agents/presentation-master.agent.yaml +0 -53
- package/lib/bmad-cache/cis/src/agents/storyteller/storyteller.agent.yaml +0 -25
- package/lib/bmad-cache/cis/src/teams/creative-squad.yaml +0 -7
- package/lib/bmad-cache/cis/src/teams/default-party.csv +0 -12
- package/lib/bmad-cache/cis/src/workflows/README.md +0 -175
- package/lib/bmad-cache/gds/_git_preserved/objects/pack/pack-44faafb9245b4ca17ad81bd6c9e6fc52fb5915a1.idx +0 -0
- package/lib/bmad-cache/gds/_git_preserved/objects/pack/pack-44faafb9245b4ca17ad81bd6c9e6fc52fb5915a1.rev +0 -0
- package/lib/bmad-cache/gds/_git_preserved/refs/tags/v0.2.2 +0 -1
- package/lib/bmad-cache/tea/_git_preserved/objects/pack/pack-96ec1ce3a9ef4c891e00e060795b4434ba8f7163.idx +0 -0
- package/lib/bmad-cache/tea/_git_preserved/objects/pack/pack-96ec1ce3a9ef4c891e00e060795b4434ba8f7163.rev +0 -0
- package/lib/bmad-cache/tea/_git_preserved/refs/tags/v1.7.0 +0 -1
- package/lib/bmad-cache/tea/docs/MIGRATION.md +0 -488
- package/lib/bmad-cache/tea/src/agents/tea.agent.yaml +0 -67
- package/lib/bmad-cache/tea/src/teams/default-party.csv +0 -2
- package/lib/bmad-customizations/bmm-cyber.customize.yaml +0 -24
- package/lib/bmad-customizations/bmm-devops.customize.yaml +0 -24
- package/lib/bmad-customizations/bmm-mil498.customize.yaml +0 -36
- package/lib/bmad-customizations/bmm-sre.customize.yaml +0 -24
- package/lib/bmad-customizations/cyber.md +0 -71
- package/lib/bmad-customizations/devops.md +0 -71
- package/lib/bmad-customizations/mil498.md +0 -75
- package/lib/bmad-customizations/sre.md +0 -71
- package/lib/bmad-extension/agents/bmm-architect.customize.yaml +0 -5
- package/lib/bmad-extension/agents/bmm-bmad-master.customize.yaml +0 -5
- package/lib/bmad-extension/agents/bmm-cyber.customize.yaml +0 -30
- package/lib/bmad-extension/agents/bmm-dev.customize.yaml +0 -5
- package/lib/bmad-extension/agents/bmm-devops.customize.yaml +0 -30
- package/lib/bmad-extension/agents/bmm-mil498.customize.yaml +0 -42
- package/lib/bmad-extension/agents/bmm-pm.customize.yaml +0 -5
- package/lib/bmad-extension/agents/bmm-qa.customize.yaml +0 -5
- package/lib/bmad-extension/agents/bmm-sm.customize.yaml +0 -5
- package/lib/bmad-extension/agents/bmm-sre.customize.yaml +0 -30
- package/lib/bmad-extension/agents/bmm-tech-writer.customize.yaml +0 -5
- package/lib/bmad-extension/agents/bmm-ux-designer.customize.yaml +0 -5
- /package/lib/bmad-cache/bmb/{src/skills → skills}/bmad-agent-builder/scripts/scan-scripts.py +0 -0
- /package/lib/bmad-cache/bmb/{src/skills → skills}/bmad-workflow-builder/scripts/prepass-prompt-metrics.py +0 -0
- /package/lib/bmad-cache/bmb/{src/skills → skills}/bmad-workflow-builder/scripts/scan-scripts.py +0 -0
- /package/lib/bmad-cache/{bmb/src/skills/bmad-agent-builder → cis/src/skills/bmad-cis-design-thinking}/bmad-skill-manifest.yaml +0 -0
- /package/lib/bmad-cache/cis/src/{workflows → skills}/bmad-cis-design-thinking/design-methods.csv +0 -0
- /package/lib/bmad-cache/{bmb/src/skills/bmad-workflow-builder → cis/src/skills/bmad-cis-innovation-strategy}/bmad-skill-manifest.yaml +0 -0
- /package/lib/bmad-cache/cis/src/{workflows → skills}/bmad-cis-innovation-strategy/innovation-frameworks.csv +0 -0
- /package/lib/bmad-cache/cis/src/{workflows/bmad-cis-design-thinking → skills/bmad-cis-problem-solving}/bmad-skill-manifest.yaml +0 -0
- /package/lib/bmad-cache/cis/src/{workflows → skills}/bmad-cis-problem-solving/solving-methods.csv +0 -0
- /package/lib/bmad-cache/cis/src/{workflows/bmad-cis-innovation-strategy → skills/bmad-cis-storytelling}/bmad-skill-manifest.yaml +0 -0
- /package/lib/bmad-cache/cis/src/{workflows → skills}/bmad-cis-storytelling/story-types.csv +0 -0
- /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/adr-quality-readiness-checklist.md +0 -0
- /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/api-request.md +0 -0
- /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/api-testing-patterns.md +0 -0
- /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/auth-session.md +0 -0
- /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/burn-in.md +0 -0
- /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/ci-burn-in.md +0 -0
- /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/component-tdd.md +0 -0
- /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/contract-testing.md +0 -0
- /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/data-factories.md +0 -0
- /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/email-auth.md +0 -0
- /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/error-handling.md +0 -0
- /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/feature-flags.md +0 -0
- /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/file-utils.md +0 -0
- /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/fixture-architecture.md +0 -0
- /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/fixtures-composition.md +0 -0
- /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/intercept-network-call.md +0 -0
- /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/log.md +0 -0
- /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/network-error-monitor.md +0 -0
- /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/network-first.md +0 -0
- /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/network-recorder.md +0 -0
- /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/nfr-criteria.md +0 -0
- /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/overview.md +0 -0
- /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/pact-consumer-di.md +0 -0
- /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/pact-consumer-framework-setup.md +0 -0
- /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/pact-mcp.md +0 -0
- /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/pactjs-utils-consumer-helpers.md +0 -0
- /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/pactjs-utils-overview.md +0 -0
- /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/pactjs-utils-provider-verifier.md +0 -0
- /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/pactjs-utils-request-filter.md +0 -0
- /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/playwright-cli.md +0 -0
- /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/playwright-config.md +0 -0
- /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/probability-impact.md +0 -0
- /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/recurse.md +0 -0
- /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/risk-governance.md +0 -0
- /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/selective-testing.md +0 -0
- /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/selector-resilience.md +0 -0
- /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/test-healing-patterns.md +0 -0
- /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/test-levels-framework.md +0 -0
- /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/test-priorities-matrix.md +0 -0
- /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/test-quality.md +0 -0
- /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/timing-debugging.md +0 -0
- /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/visual-debugging.md +0 -0
- /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/tea-index.csv +0 -0
- /package/lib/bmad-cache/{cis/src/workflows/bmad-cis-problem-solving → wds/src/workflows/wds-0-alignment-signoff}/bmad-skill-manifest.yaml +0 -0
- /package/lib/bmad-cache/{cis/src/workflows/bmad-cis-storytelling → wds/src/workflows/wds-0-project-setup}/bmad-skill-manifest.yaml +0 -0
|
@@ -14,7 +14,6 @@ Covers:
|
|
|
14
14
|
- Config header and progression condition presence per prompt
|
|
15
15
|
- File-level token estimates (chars / 4 rough approximation)
|
|
16
16
|
- Prompt frontmatter validation (name, description, menu-code)
|
|
17
|
-
- Manifest alignment check (frontmatter vs bmad-manifest.json entries)
|
|
18
17
|
- Wall-of-text detection
|
|
19
18
|
- Suggestive loading grep
|
|
20
19
|
"""
|
|
@@ -197,69 +196,6 @@ def parse_prompt_frontmatter(filepath: Path) -> dict:
|
|
|
197
196
|
return result
|
|
198
197
|
|
|
199
198
|
|
|
200
|
-
def check_manifest_alignment(skill_path: Path, prompt_frontmatters: dict[str, dict]) -> dict:
|
|
201
|
-
"""Compare prompt frontmatter against bmad-manifest.json entries."""
|
|
202
|
-
alignment = {
|
|
203
|
-
'manifest_found': False,
|
|
204
|
-
'mismatches': [],
|
|
205
|
-
'manifest_only': [],
|
|
206
|
-
'prompt_only': [],
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
manifest_path = skill_path / 'bmad-manifest.json'
|
|
210
|
-
if not manifest_path.exists():
|
|
211
|
-
return alignment
|
|
212
|
-
|
|
213
|
-
try:
|
|
214
|
-
data = json.loads(manifest_path.read_text(encoding='utf-8'))
|
|
215
|
-
except (json.JSONDecodeError, OSError):
|
|
216
|
-
return alignment
|
|
217
|
-
|
|
218
|
-
alignment['manifest_found'] = True
|
|
219
|
-
|
|
220
|
-
capabilities = data.get('capabilities', [])
|
|
221
|
-
if not isinstance(capabilities, list):
|
|
222
|
-
return alignment
|
|
223
|
-
|
|
224
|
-
# Build manifest lookup by name
|
|
225
|
-
manifest_caps = {}
|
|
226
|
-
for cap in capabilities:
|
|
227
|
-
if isinstance(cap, dict) and cap.get('name'):
|
|
228
|
-
manifest_caps[cap['name']] = cap
|
|
229
|
-
|
|
230
|
-
# Compare
|
|
231
|
-
prompt_names = set(prompt_frontmatters.keys())
|
|
232
|
-
manifest_names = set(manifest_caps.keys())
|
|
233
|
-
|
|
234
|
-
alignment['manifest_only'] = sorted(manifest_names - prompt_names)
|
|
235
|
-
alignment['prompt_only'] = sorted(prompt_names - manifest_names)
|
|
236
|
-
|
|
237
|
-
# Check field mismatches for overlapping entries
|
|
238
|
-
for name in sorted(prompt_names & manifest_names):
|
|
239
|
-
pfm = prompt_frontmatters[name]
|
|
240
|
-
mcap = manifest_caps[name]
|
|
241
|
-
|
|
242
|
-
issues = []
|
|
243
|
-
# Compare name field
|
|
244
|
-
pfm_name = pfm.get('fields', {}).get('name')
|
|
245
|
-
if pfm_name and pfm_name != mcap.get('name'):
|
|
246
|
-
issues.append(f'name mismatch: frontmatter="{pfm_name}" manifest="{mcap.get("name")}"')
|
|
247
|
-
|
|
248
|
-
# Compare menu-code
|
|
249
|
-
pfm_mc = pfm.get('fields', {}).get('menu-code')
|
|
250
|
-
mcap_mc = mcap.get('menu-code')
|
|
251
|
-
if pfm_mc and mcap_mc and pfm_mc != mcap_mc:
|
|
252
|
-
issues.append(f'menu-code mismatch: frontmatter="{pfm_mc}" manifest="{mcap_mc}"')
|
|
253
|
-
|
|
254
|
-
if issues:
|
|
255
|
-
alignment['mismatches'].append({
|
|
256
|
-
'name': name,
|
|
257
|
-
'issues': issues,
|
|
258
|
-
})
|
|
259
|
-
|
|
260
|
-
return alignment
|
|
261
|
-
|
|
262
|
-
|
|
263
199
|
def scan_file_patterns(filepath: Path, rel_path: str) -> dict:
|
|
264
200
|
"""Extract metrics and pattern matches from a single file."""
|
|
265
201
|
content = filepath.read_text(encoding='utf-8')
|
|
@@ -357,9 +293,8 @@ def scan_prompt_metrics(skill_path: Path) -> dict:
|
|
|
357
293
|
data['is_skill_md'] = True
|
|
358
294
|
files_data.append(data)
|
|
359
295
|
|
|
360
|
-
# Prompt files at skill root
|
|
361
|
-
|
|
362
|
-
skip_files = {'SKILL.md', 'bmad-manifest.json', 'bmad-skill-manifest.yaml'}
|
|
296
|
+
# Prompt files at skill root
|
|
297
|
+
skip_files = {'SKILL.md'}
|
|
363
298
|
|
|
364
299
|
for f in sorted(skill_path.iterdir()):
|
|
365
300
|
if f.is_file() and f.suffix == '.md' and f.name not in skip_files and f.name != 'SKILL.md':
|
|
@@ -370,10 +305,6 @@ def scan_prompt_metrics(skill_path: Path) -> dict:
|
|
|
370
305
|
pfm = parse_prompt_frontmatter(f)
|
|
371
306
|
data['prompt_frontmatter'] = pfm
|
|
372
307
|
|
|
373
|
-
# Use stem as key for manifest alignment
|
|
374
|
-
prompt_name = pfm.get('fields', {}).get('name', f.stem)
|
|
375
|
-
prompt_frontmatters[prompt_name] = pfm
|
|
376
|
-
|
|
377
308
|
files_data.append(data)
|
|
378
309
|
|
|
379
310
|
# Resources (just sizes, for progressive disclosure assessment)
|
|
@@ -388,9 +319,6 @@ def scan_prompt_metrics(skill_path: Path) -> dict:
|
|
|
388
319
|
'tokens': len(content) // 4,
|
|
389
320
|
}
|
|
390
321
|
|
|
391
|
-
# Manifest alignment
|
|
392
|
-
manifest_alignment = check_manifest_alignment(skill_path, prompt_frontmatters)
|
|
393
|
-
|
|
394
322
|
# Aggregate stats
|
|
395
323
|
total_waste = sum(len(f['waste_patterns']) for f in files_data)
|
|
396
324
|
total_backrefs = sum(len(f['back_references']) for f in files_data)
|
|
@@ -434,7 +362,6 @@ def scan_prompt_metrics(skill_path: Path) -> dict:
|
|
|
434
362
|
'total_wall_of_text': total_walls,
|
|
435
363
|
},
|
|
436
364
|
'resource_sizes': resource_sizes,
|
|
437
|
-
'manifest_alignment': manifest_alignment,
|
|
438
365
|
'files': files_data,
|
|
439
366
|
}
|
|
440
367
|
|
|
@@ -8,8 +8,6 @@ can use instead of reading all files itself. Covers:
|
|
|
8
8
|
- Template artifact detection
|
|
9
9
|
- Agent name validation (bmad-{code}-agent-{name} or bmad-agent-{name})
|
|
10
10
|
- Required agent sections (Overview, Identity, Communication Style, Principles, On Activation)
|
|
11
|
-
- bmad-manifest.json validation (persona field for agent detection, capabilities)
|
|
12
|
-
- Capability cross-referencing with prompt files at skill root
|
|
13
11
|
- Memory path consistency checking
|
|
14
12
|
- Language/directness pattern grep
|
|
15
13
|
- On Exit / Exiting section detection (invalid)
|
|
@@ -214,190 +212,13 @@ def find_template_artifacts(filepath: Path, rel_path: str) -> list[dict]:
|
|
|
214
212
|
return findings
|
|
215
213
|
|
|
216
214
|
|
|
217
|
-
def validate_manifest(skill_path: Path) -> tuple[dict, list[dict]]:
|
|
218
|
-
"""Validate bmad-manifest.json for agent requirements."""
|
|
219
|
-
findings = []
|
|
220
|
-
validation = {
|
|
221
|
-
'found': False,
|
|
222
|
-
'valid_json': False,
|
|
223
|
-
'is_agent': False,
|
|
224
|
-
'has_capabilities': False,
|
|
225
|
-
'capability_count': 0,
|
|
226
|
-
'menu_codes': [],
|
|
227
|
-
'duplicate_menu_codes': [],
|
|
228
|
-
'capability_issues': [],
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
manifest_path = skill_path / 'bmad-manifest.json'
|
|
232
|
-
if not manifest_path.exists():
|
|
233
|
-
findings.append({
|
|
234
|
-
'file': 'bmad-manifest.json', 'line': 0,
|
|
235
|
-
'severity': 'high', 'category': 'manifest',
|
|
236
|
-
'issue': 'bmad-manifest.json not found at skill root',
|
|
237
|
-
})
|
|
238
|
-
return validation, findings
|
|
239
|
-
|
|
240
|
-
validation['found'] = True
|
|
241
|
-
|
|
242
|
-
try:
|
|
243
|
-
data = json.loads(manifest_path.read_text(encoding='utf-8'))
|
|
244
|
-
except json.JSONDecodeError as e:
|
|
245
|
-
findings.append({
|
|
246
|
-
'file': 'bmad-manifest.json', 'line': 0,
|
|
247
|
-
'severity': 'critical', 'category': 'manifest',
|
|
248
|
-
'issue': f'Invalid JSON in bmad-manifest.json: {e}',
|
|
249
|
-
})
|
|
250
|
-
return validation, findings
|
|
251
|
-
|
|
252
|
-
validation['valid_json'] = True
|
|
253
|
-
|
|
254
|
-
# Check if this is an agent (agents have a persona field)
|
|
255
|
-
has_persona = 'persona' in data
|
|
256
|
-
validation['is_agent'] = has_persona
|
|
257
|
-
if not has_persona:
|
|
258
|
-
findings.append({
|
|
259
|
-
'file': 'bmad-manifest.json', 'line': 0,
|
|
260
|
-
'severity': 'high', 'category': 'manifest',
|
|
261
|
-
'issue': 'Missing "persona" field — agents are identified by having a persona field',
|
|
262
|
-
})
|
|
263
|
-
|
|
264
|
-
# Check capabilities
|
|
265
|
-
capabilities = data.get('capabilities')
|
|
266
|
-
if capabilities is None:
|
|
267
|
-
findings.append({
|
|
268
|
-
'file': 'bmad-manifest.json', 'line': 0,
|
|
269
|
-
'severity': 'high', 'category': 'manifest',
|
|
270
|
-
'issue': 'Missing "capabilities" field',
|
|
271
|
-
})
|
|
272
|
-
return validation, findings
|
|
273
|
-
|
|
274
|
-
if not isinstance(capabilities, list):
|
|
275
|
-
findings.append({
|
|
276
|
-
'file': 'bmad-manifest.json', 'line': 0,
|
|
277
|
-
'severity': 'high', 'category': 'manifest',
|
|
278
|
-
'issue': '"capabilities" is not an array',
|
|
279
|
-
})
|
|
280
|
-
return validation, findings
|
|
281
|
-
|
|
282
|
-
validation['has_capabilities'] = True
|
|
283
|
-
validation['capability_count'] = len(capabilities)
|
|
284
|
-
|
|
285
|
-
# Check each capability for required fields and unique menu codes
|
|
286
|
-
required_fields = {'name', 'menu-code', 'description'}
|
|
287
|
-
menu_codes = []
|
|
288
|
-
|
|
289
|
-
for i, cap in enumerate(capabilities):
|
|
290
|
-
if not isinstance(cap, dict):
|
|
291
|
-
findings.append({
|
|
292
|
-
'file': 'bmad-manifest.json', 'line': 0,
|
|
293
|
-
'severity': 'high', 'category': 'manifest',
|
|
294
|
-
'issue': f'Capability at index {i} is not an object',
|
|
295
|
-
})
|
|
296
|
-
continue
|
|
297
|
-
|
|
298
|
-
missing = required_fields - set(cap.keys())
|
|
299
|
-
if missing:
|
|
300
|
-
cap_name = cap.get('name', f'index-{i}')
|
|
301
|
-
findings.append({
|
|
302
|
-
'file': 'bmad-manifest.json', 'line': 0,
|
|
303
|
-
'severity': 'high', 'category': 'manifest',
|
|
304
|
-
'issue': f'Capability "{cap_name}" missing required fields: {", ".join(sorted(missing))}',
|
|
305
|
-
})
|
|
306
|
-
|
|
307
|
-
mc = cap.get('menu-code')
|
|
308
|
-
if mc:
|
|
309
|
-
menu_codes.append(mc)
|
|
310
|
-
|
|
311
|
-
validation['menu_codes'] = menu_codes
|
|
312
|
-
|
|
313
|
-
# Check for duplicate menu codes
|
|
314
|
-
seen = set()
|
|
315
|
-
dupes = set()
|
|
316
|
-
for mc in menu_codes:
|
|
317
|
-
if mc in seen:
|
|
318
|
-
dupes.add(mc)
|
|
319
|
-
seen.add(mc)
|
|
320
|
-
|
|
321
|
-
if dupes:
|
|
322
|
-
validation['duplicate_menu_codes'] = sorted(dupes)
|
|
323
|
-
findings.append({
|
|
324
|
-
'file': 'bmad-manifest.json', 'line': 0,
|
|
325
|
-
'severity': 'high', 'category': 'manifest',
|
|
326
|
-
'issue': f'Duplicate menu codes: {", ".join(sorted(dupes))}',
|
|
327
|
-
})
|
|
328
|
-
|
|
329
|
-
return validation, findings
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
def cross_reference_capabilities(skill_path: Path) -> tuple[dict, list[dict]]:
|
|
333
|
-
"""Cross-reference manifest capabilities with prompt files."""
|
|
334
|
-
findings = []
|
|
335
|
-
crossref = {
|
|
336
|
-
'manifest_prompt_caps': [],
|
|
337
|
-
'missing_prompt_files': [],
|
|
338
|
-
'orphaned_prompt_files': [],
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
manifest_path = skill_path / 'bmad-manifest.json'
|
|
342
|
-
|
|
343
|
-
if not manifest_path.exists():
|
|
344
|
-
return crossref, findings
|
|
345
|
-
|
|
346
|
-
try:
|
|
347
|
-
data = json.loads(manifest_path.read_text(encoding='utf-8'))
|
|
348
|
-
except (json.JSONDecodeError, OSError):
|
|
349
|
-
return crossref, findings
|
|
350
|
-
|
|
351
|
-
capabilities = data.get('capabilities', [])
|
|
352
|
-
if not isinstance(capabilities, list):
|
|
353
|
-
return crossref, findings
|
|
354
|
-
|
|
355
|
-
# Get prompt-type capabilities from manifest
|
|
356
|
-
prompt_cap_names = set()
|
|
357
|
-
for cap in capabilities:
|
|
358
|
-
if isinstance(cap, dict) and cap.get('type') == 'prompt':
|
|
359
|
-
name = cap.get('name')
|
|
360
|
-
if name:
|
|
361
|
-
prompt_cap_names.add(name)
|
|
362
|
-
crossref['manifest_prompt_caps'].append(name)
|
|
363
|
-
|
|
364
|
-
# Get actual prompt files (at skill root, excluding SKILL.md and non-prompt files)
|
|
365
|
-
actual_prompts = set()
|
|
366
|
-
skip_files = {'SKILL.md', 'bmad-manifest.json', 'bmad-skill-manifest.yaml'}
|
|
367
|
-
for f in skill_path.iterdir():
|
|
368
|
-
if f.is_file() and f.suffix == '.md' and f.name not in skip_files:
|
|
369
|
-
actual_prompts.add(f.stem)
|
|
370
|
-
|
|
371
|
-
# Missing prompt files (in manifest but no file)
|
|
372
|
-
missing = prompt_cap_names - actual_prompts
|
|
373
|
-
for name in sorted(missing):
|
|
374
|
-
crossref['missing_prompt_files'].append(name)
|
|
375
|
-
findings.append({
|
|
376
|
-
'file': 'bmad-manifest.json', 'line': 0,
|
|
377
|
-
'severity': 'high', 'category': 'capability-crossref',
|
|
378
|
-
'issue': f'Prompt capability "{name}" has no matching file {name}.md at skill root',
|
|
379
|
-
})
|
|
380
|
-
|
|
381
|
-
# Orphaned prompt files (file exists but not in manifest)
|
|
382
|
-
orphaned = actual_prompts - prompt_cap_names
|
|
383
|
-
for name in sorted(orphaned):
|
|
384
|
-
crossref['orphaned_prompt_files'].append(name)
|
|
385
|
-
findings.append({
|
|
386
|
-
'file': f'{name}.md', 'line': 0,
|
|
387
|
-
'severity': 'medium', 'category': 'capability-crossref',
|
|
388
|
-
'issue': f'Prompt file {name}.md not referenced as a prompt capability in manifest',
|
|
389
|
-
})
|
|
390
|
-
|
|
391
|
-
return crossref, findings
|
|
392
|
-
|
|
393
|
-
|
|
394
215
|
def extract_memory_paths(skill_path: Path) -> tuple[list[str], list[dict]]:
|
|
395
216
|
"""Extract all memory path references across files and check consistency."""
|
|
396
217
|
findings = []
|
|
397
218
|
memory_paths = set()
|
|
398
219
|
|
|
399
220
|
# Memory path patterns
|
|
400
|
-
mem_pattern = re.compile(r'(?:memory/|sidecar
|
|
221
|
+
mem_pattern = re.compile(r'(?:memory/|sidecar/)[\w\-/]+(?:\.\w+)?')
|
|
401
222
|
|
|
402
223
|
files_to_scan = []
|
|
403
224
|
|
|
@@ -419,7 +240,7 @@ def extract_memory_paths(skill_path: Path) -> tuple[list[str], list[dict]]:
|
|
|
419
240
|
|
|
420
241
|
sorted_paths = sorted(memory_paths)
|
|
421
242
|
|
|
422
|
-
# Check for inconsistent formats
|
|
243
|
+
# Check for inconsistent formats
|
|
423
244
|
prefixes = set()
|
|
424
245
|
for p in sorted_paths:
|
|
425
246
|
prefix = p.split('/')[0]
|
|
@@ -449,7 +270,7 @@ def check_prompt_basics(skill_path: Path) -> tuple[list[dict], list[dict]]:
|
|
|
449
270
|
"""Check each prompt file for config header and progression conditions."""
|
|
450
271
|
findings = []
|
|
451
272
|
prompt_details = []
|
|
452
|
-
skip_files = {'SKILL.md'
|
|
273
|
+
skip_files = {'SKILL.md'}
|
|
453
274
|
|
|
454
275
|
prompt_files = [f for f in sorted(skill_path.iterdir())
|
|
455
276
|
if f.is_file() and f.suffix == '.md' and f.name not in skip_files]
|
|
@@ -545,15 +366,6 @@ def scan_structure_capabilities(skill_path: Path) -> dict:
|
|
|
545
366
|
'issue': message,
|
|
546
367
|
})
|
|
547
368
|
|
|
548
|
-
# Manifest validation
|
|
549
|
-
manifest_validation, manifest_findings = validate_manifest(skill_path)
|
|
550
|
-
all_findings.extend(manifest_findings)
|
|
551
|
-
has_manifest = manifest_validation['found']
|
|
552
|
-
|
|
553
|
-
# Capability cross-reference
|
|
554
|
-
capability_crossref, crossref_findings = cross_reference_capabilities(skill_path)
|
|
555
|
-
all_findings.extend(crossref_findings)
|
|
556
|
-
|
|
557
369
|
# Memory path consistency
|
|
558
370
|
memory_paths, memory_findings = extract_memory_paths(skill_path)
|
|
559
371
|
all_findings.extend(memory_findings)
|
|
@@ -585,9 +397,6 @@ def scan_structure_capabilities(skill_path: Path) -> dict:
|
|
|
585
397
|
'metadata': {
|
|
586
398
|
'frontmatter': frontmatter,
|
|
587
399
|
'sections': sections,
|
|
588
|
-
'has_manifest': has_manifest,
|
|
589
|
-
'manifest_validation': manifest_validation,
|
|
590
|
-
'capability_crossref': capability_crossref,
|
|
591
400
|
},
|
|
592
401
|
'prompt_details': prompt_details,
|
|
593
402
|
'memory_paths': memory_paths,
|
package/lib/bmad-cache/bmb/{src/skills → skills}/bmad-agent-builder/scripts/scan-path-standards.py
RENAMED
|
@@ -5,9 +5,12 @@ Validates all .md and .json files against BMad path conventions:
|
|
|
5
5
|
1. {project-root} only valid before /_bmad
|
|
6
6
|
2. Bare _bmad references must have {project-root} prefix
|
|
7
7
|
3. Config variables used directly (no double-prefix)
|
|
8
|
-
4.
|
|
9
|
-
5. No
|
|
10
|
-
6.
|
|
8
|
+
4. Skill-internal paths must use ./ prefix (references/, scripts/, assets/)
|
|
9
|
+
5. No ../ parent directory references
|
|
10
|
+
6. No absolute paths
|
|
11
|
+
7. Memory paths must use {project-root}/_bmad/memory/{skillName}-sidecar/
|
|
12
|
+
8. Frontmatter allows only name and description
|
|
13
|
+
9. No .md files at skill root except SKILL.md
|
|
11
14
|
"""
|
|
12
15
|
|
|
13
16
|
# /// script
|
|
@@ -33,17 +36,22 @@ BARE_BMAD_RE = re.compile(r'(?<!\{project-root\}/)_bmad[/\s]')
|
|
|
33
36
|
# Absolute paths
|
|
34
37
|
ABSOLUTE_PATH_RE = re.compile(r'(?:^|[\s"`\'(])(/(?:Users|home|opt|var|tmp|etc|usr)/\S+)', re.MULTILINE)
|
|
35
38
|
HOME_PATH_RE = re.compile(r'(?:^|[\s"`\'(])(~/\S+)', re.MULTILINE)
|
|
36
|
-
#
|
|
39
|
+
# Parent directory reference (still invalid)
|
|
37
40
|
RELATIVE_DOT_RE = re.compile(r'(?:^|[\s"`\'(])(\.\./\S+)', re.MULTILINE)
|
|
38
|
-
|
|
41
|
+
# Bare skill-internal paths without ./ prefix
|
|
42
|
+
# Match references/, scripts/, assets/ when NOT preceded by ./
|
|
43
|
+
BARE_INTERNAL_RE = re.compile(r'(?:^|[\s"`\'(])(?<!\./)((?:references|scripts|assets)/\S+)', re.MULTILINE)
|
|
39
44
|
|
|
40
|
-
# Memory path pattern: should use {project-root}/_bmad/
|
|
41
|
-
MEMORY_PATH_RE = re.compile(r'_bmad/
|
|
42
|
-
VALID_MEMORY_PATH_RE = re.compile(r'\{project-root\}/_bmad/
|
|
45
|
+
# Memory path pattern: should use {project-root}/_bmad/memory/
|
|
46
|
+
MEMORY_PATH_RE = re.compile(r'_bmad/memory/\S+')
|
|
47
|
+
VALID_MEMORY_PATH_RE = re.compile(r'\{project-root\}/_bmad/memory/\S+-sidecar/')
|
|
43
48
|
|
|
44
49
|
# Fenced code block detection (to skip examples showing wrong patterns)
|
|
45
50
|
FENCE_RE = re.compile(r'^```', re.MULTILINE)
|
|
46
51
|
|
|
52
|
+
# Valid frontmatter keys
|
|
53
|
+
VALID_FRONTMATTER_KEYS = {'name', 'description'}
|
|
54
|
+
|
|
47
55
|
|
|
48
56
|
def is_in_fenced_block(content: str, pos: int) -> bool:
|
|
49
57
|
"""Check if a position is inside a fenced code block."""
|
|
@@ -57,6 +65,76 @@ def get_line_number(content: str, pos: int) -> int:
|
|
|
57
65
|
return content[:pos].count('\n') + 1
|
|
58
66
|
|
|
59
67
|
|
|
68
|
+
def check_frontmatter(content: str, filepath: Path) -> list[dict]:
|
|
69
|
+
"""Validate SKILL.md frontmatter contains only allowed keys."""
|
|
70
|
+
findings = []
|
|
71
|
+
if filepath.name != 'SKILL.md':
|
|
72
|
+
return findings
|
|
73
|
+
|
|
74
|
+
if not content.startswith('---'):
|
|
75
|
+
findings.append({
|
|
76
|
+
'file': filepath.name,
|
|
77
|
+
'line': 1,
|
|
78
|
+
'severity': 'critical',
|
|
79
|
+
'category': 'frontmatter',
|
|
80
|
+
'title': 'SKILL.md missing frontmatter block',
|
|
81
|
+
'detail': 'SKILL.md must start with --- frontmatter containing name and description',
|
|
82
|
+
'action': 'Add frontmatter with name and description fields',
|
|
83
|
+
})
|
|
84
|
+
return findings
|
|
85
|
+
|
|
86
|
+
# Find closing ---
|
|
87
|
+
end = content.find('\n---', 3)
|
|
88
|
+
if end == -1:
|
|
89
|
+
findings.append({
|
|
90
|
+
'file': filepath.name,
|
|
91
|
+
'line': 1,
|
|
92
|
+
'severity': 'critical',
|
|
93
|
+
'category': 'frontmatter',
|
|
94
|
+
'title': 'SKILL.md frontmatter block not closed',
|
|
95
|
+
'detail': 'Missing closing --- for frontmatter',
|
|
96
|
+
'action': 'Add closing --- after frontmatter fields',
|
|
97
|
+
})
|
|
98
|
+
return findings
|
|
99
|
+
|
|
100
|
+
frontmatter = content[4:end]
|
|
101
|
+
for i, line in enumerate(frontmatter.split('\n'), start=2):
|
|
102
|
+
line = line.strip()
|
|
103
|
+
if not line or line.startswith('#'):
|
|
104
|
+
continue
|
|
105
|
+
if ':' in line:
|
|
106
|
+
key = line.split(':', 1)[0].strip()
|
|
107
|
+
if key not in VALID_FRONTMATTER_KEYS:
|
|
108
|
+
findings.append({
|
|
109
|
+
'file': filepath.name,
|
|
110
|
+
'line': i,
|
|
111
|
+
'severity': 'high',
|
|
112
|
+
'category': 'frontmatter',
|
|
113
|
+
'title': f'Invalid frontmatter key: {key}',
|
|
114
|
+
'detail': f'Only {", ".join(sorted(VALID_FRONTMATTER_KEYS))} are allowed in frontmatter',
|
|
115
|
+
'action': f'Remove {key} from frontmatter — use as content field in SKILL.md body instead',
|
|
116
|
+
})
|
|
117
|
+
|
|
118
|
+
return findings
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def check_root_md_files(skill_path: Path) -> list[dict]:
|
|
122
|
+
"""Check that no .md files exist at skill root except SKILL.md."""
|
|
123
|
+
findings = []
|
|
124
|
+
for md_file in skill_path.glob('*.md'):
|
|
125
|
+
if md_file.name != 'SKILL.md':
|
|
126
|
+
findings.append({
|
|
127
|
+
'file': md_file.name,
|
|
128
|
+
'line': 0,
|
|
129
|
+
'severity': 'high',
|
|
130
|
+
'category': 'structure',
|
|
131
|
+
'title': f'Prompt file at skill root: {md_file.name}',
|
|
132
|
+
'detail': 'All progressive disclosure content must be in ./references/ — only SKILL.md belongs at root',
|
|
133
|
+
'action': f'Move {md_file.name} to references/{md_file.name}',
|
|
134
|
+
})
|
|
135
|
+
return findings
|
|
136
|
+
|
|
137
|
+
|
|
60
138
|
def scan_file(filepath: Path, skip_fenced: bool = True) -> list[dict]:
|
|
61
139
|
"""Scan a single file for path standard violations."""
|
|
62
140
|
findings = []
|
|
@@ -70,10 +148,10 @@ def scan_file(filepath: Path, skip_fenced: bool = True) -> list[dict]:
|
|
|
70
148
|
'Absolute path found — not portable across machines'),
|
|
71
149
|
(HOME_PATH_RE, 'absolute-path', 'high',
|
|
72
150
|
'Home directory path (~/) found — environment-specific'),
|
|
73
|
-
(RELATIVE_DOT_RE, 'relative-prefix', '
|
|
151
|
+
(RELATIVE_DOT_RE, 'relative-prefix', 'high',
|
|
74
152
|
'Parent directory reference (../) found — fragile, breaks with reorganization'),
|
|
75
|
-
(
|
|
76
|
-
'
|
|
153
|
+
(BARE_INTERNAL_RE, 'bare-internal-path', 'high',
|
|
154
|
+
'Bare skill-internal path without ./ prefix — use ./references/, ./scripts/, ./assets/ to distinguish from {project-root} paths'),
|
|
77
155
|
]
|
|
78
156
|
|
|
79
157
|
for pattern, category, severity, message in checks:
|
|
@@ -99,9 +177,6 @@ def scan_file(filepath: Path, skip_fenced: bool = True) -> list[dict]:
|
|
|
99
177
|
pos = match.start()
|
|
100
178
|
if skip_fenced and is_in_fenced_block(content, pos):
|
|
101
179
|
continue
|
|
102
|
-
# Check that this isn't part of {project-root}/_bmad
|
|
103
|
-
# The negative lookbehind handles this, but double-check
|
|
104
|
-
# the broader context
|
|
105
180
|
start = max(0, pos - 30)
|
|
106
181
|
before = content[start:pos]
|
|
107
182
|
if '{project-root}/' in before:
|
|
@@ -118,12 +193,11 @@ def scan_file(filepath: Path, skip_fenced: bool = True) -> list[dict]:
|
|
|
118
193
|
'action': '',
|
|
119
194
|
})
|
|
120
195
|
|
|
121
|
-
# Memory path check — memory paths should use {project-root}/_bmad/
|
|
196
|
+
# Memory path check — memory paths should use {project-root}/_bmad/memory/{skillName}-sidecar/
|
|
122
197
|
for match in MEMORY_PATH_RE.finditer(content):
|
|
123
198
|
pos = match.start()
|
|
124
199
|
if skip_fenced and is_in_fenced_block(content, pos):
|
|
125
200
|
continue
|
|
126
|
-
# Check if properly prefixed
|
|
127
201
|
start = max(0, pos - 20)
|
|
128
202
|
before = content[start:pos]
|
|
129
203
|
matched_text = match.group()
|
|
@@ -135,7 +209,7 @@ def scan_file(filepath: Path, skip_fenced: bool = True) -> list[dict]:
|
|
|
135
209
|
'line': line_num,
|
|
136
210
|
'severity': 'high',
|
|
137
211
|
'category': 'memory-path',
|
|
138
|
-
'title': 'Memory path missing {project-root} prefix — use {project-root}/_bmad/
|
|
212
|
+
'title': 'Memory path missing {project-root} prefix — use {project-root}/_bmad/memory/',
|
|
139
213
|
'detail': line_content[:120],
|
|
140
214
|
'action': '',
|
|
141
215
|
})
|
|
@@ -159,6 +233,15 @@ def scan_skill(skill_path: Path, skip_fenced: bool = True) -> dict:
|
|
|
159
233
|
"""Scan all .md and .json files in a skill directory."""
|
|
160
234
|
all_findings = []
|
|
161
235
|
|
|
236
|
+
# Check for .md files at root that aren't SKILL.md
|
|
237
|
+
all_findings.extend(check_root_md_files(skill_path))
|
|
238
|
+
|
|
239
|
+
# Check SKILL.md frontmatter
|
|
240
|
+
skill_md = skill_path / 'SKILL.md'
|
|
241
|
+
if skill_md.exists():
|
|
242
|
+
content = skill_md.read_text(encoding='utf-8')
|
|
243
|
+
all_findings.extend(check_frontmatter(content, skill_md))
|
|
244
|
+
|
|
162
245
|
# Find all .md and .json files
|
|
163
246
|
md_files = sorted(list(skill_path.rglob('*.md')) + list(skill_path.rglob('*.json')))
|
|
164
247
|
if not md_files:
|
|
@@ -181,7 +264,10 @@ def scan_skill(skill_path: Path, skip_fenced: bool = True) -> dict:
|
|
|
181
264
|
'double_prefix': 0,
|
|
182
265
|
'absolute_path': 0,
|
|
183
266
|
'relative_prefix': 0,
|
|
267
|
+
'bare_internal_path': 0,
|
|
184
268
|
'memory_path': 0,
|
|
269
|
+
'frontmatter': 0,
|
|
270
|
+
'structure': 0,
|
|
185
271
|
}
|
|
186
272
|
|
|
187
273
|
for f in all_findings:
|
|
@@ -195,7 +281,7 @@ def scan_skill(skill_path: Path, skip_fenced: bool = True) -> dict:
|
|
|
195
281
|
return {
|
|
196
282
|
'scanner': 'path-standards',
|
|
197
283
|
'script': 'scan-path-standards.py',
|
|
198
|
-
'version': '
|
|
284
|
+
'version': '2.0.0',
|
|
199
285
|
'skill_path': str(skill_path),
|
|
200
286
|
'timestamp': datetime.now(timezone.utc).isoformat(),
|
|
201
287
|
'files_scanned': files_scanned,
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
module,skill,display-name,menu-code,description,action,args,phase,after,before,required,output-location,outputs
|
|
2
|
+
BMad Builder,bmad-builder-setup,Setup Builder Module,SB,"Install or update BMad Builder module config and help entries. Collects user preferences, writes config.yaml, and migrates legacy configs.",configure,,anytime,,,false,{project-root}/_bmad,config.yaml and config.user.yaml
|
|
3
|
+
BMad Builder,bmad-agent-builder,Build an Agent,BA,"Create, edit, convert, or fix an agent skill.",build-process,"[-H] [description | path]",anytime,,bmad-agent-builder:quality-optimizer,false,output_folder,agent skill
|
|
4
|
+
BMad Builder,bmad-agent-builder,Optimize an Agent,OA,Validate and optimize an existing agent skill. Produces a quality report.,quality-optimizer,[-H] [path],anytime,bmad-agent-builder:build-process,,false,bmad_builder_reports,quality report
|
|
5
|
+
BMad Builder,bmad-workflow-builder,Build a Workflow,BW,"Create, edit, convert, or fix a workflow or utility skill.",build-process,"[-H] [description | path]",anytime,,bmad-workflow-builder:quality-optimizer,false,output_folder,workflow skill
|
|
6
|
+
BMad Builder,bmad-workflow-builder,Optimize a Workflow,OW,Validate and optimize an existing workflow or utility skill. Produces a quality report.,quality-optimizer,[-H] [path],anytime,bmad-workflow-builder:build-process,,false,bmad_builder_reports,quality report
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
code: bmb
|
|
2
|
+
name: "BMad Builder"
|
|
3
|
+
description: "Standard Skill Compliant Factory for BMad Agents, Workflows and Modules"
|
|
4
|
+
module_version: 1.0.0
|
|
5
|
+
default_selected: false
|
|
6
|
+
module_greeting: >
|
|
7
|
+
Enjoy making your dream creations with the BMad Builder Module!
|
|
8
|
+
Run this again at any time if you want to reconfigure a setting or have updated the module, (or optionally just update _bmad/config.yaml and config.user.yaml to change existing values)
|
|
9
|
+
|
|
10
|
+
For questions, suggestions and support - check us on Discord at https://discord.gg/gk8jAdXWmj
|
|
11
|
+
|
|
12
|
+
bmad_builder_output_folder:
|
|
13
|
+
prompt: "Where should your custom output (agent, workflow, module config) be saved?"
|
|
14
|
+
default: "{project-root}/skills"
|
|
15
|
+
result: "{project-root}/{value}"
|
|
16
|
+
|
|
17
|
+
bmad_builder_reports:
|
|
18
|
+
prompt: "Output for Evals, Test, Quality and Planning Reports?"
|
|
19
|
+
default: "{project-root}/skills/reports"
|
|
20
|
+
result: "{project-root}/{value}"
|