cc-safe-setup 29.7.0 → 30.0.4
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/.claude-plugin/marketplace.json +72 -19
- package/.claude-plugin/plugin.json +1 -1
- package/CONTRIBUTING.md +7 -2
- package/COOKBOOK.md +50 -46
- package/LICENSE +21 -0
- package/MIGRATION.md +8 -8
- package/README.md +419 -512
- package/SAFETY_CHECKLIST.md +15 -7
- package/SERVICES.md +194 -0
- package/SETTINGS_REFERENCE.md +236 -17
- package/SKILL.md +5 -5
- package/TROUBLESHOOTING.md +35 -14
- package/action.yml +12 -4
- package/audit/README.md +84 -0
- package/audit/audit-checklist.md +152 -0
- package/audit/boundary-selftest.sh +85 -0
- package/audit/boundary.sh +123 -0
- package/audit/count-hooks.py +42 -0
- package/audit/find-dead-hooks.sh +82 -0
- package/audit/find-unfirable-rules.sh +142 -0
- package/audit/fire.sh +97 -0
- package/audit/selftest.sh +42 -0
- package/audit/unfirable-selftest.sh +81 -0
- package/audit-web/index.html +9 -9
- package/examples/README.md +54 -17
- package/examples/account-billing-log.sh +98 -0
- package/examples/account-routing-preflight.sh +123 -0
- package/examples/agent-sdk-credit-pool-monitor.sh +145 -0
- package/examples/agent-view-quota-decrement.sh +32 -0
- package/examples/agent-view-quota-warn.sh +94 -0
- package/examples/agents-md-edit-drift-warner.sh +223 -0
- package/examples/agents-md-loader.sh +160 -0
- package/examples/agents-md-sync-checker.sh +102 -0
- package/examples/ai-slop-punctuation-arrest.sh +210 -0
- package/examples/allowlist.sh +70 -10
- package/examples/always-allow-pattern-suggester.sh +125 -0
- package/examples/ansible-vault-guard.sh +2 -1
- package/examples/anthropic-base-url-guard.sh +76 -0
- package/examples/api-busyloop-guard.sh +123 -0
- package/examples/api-endpoint-guard.sh +12 -0
- package/examples/api-key-in-url-guard.sh +17 -1
- package/examples/api-rate-limit-guard.sh +36 -1
- package/examples/api-rate-limit-tracker.sh +12 -0
- package/examples/articulated-scope-capture.sh +101 -0
- package/examples/askuserquestion-autonomy-gate.sh +102 -0
- package/examples/attachment-traversal-guard.sh +118 -0
- package/examples/aup-block-pattern-logger.sh +161 -0
- package/examples/aup-false-positive-helper.sh +124 -0
- package/examples/aup-large-tool-output-warner.sh +282 -0
- package/examples/aup-retry-loop-guard.sh +229 -0
- package/examples/auth-expiry-reminder.sh +157 -0
- package/examples/auth-macos-sleep-detector.sh +185 -0
- package/examples/auth-path-detector.sh +171 -0
- package/examples/auth-status-checker.sh +157 -0
- package/examples/authorized-reconfirmation-detector.sh +195 -0
- package/examples/auto-approve-build.sh +39 -0
- package/examples/auto-approve-cargo.sh +31 -1
- package/examples/auto-approve-docker.sh +35 -0
- package/examples/auto-approve-git-read.sh +37 -14
- package/examples/auto-approve-go.sh +30 -1
- package/examples/auto-approve-gradle.sh +29 -1
- package/examples/auto-approve-make.sh +29 -1
- package/examples/auto-approve-maven.sh +29 -1
- package/examples/auto-approve-python.sh +41 -1
- package/examples/auto-approve-readonly-tools.sh +1 -0
- package/examples/auto-approve-readonly.sh +110 -33
- package/examples/auto-approve-ssh.sh +30 -1
- package/examples/auto-approve-test.sh +44 -0
- package/examples/auto-checkpoint.sh +1 -1
- package/examples/auto-compact-prep.sh +0 -0
- package/examples/auto-git-checkpoint.sh +0 -0
- package/examples/auto-mode-safe-commands.sh +53 -1
- package/examples/auto-mode-safety-enforcer.sh +151 -4
- package/examples/auto-push-session-branch.sh +22 -0
- package/examples/aws-production-guard.sh +13 -1
- package/examples/aws-region-guard.sh +1 -1
- package/examples/background-cost-launch-guard.sh +82 -0
- package/examples/background-task-guard.sh +12 -0
- package/examples/backup-before-refactor.sh +0 -0
- package/examples/banned-command-guard.sh +12 -0
- package/examples/bash-allowlist-secondary-check.sh +157 -0
- package/examples/bash-domain-allowlist.sh +12 -0
- package/examples/bash-fanout-bounded-rewriter.sh +191 -0
- package/examples/bash-heuristic-approver.sh +112 -10
- package/examples/bash-project-fence.sh +194 -0
- package/examples/bash-safety-auto-deny.sh +12 -0
- package/examples/bash-secret-output-detector.sh +44 -3
- package/examples/bash-trace-guard.sh +12 -0
- package/examples/bashrc-safety-check.sh +0 -0
- package/examples/bg-permission-prompt-warner.sh +182 -0
- package/examples/bg-task-cooldown-guard.sh +12 -0
- package/examples/binary-read-detector.sh +135 -0
- package/examples/binary-upload-guard.sh +12 -0
- package/examples/block-database-wipe.sh +35 -10
- package/examples/branch-name-check.sh +8 -3
- package/examples/branch-naming-convention.sh +0 -0
- package/examples/broad-find-guard.sh +12 -0
- package/examples/broad-prefix-session-trap-warner.sh +106 -0
- package/examples/bulk-file-delete-guard.sh +45 -0
- package/examples/bypass-mode-effective-verifier.sh +203 -0
- package/examples/cache-creation-drift-detector.sh +120 -0
- package/examples/cache-residue-detector.sh +195 -0
- package/examples/cache-tier-logger.sh +70 -0
- package/examples/cache-ttl-eviction-detector.sh +149 -0
- package/examples/cargo-publish-guard.sh +14 -1
- package/examples/case-insensitive-path-guard.sh +21 -2
- package/examples/case-sensitive-guard.sh +23 -2
- package/examples/cch-cache-guard.sh +0 -0
- package/examples/cch-sentinel-precommit-guard.sh +47 -0
- package/examples/check-abort-controller.sh +1 -1
- package/examples/check-accessibility.sh +0 -0
- package/examples/check-aria-labels.sh +0 -0
- package/examples/check-before-act-enforcer.sh +12 -0
- package/examples/check-charset-meta.sh +0 -0
- package/examples/check-cookie-flags.sh +0 -0
- package/examples/check-cors-config.sh +0 -0
- package/examples/check-csp-headers.sh +0 -0
- package/examples/check-csrf-protection.sh +0 -0
- package/examples/check-debounce.sh +1 -1
- package/examples/check-dependency-age.sh +0 -0
- package/examples/check-dependency-license.sh +0 -0
- package/examples/check-dockerfile-best-practice.sh +0 -0
- package/examples/check-error-boundaries.sh +0 -0
- package/examples/check-error-class.sh +1 -1
- package/examples/check-error-handling.sh +0 -0
- package/examples/check-error-logging.sh +1 -1
- package/examples/check-error-message.sh +0 -0
- package/examples/check-error-stack.sh +0 -0
- package/examples/check-favicon.sh +0 -0
- package/examples/check-git-hooks-compat.sh +0 -0
- package/examples/check-gitattributes.sh +0 -0
- package/examples/check-https-redirect.sh +0 -0
- package/examples/check-input-validation.sh +0 -0
- package/examples/check-lang-attribute.sh +0 -0
- package/examples/check-npm-scripts-exist.sh +0 -0
- package/examples/check-package-size.sh +0 -0
- package/examples/check-port-availability.sh +0 -0
- package/examples/check-promise-all.sh +1 -1
- package/examples/check-rate-limiting.sh +0 -0
- package/examples/check-return-types.sh +0 -0
- package/examples/check-semantic-versioning.sh +0 -0
- package/examples/check-suspense-fallback.sh +1 -1
- package/examples/check-test-exists.sh +0 -0
- package/examples/check-test-naming.sh +0 -0
- package/examples/check-timeout-cleanup.sh +1 -1
- package/examples/check-tls-version.sh +0 -0
- package/examples/check-unsubscribe.sh +1 -1
- package/examples/check-viewport-meta.sh +0 -0
- package/examples/check-worker-terminate.sh +1 -1
- package/examples/checkpoint-tamper-guard.sh +12 -0
- package/examples/chmod-guard.sh +12 -0
- package/examples/chown-guard.sh +24 -0
- package/examples/ci-workflow-guard.sh +6 -1
- package/examples/claim-verify-detector.sh +109 -0
- package/examples/claim-vs-caveat-checker.sh +77 -0
- package/examples/classifier-fallback-allow.sh +114 -40
- package/examples/claude-cache-gc.sh +1 -0
- package/examples/claude-code-version-pin-advisor.sh +183 -0
- package/examples/claude-md-reinjector.sh +129 -0
- package/examples/claude-md-size-monitor.sh +66 -0
- package/examples/claude-update-budget-guard.sh +123 -0
- package/examples/claude-update-smart.sh +113 -0
- package/examples/claudeignore-enforce-guard.sh +12 -0
- package/examples/claudemd-enforcer.sh +0 -0
- package/examples/claudemd-tool-prohibition.sh +128 -0
- package/examples/clear-command-confirm-guard.sh +32 -15
- package/examples/cli-config-pinning-detector.sh +162 -0
- package/examples/cliff-countdown-advisor.sh +96 -0
- package/examples/clipboard-secret-guard.sh +12 -0
- package/examples/closure-word-verify-gate.sh +150 -0
- package/examples/cloud-cli-guard.sh +39 -2
- package/examples/commit-all-scope-guard.sh +44 -0
- package/examples/commit-message-check.sh +1 -1
- package/examples/commit-message-quality.sh +6 -1
- package/examples/commitment-carry-forward-arrest.sh +361 -0
- package/examples/compact-alert-notification.sh +0 -0
- package/examples/compact-circuit-breaker.sh +72 -0
- package/examples/compact-dispatch-watchdog.sh +149 -0
- package/examples/completion-claim-without-verification-detector.sh +207 -0
- package/examples/composer-guard.sh +12 -0
- package/examples/compound-bash-permission-resolver.sh +156 -0
- package/examples/compound-command-allow.sh +1 -1
- package/examples/compound-command-deny-enforcer.sh +183 -0
- package/examples/compound-inject-guard.sh +12 -0
- package/examples/concurrent-edit-lock.sh +12 -0
- package/examples/conflict-marker-guard.sh +12 -0
- package/examples/consecutive-error-breaker.sh +0 -0
- package/examples/console-log-count.sh +1 -0
- package/examples/context-compact-advisor.sh +29 -2
- package/examples/context-length-budget.sh +69 -0
- package/examples/context-threshold-alert.sh +12 -0
- package/examples/context-usage-drift-alert.sh +41 -13
- package/examples/conversation-history-guard.sh +12 -0
- package/examples/core-file-protect-guard.sh +12 -0
- package/examples/cors-star-warn.sh +0 -0
- package/examples/cost-incident-self-audit.sh +162 -0
- package/examples/cowork-claude-md-load-checker.sh +100 -0
- package/examples/cowork-fuse-staleness-watcher.sh +140 -0
- package/examples/cowork-hook-absence-warner.sh +167 -0
- package/examples/cowork-model-picker-advisor.sh +115 -0
- package/examples/credential-exfil-guard.sh +65 -4
- package/examples/credential-file-cat-guard.sh +17 -1
- package/examples/cron-create-receipt.sh +112 -0
- package/examples/cron-modification-guard.sh +12 -0
- package/examples/cross-product-mcp-spawn-detector.sh +178 -0
- package/examples/cwd-project-boundary-guard.sh +0 -0
- package/examples/daemon-zombie-worker-surfacer.sh +118 -0
- package/examples/daily-cost-guard.sh +164 -0
- package/examples/daily-usage-tracker.sh +0 -0
- package/examples/dangerous-pip-flag-guard.sh +12 -0
- package/examples/db-connect-guard.sh +13 -1
- package/examples/denied-action-retry-guard.sh +12 -0
- package/examples/deny-bypass-detector.sh +12 -0
- package/examples/deny-rule-integrity-verifier.sh +181 -0
- package/examples/dependency-install-guard.sh +12 -0
- package/examples/deploy-guard.sh +14 -2
- package/examples/deploy-path-verify-guard.sh +12 -0
- package/examples/deployment-readback-gate.sh +135 -0
- package/examples/deployment-readback-gh-adapter.sh +247 -0
- package/examples/deployment-verify-guard.sh +25 -2
- package/examples/destructive-db-script-write-guard.sh +166 -0
- package/examples/destructive-migration-write-guard.sh +163 -0
- package/examples/diff-size-guard.sh +12 -0
- package/examples/disabled-feature-toggle-advisor.sh +88 -0
- package/examples/disk-partition-guard.sh +12 -0
- package/examples/dispatch-allowlist-preflight.sh +301 -0
- package/examples/dispatch-liveness-watchdog.sh +216 -0
- package/examples/dispatch-receipt.sh +174 -0
- package/examples/django-migrate-guard.sh +12 -0
- package/examples/dns-config-guard.sh +12 -0
- package/examples/docker-dangerous-guard.sh +12 -0
- package/examples/docker-volume-guard.sh +0 -0
- package/examples/dockerfile-latest-guard.sh +1 -0
- package/examples/dotenv-anthropic-key-billing-guard.sh +99 -0
- package/examples/dotenv-commit-guard.sh +12 -0
- package/examples/dotenv-read-guard.sh +12 -0
- package/examples/dotfile-protection-guard.sh +12 -0
- package/examples/dotnet-build-on-edit.sh +1 -1
- package/examples/drizzle-migrate-guard.sh +27 -2
- package/examples/echo-probe-spam-detector.sh +176 -0
- package/examples/edit-counter-test-gate.sh +12 -0
- package/examples/edit-error-counter.sh +1 -1
- package/examples/edit-guard.sh +12 -0
- package/examples/edit-old-string-validator.sh +12 -0
- package/examples/edit-quote-ambiguity-guard.sh +97 -0
- package/examples/edit-retry-loop-guard.sh +0 -0
- package/examples/edit-verify.sh +0 -0
- package/examples/env-inline-secret-guard.sh +14 -2
- package/examples/env-naming-convention.sh +0 -0
- package/examples/env-prod-guard.sh +0 -0
- package/examples/env-required-check.sh +0 -0
- package/examples/env-source-guard.sh +12 -0
- package/examples/env-var-check.sh +24 -1
- package/examples/ephemeral-container-detector.sh +147 -0
- package/examples/error-memory-guard.sh +12 -0
- package/examples/evidence-claim-gate.sh +187 -0
- package/examples/exploration-budget-guard.sh +89 -0
- package/examples/expo-eject-guard.sh +13 -0
- package/examples/extended-thinking-loop-guard.sh +139 -0
- package/examples/extended-thinking-resume-warning.sh +119 -0
- package/examples/extended-thinking-tool-use-mismatch-detector.sh +212 -0
- package/examples/fabricated-command-detector.sh +145 -0
- package/examples/false-disk-full-guard.sh +63 -0
- package/examples/feature-deprecation-detector.sh +109 -0
- package/examples/file-change-tracker.sh +1 -1
- package/examples/file-change-undo-tracker.sh +0 -0
- package/examples/file-edit-backup.sh +63 -14
- package/examples/file-reference-check.sh +0 -0
- package/examples/file-size-limit.sh +12 -0
- package/examples/financial-operation-guard.sh +12 -0
- package/examples/firewall-guard.sh +12 -0
- package/examples/fish-shell-wrapper.sh +125 -7
- package/examples/five-hundred-milestone.sh +1 -0
- package/examples/flask-static-route-guard.sh +89 -0
- package/examples/forbidden-response-phrase-detector.sh +161 -0
- package/examples/gem-push-guard.sh +13 -0
- package/examples/gh-cli-destructive-guard.sh +13 -1
- package/examples/git-checkout-safety-guard.sh +12 -0
- package/examples/git-checkout-uncommitted-guard.sh +12 -0
- package/examples/git-config-guard.sh +12 -0
- package/examples/git-crypt-worktree-guard.sh +12 -0
- package/examples/git-filter-repo-guard.sh +56 -0
- package/examples/git-history-rewrite-guard.sh +12 -0
- package/examples/git-hook-bypass-guard.sh +0 -0
- package/examples/git-maintenance-guard.sh +83 -0
- package/examples/git-merge-conflict-prevent.sh +0 -0
- package/examples/git-message-length-check.sh +0 -0
- package/examples/git-message-length.sh +0 -0
- package/examples/git-operations-require-approval.sh +68 -14
- package/examples/git-pack-temp-cleanup-guard.sh +102 -0
- package/examples/git-push-blast-radius-guard.sh +218 -0
- package/examples/git-remote-guard.sh +24 -3
- package/examples/git-rm-orphan-wipe-guard.sh +85 -0
- package/examples/git-stash-before-checkout.sh +12 -0
- package/examples/git-stash-before-danger.sh +0 -0
- package/examples/git-submodule-guard.sh +69 -2
- package/examples/git-tag-guard.sh +12 -0
- package/examples/github-actions-secret-guard.sh +0 -0
- package/examples/gitignore-check.sh +0 -0
- package/examples/gitops-drift-guard.sh +12 -0
- package/examples/go-mod-tidy-warn.sh +1 -0
- package/examples/go-vet-after-edit.sh +12 -0
- package/examples/goal-iteration-limit-warner.sh +152 -0
- package/examples/grep-nul-false-negative-guard.sh +30 -0
- package/examples/growthbook-flag-monitor.sh +257 -0
- package/examples/hallucination-url-check.sh +1 -1
- package/examples/halt-signal-detector.sh +135 -0
- package/examples/handoff-on-clear.sh +65 -0
- package/examples/hardcoded-ip-guard.sh +1 -0
- package/examples/headless-empty-result-guard.sh +0 -0
- package/examples/headless-stop-guard.sh +0 -0
- package/examples/helm-install-guard.sh +2 -1
- package/examples/home-critical-bash-guard.sh +17 -1
- package/examples/hook-debug-wrapper.sh +6 -2
- package/examples/hook-permission-fixer.sh +0 -0
- package/examples/hook-self-disable-detector.sh +99 -0
- package/examples/hook-stdout-sanitizer.sh +6 -2
- package/examples/hook-tamper-guard.sh +12 -0
- package/examples/idle-session-cost-alert.sh +0 -0
- package/examples/image-dimension-guard.sh +109 -0
- package/examples/image-file-validator.sh +0 -0
- package/examples/iteration-quality-degradation-detector.sh +170 -0
- package/examples/java-compile-on-edit.sh +1 -1
- package/examples/json-syntax-check.sh +0 -0
- package/examples/k8s-production-guard.sh +13 -1
- package/examples/kill-process-guard.sh +12 -0
- package/examples/kubernetes-guard.sh +13 -1
- package/examples/laravel-artisan-guard.sh +13 -0
- package/examples/large-file-guard.sh +1 -1
- package/examples/log-level-guard.sh +0 -0
- package/examples/log-truncation-guard.sh +12 -0
- package/examples/long-session-malformed-tool-call-detector.sh +183 -0
- package/examples/loop-detector.sh +12 -0
- package/examples/magic-number-warn.sh +1 -0
- package/examples/main-branch-warn.sh +12 -0
- package/examples/markdown-link-check.sh +0 -0
- package/examples/max-concurrent-agents.sh +12 -0
- package/examples/max-edit-size-guard.sh +13 -0
- package/examples/max-file-count-guard.sh +0 -0
- package/examples/max-file-delete-count.sh +0 -0
- package/examples/max-function-length.sh +1 -0
- package/examples/max-import-count.sh +0 -0
- package/examples/max-subagent-count.sh +0 -0
- package/examples/mcp-config-freeze.sh +12 -0
- package/examples/mcp-config-poisoning-audit.sh +150 -0
- package/examples/mcp-data-boundary.sh +1 -1
- package/examples/mcp-misdiagnosis-arrest.sh +209 -0
- package/examples/mcp-orphan-leak-warner.sh +49 -0
- package/examples/mcp-permissions-ask-warner.sh +151 -0
- package/examples/mcp-routine-approval-detector.sh +154 -0
- package/examples/mcp-server-allowlist.sh +12 -0
- package/examples/mcp-server-guard.sh +12 -0
- package/examples/mcp-startup-bloat-detector.sh +87 -0
- package/examples/mcp-stdio-compatibility-test.sh +153 -0
- package/examples/mcp-tool-audit-log.sh +0 -0
- package/examples/mcp-tool-guard.sh +101 -1
- package/examples/mcp-warmup-wait.sh +0 -0
- package/examples/memory-chain-audit.sh +56 -0
- package/examples/memory-orphan-detector.sh +188 -0
- package/examples/memory-write-guard.sh +99 -17
- package/examples/migration-verify-guard.sh +12 -0
- package/examples/model-swap-suggester.sh +177 -0
- package/examples/model-version-alert.sh +5 -1
- package/examples/model-version-lock.sh +63 -0
- package/examples/move-delete-sequence-guard.sh +33 -2
- package/examples/multi-file-plan-routing-gate.sh +192 -0
- package/examples/multi-vendor-concurrent-warner.sh +108 -0
- package/examples/multi-window-auth-drift-detector.sh +183 -0
- package/examples/multiline-command-approver.sh +161 -23
- package/examples/nested-background-agent-guard.sh +109 -0
- package/examples/nested-spawn-inflight-guard.sh +178 -0
- package/examples/network-exfil-guard.sh +12 -0
- package/examples/network-guard.sh +12 -0
- package/examples/network-interface-guard.sh +12 -0
- package/examples/nextjs-env-guard.sh +1 -1
- package/examples/no-absolute-import.sh +0 -0
- package/examples/no-alert-confirm-prompt.sh +0 -0
- package/examples/no-anonymous-default-export.sh +0 -0
- package/examples/no-any-type.sh +0 -0
- package/examples/no-any-typescript.sh +1 -0
- package/examples/no-ask-human.sh +12 -0
- package/examples/no-assignment-in-condition.sh +0 -0
- package/examples/no-base64-exfil.sh +12 -0
- package/examples/no-callback-hell.sh +0 -0
- package/examples/no-circular-dependency.sh +0 -0
- package/examples/no-cleartext-storage.sh +0 -0
- package/examples/no-commented-code.sh +0 -0
- package/examples/no-commit-fixup.sh +0 -0
- package/examples/no-console-assert.sh +0 -0
- package/examples/no-console-error-swallow.sh +0 -0
- package/examples/no-console-in-prod.sh +0 -0
- package/examples/no-console-log-commit.sh +12 -0
- package/examples/no-console-log.sh +0 -0
- package/examples/no-console-time.sh +0 -0
- package/examples/no-cors-wildcard.sh +4 -1
- package/examples/no-curl-upload.sh +0 -0
- package/examples/no-dangerouslySetInnerHTML.sh +0 -0
- package/examples/no-dangling-await.sh +1 -0
- package/examples/no-debug-commit.sh +12 -0
- package/examples/no-debug-in-commit.sh +0 -0
- package/examples/no-deep-nesting.sh +0 -0
- package/examples/no-deep-relative-import.sh +1 -0
- package/examples/no-default-credentials.sh +0 -0
- package/examples/no-deploy-friday.sh +13 -1
- package/examples/no-disabled-test.sh +0 -0
- package/examples/no-document-write.sh +0 -0
- package/examples/no-empty-function.sh +0 -0
- package/examples/no-eval-in-template.sh +0 -0
- package/examples/no-eval-template.sh +3 -1
- package/examples/no-eval.sh +0 -0
- package/examples/no-exec-user-input.sh +0 -0
- package/examples/no-fixme-ship.sh +12 -0
- package/examples/no-floating-promises.sh +0 -0
- package/examples/no-force-flag.sh +22 -5
- package/examples/no-force-install.sh +0 -0
- package/examples/no-git-amend.sh +12 -0
- package/examples/no-git-rebase-public.sh +0 -0
- package/examples/no-global-install.sh +12 -0
- package/examples/no-global-state.sh +0 -0
- package/examples/no-hardcoded-port.sh +1 -0
- package/examples/no-hardcoded-url.sh +0 -0
- package/examples/no-helmet-missing.sh +0 -0
- package/examples/no-http-url.sh +1 -0
- package/examples/no-http-without-https.sh +0 -0
- package/examples/no-inline-style.sh +0 -0
- package/examples/no-inline-styles.sh +1 -0
- package/examples/no-innerhtml.sh +0 -0
- package/examples/no-install-global.sh +12 -0
- package/examples/no-jwt-in-url.sh +0 -0
- package/examples/no-large-commit.sh +0 -0
- package/examples/no-localhost-expose.sh +0 -0
- package/examples/no-magic-number.sh +0 -0
- package/examples/no-md5-sha1.sh +0 -0
- package/examples/no-mixed-line-endings.sh +8 -1
- package/examples/no-mutation-in-reducer.sh +0 -0
- package/examples/no-nested-ternary.sh +0 -0
- package/examples/no-network-exfil.sh +0 -0
- package/examples/no-open-redirect.sh +0 -0
- package/examples/no-output-truncation.sh +12 -0
- package/examples/no-package-downgrade.sh +0 -0
- package/examples/no-package-lock-edit.sh +12 -0
- package/examples/no-path-join-user-input.sh +0 -0
- package/examples/no-port-bind.sh +0 -0
- package/examples/no-process-exit.sh +0 -0
- package/examples/no-prototype-pollution.sh +0 -0
- package/examples/no-push-without-ci.sh +0 -0
- package/examples/no-push-without-tests.sh +12 -0
- package/examples/no-raw-password-in-url.sh +0 -0
- package/examples/no-root-user-docker.sh +1 -0
- package/examples/no-root-write.sh +12 -0
- package/examples/no-secrets-in-args.sh +4 -1
- package/examples/no-secrets-in-logs.sh +0 -0
- package/examples/no-sensitive-log.sh +0 -0
- package/examples/no-sleep-in-hooks.sh +0 -0
- package/examples/no-star-import-python.sh +1 -0
- package/examples/no-string-concat-sql.sh +0 -0
- package/examples/no-sudo-guard.sh +12 -0
- package/examples/no-sync-fs.sh +0 -0
- package/examples/no-todo-in-merge.sh +0 -0
- package/examples/no-todo-in-production.sh +1 -0
- package/examples/no-todo-without-issue.sh +0 -0
- package/examples/no-unused-import.sh +0 -0
- package/examples/no-var-keyword.sh +0 -0
- package/examples/no-verify-blocker.sh +12 -0
- package/examples/no-wget-piped-bash.sh +12 -0
- package/examples/no-wildcard-cors.sh +0 -0
- package/examples/no-wildcard-delete.sh +0 -0
- package/examples/no-wildcard-import.sh +0 -0
- package/examples/no-with-statement.sh +0 -0
- package/examples/no-write-outside-src.sh +0 -0
- package/examples/no-xml-external-entity.sh +0 -0
- package/examples/non-english-quality-warner.sh +156 -0
- package/examples/notify-waiting.sh +1 -1
- package/examples/npm-audit-warn.sh +0 -0
- package/examples/npm-global-install-guard.sh +12 -0
- package/examples/npm-publish-guard.sh +12 -0
- package/examples/npm-script-injection.sh +0 -0
- package/examples/npm-supply-chain-guard.sh +0 -0
- package/examples/nuxt-config-guard.sh +1 -0
- package/examples/oauth-refresh-monitor.sh +210 -0
- package/examples/opus-degradation-tracker.sh +187 -0
- package/examples/opus48-routine-task-warning.sh +196 -0
- package/examples/opus48-thinking-wedge-advisor.sh +143 -0
- package/examples/output-credential-scan.sh +1 -1
- package/examples/output-secret-mask.sh +31 -9
- package/examples/output-token-spike-detector.sh +145 -0
- package/examples/package-json-guard.sh +12 -0
- package/examples/package-lock-frozen.sh +12 -0
- package/examples/parallel-batch-size-limiter.sh +121 -0
- package/examples/parallel-cascade-detector.sh +116 -0
- package/examples/partial-view-claim-arrest.sh +174 -0
- package/examples/path-deny-bash-guard.sh +12 -0
- package/examples/path-traversal-guard.sh +12 -0
- package/examples/per-prompt-token-cap.sh +124 -0
- package/examples/permission-audit-log.sh +1 -1
- package/examples/permission-denial-enforcer.sh +12 -0
- package/examples/permission-entry-validator.sh +0 -0
- package/examples/persisted-1m-model-advisor.sh +88 -0
- package/examples/php-lint-on-edit.sh +1 -1
- package/examples/pii-upload-guard.sh +12 -0
- package/examples/pip-publish-guard.sh +13 -0
- package/examples/pip-requirements-guard.sh +12 -0
- package/examples/pip-venv-required.sh +12 -0
- package/examples/plan-mode-edit-guard.sh +12 -0
- package/examples/plan-mode-enforcer.sh +12 -0
- package/examples/plan-mode-strict-guard.sh +12 -0
- package/examples/plugin-hooks-json-bloat-detector.sh +169 -0
- package/examples/plugin-process-cleanup.sh +0 -0
- package/examples/polyglot-rm-guard.sh +12 -0
- package/examples/post-compact-safety.sh +12 -0
- package/examples/post-edit-disk-verify.sh +152 -0
- package/examples/powershell-remove-item-guard.sh +85 -0
- package/examples/pr-description-check.sh +0 -0
- package/examples/pr-duplicate-guard.sh +13 -0
- package/examples/pre-bash-sed-line-ending-windows.sh +87 -0
- package/examples/pre-compact-knowledge-save.sh +0 -0
- package/examples/pre-compact-transcript-backup.sh +0 -0
- package/examples/pre-execution-claim-detector.sh +179 -0
- package/examples/prefer-builtin-tools.sh +10 -1
- package/examples/prefer-const.sh +0 -0
- package/examples/prefer-dedicated-tools.sh +12 -0
- package/examples/prefer-optional-chaining.sh +0 -0
- package/examples/prisma-migrate-guard.sh +24 -7
- package/examples/production-port-kill-guard.sh +12 -0
- package/examples/prompt-injection-guard.sh +2 -1
- package/examples/prompt-usage-logger.sh +0 -0
- package/examples/protect-claudemd.sh +12 -0
- package/examples/protect-dotfiles.sh +12 -0
- package/examples/proxy-capture-suggester.sh +159 -0
- package/examples/public-artefact-socratic-narrowing.sh +232 -0
- package/examples/public-repo-push-guard.sh +12 -0
- package/examples/push-requires-test-pass-record.sh +0 -0
- package/examples/push-requires-test-pass.sh +12 -0
- package/examples/quota-anomaly-detector.sh +173 -0
- package/examples/quota-reset-audit.sh +58 -0
- package/examples/quoted-flag-approver.sh +99 -10
- package/examples/rails-migration-guard.sh +12 -0
- package/examples/rate-limit-guard.sh +0 -0
- package/examples/read-all-files-enforcer.sh +0 -0
- package/examples/read-budget-guard.sh +12 -0
- package/examples/read-loop-detector.sh +59 -0
- package/examples/read-once-guard.sh +96 -0
- package/examples/read-only-mode.sh +12 -0
- package/examples/readme-exists-check.sh +0 -0
- package/examples/record-read-coverage.sh +73 -0
- package/examples/redirect-fragment-warner.sh +149 -0
- package/examples/redis-flushall-guard.sh +13 -0
- package/examples/redundant-read-blocker.sh +132 -0
- package/examples/refusal-arrest-gate.sh +248 -0
- package/examples/registry-publish-guard.sh +13 -1
- package/examples/remote-control-billing-classifier.sh +135 -0
- package/examples/replace-all-guard.sh +12 -0
- package/examples/repo-visibility-guard.sh +12 -0
- package/examples/reroute-after-block-guard.sh +150 -0
- package/examples/response-budget-guard.sh +0 -0
- package/examples/resume-drift-watcher.sh +57 -0
- package/examples/rg-replace-flag-detector.sh +125 -0
- package/examples/rhetorical-verification-prompt-detector.sh +102 -0
- package/examples/ripgrep-permission-fix.sh +0 -0
- package/examples/rm-safety-net.sh +151 -8
- package/examples/role-tool-guard.sh +12 -0
- package/examples/route-handler-emptiness-gate.sh +324 -0
- package/examples/ruby-lint-on-edit.sh +1 -1
- package/examples/runtime-binary-change-detector.sh +102 -0
- package/examples/same-command-repeat-detector.sh +196 -0
- package/examples/same-correction-arrest.sh +169 -0
- package/examples/sandbox-denywrite-enforcer.sh +78 -0
- package/examples/sandbox-relative-path-audit.sh +83 -25
- package/examples/sandbox-write-verify.sh +12 -0
- package/examples/schema-migration-guard.sh +0 -0
- package/examples/scope-expansion-receipt.sh +178 -0
- package/examples/scope-guard.sh +88 -9
- package/examples/secret-file-read-guard.sh +12 -0
- package/examples/secret-file-write-guard.sh +150 -0
- package/examples/self-modify-bypass-guard.sh +0 -0
- package/examples/sensitive-file-read-guard.sh +23 -3
- package/examples/sensitive-log-guard.sh +1 -0
- package/examples/server-side-prompt-injection-detector.sh +69 -0
- package/examples/session-agent-cost-limiter.sh +12 -0
- package/examples/session-backup-on-start.sh +1 -1
- package/examples/session-cost-alert.sh +12 -0
- package/examples/session-drift-guard.sh +12 -0
- package/examples/session-duration-guard.sh +25 -2
- package/examples/session-end-logger.sh +0 -0
- package/examples/session-health-monitor.sh +0 -0
- package/examples/session-index-repair.sh +1 -1
- package/examples/session-memory-watchdog.sh +1 -0
- package/examples/session-permission-reset-guard.sh +12 -0
- package/examples/session-persistence-verifier.sh +93 -0
- package/examples/session-plugin-pin-watch.sh +68 -0
- package/examples/session-rate-monitor.sh +176 -0
- package/examples/session-resume-env-fix.sh +0 -0
- package/examples/session-start-quota-status.sh +193 -0
- package/examples/session-start-safety-check.sh +55 -3
- package/examples/session-state-saver.sh +0 -0
- package/examples/session-summary-stop.sh +1 -1
- package/examples/session-summary.sh +0 -0
- package/examples/session-token-counter.sh +1 -1
- package/examples/settings-hooks-key-restorer.sh +99 -0
- package/examples/settings-json-health-check.sh +57 -0
- package/examples/settings-json-model-guard.sh +0 -0
- package/examples/settings-regression-tester.sh +188 -0
- package/examples/shell-config-truncation-guard.sh +12 -0
- package/examples/shell-wrapper-guard.sh +12 -0
- package/examples/skill-cumulative-size-detector.sh +104 -0
- package/examples/skill-description-drop-detector.sh +148 -0
- package/examples/skill-gate.sh +0 -0
- package/examples/skill-truncation-detector.sh +154 -0
- package/examples/skills-context-recorder.sh +167 -0
- package/examples/skills-load-verifier.sh +96 -0
- package/examples/skills-settings-validator.sh +139 -0
- package/examples/sonnet-45-deprecation-helper.sh +85 -0
- package/examples/spec-file-scope-guard.sh +12 -0
- package/examples/spring-profile-guard.sh +1 -0
- package/examples/spurious-malformed-notice-detector.sh +247 -0
- package/examples/sql-bulk-delete-warn.sh +88 -0
- package/examples/sql-injection-detect.sh +0 -0
- package/examples/ssh-key-protect.sh +12 -0
- package/examples/staged-secret-scan.sh +22 -1
- package/examples/stale-temp-settings-detector.sh +86 -0
- package/examples/standing-rule-session-surfacer.sh +137 -0
- package/examples/stop-hook-sigterm-wrapper.sh +182 -0
- package/examples/stop-transcript-write-health.sh +64 -0
- package/examples/strict-allowlist.sh +57 -15
- package/examples/strip-coauthored-by.sh +50 -10
- package/examples/subagent-blast-radius-guard.sh +184 -0
- package/examples/subagent-boundary-precheck.sh +126 -0
- package/examples/subagent-budget-guard.sh +12 -0
- package/examples/subagent-claudemd-inject.sh +0 -0
- package/examples/subagent-closure-verify-gate.sh +164 -0
- package/examples/subagent-destructive-git-guard.sh +120 -0
- package/examples/subagent-error-detector.sh +0 -0
- package/examples/subagent-forged-system-reminder-guard.sh +156 -0
- package/examples/subagent-identity-leak-guard.sh +102 -0
- package/examples/subagent-identity-reassertion.sh +51 -0
- package/examples/subagent-inheritance-tester.sh +179 -0
- package/examples/subagent-permission-mode-guard.sh +110 -0
- package/examples/subagent-scope-guard.sh +12 -0
- package/examples/subagent-spawn-verification-enforcer.sh +102 -0
- package/examples/subagent-tool-allowlist-enforcer.sh +101 -0
- package/examples/subagent-tool-call-limiter.sh +87 -15
- package/examples/subcommand-chain-guard.sh +12 -0
- package/examples/subscription-api-billing-warner.sh +160 -0
- package/examples/subscription-bypass-detector.sh +152 -0
- package/examples/svelte-lint-on-edit.sh +1 -0
- package/examples/swift-build-on-edit.sh +1 -1
- package/examples/symlink-guard.sh +27 -2
- package/examples/symlink-protect.sh +1 -0
- package/examples/system-dir-protection-guard.sh +73 -8
- package/examples/system-message-workaround.sh +38 -13
- package/examples/system-package-guard.sh +12 -0
- package/examples/systemd-service-guard.sh +12 -0
- package/examples/task-integrity-guard.sh +12 -0
- package/examples/temp-file-cleanup.sh +1 -1
- package/examples/temporal-suggestion-detector.sh +135 -0
- package/examples/terraform-guard.sh +27 -6
- package/examples/test-after-edit.sh +1 -1
- package/examples/test-before-push.sh +12 -0
- package/examples/test-coverage-reminder.sh +24 -1
- package/examples/thinking-budget-effort-mismatch-detector.sh +149 -0
- package/examples/thinking-stall-detector.sh +61 -0
- package/examples/timezone-guard.sh +0 -0
- package/examples/tmp-output-size-guard.sh +0 -0
- package/examples/todo-check.sh +1 -1
- package/examples/token-budget-guard.sh +12 -0
- package/examples/token-budget-per-task.sh +12 -0
- package/examples/token-usage-tracker.sh +7 -1
- package/examples/tokenizer-ratio-alert-corpus.sh +90 -0
- package/examples/tokenizer-ratio-alert.sh +104 -0
- package/examples/tool-call-rate-limiter.sh +0 -0
- package/examples/tool-result-correlation-checker.sh +167 -0
- package/examples/tool-result-size-guard.sh +132 -0
- package/examples/tool-retry-budget-guard.sh +12 -0
- package/examples/transcript-contamination-detector.sh +138 -0
- package/examples/trustfall-mcp-injection-guard.sh +103 -0
- package/examples/ultrareview-large-diff-advisor.sh +184 -0
- package/examples/unbounded-output-guard.sh +94 -0
- package/examples/uncommitted-changes-stop.sh +1 -0
- package/examples/uncommitted-discard-guard.sh +23 -5
- package/examples/uncommitted-work-guard.sh +12 -0
- package/examples/usage-warn.sh +0 -0
- package/examples/user-account-guard.sh +12 -0
- package/examples/userprompt-submit-receipt.sh +123 -0
- package/examples/variable-expansion-guard.sh +12 -0
- package/examples/verify-after-publish-reminder.sh +93 -0
- package/examples/verify-before-commit.sh +12 -0
- package/examples/version-bump-detector.sh +156 -0
- package/examples/version-regression-warner.sh +144 -0
- package/examples/vue-lint-on-edit.sh +1 -0
- package/examples/warn-cron-cost-trap.sh +173 -0
- package/examples/webfetch-runaway-guard.sh +89 -0
- package/examples/wellness-break-reminder.sh +118 -0
- package/examples/windows-destructive-command-guard.sh +177 -0
- package/examples/windows-path-guard.sh +12 -0
- package/examples/windows-python-stub-detector.sh +63 -0
- package/examples/work-hours-guard.sh +12 -0
- package/examples/working-directory-fence.sh +12 -0
- package/examples/workspace-lease-guard.sh +205 -0
- package/examples/worktree-create-log.sh +1 -0
- package/examples/worktree-delete-guard.sh +12 -0
- package/examples/worktree-edit-boundary-guard.sh +127 -0
- package/examples/worktree-escape-write-guard.sh +114 -0
- package/examples/worktree-hook-linker.sh +0 -0
- package/examples/worktree-hooks-path-fix.sh +111 -0
- package/examples/worktree-parent-write-guard.sh +43 -0
- package/examples/worktree-project-unify.sh +2 -1
- package/examples/worktree-remove-uncommitted-guard.sh +13 -0
- package/examples/worktree-unmerged-guard.sh +7 -1
- package/examples/write-byte-integrity-verifier.sh +190 -0
- package/examples/write-empty-content-guard.sh +67 -0
- package/examples/write-nul-corruption-detector.sh +61 -0
- package/examples/write-overwrite-confirm.sh +160 -14
- package/examples/write-secret-guard.sh +27 -5
- package/examples/write-shrink-guard.sh +12 -0
- package/examples/write-test-ratio.sh +0 -0
- package/examples/wsl-host-disk-space-guard.sh +97 -0
- package/examples/xml-format-leak-detector.sh +266 -0
- package/examples/yaml-syntax-check.sh +12 -0
- package/hooks/hooks.json +6 -6
- package/index.mjs +1699 -183
- package/mission.md +2 -0
- package/package.json +4 -4
- package/plugins/credential-guard/.claude-plugin/plugin.json +9 -7
- package/plugins/git-protection/.claude-plugin/plugin.json +10 -8
- package/plugins/safety-essentials/.claude-plugin/plugin.json +9 -7
- package/plugins/token-guard/.claude-plugin/plugin.json +10 -8
- package/scripts/agents-md-sync-setup.sh +156 -0
- package/scripts/autonomy-blocked-summary.sh +148 -0
- package/scripts/build-search-index.py +43 -0
- package/scripts/build-sitemap.py +119 -0
- package/scripts/cc-doctor.sh +192 -0
- package/scripts/check-hook-event-names.py +127 -0
- package/scripts/check-misfire-instrument.sh +64 -0
- package/scripts/claim-verify-audit.sh +467 -0
- package/scripts/cowork-claudemd-helper.sh +136 -0
- package/scripts/june-15-deprecated-model-scan.sh +111 -0
- package/scripts/measure-heredoc-shapes.sh +67 -0
- package/scripts/measure-literal-match-misfire.sh +110 -0
- package/scripts/probe-scope-guard-branches.sh +48 -0
- package/scripts/probe-skip-line-both-ways.sh +65 -0
- package/scripts/receipts-aggregate.py +199 -0
- package/scripts/session-forensic-audit.py +360 -0
- package/scripts.json +9 -9
- package/scripts.json.bak-2026-07-27-find +13 -0
- package/skills/safety-setup/SKILL.md +5 -5
- package/tests/approve-side-remaining-two.test.sh +129 -0
- package/tests/approver-list-granularity.test.sh +145 -0
- package/tests/askuserquestion-autonomy-gate.test.sh +181 -0
- package/tests/audit-ci-gate.test.sh +87 -0
- package/tests/audit-cross-layer-claudemd.test.sh +170 -0
- package/tests/audit-fail-open-parse.test.sh +100 -0
- package/tests/auto-approve-compound-tail.test.sh +194 -0
- package/tests/auto-mode-path-invoked-commands.test.sh +89 -0
- package/tests/auto-mode-quoted-targets.test.sh +127 -0
- package/tests/auto-mode-unquoted-targets.test.sh +112 -0
- package/tests/bash-secret-output-detector-detects.test.sh +102 -0
- package/tests/blindspots-cross-layer.test.sh +177 -0
- package/tests/block-database-wipe.test.sh +64 -0
- package/tests/bundled-short-flags-bypass.test.sh +85 -0
- package/tests/cd-git-allow-compound-tail.test.sh +67 -0
- package/tests/chown-guard-filesystem-root.test.sh +64 -0
- package/tests/ci-workflow-guard-skip-rule.test.sh +115 -0
- package/tests/compound-deny-safe-rm-targets.test.sh +105 -0
- package/tests/core-scripts-parser-fallback.test.sh +140 -0
- package/tests/destructive-guard-bare-glob.test.sh +74 -0
- package/tests/destructive-guard-every-operand.test.sh +100 -0
- package/tests/destructive-guard-find-deletion.test.sh +114 -0
- package/tests/destructive-guard-flag-order.test.sh +106 -0
- package/tests/destructive-guard-mentions-vs-invocations.test.sh +107 -0
- package/tests/destructive-guard-quoted-target.test.sh +89 -0
- package/tests/destructive-guard-separators.test.sh +105 -0
- package/tests/destructive-guard-variable-target.test.sh +98 -0
- package/tests/destructive-guard-wrapped-command.test.sh +91 -0
- package/tests/doctor-hook-disabling-env.test.sh +92 -0
- package/tests/doctor-misspelled-settings-keys.test.sh +106 -0
- package/tests/example-guards-wrapped-command.test.sh +169 -0
- package/tests/file-edit-backup.test.sh +93 -0
- package/tests/git-filter-repo-guard.test.sh +60 -0
- package/tests/git-global-options-bypass.test.sh +141 -0
- package/tests/git-invocation-prefixes-all-guards.test.sh +114 -0
- package/tests/git-maintenance-guard.test.sh +83 -0
- package/tests/git-pack-temp-cleanup-guard.test.sh +133 -0
- package/tests/git-rm-orphan-wipe-guard.test.sh +66 -0
- package/tests/git-submodule-guard.test.sh +50 -0
- package/tests/grep-pcre-portability.test.sh +155 -0
- package/tests/hook-registration-matches-input.test.sh +73 -0
- package/tests/hook-trigger-matches-envelope.test.sh +178 -0
- package/tests/install-does-not-claim-protection.test.sh +110 -0
- package/tests/install-example-standalone-tools.test.sh +139 -0
- package/tests/line-continuation-bypass.test.sh +114 -0
- package/tests/mcp-config-poisoning-audit.test.sh +106 -0
- package/tests/nested-background-agent-guard.test.sh +58 -0
- package/tests/no-unqualified-safety-claims.test.sh +114 -0
- package/tests/option-eating-grep-patterns.test.sh +130 -0
- package/tests/outdated-core-guards.test.sh +134 -0
- package/tests/outdated-report.test.sh +155 -0
- package/tests/output-secret-mask-warns.test.sh +73 -0
- package/tests/plugin-hooks-fail-open-under-sh.test.sh +165 -0
- package/tests/plugins-word-order.test.sh +126 -0
- package/tests/powershell-remove-item-guard.test.sh +85 -0
- package/tests/project-dir-naming.test.sh +103 -0
- package/tests/quoted-safe-targets-and-mentions.test.sh +190 -0
- package/tests/reroute-after-block-guard.test.sh +104 -0
- package/tests/secret-guard-documented-promises.test.sh +97 -0
- package/tests/session-plugin-pin-watch.test.sh +45 -0
- package/tests/settings-unreadable-refuses-to-write.test.sh +95 -0
- package/tests/shield-no-silent-adoption.test.py +110 -0
- package/tests/shield-no-silent-adoption.test.sh +46 -0
- package/tests/stop-transcript-write-health.test.sh +46 -0
- package/tests/system-dir-guard-root-erased.test.sh +66 -0
- package/tests/test-account-billing-log.sh +100 -0
- package/tests/test-account-routing-preflight.sh +77 -0
- package/tests/test-agent-sdk-credit-pool-monitor.sh +157 -0
- package/tests/test-agent-view-quota-warn.sh +184 -0
- package/tests/test-agents-md-edit-drift-warner.sh +176 -0
- package/tests/test-agents-md-loader.sh +204 -0
- package/tests/test-agents-md-sync-checker.sh +125 -0
- package/tests/test-ai-slop-punctuation-arrest.sh +280 -0
- package/tests/test-allowlist.sh +60 -0
- package/tests/test-always-allow-pattern-suggester.sh +147 -0
- package/tests/test-anthropic-base-url-guard.sh +88 -0
- package/tests/test-articulated-scope-capture.sh +139 -0
- package/tests/test-attachment-traversal-guard.sh +168 -0
- package/tests/test-aup-block-pattern-logger.sh +315 -0
- package/tests/test-aup-false-positive-helper.sh +188 -0
- package/tests/test-aup-large-tool-output-warner.sh +370 -0
- package/tests/test-aup-retry-loop-guard.sh +341 -0
- package/tests/test-auth-expiry-reminder.sh +303 -0
- package/tests/test-auth-macos-sleep-detector.sh +254 -0
- package/tests/test-auth-path-detector.sh +232 -0
- package/tests/test-auth-status-checker.sh +233 -0
- package/tests/test-authorized-reconfirmation-detector.sh +280 -0
- package/tests/test-background-cost-launch-guard.sh +62 -0
- package/tests/test-bash-allowlist-secondary-check.sh +143 -0
- package/tests/test-bash-fanout-bounded-rewriter.sh +186 -0
- package/tests/test-bash-project-fence.sh +127 -0
- package/tests/test-bg-permission-prompt-warner.sh +221 -0
- package/tests/test-binary-read-detector.sh +173 -0
- package/tests/test-broad-prefix-session-trap-warner.sh +167 -0
- package/tests/test-bulk-delete-target-resolution.sh +49 -0
- package/tests/test-bypass-mode-effective-verifier.sh +179 -0
- package/tests/test-cache-creation-drift-detector.sh +244 -0
- package/tests/test-cache-residue-detector.sh +429 -0
- package/tests/test-cache-tier-logger.sh +59 -0
- package/tests/test-cache-ttl-eviction-detector.sh +282 -0
- package/tests/test-cch-sentinel-precommit-guard.sh +64 -0
- package/tests/test-claim-verify-detector.sh +222 -0
- package/tests/test-claim-vs-caveat-checker.sh +134 -0
- package/tests/test-claude-code-version-pin-advisor.sh +353 -0
- package/tests/test-claude-md-reinjector.sh +173 -0
- package/tests/test-claude-md-size-monitor.sh +107 -0
- package/tests/test-claude-update-budget-guard.sh +132 -0
- package/tests/test-claude-update-smart.sh +91 -0
- package/tests/test-claudemd-tool-prohibition.sh +239 -0
- package/tests/test-cli-config-pinning-detector.sh +233 -0
- package/tests/test-cliff-countdown-advisor.sh +138 -0
- package/tests/test-closure-word-verify-gate.sh +158 -0
- package/tests/test-commit-all-scope-guard.sh +73 -0
- package/tests/test-commitment-carry-forward-arrest.sh +250 -0
- package/tests/test-compact-circuit-breaker.sh +134 -0
- package/tests/test-compact-dispatch-watchdog.sh +147 -0
- package/tests/test-completion-claim-without-verification-detector.sh +326 -0
- package/tests/test-compound-bash-permission-resolver.sh +264 -0
- package/tests/test-compound-command-deny-enforcer.sh +67 -0
- package/tests/test-context-length-budget.sh +68 -0
- package/tests/test-context-usage-drift-alert.sh +52 -22
- package/tests/test-cost-incident-self-audit.sh +94 -0
- package/tests/test-cowork-claude-md-load-checker.sh +257 -0
- package/tests/test-cowork-claudemd-helper.sh +141 -0
- package/tests/test-cowork-fuse-staleness-watcher.sh +287 -0
- package/tests/test-cowork-hook-absence-warner.sh +230 -0
- package/tests/test-cowork-model-picker-advisor.sh +317 -0
- package/tests/test-credential-exfil-guard.sh +62 -0
- package/tests/test-cron-create-receipt.sh +165 -0
- package/tests/test-cross-product-mcp-spawn-detector.sh +112 -0
- package/tests/test-daemon-zombie-worker-surfacer.sh +71 -0
- package/tests/test-daily-cost-guard.sh +131 -0
- package/tests/test-deny-rule-integrity-verifier.sh +288 -0
- package/tests/test-deployment-readback-gate.sh +92 -0
- package/tests/test-deployment-readback-gh-adapter.sh +163 -0
- package/tests/test-disabled-feature-toggle-advisor.sh +78 -0
- package/tests/test-dispatch-allowlist-preflight.sh +385 -0
- package/tests/test-dispatch-liveness-watchdog.sh +319 -0
- package/tests/test-dispatch-receipt.sh +314 -0
- package/tests/test-dotenv-anthropic-key-billing-guard.sh +160 -0
- package/tests/test-echo-probe-spam-detector.sh +143 -0
- package/tests/test-edit-quote-ambiguity-guard.sh +75 -0
- package/tests/test-ephemeral-container-detector.sh +251 -0
- package/tests/test-evidence-claim-gate.sh +291 -0
- package/tests/test-exploration-budget-guard.sh +164 -0
- package/tests/test-extended-thinking-loop-guard.sh +289 -0
- package/tests/test-extended-thinking-resume-warning.sh +240 -0
- package/tests/test-extended-thinking-tool-use-mismatch-detector.sh +236 -0
- package/tests/test-fabricated-command-detector.sh +296 -0
- package/tests/test-false-disk-full-guard.sh +36 -0
- package/tests/test-feature-deprecation-detector.sh +117 -0
- package/tests/test-forbidden-response-phrase-detector.sh +246 -0
- package/tests/test-git-operations-require-approval.sh +53 -0
- package/tests/test-git-push-blast-radius-guard.sh +115 -0
- package/tests/test-goal-iteration-limit-warner.sh +128 -0
- package/tests/test-growthbook-flag-monitor.sh +428 -0
- package/tests/test-halt-signal-detector.sh +120 -0
- package/tests/test-hook-self-disable-detector.sh +232 -0
- package/tests/test-iteration-quality-degradation-detector.sh +244 -0
- package/tests/test-long-session-malformed-tool-call-detector.sh +185 -0
- package/tests/test-marketplace-plugins.sh +193 -0
- package/tests/test-mcp-misdiagnosis-arrest.sh +235 -0
- package/tests/test-mcp-orphan-leak-warner.sh +71 -0
- package/tests/test-mcp-permissions-ask-warner.sh +207 -0
- package/tests/test-mcp-routine-approval-detector.sh +229 -0
- package/tests/test-mcp-startup-bloat-detector.sh +141 -0
- package/tests/test-mcp-stdio-compatibility-test.sh +112 -0
- package/tests/test-memory-chain-audit.sh +59 -0
- package/tests/test-memory-orphan-detector.sh +227 -0
- package/tests/test-model-swap-suggester.sh +368 -0
- package/tests/test-model-version-lock.sh +83 -0
- package/tests/test-multi-file-plan-routing-gate.sh +277 -0
- package/tests/test-multi-window-auth-drift-detector.sh +262 -0
- package/tests/test-nested-spawn-inflight-guard.sh +281 -0
- package/tests/test-no-force-flag.sh +49 -0
- package/tests/test-non-english-quality-warner.sh +229 -0
- package/tests/test-oauth-refresh-monitor.sh +311 -0
- package/tests/test-opus-degradation-tracker.sh +274 -0
- package/tests/test-opus48-routine-task-warning.sh +201 -0
- package/tests/test-opus48-thinking-wedge-advisor.sh +249 -0
- package/tests/test-output-token-spike-detector.sh +315 -0
- package/tests/test-parallel-batch-size-limiter.sh +228 -0
- package/tests/test-parallel-cascade-detector.sh +191 -0
- package/tests/test-partial-view-claim-arrest.sh +272 -0
- package/tests/test-per-prompt-token-cap.sh +136 -0
- package/tests/test-persisted-1m-model-advisor.sh +71 -0
- package/tests/test-plugin-hooks-json-bloat-detector.sh +267 -0
- package/tests/test-post-edit-disk-verify.sh +294 -0
- package/tests/test-pre-bash-sed-line-ending-windows.sh +108 -0
- package/tests/test-pre-execution-claim-detector.sh +366 -0
- package/tests/test-private-key-backup-and-git-credentials.sh +100 -0
- package/tests/test-proxy-capture-suggester.sh +214 -0
- package/tests/test-public-artefact-socratic-narrowing.sh +346 -0
- package/tests/test-quota-anomaly-detector.sh +321 -0
- package/tests/test-quota-reset-audit.sh +81 -0
- package/tests/test-read-loop-detector.sh +137 -0
- package/tests/test-read-once-guard.sh +85 -0
- package/tests/test-receipts-aggregate.sh +143 -0
- package/tests/test-redirect-fragment-warner.sh +130 -0
- package/tests/test-redundant-read-blocker.sh +155 -0
- package/tests/test-refusal-arrest-gate.sh +303 -0
- package/tests/test-remote-control-billing-classifier.sh +125 -0
- package/tests/test-resume-drift-watcher.sh +65 -0
- package/tests/test-rg-replace-flag-detector.sh +175 -0
- package/tests/test-rhetorical-verification-prompt-detector.sh +237 -0
- package/tests/test-rm-safety-net.sh +115 -0
- package/tests/test-route-handler-emptiness-gate.sh +300 -0
- package/tests/test-runtime-binary-change-detector.sh +196 -0
- package/tests/test-same-command-repeat-detector.sh +165 -0
- package/tests/test-same-correction-arrest.sh +165 -0
- package/tests/test-scope-expansion-receipt.sh +207 -0
- package/tests/test-server-side-prompt-injection-detector.sh +181 -0
- package/tests/test-session-persistence-verifier.sh +128 -0
- package/tests/test-session-rate-monitor.sh +284 -0
- package/tests/test-session-start-quota-status.sh +210 -0
- package/tests/test-session-start-safety-check.sh +138 -0
- package/tests/test-settings-hooks-key-restorer.sh +257 -0
- package/tests/test-settings-json-health-check.sh +70 -0
- package/tests/test-settings-regression-tester.sh +197 -0
- package/tests/test-skill-cumulative-size-detector.sh +198 -0
- package/tests/test-skill-description-drop-detector.sh +236 -0
- package/tests/test-skill-truncation-detector.sh +263 -0
- package/tests/test-skills-context-recorder.sh +329 -0
- package/tests/test-skills-load-verifier.sh +184 -0
- package/tests/test-skills-settings-validator.sh +242 -0
- package/tests/test-sonnet-45-deprecation-helper.sh +150 -0
- package/tests/test-spurious-malformed-notice-detector.sh +290 -0
- package/tests/test-sql-bulk-delete-warn.sh +123 -0
- package/tests/test-ssh-key-protect.sh +81 -0
- package/tests/test-stale-temp-settings-detector.sh +161 -0
- package/tests/test-standing-rule-session-surfacer.sh +215 -0
- package/tests/test-starter-hooks-manifest.sh +96 -0
- package/tests/test-stop-hook-sigterm-wrapper.sh +258 -0
- package/tests/test-strict-allowlist.sh +72 -0
- package/tests/test-subagent-boundary-precheck.sh +137 -0
- package/tests/test-subagent-closure-verify-gate.sh +193 -0
- package/tests/test-subagent-destructive-git-guard.sh +86 -0
- package/tests/test-subagent-identity-leak-guard.sh +62 -0
- package/tests/test-subagent-identity-reassertion.sh +61 -0
- package/tests/test-subagent-inheritance-tester.sh +319 -0
- package/tests/test-subagent-permission-mode-guard.sh +61 -0
- package/tests/test-subagent-spawn-verification-enforcer.sh +60 -0
- package/tests/test-subagent-tool-allowlist-enforcer.sh +62 -0
- package/tests/test-subagent-tool-call-limiter.sh +97 -0
- package/tests/test-subscription-api-billing-warner.sh +138 -0
- package/tests/test-subscription-bypass-detector.sh +255 -0
- package/tests/test-temporal-suggestion-detector.sh +183 -0
- package/tests/test-thinking-budget-effort-mismatch-detector.sh +327 -0
- package/tests/test-thinking-stall-detector.sh +151 -0
- package/tests/test-tokenizer-ratio-alert-corpus.sh +77 -0
- package/tests/test-tokenizer-ratio-alert.sh +93 -0
- package/tests/test-tool-result-correlation-checker.sh +264 -0
- package/tests/test-tool-result-size-guard.sh +121 -0
- package/tests/test-transcript-contamination-detector.sh +264 -0
- package/tests/test-trigger-header-parsing.sh +151 -0
- package/tests/test-ultrareview-large-diff-advisor.sh +192 -0
- package/tests/test-userprompt-submit-receipt.sh +181 -0
- package/tests/test-verify-after-publish-reminder.sh +184 -0
- package/tests/test-version-bump-detector.sh +212 -0
- package/tests/test-version-regression-warner.sh +165 -0
- package/tests/test-warn-cron-cost-trap.sh +82 -0
- package/tests/test-webfetch-runaway-guard.sh +77 -0
- package/tests/test-wellness-break-reminder.sh +138 -0
- package/tests/test-windows-destructive-command-guard.sh +169 -0
- package/tests/test-windows-python-stub-detector.sh +146 -0
- package/tests/test-worktree-edit-boundary-guard.sh +219 -0
- package/tests/test-write-byte-integrity-verifier.sh +192 -0
- package/tests/test-xml-format-leak-detector.sh +299 -0
- package/tests/trustfall-mcp-injection-guard.test.sh +183 -0
- package/tests/workspace-lease-guard.test.sh +144 -0
- package/tests/worktree-escape-write-guard.test.sh +68 -0
- package/tests/worktree-hooks-path-fix.test.sh +181 -0
- package/tests/worktree-parent-write-guard.test.sh +51 -0
- package/tests/write-empty-content-guard.test.sh +39 -0
- package/tests/write-nul-corruption-detector.test.sh +29 -0
- package/tests/write-overwrite-unread-content.test.sh +178 -0
- package/tests/wsl-host-disk-space-guard.test.sh +55 -0
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# skill-truncation-detector.sh — Restore the Skill-listing truncation
|
|
3
|
+
# warning that v2.1.144 silently removed.
|
|
4
|
+
#
|
|
5
|
+
# Solves: v2.1.144 (2026-05-19) release note —
|
|
6
|
+
# "Skill-listing truncation is no longer shown as a startup notification
|
|
7
|
+
# — run /doctor for the full breakdown."
|
|
8
|
+
#
|
|
9
|
+
# The change moved the truncation signal from passive (visible at startup,
|
|
10
|
+
# user is told) to active (user has to remember to run /doctor). The three
|
|
11
|
+
# concrete failure modes the old startup notice surfaced — skill-count
|
|
12
|
+
# crossing the limit, name collisions, malformed frontmatter — all now go
|
|
13
|
+
# silent by default.
|
|
14
|
+
#
|
|
15
|
+
# This hook fires on SessionStart, scans the user's skill directories for
|
|
16
|
+
# the same three failure modes, and emits a system-reminder when any are
|
|
17
|
+
# detected. Effectively restores the v2.1.143-and-earlier behavior at the
|
|
18
|
+
# hook layer.
|
|
19
|
+
#
|
|
20
|
+
# This is the "recognition-without-arrest" pattern's *opposite* failure mode:
|
|
21
|
+
# the harness used to surface a recognition signal, and now refuses to. The
|
|
22
|
+
# hook re-surfaces it.
|
|
23
|
+
#
|
|
24
|
+
# Related Issues:
|
|
25
|
+
# #60226 (@suwayama, 2026-05-18) — recognition-without-arrest framework
|
|
26
|
+
# Anthropic v2.1.144 release notes (2026-05-19) — the notification removal
|
|
27
|
+
#
|
|
28
|
+
# TRIGGER: SessionStart
|
|
29
|
+
# MATCHER: (none)
|
|
30
|
+
#
|
|
31
|
+
# CONFIGURATION (environment variables):
|
|
32
|
+
# CC_SKILL_COUNT_THRESHOLD default 80 — warn when skills exceed this count
|
|
33
|
+
# CC_SKILL_DIRS default "~/.claude/skills" — colon-separated
|
|
34
|
+
# list of skill directories
|
|
35
|
+
# to scan
|
|
36
|
+
# CC_SKILL_TRUNCATION_DISABLE set to "1" to disable the detector
|
|
37
|
+
#
|
|
38
|
+
# USAGE (settings.json):
|
|
39
|
+
# {
|
|
40
|
+
# "hooks": {
|
|
41
|
+
# "SessionStart": [{
|
|
42
|
+
# "matcher": "",
|
|
43
|
+
# "hooks": [{
|
|
44
|
+
# "type": "command",
|
|
45
|
+
# "command": "~/.claude/hooks/skill-truncation-detector.sh"
|
|
46
|
+
# }]
|
|
47
|
+
# }]
|
|
48
|
+
# }
|
|
49
|
+
# }
|
|
50
|
+
|
|
51
|
+
set -uo pipefail
|
|
52
|
+
|
|
53
|
+
[ "${CC_SKILL_TRUNCATION_DISABLE:-0}" = "1" ] && exit 0
|
|
54
|
+
|
|
55
|
+
THRESHOLD="${CC_SKILL_COUNT_THRESHOLD:-80}"
|
|
56
|
+
DEFAULT_DIRS="${HOME}/.claude/skills"
|
|
57
|
+
SKILL_DIRS="${CC_SKILL_DIRS:-$DEFAULT_DIRS}"
|
|
58
|
+
LOG_DIR="${HOME}/.claude/logs"
|
|
59
|
+
mkdir -p "$LOG_DIR" 2>/dev/null
|
|
60
|
+
|
|
61
|
+
INPUT=$(cat 2>/dev/null || true)
|
|
62
|
+
SESSION_ID=$(printf '%s' "$INPUT" | jq -r '.session_id // empty' 2>/dev/null)
|
|
63
|
+
[ -z "$SESSION_ID" ] && SESSION_ID="unknown-$(date +%s)"
|
|
64
|
+
|
|
65
|
+
# Once per session, even if multiple SessionStart hooks fire.
|
|
66
|
+
WARN_LOG="$LOG_DIR/skill-truncation-warned-$SESSION_ID"
|
|
67
|
+
[ -f "$WARN_LOG" ] && exit 0
|
|
68
|
+
|
|
69
|
+
# Collect skill files. Each skill is a directory containing SKILL.md, per
|
|
70
|
+
# the standard layout used by Anthropic and most plugin authors.
|
|
71
|
+
SKILL_FILES=()
|
|
72
|
+
IFS=':' read -ra DIRS <<< "$SKILL_DIRS"
|
|
73
|
+
for dir in "${DIRS[@]}"; do
|
|
74
|
+
dir="${dir/#\~/$HOME}"
|
|
75
|
+
[ -d "$dir" ] || continue
|
|
76
|
+
while IFS= read -r f; do
|
|
77
|
+
SKILL_FILES+=("$f")
|
|
78
|
+
done < <(find "$dir" -maxdepth 3 -name "SKILL.md" 2>/dev/null)
|
|
79
|
+
done
|
|
80
|
+
|
|
81
|
+
SKILL_COUNT=${#SKILL_FILES[@]}
|
|
82
|
+
|
|
83
|
+
# Check 1: skill count near or above threshold
|
|
84
|
+
COUNT_WARNING=""
|
|
85
|
+
if [ "$SKILL_COUNT" -ge "$THRESHOLD" ]; then
|
|
86
|
+
COUNT_WARNING="Skill count is $SKILL_COUNT, at or above the configured threshold of $THRESHOLD. Some skills may be truncated from the system context."
|
|
87
|
+
fi
|
|
88
|
+
|
|
89
|
+
# Check 2: name collisions. Read the `name:` field from frontmatter of each
|
|
90
|
+
# skill file. Multiple skills with the same name will collide at registration.
|
|
91
|
+
declare -A NAMES_SEEN
|
|
92
|
+
COLLISION_LIST=""
|
|
93
|
+
MALFORMED_LIST=""
|
|
94
|
+
for f in "${SKILL_FILES[@]}"; do
|
|
95
|
+
# Extract name from YAML frontmatter (between first two --- lines).
|
|
96
|
+
NAME=$(awk '/^---$/{c++; next} c==1 && /^name:/{sub(/^name:[[:space:]]*/, ""); print; exit}' "$f" 2>/dev/null | tr -d '"' | tr -d "'" | xargs)
|
|
97
|
+
if [ -z "$NAME" ]; then
|
|
98
|
+
# No name field, no frontmatter, or unreadable. Skill registration
|
|
99
|
+
# falls back to directory name in some versions; in others it fails
|
|
100
|
+
# silently. Either way, this is a failure mode the old notice
|
|
101
|
+
# surfaced.
|
|
102
|
+
MALFORMED_LIST="${MALFORMED_LIST} - ${f/#$HOME/~}: no 'name:' field in frontmatter
|
|
103
|
+
"
|
|
104
|
+
continue
|
|
105
|
+
fi
|
|
106
|
+
if [ -n "${NAMES_SEEN[$NAME]:-}" ]; then
|
|
107
|
+
COLLISION_LIST="${COLLISION_LIST} - '$NAME': ${NAMES_SEEN[$NAME]/#$HOME/~} and ${f/#$HOME/~}
|
|
108
|
+
"
|
|
109
|
+
else
|
|
110
|
+
NAMES_SEEN[$NAME]="$f"
|
|
111
|
+
fi
|
|
112
|
+
done
|
|
113
|
+
|
|
114
|
+
# If no findings, exit silently. (The hook is a tripwire; absence of
|
|
115
|
+
# finding is the common case and should not be noisy.)
|
|
116
|
+
if [ -z "$COUNT_WARNING" ] && [ -z "$COLLISION_LIST" ] && [ -z "$MALFORMED_LIST" ]; then
|
|
117
|
+
: > "$WARN_LOG"
|
|
118
|
+
exit 0
|
|
119
|
+
fi
|
|
120
|
+
|
|
121
|
+
# Build the system-reminder.
|
|
122
|
+
{
|
|
123
|
+
echo "<system-reminder>"
|
|
124
|
+
echo "SKILL-LISTING TRUNCATION DETECTOR — restoring the startup signal"
|
|
125
|
+
echo "that v2.1.144 silently removed."
|
|
126
|
+
echo ""
|
|
127
|
+
if [ -n "$COUNT_WARNING" ]; then
|
|
128
|
+
echo "* COUNT: $COUNT_WARNING"
|
|
129
|
+
echo ""
|
|
130
|
+
fi
|
|
131
|
+
if [ -n "$COLLISION_LIST" ]; then
|
|
132
|
+
echo "* NAME COLLISIONS (one of the colliding skills will not load):"
|
|
133
|
+
printf '%s' "$COLLISION_LIST"
|
|
134
|
+
echo ""
|
|
135
|
+
fi
|
|
136
|
+
if [ -n "$MALFORMED_LIST" ]; then
|
|
137
|
+
echo "* MALFORMED FRONTMATTER (skills without a 'name:' field):"
|
|
138
|
+
printf '%s' "$MALFORMED_LIST"
|
|
139
|
+
echo ""
|
|
140
|
+
fi
|
|
141
|
+
echo "Run \`/doctor\` for the full Claude Code report on skill"
|
|
142
|
+
echo "registration. Fix the listed items above to ensure all skills"
|
|
143
|
+
echo "register correctly."
|
|
144
|
+
echo ""
|
|
145
|
+
echo "To silence this detector intentionally, set"
|
|
146
|
+
echo "CC_SKILL_TRUNCATION_DISABLE=1 in your environment."
|
|
147
|
+
echo "</system-reminder>"
|
|
148
|
+
} >&2
|
|
149
|
+
|
|
150
|
+
# Mark warned so we don't double-fire in this session.
|
|
151
|
+
: > "$WARN_LOG"
|
|
152
|
+
|
|
153
|
+
# SessionStart hooks should not block; we surface the info and exit 0.
|
|
154
|
+
exit 0
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# skills-context-recorder.sh — Record active skill at each user prompt for hook integration
|
|
3
|
+
#
|
|
4
|
+
# Background:
|
|
5
|
+
# Claude Code's Skills feature (v2.x) does not expose which skill is active
|
|
6
|
+
# during a given tool call to PreToolUse / PostToolUse hooks. Issue #62108
|
|
7
|
+
# asks for an `active_skill` field in hook input. Issue #62078 asks for an
|
|
8
|
+
# env var exposing the current skill name. Neither is implemented.
|
|
9
|
+
#
|
|
10
|
+
# The workaround is to record skill activations operator-side. When a user
|
|
11
|
+
# invokes a skill via `/<skill-name>` at the start of their prompt, this hook
|
|
12
|
+
# captures the name and persists it to a per-session log. Other hooks can
|
|
13
|
+
# read the log to know the most recent skill in the current session — the
|
|
14
|
+
# closest operator-side approximation of the active_skill field.
|
|
15
|
+
#
|
|
16
|
+
# The hook also captures auto-loaded skills mentioned in the prompt via
|
|
17
|
+
# `[skill: name]` markers (some skills inject this on activation, others
|
|
18
|
+
# don't — this is best-effort and pairs with the slash-command path).
|
|
19
|
+
#
|
|
20
|
+
# Reference:
|
|
21
|
+
# #62108 — active_skill field request (PreToolUse hook input)
|
|
22
|
+
# #62078 — env var request for current skill name
|
|
23
|
+
# Skills cluster field guide: https://gist.github.com/yurukusa/d00b2d32505ef67572baacbd6fad3d77
|
|
24
|
+
#
|
|
25
|
+
# What this hook does:
|
|
26
|
+
# On UserPromptSubmit, parse the prompt's first non-blank line for one of:
|
|
27
|
+
# - `/<skill-name>` at column 0 (canonical slash-command invocation)
|
|
28
|
+
# - `[skill: <skill-name>]` or `<skill name="...">` markers (skill self-announce)
|
|
29
|
+
# When matched, append a 4-field pipe-delimited record to a per-session log:
|
|
30
|
+
# TIMESTAMP_ISO8601 | SESSION_ID | SOURCE | SKILL_NAME
|
|
31
|
+
# where SOURCE is `slash` (slash command), `marker` (in-prompt marker), or
|
|
32
|
+
# `manual` (operator override via env var CC_ACTIVE_SKILL).
|
|
33
|
+
#
|
|
34
|
+
# Default log: ~/.claude/skills-context.log (session-tagged in the SESSION_ID field).
|
|
35
|
+
# Companion helper script (cc-active-skill) at the bottom of this file's docs
|
|
36
|
+
# can be sourced to read "current skill for session X" from any other hook.
|
|
37
|
+
#
|
|
38
|
+
# When this hook does NOT record:
|
|
39
|
+
# - CC_SKILLS_CONTEXT_RECORDER_DISABLE=1
|
|
40
|
+
# - The user prompt does not contain a recognizable skill invocation pattern
|
|
41
|
+
# - The user prompt is empty or unparseable
|
|
42
|
+
#
|
|
43
|
+
# Hook config (settings.json):
|
|
44
|
+
# {
|
|
45
|
+
# "hooks": {
|
|
46
|
+
# "UserPromptSubmit": [{
|
|
47
|
+
# "matcher": "",
|
|
48
|
+
# "hooks": [{ "type": "command", "command": "bash ~/.claude/hooks/skills-context-recorder.sh" }]
|
|
49
|
+
# }]
|
|
50
|
+
# }
|
|
51
|
+
# }
|
|
52
|
+
#
|
|
53
|
+
# Env vars:
|
|
54
|
+
# CC_SKILLS_CONTEXT_RECORDER_DISABLE=1 — never log
|
|
55
|
+
# CC_SKILLS_CONTEXT_RECORDER_QUIET=1 — log silently (no stderr advisory)
|
|
56
|
+
# CC_SKILLS_CONTEXT_LOG_PATH=<path> — override default log location
|
|
57
|
+
# CC_SKILLS_CONTEXT_MAX_LINES=<n> — log rotation threshold (default 1000)
|
|
58
|
+
# CC_ACTIVE_SKILL=<name> — operator override; recorded as source=manual
|
|
59
|
+
#
|
|
60
|
+
# Reading the log from another hook (workaround for the missing active_skill field):
|
|
61
|
+
# most_recent_skill_for_session() {
|
|
62
|
+
# local session_id="$1"
|
|
63
|
+
# local log="${CC_SKILLS_CONTEXT_LOG_PATH:-$HOME/.claude/skills-context.log}"
|
|
64
|
+
# grep "|${session_id}|" "$log" 2>/dev/null | tail -1 | awk -F'|' '{print $4}'
|
|
65
|
+
# }
|
|
66
|
+
#
|
|
67
|
+
# Privacy: the hook records skill names only (no prompt content, no tool args).
|
|
68
|
+
# Skill names are human-chosen identifiers — typically short ASCII strings.
|
|
69
|
+
#
|
|
70
|
+
# The registration was missing from this header. The installer reads TRIGGER
|
|
71
|
+
# and MATCHER from here and falls back to PreToolUse / Bash when both are
|
|
72
|
+
# absent, so this hook was being registered at a moment where the field it
|
|
73
|
+
# reads is always empty: it installed, it appeared in the settings, and it
|
|
74
|
+
# did nothing. Measured 2026-08-04 across examples/: 14 files were like this.
|
|
75
|
+
# TRIGGER: UserPromptSubmit
|
|
76
|
+
# MATCHER: ""
|
|
77
|
+
|
|
78
|
+
set -u
|
|
79
|
+
|
|
80
|
+
# Disable path
|
|
81
|
+
if [ "${CC_SKILLS_CONTEXT_RECORDER_DISABLE:-0}" = "1" ]; then
|
|
82
|
+
exit 0
|
|
83
|
+
fi
|
|
84
|
+
|
|
85
|
+
INPUT=$(cat 2>/dev/null || true)
|
|
86
|
+
[ -z "$INPUT" ] && exit 0
|
|
87
|
+
|
|
88
|
+
# Extract user prompt and session ID. Fall back to grep when jq is missing so the
|
|
89
|
+
# hook stays useful in minimal environments.
|
|
90
|
+
if command -v jq >/dev/null 2>&1; then
|
|
91
|
+
USER_PROMPT=$(printf '%s' "$INPUT" | jq -r '.user_prompt // .prompt // empty' 2>/dev/null || echo "")
|
|
92
|
+
SESSION_ID=$(printf '%s' "$INPUT" | jq -r '.session_id // empty' 2>/dev/null || echo "")
|
|
93
|
+
else
|
|
94
|
+
USER_PROMPT=$(printf '%s' "$INPUT" | sed -n 's/.*"user_prompt"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' | head -1)
|
|
95
|
+
[ -z "$USER_PROMPT" ] && USER_PROMPT=$(printf '%s' "$INPUT" | sed -n 's/.*"prompt"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' | head -1)
|
|
96
|
+
SESSION_ID=$(printf '%s' "$INPUT" | sed -n 's/.*"session_id"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' | head -1)
|
|
97
|
+
fi
|
|
98
|
+
|
|
99
|
+
[ -z "$SESSION_ID" ] && SESSION_ID="no-session-id"
|
|
100
|
+
|
|
101
|
+
# Determine source and skill name. Priority: manual override → slash command →
|
|
102
|
+
# in-prompt marker. First match wins.
|
|
103
|
+
SOURCE=""
|
|
104
|
+
SKILL=""
|
|
105
|
+
|
|
106
|
+
# 1. Operator override via CC_ACTIVE_SKILL env var
|
|
107
|
+
if [ -n "${CC_ACTIVE_SKILL:-}" ]; then
|
|
108
|
+
SOURCE="manual"
|
|
109
|
+
SKILL="$CC_ACTIVE_SKILL"
|
|
110
|
+
fi
|
|
111
|
+
|
|
112
|
+
# 2. Slash command at start of first non-blank line. Leading whitespace on the
|
|
113
|
+
# first line is tolerated; the slash must be the first non-blank character.
|
|
114
|
+
if [ -z "$SKILL" ] && [ -n "$USER_PROMPT" ]; then
|
|
115
|
+
FIRST_LINE=$(printf '%s' "$USER_PROMPT" | awk 'NF{print; exit}')
|
|
116
|
+
TRIMMED=$(printf '%s' "$FIRST_LINE" | sed 's/^[[:space:]]*//')
|
|
117
|
+
if printf '%s' "$TRIMMED" | grep -qE '^/[A-Za-z][A-Za-z0-9_:-]*'; then
|
|
118
|
+
SKILL=$(printf '%s' "$TRIMMED" | grep -oE '^/[A-Za-z][A-Za-z0-9_:-]*' | sed 's|^/||' | head -c 64)
|
|
119
|
+
SOURCE="slash"
|
|
120
|
+
fi
|
|
121
|
+
fi
|
|
122
|
+
|
|
123
|
+
# 3. In-prompt marker (best-effort)
|
|
124
|
+
if [ -z "$SKILL" ] && [ -n "$USER_PROMPT" ]; then
|
|
125
|
+
MARKER=$(printf '%s' "$USER_PROMPT" | grep -oE '\[skill:[[:space:]]*[A-Za-z][A-Za-z0-9_-]+\]' | head -1)
|
|
126
|
+
if [ -n "$MARKER" ]; then
|
|
127
|
+
SKILL=$(printf '%s' "$MARKER" | sed -E 's/\[skill:[[:space:]]*([A-Za-z][A-Za-z0-9_-]+)\]/\1/' | head -c 64)
|
|
128
|
+
SOURCE="marker"
|
|
129
|
+
fi
|
|
130
|
+
fi
|
|
131
|
+
|
|
132
|
+
# Strip pipe characters and newlines as a schema-preservation guard. Skill names
|
|
133
|
+
# are normally ASCII identifiers so this is a defensive measure.
|
|
134
|
+
SKILL=$(printf '%s' "$SKILL" | tr -d '|\n\r')
|
|
135
|
+
SESSION_ID=$(printf '%s' "$SESSION_ID" | tr -d '|\n\r' | head -c 80)
|
|
136
|
+
|
|
137
|
+
# No skill detected → silent exit (the common case)
|
|
138
|
+
[ -z "$SKILL" ] && exit 0
|
|
139
|
+
|
|
140
|
+
LOG_PATH="${CC_SKILLS_CONTEXT_LOG_PATH:-$HOME/.claude/skills-context.log}"
|
|
141
|
+
LOG_DIR=$(dirname "$LOG_PATH")
|
|
142
|
+
mkdir -p "$LOG_DIR" 2>/dev/null || exit 0
|
|
143
|
+
|
|
144
|
+
TIMESTAMP=$(date -u '+%Y-%m-%dT%H:%M:%SZ')
|
|
145
|
+
printf '%s|%s|%s|%s\n' "$TIMESTAMP" "$SESSION_ID" "$SOURCE" "$SKILL" >> "$LOG_PATH" 2>/dev/null || true
|
|
146
|
+
|
|
147
|
+
# Rotate when the log exceeds the configured threshold. Keep the most recent half
|
|
148
|
+
# so the workaround stays useful for cross-session lookback.
|
|
149
|
+
MAX_LINES="${CC_SKILLS_CONTEXT_MAX_LINES:-1000}"
|
|
150
|
+
if [ -f "$LOG_PATH" ]; then
|
|
151
|
+
CURRENT_LINES=$(wc -l < "$LOG_PATH" 2>/dev/null || echo 0)
|
|
152
|
+
if [ "$CURRENT_LINES" -gt "$MAX_LINES" ] 2>/dev/null; then
|
|
153
|
+
KEEP=$((MAX_LINES / 2))
|
|
154
|
+
[ "$KEEP" -lt 1 ] && KEEP=1
|
|
155
|
+
tail -n "$KEEP" "$LOG_PATH" > "${LOG_PATH}.tmp" 2>/dev/null && mv "${LOG_PATH}.tmp" "$LOG_PATH" 2>/dev/null || true
|
|
156
|
+
fi
|
|
157
|
+
fi
|
|
158
|
+
|
|
159
|
+
# Stderr advisory: one line summarizing the recorded activation. Silent when
|
|
160
|
+
# explicitly muted. Keeps the operator aware that the workaround is in effect
|
|
161
|
+
# without flooding the terminal.
|
|
162
|
+
if [ "${CC_SKILLS_CONTEXT_RECORDER_QUIET:-0}" != "1" ]; then
|
|
163
|
+
printf '[skills-context-recorder] recorded skill=%s source=%s session=%s\n' \
|
|
164
|
+
"$SKILL" "$SOURCE" "${SESSION_ID:0:12}" >&2
|
|
165
|
+
fi
|
|
166
|
+
|
|
167
|
+
exit 0
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# ================================================================
|
|
3
|
+
# skills-load-verifier.sh — Warn when a SKILL.md cannot be loaded
|
|
4
|
+
# ================================================================
|
|
5
|
+
# PURPOSE:
|
|
6
|
+
# This hook reports at session start via hookSpecificOutput /
|
|
7
|
+
# additionalContext. Without the TRIGGER header below, the
|
|
8
|
+
# installer registered it under the default PreToolUse/Bash,
|
|
9
|
+
# so it fired on every Bash call and never ran at session start.
|
|
10
|
+
#
|
|
11
|
+
# TRIGGER: SessionStart
|
|
12
|
+
# MATCHER: ""
|
|
13
|
+
# ================================================================
|
|
14
|
+
|
|
15
|
+
set -u
|
|
16
|
+
INPUT=$(cat)
|
|
17
|
+
MIN_DESC_LEN="${CC_SKILLS_MIN_DESC_LEN:-10}"
|
|
18
|
+
if [ -n "${CC_SKILLS_DIRS:-}" ]; then
|
|
19
|
+
IFS=':' read -ra SKILLS_DIRS <<< "$CC_SKILLS_DIRS"
|
|
20
|
+
else
|
|
21
|
+
SKILLS_DIRS=(
|
|
22
|
+
"$HOME/.claude/skills"
|
|
23
|
+
".claude/skills"
|
|
24
|
+
)
|
|
25
|
+
fi
|
|
26
|
+
FINDINGS=()
|
|
27
|
+
for skills_root in "${SKILLS_DIRS[@]}"; do
|
|
28
|
+
[ -d "$skills_root" ] || continue
|
|
29
|
+
for skill_dir in "$skills_root"/*; do
|
|
30
|
+
[ -d "$skill_dir" ] || continue
|
|
31
|
+
skill_name_from_dir=$(basename "$skill_dir")
|
|
32
|
+
skill_md="$skill_dir/SKILL.md"
|
|
33
|
+
if [ ! -f "$skill_md" ]; then
|
|
34
|
+
FINDINGS+=("$skill_dir: missing SKILL.md (directory present but no SKILL.md file)")
|
|
35
|
+
continue
|
|
36
|
+
fi
|
|
37
|
+
if [ ! -r "$skill_md" ]; then
|
|
38
|
+
FINDINGS+=("$skill_md: unreadable (permission or dangling symlink)")
|
|
39
|
+
continue
|
|
40
|
+
fi
|
|
41
|
+
first_line=$(head -n 1 "$skill_md" 2>/dev/null || echo "")
|
|
42
|
+
if [ "$first_line" != "---" ]; then
|
|
43
|
+
FINDINGS+=("$skill_md: missing YAML frontmatter (file does not start with ---)")
|
|
44
|
+
continue
|
|
45
|
+
fi
|
|
46
|
+
frontmatter=$(awk '/^---$/{c++; next} c==1{print} c>=2{exit}' "$skill_md" 2>/dev/null)
|
|
47
|
+
if [ -z "$frontmatter" ]; then
|
|
48
|
+
FINDINGS+=("$skill_md: empty or unterminated frontmatter block")
|
|
49
|
+
continue
|
|
50
|
+
fi
|
|
51
|
+
name=$(printf '%s\n' "$frontmatter" | grep -E '^name:[[:space:]]*' | head -n 1 | sed -E 's/^name:[[:space:]]*//; s/[[:space:]]+$//; s/^["'\'']//; s/["'\'']$//')
|
|
52
|
+
if [ -z "$name" ]; then
|
|
53
|
+
FINDINGS+=("$skill_md: missing or empty 'name' field in frontmatter")
|
|
54
|
+
continue
|
|
55
|
+
fi
|
|
56
|
+
description=$(printf '%s\n' "$frontmatter" | grep -E '^description:[[:space:]]*' | head -n 1 | sed -E 's/^description:[[:space:]]*//; s/[[:space:]]+$//; s/^["'\'']//; s/["'\'']$//')
|
|
57
|
+
if [ -z "$description" ]; then
|
|
58
|
+
FINDINGS+=("$skill_md: missing or empty 'description' field in frontmatter")
|
|
59
|
+
continue
|
|
60
|
+
fi
|
|
61
|
+
desc_len=${#description}
|
|
62
|
+
if [ "$desc_len" -lt "$MIN_DESC_LEN" ]; then
|
|
63
|
+
FINDINGS+=("$skill_md: 'description' too short ($desc_len chars, minimum $MIN_DESC_LEN) — will likely be skipped or surface poorly")
|
|
64
|
+
continue
|
|
65
|
+
fi
|
|
66
|
+
if [ "$name" != "$skill_name_from_dir" ]; then
|
|
67
|
+
FINDINGS+=("$skill_md: 'name: $name' does not match directory name '$skill_name_from_dir' (slash command will use the frontmatter name, not the directory)")
|
|
68
|
+
continue
|
|
69
|
+
fi
|
|
70
|
+
done
|
|
71
|
+
done
|
|
72
|
+
[ ${#FINDINGS[@]} -eq 0 ] && exit 0
|
|
73
|
+
MSG="DETECTED: Skills configured but malformed in a way that will silently fail to load.
|
|
74
|
+
Each Skill below has a structural problem that the Claude Code runtime does not surface as an error. The session proceeds without the Skill, and the model loses access to its slash command and instructions without any warning. Common causes: incomplete copy-paste from documentation, hand-edited frontmatter, missing SKILL.md after directory rename.
|
|
75
|
+
Findings:"
|
|
76
|
+
for finding in "${FINDINGS[@]}"; do
|
|
77
|
+
MSG="$MSG
|
|
78
|
+
- $finding"
|
|
79
|
+
done
|
|
80
|
+
MSG="$MSG
|
|
81
|
+
To fix each finding: open the SKILL.md file, ensure the frontmatter has the form
|
|
82
|
+
---
|
|
83
|
+
name: <kebab-case-name-matching-directory>
|
|
84
|
+
description: <one-sentence summary, at least $MIN_DESC_LEN chars>
|
|
85
|
+
---
|
|
86
|
+
After fixing, restart the session to verify the Skill loads. See related issues:
|
|
87
|
+
https://github.com/anthropics/claude-code/issues/62421 (settings-side fabrication)
|
|
88
|
+
https://github.com/anthropics/claude-code/issues/62049 (paths field silent no-op)"
|
|
89
|
+
jq -n --arg msg "$MSG" '
|
|
90
|
+
{
|
|
91
|
+
"hookSpecificOutput": {
|
|
92
|
+
"hookEventName": "SessionStart",
|
|
93
|
+
"additionalContext": $msg
|
|
94
|
+
}
|
|
95
|
+
}'
|
|
96
|
+
exit 0
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# ================================================================
|
|
3
|
+
# skills-settings-validator.sh — Detect fabricated Skills-related
|
|
4
|
+
# settings fields in settings.json with no validation
|
|
5
|
+
# ================================================================
|
|
6
|
+
# PURPOSE:
|
|
7
|
+
# Issue #62421 documents Claude Code accepting non-existent
|
|
8
|
+
# Skills-related settings fields (e.g. `disabledSkills`) without
|
|
9
|
+
# validation. A sub-agent or operator writes the fabricated field
|
|
10
|
+
# into ~/.claude/settings.json or .claude/settings.local.json;
|
|
11
|
+
# the write succeeds, restart succeeds, the targeted skills
|
|
12
|
+
# remain active. Silent no-op.
|
|
13
|
+
#
|
|
14
|
+
# The runtime has no schema validation for settings.json, so
|
|
15
|
+
# typos, hallucinated fields, and out-of-date examples all
|
|
16
|
+
# produce the same silent acceptance. Operators discover the
|
|
17
|
+
# non-effect by trial-and-error, often after many sessions.
|
|
18
|
+
#
|
|
19
|
+
# DETECTION:
|
|
20
|
+
# At SessionStart, scan settings.json and settings.local.json
|
|
21
|
+
# for top-level keys matching common Skills-fabrication patterns:
|
|
22
|
+
# - disabledSkills, enabledSkills (the canonical fabrication)
|
|
23
|
+
# - skillsConfig, skillConfig, skillsSettings
|
|
24
|
+
# - skillRouting, skillFilter, skillAllowlist, skillDenylist
|
|
25
|
+
# - excludeSkills, includeSkills, allowedSkills, deniedSkills
|
|
26
|
+
# These are the names sub-agents most commonly invent when asked
|
|
27
|
+
# to "disable a skill" via settings.json. None exist in the
|
|
28
|
+
# actual Claude Code schema.
|
|
29
|
+
#
|
|
30
|
+
# TRIGGER: SessionStart
|
|
31
|
+
# MATCHER: (none)
|
|
32
|
+
#
|
|
33
|
+
# OUTPUT:
|
|
34
|
+
# When fabricated fields detected: a system-reminder via
|
|
35
|
+
# hookSpecificOutput.additionalContext warning the model and
|
|
36
|
+
# operator that the fields will be silently ignored, and
|
|
37
|
+
# listing them by source file.
|
|
38
|
+
#
|
|
39
|
+
# CONFIGURATION:
|
|
40
|
+
# CC_SKILLS_SETTINGS_FILES — colon-separated list of settings
|
|
41
|
+
# files to scan. Default scans
|
|
42
|
+
# ~/.claude/settings.json,
|
|
43
|
+
# ~/.claude/settings.local.json,
|
|
44
|
+
# .claude/settings.json,
|
|
45
|
+
# .claude/settings.local.json
|
|
46
|
+
# CC_SKILLS_EXTRA_PATTERNS — additional space-separated field
|
|
47
|
+
# names to flag as fabricated.
|
|
48
|
+
#
|
|
49
|
+
# RELATED ISSUES:
|
|
50
|
+
# https://github.com/anthropics/claude-code/issues/62421
|
|
51
|
+
# ================================================================
|
|
52
|
+
|
|
53
|
+
set -u
|
|
54
|
+
|
|
55
|
+
# Default fabricated-field patterns. Additional patterns can be
|
|
56
|
+
# added via CC_SKILLS_EXTRA_PATTERNS.
|
|
57
|
+
FABRICATED_FIELDS=(
|
|
58
|
+
disabledSkills
|
|
59
|
+
enabledSkills
|
|
60
|
+
skillsConfig
|
|
61
|
+
skillConfig
|
|
62
|
+
skillsSettings
|
|
63
|
+
skillRouting
|
|
64
|
+
skillFilter
|
|
65
|
+
skillAllowlist
|
|
66
|
+
skillDenylist
|
|
67
|
+
excludeSkills
|
|
68
|
+
includeSkills
|
|
69
|
+
allowedSkills
|
|
70
|
+
deniedSkills
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
if [ -n "${CC_SKILLS_EXTRA_PATTERNS:-}" ]; then
|
|
74
|
+
for pat in $CC_SKILLS_EXTRA_PATTERNS; do
|
|
75
|
+
FABRICATED_FIELDS+=("$pat")
|
|
76
|
+
done
|
|
77
|
+
fi
|
|
78
|
+
|
|
79
|
+
# Discover settings files. Default scans both global and project
|
|
80
|
+
# scope, both regular and local variants.
|
|
81
|
+
if [ -n "${CC_SKILLS_SETTINGS_FILES:-}" ]; then
|
|
82
|
+
IFS=':' read -ra SETTINGS_FILES <<< "$CC_SKILLS_SETTINGS_FILES"
|
|
83
|
+
else
|
|
84
|
+
SETTINGS_FILES=(
|
|
85
|
+
"$HOME/.claude/settings.json"
|
|
86
|
+
"$HOME/.claude/settings.local.json"
|
|
87
|
+
".claude/settings.json"
|
|
88
|
+
".claude/settings.local.json"
|
|
89
|
+
)
|
|
90
|
+
fi
|
|
91
|
+
|
|
92
|
+
# Detection. For each file that exists, jq-read its top-level
|
|
93
|
+
# keys and check for any fabricated-field match.
|
|
94
|
+
FINDINGS=()
|
|
95
|
+
for file in "${SETTINGS_FILES[@]}"; do
|
|
96
|
+
[ -f "$file" ] || continue
|
|
97
|
+
# Skip if not valid JSON.
|
|
98
|
+
jq empty "$file" 2>/dev/null || continue
|
|
99
|
+
# Read top-level keys.
|
|
100
|
+
KEYS=$(jq -r 'keys[]' "$file" 2>/dev/null || echo "")
|
|
101
|
+
for key in $KEYS; do
|
|
102
|
+
for fab in "${FABRICATED_FIELDS[@]}"; do
|
|
103
|
+
if [ "$key" = "$fab" ]; then
|
|
104
|
+
FINDINGS+=("$file: $key")
|
|
105
|
+
fi
|
|
106
|
+
done
|
|
107
|
+
done
|
|
108
|
+
done
|
|
109
|
+
|
|
110
|
+
# Exit clean if nothing fabricated.
|
|
111
|
+
[ ${#FINDINGS[@]} -eq 0 ] && exit 0
|
|
112
|
+
|
|
113
|
+
# Build the warning message.
|
|
114
|
+
MSG="DETECTED: Skills-related settings fields with no schema definition (will be silently ignored).
|
|
115
|
+
|
|
116
|
+
These fields do not exist in the Claude Code settings schema. Writing them produces no error and no effect — the targeted skills remain active regardless. Common cause: a sub-agent invented the field name when asked to disable a skill via settings.json (issue #62421).
|
|
117
|
+
|
|
118
|
+
Findings:"
|
|
119
|
+
for finding in "${FINDINGS[@]}"; do
|
|
120
|
+
MSG="$MSG
|
|
121
|
+
- $finding"
|
|
122
|
+
done
|
|
123
|
+
|
|
124
|
+
MSG="$MSG
|
|
125
|
+
|
|
126
|
+
To actually disable a skill, remove or rename the SKILL.md file from the skill directory. To filter at runtime, use a PreToolUse hook that checks active context rather than relying on a non-existent settings field. See:
|
|
127
|
+
https://github.com/anthropics/claude-code/issues/62421"
|
|
128
|
+
|
|
129
|
+
# Emit as JSON system-reminder so it surfaces to both the operator
|
|
130
|
+
# (stderr fallback) and the model (additionalContext).
|
|
131
|
+
jq -n --arg msg "$MSG" '
|
|
132
|
+
{
|
|
133
|
+
"hookSpecificOutput": {
|
|
134
|
+
"hookEventName": "SessionStart",
|
|
135
|
+
"additionalContext": $msg
|
|
136
|
+
}
|
|
137
|
+
}'
|
|
138
|
+
|
|
139
|
+
exit 0
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# sonnet-45-deprecation-helper.sh — Surface model lifecycle awareness when Claude.ai removes Sonnet 4.5
|
|
3
|
+
#
|
|
4
|
+
# Background:
|
|
5
|
+
# In late May 2026, Anthropic removed Sonnet 4.5 (claude-sonnet-4-5-20250929) from the
|
|
6
|
+
# Claude.ai chat UI dropdown, defaulting users to Sonnet 4.6. Users who relied on 4.5
|
|
7
|
+
# for creative writing, instruction following, or its specific conversational tone
|
|
8
|
+
# reported widespread dissatisfaction (r/ClaudeAI thread "Sonnet 4.5 is gone for me"
|
|
9
|
+
# accumulated 75+ upvotes / 98+ comments; the companion thread "Sonnet 4.5 disappeared?
|
|
10
|
+
# Claude 4.8 soon?" reached 41+ upvotes / 44+ comments within 24 hours).
|
|
11
|
+
#
|
|
12
|
+
# Crucially, Sonnet 4.5 is NOT retired from the underlying APIs — it remains accessible
|
|
13
|
+
# on api.anthropic.com, AWS Bedrock, and GCP Vertex for at least 12 months under
|
|
14
|
+
# Anthropic's stated deprecation policy. The "disappearance" is a surface decision
|
|
15
|
+
# (Claude.ai UI), not a model retirement. Claude Code users can recover 4.5 access by
|
|
16
|
+
# pinning the model explicitly via the ANTHROPIC_MODEL env var or the --model flag.
|
|
17
|
+
#
|
|
18
|
+
# Reference: https://gist.github.com/yurukusa/29d9c3ba62aa514450ba04fccc566161
|
|
19
|
+
# (5 operator-side paths to keep using Sonnet 4.5)
|
|
20
|
+
#
|
|
21
|
+
# What this hook does:
|
|
22
|
+
# On SessionStart, inspect ANTHROPIC_MODEL and emit a one-line advisory matching one
|
|
23
|
+
# of four states:
|
|
24
|
+
# - ANTHROPIC_MODEL pinned to a 4.5 variant → silent (user has explicit pin)
|
|
25
|
+
# - ANTHROPIC_MODEL pinned to a 4.6+ variant → silent (user has explicit pin)
|
|
26
|
+
# - ANTHROPIC_MODEL unset and CC_SONNET_45_HELPER_REMIND=1 → emit awareness note
|
|
27
|
+
# - ANTHROPIC_MODEL unset and CC_SONNET_45_HELPER_REMIND unset → silent (default off)
|
|
28
|
+
#
|
|
29
|
+
# The reminder is opt-in via CC_SONNET_45_HELPER_REMIND=1 to avoid noise for users
|
|
30
|
+
# who don't care about model pinning. Once acknowledged, set CC_SONNET_45_HELPER_QUIET=1
|
|
31
|
+
# to suppress permanently.
|
|
32
|
+
#
|
|
33
|
+
# When this hook does NOT fire a warning:
|
|
34
|
+
# - CC_SONNET_45_HELPER_QUIET=1
|
|
35
|
+
# - ANTHROPIC_MODEL is explicitly set to any value (treated as deliberate)
|
|
36
|
+
# - CC_SONNET_45_HELPER_REMIND is unset (opt-in only)
|
|
37
|
+
#
|
|
38
|
+
# Hook config (settings.json):
|
|
39
|
+
# {
|
|
40
|
+
# "hooks": {
|
|
41
|
+
# "SessionStart": [{
|
|
42
|
+
# "matcher": "",
|
|
43
|
+
# "hooks": [{ "type": "command", "command": "bash ~/.claude/hooks/sonnet-45-deprecation-helper.sh" }]
|
|
44
|
+
# }]
|
|
45
|
+
# }
|
|
46
|
+
# }
|
|
47
|
+
#
|
|
48
|
+
# Env vars:
|
|
49
|
+
# CC_SONNET_45_HELPER_QUIET=1 — never emit anything
|
|
50
|
+
# CC_SONNET_45_HELPER_REMIND=1 — emit reminder when ANTHROPIC_MODEL unset (opt-in)
|
|
51
|
+
|
|
52
|
+
# Silence path
|
|
53
|
+
if [ "${CC_SONNET_45_HELPER_QUIET:-0}" = "1" ]; then
|
|
54
|
+
exit 0
|
|
55
|
+
fi
|
|
56
|
+
|
|
57
|
+
# If ANTHROPIC_MODEL is explicitly set, the user has made a deliberate choice. Stay silent.
|
|
58
|
+
if [ -n "${ANTHROPIC_MODEL:-}" ]; then
|
|
59
|
+
exit 0
|
|
60
|
+
fi
|
|
61
|
+
|
|
62
|
+
# If the user did not opt in to reminders, stay silent.
|
|
63
|
+
if [ "${CC_SONNET_45_HELPER_REMIND:-0}" != "1" ]; then
|
|
64
|
+
exit 0
|
|
65
|
+
fi
|
|
66
|
+
|
|
67
|
+
# Opt-in reminder path: ANTHROPIC_MODEL unset and user wants the awareness note.
|
|
68
|
+
cat >&2 <<'EOF'
|
|
69
|
+
[sonnet-45-deprecation-helper] ANTHROPIC_MODEL is unset; your session will use the default model selected by Claude Code (currently routes to Sonnet 4.6 family).
|
|
70
|
+
|
|
71
|
+
To pin Sonnet 4.5 explicitly (still available on the API for at least 12 months):
|
|
72
|
+
export ANTHROPIC_MODEL=claude-sonnet-4-5-20250929
|
|
73
|
+
|
|
74
|
+
To pin Sonnet 4.6 explicitly (current default; suppresses this reminder):
|
|
75
|
+
export ANTHROPIC_MODEL=claude-sonnet-4-6
|
|
76
|
+
|
|
77
|
+
To suppress this reminder without pinning:
|
|
78
|
+
export CC_SONNET_45_HELPER_QUIET=1
|
|
79
|
+
|
|
80
|
+
Background: Sonnet 4.5 was removed from the Claude.ai chat UI in late May 2026 but remains
|
|
81
|
+
available on the Anthropic API, AWS Bedrock, and GCP Vertex AI. See:
|
|
82
|
+
https://gist.github.com/yurukusa/29d9c3ba62aa514450ba04fccc566161
|
|
83
|
+
EOF
|
|
84
|
+
|
|
85
|
+
exit 0
|
|
@@ -18,6 +18,18 @@
|
|
|
18
18
|
|
|
19
19
|
set -euo pipefail
|
|
20
20
|
|
|
21
|
+
# Without jq, the parse below silently yields empty and this hook stops
|
|
22
|
+
# guarding - with no error anywhere. Say so. We deliberately do not exit
|
|
23
|
+
# here: blocking would halt every tool call, and exiting 0 would change
|
|
24
|
+
# the behaviour of guards that do not depend on the parsed value.
|
|
25
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
26
|
+
_nojq_warned="/tmp/cc-nojq-warned-spec-file-scope-guard-$PPID"
|
|
27
|
+
[ -f "$_nojq_warned" ] || {
|
|
28
|
+
echo "WARNING [spec-file-scope-guard]: jq not found - this hook cannot inspect tool calls and is NOT protecting you. Install jq." >&2
|
|
29
|
+
: > "$_nojq_warned"
|
|
30
|
+
}
|
|
31
|
+
fi
|
|
32
|
+
|
|
21
33
|
INPUT=$(cat)
|
|
22
34
|
TOOL=$(echo "$INPUT" | jq -r '.tool_name // empty' 2>/dev/null)
|
|
23
35
|
|