bigpowers 2.86.5 → 2.86.6
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/.agents/skills/commit-message/SKILL.md +1 -1
- package/.agents/skills/evolve-skill/SKILL.md +1 -1
- package/.agents/skills/write-document/SKILL.md +1 -1
- package/.cline/skills/align-grid/SKILL.md +110 -0
- package/.cline/skills/assess-impact/SKILL.md +91 -0
- package/.cline/skills/audit-code/SKILL.md +184 -0
- package/.cline/skills/audit-plan/SKILL.md +89 -0
- package/.cline/skills/build-epic/SKILL.md +105 -0
- package/.cline/skills/change-request/SKILL.md +121 -0
- package/.cline/skills/commit-message/SKILL.md +140 -0
- package/.cline/skills/compose-workflow/SKILL.md +82 -0
- package/.cline/skills/context7-mcp/SKILL.md +55 -0
- package/.cline/skills/craft-skill/SKILL.md +196 -0
- package/.cline/skills/deepen-architecture/SKILL.md +260 -0
- package/.cline/skills/define-language/SKILL.md +80 -0
- package/.cline/skills/define-success/SKILL.md +12 -0
- package/.cline/skills/delegate-task/SKILL.md +91 -0
- package/.cline/skills/deploy/SKILL.md +198 -0
- package/.cline/skills/design-interface/SKILL.md +97 -0
- package/.cline/skills/develop-tdd/SKILL.md +416 -0
- package/.cline/skills/diagnose-root/SKILL.md +24 -0
- package/.cline/skills/diagnose-stall/SKILL.md +54 -0
- package/.cline/skills/dispatch-agents/SKILL.md +118 -0
- package/.cline/skills/edit-document/SKILL.md +23 -0
- package/.cline/skills/elaborate-spec/SKILL.md +101 -0
- package/.cline/skills/enforce-first/SKILL.md +45 -0
- package/.cline/skills/evolve-skill/SKILL.md +55 -0
- package/.cline/skills/execute-plan/SKILL.md +61 -0
- package/.cline/skills/extract-design/SKILL.md +132 -0
- package/.cline/skills/find-way/SKILL.md +191 -0
- package/.cline/skills/fix-bug/SKILL.md +67 -0
- package/.cline/skills/gate-trace/SKILL.md +92 -0
- package/.cline/skills/generate-allure-report/SKILL.md +285 -0
- package/.cline/skills/grill-me/SKILL.md +108 -0
- package/.cline/skills/grill-with-docs/SKILL.md +53 -0
- package/.cline/skills/guard-git/SKILL.md +231 -0
- package/.cline/skills/harden-vps/SKILL.md +291 -0
- package/.cline/skills/hook-commits/SKILL.md +94 -0
- package/.cline/skills/inspect-quality/SKILL.md +106 -0
- package/.cline/skills/investigate-bug/SKILL.md +127 -0
- package/.cline/skills/kickoff-branch/SKILL.md +143 -0
- package/.cline/skills/maintain-wiki/SKILL.md +64 -0
- package/.cline/skills/map-codebase/SKILL.md +71 -0
- package/.cline/skills/migrate-spec/SKILL.md +862 -0
- package/.cline/skills/model-domain/SKILL.md +232 -0
- package/.cline/skills/orchestrate-project/SKILL.md +174 -0
- package/.cline/skills/organize-workspace/SKILL.md +164 -0
- package/.cline/skills/plan-refactor/SKILL.md +87 -0
- package/.cline/skills/plan-release/SKILL.md +145 -0
- package/.cline/skills/plan-tests/SKILL.md +75 -0
- package/.cline/skills/plan-work/SKILL.md +260 -0
- package/.cline/skills/publish-package/SKILL.md +328 -0
- package/.cline/skills/quick-fix/SKILL.md +114 -0
- package/.cline/skills/release-branch/SKILL.md +298 -0
- package/.cline/skills/request-review/SKILL.md +113 -0
- package/.cline/skills/research-first/SKILL.md +87 -0
- package/.cline/skills/reset-baseline/SKILL.md +21 -0
- package/.cline/skills/respond-review/SKILL.md +71 -0
- package/.cline/skills/run-benchmark/SKILL.md +85 -0
- package/.cline/skills/run-evals/SKILL.md +80 -0
- package/.cline/skills/run-planning/SKILL.md +101 -0
- package/.cline/skills/scope-work/SKILL.md +63 -0
- package/.cline/skills/search-skills/SKILL.md +73 -0
- package/.cline/skills/security-review/SKILL.md +384 -0
- package/.cline/skills/seed-conventions/SKILL.md +302 -0
- package/.cline/skills/session-state/SKILL.md +146 -0
- package/.cline/skills/setup-environment/SKILL.md +39 -0
- package/.cline/skills/simulate-agents/SKILL.md +26 -0
- package/.cline/skills/slice-tasks/SKILL.md +68 -0
- package/.cline/skills/smoke-test/SKILL.md +257 -0
- package/.cline/skills/spike-prototype/SKILL.md +95 -0
- package/.cline/skills/stocktake-skills/SKILL.md +74 -0
- package/.cline/skills/survey-context/SKILL.md +135 -0
- package/.cline/skills/terse-mode/SKILL.md +42 -0
- package/.cline/skills/trace-requirement/SKILL.md +69 -0
- package/.cline/skills/using-bigpowers/SKILL.md +111 -0
- package/.cline/skills/validate-contracts/SKILL.md +277 -0
- package/.cline/skills/validate-fix/SKILL.md +147 -0
- package/.cline/skills/verify-work/SKILL.md +191 -0
- package/.cline/skills/visual-dashboard/SKILL.md +50 -0
- package/.cline/skills/wire-ci/SKILL.md +374 -0
- package/.cline/skills/wire-observability/SKILL.md +97 -0
- package/.cline/skills/write-document/SKILL.md +255 -0
- package/.codebuddy/skills/commit-message/SKILL.md +1 -1
- package/.codebuddy/skills/evolve-skill/SKILL.md +1 -1
- package/.codebuddy/skills/write-document/SKILL.md +1 -1
- package/.codex/skills/commit-message/SKILL.md +1 -1
- package/.codex/skills/evolve-skill/SKILL.md +1 -1
- package/.codex/skills/write-document/SKILL.md +1 -1
- package/.copilot/skills/align-grid/SKILL.md +110 -0
- package/.copilot/skills/assess-impact/SKILL.md +91 -0
- package/.copilot/skills/audit-code/SKILL.md +184 -0
- package/.copilot/skills/audit-plan/SKILL.md +89 -0
- package/.copilot/skills/build-epic/SKILL.md +105 -0
- package/.copilot/skills/change-request/SKILL.md +121 -0
- package/.copilot/skills/commit-message/SKILL.md +140 -0
- package/.copilot/skills/compose-workflow/SKILL.md +82 -0
- package/.copilot/skills/context7-mcp/SKILL.md +55 -0
- package/.copilot/skills/craft-skill/SKILL.md +196 -0
- package/.copilot/skills/deepen-architecture/SKILL.md +260 -0
- package/.copilot/skills/define-language/SKILL.md +80 -0
- package/.copilot/skills/define-success/SKILL.md +12 -0
- package/.copilot/skills/delegate-task/SKILL.md +91 -0
- package/.copilot/skills/deploy/SKILL.md +198 -0
- package/.copilot/skills/design-interface/SKILL.md +97 -0
- package/.copilot/skills/develop-tdd/SKILL.md +416 -0
- package/.copilot/skills/diagnose-root/SKILL.md +24 -0
- package/.copilot/skills/diagnose-stall/SKILL.md +54 -0
- package/.copilot/skills/dispatch-agents/SKILL.md +118 -0
- package/.copilot/skills/edit-document/SKILL.md +23 -0
- package/.copilot/skills/elaborate-spec/SKILL.md +101 -0
- package/.copilot/skills/enforce-first/SKILL.md +45 -0
- package/.copilot/skills/evolve-skill/SKILL.md +55 -0
- package/.copilot/skills/execute-plan/SKILL.md +61 -0
- package/.copilot/skills/extract-design/SKILL.md +132 -0
- package/.copilot/skills/find-way/SKILL.md +191 -0
- package/.copilot/skills/fix-bug/SKILL.md +67 -0
- package/.copilot/skills/gate-trace/SKILL.md +92 -0
- package/.copilot/skills/generate-allure-report/SKILL.md +285 -0
- package/.copilot/skills/grill-me/SKILL.md +108 -0
- package/.copilot/skills/grill-with-docs/SKILL.md +53 -0
- package/.copilot/skills/guard-git/SKILL.md +231 -0
- package/.copilot/skills/harden-vps/SKILL.md +291 -0
- package/.copilot/skills/hook-commits/SKILL.md +94 -0
- package/.copilot/skills/inspect-quality/SKILL.md +106 -0
- package/.copilot/skills/investigate-bug/SKILL.md +127 -0
- package/.copilot/skills/kickoff-branch/SKILL.md +143 -0
- package/.copilot/skills/maintain-wiki/SKILL.md +64 -0
- package/.copilot/skills/map-codebase/SKILL.md +71 -0
- package/.copilot/skills/migrate-spec/SKILL.md +862 -0
- package/.copilot/skills/model-domain/SKILL.md +232 -0
- package/.copilot/skills/orchestrate-project/SKILL.md +174 -0
- package/.copilot/skills/organize-workspace/SKILL.md +164 -0
- package/.copilot/skills/plan-refactor/SKILL.md +87 -0
- package/.copilot/skills/plan-release/SKILL.md +145 -0
- package/.copilot/skills/plan-tests/SKILL.md +75 -0
- package/.copilot/skills/plan-work/SKILL.md +260 -0
- package/.copilot/skills/publish-package/SKILL.md +328 -0
- package/.copilot/skills/quick-fix/SKILL.md +114 -0
- package/.copilot/skills/release-branch/SKILL.md +298 -0
- package/.copilot/skills/request-review/SKILL.md +113 -0
- package/.copilot/skills/research-first/SKILL.md +87 -0
- package/.copilot/skills/reset-baseline/SKILL.md +21 -0
- package/.copilot/skills/respond-review/SKILL.md +71 -0
- package/.copilot/skills/run-benchmark/SKILL.md +85 -0
- package/.copilot/skills/run-evals/SKILL.md +80 -0
- package/.copilot/skills/run-planning/SKILL.md +101 -0
- package/.copilot/skills/scope-work/SKILL.md +63 -0
- package/.copilot/skills/search-skills/SKILL.md +73 -0
- package/.copilot/skills/security-review/SKILL.md +384 -0
- package/.copilot/skills/seed-conventions/SKILL.md +302 -0
- package/.copilot/skills/session-state/SKILL.md +146 -0
- package/.copilot/skills/setup-environment/SKILL.md +39 -0
- package/.copilot/skills/simulate-agents/SKILL.md +26 -0
- package/.copilot/skills/slice-tasks/SKILL.md +68 -0
- package/.copilot/skills/smoke-test/SKILL.md +257 -0
- package/.copilot/skills/spike-prototype/SKILL.md +95 -0
- package/.copilot/skills/stocktake-skills/SKILL.md +74 -0
- package/.copilot/skills/survey-context/SKILL.md +135 -0
- package/.copilot/skills/terse-mode/SKILL.md +42 -0
- package/.copilot/skills/trace-requirement/SKILL.md +69 -0
- package/.copilot/skills/using-bigpowers/SKILL.md +111 -0
- package/.copilot/skills/validate-contracts/SKILL.md +277 -0
- package/.copilot/skills/validate-fix/SKILL.md +147 -0
- package/.copilot/skills/verify-work/SKILL.md +191 -0
- package/.copilot/skills/visual-dashboard/SKILL.md +50 -0
- package/.copilot/skills/wire-ci/SKILL.md +374 -0
- package/.copilot/skills/wire-observability/SKILL.md +97 -0
- package/.copilot/skills/write-document/SKILL.md +255 -0
- package/.hermes/skills/commit-message/SKILL.md +1 -1
- package/.hermes/skills/evolve-skill/SKILL.md +1 -1
- package/.hermes/skills/write-document/SKILL.md +1 -1
- package/.kilocode/rules/commit-message.md +1 -1
- package/.kilocode/rules/evolve-skill.md +1 -1
- package/.kilocode/rules/write-document.md +1 -1
- package/.mimocode/skills/commit-message/SKILL.md +1 -1
- package/.mimocode/skills/evolve-skill/SKILL.md +1 -1
- package/.mimocode/skills/write-document/SKILL.md +1 -1
- package/.opencode/skills/align-grid/SKILL.md +110 -0
- package/.opencode/skills/assess-impact/SKILL.md +91 -0
- package/.opencode/skills/audit-code/SKILL.md +184 -0
- package/.opencode/skills/audit-plan/SKILL.md +89 -0
- package/.opencode/skills/build-epic/SKILL.md +105 -0
- package/.opencode/skills/change-request/SKILL.md +121 -0
- package/.opencode/skills/commit-message/SKILL.md +140 -0
- package/.opencode/skills/compose-workflow/SKILL.md +82 -0
- package/.opencode/skills/context7-mcp/SKILL.md +55 -0
- package/.opencode/skills/craft-skill/SKILL.md +196 -0
- package/.opencode/skills/deepen-architecture/SKILL.md +260 -0
- package/.opencode/skills/define-language/SKILL.md +80 -0
- package/.opencode/skills/define-success/SKILL.md +12 -0
- package/.opencode/skills/delegate-task/SKILL.md +91 -0
- package/.opencode/skills/deploy/SKILL.md +198 -0
- package/.opencode/skills/design-interface/SKILL.md +97 -0
- package/.opencode/skills/develop-tdd/SKILL.md +416 -0
- package/.opencode/skills/diagnose-root/SKILL.md +24 -0
- package/.opencode/skills/diagnose-stall/SKILL.md +54 -0
- package/.opencode/skills/dispatch-agents/SKILL.md +118 -0
- package/.opencode/skills/edit-document/SKILL.md +23 -0
- package/.opencode/skills/elaborate-spec/SKILL.md +101 -0
- package/.opencode/skills/enforce-first/SKILL.md +45 -0
- package/.opencode/skills/evolve-skill/SKILL.md +55 -0
- package/.opencode/skills/execute-plan/SKILL.md +61 -0
- package/.opencode/skills/extract-design/SKILL.md +132 -0
- package/.opencode/skills/find-way/SKILL.md +191 -0
- package/.opencode/skills/fix-bug/SKILL.md +67 -0
- package/.opencode/skills/gate-trace/SKILL.md +92 -0
- package/.opencode/skills/generate-allure-report/SKILL.md +285 -0
- package/.opencode/skills/grill-me/SKILL.md +108 -0
- package/.opencode/skills/grill-with-docs/SKILL.md +53 -0
- package/.opencode/skills/guard-git/SKILL.md +231 -0
- package/.opencode/skills/harden-vps/SKILL.md +291 -0
- package/.opencode/skills/hook-commits/SKILL.md +94 -0
- package/.opencode/skills/inspect-quality/SKILL.md +106 -0
- package/.opencode/skills/investigate-bug/SKILL.md +127 -0
- package/.opencode/skills/kickoff-branch/SKILL.md +143 -0
- package/.opencode/skills/maintain-wiki/SKILL.md +64 -0
- package/.opencode/skills/map-codebase/SKILL.md +71 -0
- package/.opencode/skills/migrate-spec/SKILL.md +862 -0
- package/.opencode/skills/model-domain/SKILL.md +232 -0
- package/.opencode/skills/orchestrate-project/SKILL.md +174 -0
- package/.opencode/skills/organize-workspace/SKILL.md +164 -0
- package/.opencode/skills/plan-refactor/SKILL.md +87 -0
- package/.opencode/skills/plan-release/SKILL.md +145 -0
- package/.opencode/skills/plan-tests/SKILL.md +75 -0
- package/.opencode/skills/plan-work/SKILL.md +260 -0
- package/.opencode/skills/publish-package/SKILL.md +328 -0
- package/.opencode/skills/quick-fix/SKILL.md +114 -0
- package/.opencode/skills/release-branch/SKILL.md +298 -0
- package/.opencode/skills/request-review/SKILL.md +113 -0
- package/.opencode/skills/research-first/SKILL.md +87 -0
- package/.opencode/skills/reset-baseline/SKILL.md +21 -0
- package/.opencode/skills/respond-review/SKILL.md +71 -0
- package/.opencode/skills/run-benchmark/SKILL.md +85 -0
- package/.opencode/skills/run-evals/SKILL.md +80 -0
- package/.opencode/skills/run-planning/SKILL.md +101 -0
- package/.opencode/skills/scope-work/SKILL.md +63 -0
- package/.opencode/skills/search-skills/SKILL.md +73 -0
- package/.opencode/skills/security-review/SKILL.md +384 -0
- package/.opencode/skills/seed-conventions/SKILL.md +302 -0
- package/.opencode/skills/session-state/SKILL.md +146 -0
- package/.opencode/skills/setup-environment/SKILL.md +39 -0
- package/.opencode/skills/simulate-agents/SKILL.md +26 -0
- package/.opencode/skills/slice-tasks/SKILL.md +68 -0
- package/.opencode/skills/smoke-test/SKILL.md +257 -0
- package/.opencode/skills/spike-prototype/SKILL.md +95 -0
- package/.opencode/skills/stocktake-skills/SKILL.md +74 -0
- package/.opencode/skills/survey-context/SKILL.md +135 -0
- package/.opencode/skills/terse-mode/SKILL.md +42 -0
- package/.opencode/skills/trace-requirement/SKILL.md +69 -0
- package/.opencode/skills/using-bigpowers/SKILL.md +111 -0
- package/.opencode/skills/validate-contracts/SKILL.md +277 -0
- package/.opencode/skills/validate-fix/SKILL.md +147 -0
- package/.opencode/skills/verify-work/SKILL.md +191 -0
- package/.opencode/skills/visual-dashboard/SKILL.md +50 -0
- package/.opencode/skills/wire-ci/SKILL.md +374 -0
- package/.opencode/skills/wire-observability/SKILL.md +97 -0
- package/.opencode/skills/write-document/SKILL.md +255 -0
- package/.pi/package.json +1 -1
- package/.pi/prompts/commit-message.md +1 -1
- package/.pi/prompts/evolve-skill.md +1 -1
- package/.pi/prompts/write-document.md +1 -1
- package/.pi/skills/commit-message/SKILL.md +1 -1
- package/.pi/skills/evolve-skill/SKILL.md +1 -1
- package/.pi/skills/write-document/SKILL.md +1 -1
- package/.qwen/skills/align-grid/SKILL.md +110 -0
- package/.qwen/skills/assess-impact/SKILL.md +91 -0
- package/.qwen/skills/audit-code/SKILL.md +184 -0
- package/.qwen/skills/audit-plan/SKILL.md +89 -0
- package/.qwen/skills/build-epic/SKILL.md +105 -0
- package/.qwen/skills/change-request/SKILL.md +121 -0
- package/.qwen/skills/commit-message/SKILL.md +140 -0
- package/.qwen/skills/compose-workflow/SKILL.md +82 -0
- package/.qwen/skills/context7-mcp/SKILL.md +55 -0
- package/.qwen/skills/craft-skill/SKILL.md +196 -0
- package/.qwen/skills/deepen-architecture/SKILL.md +260 -0
- package/.qwen/skills/define-language/SKILL.md +80 -0
- package/.qwen/skills/define-success/SKILL.md +12 -0
- package/.qwen/skills/delegate-task/SKILL.md +91 -0
- package/.qwen/skills/deploy/SKILL.md +198 -0
- package/.qwen/skills/design-interface/SKILL.md +97 -0
- package/.qwen/skills/develop-tdd/SKILL.md +416 -0
- package/.qwen/skills/diagnose-root/SKILL.md +24 -0
- package/.qwen/skills/diagnose-stall/SKILL.md +54 -0
- package/.qwen/skills/dispatch-agents/SKILL.md +118 -0
- package/.qwen/skills/edit-document/SKILL.md +23 -0
- package/.qwen/skills/elaborate-spec/SKILL.md +101 -0
- package/.qwen/skills/enforce-first/SKILL.md +45 -0
- package/.qwen/skills/evolve-skill/SKILL.md +55 -0
- package/.qwen/skills/execute-plan/SKILL.md +61 -0
- package/.qwen/skills/extract-design/SKILL.md +132 -0
- package/.qwen/skills/find-way/SKILL.md +191 -0
- package/.qwen/skills/fix-bug/SKILL.md +67 -0
- package/.qwen/skills/gate-trace/SKILL.md +92 -0
- package/.qwen/skills/generate-allure-report/SKILL.md +285 -0
- package/.qwen/skills/grill-me/SKILL.md +108 -0
- package/.qwen/skills/grill-with-docs/SKILL.md +53 -0
- package/.qwen/skills/guard-git/SKILL.md +231 -0
- package/.qwen/skills/harden-vps/SKILL.md +291 -0
- package/.qwen/skills/hook-commits/SKILL.md +94 -0
- package/.qwen/skills/inspect-quality/SKILL.md +106 -0
- package/.qwen/skills/investigate-bug/SKILL.md +127 -0
- package/.qwen/skills/kickoff-branch/SKILL.md +143 -0
- package/.qwen/skills/maintain-wiki/SKILL.md +64 -0
- package/.qwen/skills/map-codebase/SKILL.md +71 -0
- package/.qwen/skills/migrate-spec/SKILL.md +862 -0
- package/.qwen/skills/model-domain/SKILL.md +232 -0
- package/.qwen/skills/orchestrate-project/SKILL.md +174 -0
- package/.qwen/skills/organize-workspace/SKILL.md +164 -0
- package/.qwen/skills/plan-refactor/SKILL.md +87 -0
- package/.qwen/skills/plan-release/SKILL.md +145 -0
- package/.qwen/skills/plan-tests/SKILL.md +75 -0
- package/.qwen/skills/plan-work/SKILL.md +260 -0
- package/.qwen/skills/publish-package/SKILL.md +328 -0
- package/.qwen/skills/quick-fix/SKILL.md +114 -0
- package/.qwen/skills/release-branch/SKILL.md +298 -0
- package/.qwen/skills/request-review/SKILL.md +113 -0
- package/.qwen/skills/research-first/SKILL.md +87 -0
- package/.qwen/skills/reset-baseline/SKILL.md +21 -0
- package/.qwen/skills/respond-review/SKILL.md +71 -0
- package/.qwen/skills/run-benchmark/SKILL.md +85 -0
- package/.qwen/skills/run-evals/SKILL.md +80 -0
- package/.qwen/skills/run-planning/SKILL.md +101 -0
- package/.qwen/skills/scope-work/SKILL.md +63 -0
- package/.qwen/skills/search-skills/SKILL.md +73 -0
- package/.qwen/skills/security-review/SKILL.md +384 -0
- package/.qwen/skills/seed-conventions/SKILL.md +302 -0
- package/.qwen/skills/session-state/SKILL.md +146 -0
- package/.qwen/skills/setup-environment/SKILL.md +39 -0
- package/.qwen/skills/simulate-agents/SKILL.md +26 -0
- package/.qwen/skills/slice-tasks/SKILL.md +68 -0
- package/.qwen/skills/smoke-test/SKILL.md +257 -0
- package/.qwen/skills/spike-prototype/SKILL.md +95 -0
- package/.qwen/skills/stocktake-skills/SKILL.md +74 -0
- package/.qwen/skills/survey-context/SKILL.md +135 -0
- package/.qwen/skills/terse-mode/SKILL.md +42 -0
- package/.qwen/skills/trace-requirement/SKILL.md +69 -0
- package/.qwen/skills/using-bigpowers/SKILL.md +111 -0
- package/.qwen/skills/validate-contracts/SKILL.md +277 -0
- package/.qwen/skills/validate-fix/SKILL.md +147 -0
- package/.qwen/skills/verify-work/SKILL.md +191 -0
- package/.qwen/skills/visual-dashboard/SKILL.md +50 -0
- package/.qwen/skills/wire-ci/SKILL.md +374 -0
- package/.qwen/skills/wire-observability/SKILL.md +97 -0
- package/.qwen/skills/write-document/SKILL.md +255 -0
- package/.trae/skills/commit-message/SKILL.md +1 -1
- package/.trae/skills/evolve-skill/SKILL.md +1 -1
- package/.trae/skills/write-document/SKILL.md +1 -1
- package/.windsurf/rules/commit-message.md +1 -1
- package/.windsurf/rules/evolve-skill.md +1 -1
- package/.windsurf/rules/write-document.md +1 -1
- package/.zcode/skills/commit-message/SKILL.md +1 -1
- package/.zcode/skills/evolve-skill/SKILL.md +1 -1
- package/.zcode/skills/write-document/SKILL.md +1 -1
- package/CHANGELOG.md +7 -0
- package/package.json +1 -1
- package/scripts/adapters/agy.sh +3 -0
- package/scripts/adapters/continue.sh +3 -0
- package/scripts/adapters/cursor.sh +3 -0
- package/scripts/adapters/gemini.sh +5 -24
- package/scripts/adapters/mimo.sh +3 -0
- package/scripts/adapters/omp.sh +3 -0
- package/scripts/adapters/pi.sh +6 -3
- package/scripts/adapters/zcode.sh +3 -0
- package/scripts/adapters/zed.sh +3 -0
- package/scripts/generate-workflow-diagrams.sh +102 -0
- package/scripts/golden-g13-test-orphans.sh +70 -0
- package/scripts/golden-g14-adapter-dispatch.sh +113 -0
- package/scripts/lib/__pycache__/link_utils.cpython-312.pyc +0 -0
- package/scripts/lib/__pycache__/srp_engine_links.cpython-312.pyc +0 -0
- package/scripts/lib/adapter-guard.sh +30 -0
- package/scripts/lib/golden-suite-gates.sh +24 -0
- package/scripts/lib/install-targets-b.sh +0 -8
- package/scripts/lib/sync-render.sh +0 -43
- package/scripts/targets.yaml +35 -13
- package/scripts/test-adapter-render.sh +116 -0
- package/scripts/test-adapters.sh +10 -3
- package/scripts/test-install-hub.sh +139 -0
- package/skills/commit-message/REFERENCE.md +1 -1
- package/skills/evolve-skill/REFERENCE.md +1 -1
- package/skills/write-document/REFERENCE.md +1 -1
- package/scripts/test-agy-hub.sh +0 -60
- package/scripts/test-cline-adapter.sh +0 -55
- package/scripts/test-cline-hub.sh +0 -48
- package/scripts/test-codebuddy-adapter.sh +0 -63
- package/scripts/test-codebuddy-hub.sh +0 -49
- package/scripts/test-codex-adapter.sh +0 -63
- package/scripts/test-codex-hub.sh +0 -49
- package/scripts/test-copilot-adapter.sh +0 -47
- package/scripts/test-copilot-hub.sh +0 -43
- package/scripts/test-gemini-adapter.sh +0 -70
- package/scripts/test-gemini-hub.sh +0 -56
- package/scripts/test-hermes-adapter.sh +0 -85
- package/scripts/test-hermes-hub.sh +0 -52
- package/scripts/test-kilocode-adapter.sh +0 -55
- package/scripts/test-kilocode-hub.sh +0 -48
- package/scripts/test-mimo-hub.sh +0 -52
- package/scripts/test-opencode-adapter.sh +0 -47
- package/scripts/test-opencode-hub.sh +0 -43
- package/scripts/test-qwen-adapter.sh +0 -63
- package/scripts/test-qwen-hub.sh +0 -49
- package/scripts/test-trae-adapter.sh +0 -63
- package/scripts/test-trae-hub.sh +0 -49
- package/scripts/test-windsurf-adapter.sh +0 -63
- package/scripts/test-windsurf-hub.sh +0 -49
- package/scripts/test-zcode-hub.sh +0 -52
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# story: e37s05
|
|
3
|
+
# generate-workflow-diagrams.sh — render docs/WORKFLOWS.md from specs/workflows/*.yaml.
|
|
4
|
+
#
|
|
5
|
+
# specs/assets/bigpowers-workflow.svg was a find-and-replace of a BMad Method
|
|
6
|
+
# chart with bigpowers skill names dropped into BMad's slots. Nothing regenerated
|
|
7
|
+
# it, so it drifted: it routed PLAN through define-success (archived), placed
|
|
8
|
+
# seed-conventions in PHASE 4 when it is the greenfield entry point, omitted the
|
|
9
|
+
# whole planning spine, build-epic and the entire verify/release arc, and used
|
|
10
|
+
# "Sprints" — a word absent from every bigpowers doctrine file.
|
|
11
|
+
#
|
|
12
|
+
# A diagram nothing regenerates is a diagram that lies. This derives the chains
|
|
13
|
+
# from the same YAML the /slash commands read, so the source cannot drift from
|
|
14
|
+
# the picture without the picture changing.
|
|
15
|
+
#
|
|
16
|
+
# Usage: bash scripts/generate-workflow-diagrams.sh [--check]
|
|
17
|
+
# --check fail if the committed output is stale (for CI)
|
|
18
|
+
|
|
19
|
+
set -euo pipefail
|
|
20
|
+
source "$(dirname "${BASH_SOURCE[0]}")/lib/python-env.sh"
|
|
21
|
+
source "$(dirname "${BASH_SOURCE[0]}")/lib/skill-common.sh"
|
|
22
|
+
resolve_repo_root
|
|
23
|
+
cd "$REPO_ROOT"
|
|
24
|
+
|
|
25
|
+
OUT="docs/WORKFLOWS.md"
|
|
26
|
+
CHECK=0
|
|
27
|
+
[[ "${1:-}" == "--check" ]] && CHECK=1
|
|
28
|
+
|
|
29
|
+
TMP=$(mktemp)
|
|
30
|
+
trap 'rm -f "$TMP"' EXIT
|
|
31
|
+
|
|
32
|
+
$PYTHON - "$TMP" <<'PY'
|
|
33
|
+
import sys, glob, os
|
|
34
|
+
import yaml
|
|
35
|
+
|
|
36
|
+
out = open(sys.argv[1], "w", encoding="utf-8")
|
|
37
|
+
w = out.write
|
|
38
|
+
|
|
39
|
+
w("# bigpowers Workflows\n\n")
|
|
40
|
+
w("<!-- story: e37s05 -->\n\n")
|
|
41
|
+
w("> **Generated** by `scripts/generate-workflow-diagrams.sh` from\n")
|
|
42
|
+
w("> `specs/workflows/*.yaml`. Do not hand-edit — change the YAML and re-run.\n")
|
|
43
|
+
w("> CI enforces freshness via `--check`.\n\n")
|
|
44
|
+
w("Each recipe below is a composed chain of skills, invocable as a slash command.\n\n")
|
|
45
|
+
|
|
46
|
+
recipes = []
|
|
47
|
+
for path in sorted(glob.glob("specs/workflows/*.yaml")):
|
|
48
|
+
d = yaml.safe_load(open(path, encoding="utf-8")) or {}
|
|
49
|
+
if d.get("name") and d.get("skills"):
|
|
50
|
+
recipes.append(d)
|
|
51
|
+
|
|
52
|
+
w("## Recipes\n\n")
|
|
53
|
+
w("| Command | Chain | Purpose |\n|---|---|---|\n")
|
|
54
|
+
for r in recipes:
|
|
55
|
+
chain = " → ".join("`%s`" % s for s in r["skills"])
|
|
56
|
+
desc = (r.get("description") or "").replace("|", "\\|").strip()
|
|
57
|
+
w("| `%s` | %s | %s |\n" % (r.get("command", "/" + r["name"]), chain, desc))
|
|
58
|
+
w("\n")
|
|
59
|
+
|
|
60
|
+
w("## Chains\n\n```mermaid\nflowchart LR\n")
|
|
61
|
+
for i, r in enumerate(recipes):
|
|
62
|
+
w(" subgraph %s[\"%s\"]\n" % ("w%d" % i, r.get("command", r["name"])))
|
|
63
|
+
prev = None
|
|
64
|
+
for j, s in enumerate(r["skills"]):
|
|
65
|
+
node = "n%d_%d" % (i, j)
|
|
66
|
+
w(" %s[\"%s\"]\n" % (node, s))
|
|
67
|
+
if prev:
|
|
68
|
+
w(" %s --> %s\n" % (prev, node))
|
|
69
|
+
prev = node
|
|
70
|
+
w(" end\n")
|
|
71
|
+
w("```\n\n")
|
|
72
|
+
|
|
73
|
+
# Skill reuse across recipes is the interesting structural fact: it shows which
|
|
74
|
+
# skills are load-bearing across the catalog.
|
|
75
|
+
counts = {}
|
|
76
|
+
for r in recipes:
|
|
77
|
+
for s in r["skills"]:
|
|
78
|
+
counts[s] = counts.get(s, 0) + 1
|
|
79
|
+
shared = sorted([(v, k) for k, v in counts.items() if v > 1], reverse=True)
|
|
80
|
+
if shared:
|
|
81
|
+
w("## Skills shared across recipes\n\n")
|
|
82
|
+
w("| Skill | Recipes |\n|---|---|\n")
|
|
83
|
+
for v, k in shared:
|
|
84
|
+
w("| `%s` | %d |\n" % (k, v))
|
|
85
|
+
w("\n")
|
|
86
|
+
|
|
87
|
+
w("_%d recipes, %d distinct skills._\n" % (len(recipes), len(counts)))
|
|
88
|
+
out.close()
|
|
89
|
+
PY
|
|
90
|
+
|
|
91
|
+
if [[ "$CHECK" -eq 1 ]]; then
|
|
92
|
+
if [[ ! -f "$OUT" ]] || ! diff -q "$TMP" "$OUT" >/dev/null 2>&1; then
|
|
93
|
+
echo "generate-workflow-diagrams: $OUT is stale — run bash scripts/generate-workflow-diagrams.sh" >&2
|
|
94
|
+
exit 1
|
|
95
|
+
fi
|
|
96
|
+
echo "generate-workflow-diagrams: $OUT is current"
|
|
97
|
+
exit 0
|
|
98
|
+
fi
|
|
99
|
+
|
|
100
|
+
mkdir -p "$(dirname "$OUT")"
|
|
101
|
+
cp "$TMP" "$OUT"
|
|
102
|
+
echo "generate-workflow-diagrams: wrote $OUT"
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# story: e37s05
|
|
3
|
+
# golden-g13-test-orphans.sh — every scripts/test-*.sh must be wired into a gate.
|
|
4
|
+
#
|
|
5
|
+
# Before this gate, 33 of 35 test scripts were reachable from nothing: not CI,
|
|
6
|
+
# not Preflight, not package.json, not another script. Writing a test was not
|
|
7
|
+
# enough to make it run, so tests accumulated as dead weight and regressions
|
|
8
|
+
# they would have caught shipped anyway (test-adapters.sh silently exercised 1
|
|
9
|
+
# of 21 adapters for months).
|
|
10
|
+
#
|
|
11
|
+
# Usage: bash scripts/golden-g13-test-orphans.sh [--self-test]
|
|
12
|
+
# Exit 0: every test script is referenced by the gate list
|
|
13
|
+
# Exit 1: at least one orphan (or, under --self-test, the gate failed to notice
|
|
14
|
+
# a deliberately unlisted script)
|
|
15
|
+
|
|
16
|
+
set -euo pipefail
|
|
17
|
+
source "$(dirname "${BASH_SOURCE[0]}")/lib/skill-common.sh"
|
|
18
|
+
resolve_repo_root
|
|
19
|
+
cd "$REPO_ROOT"
|
|
20
|
+
|
|
21
|
+
RED='\033[0;31m'
|
|
22
|
+
GREEN='\033[0;32m'
|
|
23
|
+
NC='\033[0m'
|
|
24
|
+
|
|
25
|
+
GATES_FILE="scripts/lib/golden-suite-gates.sh"
|
|
26
|
+
|
|
27
|
+
find_orphans() { # $1 = extra script basename to consider (may be empty)
|
|
28
|
+
local extra="${1:-}"
|
|
29
|
+
local orphans=""
|
|
30
|
+
local f b
|
|
31
|
+
for f in scripts/test-*.sh; do
|
|
32
|
+
[[ -e "$f" ]] || continue
|
|
33
|
+
b="$(basename "$f")"
|
|
34
|
+
grep -q "$b" "$GATES_FILE" || orphans+=" $b"$'\n'
|
|
35
|
+
done
|
|
36
|
+
if [[ -n "$extra" ]]; then
|
|
37
|
+
grep -q "$extra" "$GATES_FILE" || orphans+=" $extra"$'\n'
|
|
38
|
+
fi
|
|
39
|
+
printf '%s' "$orphans"
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if [[ "${1:-}" == "--self-test" ]]; then
|
|
43
|
+
echo "=== G-13 self-test: prove the gate can fail ==="
|
|
44
|
+
# A name that is definitely not in the gate list must be reported.
|
|
45
|
+
if [[ -n "$(find_orphans "test-definitely-not-wired.sh")" ]]; then
|
|
46
|
+
echo -e "${GREEN}PASS${NC} G-13 reports an unlisted test script"
|
|
47
|
+
echo "G-13 self-test: PASS"
|
|
48
|
+
exit 0
|
|
49
|
+
fi
|
|
50
|
+
echo -e "${RED}FAIL${NC} G-13 did not report an unlisted script — vacuous gate"
|
|
51
|
+
echo "G-13 self-test: FAIL"
|
|
52
|
+
exit 1
|
|
53
|
+
fi
|
|
54
|
+
|
|
55
|
+
echo "=== G-13: test-script orphan check ==="
|
|
56
|
+
ORPHANS="$(find_orphans "")"
|
|
57
|
+
TOTAL=$(ls scripts/test-*.sh 2>/dev/null | wc -l | tr -d ' ')
|
|
58
|
+
|
|
59
|
+
if [[ -z "$ORPHANS" ]]; then
|
|
60
|
+
echo " ok : all $TOTAL test script(s) are wired into $GATES_FILE"
|
|
61
|
+
echo -e "${GREEN}PASS${NC}"
|
|
62
|
+
echo "G-13: PASS"
|
|
63
|
+
exit 0
|
|
64
|
+
fi
|
|
65
|
+
|
|
66
|
+
echo " orphaned test scripts (present but reachable from no gate):"
|
|
67
|
+
printf '%s' "$ORPHANS"
|
|
68
|
+
echo -e "${RED}FAIL${NC} add them to GOLDEN_GATES in $GATES_FILE, or delete them"
|
|
69
|
+
echo "G-13: FAIL"
|
|
70
|
+
exit 1
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# story: e37s05
|
|
3
|
+
# golden-g14-adapter-dispatch.sh — an adapter that can render must be dispatched.
|
|
4
|
+
#
|
|
5
|
+
# scripts/lib/srp-engine.py builds its dispatch list from targets.yaml entries
|
|
6
|
+
# carrying a skill.adapter. An adapter that defines render_skill() but is
|
|
7
|
+
# declared `skill: null` therefore never runs during sync, while its install
|
|
8
|
+
# function still reads a rendered directory that is never produced — the target
|
|
9
|
+
# reports success and installs nothing
|
|
10
|
+
# (BUG-2026-07-26-null-skill-adapters-install-nothing).
|
|
11
|
+
#
|
|
12
|
+
# Context-only bridges (aider, goose, ...) are exempt by construction: they
|
|
13
|
+
# define no render_skill, so there is nothing to dispatch.
|
|
14
|
+
#
|
|
15
|
+
# Usage: bash scripts/golden-g14-adapter-dispatch.sh [--self-test]
|
|
16
|
+
# Exit 0: every rendering adapter is dispatched
|
|
17
|
+
# Exit 1: at least one rendering adapter is undispatched (or, under
|
|
18
|
+
# --self-test, the gate failed to notice an injected one)
|
|
19
|
+
|
|
20
|
+
set -euo pipefail
|
|
21
|
+
source "$(dirname "${BASH_SOURCE[0]}")/lib/python-env.sh"
|
|
22
|
+
source "$(dirname "${BASH_SOURCE[0]}")/lib/skill-common.sh"
|
|
23
|
+
resolve_repo_root
|
|
24
|
+
cd "$REPO_ROOT"
|
|
25
|
+
|
|
26
|
+
RED='\033[0;31m'
|
|
27
|
+
GREEN='\033[0;32m'
|
|
28
|
+
NC='\033[0m'
|
|
29
|
+
|
|
30
|
+
check() { # $1 = targets.yaml path
|
|
31
|
+
$PYTHON - "$1" <<'PY'
|
|
32
|
+
import sys, os, re
|
|
33
|
+
import yaml
|
|
34
|
+
|
|
35
|
+
targets_path = sys.argv[1]
|
|
36
|
+
data = yaml.safe_load(open(targets_path, encoding="utf-8")) or {}
|
|
37
|
+
|
|
38
|
+
dispatched = set()
|
|
39
|
+
for t in data.get("targets") or []:
|
|
40
|
+
skill = t.get("skill")
|
|
41
|
+
if isinstance(skill, dict) and skill.get("adapter"):
|
|
42
|
+
dispatched.add(skill["adapter"])
|
|
43
|
+
|
|
44
|
+
problems = []
|
|
45
|
+
adapter_dir = os.path.join("scripts", "adapters")
|
|
46
|
+
for fn in sorted(os.listdir(adapter_dir)):
|
|
47
|
+
if not fn.endswith(".sh"):
|
|
48
|
+
continue
|
|
49
|
+
aid = fn[:-3]
|
|
50
|
+
src = open(os.path.join(adapter_dir, fn), encoding="utf-8").read()
|
|
51
|
+
if not re.search(r"^render_skill\(\)", src, re.M):
|
|
52
|
+
continue # context-only bridge — nothing to dispatch
|
|
53
|
+
if aid not in dispatched:
|
|
54
|
+
problems.append(
|
|
55
|
+
f"{aid}: defines render_skill() but targets.yaml does not dispatch it "
|
|
56
|
+
f"(skill.adapter missing or null) — sync renders nothing for it"
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
if problems:
|
|
60
|
+
for p in problems:
|
|
61
|
+
print(f" UNDISPATCHED {p}")
|
|
62
|
+
print(f"\n{len(problems)} rendering adapter(s) never run during sync")
|
|
63
|
+
sys.exit(1)
|
|
64
|
+
|
|
65
|
+
print(f" ok : all rendering adapters are dispatched ({len(dispatched)} in registry)")
|
|
66
|
+
sys.exit(0)
|
|
67
|
+
PY
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if [[ "${1:-}" == "--self-test" ]]; then
|
|
71
|
+
echo "=== G-14 self-test: prove the gate can fail ==="
|
|
72
|
+
TMP=$(mktemp -d)
|
|
73
|
+
trap 'rm -rf "$TMP"' EXIT
|
|
74
|
+
$PYTHON - "$TMP/targets.yaml" <<'PY'
|
|
75
|
+
import sys, yaml
|
|
76
|
+
d = yaml.safe_load(open("scripts/targets.yaml", encoding="utf-8"))
|
|
77
|
+
# Null out the first dispatched adapter — the gate must notice.
|
|
78
|
+
for t in d.get("targets") or []:
|
|
79
|
+
s = t.get("skill")
|
|
80
|
+
if isinstance(s, dict) and s.get("adapter"):
|
|
81
|
+
print(f"injected: {t['id']} skill -> null")
|
|
82
|
+
t["skill"] = None
|
|
83
|
+
break
|
|
84
|
+
yaml.dump(d, open(sys.argv[1], "w", encoding="utf-8"), default_flow_style=False, sort_keys=False)
|
|
85
|
+
PY
|
|
86
|
+
set +e
|
|
87
|
+
check "$TMP/targets.yaml" >/dev/null 2>&1
|
|
88
|
+
rc=$?
|
|
89
|
+
set -e
|
|
90
|
+
if [[ $rc -ne 0 ]]; then
|
|
91
|
+
echo -e "${GREEN}PASS${NC} G-14 detected an injected undispatched adapter"
|
|
92
|
+
echo "G-14 self-test: PASS"
|
|
93
|
+
exit 0
|
|
94
|
+
fi
|
|
95
|
+
echo -e "${RED}FAIL${NC} G-14 passed on an injected null adapter — vacuous gate"
|
|
96
|
+
echo "G-14 self-test: FAIL"
|
|
97
|
+
exit 1
|
|
98
|
+
fi
|
|
99
|
+
|
|
100
|
+
echo "=== G-14: adapter dispatch coverage ==="
|
|
101
|
+
set +e
|
|
102
|
+
out=$(check "scripts/targets.yaml" 2>&1)
|
|
103
|
+
rc=$?
|
|
104
|
+
set -e
|
|
105
|
+
echo "$out"
|
|
106
|
+
if [[ $rc -eq 0 ]]; then
|
|
107
|
+
echo -e "${GREEN}PASS${NC}"
|
|
108
|
+
echo "G-14: PASS"
|
|
109
|
+
exit 0
|
|
110
|
+
fi
|
|
111
|
+
echo -e "${RED}FAIL${NC} see BUG-2026-07-26-null-skill-adapters-install-nothing"
|
|
112
|
+
echo "G-14: FAIL"
|
|
113
|
+
exit 1
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# story: e37s05
|
|
3
|
+
# adapter-guard.sh — shared skill-name validation for every render adapter.
|
|
4
|
+
#
|
|
5
|
+
# Adapters interpolate the SkillIR `name` straight into a filesystem path
|
|
6
|
+
# (mkdir -p "$dir/$IR_NAME"). A name containing "/" or ".." therefore writes
|
|
7
|
+
# outside the destination directory.
|
|
8
|
+
#
|
|
9
|
+
# Ten adapters carried a private copy of this check (qwen_is_unsafe_skill_name
|
|
10
|
+
# and friends) and nine had none at all — and the nine unguarded ones were
|
|
11
|
+
# exactly the nine that never got a per-target test. One guard, sourced by every
|
|
12
|
+
# adapter, replaces both the duplication and the gap.
|
|
13
|
+
|
|
14
|
+
# Returns 0 (true) when the name must not be used as a path component.
|
|
15
|
+
bp_is_unsafe_skill_name() {
|
|
16
|
+
local name="${1-}"
|
|
17
|
+
[[ -z "$name" || "$name" == "null" || "$name" == *"/"* || "$name" == *".."* || "$name" == .* ]]
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
# Echoes the name when safe; otherwise reports on stderr and returns 1.
|
|
21
|
+
# Usage inside render_skill: name="$(bp_assert_safe_skill_name "$IR_NAME" adaptername)" || return 1
|
|
22
|
+
bp_assert_safe_skill_name() {
|
|
23
|
+
local name="${1-}"
|
|
24
|
+
local adapter="${2:-adapter}"
|
|
25
|
+
if bp_is_unsafe_skill_name "$name"; then
|
|
26
|
+
echo "${adapter}: refusing unsafe skill name: ${name:-<empty>}" >&2
|
|
27
|
+
return 1
|
|
28
|
+
fi
|
|
29
|
+
printf '%s' "$name"
|
|
30
|
+
}
|
|
@@ -22,7 +22,31 @@ GOLDEN_GATES=(
|
|
|
22
22
|
# Anti-vacuity for the target-contract seam: every contract declared in
|
|
23
23
|
# targets.yaml must have a real assertion, and an unknown contract must FAIL
|
|
24
24
|
# rather than SKIP+exit 0 (seven contracts were fail-open before this).
|
|
25
|
+
# Writing a test must be enough to make it run: G-13 fails if any
|
|
26
|
+
# scripts/test-*.sh is absent from this list.
|
|
27
|
+
"g13-test-orphans-selftest:bash scripts/golden-g13-test-orphans.sh --self-test:false"
|
|
28
|
+
"g13-test-orphans:bash scripts/golden-g13-test-orphans.sh:false"
|
|
29
|
+
# An adapter that defines render_skill() must be dispatched by targets.yaml,
|
|
30
|
+
# or sync renders nothing for it while its install still claims success.
|
|
31
|
+
# docs/WORKFLOWS.md is generated from specs/workflows/*.yaml; a diagram nothing
|
|
32
|
+
# regenerates is a diagram that lies (see specs/archive/assets/README.md).
|
|
33
|
+
"workflow-diagrams-fresh:bash scripts/generate-workflow-diagrams.sh --check:false"
|
|
34
|
+
"g14-adapter-dispatch-selftest:bash scripts/golden-g14-adapter-dispatch.sh --self-test:false"
|
|
35
|
+
"g14-adapter-dispatch:bash scripts/golden-g14-adapter-dispatch.sh:false"
|
|
25
36
|
"target-contracts:bash scripts/test-target-contracts.sh:false"
|
|
37
|
+
# Registry-driven replacements for the 25 hand-written per-target scripts.
|
|
38
|
+
"install-hub:bash scripts/test-install-hub.sh:false"
|
|
39
|
+
"adapter-render:bash scripts/test-adapter-render.sh:false"
|
|
40
|
+
"adapters:bash scripts/test-adapters.sh:false"
|
|
41
|
+
# Previously orphaned: present in scripts/ but reachable from no gate.
|
|
42
|
+
"tombstone-mechanism:bash scripts/test-tombstone-mechanism.sh:false"
|
|
43
|
+
"trace-strict:bash scripts/test-trace-strict.sh:false"
|
|
44
|
+
"trace-matrix-size:bash scripts/test-trace-matrix-size.sh:false"
|
|
45
|
+
"setup-no-pyyaml:bash scripts/test-setup-no-pyyaml.sh:false"
|
|
46
|
+
"install-distribute-only:bash scripts/test-install-distribute-only.sh:false"
|
|
47
|
+
"completeness-critic-scope:bash scripts/test-completeness-critic-scope.sh:false"
|
|
48
|
+
"epics-wiki-zero-stories:bash scripts/test-generate-epics-wiki-zero-stories.sh:false"
|
|
49
|
+
"golden-g11-worktree-venv:bash scripts/test-golden-g11-worktree-venv.sh:false"
|
|
26
50
|
"install-helpers:bash scripts/test-install-helpers.sh:false"
|
|
27
51
|
"import-boundaries:bash scripts/check-import-boundaries.sh:false"
|
|
28
52
|
"skill-catalog:bash scripts/validate-skill-catalog.sh:false"
|
|
@@ -107,10 +107,6 @@ install_agy() {
|
|
|
107
107
|
echo " NOTE: Antigravity uses ~/.gemini/antigravity-cli/skills/ — not .gemini/extensions/ (Gemini CLI)"
|
|
108
108
|
}
|
|
109
109
|
|
|
110
|
-
install_antigravity() {
|
|
111
|
-
install_agy
|
|
112
|
-
}
|
|
113
|
-
|
|
114
110
|
uninstall_agy() {
|
|
115
111
|
echo ""
|
|
116
112
|
echo "Antigravity CLI → removing management from $AGY_CONFIG_DIR/"
|
|
@@ -122,10 +118,6 @@ uninstall_agy() {
|
|
|
122
118
|
fi
|
|
123
119
|
}
|
|
124
120
|
|
|
125
|
-
uninstall_antigravity() {
|
|
126
|
-
uninstall_agy
|
|
127
|
-
}
|
|
128
|
-
|
|
129
121
|
# ── Codex CLI (e65s02) ───────────────────────────────────────────────────────
|
|
130
122
|
|
|
131
123
|
CODEX_CONFIG_DIR="$HOME/.codex"
|
|
@@ -54,49 +54,6 @@ render_gemini_command() {
|
|
|
54
54
|
} > "$GEMINI_COMMANDS/$IR_NAME.toml"
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
-
render_gemini_hooks_manifest() {
|
|
58
|
-
local hookdir="${GEMINI_HOOKS_DIR:-$GEMINI_EXT_DIR/hooks}"
|
|
59
|
-
mkdir -p "$hookdir"
|
|
60
|
-
cat > "$hookdir/hooks-manifest.json" <<'JSON'
|
|
61
|
-
{
|
|
62
|
-
"schema_version": 1,
|
|
63
|
-
"target": "gemini",
|
|
64
|
-
"config_path": "~/.gemini/settings.json",
|
|
65
|
-
"events_total": 11,
|
|
66
|
-
"events": [
|
|
67
|
-
"BeforeTool",
|
|
68
|
-
"AfterTool",
|
|
69
|
-
"BeforeAgent",
|
|
70
|
-
"AfterAgent",
|
|
71
|
-
"BeforeModel",
|
|
72
|
-
"BeforeToolSelection",
|
|
73
|
-
"AfterModel",
|
|
74
|
-
"SessionStart",
|
|
75
|
-
"SessionEnd",
|
|
76
|
-
"Notification",
|
|
77
|
-
"PreCompress"
|
|
78
|
-
],
|
|
79
|
-
"shipped_hooks": [
|
|
80
|
-
{
|
|
81
|
-
"event": "SessionStart",
|
|
82
|
-
"script": "session-start",
|
|
83
|
-
"matcher": "startup|clear|compact",
|
|
84
|
-
"wave": "a",
|
|
85
|
-
"status": "shipped"
|
|
86
|
-
},
|
|
87
|
-
{
|
|
88
|
-
"event": "BeforeTool",
|
|
89
|
-
"script": "before-tool-git-guard.sh",
|
|
90
|
-
"matcher": "run_shell_command",
|
|
91
|
-
"wave": "a",
|
|
92
|
-
"status": "template"
|
|
93
|
-
}
|
|
94
|
-
],
|
|
95
|
-
"polyglot_launcher": "run-hook.cmd"
|
|
96
|
-
}
|
|
97
|
-
JSON
|
|
98
|
-
}
|
|
99
|
-
|
|
100
57
|
render_pi_skill() {
|
|
101
58
|
mkdir -p "$PI_SKILLS/$IR_NAME"
|
|
102
59
|
{
|
package/scripts/targets.yaml
CHANGED
|
@@ -47,7 +47,9 @@ targets:
|
|
|
47
47
|
- id: cline
|
|
48
48
|
name: Cline
|
|
49
49
|
tier: default_on
|
|
50
|
-
skill:
|
|
50
|
+
skill:
|
|
51
|
+
adapter: cline
|
|
52
|
+
output: .cline/skills
|
|
51
53
|
context:
|
|
52
54
|
adapter: cline
|
|
53
55
|
mode: native
|
|
@@ -164,7 +166,9 @@ targets:
|
|
|
164
166
|
# story: e68s02
|
|
165
167
|
name: Qwen (Alibaba)
|
|
166
168
|
tier: opt_in
|
|
167
|
-
skill:
|
|
169
|
+
skill:
|
|
170
|
+
adapter: qwen
|
|
171
|
+
output: .qwen/skills
|
|
168
172
|
context:
|
|
169
173
|
adapter: qwen
|
|
170
174
|
mode: symlink
|
|
@@ -172,17 +176,6 @@ targets:
|
|
|
172
176
|
contracts:
|
|
173
177
|
- agents_md_exists
|
|
174
178
|
- qwen_hooks_manifest
|
|
175
|
-
name: Kilocode
|
|
176
|
-
tier: opt_in
|
|
177
|
-
skill:
|
|
178
|
-
adapter: kilocode
|
|
179
|
-
output: .kilocode/rules
|
|
180
|
-
context:
|
|
181
|
-
adapter: kilocode
|
|
182
|
-
mode: copy
|
|
183
|
-
file: AGENTS.md
|
|
184
|
-
contracts:
|
|
185
|
-
- agents_md_exists
|
|
186
179
|
|
|
187
180
|
# Wave D (e37s12)
|
|
188
181
|
- id: continue
|
|
@@ -303,3 +296,32 @@ targets:
|
|
|
303
296
|
file: AGENTS.md
|
|
304
297
|
contracts:
|
|
305
298
|
- windsurf_hooks_manifest
|
|
299
|
+
|
|
300
|
+
# Registered by BUG-2026-07-26-null-skill-adapters-install-nothing: both ship
|
|
301
|
+
# a render_skill() adapter and an install function, but had no registry row,
|
|
302
|
+
# so srp-engine never rendered for them and install found nothing.
|
|
303
|
+
- id: opencode
|
|
304
|
+
name: OpenCode
|
|
305
|
+
tier: opt_in
|
|
306
|
+
skill:
|
|
307
|
+
adapter: opencode
|
|
308
|
+
output: .opencode/skills
|
|
309
|
+
context:
|
|
310
|
+
adapter: opencode
|
|
311
|
+
mode: symlink
|
|
312
|
+
file: AGENTS.md
|
|
313
|
+
contracts:
|
|
314
|
+
- agents_md_exists
|
|
315
|
+
|
|
316
|
+
- id: copilot
|
|
317
|
+
name: Copilot CLI
|
|
318
|
+
tier: opt_in
|
|
319
|
+
skill:
|
|
320
|
+
adapter: copilot
|
|
321
|
+
output: .copilot/skills
|
|
322
|
+
context:
|
|
323
|
+
adapter: copilot
|
|
324
|
+
mode: copy
|
|
325
|
+
file: AGENTS.md
|
|
326
|
+
contracts:
|
|
327
|
+
- agents_md_exists
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# story: e37s05
|
|
3
|
+
# test-adapter-render.sh — render, path-traversal and hook-guard checks for
|
|
4
|
+
# every adapter, replacing 11 hand-written test-<target>-adapter.sh scripts.
|
|
5
|
+
#
|
|
6
|
+
# The 11 originals were the same five assertions with the target name
|
|
7
|
+
# substituted, none of them reachable from any gate, and they covered 11 of the
|
|
8
|
+
# 18 adapters that define render_skill(). Their fifth assertion was pure
|
|
9
|
+
# delegation to test-adapters.sh, which is already registry-driven.
|
|
10
|
+
#
|
|
11
|
+
# Adapters are discovered from scripts/adapters/*.sh, and each adapter's output
|
|
12
|
+
# directory variable is read out of its own source (they vary: *_SKILLS,
|
|
13
|
+
# *_RULES, *_EXT_DIR), so adding an adapter needs no edit here.
|
|
14
|
+
#
|
|
15
|
+
# Usage: bash scripts/test-adapter-render.sh
|
|
16
|
+
set -euo pipefail
|
|
17
|
+
source "$(dirname "${BASH_SOURCE[0]}")/lib/skill-common.sh"
|
|
18
|
+
resolve_repo_root
|
|
19
|
+
cd "$REPO_ROOT"
|
|
20
|
+
|
|
21
|
+
PASS=0
|
|
22
|
+
FAIL=0
|
|
23
|
+
pass() { echo "PASS: $1"; PASS=$((PASS + 1)); }
|
|
24
|
+
fail() { echo "FAIL: $1" >&2; FAIL=$((FAIL + 1)); }
|
|
25
|
+
|
|
26
|
+
TMP_ROOT=$(mktemp -d)
|
|
27
|
+
trap 'rm -rf "$TMP_ROOT"' EXIT
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
echo "=== test-adapter-render.sh ==="
|
|
33
|
+
|
|
34
|
+
for adapter in scripts/adapters/*.sh; do
|
|
35
|
+
id="$(basename "$adapter" .sh)"
|
|
36
|
+
|
|
37
|
+
grep -q "^render_skill()" "$adapter" || continue
|
|
38
|
+
|
|
39
|
+
# Adapters are sourced, not executed: several (continue, omp, zed) are stubs
|
|
40
|
+
# with no stdin entrypoint and would silently no-op — and exit 0 — if run as
|
|
41
|
+
# scripts. Sourcing and calling render_skill directly is how test-adapters.sh
|
|
42
|
+
# drives them, and it exercises every adapter the same way.
|
|
43
|
+
#
|
|
44
|
+
# An adapter may read more than one output variable (gemini uses GEMINI_SKILLS
|
|
45
|
+
# and GEMINI_EXT_DIR), so point all of them at the sandbox rather than
|
|
46
|
+
# guessing which one matters.
|
|
47
|
+
mapfile -t outvars < <(grep -oE '\$\{?[A-Z][A-Z0-9_]*_(SKILLS|RULES|EXT_DIR|OUT|COMMANDS|PROMPTS|HOOKS_DIR)[:-]' "$adapter" \
|
|
48
|
+
| tr -d '${:-' | sort -u)
|
|
49
|
+
if [[ ${#outvars[@]} -eq 0 ]]; then
|
|
50
|
+
echo " skip: $id — no output directory variable found"
|
|
51
|
+
continue
|
|
52
|
+
fi
|
|
53
|
+
|
|
54
|
+
render_into() { # $1 = destination dir, $2 = skill name
|
|
55
|
+
local dir="$1" nm="$2" v
|
|
56
|
+
local -a envs=()
|
|
57
|
+
for v in "${outvars[@]}"; do envs+=("$v=$dir"); done
|
|
58
|
+
( set +e
|
|
59
|
+
env "${envs[@]}" bash -c '
|
|
60
|
+
source "$1" 2>/dev/null || exit 1
|
|
61
|
+
IR_NAME="$2"; IR_DESCRIPTION="test desc"; IR_BODY="test body"
|
|
62
|
+
IR_DESC_ESCAPED="test desc"; IR_MODEL=""
|
|
63
|
+
declare -f render_skill >/dev/null || exit 1
|
|
64
|
+
render_skill
|
|
65
|
+
' _ "$PWD/$adapter" "$nm" >/dev/null 2>&1 )
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
dest="$TMP_ROOT/$id"
|
|
69
|
+
mkdir -p "$dest"
|
|
70
|
+
if render_into "$dest" "test-skill" && [[ -n "$(find "$dest" -mindepth 1 2>/dev/null)" ]]; then
|
|
71
|
+
pass "$id: render_skill writes an artifact from a SkillIR"
|
|
72
|
+
else
|
|
73
|
+
fail "$id: render_skill produced no artifact (${outvars[*]})"
|
|
74
|
+
fi
|
|
75
|
+
|
|
76
|
+
# Path traversal must be refused — this is the security assertion the
|
|
77
|
+
# per-target scripts carried and nothing else covers.
|
|
78
|
+
#
|
|
79
|
+
# Each adapter gets its own sandbox parent so the escape probe is isolated:
|
|
80
|
+
# ../escape from <sandbox>/out lands in <sandbox>, and a single shared parent
|
|
81
|
+
# would make one adapter's artifact fail every later adapter.
|
|
82
|
+
sandbox="$TMP_ROOT/sandbox-$id"
|
|
83
|
+
mkdir -p "$sandbox/out"
|
|
84
|
+
if render_into "$sandbox/out" "../escape"; then
|
|
85
|
+
fail "$id: accepted a path-traversal skill name"
|
|
86
|
+
else
|
|
87
|
+
pass "$id: rejects path traversal in skill name"
|
|
88
|
+
fi
|
|
89
|
+
if [[ -e "$sandbox/escape" ]]; then
|
|
90
|
+
fail "$id: path traversal escaped into $sandbox"
|
|
91
|
+
else
|
|
92
|
+
pass "$id: traversal wrote nothing outside the destination"
|
|
93
|
+
fi
|
|
94
|
+
|
|
95
|
+
# Hook bundle + guard behaviour, only where the target ships hooks.
|
|
96
|
+
hookdir="scripts/hooks/$id"
|
|
97
|
+
guard="$hookdir/pre-tool-git-guard.sh"
|
|
98
|
+
if [[ -f "$guard" ]]; then
|
|
99
|
+
out="$(echo '{"tool_input":{"command":"git push --force origin main"}}' \
|
|
100
|
+
| bash "$guard" 2>/dev/null || true)"
|
|
101
|
+
grep -q 'block' <<<"$out" \
|
|
102
|
+
&& pass "$id: pre-tool guard blocks a dangerous git command" \
|
|
103
|
+
|| fail "$id: pre-tool guard did not block git push --force"
|
|
104
|
+
fi
|
|
105
|
+
done
|
|
106
|
+
|
|
107
|
+
# The generic adapter-contract runner stays the source of truth for
|
|
108
|
+
# render_skill/wire_context wiring; assert it is green rather than restating it.
|
|
109
|
+
if bash scripts/test-adapters.sh 2>&1 | grep -q '0 failed'; then
|
|
110
|
+
pass "test-adapters.sh reports 0 failed across the registry"
|
|
111
|
+
else
|
|
112
|
+
fail "test-adapters.sh reported failures"
|
|
113
|
+
fi
|
|
114
|
+
|
|
115
|
+
echo "test-adapter-render: $PASS passed, $FAIL failed"
|
|
116
|
+
[[ "$FAIL" -eq 0 ]] || exit 1
|
package/scripts/test-adapters.sh
CHANGED
|
@@ -40,8 +40,13 @@ test_adapter() {
|
|
|
40
40
|
[[ -f "$adapter_file" ]] || { ta_fail "$id: adapter missing"; return; }
|
|
41
41
|
ta_pass "$id: exists"
|
|
42
42
|
|
|
43
|
+
# </dev/null is load-bearing. The caller feeds the target list into a
|
|
44
|
+
# `while read` loop, so a sourced adapter inherits it on fd 0 — and every
|
|
45
|
+
# adapter ends in a main block that reads stdin. agy.sh was consuming the
|
|
46
|
+
# remaining target list and running render_skill with an empty IR_NAME, so
|
|
47
|
+
# this "registry-driven" runner silently tested exactly one adapter.
|
|
43
48
|
# shellcheck source=/dev/null
|
|
44
|
-
source "$adapter_file" 2>/dev/null && ta_pass "$id: sourceable" || { ta_fail "$id: source error"; return; }
|
|
49
|
+
source "$adapter_file" </dev/null 2>/dev/null && ta_pass "$id: sourceable" || { ta_fail "$id: source error"; return; }
|
|
45
50
|
|
|
46
51
|
local has_skill has_context mode
|
|
47
52
|
has_skill=$(yq -r ".targets[] | select(.id==\"$id\") | .skill != null" "$TARGETS_FILE")
|
|
@@ -62,11 +67,13 @@ test_adapter() {
|
|
|
62
67
|
# to print 5 PASS lines and report 4. Capture the status, tally in-process.
|
|
63
68
|
if (
|
|
64
69
|
cd "$TA_TMPDIR"
|
|
70
|
+
# </dev/null for the same reason as above — this subshell also inherits
|
|
71
|
+
# the caller's target list on fd 0.
|
|
65
72
|
# shellcheck source=/dev/null
|
|
66
|
-
source "$adapter_file"
|
|
73
|
+
source "$adapter_file" </dev/null
|
|
67
74
|
wire_context >/dev/null 2>&1 || true
|
|
68
75
|
wire_context >/dev/null 2>&1
|
|
69
|
-
); then
|
|
76
|
+
) </dev/null; then
|
|
70
77
|
ta_pass "$id: idempotent wire_context"
|
|
71
78
|
else
|
|
72
79
|
ta_fail "$id: wire_context failed"
|