cc-safe-setup 29.8.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-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 +12 -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/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-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-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-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,183 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# ================================================================
|
|
3
|
+
# claude-code-version-pin-advisor.sh — SessionStart advisory for
|
|
4
|
+
# Cluster 16 (v2.1.154+ messages role 'system' API 400)
|
|
5
|
+
# ================================================================
|
|
6
|
+
# PURPOSE:
|
|
7
|
+
# Claude Code v2.1.154 onward shipped a request-assembly
|
|
8
|
+
# regression that serializes `system`-role content from
|
|
9
|
+
# SessionStart hooks, plugin context, Skill metadata, and
|
|
10
|
+
# compaction summaries as peer entries inside the `messages[]`
|
|
11
|
+
# array instead of the top-level `system` field. The Anthropic
|
|
12
|
+
# Messages API rejects this with `API Error: 400 messages[N].role
|
|
13
|
+
# must be either 'user' or 'assistant', but got 'system'`.
|
|
14
|
+
#
|
|
15
|
+
# Four sub-patterns surface this defect:
|
|
16
|
+
# 16A — Custom agents via /agents (Issue #63457)
|
|
17
|
+
# 16B — Strict Anthropic-compatible providers (#63366, #63469)
|
|
18
|
+
# 16C — VS Code extension (#63473, #63510)
|
|
19
|
+
# 16D — Long-lived session context operations (#63396 Variant 1)
|
|
20
|
+
#
|
|
21
|
+
# The defect lives in code paths the hook layer cannot reach at
|
|
22
|
+
# request-assembly time. No hook can prevent the 400. The only
|
|
23
|
+
# workaround is the version pin to v2.1.153.
|
|
24
|
+
#
|
|
25
|
+
# This hook surfaces the warning at SessionStart so the operator
|
|
26
|
+
# knows the workaround BEFORE they lose a session to the 400.
|
|
27
|
+
# It does not block; it advises.
|
|
28
|
+
#
|
|
29
|
+
# DETECTION:
|
|
30
|
+
# At SessionStart, parse `claude --version` (or read
|
|
31
|
+
# CLAUDE_CODE_VERSION env var if set) to obtain the running
|
|
32
|
+
# semver. Compare against the threshold (default 2.1.154). If
|
|
33
|
+
# at or above, emit an advisory naming the four sub-patterns
|
|
34
|
+
# and the pin command.
|
|
35
|
+
#
|
|
36
|
+
# TRIGGER: SessionStart
|
|
37
|
+
# MATCHER: (none)
|
|
38
|
+
#
|
|
39
|
+
# OUTPUT:
|
|
40
|
+
# Advisory only, never blocks. Prints to stderr.
|
|
41
|
+
#
|
|
42
|
+
# CONFIGURATION:
|
|
43
|
+
# CC_VERSION_PIN_ADVISOR_DISABLE=1 — disable entirely
|
|
44
|
+
# CC_VERSION_PIN_ADVISOR_QUIET=1 — silence after
|
|
45
|
+
# acknowledgment
|
|
46
|
+
# CC_VERSION_PIN_ADVISOR_THRESHOLD — override threshold semver
|
|
47
|
+
# (default "2.1.154")
|
|
48
|
+
# CC_VERSION_PIN_ADVISOR_CLAUDE_BIN — override path to claude
|
|
49
|
+
# binary (default: look up
|
|
50
|
+
# on PATH)
|
|
51
|
+
# CLAUDE_CODE_VERSION — if set, the hook uses this
|
|
52
|
+
# instead of calling
|
|
53
|
+
# `claude --version`. Useful
|
|
54
|
+
# for tests and for
|
|
55
|
+
# environments where the
|
|
56
|
+
# binary lookup is slow.
|
|
57
|
+
#
|
|
58
|
+
# RELATED:
|
|
59
|
+
# Cluster 16 entry in cc-safe-setup cluster-tracker.html
|
|
60
|
+
# English field guide:
|
|
61
|
+
# https://gist.github.com/yurukusa/05c120466996734f7bc2ad6d41fdedec
|
|
62
|
+
# Anchor case for resolution tracking:
|
|
63
|
+
# https://github.com/anthropics/claude-code/issues/63469
|
|
64
|
+
#
|
|
65
|
+
# DESIGN NOTES:
|
|
66
|
+
# - The hook does NOT pin the version. The operator decides.
|
|
67
|
+
# The hook surfaces the advisory so the operator can decide.
|
|
68
|
+
# - The semver comparison is done in pure bash (no external
|
|
69
|
+
# dependencies on sort -V or similar). Each component is
|
|
70
|
+
# compared numerically; suffix tags (e.g. "-beta") are
|
|
71
|
+
# stripped.
|
|
72
|
+
# - When the version output is malformed or the binary is
|
|
73
|
+
# missing, the hook fails open (exit 0 silent). It does NOT
|
|
74
|
+
# warn that detection failed — that would be a noise source
|
|
75
|
+
# in environments where Claude Code is invoked through a
|
|
76
|
+
# wrapper or shim that doesn't expose --version.
|
|
77
|
+
|
|
78
|
+
set -u
|
|
79
|
+
|
|
80
|
+
if [ "${CC_VERSION_PIN_ADVISOR_DISABLE:-0}" = "1" ]; then
|
|
81
|
+
exit 0
|
|
82
|
+
fi
|
|
83
|
+
if [ "${CC_VERSION_PIN_ADVISOR_QUIET:-0}" = "1" ]; then
|
|
84
|
+
exit 0
|
|
85
|
+
fi
|
|
86
|
+
|
|
87
|
+
# Consume stdin if provided (SessionStart hooks receive JSON input)
|
|
88
|
+
if [ ! -t 0 ]; then
|
|
89
|
+
cat >/dev/null 2>&1 || true
|
|
90
|
+
fi
|
|
91
|
+
|
|
92
|
+
THRESHOLD="${CC_VERSION_PIN_ADVISOR_THRESHOLD:-2.1.154}"
|
|
93
|
+
|
|
94
|
+
# Obtain running Claude Code version
|
|
95
|
+
detect_version() {
|
|
96
|
+
# Prefer env var if set (tests, controlled environments)
|
|
97
|
+
if [ -n "${CLAUDE_CODE_VERSION:-}" ]; then
|
|
98
|
+
echo "$CLAUDE_CODE_VERSION"
|
|
99
|
+
return 0
|
|
100
|
+
fi
|
|
101
|
+
local claude_bin="${CC_VERSION_PIN_ADVISOR_CLAUDE_BIN:-}"
|
|
102
|
+
if [ -z "$claude_bin" ]; then
|
|
103
|
+
claude_bin=$(command -v claude 2>/dev/null || true)
|
|
104
|
+
fi
|
|
105
|
+
if [ -z "$claude_bin" ] || [ ! -x "$claude_bin" ]; then
|
|
106
|
+
return 1
|
|
107
|
+
fi
|
|
108
|
+
local out
|
|
109
|
+
out=$("$claude_bin" --version 2>/dev/null) || return 1
|
|
110
|
+
# Output format: "2.1.153 (Claude Code)" or similar
|
|
111
|
+
# Extract the first semver-looking token
|
|
112
|
+
echo "$out" | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -n 1
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
# Compare two semvers: returns 0 if $1 >= $2, 1 otherwise.
|
|
116
|
+
# Strips suffix tags after a dash.
|
|
117
|
+
semver_gte() {
|
|
118
|
+
local a="${1%%-*}"
|
|
119
|
+
local b="${2%%-*}"
|
|
120
|
+
# Validate format - if either is not "N.N.N", treat as not-comparable
|
|
121
|
+
case "$a" in
|
|
122
|
+
*[!0-9.]*) return 1 ;;
|
|
123
|
+
*) ;;
|
|
124
|
+
esac
|
|
125
|
+
case "$b" in
|
|
126
|
+
*[!0-9.]*) return 1 ;;
|
|
127
|
+
*) ;;
|
|
128
|
+
esac
|
|
129
|
+
local IFS=.
|
|
130
|
+
local -a parts_a parts_b
|
|
131
|
+
read -ra parts_a <<< "$a"
|
|
132
|
+
read -ra parts_b <<< "$b"
|
|
133
|
+
# Compare up to 3 components
|
|
134
|
+
local i
|
|
135
|
+
for i in 0 1 2; do
|
|
136
|
+
local na="${parts_a[$i]:-0}"
|
|
137
|
+
local nb="${parts_b[$i]:-0}"
|
|
138
|
+
# Validate each component is numeric
|
|
139
|
+
case "$na" in
|
|
140
|
+
''|*[!0-9]*) na=0 ;;
|
|
141
|
+
esac
|
|
142
|
+
case "$nb" in
|
|
143
|
+
''|*[!0-9]*) nb=0 ;;
|
|
144
|
+
esac
|
|
145
|
+
if [ "$na" -gt "$nb" ]; then
|
|
146
|
+
return 0
|
|
147
|
+
elif [ "$na" -lt "$nb" ]; then
|
|
148
|
+
return 1
|
|
149
|
+
fi
|
|
150
|
+
done
|
|
151
|
+
# Equal — counts as >=
|
|
152
|
+
return 0
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
VERSION=$(detect_version)
|
|
156
|
+
if [ -z "$VERSION" ]; then
|
|
157
|
+
# Fail open: detection failed, do not warn
|
|
158
|
+
exit 0
|
|
159
|
+
fi
|
|
160
|
+
|
|
161
|
+
# Compare against threshold; warn only if at or above
|
|
162
|
+
if ! semver_gte "$VERSION" "$THRESHOLD"; then
|
|
163
|
+
exit 0
|
|
164
|
+
fi
|
|
165
|
+
|
|
166
|
+
{
|
|
167
|
+
echo "ADVISORY: Claude Code $VERSION may hit Cluster 16 (API Error 400 messages[].role 'system')."
|
|
168
|
+
echo " Four sub-patterns observed since v$THRESHOLD:"
|
|
169
|
+
echo " 16A — Custom agents via /agents (Issue #63457, clean rollback to 2.1.153 fully resolves)"
|
|
170
|
+
echo " 16B — Strict Anthropic-compatible providers (#63366, #63469 has-repro)"
|
|
171
|
+
echo " 16C — VS Code extension (#63473, #63510)"
|
|
172
|
+
echo " 16D — Long-lived session context operations after compact/clear/model-switch (#63396 Variant 1)"
|
|
173
|
+
echo " Workaround (the only path until upstream fix):"
|
|
174
|
+
echo " npm install -g @anthropic-ai/claude-code@2.1.153"
|
|
175
|
+
echo " export CLAUDE_CODE_DISABLE_AUTO_UPDATE=1 # add to ~/.bashrc or ~/.zshrc"
|
|
176
|
+
echo " Anchor case to subscribe for the upstream fix signal:"
|
|
177
|
+
echo " https://github.com/anthropics/claude-code/issues/63469"
|
|
178
|
+
echo " Field guide (sub-patterns, architectural axis, comparison to Cluster 8 & 13):"
|
|
179
|
+
echo " https://gist.github.com/yurukusa/05c120466996734f7bc2ad6d41fdedec"
|
|
180
|
+
echo " Silence after acknowledgment: export CC_VERSION_PIN_ADVISOR_QUIET=1"
|
|
181
|
+
} >&2
|
|
182
|
+
|
|
183
|
+
exit 0
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# claude-md-reinjector.sh — Re-inject CLAUDE.md to counter instruction drift
|
|
3
|
+
#
|
|
4
|
+
# Solves: #49244 — Opus 4.6 quality regression starting ~April 15, 2026.
|
|
5
|
+
# Users report Claude Code ignoring CLAUDE.md instructions, failing
|
|
6
|
+
# to update memory files, and making repeated mistakes.
|
|
7
|
+
#
|
|
8
|
+
# Root cause (community-documented): Claude Code wraps CLAUDE.md in
|
|
9
|
+
# a framing that marks it as "may or may not be relevant", which
|
|
10
|
+
# reduces its salience after ~50+ tool calls as the conversation
|
|
11
|
+
# grows. Reported by Microsoft research manager, Fortune, The Register
|
|
12
|
+
# (April 2026).
|
|
13
|
+
#
|
|
14
|
+
# HOW IT WORKS:
|
|
15
|
+
# Counts tool calls per session. Every N calls (default 50), prints the
|
|
16
|
+
# project's CLAUDE.md to stderr. Claude Code reads PreToolUse stderr as
|
|
17
|
+
# additional context, so this effectively re-injects the instructions
|
|
18
|
+
# at a cadence the user controls.
|
|
19
|
+
#
|
|
20
|
+
# Prints a short header marking the injection as a hook-triggered reminder,
|
|
21
|
+
# so Claude treats the content as an explicit re-statement of rules rather
|
|
22
|
+
# than part of the current file being edited.
|
|
23
|
+
#
|
|
24
|
+
# WHY THIS MATTERS:
|
|
25
|
+
# Without re-injection, long sessions drift: Claude "forgets" that the
|
|
26
|
+
# project bans comments, forgets the test command, forgets naming rules.
|
|
27
|
+
# The user then has to re-paste CLAUDE.md manually — burning their own
|
|
28
|
+
# tokens on work the hook can do deterministically.
|
|
29
|
+
#
|
|
30
|
+
# TRIGGER: PreToolUse MATCHER: ""
|
|
31
|
+
#
|
|
32
|
+
# CONFIGURATION:
|
|
33
|
+
# CC_MD_REINJECT_EVERY=50 re-inject every N tool calls (default 50)
|
|
34
|
+
# CC_MD_REINJECT_PATH=path override CLAUDE.md search (default auto)
|
|
35
|
+
# CC_MD_REINJECT_MAX_CHARS=2000 truncate long CLAUDE.md (default 2000 chars)
|
|
36
|
+
# CC_MD_REINJECT_LOG=path append injection events (default off)
|
|
37
|
+
#
|
|
38
|
+
# SEARCH ORDER for CLAUDE.md:
|
|
39
|
+
# 1. $CC_MD_REINJECT_PATH (if set)
|
|
40
|
+
# 2. $PWD/CLAUDE.md
|
|
41
|
+
# 3. git repo root CLAUDE.md (if inside a git repo)
|
|
42
|
+
# 4. $HOME/CLAUDE.md
|
|
43
|
+
# 5. $HOME/.claude/CLAUDE.md
|
|
44
|
+
|
|
45
|
+
INPUT=$(cat)
|
|
46
|
+
SESSION_ID=$(echo "$INPUT" | jq -r '.session_id // "default"' 2>/dev/null)
|
|
47
|
+
[ -z "$SESSION_ID" ] && SESSION_ID="default"
|
|
48
|
+
|
|
49
|
+
EVERY="${CC_MD_REINJECT_EVERY:-50}"
|
|
50
|
+
MAX_CHARS="${CC_MD_REINJECT_MAX_CHARS:-2000}"
|
|
51
|
+
STATE_DIR="/tmp/cc-md-reinject"
|
|
52
|
+
COUNT_FILE="$STATE_DIR/${SESSION_ID}.count"
|
|
53
|
+
|
|
54
|
+
mkdir -p "$STATE_DIR" 2>/dev/null
|
|
55
|
+
|
|
56
|
+
# Increment counter
|
|
57
|
+
COUNT=$(cat "$COUNT_FILE" 2>/dev/null || echo 0)
|
|
58
|
+
COUNT=$((COUNT + 1))
|
|
59
|
+
echo "$COUNT" > "$COUNT_FILE"
|
|
60
|
+
|
|
61
|
+
# Only fire on the N-th, 2N-th, 3N-th ... call
|
|
62
|
+
if [ "$((COUNT % EVERY))" -ne 0 ]; then
|
|
63
|
+
exit 0
|
|
64
|
+
fi
|
|
65
|
+
|
|
66
|
+
# Locate CLAUDE.md
|
|
67
|
+
find_claude_md() {
|
|
68
|
+
if [ -n "${CC_MD_REINJECT_PATH:-}" ]; then
|
|
69
|
+
# Explicit override: respect it. If missing, skip silently (no fallback).
|
|
70
|
+
[ -f "$CC_MD_REINJECT_PATH" ] && echo "$CC_MD_REINJECT_PATH"
|
|
71
|
+
return 0
|
|
72
|
+
fi
|
|
73
|
+
if [ -f "./CLAUDE.md" ]; then
|
|
74
|
+
echo "./CLAUDE.md"; return 0
|
|
75
|
+
fi
|
|
76
|
+
# Walk up to find git repo root
|
|
77
|
+
dir="$PWD"
|
|
78
|
+
while [ "$dir" != "/" ]; do
|
|
79
|
+
if [ -f "$dir/CLAUDE.md" ]; then
|
|
80
|
+
echo "$dir/CLAUDE.md"; return 0
|
|
81
|
+
fi
|
|
82
|
+
if [ -d "$dir/.git" ]; then
|
|
83
|
+
break
|
|
84
|
+
fi
|
|
85
|
+
dir=$(dirname "$dir")
|
|
86
|
+
done
|
|
87
|
+
if [ -f "$HOME/CLAUDE.md" ]; then
|
|
88
|
+
echo "$HOME/CLAUDE.md"; return 0
|
|
89
|
+
fi
|
|
90
|
+
if [ -f "$HOME/.claude/CLAUDE.md" ]; then
|
|
91
|
+
echo "$HOME/.claude/CLAUDE.md"; return 0
|
|
92
|
+
fi
|
|
93
|
+
return 1
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
MD_FILE=$(find_claude_md)
|
|
97
|
+
if [ -z "$MD_FILE" ]; then
|
|
98
|
+
# No CLAUDE.md to re-inject — silently skip
|
|
99
|
+
exit 0
|
|
100
|
+
fi
|
|
101
|
+
|
|
102
|
+
# Read and truncate
|
|
103
|
+
CONTENT=$(head -c "$MAX_CHARS" "$MD_FILE")
|
|
104
|
+
ACTUAL_SIZE=$(wc -c < "$MD_FILE")
|
|
105
|
+
|
|
106
|
+
# Print re-injection to stderr (Claude reads this as pre-tool context)
|
|
107
|
+
cat >&2 <<EOF
|
|
108
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
109
|
+
[claude-md-reinjector] Tool call #${COUNT} — re-injecting ${MD_FILE}
|
|
110
|
+
Addresses #49244: Claude Code drifting from CLAUDE.md after long sessions.
|
|
111
|
+
These are the rules you already agreed to follow. Re-read and comply.
|
|
112
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
113
|
+
${CONTENT}
|
|
114
|
+
EOF
|
|
115
|
+
|
|
116
|
+
if [ "$ACTUAL_SIZE" -gt "$MAX_CHARS" ]; then
|
|
117
|
+
echo "" >&2
|
|
118
|
+
echo "[...truncated at ${MAX_CHARS} chars of ${ACTUAL_SIZE}. Full file: ${MD_FILE}]" >&2
|
|
119
|
+
fi
|
|
120
|
+
|
|
121
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" >&2
|
|
122
|
+
|
|
123
|
+
# Optional log
|
|
124
|
+
if [ -n "${CC_MD_REINJECT_LOG:-}" ]; then
|
|
125
|
+
mkdir -p "$(dirname "$CC_MD_REINJECT_LOG")" 2>/dev/null
|
|
126
|
+
echo "$(date -Iseconds) session=${SESSION_ID} count=${COUNT} file=${MD_FILE} size=${ACTUAL_SIZE}" >> "$CC_MD_REINJECT_LOG"
|
|
127
|
+
fi
|
|
128
|
+
|
|
129
|
+
exit 0
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# ================================================================
|
|
3
|
+
# claude-md-size-monitor.sh — Warn when CLAUDE.md exceeds the token budget
|
|
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
|
+
TOKEN_BUDGET="${CC_CLAUDE_MD_TOKEN_BUDGET:-5000}"
|
|
18
|
+
CHARS_PER_TOKEN="${CC_CLAUDE_MD_CHARS_PER_TOKEN:-3.5}"
|
|
19
|
+
if [ -n "${CC_CLAUDE_MD_FILES:-}" ]; then
|
|
20
|
+
IFS=':' read -ra MD_FILES <<< "$CC_CLAUDE_MD_FILES"
|
|
21
|
+
else
|
|
22
|
+
MD_FILES=(
|
|
23
|
+
"$HOME/.claude/CLAUDE.md"
|
|
24
|
+
".claude/CLAUDE.md"
|
|
25
|
+
"./CLAUDE.md"
|
|
26
|
+
)
|
|
27
|
+
fi
|
|
28
|
+
FINDINGS=()
|
|
29
|
+
TOTAL_TOKENS=0
|
|
30
|
+
for file in "${MD_FILES[@]}"; do
|
|
31
|
+
[ -f "$file" ] || continue
|
|
32
|
+
[ -r "$file" ] || continue
|
|
33
|
+
CHARS=$(wc -c < "$file" 2>/dev/null | tr -d ' ')
|
|
34
|
+
[ -z "$CHARS" ] && continue
|
|
35
|
+
[ "$CHARS" -eq 0 ] && continue
|
|
36
|
+
TOKENS=$(awk -v c="$CHARS" -v cpt="$CHARS_PER_TOKEN" 'BEGIN { printf "%d", c / cpt }')
|
|
37
|
+
FINDINGS+=("$file|$CHARS|$TOKENS")
|
|
38
|
+
TOTAL_TOKENS=$((TOTAL_TOKENS + TOKENS))
|
|
39
|
+
done
|
|
40
|
+
[ ${#FINDINGS[@]} -eq 0 ] && exit 0
|
|
41
|
+
[ "$TOTAL_TOKENS" -le "$TOKEN_BUDGET" ] && exit 0
|
|
42
|
+
OVERAGE=$((TOTAL_TOKENS - TOKEN_BUDGET))
|
|
43
|
+
MSG="DETECTED: CLAUDE.md token budget exceeded.
|
|
44
|
+
Total estimated tokens across all CLAUDE.md files: $TOTAL_TOKENS (budget: $TOKEN_BUDGET, overage: $OVERAGE).
|
|
45
|
+
Every Claude Code session loads these files at startup. The cost is paid on every tool call in the session.
|
|
46
|
+
Per-file breakdown:"
|
|
47
|
+
for finding in "${FINDINGS[@]}"; do
|
|
48
|
+
IFS='|' read -r path chars tokens <<< "$finding"
|
|
49
|
+
MSG="$MSG
|
|
50
|
+
- $path: $chars chars, ~$tokens tokens"
|
|
51
|
+
done
|
|
52
|
+
MSG="$MSG
|
|
53
|
+
Suggested actions:
|
|
54
|
+
1. Read https://github.com/anthropics/claude-code/issues/42796 for the community discussion of CLAUDE.md token costs.
|
|
55
|
+
2. Move project-specific instructions to ./.claude/CLAUDE.md and leave global preferences in ~/.claude/CLAUDE.md.
|
|
56
|
+
3. Convert long examples into separate files referenced by URL rather than inlined.
|
|
57
|
+
4. Increase the budget if intentional: set CC_CLAUDE_MD_TOKEN_BUDGET=$TOTAL_TOKENS to silence this warning.
|
|
58
|
+
This hook is advisory only. The session continues normally."
|
|
59
|
+
jq -n --arg msg "$MSG" '
|
|
60
|
+
{
|
|
61
|
+
"hookSpecificOutput": {
|
|
62
|
+
"hookEventName": "SessionStart",
|
|
63
|
+
"additionalContext": $msg
|
|
64
|
+
}
|
|
65
|
+
}'
|
|
66
|
+
exit 0
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# claude-update-budget-guard.sh — warn/block `claude update` when 5h quota is tight
|
|
3
|
+
#
|
|
4
|
+
# Solves: #52890 (opened 2026-04-24, v2.1.98, platform:macos, labels area:cost).
|
|
5
|
+
# A single `claude update` invocation consumed ~7% of the 5-hour budget
|
|
6
|
+
# and ~3% of the weekly budget on a Max 20x plan — silently. The burn
|
|
7
|
+
# compounds with Marketplace 404s and 429 retry storms that the user
|
|
8
|
+
# sees in their logs. Anthropic has not commented on the issue at the
|
|
9
|
+
# time this hook was written.
|
|
10
|
+
#
|
|
11
|
+
# Event: PreToolUse Matcher: Bash
|
|
12
|
+
# Action: When a Bash tool call invokes `claude update` / `claude self-update`,
|
|
13
|
+
# read the remaining 5-hour quota from `claude /usage --json`
|
|
14
|
+
# (Claude Code >= 2.1.118). If the remaining percentage is below
|
|
15
|
+
# CLAUDE_UPDATE_BUDGET_THRESHOLD (default 30), either warn (default)
|
|
16
|
+
# or block (exit 2) — depending on CLAUDE_UPDATE_BUDGET_MODE.
|
|
17
|
+
# If `/usage --json` is unavailable (earlier version or error), emit
|
|
18
|
+
# a version-agnostic warning and fall through.
|
|
19
|
+
#
|
|
20
|
+
# Configuration:
|
|
21
|
+
# CLAUDE_UPDATE_BUDGET_THRESHOLD percent (default 30). Below this, take action.
|
|
22
|
+
# CLAUDE_UPDATE_BUDGET_MODE warn | block (default warn — never breaks CC)
|
|
23
|
+
# CLAUDE_UPDATE_USAGE_CMD override probe command (for tests)
|
|
24
|
+
#
|
|
25
|
+
# Exit codes:
|
|
26
|
+
# 0 allow (with warning printed to stderr if threshold crossed)
|
|
27
|
+
# 2 block (only when MODE=block and threshold crossed)
|
|
28
|
+
|
|
29
|
+
set -u
|
|
30
|
+
|
|
31
|
+
# Without jq, the parse below silently yields empty and this hook stops
|
|
32
|
+
# guarding - with no error anywhere. Say so. We deliberately do not exit
|
|
33
|
+
# here: blocking would halt every tool call, and exiting 0 would change
|
|
34
|
+
# the behaviour of guards that do not depend on the parsed value.
|
|
35
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
36
|
+
_nojq_warned="/tmp/cc-nojq-warned-claude-update-budget-guard-$PPID"
|
|
37
|
+
[ -f "$_nojq_warned" ] || {
|
|
38
|
+
echo "WARNING [claude-update-budget-guard]: jq not found - this hook cannot inspect tool calls and is NOT protecting you. Install jq." >&2
|
|
39
|
+
: > "$_nojq_warned"
|
|
40
|
+
}
|
|
41
|
+
fi
|
|
42
|
+
|
|
43
|
+
INPUT=$(cat 2>/dev/null || true)
|
|
44
|
+
|
|
45
|
+
# Non-Bash tools: nothing to do.
|
|
46
|
+
TOOL=$(printf '%s' "$INPUT" | jq -r '.tool_name // empty' 2>/dev/null)
|
|
47
|
+
[ "$TOOL" != "Bash" ] && exit 0
|
|
48
|
+
|
|
49
|
+
CMD=$(printf '%s' "$INPUT" | jq -r '.tool_input.command // empty' 2>/dev/null)
|
|
50
|
+
[ -z "$CMD" ] && exit 0
|
|
51
|
+
|
|
52
|
+
# Detect `claude update` / `claude self-update`. Require `claude` as a
|
|
53
|
+
# whole command word so `./claude-update-smart.sh` / `my-claude update` / a
|
|
54
|
+
# commit message mentioning "claude update" don't trigger us.
|
|
55
|
+
if ! printf '%s' "$CMD" | grep -qE '(^|[;&|[:space:]])claude([[:space:]]+[^;&|]*)?[[:space:]]+(update|self-update)(\b|$)'; then
|
|
56
|
+
exit 0
|
|
57
|
+
fi
|
|
58
|
+
|
|
59
|
+
THRESHOLD="${CLAUDE_UPDATE_BUDGET_THRESHOLD:-30}"
|
|
60
|
+
MODE="${CLAUDE_UPDATE_BUDGET_MODE:-warn}"
|
|
61
|
+
PROBE="${CLAUDE_UPDATE_USAGE_CMD:-claude /usage --json}"
|
|
62
|
+
|
|
63
|
+
# Probe remaining quota. Older CC versions (<=2.1.117) do not ship `/usage`;
|
|
64
|
+
# any non-zero exit or non-JSON output means "unknown — warn and continue".
|
|
65
|
+
USAGE_JSON=$(eval "$PROBE" 2>/dev/null || true)
|
|
66
|
+
REMAINING_PCT=""
|
|
67
|
+
if [ -n "$USAGE_JSON" ]; then
|
|
68
|
+
# Accept several plausible shapes from /usage --json. Real field names may
|
|
69
|
+
# shift across CC releases; we try the common ones and stop at the first hit.
|
|
70
|
+
for path in \
|
|
71
|
+
'.five_hour.remaining_percent' \
|
|
72
|
+
'.fiveHour.remainingPercent' \
|
|
73
|
+
'.sessions."5h".remaining_percent' \
|
|
74
|
+
'.quota.fiveHour.percent_remaining' \
|
|
75
|
+
'.limits."5h".percent_remaining'; do
|
|
76
|
+
val=$(printf '%s' "$USAGE_JSON" | jq -r "$path // empty" 2>/dev/null)
|
|
77
|
+
if [ -n "$val" ] && [ "$val" != "null" ]; then
|
|
78
|
+
REMAINING_PCT="$val"
|
|
79
|
+
break
|
|
80
|
+
fi
|
|
81
|
+
done
|
|
82
|
+
fi
|
|
83
|
+
|
|
84
|
+
BANNER='⚠ claude-update-budget-guard: Issue #52890'
|
|
85
|
+
REF='https://github.com/anthropics/claude-code/issues/52890'
|
|
86
|
+
|
|
87
|
+
if [ -z "$REMAINING_PCT" ]; then
|
|
88
|
+
{
|
|
89
|
+
echo "$BANNER"
|
|
90
|
+
echo " Cannot read /usage --json (Claude Code < 2.1.118 or probe failed)."
|
|
91
|
+
echo " \`claude update\` has been reported to burn ~7% of the 5h budget"
|
|
92
|
+
echo " on a single invocation. Consider running the command from a"
|
|
93
|
+
echo " separate shell rather than from inside an active CC session."
|
|
94
|
+
echo " Ref: $REF"
|
|
95
|
+
} >&2
|
|
96
|
+
exit 0
|
|
97
|
+
fi
|
|
98
|
+
|
|
99
|
+
# Compare with threshold using awk (handles floats).
|
|
100
|
+
CROSSED=$(awk -v r="$REMAINING_PCT" -v t="$THRESHOLD" 'BEGIN { print (r+0 < t+0) ? 1 : 0 }')
|
|
101
|
+
|
|
102
|
+
if [ "$CROSSED" = "1" ]; then
|
|
103
|
+
{
|
|
104
|
+
echo "$BANNER"
|
|
105
|
+
echo " 5-hour quota remaining: ${REMAINING_PCT}% (threshold: ${THRESHOLD}%)."
|
|
106
|
+
echo " \`claude update\` can consume ~7% of the 5h budget in one call."
|
|
107
|
+
echo " Running it now may trigger your hard quota limit."
|
|
108
|
+
echo " Suggested: skip until the next 5h reset, or run from outside CC."
|
|
109
|
+
echo " Ref: $REF"
|
|
110
|
+
} >&2
|
|
111
|
+
if [ "$MODE" = "block" ]; then
|
|
112
|
+
exit 2
|
|
113
|
+
fi
|
|
114
|
+
exit 0
|
|
115
|
+
fi
|
|
116
|
+
|
|
117
|
+
# Quota OK — still post an informational note so the user sees the cost.
|
|
118
|
+
{
|
|
119
|
+
echo "$BANNER (info)"
|
|
120
|
+
echo " 5h quota remaining: ${REMAINING_PCT}% — above threshold."
|
|
121
|
+
echo " Note: this single update is expected to burn ~7% of your 5h budget."
|
|
122
|
+
} >&2
|
|
123
|
+
exit 0
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# claude-update-smart.sh — skip 226 MB tarball download when already up-to-date
|
|
3
|
+
# Why: `claude update` downloads the full ~226 MB release tarball on every
|
|
4
|
+
# invocation, even when the installed version is already latest (Issue
|
|
5
|
+
# #51243, opened 2026-04-20, platform:wsl, status:open). A typical
|
|
6
|
+
# connection sees ~30 s wall time per update check and silently burns
|
|
7
|
+
# metered bandwidth.
|
|
8
|
+
# Fix: Before calling `claude update`, query the npm registry (~2 KB response)
|
|
9
|
+
# for the latest version. If the installed `claude --version` matches,
|
|
10
|
+
# exit 0 with "up to date" message and skip the download entirely. Cache
|
|
11
|
+
# the registry lookup for 1 h to avoid repeated small queries.
|
|
12
|
+
# Install:
|
|
13
|
+
# cp examples/claude-update-smart.sh ~/bin/claude-update # shadow the real one
|
|
14
|
+
# chmod +x ~/bin/claude-update
|
|
15
|
+
# Or alias in your shell rc:
|
|
16
|
+
# alias claude-update='bash ~/path/to/claude-update-smart.sh'
|
|
17
|
+
#
|
|
18
|
+
# Environment overrides (for tests and offline use):
|
|
19
|
+
# CLAUDE_UPDATE_SMART_LOCAL=x.y.z force-reported local version
|
|
20
|
+
# CLAUDE_UPDATE_SMART_LATEST=x.y.z force-reported latest version
|
|
21
|
+
# CLAUDE_UPDATE_SMART_CACHE=<path> override cache location
|
|
22
|
+
# CLAUDE_UPDATE_SMART_TTL=<seconds> override cache TTL (default 3600)
|
|
23
|
+
# CLAUDE_UPDATE_SMART_NO_EXEC=1 print the decision but do not call `claude update`
|
|
24
|
+
|
|
25
|
+
set -u
|
|
26
|
+
|
|
27
|
+
# Without jq, the parse below silently yields empty and this hook stops
|
|
28
|
+
# guarding - with no error anywhere. Say so. We deliberately do not exit
|
|
29
|
+
# here: blocking would halt every tool call, and exiting 0 would change
|
|
30
|
+
# the behaviour of guards that do not depend on the parsed value.
|
|
31
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
32
|
+
_nojq_warned="/tmp/cc-nojq-warned-claude-update-smart-$PPID"
|
|
33
|
+
[ -f "$_nojq_warned" ] || {
|
|
34
|
+
echo "WARNING [claude-update-smart]: jq not found - this hook cannot inspect tool calls and is NOT protecting you. Install jq." >&2
|
|
35
|
+
: > "$_nojq_warned"
|
|
36
|
+
}
|
|
37
|
+
fi
|
|
38
|
+
|
|
39
|
+
CACHE="${CLAUDE_UPDATE_SMART_CACHE:-${HOME}/.cache/claude-update-smart.json}"
|
|
40
|
+
TTL="${CLAUDE_UPDATE_SMART_TTL:-3600}"
|
|
41
|
+
|
|
42
|
+
mkdir -p "$(dirname "$CACHE")" 2>/dev/null
|
|
43
|
+
|
|
44
|
+
# Early bailout: if `claude` CLI is not installed at all and no LOCAL override is
|
|
45
|
+
# in scope, the hook has nothing to do. Common in CI runners and dev containers
|
|
46
|
+
# without Claude Code installed. The `${VAR+x}` test distinguishes "unset" (no
|
|
47
|
+
# scope) from "set to empty" (test fixtures asserting exit-127 fallback).
|
|
48
|
+
if ! command -v claude >/dev/null 2>&1 && [ -z "${CLAUDE_UPDATE_SMART_LOCAL+x}" ]; then
|
|
49
|
+
echo "claude-update-smart: claude CLI not installed (advisory: nothing to update)" >&2
|
|
50
|
+
exit 0
|
|
51
|
+
fi
|
|
52
|
+
|
|
53
|
+
# Resolve LOCAL version.
|
|
54
|
+
if [ -n "${CLAUDE_UPDATE_SMART_LOCAL:-}" ]; then
|
|
55
|
+
LOCAL="$CLAUDE_UPDATE_SMART_LOCAL"
|
|
56
|
+
else
|
|
57
|
+
LOCAL=$(claude --version 2>/dev/null | awk '{print $1}')
|
|
58
|
+
fi
|
|
59
|
+
|
|
60
|
+
if [ -z "${LOCAL:-}" ]; then
|
|
61
|
+
echo "claude-update-smart: 'claude' not found or --version failed; falling through" >&2
|
|
62
|
+
if [ "${CLAUDE_UPDATE_SMART_NO_EXEC:-0}" = "1" ]; then
|
|
63
|
+
exit 127
|
|
64
|
+
fi
|
|
65
|
+
exec claude update "$@"
|
|
66
|
+
fi
|
|
67
|
+
|
|
68
|
+
# Resolve LATEST version (cache → npm → GitHub Releases).
|
|
69
|
+
LATEST=""
|
|
70
|
+
if [ -n "${CLAUDE_UPDATE_SMART_LATEST:-}" ]; then
|
|
71
|
+
LATEST="$CLAUDE_UPDATE_SMART_LATEST"
|
|
72
|
+
else
|
|
73
|
+
NOW=$(date +%s)
|
|
74
|
+
CACHED_TIME=$(stat -c %Y "$CACHE" 2>/dev/null || echo 0)
|
|
75
|
+
AGE=$((NOW - CACHED_TIME))
|
|
76
|
+
if [ -s "$CACHE" ] && [ "$AGE" -lt "$TTL" ]; then
|
|
77
|
+
LATEST=$(jq -r '.latest // empty' "$CACHE" 2>/dev/null)
|
|
78
|
+
fi
|
|
79
|
+
if [ -z "$LATEST" ]; then
|
|
80
|
+
LATEST=$(npm view @anthropic-ai/claude-code version 2>/dev/null | tr -d '[:space:]')
|
|
81
|
+
fi
|
|
82
|
+
if [ -z "$LATEST" ]; then
|
|
83
|
+
LATEST=$(curl -s --max-time 5 https://api.github.com/repos/anthropics/claude-code/releases/latest \
|
|
84
|
+
| jq -r '.tag_name // empty' 2>/dev/null | sed 's/^v//')
|
|
85
|
+
fi
|
|
86
|
+
if [ -n "$LATEST" ]; then
|
|
87
|
+
printf '{"latest":"%s","checked_at":%s}\n' "$LATEST" "$NOW" > "$CACHE" 2>/dev/null
|
|
88
|
+
fi
|
|
89
|
+
fi
|
|
90
|
+
|
|
91
|
+
if [ -z "$LATEST" ]; then
|
|
92
|
+
echo "claude-update-smart: could not determine latest version (no network?); falling through" >&2
|
|
93
|
+
if [ "${CLAUDE_UPDATE_SMART_NO_EXEC:-0}" = "1" ]; then
|
|
94
|
+
echo "decision=fallthrough local=$LOCAL latest=unknown"
|
|
95
|
+
exit 2
|
|
96
|
+
fi
|
|
97
|
+
exec claude update "$@"
|
|
98
|
+
fi
|
|
99
|
+
|
|
100
|
+
if [ "$LOCAL" = "$LATEST" ]; then
|
|
101
|
+
echo "Claude Code is up to date ($LOCAL) — skipped 226 MB download (see #51243)"
|
|
102
|
+
if [ "${CLAUDE_UPDATE_SMART_NO_EXEC:-0}" = "1" ]; then
|
|
103
|
+
echo "decision=skip local=$LOCAL latest=$LATEST"
|
|
104
|
+
fi
|
|
105
|
+
exit 0
|
|
106
|
+
fi
|
|
107
|
+
|
|
108
|
+
echo "Update available: $LOCAL → $LATEST — running 'claude update'..."
|
|
109
|
+
if [ "${CLAUDE_UPDATE_SMART_NO_EXEC:-0}" = "1" ]; then
|
|
110
|
+
echo "decision=update local=$LOCAL latest=$LATEST"
|
|
111
|
+
exit 0
|
|
112
|
+
fi
|
|
113
|
+
exec claude update "$@"
|
|
@@ -13,6 +13,18 @@
|
|
|
13
13
|
|
|
14
14
|
set -euo pipefail
|
|
15
15
|
|
|
16
|
+
# Without jq, the parse below silently yields empty and this hook stops
|
|
17
|
+
# guarding - with no error anywhere. Say so. We deliberately do not exit
|
|
18
|
+
# here: blocking would halt every tool call, and exiting 0 would change
|
|
19
|
+
# the behaviour of guards that do not depend on the parsed value.
|
|
20
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
21
|
+
_nojq_warned="/tmp/cc-nojq-warned-claudeignore-enforce-guard-$PPID"
|
|
22
|
+
[ -f "$_nojq_warned" ] || {
|
|
23
|
+
echo "WARNING [claudeignore-enforce-guard]: jq not found - this hook cannot inspect tool calls and is NOT protecting you. Install jq." >&2
|
|
24
|
+
: > "$_nojq_warned"
|
|
25
|
+
}
|
|
26
|
+
fi
|
|
27
|
+
|
|
16
28
|
INPUT=$(cat)
|
|
17
29
|
TOOL=$(echo "$INPUT" | jq -r '.tool_name // empty' 2>/dev/null)
|
|
18
30
|
|
|
File without changes
|