cc-safe-setup 29.8.0 → 30.0.5
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 +421 -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 +1718 -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,99 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# settings-hooks-key-restorer.sh — Detect silent loss of top-level `hooks` key in settings.json
|
|
3
|
+
# Trigger: SessionStart
|
|
4
|
+
# Matcher: (none — runs on every session start)
|
|
5
|
+
#
|
|
6
|
+
# Issue #59870 — when the user accepts a new permission, Claude Code rewrites
|
|
7
|
+
# `~/.claude/settings.json` and silently drops the top-level `hooks` key.
|
|
8
|
+
# Other top-level keys (`permissions`, `model`, etc.) are preserved.
|
|
9
|
+
# Tools that register PreToolUse/PostToolUse/Stop hooks via settings.json
|
|
10
|
+
# then "stop working" mid-session with no warning.
|
|
11
|
+
#
|
|
12
|
+
# This hook runs at SessionStart, compares the current settings.json against
|
|
13
|
+
# the most recent backup, and warns if the `hooks` key has disappeared.
|
|
14
|
+
# The hook does NOT auto-restore; auto-restoration risks reintroducing
|
|
15
|
+
# stale or wrong hooks. Instead it prints the restoration command for
|
|
16
|
+
# the user to verify and apply.
|
|
17
|
+
#
|
|
18
|
+
# Companion to settings-integrity-monitor.sh (which tracks hash-level changes
|
|
19
|
+
# but does not specialize on the hooks-key disappearance pattern).
|
|
20
|
+
#
|
|
21
|
+
# TRIGGER: SessionStart MATCHER: ""
|
|
22
|
+
|
|
23
|
+
SETTINGS="${CLAUDE_SETTINGS_FILE:-$HOME/.claude/settings.json}"
|
|
24
|
+
BACKUP_DIR="$HOME/.claude/settings-backups"
|
|
25
|
+
|
|
26
|
+
# Exit silently if settings.json doesn't exist
|
|
27
|
+
[ -f "$SETTINGS" ] || exit 0
|
|
28
|
+
|
|
29
|
+
# Exit silently if no backups exist yet
|
|
30
|
+
[ -d "$BACKUP_DIR" ] || exit 0
|
|
31
|
+
|
|
32
|
+
# Exit silently if settings.json is malformed (a separate hook handles that)
|
|
33
|
+
if ! jq -e . "$SETTINGS" >/dev/null 2>&1; then
|
|
34
|
+
exit 0
|
|
35
|
+
fi
|
|
36
|
+
|
|
37
|
+
# Check current settings.json has hooks key
|
|
38
|
+
CURRENT_HAS_HOOKS=$(jq 'has("hooks")' "$SETTINGS" 2>/dev/null || echo "false")
|
|
39
|
+
|
|
40
|
+
# If current still has hooks, nothing to do
|
|
41
|
+
if [ "$CURRENT_HAS_HOOKS" = "true" ]; then
|
|
42
|
+
CURRENT_HOOK_COUNT=$(jq '[.hooks | to_entries[].value[].hooks[]?] | length' "$SETTINGS" 2>/dev/null || echo "0")
|
|
43
|
+
# Even if hooks key is present, warn if count is 0 (the key exists but has been emptied)
|
|
44
|
+
if [ "$CURRENT_HOOK_COUNT" = "0" ]; then
|
|
45
|
+
echo "⚠ settings.json has 'hooks' key but it is empty. If you registered hooks via settings.json, they may have been silently removed." >&2
|
|
46
|
+
echo " See https://github.com/anthropics/claude-code/issues/59870 for the silent-drop pattern." >&2
|
|
47
|
+
fi
|
|
48
|
+
exit 0
|
|
49
|
+
fi
|
|
50
|
+
|
|
51
|
+
# Current does NOT have hooks key. Look at backups for the most recent one with hooks.
|
|
52
|
+
LATEST_BACKUP=""
|
|
53
|
+
if [ -f "$BACKUP_DIR/settings.json.latest" ]; then
|
|
54
|
+
LATEST_HAS_HOOKS=$(jq 'has("hooks")' "$BACKUP_DIR/settings.json.latest" 2>/dev/null || echo "false")
|
|
55
|
+
if [ "$LATEST_HAS_HOOKS" = "true" ]; then
|
|
56
|
+
LATEST_BACKUP="$BACKUP_DIR/settings.json.latest"
|
|
57
|
+
fi
|
|
58
|
+
fi
|
|
59
|
+
|
|
60
|
+
if [ -z "$LATEST_BACKUP" ] && [ -f "$BACKUP_DIR/settings.json.baseline" ]; then
|
|
61
|
+
BASELINE_HAS_HOOKS=$(jq 'has("hooks")' "$BACKUP_DIR/settings.json.baseline" 2>/dev/null || echo "false")
|
|
62
|
+
if [ "$BASELINE_HAS_HOOKS" = "true" ]; then
|
|
63
|
+
LATEST_BACKUP="$BACKUP_DIR/settings.json.baseline"
|
|
64
|
+
fi
|
|
65
|
+
fi
|
|
66
|
+
|
|
67
|
+
# If no backup with hooks exists, the user never had hooks in settings.json. Exit silently.
|
|
68
|
+
if [ -z "$LATEST_BACKUP" ]; then
|
|
69
|
+
exit 0
|
|
70
|
+
fi
|
|
71
|
+
|
|
72
|
+
# Hooks were present in a prior backup but are now gone. Warn and suggest restoration.
|
|
73
|
+
PRIOR_HOOK_COUNT=$(jq '[.hooks | to_entries[].value[].hooks[]?] | length' "$LATEST_BACKUP" 2>/dev/null || echo "?")
|
|
74
|
+
|
|
75
|
+
cat >&2 <<EOF
|
|
76
|
+
⚠ SILENT HOOKS LOSS DETECTED
|
|
77
|
+
|
|
78
|
+
settings.json no longer contains the top-level 'hooks' key, but the most
|
|
79
|
+
recent backup ($LATEST_BACKUP) had $PRIOR_HOOK_COUNT hook entries.
|
|
80
|
+
|
|
81
|
+
This matches issue #59870: when Claude Code rewrites settings.json after a
|
|
82
|
+
permission grant, it silently drops the top-level 'hooks' key. Other keys
|
|
83
|
+
(permissions, model, etc.) are preserved.
|
|
84
|
+
|
|
85
|
+
To restore the hooks key from the backup, run:
|
|
86
|
+
|
|
87
|
+
jq -s '.[0] + {hooks: .[1].hooks}' "$SETTINGS" "$LATEST_BACKUP" > /tmp/settings-restored.json && \\
|
|
88
|
+
mv /tmp/settings-restored.json "$SETTINGS"
|
|
89
|
+
|
|
90
|
+
Then verify with:
|
|
91
|
+
|
|
92
|
+
jq '.hooks | keys' "$SETTINGS"
|
|
93
|
+
|
|
94
|
+
If the restored hooks are stale, edit the backup file before running the merge.
|
|
95
|
+
This hook does NOT auto-restore to avoid reintroducing wrong hooks.
|
|
96
|
+
|
|
97
|
+
EOF
|
|
98
|
+
|
|
99
|
+
exit 0
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# settings-json-health-check.sh — settings corruption guard (Incident 10)
|
|
3
|
+
# Why: A malformed settings.json can silently break the session (hook
|
|
4
|
+
# definitions ignored, permissions reset to defaults) and the built-in
|
|
5
|
+
# /doctor diagnostic can be dismissed by the user, leaving no warning.
|
|
6
|
+
# This hook runs at SessionStart, validates both user-level and
|
|
7
|
+
# project-level settings.json as JSON, writes a dated backup if a file
|
|
8
|
+
# fails to parse, and exits non-zero so Claude Code refuses to proceed
|
|
9
|
+
# with a broken configuration.
|
|
10
|
+
# Event: SessionStart
|
|
11
|
+
# Action: jq parse both settings files. If either fails: backup + refuse.
|
|
12
|
+
# If /doctor has been dismissed recently: warn on stderr (does not
|
|
13
|
+
# refuse the session, only reminds the user).
|
|
14
|
+
#
|
|
15
|
+
# Environment:
|
|
16
|
+
# CC_SKIP_DOCTOR_CHECK=1 suppress the /doctor dismissed warning
|
|
17
|
+
# SETTINGS_HEALTH_USER_PATH override (default ~/.claude/settings.json)
|
|
18
|
+
# SETTINGS_HEALTH_PROJECT_PATH override (default ./.claude/settings.json)
|
|
19
|
+
|
|
20
|
+
set -u
|
|
21
|
+
|
|
22
|
+
USER_SETTINGS="${SETTINGS_HEALTH_USER_PATH:-${HOME}/.claude/settings.json}"
|
|
23
|
+
PROJECT_SETTINGS="${SETTINGS_HEALTH_PROJECT_PATH:-./.claude/settings.json}"
|
|
24
|
+
|
|
25
|
+
INPUT=$(cat 2>/dev/null) # consume stdin if piped; SessionStart may or may not pipe
|
|
26
|
+
|
|
27
|
+
backup_and_warn() {
|
|
28
|
+
local path="$1"
|
|
29
|
+
local backup="${path}.broken.$(date +%Y%m%d-%H%M%S)"
|
|
30
|
+
cp -p "$path" "$backup" 2>/dev/null && \
|
|
31
|
+
echo "⚠ settings-json-health-check: $path failed to parse, backup written to $backup" >&2
|
|
32
|
+
echo " Fix or restore before continuing. Claude Code will not read a broken settings file." >&2
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
RC=0
|
|
36
|
+
|
|
37
|
+
for path in "$USER_SETTINGS" "$PROJECT_SETTINGS"; do
|
|
38
|
+
if [ -s "$path" ]; then
|
|
39
|
+
if ! jq -e '.' "$path" >/dev/null 2>&1; then
|
|
40
|
+
backup_and_warn "$path"
|
|
41
|
+
RC=2
|
|
42
|
+
fi
|
|
43
|
+
fi
|
|
44
|
+
done
|
|
45
|
+
|
|
46
|
+
# Check for /doctor dismissal. Several CC versions record this in a sentinel
|
|
47
|
+
# file at ~/.claude/doctor-dismissed.* — pattern varies, so we match any
|
|
48
|
+
# file matching the prefix and warn if one was written in the last 30 days.
|
|
49
|
+
if [ "${CC_SKIP_DOCTOR_CHECK:-0}" != "1" ]; then
|
|
50
|
+
DISMISSED=$(find "${HOME}/.claude" -maxdepth 2 -name 'doctor-dismissed*' -mtime -30 -print 2>/dev/null | head -1)
|
|
51
|
+
if [ -n "$DISMISSED" ]; then
|
|
52
|
+
echo "ℹ settings-json-health-check: /doctor diagnostic has been dismissed ($DISMISSED)" >&2
|
|
53
|
+
echo " Run /doctor again to see current diagnostics, or set CC_SKIP_DOCTOR_CHECK=1 to silence this notice." >&2
|
|
54
|
+
fi
|
|
55
|
+
fi
|
|
56
|
+
|
|
57
|
+
exit "$RC"
|
|
File without changes
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# ================================================================
|
|
3
|
+
# settings-regression-tester.sh — Detect Claude Code version
|
|
4
|
+
# bumps that may have silently
|
|
5
|
+
# reset permission rules
|
|
6
|
+
# ================================================================
|
|
7
|
+
# PURPOSE:
|
|
8
|
+
# Two May 2026 incidents documented permission-side regressions
|
|
9
|
+
# that surfaced only after a routine Claude Code version bump:
|
|
10
|
+
#
|
|
11
|
+
# #57491 — After v2.1.128, Allow rules in settings.json that had
|
|
12
|
+
# been auto-approving for weeks (Bash(npm:*) and similar)
|
|
13
|
+
# began re-prompting on every invocation. The settings
|
|
14
|
+
# file was unchanged; the runtime's interpretation
|
|
15
|
+
# had drifted.
|
|
16
|
+
# #57486 — After the same bump, persistent memory: directives
|
|
17
|
+
# that had been auto-loaded on previous sessions stopped
|
|
18
|
+
# being referenced after auto-compaction. The user
|
|
19
|
+
# assumed the configuration was still in effect.
|
|
20
|
+
#
|
|
21
|
+
# Both incidents share a structural cause: the user's settings
|
|
22
|
+
# were authored against version N, the runtime upgraded to N+1
|
|
23
|
+
# silently, and the settings interpretation drifted. The user
|
|
24
|
+
# has no signal that re-verification is needed.
|
|
25
|
+
#
|
|
26
|
+
# On SessionStart, this hook records the current Claude Code
|
|
27
|
+
# version and a hash of settings.json. On subsequent sessions,
|
|
28
|
+
# if the version has changed since the last recorded run, it
|
|
29
|
+
# warns the operator to re-confirm that Allow rules and memory:
|
|
30
|
+
# directives still take effect as expected. State is kept under
|
|
31
|
+
# ~/.claude/version-state.json.
|
|
32
|
+
#
|
|
33
|
+
# TRIGGER: SessionStart
|
|
34
|
+
#
|
|
35
|
+
# CONFIG:
|
|
36
|
+
# CC_SETTINGS_REGRESSION_BLOCK=0 (0 = warn; 1 = exit 2)
|
|
37
|
+
# CC_SETTINGS_REGRESSION_STATE="" (override state file path;
|
|
38
|
+
# default: ~/.claude/version-state.json)
|
|
39
|
+
#
|
|
40
|
+
# Born from:
|
|
41
|
+
# https://github.com/anthropics/claude-code/issues/57491
|
|
42
|
+
# https://github.com/anthropics/claude-code/issues/57486
|
|
43
|
+
# Related: chapter 9 of the May 2026 claim-verify case handbook
|
|
44
|
+
# ("自動の点検の道具の素案 5 件" — proposed detection
|
|
45
|
+
# tools 5 / 5, the fifth being settings-regression-tester)
|
|
46
|
+
# ================================================================
|
|
47
|
+
|
|
48
|
+
set -u
|
|
49
|
+
|
|
50
|
+
# Without jq, the parse below silently yields empty and this hook stops
|
|
51
|
+
# guarding - with no error anywhere. Say so. We deliberately do not exit
|
|
52
|
+
# here: blocking would halt every tool call, and exiting 0 would change
|
|
53
|
+
# the behaviour of guards that do not depend on the parsed value.
|
|
54
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
55
|
+
_nojq_warned="/tmp/cc-nojq-warned-settings-regression-tester-$PPID"
|
|
56
|
+
[ -f "$_nojq_warned" ] || {
|
|
57
|
+
echo "WARNING [settings-regression-tester]: jq not found - this hook cannot inspect tool calls and is NOT protecting you. Install jq." >&2
|
|
58
|
+
: > "$_nojq_warned"
|
|
59
|
+
}
|
|
60
|
+
fi
|
|
61
|
+
|
|
62
|
+
INPUT=$(cat 2>/dev/null || true)
|
|
63
|
+
CWD=$(printf '%s' "$INPUT" | jq -r '.cwd // empty' 2>/dev/null || true)
|
|
64
|
+
[ -z "$CWD" ] && CWD="${CLAUDE_PROJECT_DIR:-}"
|
|
65
|
+
|
|
66
|
+
BLOCK="${CC_SETTINGS_REGRESSION_BLOCK:-0}"
|
|
67
|
+
STATE_FILE="${CC_SETTINGS_REGRESSION_STATE:-${HOME}/.claude/version-state.json}"
|
|
68
|
+
|
|
69
|
+
# Resolve `claude --version`. If unavailable (CI test, broken PATH),
|
|
70
|
+
# fall back to environment override; on total failure exit silently.
|
|
71
|
+
CURRENT_VERSION="${CC_SETTINGS_REGRESSION_VERSION_OVERRIDE:-}"
|
|
72
|
+
if [ -z "$CURRENT_VERSION" ]; then
|
|
73
|
+
if command -v claude >/dev/null 2>&1; then
|
|
74
|
+
CURRENT_VERSION=$(claude --version 2>/dev/null | head -n 1 | awk '{print $1}' || true)
|
|
75
|
+
fi
|
|
76
|
+
fi
|
|
77
|
+
[ -z "$CURRENT_VERSION" ] && exit 0
|
|
78
|
+
|
|
79
|
+
# Hash the active settings.json files (user + project, each level).
|
|
80
|
+
hash_file() {
|
|
81
|
+
[ -f "$1" ] || return 0
|
|
82
|
+
sha256sum "$1" 2>/dev/null | awk '{print $1}'
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
USER_SETTINGS="${HOME}/.claude/settings.json"
|
|
86
|
+
USER_LOCAL="${HOME}/.claude/settings.local.json"
|
|
87
|
+
PROJ_SETTINGS=""
|
|
88
|
+
PROJ_LOCAL=""
|
|
89
|
+
if [ -n "$CWD" ]; then
|
|
90
|
+
PROJ_SETTINGS="${CWD}/.claude/settings.json"
|
|
91
|
+
PROJ_LOCAL="${CWD}/.claude/settings.local.json"
|
|
92
|
+
fi
|
|
93
|
+
|
|
94
|
+
USER_HASH=$(hash_file "$USER_SETTINGS")
|
|
95
|
+
USER_LOCAL_HASH=$(hash_file "$USER_LOCAL")
|
|
96
|
+
PROJ_HASH=$(hash_file "$PROJ_SETTINGS")
|
|
97
|
+
PROJ_LOCAL_HASH=$(hash_file "$PROJ_LOCAL")
|
|
98
|
+
|
|
99
|
+
# Read prior state if present.
|
|
100
|
+
PRIOR_VERSION=""
|
|
101
|
+
if [ -f "$STATE_FILE" ]; then
|
|
102
|
+
PRIOR_VERSION=$(jq -r '.version // empty' "$STATE_FILE" 2>/dev/null || true)
|
|
103
|
+
fi
|
|
104
|
+
|
|
105
|
+
# Always update state at the end of this run, even when nothing
|
|
106
|
+
# changes — this keeps the state file fresh and prevents the warning
|
|
107
|
+
# from firing on every session forever.
|
|
108
|
+
write_state() {
|
|
109
|
+
mkdir -p "$(dirname "$STATE_FILE")" 2>/dev/null
|
|
110
|
+
jq -n \
|
|
111
|
+
--arg v "$CURRENT_VERSION" \
|
|
112
|
+
--arg t "$(date -u '+%Y-%m-%dT%H:%M:%SZ')" \
|
|
113
|
+
--arg uh "$USER_HASH" \
|
|
114
|
+
--arg ul "$USER_LOCAL_HASH" \
|
|
115
|
+
--arg ph "$PROJ_HASH" \
|
|
116
|
+
--arg pl "$PROJ_LOCAL_HASH" \
|
|
117
|
+
'{version:$v, recorded:$t, hashes:{user:$uh, user_local:$ul, project:$ph, project_local:$pl}}' \
|
|
118
|
+
> "$STATE_FILE" 2>/dev/null || true
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
# First-ever run: record state and exit silently. Do not warn on
|
|
122
|
+
# the very first session because there is nothing to compare against.
|
|
123
|
+
if [ -z "$PRIOR_VERSION" ]; then
|
|
124
|
+
write_state
|
|
125
|
+
exit 0
|
|
126
|
+
fi
|
|
127
|
+
|
|
128
|
+
# Same version: nothing to flag. Refresh the state's recorded
|
|
129
|
+
# timestamp and exit.
|
|
130
|
+
if [ "$PRIOR_VERSION" = "$CURRENT_VERSION" ]; then
|
|
131
|
+
write_state
|
|
132
|
+
exit 0
|
|
133
|
+
fi
|
|
134
|
+
|
|
135
|
+
# Version changed. Build a list of representative Allow rules to
|
|
136
|
+
# remind the operator to re-verify.
|
|
137
|
+
collect_allow_rules() {
|
|
138
|
+
local f="$1"
|
|
139
|
+
[ -f "$f" ] || return 0
|
|
140
|
+
jq -r '.permissions.allow[]? // empty' "$f" 2>/dev/null | head -n 6
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
ALLOW_SAMPLE=$(
|
|
144
|
+
{
|
|
145
|
+
collect_allow_rules "$USER_SETTINGS"
|
|
146
|
+
collect_allow_rules "$USER_LOCAL"
|
|
147
|
+
collect_allow_rules "$PROJ_SETTINGS"
|
|
148
|
+
collect_allow_rules "$PROJ_LOCAL"
|
|
149
|
+
} | sort -u | head -n 6
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
# Detect memory: directives that may need re-loading after the bump.
|
|
153
|
+
MEMORY_HITS=""
|
|
154
|
+
for f in "$USER_SETTINGS" "$USER_LOCAL" "$PROJ_SETTINGS" "$PROJ_LOCAL"; do
|
|
155
|
+
[ -n "$f" ] || continue
|
|
156
|
+
[ -f "$f" ] || continue
|
|
157
|
+
if grep -qE '"memory"[[:space:]]*:' "$f" 2>/dev/null; then
|
|
158
|
+
MEMORY_HITS="${MEMORY_HITS} ${f}\n"
|
|
159
|
+
fi
|
|
160
|
+
done
|
|
161
|
+
|
|
162
|
+
printf '⚠️ settings-regression-tester: Claude Code version changed (%s -> %s).\n' "$PRIOR_VERSION" "$CURRENT_VERSION" >&2
|
|
163
|
+
printf ' Permission rules and memory directives can drift silently across\n' >&2
|
|
164
|
+
printf ' version bumps (Issues #57491, #57486). Re-verify before relying.\n' >&2
|
|
165
|
+
|
|
166
|
+
if [ -n "$ALLOW_SAMPLE" ]; then
|
|
167
|
+
printf '\n Active Allow rules to re-confirm:\n' >&2
|
|
168
|
+
printf '%s\n' "$ALLOW_SAMPLE" | sed 's/^/ - /' >&2
|
|
169
|
+
fi
|
|
170
|
+
|
|
171
|
+
if [ -n "$MEMORY_HITS" ]; then
|
|
172
|
+
printf '\n memory directives present (may need re-loading post-compact):\n' >&2
|
|
173
|
+
printf '%b' "$MEMORY_HITS" >&2
|
|
174
|
+
fi
|
|
175
|
+
|
|
176
|
+
printf '\n References:\n' >&2
|
|
177
|
+
printf ' https://github.com/anthropics/claude-code/issues/57491\n' >&2
|
|
178
|
+
printf ' https://github.com/anthropics/claude-code/issues/57486\n' >&2
|
|
179
|
+
printf ' Recommended fix: run a representative tool (e.g. Bash(npm:test)) and confirm it auto-approves;\n' >&2
|
|
180
|
+
printf ' open a fresh session and verify memory: directives are referenced before continuing.\n' >&2
|
|
181
|
+
|
|
182
|
+
write_state
|
|
183
|
+
|
|
184
|
+
if [ "$BLOCK" = "1" ]; then
|
|
185
|
+
exit 2
|
|
186
|
+
fi
|
|
187
|
+
|
|
188
|
+
exit 0
|
|
@@ -24,6 +24,18 @@
|
|
|
24
24
|
# }
|
|
25
25
|
# }
|
|
26
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-shell-config-truncation-guard-$PPID"
|
|
33
|
+
[ -f "$_nojq_warned" ] || {
|
|
34
|
+
echo "WARNING [shell-config-truncation-guard]: jq not found - this hook cannot inspect tool calls and is NOT protecting you. Install jq." >&2
|
|
35
|
+
: > "$_nojq_warned"
|
|
36
|
+
}
|
|
37
|
+
fi
|
|
38
|
+
|
|
27
39
|
INPUT=$(cat)
|
|
28
40
|
TOOL=$(echo "$INPUT" | jq -r '.tool_name // empty' 2>/dev/null)
|
|
29
41
|
|
|
@@ -16,6 +16,18 @@
|
|
|
16
16
|
#
|
|
17
17
|
# TRIGGER: PreToolUse MATCHER: "Bash"
|
|
18
18
|
|
|
19
|
+
# Without jq, the parse below silently yields empty and this hook stops
|
|
20
|
+
# guarding - with no error anywhere. Say so. We deliberately do not exit
|
|
21
|
+
# here: blocking would halt every tool call, and exiting 0 would change
|
|
22
|
+
# the behaviour of guards that do not depend on the parsed value.
|
|
23
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
24
|
+
_nojq_warned="/tmp/cc-nojq-warned-shell-wrapper-guard-$PPID"
|
|
25
|
+
[ -f "$_nojq_warned" ] || {
|
|
26
|
+
echo "WARNING [shell-wrapper-guard]: jq not found - this hook cannot inspect tool calls and is NOT protecting you. Install jq." >&2
|
|
27
|
+
: > "$_nojq_warned"
|
|
28
|
+
}
|
|
29
|
+
fi
|
|
30
|
+
|
|
19
31
|
INPUT=$(cat)
|
|
20
32
|
COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty' 2>/dev/null)
|
|
21
33
|
[ -z "$COMMAND" ] && exit 0
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# skill-cumulative-size-detector.sh — Detect cumulative skill descriptions size
|
|
3
|
+
# approaching the silent-drop threshold
|
|
4
|
+
#
|
|
5
|
+
# Solves: Issue #59921 — Skill descriptions silently dropped from system prompt
|
|
6
|
+
# above some cumulative-size threshold. The user enables many skills,
|
|
7
|
+
# the system prompt size grows past an undocumented threshold, and
|
|
8
|
+
# some skill descriptions are silently omitted from the active context.
|
|
9
|
+
# The user cannot tell which skills are active versus dropped from
|
|
10
|
+
# within a running session.
|
|
11
|
+
#
|
|
12
|
+
# How it works: SessionStart hook that walks both user-scope (~/.claude/skills)
|
|
13
|
+
# and project-scope (.claude/skills) directories, sums the byte
|
|
14
|
+
# counts of every SKILL.md description, and emits an advisory
|
|
15
|
+
# warning when the cumulative total approaches or exceeds the
|
|
16
|
+
# observed silent-drop threshold. Read-only; never modifies
|
|
17
|
+
# any skill content.
|
|
18
|
+
#
|
|
19
|
+
# TRIGGER: SessionStart
|
|
20
|
+
# MATCHER: ""
|
|
21
|
+
#
|
|
22
|
+
# Tunables:
|
|
23
|
+
# CC_SKILL_SIZE_WARN_BYTES — soft warning threshold (default 25000)
|
|
24
|
+
# CC_SKILL_SIZE_HARD_BYTES — hard warning threshold (default 50000)
|
|
25
|
+
# CC_SKILL_SIZE_DISABLE_WARNING=1 — suppress all warnings
|
|
26
|
+
#
|
|
27
|
+
# Exit: always 0 (advisory). Output goes to stderr.
|
|
28
|
+
|
|
29
|
+
set -uo pipefail
|
|
30
|
+
|
|
31
|
+
if [ "${CC_SKILL_SIZE_DISABLE_WARNING:-0}" = "1" ]; then
|
|
32
|
+
exit 0
|
|
33
|
+
fi
|
|
34
|
+
|
|
35
|
+
WARN_BYTES="${CC_SKILL_SIZE_WARN_BYTES:-25000}"
|
|
36
|
+
HARD_BYTES="${CC_SKILL_SIZE_HARD_BYTES:-50000}"
|
|
37
|
+
|
|
38
|
+
# Absorb the SessionStart JSON without depending on its fields.
|
|
39
|
+
read -r -d '' _INPUT < /dev/stdin 2>/dev/null || true
|
|
40
|
+
|
|
41
|
+
# Helper: append every SKILL.md byte count under a base directory.
|
|
42
|
+
count_skill_bytes() {
|
|
43
|
+
local base="$1"
|
|
44
|
+
local total=0
|
|
45
|
+
local count=0
|
|
46
|
+
[ -d "$base" ] || { printf '%d %d\n' 0 0; return 0; }
|
|
47
|
+
while IFS= read -r -d '' file; do
|
|
48
|
+
local size
|
|
49
|
+
size=$(wc -c < "$file" 2>/dev/null || printf '0')
|
|
50
|
+
total=$((total + size))
|
|
51
|
+
count=$((count + 1))
|
|
52
|
+
done < <(find "$base" -mindepth 1 -maxdepth 3 -type f -name 'SKILL.md' -print0 2>/dev/null)
|
|
53
|
+
printf '%d %d\n' "$total" "$count"
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
USER_BASE="${HOME}/.claude/skills"
|
|
57
|
+
read -r USER_BYTES USER_COUNT <<< "$(count_skill_bytes "$USER_BASE")"
|
|
58
|
+
|
|
59
|
+
PROJECT_BASE=".claude/skills"
|
|
60
|
+
read -r PROJECT_BYTES PROJECT_COUNT <<< "$(count_skill_bytes "$PROJECT_BASE")"
|
|
61
|
+
|
|
62
|
+
TOTAL_BYTES=$((USER_BYTES + PROJECT_BYTES))
|
|
63
|
+
TOTAL_COUNT=$((USER_COUNT + PROJECT_COUNT))
|
|
64
|
+
|
|
65
|
+
if [ "$TOTAL_BYTES" -lt "$WARN_BYTES" ]; then
|
|
66
|
+
exit 0
|
|
67
|
+
fi
|
|
68
|
+
|
|
69
|
+
LEVEL="WARN"
|
|
70
|
+
if [ "$TOTAL_BYTES" -ge "$HARD_BYTES" ]; then
|
|
71
|
+
LEVEL="HARD"
|
|
72
|
+
fi
|
|
73
|
+
|
|
74
|
+
{
|
|
75
|
+
echo "[$LEVEL] Cumulative skill description size approaches silent-drop threshold."
|
|
76
|
+
echo ""
|
|
77
|
+
echo " user scope ($USER_BASE): ${USER_BYTES} bytes across ${USER_COUNT} SKILL.md files"
|
|
78
|
+
echo " project scope ($PROJECT_BASE): ${PROJECT_BYTES} bytes across ${PROJECT_COUNT} SKILL.md files"
|
|
79
|
+
echo " cumulative total: ${TOTAL_BYTES} bytes across ${TOTAL_COUNT} skills"
|
|
80
|
+
echo ""
|
|
81
|
+
echo " soft warning threshold: ${WARN_BYTES} bytes"
|
|
82
|
+
echo " hard warning threshold: ${HARD_BYTES} bytes"
|
|
83
|
+
echo ""
|
|
84
|
+
echo " Issue #59921: Skill descriptions silently dropped from system prompt"
|
|
85
|
+
echo " above an undocumented cumulative-size threshold."
|
|
86
|
+
echo " The user cannot tell which skills are active versus"
|
|
87
|
+
echo " dropped from within a running session."
|
|
88
|
+
echo ""
|
|
89
|
+
if [ "$LEVEL" = "HARD" ]; then
|
|
90
|
+
echo " Some skill descriptions are very likely already being silently dropped."
|
|
91
|
+
else
|
|
92
|
+
echo " Some skill descriptions may be silently dropped in this session."
|
|
93
|
+
fi
|
|
94
|
+
echo " Recommended actions to confirm scope and recover the dropped skills:"
|
|
95
|
+
echo " 1. Run /skills to list which skills the model can currently see."
|
|
96
|
+
echo " 2. Cross-check against ls $USER_BASE $PROJECT_BASE to find the gap."
|
|
97
|
+
echo " 3. Disable rarely-used skills (move them out of the skills/ tree)"
|
|
98
|
+
echo " until the cumulative total falls below the warning threshold."
|
|
99
|
+
echo ""
|
|
100
|
+
echo " Suppress this warning: CC_SKILL_SIZE_DISABLE_WARNING=1"
|
|
101
|
+
echo " Adjust thresholds: CC_SKILL_SIZE_WARN_BYTES / CC_SKILL_SIZE_HARD_BYTES"
|
|
102
|
+
} >&2
|
|
103
|
+
|
|
104
|
+
exit 0
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# ================================================================
|
|
3
|
+
# skill-description-drop-detector.sh — Detect silent SKILL.md
|
|
4
|
+
# description drops above cumulative-size threshold
|
|
5
|
+
# ================================================================
|
|
6
|
+
# PURPOSE:
|
|
7
|
+
# Issue #59921 documents Claude Code v2.1.143 silently dropping
|
|
8
|
+
# the `description:` field from individual SKILL.md entries in
|
|
9
|
+
# the available-skills section of the system prompt when the
|
|
10
|
+
# cumulative size of all skill descriptions exceeds an internal
|
|
11
|
+
# threshold. The skill name stays in the list, but the description
|
|
12
|
+
# is replaced with nothing — silently degrading auto-trigger
|
|
13
|
+
# precision for the affected skills.
|
|
14
|
+
#
|
|
15
|
+
# The reporter verified the drop is cumulative: editing one
|
|
16
|
+
# SKILL.md to add ~800 chars caused a different skill's
|
|
17
|
+
# description to silently disappear.
|
|
18
|
+
#
|
|
19
|
+
# Operators have no way to detect this from outside the session.
|
|
20
|
+
# The skill appears installed; the model just stops triggering
|
|
21
|
+
# it correctly.
|
|
22
|
+
#
|
|
23
|
+
# DETECTION:
|
|
24
|
+
# At SessionStart, count the SKILL.md files in the user's
|
|
25
|
+
# ~/.claude/skills/ and any plugin SKILL.md directories. Compute
|
|
26
|
+
# the cumulative size of `description:` fields. If the total
|
|
27
|
+
# exceeds a threshold (default 50000 chars, matching reporter's
|
|
28
|
+
# ~153 skill threshold), emit a warning to operator surfaces.
|
|
29
|
+
#
|
|
30
|
+
# TRIGGER: SessionStart
|
|
31
|
+
# MATCHER: (none)
|
|
32
|
+
#
|
|
33
|
+
# OUTPUT:
|
|
34
|
+
# When threshold exceeded: a system-reminder via
|
|
35
|
+
# hookSpecificOutput.additionalContext warning the model that
|
|
36
|
+
# some skill descriptions may have been silently dropped and
|
|
37
|
+
# advising it to verify auto-trigger behavior.
|
|
38
|
+
#
|
|
39
|
+
# CONFIGURATION:
|
|
40
|
+
# CC_SKILL_DESC_THRESHOLD — total description size threshold
|
|
41
|
+
# in chars (default: 50000).
|
|
42
|
+
# CC_SKILL_DESC_DIRS — colon-separated list of directories
|
|
43
|
+
# to scan. Default scans
|
|
44
|
+
# ~/.claude/skills/ plus any
|
|
45
|
+
# directory in ~/.claude/plugins/
|
|
46
|
+
# containing a SKILL.md.
|
|
47
|
+
#
|
|
48
|
+
# RELATED ISSUES:
|
|
49
|
+
# https://github.com/anthropics/claude-code/issues/59921
|
|
50
|
+
# ================================================================
|
|
51
|
+
|
|
52
|
+
set -u
|
|
53
|
+
|
|
54
|
+
THRESHOLD="${CC_SKILL_DESC_THRESHOLD:-50000}"
|
|
55
|
+
|
|
56
|
+
# Discover skill directories. Default scans:
|
|
57
|
+
# 1. ~/.claude/skills/*/SKILL.md
|
|
58
|
+
# 2. ~/.claude/plugins/*/SKILL.md (plugin-shipped skills)
|
|
59
|
+
if [ -n "${CC_SKILL_DESC_DIRS:-}" ]; then
|
|
60
|
+
IFS=':' read -ra SKILL_DIRS <<< "$CC_SKILL_DESC_DIRS"
|
|
61
|
+
else
|
|
62
|
+
SKILL_DIRS=()
|
|
63
|
+
[ -d "$HOME/.claude/skills" ] && SKILL_DIRS+=("$HOME/.claude/skills")
|
|
64
|
+
[ -d "$HOME/.claude/plugins" ] && SKILL_DIRS+=("$HOME/.claude/plugins")
|
|
65
|
+
fi
|
|
66
|
+
|
|
67
|
+
[ ${#SKILL_DIRS[@]} -eq 0 ] && exit 0
|
|
68
|
+
|
|
69
|
+
# Find every SKILL.md across the directories.
|
|
70
|
+
SKILL_FILES=()
|
|
71
|
+
for dir in "${SKILL_DIRS[@]}"; do
|
|
72
|
+
[ -d "$dir" ] || continue
|
|
73
|
+
while IFS= read -r f; do
|
|
74
|
+
SKILL_FILES+=("$f")
|
|
75
|
+
done < <(find "$dir" -name "SKILL.md" -type f 2>/dev/null)
|
|
76
|
+
done
|
|
77
|
+
|
|
78
|
+
[ ${#SKILL_FILES[@]} -eq 0 ] && exit 0
|
|
79
|
+
|
|
80
|
+
SKILL_COUNT=${#SKILL_FILES[@]}
|
|
81
|
+
TOTAL_DESC_SIZE=0
|
|
82
|
+
SKILLS_WITH_DESC=0
|
|
83
|
+
SKILLS_WITHOUT_DESC=0
|
|
84
|
+
|
|
85
|
+
# For each SKILL.md, extract the description: field from YAML
|
|
86
|
+
# frontmatter and sum the lengths.
|
|
87
|
+
for f in "${SKILL_FILES[@]}"; do
|
|
88
|
+
# Extract description: field. It can be a single-line or
|
|
89
|
+
# folded-block. Single-line case is most common.
|
|
90
|
+
desc=$(awk '
|
|
91
|
+
/^---$/ { count++; next }
|
|
92
|
+
count == 1 && /^description:/ {
|
|
93
|
+
sub(/^description:[ \t]*/, "")
|
|
94
|
+
sub(/^"/, ""); sub(/"$/, "")
|
|
95
|
+
sub(/^'\''/, ""); sub(/'\''$/, "")
|
|
96
|
+
print
|
|
97
|
+
exit
|
|
98
|
+
}
|
|
99
|
+
' "$f" 2>/dev/null)
|
|
100
|
+
|
|
101
|
+
if [ -n "$desc" ]; then
|
|
102
|
+
SKILLS_WITH_DESC=$((SKILLS_WITH_DESC + 1))
|
|
103
|
+
len=${#desc}
|
|
104
|
+
TOTAL_DESC_SIZE=$((TOTAL_DESC_SIZE + len))
|
|
105
|
+
else
|
|
106
|
+
SKILLS_WITHOUT_DESC=$((SKILLS_WITHOUT_DESC + 1))
|
|
107
|
+
fi
|
|
108
|
+
done
|
|
109
|
+
|
|
110
|
+
# Below threshold. No warning.
|
|
111
|
+
if [ "$TOTAL_DESC_SIZE" -lt "$THRESHOLD" ]; then
|
|
112
|
+
exit 0
|
|
113
|
+
fi
|
|
114
|
+
|
|
115
|
+
# Above threshold. Emit a warning via hookSpecificOutput.
|
|
116
|
+
WARNING="===== SKILL DESCRIPTION CUMULATIVE-SIZE WARNING =====
|
|
117
|
+
Found ${SKILL_COUNT} SKILL.md file(s) totaling ${TOTAL_DESC_SIZE} chars in
|
|
118
|
+
description fields (threshold: ${THRESHOLD}).
|
|
119
|
+
|
|
120
|
+
Per Issue #59921, Claude Code v2.1.143 silently drops the description: field
|
|
121
|
+
from individual skill entries in the available-skills section when the
|
|
122
|
+
cumulative description size exceeds an internal threshold. The skill name
|
|
123
|
+
stays visible; the description is replaced with nothing. Auto-trigger
|
|
124
|
+
precision degrades for affected skills, but the operator has no visible
|
|
125
|
+
signal that this is happening.
|
|
126
|
+
|
|
127
|
+
Recommended verification:
|
|
128
|
+
1. Inspect the available-skills section of this session's system prompt.
|
|
129
|
+
2. For each skill name without a description, read the corresponding
|
|
130
|
+
SKILL.md file directly and confirm description: is well-formed.
|
|
131
|
+
3. If well-formed descriptions are silently empty in the prompt, you are
|
|
132
|
+
hitting the threshold. Mitigation: shorten descriptions of less-used
|
|
133
|
+
skills, or split into smaller plugin groups.
|
|
134
|
+
|
|
135
|
+
Skills with description: ${SKILLS_WITH_DESC}
|
|
136
|
+
Skills without description: ${SKILLS_WITHOUT_DESC}
|
|
137
|
+
===== END WARNING ====="
|
|
138
|
+
|
|
139
|
+
jq -n \
|
|
140
|
+
--arg ctx "$WARNING" \
|
|
141
|
+
'{
|
|
142
|
+
hookSpecificOutput: {
|
|
143
|
+
hookEventName: "SessionStart",
|
|
144
|
+
additionalContext: $ctx
|
|
145
|
+
}
|
|
146
|
+
}'
|
|
147
|
+
|
|
148
|
+
exit 0
|
package/examples/skill-gate.sh
CHANGED
|
File without changes
|