ma-agents 2.20.0 → 2.20.2
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/README.md +55 -1
- package/lib/agents.js +22 -11
- package/lib/bmad-cache/bmb/_git_preserved/HEAD +1 -0
- package/lib/bmad-cache/bmb/_git_preserved/config +13 -0
- package/lib/bmad-cache/bmb/_git_preserved/description +1 -0
- package/lib/bmad-cache/bmb/_git_preserved/hooks/applypatch-msg.sample +15 -0
- package/lib/bmad-cache/bmb/_git_preserved/hooks/commit-msg.sample +24 -0
- package/lib/bmad-cache/bmb/_git_preserved/hooks/fsmonitor-watchman.sample +174 -0
- package/lib/bmad-cache/bmb/_git_preserved/hooks/post-update.sample +8 -0
- package/lib/bmad-cache/bmb/_git_preserved/hooks/pre-applypatch.sample +14 -0
- package/lib/bmad-cache/bmb/_git_preserved/hooks/pre-commit.sample +49 -0
- package/lib/bmad-cache/bmb/_git_preserved/hooks/pre-merge-commit.sample +13 -0
- package/lib/bmad-cache/bmb/_git_preserved/hooks/pre-push.sample +53 -0
- package/lib/bmad-cache/bmb/_git_preserved/hooks/pre-rebase.sample +169 -0
- package/lib/bmad-cache/bmb/_git_preserved/hooks/pre-receive.sample +24 -0
- package/lib/bmad-cache/bmb/_git_preserved/hooks/prepare-commit-msg.sample +42 -0
- package/lib/bmad-cache/bmb/_git_preserved/hooks/push-to-checkout.sample +78 -0
- package/lib/bmad-cache/bmb/_git_preserved/hooks/sendemail-validate.sample +77 -0
- package/lib/bmad-cache/bmb/_git_preserved/hooks/update.sample +128 -0
- package/lib/bmad-cache/bmb/_git_preserved/index +0 -0
- package/lib/bmad-cache/bmb/_git_preserved/info/exclude +6 -0
- package/lib/bmad-cache/bmb/_git_preserved/logs/HEAD +1 -0
- package/lib/bmad-cache/bmb/_git_preserved/logs/refs/heads/main +1 -0
- package/lib/bmad-cache/bmb/_git_preserved/logs/refs/remotes/origin/HEAD +1 -0
- 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/_git_preserved/packed-refs +2 -0
- package/lib/bmad-cache/bmb/_git_preserved/refs/heads/main +1 -0
- package/lib/bmad-cache/bmb/_git_preserved/refs/remotes/origin/HEAD +1 -0
- package/lib/bmad-cache/bmb/_git_preserved/shallow +1 -0
- package/lib/bmad-cache/cache-manifest.json +6 -6
- package/lib/bmad-cache/cis/_git_preserved/HEAD +1 -0
- package/lib/bmad-cache/cis/_git_preserved/config +13 -0
- package/lib/bmad-cache/cis/_git_preserved/description +1 -0
- package/lib/bmad-cache/cis/_git_preserved/hooks/applypatch-msg.sample +15 -0
- package/lib/bmad-cache/cis/_git_preserved/hooks/commit-msg.sample +24 -0
- package/lib/bmad-cache/cis/_git_preserved/hooks/fsmonitor-watchman.sample +174 -0
- package/lib/bmad-cache/cis/_git_preserved/hooks/post-update.sample +8 -0
- package/lib/bmad-cache/cis/_git_preserved/hooks/pre-applypatch.sample +14 -0
- package/lib/bmad-cache/cis/_git_preserved/hooks/pre-commit.sample +49 -0
- package/lib/bmad-cache/cis/_git_preserved/hooks/pre-merge-commit.sample +13 -0
- package/lib/bmad-cache/cis/_git_preserved/hooks/pre-push.sample +53 -0
- package/lib/bmad-cache/cis/_git_preserved/hooks/pre-rebase.sample +169 -0
- package/lib/bmad-cache/cis/_git_preserved/hooks/pre-receive.sample +24 -0
- package/lib/bmad-cache/cis/_git_preserved/hooks/prepare-commit-msg.sample +42 -0
- package/lib/bmad-cache/cis/_git_preserved/hooks/push-to-checkout.sample +78 -0
- package/lib/bmad-cache/cis/_git_preserved/hooks/sendemail-validate.sample +77 -0
- package/lib/bmad-cache/cis/_git_preserved/hooks/update.sample +128 -0
- package/lib/bmad-cache/cis/_git_preserved/index +0 -0
- package/lib/bmad-cache/cis/_git_preserved/info/exclude +6 -0
- package/lib/bmad-cache/cis/_git_preserved/logs/HEAD +1 -0
- package/lib/bmad-cache/cis/_git_preserved/logs/refs/heads/main +1 -0
- package/lib/bmad-cache/cis/_git_preserved/logs/refs/remotes/origin/HEAD +1 -0
- 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.pack +0 -0
- package/lib/bmad-cache/cis/_git_preserved/objects/pack/pack-157d7eb8d527233a8607d926fc74ebf87f2ae0d3.rev +0 -0
- package/lib/bmad-cache/cis/_git_preserved/packed-refs +2 -0
- package/lib/bmad-cache/cis/_git_preserved/refs/heads/main +1 -0
- package/lib/bmad-cache/cis/_git_preserved/refs/remotes/origin/HEAD +1 -0
- package/lib/bmad-cache/cis/_git_preserved/shallow +1 -0
- package/lib/bmad-cache/gds/_git_preserved/HEAD +1 -0
- package/lib/bmad-cache/gds/_git_preserved/config +13 -0
- package/lib/bmad-cache/gds/_git_preserved/description +1 -0
- package/lib/bmad-cache/gds/_git_preserved/hooks/applypatch-msg.sample +15 -0
- package/lib/bmad-cache/gds/_git_preserved/hooks/commit-msg.sample +24 -0
- package/lib/bmad-cache/gds/_git_preserved/hooks/fsmonitor-watchman.sample +174 -0
- package/lib/bmad-cache/gds/_git_preserved/hooks/post-update.sample +8 -0
- package/lib/bmad-cache/gds/_git_preserved/hooks/pre-applypatch.sample +14 -0
- package/lib/bmad-cache/gds/_git_preserved/hooks/pre-commit.sample +49 -0
- package/lib/bmad-cache/gds/_git_preserved/hooks/pre-merge-commit.sample +13 -0
- package/lib/bmad-cache/gds/_git_preserved/hooks/pre-push.sample +53 -0
- package/lib/bmad-cache/gds/_git_preserved/hooks/pre-rebase.sample +169 -0
- package/lib/bmad-cache/gds/_git_preserved/hooks/pre-receive.sample +24 -0
- package/lib/bmad-cache/gds/_git_preserved/hooks/prepare-commit-msg.sample +42 -0
- package/lib/bmad-cache/gds/_git_preserved/hooks/push-to-checkout.sample +78 -0
- package/lib/bmad-cache/gds/_git_preserved/hooks/sendemail-validate.sample +77 -0
- package/lib/bmad-cache/gds/_git_preserved/hooks/update.sample +128 -0
- package/lib/bmad-cache/gds/_git_preserved/index +0 -0
- package/lib/bmad-cache/gds/_git_preserved/info/exclude +6 -0
- package/lib/bmad-cache/gds/_git_preserved/logs/HEAD +1 -0
- package/lib/bmad-cache/gds/_git_preserved/logs/refs/heads/main +1 -0
- package/lib/bmad-cache/gds/_git_preserved/logs/refs/remotes/origin/HEAD +1 -0
- 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.pack +0 -0
- package/lib/bmad-cache/gds/_git_preserved/objects/pack/pack-44faafb9245b4ca17ad81bd6c9e6fc52fb5915a1.rev +0 -0
- package/lib/bmad-cache/gds/_git_preserved/packed-refs +2 -0
- package/lib/bmad-cache/gds/_git_preserved/refs/heads/main +1 -0
- package/lib/bmad-cache/gds/_git_preserved/refs/remotes/origin/HEAD +1 -0
- package/lib/bmad-cache/gds/_git_preserved/refs/tags/v0.2.2 +1 -0
- package/lib/bmad-cache/gds/_git_preserved/shallow +1 -0
- package/lib/bmad-cache/gds/package.json +2 -4
- package/lib/bmad-cache/gds/src/agents/gds-agent-game-architect/bmad-skill-manifest.yaml +11 -0
- package/lib/bmad-cache/gds/src/agents/gds-agent-game-designer/bmad-skill-manifest.yaml +11 -0
- package/lib/bmad-cache/gds/src/agents/gds-agent-game-dev/bmad-skill-manifest.yaml +11 -0
- package/lib/bmad-cache/gds/src/agents/gds-agent-game-qa/bmad-skill-manifest.yaml +11 -0
- package/lib/bmad-cache/gds/src/agents/gds-agent-game-scrum-master/bmad-skill-manifest.yaml +11 -0
- package/lib/bmad-cache/gds/src/agents/gds-agent-game-solo-dev/bmad-skill-manifest.yaml +11 -0
- package/lib/bmad-cache/gds/src/agents/gds-agent-tech-writer/bmad-skill-manifest.yaml +11 -0
- package/lib/bmad-cache/gds/src/module-help.csv +28 -28
- package/lib/bmad-cache/gds/src/workflows/1-preproduction/gds-brainstorm-game/bmad-skill-manifest.yaml +1 -0
- package/lib/bmad-cache/gds/src/workflows/1-preproduction/gds-create-game-brief/bmad-skill-manifest.yaml +1 -0
- package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-gdd/bmad-skill-manifest.yaml +1 -0
- package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-narrative/bmad-skill-manifest.yaml +1 -0
- package/lib/bmad-cache/gds/src/workflows/3-technical/gds-check-implementation-readiness/bmad-skill-manifest.yaml +1 -0
- package/lib/bmad-cache/gds/src/workflows/3-technical/gds-create-epics-and-stories/bmad-skill-manifest.yaml +1 -0
- package/lib/bmad-cache/gds/src/workflows/3-technical/gds-game-architecture/bmad-skill-manifest.yaml +1 -0
- package/lib/bmad-cache/gds/src/workflows/3-technical/gds-generate-project-context/bmad-skill-manifest.yaml +1 -0
- package/lib/bmad-cache/gds/src/workflows/4-production/gds-code-review/bmad-skill-manifest.yaml +1 -0
- package/lib/bmad-cache/gds/src/workflows/4-production/gds-correct-course/bmad-skill-manifest.yaml +1 -0
- package/lib/bmad-cache/gds/src/workflows/4-production/gds-retrospective/bmad-skill-manifest.yaml +1 -0
- package/lib/bmad-cache/gds/src/workflows/4-production/gds-sprint-planning/bmad-skill-manifest.yaml +1 -0
- package/lib/bmad-cache/gds/src/workflows/4-production/gds-sprint-status/bmad-skill-manifest.yaml +1 -0
- package/lib/bmad-cache/gds/src/workflows/gametest/gds-e2e-scaffold/bmad-skill-manifest.yaml +1 -0
- package/lib/bmad-cache/gds/src/workflows/gametest/gds-performance-test/bmad-skill-manifest.yaml +1 -0
- package/lib/bmad-cache/gds/src/workflows/gametest/gds-playtest-plan/bmad-skill-manifest.yaml +1 -0
- package/lib/bmad-cache/gds/src/workflows/gametest/gds-test-automate/bmad-skill-manifest.yaml +1 -0
- package/lib/bmad-cache/gds/src/workflows/gametest/gds-test-design/bmad-skill-manifest.yaml +1 -0
- package/lib/bmad-cache/gds/src/workflows/gametest/gds-test-framework/bmad-skill-manifest.yaml +1 -0
- package/lib/bmad-cache/gds/src/workflows/gametest/gds-test-review/bmad-skill-manifest.yaml +1 -0
- package/lib/bmad-cache/gds/src/workflows/gds-document-project/bmad-skill-manifest.yaml +1 -0
- package/lib/bmad-cache/gds/src/workflows/gds-quick-flow/gds-quick-dev/bmad-skill-manifest.yaml +1 -4
- package/lib/bmad-cache/gds/src/workflows/gds-quick-flow/gds-quick-dev-new-preview/bmad-skill-manifest.yaml +1 -4
- package/lib/bmad-cache/gds/src/workflows/gds-quick-flow/gds-quick-spec/bmad-skill-manifest.yaml +1 -0
- package/lib/bmad-cache/tea/_git_preserved/HEAD +1 -0
- package/lib/bmad-cache/tea/_git_preserved/config +13 -0
- package/lib/bmad-cache/tea/_git_preserved/description +1 -0
- package/lib/bmad-cache/tea/_git_preserved/hooks/applypatch-msg.sample +15 -0
- package/lib/bmad-cache/tea/_git_preserved/hooks/commit-msg.sample +24 -0
- package/lib/bmad-cache/tea/_git_preserved/hooks/fsmonitor-watchman.sample +174 -0
- package/lib/bmad-cache/tea/_git_preserved/hooks/post-update.sample +8 -0
- package/lib/bmad-cache/tea/_git_preserved/hooks/pre-applypatch.sample +14 -0
- package/lib/bmad-cache/tea/_git_preserved/hooks/pre-commit.sample +49 -0
- package/lib/bmad-cache/tea/_git_preserved/hooks/pre-merge-commit.sample +13 -0
- package/lib/bmad-cache/tea/_git_preserved/hooks/pre-push.sample +53 -0
- package/lib/bmad-cache/tea/_git_preserved/hooks/pre-rebase.sample +169 -0
- package/lib/bmad-cache/tea/_git_preserved/hooks/pre-receive.sample +24 -0
- package/lib/bmad-cache/tea/_git_preserved/hooks/prepare-commit-msg.sample +42 -0
- package/lib/bmad-cache/tea/_git_preserved/hooks/push-to-checkout.sample +78 -0
- package/lib/bmad-cache/tea/_git_preserved/hooks/sendemail-validate.sample +77 -0
- package/lib/bmad-cache/tea/_git_preserved/hooks/update.sample +128 -0
- package/lib/bmad-cache/tea/_git_preserved/index +0 -0
- package/lib/bmad-cache/tea/_git_preserved/info/exclude +6 -0
- 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.pack +0 -0
- package/lib/bmad-cache/tea/_git_preserved/objects/pack/pack-96ec1ce3a9ef4c891e00e060795b4434ba8f7163.rev +0 -0
- package/lib/bmad-cache/tea/_git_preserved/packed-refs +2 -0
- package/lib/bmad-cache/tea/_git_preserved/refs/heads/main +1 -0
- package/lib/bmad-cache/tea/_git_preserved/refs/remotes/origin/HEAD +1 -0
- package/lib/bmad-cache/tea/_git_preserved/refs/tags/v1.7.0 +1 -0
- package/lib/bmad-cache/tea/_git_preserved/shallow +1 -0
- package/lib/bmad.js +33 -0
- package/lib/installer.js +60 -3
- package/package.json +1 -1
- package/scripts/build-bmad-cache.js +6 -3
- package/test/agent-injection-strategy.test.js +123 -0
- package/test/instruction-injection.test.js +336 -0
- package/.cline/clinerules.md +0 -14
- package/.cline/skills/.ma-agents.json +0 -199
- package/.cline/skills/MANIFEST.yaml +0 -204
- package/.cline/skills/ai-audit-trail/SKILL.md +0 -23
- package/.cline/skills/cmake-best-practices/SKILL.md +0 -64
- package/.cline/skills/cmake-best-practices/examples/cmake.md +0 -59
- package/.cline/skills/code-documentation/SKILL.md +0 -57
- package/.cline/skills/code-documentation/examples/cpp.md +0 -29
- package/.cline/skills/code-documentation/examples/csharp.md +0 -28
- package/.cline/skills/code-documentation/examples/javascript_typescript.md +0 -28
- package/.cline/skills/code-documentation/examples/python.md +0 -57
- package/.cline/skills/code-review/SKILL.md +0 -59
- package/.cline/skills/commit-message/SKILL.md +0 -79
- package/.cline/skills/cpp-concurrency-safety/SKILL.md +0 -60
- package/.cline/skills/cpp-concurrency-safety/examples/concurrency.md +0 -73
- package/.cline/skills/cpp-const-correctness/SKILL.md +0 -63
- package/.cline/skills/cpp-const-correctness/examples/const_correctness.md +0 -54
- package/.cline/skills/cpp-memory-handling/SKILL.md +0 -42
- package/.cline/skills/cpp-memory-handling/examples/modern-cpp.md +0 -49
- package/.cline/skills/cpp-memory-handling/examples/smart-pointers.md +0 -46
- package/.cline/skills/cpp-modern-composition/SKILL.md +0 -64
- package/.cline/skills/cpp-modern-composition/examples/composition.md +0 -51
- package/.cline/skills/cpp-robust-interfaces/SKILL.md +0 -55
- package/.cline/skills/cpp-robust-interfaces/examples/interfaces.md +0 -56
- package/.cline/skills/create-hardened-docker-skill/SKILL.md +0 -637
- package/.cline/skills/create-hardened-docker-skill/scripts/create-all.sh +0 -489
- package/.cline/skills/docker-hardening-verification/SKILL.md +0 -28
- package/.cline/skills/docker-hardening-verification/scripts/verify-hardening.sh +0 -39
- package/.cline/skills/docker-image-signing/SKILL.md +0 -28
- package/.cline/skills/docker-image-signing/scripts/sign-image.sh +0 -33
- package/.cline/skills/document-revision-history/SKILL.md +0 -104
- package/.cline/skills/git-workflow-skill/SKILL.md +0 -194
- package/.cline/skills/git-workflow-skill/hooks/commit-msg +0 -61
- package/.cline/skills/git-workflow-skill/hooks/pre-commit +0 -38
- package/.cline/skills/git-workflow-skill/hooks/prepare-commit-msg +0 -56
- package/.cline/skills/git-workflow-skill/scripts/finish-feature.sh +0 -192
- package/.cline/skills/git-workflow-skill/scripts/install-hooks.sh +0 -55
- package/.cline/skills/git-workflow-skill/scripts/start-feature.sh +0 -110
- package/.cline/skills/git-workflow-skill/scripts/validate-workflow.sh +0 -229
- package/.cline/skills/js-ts-dependency-mgmt/SKILL.md +0 -49
- package/.cline/skills/js-ts-dependency-mgmt/examples/dependency_mgmt.md +0 -60
- package/.cline/skills/js-ts-security-skill/SKILL.md +0 -64
- package/.cline/skills/js-ts-security-skill/scripts/verify-security.sh +0 -136
- package/.cline/skills/logging-best-practices/SKILL.md +0 -50
- package/.cline/skills/logging-best-practices/docs/logging-standards.md +0 -29
- package/.cline/skills/logging-best-practices/examples/cpp.md +0 -36
- package/.cline/skills/logging-best-practices/examples/csharp.md +0 -49
- package/.cline/skills/logging-best-practices/examples/javascript.md +0 -77
- package/.cline/skills/logging-best-practices/examples/python.md +0 -57
- package/.cline/skills/opentelemetry-best-practices/SKILL.md +0 -34
- package/.cline/skills/opentelemetry-best-practices/docs/otel-standards.md +0 -37
- package/.cline/skills/opentelemetry-best-practices/examples/go.md +0 -32
- package/.cline/skills/opentelemetry-best-practices/examples/javascript.md +0 -58
- package/.cline/skills/opentelemetry-best-practices/examples/python.md +0 -37
- package/.cline/skills/python-dependency-mgmt/SKILL.md +0 -42
- package/.cline/skills/python-dependency-mgmt/examples/dependency_mgmt.md +0 -67
- package/.cline/skills/python-security-skill/SKILL.md +0 -56
- package/.cline/skills/python-security-skill/examples/security.md +0 -56
- package/.cline/skills/self-signed-cert/SKILL.md +0 -42
- package/.cline/skills/self-signed-cert/scripts/generate-cert.ps1 +0 -45
- package/.cline/skills/self-signed-cert/scripts/generate-cert.sh +0 -43
- package/.cline/skills/skill-creator/SKILL.md +0 -196
- package/.cline/skills/skill-creator/docs/output-patterns.md +0 -82
- package/.cline/skills/skill-creator/docs/workflows.md +0 -28
- package/.cline/skills/skill-creator/scripts/init_skill.py +0 -208
- package/.cline/skills/skill-creator/scripts/package_skill.py +0 -99
- package/.cline/skills/skill-creator/scripts/quick_validate.py +0 -113
- package/.cline/skills/test-accompanied-development/SKILL.md +0 -50
- package/.cline/skills/test-generator/SKILL.md +0 -73
- package/.cline/skills/vercel-react-best-practices/SKILL.md +0 -109
- package/.cline/skills/verify-hardened-docker-skill/SKILL.md +0 -442
- package/.cline/skills/verify-hardened-docker-skill/scripts/verify-docker-hardening.sh +0 -439
- package/.clinerules +0 -14
- package/.cursor/cursor.md +0 -14
- package/.cursor/skills/.ma-agents.json +0 -199
- package/.cursor/skills/MANIFEST.yaml +0 -204
- package/.cursor/skills/ai-audit-trail/SKILL.md +0 -23
- package/.cursor/skills/cmake-best-practices/SKILL.md +0 -64
- package/.cursor/skills/cmake-best-practices/examples/cmake.md +0 -59
- package/.cursor/skills/code-documentation/SKILL.md +0 -57
- package/.cursor/skills/code-documentation/examples/cpp.md +0 -29
- package/.cursor/skills/code-documentation/examples/csharp.md +0 -28
- package/.cursor/skills/code-documentation/examples/javascript_typescript.md +0 -28
- package/.cursor/skills/code-documentation/examples/python.md +0 -57
- package/.cursor/skills/code-review/SKILL.md +0 -43
- package/.cursor/skills/commit-message/SKILL.md +0 -79
- package/.cursor/skills/cpp-concurrency-safety/SKILL.md +0 -60
- package/.cursor/skills/cpp-concurrency-safety/examples/concurrency.md +0 -73
- package/.cursor/skills/cpp-const-correctness/SKILL.md +0 -63
- package/.cursor/skills/cpp-const-correctness/examples/const_correctness.md +0 -54
- package/.cursor/skills/cpp-memory-handling/SKILL.md +0 -42
- package/.cursor/skills/cpp-memory-handling/examples/modern-cpp.md +0 -49
- package/.cursor/skills/cpp-memory-handling/examples/smart-pointers.md +0 -46
- package/.cursor/skills/cpp-modern-composition/SKILL.md +0 -64
- package/.cursor/skills/cpp-modern-composition/examples/composition.md +0 -51
- package/.cursor/skills/cpp-robust-interfaces/SKILL.md +0 -55
- package/.cursor/skills/cpp-robust-interfaces/examples/interfaces.md +0 -56
- package/.cursor/skills/create-hardened-docker-skill/SKILL.md +0 -637
- package/.cursor/skills/create-hardened-docker-skill/scripts/create-all.sh +0 -489
- package/.cursor/skills/docker-hardening-verification/SKILL.md +0 -28
- package/.cursor/skills/docker-hardening-verification/scripts/verify-hardening.sh +0 -39
- package/.cursor/skills/docker-image-signing/SKILL.md +0 -28
- package/.cursor/skills/docker-image-signing/scripts/sign-image.sh +0 -33
- package/.cursor/skills/document-revision-history/SKILL.md +0 -104
- package/.cursor/skills/git-workflow-skill/SKILL.md +0 -194
- package/.cursor/skills/git-workflow-skill/hooks/commit-msg +0 -61
- package/.cursor/skills/git-workflow-skill/hooks/pre-commit +0 -38
- package/.cursor/skills/git-workflow-skill/hooks/prepare-commit-msg +0 -56
- package/.cursor/skills/git-workflow-skill/scripts/finish-feature.sh +0 -192
- package/.cursor/skills/git-workflow-skill/scripts/install-hooks.sh +0 -55
- package/.cursor/skills/git-workflow-skill/scripts/start-feature.sh +0 -110
- package/.cursor/skills/git-workflow-skill/scripts/validate-workflow.sh +0 -229
- package/.cursor/skills/js-ts-dependency-mgmt/SKILL.md +0 -49
- package/.cursor/skills/js-ts-dependency-mgmt/examples/dependency_mgmt.md +0 -60
- package/.cursor/skills/js-ts-security-skill/SKILL.md +0 -64
- package/.cursor/skills/js-ts-security-skill/scripts/verify-security.sh +0 -136
- package/.cursor/skills/logging-best-practices/SKILL.md +0 -50
- package/.cursor/skills/logging-best-practices/examples/cpp.md +0 -36
- package/.cursor/skills/logging-best-practices/examples/csharp.md +0 -49
- package/.cursor/skills/logging-best-practices/examples/javascript.md +0 -77
- package/.cursor/skills/logging-best-practices/examples/python.md +0 -57
- package/.cursor/skills/logging-best-practices/references/logging-standards.md +0 -29
- package/.cursor/skills/opentelemetry-best-practices/SKILL.md +0 -34
- package/.cursor/skills/opentelemetry-best-practices/examples/go.md +0 -32
- package/.cursor/skills/opentelemetry-best-practices/examples/javascript.md +0 -58
- package/.cursor/skills/opentelemetry-best-practices/examples/python.md +0 -37
- package/.cursor/skills/opentelemetry-best-practices/references/otel-standards.md +0 -37
- package/.cursor/skills/python-dependency-mgmt/SKILL.md +0 -42
- package/.cursor/skills/python-dependency-mgmt/examples/dependency_mgmt.md +0 -67
- package/.cursor/skills/python-security-skill/SKILL.md +0 -56
- package/.cursor/skills/python-security-skill/examples/security.md +0 -56
- package/.cursor/skills/self-signed-cert/SKILL.md +0 -42
- package/.cursor/skills/self-signed-cert/scripts/generate-cert.ps1 +0 -45
- package/.cursor/skills/self-signed-cert/scripts/generate-cert.sh +0 -43
- package/.cursor/skills/skill-creator/SKILL.md +0 -196
- package/.cursor/skills/skill-creator/references/output-patterns.md +0 -82
- package/.cursor/skills/skill-creator/references/workflows.md +0 -28
- package/.cursor/skills/skill-creator/scripts/init_skill.py +0 -208
- package/.cursor/skills/skill-creator/scripts/package_skill.py +0 -99
- package/.cursor/skills/skill-creator/scripts/quick_validate.py +0 -113
- package/.cursor/skills/test-accompanied-development/SKILL.md +0 -50
- package/.cursor/skills/test-generator/SKILL.md +0 -65
- package/.cursor/skills/vercel-react-best-practices/SKILL.md +0 -109
- package/.cursor/skills/verify-hardened-docker-skill/SKILL.md +0 -442
- package/.cursor/skills/verify-hardened-docker-skill/scripts/verify-docker-hardening.sh +0 -439
- package/.gemini/gemini.md +0 -14
- package/.gemini/skills/.ma-agents.json +0 -199
- package/.gemini/skills/MANIFEST.yaml +0 -204
- package/.gemini/skills/ai-audit-trail/SKILL.md +0 -23
- package/.gemini/skills/cmake-best-practices/SKILL.md +0 -64
- package/.gemini/skills/cmake-best-practices/examples/cmake.md +0 -59
- package/.gemini/skills/code-documentation/SKILL.md +0 -57
- package/.gemini/skills/code-documentation/examples/cpp.md +0 -29
- package/.gemini/skills/code-documentation/examples/csharp.md +0 -28
- package/.gemini/skills/code-documentation/examples/javascript_typescript.md +0 -28
- package/.gemini/skills/code-documentation/examples/python.md +0 -57
- package/.gemini/skills/code-review/SKILL.md +0 -43
- package/.gemini/skills/commit-message/SKILL.md +0 -79
- package/.gemini/skills/cpp-concurrency-safety/SKILL.md +0 -60
- package/.gemini/skills/cpp-concurrency-safety/examples/concurrency.md +0 -73
- package/.gemini/skills/cpp-const-correctness/SKILL.md +0 -63
- package/.gemini/skills/cpp-const-correctness/examples/const_correctness.md +0 -54
- package/.gemini/skills/cpp-memory-handling/SKILL.md +0 -42
- package/.gemini/skills/cpp-memory-handling/examples/modern-cpp.md +0 -49
- package/.gemini/skills/cpp-memory-handling/examples/smart-pointers.md +0 -46
- package/.gemini/skills/cpp-modern-composition/SKILL.md +0 -64
- package/.gemini/skills/cpp-modern-composition/examples/composition.md +0 -51
- package/.gemini/skills/cpp-robust-interfaces/SKILL.md +0 -55
- package/.gemini/skills/cpp-robust-interfaces/examples/interfaces.md +0 -56
- package/.gemini/skills/create-hardened-docker-skill/SKILL.md +0 -637
- package/.gemini/skills/create-hardened-docker-skill/scripts/create-all.sh +0 -489
- package/.gemini/skills/docker-hardening-verification/SKILL.md +0 -28
- package/.gemini/skills/docker-hardening-verification/scripts/verify-hardening.sh +0 -39
- package/.gemini/skills/docker-image-signing/SKILL.md +0 -28
- package/.gemini/skills/docker-image-signing/scripts/sign-image.sh +0 -33
- package/.gemini/skills/document-revision-history/SKILL.md +0 -104
- package/.gemini/skills/git-workflow-skill/SKILL.md +0 -194
- package/.gemini/skills/git-workflow-skill/hooks/commit-msg +0 -61
- package/.gemini/skills/git-workflow-skill/hooks/pre-commit +0 -38
- package/.gemini/skills/git-workflow-skill/hooks/prepare-commit-msg +0 -56
- package/.gemini/skills/git-workflow-skill/scripts/finish-feature.sh +0 -192
- package/.gemini/skills/git-workflow-skill/scripts/install-hooks.sh +0 -55
- package/.gemini/skills/git-workflow-skill/scripts/start-feature.sh +0 -110
- package/.gemini/skills/git-workflow-skill/scripts/validate-workflow.sh +0 -229
- package/.gemini/skills/js-ts-dependency-mgmt/SKILL.md +0 -49
- package/.gemini/skills/js-ts-dependency-mgmt/examples/dependency_mgmt.md +0 -60
- package/.gemini/skills/js-ts-security-skill/SKILL.md +0 -64
- package/.gemini/skills/js-ts-security-skill/scripts/verify-security.sh +0 -136
- package/.gemini/skills/logging-best-practices/SKILL.md +0 -50
- package/.gemini/skills/logging-best-practices/examples/cpp.md +0 -36
- package/.gemini/skills/logging-best-practices/examples/csharp.md +0 -49
- package/.gemini/skills/logging-best-practices/examples/javascript.md +0 -77
- package/.gemini/skills/logging-best-practices/examples/python.md +0 -57
- package/.gemini/skills/logging-best-practices/references/logging-standards.md +0 -29
- package/.gemini/skills/opentelemetry-best-practices/SKILL.md +0 -34
- package/.gemini/skills/opentelemetry-best-practices/examples/go.md +0 -32
- package/.gemini/skills/opentelemetry-best-practices/examples/javascript.md +0 -58
- package/.gemini/skills/opentelemetry-best-practices/examples/python.md +0 -37
- package/.gemini/skills/opentelemetry-best-practices/references/otel-standards.md +0 -37
- package/.gemini/skills/python-dependency-mgmt/SKILL.md +0 -42
- package/.gemini/skills/python-dependency-mgmt/examples/dependency_mgmt.md +0 -67
- package/.gemini/skills/python-security-skill/SKILL.md +0 -56
- package/.gemini/skills/python-security-skill/examples/security.md +0 -56
- package/.gemini/skills/self-signed-cert/SKILL.md +0 -42
- package/.gemini/skills/self-signed-cert/scripts/generate-cert.ps1 +0 -45
- package/.gemini/skills/self-signed-cert/scripts/generate-cert.sh +0 -43
- package/.gemini/skills/skill-creator/SKILL.md +0 -196
- package/.gemini/skills/skill-creator/references/output-patterns.md +0 -82
- package/.gemini/skills/skill-creator/references/workflows.md +0 -28
- package/.gemini/skills/skill-creator/scripts/init_skill.py +0 -208
- package/.gemini/skills/skill-creator/scripts/package_skill.py +0 -99
- package/.gemini/skills/skill-creator/scripts/quick_validate.py +0 -113
- package/.gemini/skills/test-accompanied-development/SKILL.md +0 -50
- package/.gemini/skills/test-generator/SKILL.md +0 -65
- package/.gemini/skills/vercel-react-best-practices/SKILL.md +0 -109
- package/.gemini/skills/verify-hardened-docker-skill/SKILL.md +0 -442
- package/.gemini/skills/verify-hardened-docker-skill/scripts/verify-docker-hardening.sh +0 -439
- package/.github/copilot/copilot.md +0 -14
- package/.github/copilot/skills/.ma-agents.json +0 -199
- package/.github/copilot/skills/MANIFEST.yaml +0 -204
- package/.github/copilot/skills/ai-audit-trail/SKILL.md +0 -23
- package/.github/copilot/skills/cmake-best-practices/SKILL.md +0 -64
- package/.github/copilot/skills/cmake-best-practices/examples/cmake.md +0 -59
- package/.github/copilot/skills/code-documentation/SKILL.md +0 -57
- package/.github/copilot/skills/code-documentation/examples/cpp.md +0 -29
- package/.github/copilot/skills/code-documentation/examples/csharp.md +0 -28
- package/.github/copilot/skills/code-documentation/examples/javascript_typescript.md +0 -28
- package/.github/copilot/skills/code-documentation/examples/python.md +0 -57
- package/.github/copilot/skills/code-review/SKILL.md +0 -43
- package/.github/copilot/skills/commit-message/SKILL.md +0 -79
- package/.github/copilot/skills/cpp-concurrency-safety/SKILL.md +0 -60
- package/.github/copilot/skills/cpp-concurrency-safety/examples/concurrency.md +0 -73
- package/.github/copilot/skills/cpp-const-correctness/SKILL.md +0 -63
- package/.github/copilot/skills/cpp-const-correctness/examples/const_correctness.md +0 -54
- package/.github/copilot/skills/cpp-memory-handling/SKILL.md +0 -42
- package/.github/copilot/skills/cpp-memory-handling/examples/modern-cpp.md +0 -49
- package/.github/copilot/skills/cpp-memory-handling/examples/smart-pointers.md +0 -46
- package/.github/copilot/skills/cpp-modern-composition/SKILL.md +0 -64
- package/.github/copilot/skills/cpp-modern-composition/examples/composition.md +0 -51
- package/.github/copilot/skills/cpp-robust-interfaces/SKILL.md +0 -55
- package/.github/copilot/skills/cpp-robust-interfaces/examples/interfaces.md +0 -56
- package/.github/copilot/skills/create-hardened-docker-skill/SKILL.md +0 -637
- package/.github/copilot/skills/create-hardened-docker-skill/scripts/create-all.sh +0 -489
- package/.github/copilot/skills/docker-hardening-verification/SKILL.md +0 -28
- package/.github/copilot/skills/docker-hardening-verification/scripts/verify-hardening.sh +0 -39
- package/.github/copilot/skills/docker-image-signing/SKILL.md +0 -28
- package/.github/copilot/skills/docker-image-signing/scripts/sign-image.sh +0 -33
- package/.github/copilot/skills/document-revision-history/SKILL.md +0 -104
- package/.github/copilot/skills/git-workflow-skill/SKILL.md +0 -194
- package/.github/copilot/skills/git-workflow-skill/hooks/commit-msg +0 -61
- package/.github/copilot/skills/git-workflow-skill/hooks/pre-commit +0 -38
- package/.github/copilot/skills/git-workflow-skill/hooks/prepare-commit-msg +0 -56
- package/.github/copilot/skills/git-workflow-skill/scripts/finish-feature.sh +0 -192
- package/.github/copilot/skills/git-workflow-skill/scripts/install-hooks.sh +0 -55
- package/.github/copilot/skills/git-workflow-skill/scripts/start-feature.sh +0 -110
- package/.github/copilot/skills/git-workflow-skill/scripts/validate-workflow.sh +0 -229
- package/.github/copilot/skills/js-ts-dependency-mgmt/SKILL.md +0 -49
- package/.github/copilot/skills/js-ts-dependency-mgmt/examples/dependency_mgmt.md +0 -60
- package/.github/copilot/skills/js-ts-security-skill/SKILL.md +0 -64
- package/.github/copilot/skills/js-ts-security-skill/scripts/verify-security.sh +0 -136
- package/.github/copilot/skills/logging-best-practices/SKILL.md +0 -50
- package/.github/copilot/skills/logging-best-practices/examples/cpp.md +0 -36
- package/.github/copilot/skills/logging-best-practices/examples/csharp.md +0 -49
- package/.github/copilot/skills/logging-best-practices/examples/javascript.md +0 -77
- package/.github/copilot/skills/logging-best-practices/examples/python.md +0 -57
- package/.github/copilot/skills/logging-best-practices/references/logging-standards.md +0 -29
- package/.github/copilot/skills/opentelemetry-best-practices/SKILL.md +0 -34
- package/.github/copilot/skills/opentelemetry-best-practices/examples/go.md +0 -32
- package/.github/copilot/skills/opentelemetry-best-practices/examples/javascript.md +0 -58
- package/.github/copilot/skills/opentelemetry-best-practices/examples/python.md +0 -37
- package/.github/copilot/skills/opentelemetry-best-practices/references/otel-standards.md +0 -37
- package/.github/copilot/skills/python-dependency-mgmt/SKILL.md +0 -42
- package/.github/copilot/skills/python-dependency-mgmt/examples/dependency_mgmt.md +0 -67
- package/.github/copilot/skills/python-security-skill/SKILL.md +0 -56
- package/.github/copilot/skills/python-security-skill/examples/security.md +0 -56
- package/.github/copilot/skills/self-signed-cert/SKILL.md +0 -42
- package/.github/copilot/skills/self-signed-cert/scripts/generate-cert.ps1 +0 -45
- package/.github/copilot/skills/self-signed-cert/scripts/generate-cert.sh +0 -43
- package/.github/copilot/skills/skill-creator/SKILL.md +0 -196
- package/.github/copilot/skills/skill-creator/references/output-patterns.md +0 -82
- package/.github/copilot/skills/skill-creator/references/workflows.md +0 -28
- package/.github/copilot/skills/skill-creator/scripts/init_skill.py +0 -208
- package/.github/copilot/skills/skill-creator/scripts/package_skill.py +0 -99
- package/.github/copilot/skills/skill-creator/scripts/quick_validate.py +0 -113
- package/.github/copilot/skills/test-accompanied-development/SKILL.md +0 -50
- package/.github/copilot/skills/test-generator/SKILL.md +0 -65
- package/.github/copilot/skills/vercel-react-best-practices/SKILL.md +0 -109
- package/.github/copilot/skills/verify-hardened-docker-skill/SKILL.md +0 -442
- package/.github/copilot/skills/verify-hardened-docker-skill/scripts/verify-docker-hardening.sh +0 -439
- package/.kilocode/kilocode.md +0 -14
- package/.kilocode/skills/.ma-agents.json +0 -199
- package/.kilocode/skills/MANIFEST.yaml +0 -204
- package/.kilocode/skills/ai-audit-trail/SKILL.md +0 -23
- package/.kilocode/skills/cmake-best-practices/SKILL.md +0 -64
- package/.kilocode/skills/cmake-best-practices/examples/cmake.md +0 -59
- package/.kilocode/skills/code-documentation/SKILL.md +0 -57
- package/.kilocode/skills/code-documentation/examples/cpp.md +0 -29
- package/.kilocode/skills/code-documentation/examples/csharp.md +0 -28
- package/.kilocode/skills/code-documentation/examples/javascript_typescript.md +0 -28
- package/.kilocode/skills/code-documentation/examples/python.md +0 -57
- package/.kilocode/skills/code-review/SKILL.md +0 -43
- package/.kilocode/skills/commit-message/SKILL.md +0 -79
- package/.kilocode/skills/cpp-concurrency-safety/SKILL.md +0 -60
- package/.kilocode/skills/cpp-concurrency-safety/examples/concurrency.md +0 -73
- package/.kilocode/skills/cpp-const-correctness/SKILL.md +0 -63
- package/.kilocode/skills/cpp-const-correctness/examples/const_correctness.md +0 -54
- package/.kilocode/skills/cpp-memory-handling/SKILL.md +0 -42
- package/.kilocode/skills/cpp-memory-handling/examples/modern-cpp.md +0 -49
- package/.kilocode/skills/cpp-memory-handling/examples/smart-pointers.md +0 -46
- package/.kilocode/skills/cpp-modern-composition/SKILL.md +0 -64
- package/.kilocode/skills/cpp-modern-composition/examples/composition.md +0 -51
- package/.kilocode/skills/cpp-robust-interfaces/SKILL.md +0 -55
- package/.kilocode/skills/cpp-robust-interfaces/examples/interfaces.md +0 -56
- package/.kilocode/skills/create-hardened-docker-skill/SKILL.md +0 -637
- package/.kilocode/skills/create-hardened-docker-skill/scripts/create-all.sh +0 -489
- package/.kilocode/skills/docker-hardening-verification/SKILL.md +0 -28
- package/.kilocode/skills/docker-hardening-verification/scripts/verify-hardening.sh +0 -39
- package/.kilocode/skills/docker-image-signing/SKILL.md +0 -28
- package/.kilocode/skills/docker-image-signing/scripts/sign-image.sh +0 -33
- package/.kilocode/skills/document-revision-history/SKILL.md +0 -104
- package/.kilocode/skills/git-workflow-skill/SKILL.md +0 -194
- package/.kilocode/skills/git-workflow-skill/hooks/commit-msg +0 -61
- package/.kilocode/skills/git-workflow-skill/hooks/pre-commit +0 -38
- package/.kilocode/skills/git-workflow-skill/hooks/prepare-commit-msg +0 -56
- package/.kilocode/skills/git-workflow-skill/scripts/finish-feature.sh +0 -192
- package/.kilocode/skills/git-workflow-skill/scripts/install-hooks.sh +0 -55
- package/.kilocode/skills/git-workflow-skill/scripts/start-feature.sh +0 -110
- package/.kilocode/skills/git-workflow-skill/scripts/validate-workflow.sh +0 -229
- package/.kilocode/skills/js-ts-dependency-mgmt/SKILL.md +0 -49
- package/.kilocode/skills/js-ts-dependency-mgmt/examples/dependency_mgmt.md +0 -60
- package/.kilocode/skills/js-ts-security-skill/SKILL.md +0 -64
- package/.kilocode/skills/js-ts-security-skill/scripts/verify-security.sh +0 -136
- package/.kilocode/skills/logging-best-practices/SKILL.md +0 -50
- package/.kilocode/skills/logging-best-practices/examples/cpp.md +0 -36
- package/.kilocode/skills/logging-best-practices/examples/csharp.md +0 -49
- package/.kilocode/skills/logging-best-practices/examples/javascript.md +0 -77
- package/.kilocode/skills/logging-best-practices/examples/python.md +0 -57
- package/.kilocode/skills/logging-best-practices/references/logging-standards.md +0 -29
- package/.kilocode/skills/opentelemetry-best-practices/SKILL.md +0 -34
- package/.kilocode/skills/opentelemetry-best-practices/examples/go.md +0 -32
- package/.kilocode/skills/opentelemetry-best-practices/examples/javascript.md +0 -58
- package/.kilocode/skills/opentelemetry-best-practices/examples/python.md +0 -37
- package/.kilocode/skills/opentelemetry-best-practices/references/otel-standards.md +0 -37
- package/.kilocode/skills/python-dependency-mgmt/SKILL.md +0 -42
- package/.kilocode/skills/python-dependency-mgmt/examples/dependency_mgmt.md +0 -67
- package/.kilocode/skills/python-security-skill/SKILL.md +0 -56
- package/.kilocode/skills/python-security-skill/examples/security.md +0 -56
- package/.kilocode/skills/self-signed-cert/SKILL.md +0 -42
- package/.kilocode/skills/self-signed-cert/scripts/generate-cert.ps1 +0 -45
- package/.kilocode/skills/self-signed-cert/scripts/generate-cert.sh +0 -43
- package/.kilocode/skills/skill-creator/SKILL.md +0 -196
- package/.kilocode/skills/skill-creator/references/output-patterns.md +0 -82
- package/.kilocode/skills/skill-creator/references/workflows.md +0 -28
- package/.kilocode/skills/skill-creator/scripts/init_skill.py +0 -208
- package/.kilocode/skills/skill-creator/scripts/package_skill.py +0 -99
- package/.kilocode/skills/skill-creator/scripts/quick_validate.py +0 -113
- package/.kilocode/skills/test-accompanied-development/SKILL.md +0 -50
- package/.kilocode/skills/test-generator/SKILL.md +0 -65
- package/.kilocode/skills/vercel-react-best-practices/SKILL.md +0 -109
- package/.kilocode/skills/verify-hardened-docker-skill/SKILL.md +0 -442
- package/.kilocode/skills/verify-hardened-docker-skill/scripts/verify-docker-hardening.sh +0 -439
- package/lib/bmad-cache/gds/src/agents/game-architect.agent.yaml +0 -44
- package/lib/bmad-cache/gds/src/agents/game-designer.agent.yaml +0 -45
- package/lib/bmad-cache/gds/src/agents/game-dev.agent.yaml +0 -49
- package/lib/bmad-cache/gds/src/agents/game-qa.agent.yaml +0 -63
- package/lib/bmad-cache/gds/src/agents/game-scrum-master.agent.yaml +0 -52
- package/lib/bmad-cache/gds/src/agents/game-solo-dev.agent.yaml +0 -53
- package/lib/bmad-cache/gds/src/agents/tech-writer/tech-writer.agent.yaml +0 -45
- package/lib/bmad-cache/gds/src/teams/default-party.csv +0 -12
- package/lib/bmad-cache/gds/src/teams/team-gamedev.yaml +0 -29
- package/lib/bmad-cache/gds/src/workflows/1-preproduction/brainstorm-game/bmad-skill-manifest.yaml +0 -3
- package/lib/bmad-cache/gds/src/workflows/1-preproduction/game-brief/bmad-skill-manifest.yaml +0 -3
- package/lib/bmad-cache/gds/src/workflows/2-design/gdd/bmad-skill-manifest.yaml +0 -3
- package/lib/bmad-cache/gds/src/workflows/2-design/narrative/bmad-skill-manifest.yaml +0 -3
- package/lib/bmad-cache/gds/src/workflows/3-technical/check-implementation-readiness/bmad-skill-manifest.yaml +0 -3
- package/lib/bmad-cache/gds/src/workflows/3-technical/create-epics-and-stories/bmad-skill-manifest.yaml +0 -3
- package/lib/bmad-cache/gds/src/workflows/3-technical/game-architecture/bmad-skill-manifest.yaml +0 -3
- package/lib/bmad-cache/gds/src/workflows/3-technical/generate-project-context/bmad-skill-manifest.yaml +0 -3
- package/lib/bmad-cache/gds/src/workflows/4-production/code-review/bmad-skill-manifest.yaml +0 -3
- package/lib/bmad-cache/gds/src/workflows/4-production/correct-course/bmad-skill-manifest.yaml +0 -3
- package/lib/bmad-cache/gds/src/workflows/4-production/retrospective/bmad-skill-manifest.yaml +0 -3
- package/lib/bmad-cache/gds/src/workflows/4-production/sprint-planning/bmad-skill-manifest.yaml +0 -3
- package/lib/bmad-cache/gds/src/workflows/4-production/sprint-status/bmad-skill-manifest.yaml +0 -3
- package/lib/bmad-cache/gds/src/workflows/document-project/bmad-skill-manifest.yaml +0 -3
- package/lib/bmad-cache/gds/src/workflows/gametest/automate/bmad-skill-manifest.yaml +0 -3
- package/lib/bmad-cache/gds/src/workflows/gametest/e2e-scaffold/bmad-skill-manifest.yaml +0 -3
- package/lib/bmad-cache/gds/src/workflows/gametest/performance/bmad-skill-manifest.yaml +0 -3
- package/lib/bmad-cache/gds/src/workflows/gametest/playtest-plan/bmad-skill-manifest.yaml +0 -3
- package/lib/bmad-cache/gds/src/workflows/gametest/test-design/bmad-skill-manifest.yaml +0 -3
- package/lib/bmad-cache/gds/src/workflows/gametest/test-framework/bmad-skill-manifest.yaml +0 -3
- package/lib/bmad-cache/gds/src/workflows/gametest/test-review/bmad-skill-manifest.yaml +0 -3
- package/lib/bmad-cache/gds/src/workflows/gds-quick-flow/quick-spec/bmad-skill-manifest.yaml +0 -3
- package/lib/bmad-cache/tea/.github/CODE_OF_CONDUCT.md +0 -128
- package/lib/bmad-cache/tea/.github/FUNDING.yaml +0 -15
- package/lib/bmad-cache/tea/.github/ISSUE_TEMPLATE/config.yaml +0 -11
- package/lib/bmad-cache/tea/.github/ISSUE_TEMPLATE/feature_request.md +0 -70
- package/lib/bmad-cache/tea/.github/ISSUE_TEMPLATE/issue.md +0 -61
- package/lib/bmad-cache/tea/.github/workflows/docs.yaml +0 -66
- package/lib/bmad-cache/tea/.github/workflows/manual-release.yaml +0 -195
- package/lib/bmad-cache/tea/.github/workflows/quality.yaml +0 -114
- /package/lib/bmad-cache/gds/src/workflows/1-preproduction/{brainstorm-game → gds-brainstorm-game}/game-brain-methods.csv +0 -0
- /package/lib/bmad-cache/gds/src/workflows/2-design/{gdd → gds-create-gdd}/game-types.csv +0 -0
- /package/lib/bmad-cache/gds/src/workflows/3-technical/{game-architecture → gds-game-architecture}/architecture-patterns.yaml +0 -0
- /package/lib/bmad-cache/gds/src/workflows/3-technical/{game-architecture → gds-game-architecture}/decision-catalog.yaml +0 -0
- /package/lib/bmad-cache/gds/src/workflows/3-technical/{game-architecture → gds-game-architecture}/engine-mcps.yaml +0 -0
- /package/lib/bmad-cache/gds/src/workflows/3-technical/{game-architecture → gds-game-architecture}/pattern-categories.csv +0 -0
- /package/lib/bmad-cache/gds/src/workflows/4-production/{sprint-planning → gds-sprint-planning}/sprint-status-template.yaml +0 -0
- /package/lib/bmad-cache/gds/src/workflows/{document-project → gds-document-project}/documentation-requirements.csv +0 -0
- /package/lib/bmad-cache/gds/src/workflows/{document-project → gds-document-project}/templates/project-scan-report-schema.json +0 -0
package/lib/installer.js
CHANGED
|
@@ -107,6 +107,56 @@ async function generateSkillsManifest(installPath) {
|
|
|
107
107
|
console.log(chalk.cyan(` + Generated ${manifestYamlPath}`));
|
|
108
108
|
}
|
|
109
109
|
|
|
110
|
+
/**
|
|
111
|
+
* Find the insertion point in content after all skipped headers.
|
|
112
|
+
* For '---' pattern, skips YAML frontmatter block (opening --- on first line through closing ---).
|
|
113
|
+
* @param {string} content - File content
|
|
114
|
+
* @param {string[]} [skipPatterns] - Patterns to skip (currently supports '---' for YAML frontmatter)
|
|
115
|
+
* @returns {number} Character index where injection should be inserted
|
|
116
|
+
*/
|
|
117
|
+
function findInsertionPoint(content, skipPatterns) {
|
|
118
|
+
if (!content || !skipPatterns || skipPatterns.length === 0) {
|
|
119
|
+
return 0;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
let idx = 0;
|
|
123
|
+
|
|
124
|
+
for (const pattern of skipPatterns) {
|
|
125
|
+
if (pattern === '---') {
|
|
126
|
+
// YAML frontmatter: must start at position 0 (or after leading whitespace)
|
|
127
|
+
const trimmedStart = content.slice(idx).trimStart();
|
|
128
|
+
const leadingWhitespace = content.length - idx - trimmedStart.length;
|
|
129
|
+
|
|
130
|
+
if (!trimmedStart.startsWith('---')) {
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Find the opening ---
|
|
135
|
+
const openIdx = idx + leadingWhitespace;
|
|
136
|
+
const afterOpen = content.indexOf('\n', openIdx);
|
|
137
|
+
if (afterOpen === -1) {
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Find the closing ---
|
|
142
|
+
const closeIdx = content.indexOf('\n---', afterOpen);
|
|
143
|
+
if (closeIdx === -1) {
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Move past the closing --- line
|
|
148
|
+
const afterClose = content.indexOf('\n', closeIdx + 1);
|
|
149
|
+
if (afterClose === -1) {
|
|
150
|
+
idx = content.length;
|
|
151
|
+
} else {
|
|
152
|
+
idx = afterClose + 1;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
return idx;
|
|
158
|
+
}
|
|
159
|
+
|
|
110
160
|
async function updateAgentInstructions(agent, projectRoot) {
|
|
111
161
|
if (!agent.instructionFiles || agent.instructionFiles.length === 0) return;
|
|
112
162
|
|
|
@@ -129,7 +179,7 @@ Do not load skills that are not relevant to the current task.
|
|
|
129
179
|
|
|
130
180
|
const markerStart = '<!-- MA-AGENTS-START -->';
|
|
131
181
|
const markerEnd = '<!-- MA-AGENTS-END -->';
|
|
132
|
-
const wrappedInstruction =
|
|
182
|
+
const wrappedInstruction = `${markerStart}${planningInstruction}${markerEnd}\n`;
|
|
133
183
|
|
|
134
184
|
for (const fileName of agent.instructionFiles) {
|
|
135
185
|
const filePath = path.join(projectRoot, fileName);
|
|
@@ -140,9 +190,13 @@ Do not load skills that are not relevant to the current task.
|
|
|
140
190
|
|
|
141
191
|
const regex = new RegExp(`${markerStart}[\\s\\S]*?${markerEnd}`, 'g');
|
|
142
192
|
if (regex.test(content)) {
|
|
193
|
+
// Replace existing block in-place (AC #2)
|
|
143
194
|
content = content.replace(regex, wrappedInstruction.trim());
|
|
144
195
|
} else {
|
|
145
|
-
|
|
196
|
+
// Top-insert: place after skipped headers (AC #1, #3)
|
|
197
|
+
const strategy = agent.injectionStrategy || { position: 'top', skipPatterns: [] };
|
|
198
|
+
const insertIdx = findInsertionPoint(content, strategy.skipPatterns);
|
|
199
|
+
content = content.slice(0, insertIdx) + wrappedInstruction + '\n' + content.slice(insertIdx);
|
|
146
200
|
}
|
|
147
201
|
} else if (agent.category === 'bmad') {
|
|
148
202
|
// BMAD agent instruction files ARE the agent definitions (persona, menu, activation).
|
|
@@ -152,6 +206,7 @@ Do not load skills that are not relevant to the current task.
|
|
|
152
206
|
console.log(chalk.gray(` Skipped ${fileName} (BMAD agent file not yet deployed)`));
|
|
153
207
|
continue;
|
|
154
208
|
} else {
|
|
209
|
+
// New non-BMAD file: block is sole content (AC #1, #3)
|
|
155
210
|
content = wrappedInstruction;
|
|
156
211
|
}
|
|
157
212
|
|
|
@@ -609,5 +664,7 @@ module.exports = {
|
|
|
609
664
|
readManifest,
|
|
610
665
|
getInstalledSkillInfo,
|
|
611
666
|
getManifestAgents,
|
|
612
|
-
compareSemver
|
|
667
|
+
compareSemver,
|
|
668
|
+
findInsertionPoint,
|
|
669
|
+
_testUpdateAgentInstructions: updateAgentInstructions
|
|
613
670
|
};
|
package/package.json
CHANGED
|
@@ -187,11 +187,14 @@ function processModule(mod, manifest) {
|
|
|
187
187
|
console.log(` 📦 ${mod.code}: no package.json, skipping npm install`);
|
|
188
188
|
}
|
|
189
189
|
|
|
190
|
-
//
|
|
190
|
+
// Rename .git → _git_preserved so it survives npm pack (npm always strips .git/).
|
|
191
|
+
// prePopulateBmadCache() restores it and sets origin to a local file:// URL so that
|
|
192
|
+
// bmad-method's "git fetch origin" succeeds without network access.
|
|
191
193
|
const gitDir = path.join(moduleDir, '.git');
|
|
194
|
+
const preservedDir = path.join(moduleDir, '_git_preserved');
|
|
192
195
|
if (fs.existsSync(gitDir)) {
|
|
193
|
-
fs.
|
|
194
|
-
console.log(`
|
|
196
|
+
fs.renameSync(gitDir, preservedDir);
|
|
197
|
+
console.log(` 📦 ${mod.code}: preserved .git as _git_preserved`);
|
|
195
198
|
}
|
|
196
199
|
|
|
197
200
|
return {
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Tests for Story 8.2: Add Agent-Aware Injection Strategy to Registry
|
|
4
|
+
*
|
|
5
|
+
* Validates injectionStrategy is present on all agents and that installer.js
|
|
6
|
+
* reads it without hardcoding agent-specific logic.
|
|
7
|
+
*/
|
|
8
|
+
'use strict';
|
|
9
|
+
|
|
10
|
+
const assert = require('assert');
|
|
11
|
+
const fs = require('fs');
|
|
12
|
+
const path = require('path');
|
|
13
|
+
|
|
14
|
+
let passed = 0;
|
|
15
|
+
let failed = 0;
|
|
16
|
+
const errors = [];
|
|
17
|
+
|
|
18
|
+
function test(name, fn) {
|
|
19
|
+
try {
|
|
20
|
+
fn();
|
|
21
|
+
console.log(` ✓ ${name}`);
|
|
22
|
+
passed++;
|
|
23
|
+
} catch (err) {
|
|
24
|
+
console.error(` ✗ ${name}: ${err.message}`);
|
|
25
|
+
failed++;
|
|
26
|
+
errors.push({ name, error: err.message });
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const { getAllAgents, getAgent } = require('../lib/agents');
|
|
31
|
+
const allAgents = getAllAgents();
|
|
32
|
+
|
|
33
|
+
// ─── Task 3: Verify installer.js reads injectionStrategy ────────────────────
|
|
34
|
+
|
|
35
|
+
console.log('\nTask 3 — installer.js reads injectionStrategy');
|
|
36
|
+
|
|
37
|
+
test('3.1: updateAgentInstructions reads agent.injectionStrategy', () => {
|
|
38
|
+
const installerSrc = fs.readFileSync(path.join(__dirname, '..', 'lib', 'installer.js'), 'utf-8');
|
|
39
|
+
assert.ok(installerSrc.includes('agent.injectionStrategy'),
|
|
40
|
+
'installer.js should reference agent.injectionStrategy');
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
test('3.2: default fallback exists for undefined injectionStrategy', () => {
|
|
44
|
+
const installerSrc = fs.readFileSync(path.join(__dirname, '..', 'lib', 'installer.js'), 'utf-8');
|
|
45
|
+
assert.ok(
|
|
46
|
+
installerSrc.includes("agent.injectionStrategy || { position: 'top', skipPatterns: [] }"),
|
|
47
|
+
'installer.js should have default fallback for missing injectionStrategy'
|
|
48
|
+
);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
test('3.3: installer.js contains NO agent-name-specific logic', () => {
|
|
52
|
+
const installerSrc = fs.readFileSync(path.join(__dirname, '..', 'lib', 'installer.js'), 'utf-8');
|
|
53
|
+
const agentIds = allAgents.map(a => a.id);
|
|
54
|
+
for (const id of agentIds) {
|
|
55
|
+
// Use regex to check for conditional logic on agent IDs, not just string presence
|
|
56
|
+
const idCheckPattern = new RegExp(`agent\\.id\\s*===\\s*['"\`]${id.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}['"\`]`);
|
|
57
|
+
assert.ok(
|
|
58
|
+
!idCheckPattern.test(installerSrc),
|
|
59
|
+
`installer.js should not contain conditional check for agent id '${id}'`
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
// ─── Task 4: Validate registry completeness ─────────────────────────────────
|
|
65
|
+
|
|
66
|
+
console.log('\nTask 4 — Registry completeness');
|
|
67
|
+
|
|
68
|
+
const EXPECTED_IDE = ['claude-code', 'gemini', 'copilot', 'kilocode', 'cline', 'cursor', 'antigravity'];
|
|
69
|
+
const EXPECTED_BMAD = ['bmm-sre', 'bmm-devops', 'bmm-cyber', 'bmm-mil498'];
|
|
70
|
+
const EXPECTED_ALL = [...EXPECTED_IDE, ...EXPECTED_BMAD];
|
|
71
|
+
|
|
72
|
+
test('4.1: registry has exactly 11 agents (7 IDE + 4 BMAD)', () => {
|
|
73
|
+
assert.strictEqual(allAgents.length, 11, `Expected 11 agents, got ${allAgents.length}`);
|
|
74
|
+
const ideCount = allAgents.filter(a => a.category === 'ide').length;
|
|
75
|
+
const bmadCount = allAgents.filter(a => a.category === 'bmad').length;
|
|
76
|
+
assert.strictEqual(ideCount, 7, `Expected 7 IDE agents, got ${ideCount}`);
|
|
77
|
+
assert.strictEqual(bmadCount, 4, `Expected 4 BMAD agents, got ${bmadCount}`);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
test('4.2: every agent has well-shaped injectionStrategy property', () => {
|
|
81
|
+
for (const agent of allAgents) {
|
|
82
|
+
assert.ok(agent.injectionStrategy,
|
|
83
|
+
`Agent '${agent.id}' is missing injectionStrategy`);
|
|
84
|
+
assert.strictEqual(typeof agent.injectionStrategy.position, 'string',
|
|
85
|
+
`Agent '${agent.id}' injectionStrategy.position should be a string`);
|
|
86
|
+
assert.ok(Array.isArray(agent.injectionStrategy.skipPatterns),
|
|
87
|
+
`Agent '${agent.id}' injectionStrategy.skipPatterns should be an array, got ${typeof agent.injectionStrategy.skipPatterns}`);
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
test('4.3: all agents with .md instruction files have skipPatterns: [---]', () => {
|
|
92
|
+
for (const agent of allAgents) {
|
|
93
|
+
const hasMdFiles = agent.instructionFiles.some(f => f.endsWith('.md'));
|
|
94
|
+
if (hasMdFiles) {
|
|
95
|
+
assert.ok(agent.injectionStrategy.skipPatterns,
|
|
96
|
+
`Agent '${agent.id}' should have skipPatterns`);
|
|
97
|
+
assert.ok(agent.injectionStrategy.skipPatterns.includes('---'),
|
|
98
|
+
`Agent '${agent.id}' should have '---' in skipPatterns`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
test('4.3b: all agents have position: top', () => {
|
|
104
|
+
for (const agent of allAgents) {
|
|
105
|
+
assert.strictEqual(agent.injectionStrategy.position, 'top',
|
|
106
|
+
`Agent '${agent.id}' should have position: 'top'`);
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
test('4.4: all expected agent IDs are present', () => {
|
|
111
|
+
const ids = allAgents.map(a => a.id);
|
|
112
|
+
for (const expectedId of EXPECTED_ALL) {
|
|
113
|
+
assert.ok(ids.includes(expectedId), `Missing expected agent: ${expectedId}`);
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
// Print summary
|
|
118
|
+
console.log(`\n${passed} passed, ${failed} failed`);
|
|
119
|
+
if (errors.length > 0) {
|
|
120
|
+
console.log('\nFailed tests:');
|
|
121
|
+
errors.forEach(e => console.log(` - ${e.name}: ${e.error}`));
|
|
122
|
+
}
|
|
123
|
+
if (failed > 0) process.exit(1);
|
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Tests for Story 8.1: Move Instruction Injection to TOP Priority Position
|
|
4
|
+
*
|
|
5
|
+
* Tests findInsertionPoint() helper and top-insertion behavior in updateAgentInstructions().
|
|
6
|
+
*/
|
|
7
|
+
'use strict';
|
|
8
|
+
|
|
9
|
+
const assert = require('assert');
|
|
10
|
+
const fs = require('fs-extra');
|
|
11
|
+
const path = require('path');
|
|
12
|
+
const os = require('os');
|
|
13
|
+
|
|
14
|
+
let passed = 0;
|
|
15
|
+
let failed = 0;
|
|
16
|
+
const errors = [];
|
|
17
|
+
|
|
18
|
+
function test(name, fn) {
|
|
19
|
+
try {
|
|
20
|
+
fn();
|
|
21
|
+
console.log(` ✓ ${name}`);
|
|
22
|
+
passed++;
|
|
23
|
+
} catch (err) {
|
|
24
|
+
console.error(` ✗ ${name}: ${err.message}`);
|
|
25
|
+
failed++;
|
|
26
|
+
errors.push({ name, error: err.message });
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
async function asyncTest(name, fn) {
|
|
31
|
+
try {
|
|
32
|
+
await fn();
|
|
33
|
+
console.log(` ✓ ${name}`);
|
|
34
|
+
passed++;
|
|
35
|
+
} catch (err) {
|
|
36
|
+
console.error(` ✗ ${name}: ${err.message}`);
|
|
37
|
+
failed++;
|
|
38
|
+
errors.push({ name, error: err.message });
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Load functions under test
|
|
43
|
+
const { findInsertionPoint, _testUpdateAgentInstructions: updateFn } = require('../lib/installer');
|
|
44
|
+
|
|
45
|
+
// ─── Task 1: findInsertionPoint() unit tests ────────────────────────────────
|
|
46
|
+
|
|
47
|
+
console.log('\nTask 1 — findInsertionPoint() with skipPatterns');
|
|
48
|
+
|
|
49
|
+
test('1.1: returns 0 for empty content with no skip patterns', () => {
|
|
50
|
+
assert.strictEqual(findInsertionPoint('', []), 0);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
test('1.2: returns 0 for content with no skip patterns', () => {
|
|
54
|
+
const content = '# Hello World\nSome content here.\n';
|
|
55
|
+
assert.strictEqual(findInsertionPoint(content, []), 0);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
test('1.3: skips YAML frontmatter with --- pattern', () => {
|
|
59
|
+
const content = '---\ntitle: Test\ndate: 2026-01-01\n---\n# Hello\nContent here.\n';
|
|
60
|
+
const idx = findInsertionPoint(content, ['---']);
|
|
61
|
+
assert.strictEqual(idx, content.indexOf('# Hello'));
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
test('1.4: skips YAML frontmatter at very start of file', () => {
|
|
65
|
+
const content = '---\nkey: value\n---\nBody text';
|
|
66
|
+
const idx = findInsertionPoint(content, ['---']);
|
|
67
|
+
assert.strictEqual(idx, content.indexOf('Body text'));
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
test('1.5: does not skip --- that is not at the beginning of the file', () => {
|
|
71
|
+
const content = '# Title\nSome text\n---\nMore text\n';
|
|
72
|
+
const idx = findInsertionPoint(content, ['---']);
|
|
73
|
+
assert.strictEqual(idx, 0);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
test('1.6: handles frontmatter with trailing newline correctly', () => {
|
|
77
|
+
const content = '---\ntitle: Test\n---\n\n# Content\n';
|
|
78
|
+
const idx = findInsertionPoint(content, ['---']);
|
|
79
|
+
const expected = content.indexOf('\n# Content');
|
|
80
|
+
assert.strictEqual(idx, expected);
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
test('1.7: returns 0 for empty content with --- pattern', () => {
|
|
84
|
+
assert.strictEqual(findInsertionPoint('', ['---']), 0);
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
test('1.8: handles file with only frontmatter (no body)', () => {
|
|
88
|
+
const content = '---\ntitle: Only FM\n---\n';
|
|
89
|
+
const idx = findInsertionPoint(content, ['---']);
|
|
90
|
+
assert.strictEqual(idx, content.length);
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
test('1.9: handles multiple --- later in file (horizontal rules) — only skips frontmatter pair', () => {
|
|
94
|
+
const content = '---\ntitle: Test\n---\n# Heading\n\n---\n\nMore content\n';
|
|
95
|
+
const idx = findInsertionPoint(content, ['---']);
|
|
96
|
+
assert.strictEqual(idx, content.indexOf('# Heading'));
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
test('1.10: empty skipPatterns array returns 0', () => {
|
|
100
|
+
const content = '---\ntitle: Test\n---\nContent';
|
|
101
|
+
assert.strictEqual(findInsertionPoint(content, []), 0);
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
test('1.11: undefined skipPatterns defaults to empty and returns 0', () => {
|
|
105
|
+
const content = '---\ntitle: Test\n---\nContent';
|
|
106
|
+
assert.strictEqual(findInsertionPoint(content, undefined), 0);
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
// ─── Task 2 & 3: Integration tests — top-insertion behavior ─────────────────
|
|
110
|
+
|
|
111
|
+
console.log('\nTask 2 & 3 — updateAgentInstructions() top-insertion');
|
|
112
|
+
|
|
113
|
+
const MARKER_START = '<!-- MA-AGENTS-START -->';
|
|
114
|
+
const MARKER_END = '<!-- MA-AGENTS-END -->';
|
|
115
|
+
|
|
116
|
+
async function withTempDir(fn) {
|
|
117
|
+
const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'ma-agents-test-'));
|
|
118
|
+
try {
|
|
119
|
+
await fn(tmpDir);
|
|
120
|
+
} finally {
|
|
121
|
+
await fs.remove(tmpDir);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
function createMockAgent(instructionFiles, opts = {}) {
|
|
126
|
+
return {
|
|
127
|
+
instructionFiles,
|
|
128
|
+
category: opts.category || 'ide',
|
|
129
|
+
getProjectPath: () => '/mock/path',
|
|
130
|
+
...(opts.injectionStrategy ? { injectionStrategy: opts.injectionStrategy } : {})
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
(async () => {
|
|
135
|
+
await asyncTest('2.1: new file without frontmatter — block starts at position 0, no leading blank line', async () => {
|
|
136
|
+
await withTempDir(async (tmpDir) => {
|
|
137
|
+
const filePath = path.join(tmpDir, 'test-instructions.md');
|
|
138
|
+
const agent = createMockAgent(['test-instructions.md']);
|
|
139
|
+
await updateFn(agent, tmpDir);
|
|
140
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
141
|
+
assert.ok(content.startsWith(MARKER_START),
|
|
142
|
+
`File should start with marker, got: "${content.slice(0, 40)}..."`);
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
await asyncTest('2.2: existing file without frontmatter — block inserted at top, no leading blank line', async () => {
|
|
147
|
+
await withTempDir(async (tmpDir) => {
|
|
148
|
+
const filePath = path.join(tmpDir, 'test-instructions.md');
|
|
149
|
+
await fs.writeFile(filePath, '# Existing Content\nSome text.\n');
|
|
150
|
+
const agent = createMockAgent(['test-instructions.md']);
|
|
151
|
+
await updateFn(agent, tmpDir);
|
|
152
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
153
|
+
assert.ok(content.startsWith(MARKER_START),
|
|
154
|
+
`File should start with marker, got: "${content.slice(0, 40)}..."`);
|
|
155
|
+
const contentIdx = content.indexOf('# Existing Content');
|
|
156
|
+
assert.ok(contentIdx > 0, 'Original content should still exist');
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
await asyncTest('2.3: existing file with YAML frontmatter — block after frontmatter, before content', async () => {
|
|
161
|
+
await withTempDir(async (tmpDir) => {
|
|
162
|
+
const filePath = path.join(tmpDir, 'test-instructions.md');
|
|
163
|
+
await fs.writeFile(filePath, '---\ntitle: Test\n---\n# Content\nBody text.\n');
|
|
164
|
+
const agent = createMockAgent(['test-instructions.md'], {
|
|
165
|
+
injectionStrategy: { position: 'top', skipPatterns: ['---'] }
|
|
166
|
+
});
|
|
167
|
+
await updateFn(agent, tmpDir);
|
|
168
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
169
|
+
const fmEnd = content.indexOf('---\n', 4) + 4;
|
|
170
|
+
const blockIdx = content.indexOf(MARKER_START);
|
|
171
|
+
const bodyIdx = content.indexOf('# Content');
|
|
172
|
+
assert.ok(blockIdx >= fmEnd, `Block (${blockIdx}) should be at or after frontmatter end (${fmEnd})`);
|
|
173
|
+
assert.ok(blockIdx < bodyIdx, `Block (${blockIdx}) should be before body content (${bodyIdx})`);
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
await asyncTest('2.4: replace-in-place — second run replaces block, no duplicates', async () => {
|
|
178
|
+
await withTempDir(async (tmpDir) => {
|
|
179
|
+
const filePath = path.join(tmpDir, 'test-instructions.md');
|
|
180
|
+
await fs.writeFile(filePath, '# Content\nBody.\n');
|
|
181
|
+
const agent = createMockAgent(['test-instructions.md']);
|
|
182
|
+
await updateFn(agent, tmpDir);
|
|
183
|
+
await updateFn(agent, tmpDir);
|
|
184
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
185
|
+
const count = (content.match(new RegExp(MARKER_START, 'g')) || []).length;
|
|
186
|
+
assert.strictEqual(count, 1, `Should have exactly 1 marker block, found ${count}`);
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
await asyncTest('2.5: exactly one blank line separates block from subsequent content', async () => {
|
|
191
|
+
await withTempDir(async (tmpDir) => {
|
|
192
|
+
const filePath = path.join(tmpDir, 'test-instructions.md');
|
|
193
|
+
await fs.writeFile(filePath, '# Content\nBody.\n');
|
|
194
|
+
const agent = createMockAgent(['test-instructions.md']);
|
|
195
|
+
await updateFn(agent, tmpDir);
|
|
196
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
197
|
+
const endIdx = content.indexOf(MARKER_END) + MARKER_END.length;
|
|
198
|
+
const between = content.slice(endIdx, content.indexOf('# Content'));
|
|
199
|
+
// Exactly two newlines: one closing the marker line, one blank separator
|
|
200
|
+
assert.strictEqual(between, '\n\n',
|
|
201
|
+
`Expected exactly "\\n\\n" between block and content, got: ${JSON.stringify(between)}`);
|
|
202
|
+
});
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
// ─── Task 4: Edge case tests ─────────────────────────────────────────────
|
|
206
|
+
|
|
207
|
+
console.log('\nTask 4 — Edge cases');
|
|
208
|
+
|
|
209
|
+
await asyncTest('4.1: empty file — block is sole content', async () => {
|
|
210
|
+
await withTempDir(async (tmpDir) => {
|
|
211
|
+
const filePath = path.join(tmpDir, 'test-instructions.md');
|
|
212
|
+
await fs.writeFile(filePath, '');
|
|
213
|
+
const agent = createMockAgent(['test-instructions.md']);
|
|
214
|
+
await updateFn(agent, tmpDir);
|
|
215
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
216
|
+
assert.ok(content.startsWith(MARKER_START), 'Should start with marker block');
|
|
217
|
+
assert.ok(content.includes(MARKER_END), 'Should contain end marker');
|
|
218
|
+
});
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
await asyncTest('4.2: file with only YAML frontmatter — block after frontmatter', async () => {
|
|
222
|
+
await withTempDir(async (tmpDir) => {
|
|
223
|
+
const filePath = path.join(tmpDir, 'test-instructions.md');
|
|
224
|
+
await fs.writeFile(filePath, '---\ntitle: Only FM\n---\n');
|
|
225
|
+
const agent = createMockAgent(['test-instructions.md'], {
|
|
226
|
+
injectionStrategy: { position: 'top', skipPatterns: ['---'] }
|
|
227
|
+
});
|
|
228
|
+
await updateFn(agent, tmpDir);
|
|
229
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
230
|
+
const blockIdx = content.indexOf(MARKER_START);
|
|
231
|
+
assert.ok(blockIdx > content.lastIndexOf('---\n', blockIdx - 1),
|
|
232
|
+
'Block should be after frontmatter');
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
await asyncTest('4.3: file with no frontmatter — block at position 0', async () => {
|
|
237
|
+
await withTempDir(async (tmpDir) => {
|
|
238
|
+
const filePath = path.join(tmpDir, 'test-instructions.md');
|
|
239
|
+
await fs.writeFile(filePath, '# Just a heading\nSome text\n');
|
|
240
|
+
const agent = createMockAgent(['test-instructions.md']);
|
|
241
|
+
await updateFn(agent, tmpDir);
|
|
242
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
243
|
+
assert.ok(content.startsWith(MARKER_START),
|
|
244
|
+
`File should start with marker, got: "${content.slice(0, 40)}..."`);
|
|
245
|
+
assert.ok(content.includes('# Just a heading'), 'Original content preserved');
|
|
246
|
+
});
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
await asyncTest('4.4: multiple --- (horizontal rules) — only skip frontmatter pair', async () => {
|
|
250
|
+
await withTempDir(async (tmpDir) => {
|
|
251
|
+
const filePath = path.join(tmpDir, 'test-instructions.md');
|
|
252
|
+
await fs.writeFile(filePath, '---\ntitle: Test\n---\n# Heading\n\n---\n\nMore content\n');
|
|
253
|
+
const agent = createMockAgent(['test-instructions.md'], {
|
|
254
|
+
injectionStrategy: { position: 'top', skipPatterns: ['---'] }
|
|
255
|
+
});
|
|
256
|
+
await updateFn(agent, tmpDir);
|
|
257
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
258
|
+
const blockIdx = content.indexOf(MARKER_START);
|
|
259
|
+
const headingIdx = content.indexOf('# Heading');
|
|
260
|
+
assert.ok(blockIdx < headingIdx, 'Block should be between frontmatter and heading, not after horizontal rule');
|
|
261
|
+
});
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
await asyncTest('4.5: BMAD agent with existing file — receives top-insert same as IDE agents', async () => {
|
|
265
|
+
await withTempDir(async (tmpDir) => {
|
|
266
|
+
const filePath = path.join(tmpDir, 'bmad-agent.md');
|
|
267
|
+
// BMAD file exists (deployed by applyCustomizations), so it should get injection
|
|
268
|
+
await fs.writeFile(filePath, '---\nname: SRE Agent\n---\n# Agent Definition\nContent.\n');
|
|
269
|
+
const agent = createMockAgent(['bmad-agent.md'], {
|
|
270
|
+
category: 'bmad',
|
|
271
|
+
injectionStrategy: { position: 'top', skipPatterns: ['---'] }
|
|
272
|
+
});
|
|
273
|
+
await updateFn(agent, tmpDir);
|
|
274
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
275
|
+
assert.ok(content.includes(MARKER_START), 'Existing BMAD file should receive injection');
|
|
276
|
+
const blockIdx = content.indexOf(MARKER_START);
|
|
277
|
+
const defIdx = content.indexOf('# Agent Definition');
|
|
278
|
+
assert.ok(blockIdx < defIdx, 'Block should be before agent definition content');
|
|
279
|
+
});
|
|
280
|
+
});
|
|
281
|
+
|
|
282
|
+
await asyncTest('4.5b: BMAD agent with non-existent file — skipped (not created)', async () => {
|
|
283
|
+
await withTempDir(async (tmpDir) => {
|
|
284
|
+
const filePath = path.join(tmpDir, 'bmad-missing.md');
|
|
285
|
+
const agent = createMockAgent(['bmad-missing.md'], { category: 'bmad' });
|
|
286
|
+
await updateFn(agent, tmpDir);
|
|
287
|
+
const exists = await fs.pathExists(filePath);
|
|
288
|
+
assert.strictEqual(exists, false, 'Non-existent BMAD file should NOT be created');
|
|
289
|
+
});
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
await asyncTest('4.6: Cline dual instruction files — both receive top-insertion', async () => {
|
|
293
|
+
await withTempDir(async (tmpDir) => {
|
|
294
|
+
const mdPath = path.join(tmpDir, 'clinerules.md');
|
|
295
|
+
const noExtPath = path.join(tmpDir, 'clinerules');
|
|
296
|
+
await fs.writeFile(mdPath, '# Cline Rules MD\nContent.\n');
|
|
297
|
+
await fs.writeFile(noExtPath, '# Cline Rules NoExt\nContent.\n');
|
|
298
|
+
const agent = createMockAgent(['clinerules.md', 'clinerules']);
|
|
299
|
+
await updateFn(agent, tmpDir);
|
|
300
|
+
const contentMd = await fs.readFile(mdPath, 'utf-8');
|
|
301
|
+
const contentNoExt = await fs.readFile(noExtPath, 'utf-8');
|
|
302
|
+
assert.ok(contentMd.includes(MARKER_START), '.md file should have block');
|
|
303
|
+
assert.ok(contentNoExt.includes(MARKER_START), 'no-ext file should have block');
|
|
304
|
+
assert.ok(contentMd.startsWith(MARKER_START),
|
|
305
|
+
`.md file should start with marker, got: "${contentMd.slice(0, 40)}..."`);
|
|
306
|
+
assert.ok(contentNoExt.startsWith(MARKER_START),
|
|
307
|
+
`no-ext file should start with marker, got: "${contentNoExt.slice(0, 40)}..."`);
|
|
308
|
+
});
|
|
309
|
+
});
|
|
310
|
+
|
|
311
|
+
// ─── L1: skipPatterns: ['---'] on file without frontmatter (integration) ──
|
|
312
|
+
|
|
313
|
+
console.log('\nExtra coverage — integration edge cases');
|
|
314
|
+
|
|
315
|
+
await asyncTest('L1: skipPatterns [---] on file without frontmatter — block at position 0', async () => {
|
|
316
|
+
await withTempDir(async (tmpDir) => {
|
|
317
|
+
const filePath = path.join(tmpDir, 'no-fm.md');
|
|
318
|
+
await fs.writeFile(filePath, '# No Frontmatter\nJust content.\n');
|
|
319
|
+
const agent = createMockAgent(['no-fm.md'], {
|
|
320
|
+
injectionStrategy: { position: 'top', skipPatterns: ['---'] }
|
|
321
|
+
});
|
|
322
|
+
await updateFn(agent, tmpDir);
|
|
323
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
324
|
+
assert.ok(content.startsWith(MARKER_START),
|
|
325
|
+
`Should start with marker even with skipPatterns set, got: "${content.slice(0, 40)}..."`);
|
|
326
|
+
});
|
|
327
|
+
});
|
|
328
|
+
|
|
329
|
+
// Print summary
|
|
330
|
+
console.log(`\n${passed} passed, ${failed} failed`);
|
|
331
|
+
if (errors.length > 0) {
|
|
332
|
+
console.log('\nFailed tests:');
|
|
333
|
+
errors.forEach(e => console.log(` - ${e.name}: ${e.error}`));
|
|
334
|
+
}
|
|
335
|
+
if (failed > 0) process.exit(1);
|
|
336
|
+
})();
|
package/.cline/clinerules.md
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
<!-- MA-AGENTS-START -->
|
|
3
|
-
# AI Agent Skills - Planning Instruction
|
|
4
|
-
|
|
5
|
-
You have access to a library of skills in your skills directory. Before starting any task:
|
|
6
|
-
|
|
7
|
-
1. Read the skill manifest at .cline/skills/MANIFEST.yaml
|
|
8
|
-
2. Based on the task description, select which skills are relevant
|
|
9
|
-
3. Read only the selected skill files
|
|
10
|
-
4. Then proceed with the task
|
|
11
|
-
|
|
12
|
-
Always load skills marked with always_load: true.
|
|
13
|
-
Do not load skills that are not relevant to the current task.
|
|
14
|
-
<!-- MA-AGENTS-END -->
|