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,44 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# commit-all-scope-guard.sh — Surface the full scope before a "commit everything"
|
|
3
|
+
# so in-progress work isn't swept into a commit.
|
|
4
|
+
#
|
|
5
|
+
# Solves (#68915): Claude tried to roll back its own change and ran a
|
|
6
|
+
# commit-everything (git commit -a / git add -A / git add .), which staged ALL
|
|
7
|
+
# modified + untracked files — including the user's unrelated in-progress edits —
|
|
8
|
+
# instead of only the files it had touched. commit-scope-guard.sh checks the
|
|
9
|
+
# already-STAGED count, so it never sees `git commit -a` (those files aren't in
|
|
10
|
+
# the index until commit time). This guard inspects the working tree and lists
|
|
11
|
+
# exactly what a commit-everything WOULD include, before it happens.
|
|
12
|
+
#
|
|
13
|
+
# Precision: warn (non-blocking) — the operation is legitimate and reversible
|
|
14
|
+
# (git reset --soft HEAD^), so we surface scope rather than block. It fires only
|
|
15
|
+
# on the commit-everything shapes, not on `git add <explicit paths>`.
|
|
16
|
+
#
|
|
17
|
+
# TRIGGER: PreToolUse MATCHER: "Bash"
|
|
18
|
+
|
|
19
|
+
CMD=$(cat | jq -r '.tool_input.command // empty' 2>/dev/null)
|
|
20
|
+
[ -z "$CMD" ] && exit 0
|
|
21
|
+
|
|
22
|
+
# Match: git commit -a / -am / --all ; git add -A / --all / . / -- .
|
|
23
|
+
COMMIT_ALL='git[[:space:]]+commit[[:space:]]+(-[a-zA-Z]*a|--all)'
|
|
24
|
+
ADD_ALL='git[[:space:]]+add[[:space:]]+(-A|--all|\.|-- \.)([[:space:]]|$)'
|
|
25
|
+
echo "$CMD" | grep -qE "$COMMIT_ALL|$ADD_ALL" || exit 0
|
|
26
|
+
|
|
27
|
+
# What would be swept in (tracked-modified + untracked), excluding ignored.
|
|
28
|
+
FILES=$(git status --porcelain 2>/dev/null)
|
|
29
|
+
[ -z "$FILES" ] && exit 0
|
|
30
|
+
COUNT=$(printf '%s\n' "$FILES" | grep -c .)
|
|
31
|
+
|
|
32
|
+
{
|
|
33
|
+
echo "NOTE: this is a commit-everything — it will include ALL $COUNT changed/untracked"
|
|
34
|
+
echo "file(s) below, not just the ones you edited. In-progress work gets swept in:"
|
|
35
|
+
printf '%s\n' "$FILES" | head -12 | sed 's/^/ /'
|
|
36
|
+
[ "$COUNT" -gt 12 ] && echo " ... and $((COUNT-12)) more"
|
|
37
|
+
echo ""
|
|
38
|
+
echo "If you only meant some of these, stage them explicitly instead:"
|
|
39
|
+
echo " git add <path1> <path2> && git commit -m ..."
|
|
40
|
+
echo "Already committed too much? Undo without losing anything:"
|
|
41
|
+
echo " git reset --soft HEAD^ # un-commits, keeps every change staged"
|
|
42
|
+
} >&2
|
|
43
|
+
|
|
44
|
+
exit 0
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
# The "if" field (v2.1.85+) skips this hook for non-commit commands.
|
|
26
26
|
# Without "if", the hook still works — it checks internally and exits early.
|
|
27
27
|
#
|
|
28
|
-
# TRIGGER:
|
|
28
|
+
# TRIGGER: PostToolUse MATCHER: "Bash"
|
|
29
29
|
|
|
30
30
|
INPUT=$(cat)
|
|
31
31
|
COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty' 2>/dev/null)
|
|
@@ -17,7 +17,12 @@ COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty' 2>/dev/null)
|
|
|
17
17
|
echo "$COMMAND" | grep -qE '^\s*git\s+commit' || exit 0
|
|
18
18
|
|
|
19
19
|
# Extract commit message
|
|
20
|
-
|
|
20
|
+
# -P は GNU 拡張で、BSD grep では MSG が空になり、この検査が丸ごと消える。
|
|
21
|
+
# \x27 と非貪欲(.+?)も PCRE 固有なので、引用符の中身を文字クラスで表す形にする。
|
|
22
|
+
MSG=$(echo "$COMMAND" \
|
|
23
|
+
| grep -oE -- '-m[[:space:]]+"[^"]*"|-m[[:space:]]+'"'"'[^'"'"']*'"'"'' \
|
|
24
|
+
| sed -E 's/^-m[[:space:]]*//' \
|
|
25
|
+
| sed -E 's/^["'"'"']//; s/["'"'"']$//')
|
|
21
26
|
[ -z "$MSG" ] && exit 0
|
|
22
27
|
|
|
23
28
|
# Check message quality
|
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# ================================================================
|
|
3
|
+
# commitment-carry-forward-arrest.sh — Row 7 operator-side substrate
|
|
4
|
+
# ================================================================
|
|
5
|
+
# PURPOSE:
|
|
6
|
+
# Defends against the failure mode where the agent's commitment
|
|
7
|
+
# emitted in turn N is silently dropped when the operator's
|
|
8
|
+
# turn N+1 introduces a task-shift without explicit re-anchor.
|
|
9
|
+
#
|
|
10
|
+
# Filed at anthropics/claude-code#61388 (@beq00000). The agent
|
|
11
|
+
# does not internally retain its own articulated commitment as
|
|
12
|
+
# a pending action-item across turns; without operator-side
|
|
13
|
+
# instrumentation, the commitment dissolves silently and the
|
|
14
|
+
# work it referenced is never completed.
|
|
15
|
+
#
|
|
16
|
+
# This hook implements a two-event ledger:
|
|
17
|
+
# - On Stop: scans the assistant's final response for commitment
|
|
18
|
+
# patterns, writes commitment receipts to a per-session ledger.
|
|
19
|
+
# - On UserPromptSubmit: reads the ledger, detects task-shift
|
|
20
|
+
# in the current prompt without re-anchor to any outstanding
|
|
21
|
+
# commitment, optionally inserts a re-anchor reminder into
|
|
22
|
+
# the prompt (advisory default) or blocks (strict mode).
|
|
23
|
+
#
|
|
24
|
+
# TRIGGER: Stop, UserPromptSubmit
|
|
25
|
+
# Stop writes the commitment; UserPromptSubmit detects the task shift.
|
|
26
|
+
# Same script, branches on the event name.
|
|
27
|
+
#
|
|
28
|
+
# WHY THIS MATTERS:
|
|
29
|
+
# Row 7 in the lifecycle-event × MAST-mode matrix at
|
|
30
|
+
# https://gist.github.com/yurukusa/bb3812006d92d49cf55db74a65fc4032
|
|
31
|
+
# It is the first row where the gate fires on the relationship
|
|
32
|
+
# between turns (turn-N event evaluated against turn-(N-k) state).
|
|
33
|
+
# Rows 1-6 are all single-turn lifecycle events.
|
|
34
|
+
#
|
|
35
|
+
# The structural property: the agent's review-passing surface
|
|
36
|
+
# structure (the commitment was coherently articulated, the
|
|
37
|
+
# continuity-of-thought looked correct in turn N) does not gate
|
|
38
|
+
# the predicate-fulfillment (the action that the commitment
|
|
39
|
+
# referenced). Operator-side ledger + re-anchor detection
|
|
40
|
+
# instruments the across-turn predicate-fulfillment check that
|
|
41
|
+
# the agent does not perform internally.
|
|
42
|
+
#
|
|
43
|
+
# DETECTION GRAMMAR (commitment patterns in assistant response):
|
|
44
|
+
# - "I'll <verb> ..." / "I will <verb> ..."
|
|
45
|
+
# - "Next, I'll <verb> ..." / "Next I'll <verb> ..."
|
|
46
|
+
# - "Let me <verb> ..." (when followed by ", I'll" or "and then")
|
|
47
|
+
# - "I'm going to <verb> ..."
|
|
48
|
+
# - "After X, I'll <verb> ..."
|
|
49
|
+
# - "Once X completes, I'll <verb> ..."
|
|
50
|
+
#
|
|
51
|
+
# DETECTION GRAMMAR (task-shift in user prompt):
|
|
52
|
+
# - Current prompt does NOT contain action-noun keywords from
|
|
53
|
+
# any outstanding commitment (lexical overlap < threshold)
|
|
54
|
+
# - OR current prompt contains pivot markers: "skip", "instead",
|
|
55
|
+
# "now", "actually", "wait", "change of plan"
|
|
56
|
+
# - Re-anchor signal: prompt contains the commitment's
|
|
57
|
+
# action-verb or object-noun (operator referenced it back)
|
|
58
|
+
#
|
|
59
|
+
# LEDGER FORMAT (one JSONL per commitment):
|
|
60
|
+
# {"ts":"2026-05-22T23:30:00Z",
|
|
61
|
+
# "session_id":"<sha256 of session token>",
|
|
62
|
+
# "turn":N,
|
|
63
|
+
# "commitment_hash":"<sha256 of commitment text>",
|
|
64
|
+
# "commitment_summary":"<first 80 chars, no PII>",
|
|
65
|
+
# "byte_length":<int>,
|
|
66
|
+
# "action_keywords":["push","update","verify"],
|
|
67
|
+
# "status":"open"}
|
|
68
|
+
#
|
|
69
|
+
# LEDGER LOCATION:
|
|
70
|
+
# ${HOME}/.claude/receipts/outstanding-commitments-<session>.jsonl
|
|
71
|
+
#
|
|
72
|
+
# CONFIGURATION:
|
|
73
|
+
# CC_COMMITMENT_LEDGER_MODE
|
|
74
|
+
# - "advisory" (default): observe and write to stderr, no block
|
|
75
|
+
# - "strict": exit 2 with re-anchor instructions
|
|
76
|
+
# CC_COMMITMENT_LEDGER_DIR
|
|
77
|
+
# - Directory for ledger files (default: ~/.claude/receipts/)
|
|
78
|
+
# CC_COMMITMENT_TASK_SHIFT_THRESHOLD
|
|
79
|
+
# - Lexical-overlap threshold below which task-shift fires
|
|
80
|
+
# (default: 0.20 — at least one shared action-keyword required)
|
|
81
|
+
#
|
|
82
|
+
# PHI-SAFETY:
|
|
83
|
+
# The commitment text itself is hashed (sha256), never stored
|
|
84
|
+
# raw. Only the first 80 chars of summary are kept, with PII
|
|
85
|
+
# masking applied (email, phone, SSN patterns elided).
|
|
86
|
+
#
|
|
87
|
+
# TESTING:
|
|
88
|
+
# Run examples/commitment-carry-forward-arrest.sh via the test
|
|
89
|
+
# suite in tests/test-commitment-carry-forward-arrest.sh
|
|
90
|
+
#
|
|
91
|
+
# AUTHOR: yurukusa (https://github.com/yurukusa)
|
|
92
|
+
# LICENSE: MIT
|
|
93
|
+
# ================================================================
|
|
94
|
+
|
|
95
|
+
set -euo pipefail
|
|
96
|
+
|
|
97
|
+
# Read JSON event from stdin
|
|
98
|
+
EVENT_INPUT=$(cat)
|
|
99
|
+
|
|
100
|
+
# Extract event name (Stop, UserPromptSubmit)
|
|
101
|
+
EVENT_NAME=$(echo "$EVENT_INPUT" | python3 -c "
|
|
102
|
+
import json, sys
|
|
103
|
+
try:
|
|
104
|
+
d = json.loads(sys.stdin.read())
|
|
105
|
+
print(d.get('hook_event_name', ''))
|
|
106
|
+
except Exception:
|
|
107
|
+
print('')
|
|
108
|
+
" 2>/dev/null || echo "")
|
|
109
|
+
|
|
110
|
+
# Configuration with defaults
|
|
111
|
+
MODE="${CC_COMMITMENT_LEDGER_MODE:-advisory}"
|
|
112
|
+
LEDGER_DIR="${CC_COMMITMENT_LEDGER_DIR:-$HOME/.claude/receipts}"
|
|
113
|
+
TASK_SHIFT_THRESHOLD="${CC_COMMITMENT_TASK_SHIFT_THRESHOLD:-0.20}"
|
|
114
|
+
|
|
115
|
+
# Ensure ledger directory exists
|
|
116
|
+
mkdir -p "$LEDGER_DIR"
|
|
117
|
+
|
|
118
|
+
# Derive session ID (hash of session token if present, fallback to
|
|
119
|
+
# CC_SESSION_ID env or "default")
|
|
120
|
+
SESSION_RAW="${CC_SESSION_ID:-default}"
|
|
121
|
+
SESSION_ID=$(echo -n "$SESSION_RAW" | sha256sum | cut -c1-16)
|
|
122
|
+
|
|
123
|
+
LEDGER_FILE="$LEDGER_DIR/outstanding-commitments-${SESSION_ID}.jsonl"
|
|
124
|
+
|
|
125
|
+
# Mask PII patterns in a text snippet (emails, phones, SSN)
|
|
126
|
+
mask_pii() {
|
|
127
|
+
local text="$1"
|
|
128
|
+
# Email
|
|
129
|
+
text=$(echo "$text" | sed -E 's/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}/<EMAIL>/g')
|
|
130
|
+
# Phone (US/JP rough)
|
|
131
|
+
text=$(echo "$text" | sed -E 's/\b[0-9]{3,4}-[0-9]{2,4}-[0-9]{4}\b/<PHONE>/g')
|
|
132
|
+
# SSN-like
|
|
133
|
+
text=$(echo "$text" | sed -E 's/\b[0-9]{3}-[0-9]{2}-[0-9]{4}\b/<ID>/g')
|
|
134
|
+
echo "$text"
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
# Extract commitment patterns from assistant response text
|
|
138
|
+
extract_commitments() {
|
|
139
|
+
local text="$1"
|
|
140
|
+
# Patterns matching commitment language (case-insensitive, English-focused
|
|
141
|
+
# baseline; Japanese future-tense forms not yet handled in this prototype)
|
|
142
|
+
echo "$text" | python3 -c "
|
|
143
|
+
import sys, re
|
|
144
|
+
text = sys.stdin.read()
|
|
145
|
+
# Commitment patterns
|
|
146
|
+
patterns = [
|
|
147
|
+
r\"I'll\s+(\w+(?:\s+\w+){0,5})\",
|
|
148
|
+
r'I will\s+(\w+(?:\s+\w+){0,5})',
|
|
149
|
+
r\"Next,?\s+I'll\s+(\w+(?:\s+\w+){0,5})\",
|
|
150
|
+
r\"I'm going to\s+(\w+(?:\s+\w+){0,5})\",
|
|
151
|
+
r'After\s+\w+(?:\s+\w+){0,3},?\s+(?:I will|I\\'ll)\s+(\w+(?:\s+\w+){0,5})',
|
|
152
|
+
r'Once\s+\w+(?:\s+\w+){0,3}\s+(?:completes?|finishes?|lands?),?\s+(?:I will|I\\'ll)\s+(\w+(?:\s+\w+){0,5})',
|
|
153
|
+
]
|
|
154
|
+
seen = set()
|
|
155
|
+
for p in patterns:
|
|
156
|
+
for m in re.finditer(p, text, re.IGNORECASE):
|
|
157
|
+
snippet = m.group(0).strip()[:80]
|
|
158
|
+
if snippet not in seen:
|
|
159
|
+
seen.add(snippet)
|
|
160
|
+
print(snippet)
|
|
161
|
+
"
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
# Compute lexical overlap (Jaccard-like, simple word-set intersection)
|
|
165
|
+
# between two text strings
|
|
166
|
+
compute_overlap() {
|
|
167
|
+
local a="$1"
|
|
168
|
+
local b="$2"
|
|
169
|
+
python3 -c "
|
|
170
|
+
import sys, re
|
|
171
|
+
def tokens(s):
|
|
172
|
+
return set(re.findall(r'\b[a-z]{3,}\b', s.lower()))
|
|
173
|
+
a_set = tokens('''$a''')
|
|
174
|
+
b_set = tokens('''$b''')
|
|
175
|
+
if not a_set:
|
|
176
|
+
print(0.0)
|
|
177
|
+
else:
|
|
178
|
+
inter = a_set & b_set
|
|
179
|
+
print(len(inter) / max(len(a_set), 1))
|
|
180
|
+
"
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
# Stop event: scan assistant response, extract commitments, write to ledger
|
|
184
|
+
handle_stop() {
|
|
185
|
+
local response_text
|
|
186
|
+
response_text=$(echo "$EVENT_INPUT" | python3 -c "
|
|
187
|
+
import json, sys
|
|
188
|
+
try:
|
|
189
|
+
d = json.loads(sys.stdin.read())
|
|
190
|
+
# Try multiple locations for the assistant response
|
|
191
|
+
resp = d.get('response', '') or d.get('assistant_response', '') or d.get('text', '')
|
|
192
|
+
if isinstance(resp, dict):
|
|
193
|
+
resp = resp.get('text', '') or resp.get('content', '')
|
|
194
|
+
print(resp)
|
|
195
|
+
except Exception:
|
|
196
|
+
print('')
|
|
197
|
+
" 2>/dev/null || echo "")
|
|
198
|
+
|
|
199
|
+
if [ -z "$response_text" ]; then
|
|
200
|
+
# No response text to scan; exit silently
|
|
201
|
+
exit 0
|
|
202
|
+
fi
|
|
203
|
+
|
|
204
|
+
# Get turn number
|
|
205
|
+
local turn
|
|
206
|
+
turn=$(echo "$EVENT_INPUT" | python3 -c "
|
|
207
|
+
import json, sys
|
|
208
|
+
try:
|
|
209
|
+
d = json.loads(sys.stdin.read())
|
|
210
|
+
print(d.get('turn', 0))
|
|
211
|
+
except Exception:
|
|
212
|
+
print(0)
|
|
213
|
+
" 2>/dev/null || echo "0")
|
|
214
|
+
|
|
215
|
+
local ts
|
|
216
|
+
ts=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
|
|
217
|
+
|
|
218
|
+
# Extract each commitment line and write a JSONL receipt
|
|
219
|
+
extract_commitments "$response_text" | while read -r commitment; do
|
|
220
|
+
if [ -z "$commitment" ]; then continue; fi
|
|
221
|
+
local masked
|
|
222
|
+
masked=$(mask_pii "$commitment")
|
|
223
|
+
local hash
|
|
224
|
+
hash=$(echo -n "$commitment" | sha256sum | cut -c1-16)
|
|
225
|
+
local bytelen=${#commitment}
|
|
226
|
+
# Extract action keywords (words that are likely verbs/nouns)
|
|
227
|
+
local keywords
|
|
228
|
+
keywords=$(echo "$commitment" | python3 -c "
|
|
229
|
+
import sys, re, json
|
|
230
|
+
text = sys.stdin.read().lower()
|
|
231
|
+
words = re.findall(r'\b[a-z]{4,}\b', text)
|
|
232
|
+
# Exclude common stop words
|
|
233
|
+
stop = {'will', 'have', 'going', 'next', 'then', 'after', 'once', 'this', 'that', 'with'}
|
|
234
|
+
keywords = [w for w in words if w not in stop][:5]
|
|
235
|
+
print(json.dumps(keywords))
|
|
236
|
+
")
|
|
237
|
+
printf '{"ts":"%s","session_id":"%s","turn":%s,"commitment_hash":"%s","commitment_summary":"%s","byte_length":%s,"action_keywords":%s,"status":"open"}\n' \
|
|
238
|
+
"$ts" "$SESSION_ID" "$turn" "$hash" "$masked" "$bytelen" "$keywords" \
|
|
239
|
+
>> "$LEDGER_FILE"
|
|
240
|
+
done
|
|
241
|
+
|
|
242
|
+
exit 0
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
# UserPromptSubmit event: read ledger, compare to current prompt, detect task-shift
|
|
246
|
+
handle_user_prompt() {
|
|
247
|
+
local prompt_text
|
|
248
|
+
prompt_text=$(echo "$EVENT_INPUT" | python3 -c "
|
|
249
|
+
import json, sys
|
|
250
|
+
try:
|
|
251
|
+
d = json.loads(sys.stdin.read())
|
|
252
|
+
print(d.get('prompt', '') or d.get('user_prompt', '') or d.get('message', ''))
|
|
253
|
+
except Exception:
|
|
254
|
+
print('')
|
|
255
|
+
" 2>/dev/null || echo "")
|
|
256
|
+
|
|
257
|
+
if [ -z "$prompt_text" ]; then
|
|
258
|
+
exit 0
|
|
259
|
+
fi
|
|
260
|
+
|
|
261
|
+
# If no ledger file, no outstanding commitments to check
|
|
262
|
+
if [ ! -f "$LEDGER_FILE" ]; then
|
|
263
|
+
exit 0
|
|
264
|
+
fi
|
|
265
|
+
|
|
266
|
+
# Read open commitments
|
|
267
|
+
local open_commitments
|
|
268
|
+
open_commitments=$(python3 -c "
|
|
269
|
+
import json, sys
|
|
270
|
+
try:
|
|
271
|
+
with open('$LEDGER_FILE') as f:
|
|
272
|
+
lines = [json.loads(l) for l in f if l.strip()]
|
|
273
|
+
open_ones = [l for l in lines if l.get('status') == 'open']
|
|
274
|
+
print(json.dumps(open_ones))
|
|
275
|
+
except Exception as e:
|
|
276
|
+
print('[]')
|
|
277
|
+
" 2>/dev/null || echo "[]")
|
|
278
|
+
|
|
279
|
+
local open_count
|
|
280
|
+
open_count=$(echo "$open_commitments" | python3 -c "
|
|
281
|
+
import json, sys
|
|
282
|
+
print(len(json.load(sys.stdin)))
|
|
283
|
+
" 2>/dev/null || echo "0")
|
|
284
|
+
|
|
285
|
+
if [ "$open_count" -eq 0 ]; then
|
|
286
|
+
exit 0
|
|
287
|
+
fi
|
|
288
|
+
|
|
289
|
+
# Check for re-anchor: does the current prompt contain action keywords
|
|
290
|
+
# from any outstanding commitment?
|
|
291
|
+
local has_reanchor
|
|
292
|
+
has_reanchor=$(python3 -c "
|
|
293
|
+
import json, sys, re
|
|
294
|
+
|
|
295
|
+
with open('$LEDGER_FILE') as f:
|
|
296
|
+
commitments = [json.loads(l) for l in f if l.strip()]
|
|
297
|
+
|
|
298
|
+
prompt = '''$prompt_text'''.lower()
|
|
299
|
+
prompt_words = set(re.findall(r'\b[a-z]{4,}\b', prompt))
|
|
300
|
+
|
|
301
|
+
for c in commitments:
|
|
302
|
+
if c.get('status') != 'open':
|
|
303
|
+
continue
|
|
304
|
+
keywords = c.get('action_keywords', [])
|
|
305
|
+
if any(k.lower() in prompt_words for k in keywords):
|
|
306
|
+
print('yes')
|
|
307
|
+
sys.exit()
|
|
308
|
+
print('no')
|
|
309
|
+
" 2>/dev/null || echo "no")
|
|
310
|
+
|
|
311
|
+
# Check for explicit pivot markers
|
|
312
|
+
local has_pivot
|
|
313
|
+
has_pivot=$(echo "$prompt_text" | python3 -c "
|
|
314
|
+
import sys, re
|
|
315
|
+
text = sys.stdin.read().lower()
|
|
316
|
+
pivots = ['skip that', 'never mind', 'instead', 'actually', 'wait', 'change of plan', 'forget that', 'different task', 'new task']
|
|
317
|
+
for p in pivots:
|
|
318
|
+
if p in text:
|
|
319
|
+
print('yes')
|
|
320
|
+
sys.exit()
|
|
321
|
+
print('no')
|
|
322
|
+
" 2>/dev/null || echo "no")
|
|
323
|
+
|
|
324
|
+
# Task-shift fires if: no re-anchor AND either pivot OR low lexical overlap
|
|
325
|
+
if [ "$has_reanchor" = "no" ]; then
|
|
326
|
+
local message="commitment-carry-forward: $open_count outstanding commitment(s) detected; current prompt may orphan them. Consider re-anchoring or explicitly withdrawing."
|
|
327
|
+
if [ "$MODE" = "strict" ] && [ "$has_pivot" = "yes" ]; then
|
|
328
|
+
echo "ARREST [commitment-carry-forward-arrest]: $message" >&2
|
|
329
|
+
echo "Outstanding commitments:" >&2
|
|
330
|
+
python3 -c "
|
|
331
|
+
import json
|
|
332
|
+
with open('$LEDGER_FILE') as f:
|
|
333
|
+
for l in f:
|
|
334
|
+
c = json.loads(l.strip())
|
|
335
|
+
if c.get('status') == 'open':
|
|
336
|
+
print(' - turn', c.get('turn'), ':', c.get('commitment_summary'))
|
|
337
|
+
" >&2
|
|
338
|
+
exit 2
|
|
339
|
+
else
|
|
340
|
+
# Advisory mode: write to stderr but don't block
|
|
341
|
+
echo "ADVISORY [commitment-carry-forward]: $message" >&2
|
|
342
|
+
exit 0
|
|
343
|
+
fi
|
|
344
|
+
fi
|
|
345
|
+
|
|
346
|
+
exit 0
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
# Dispatch on event name
|
|
350
|
+
case "$EVENT_NAME" in
|
|
351
|
+
Stop|stop)
|
|
352
|
+
handle_stop
|
|
353
|
+
;;
|
|
354
|
+
UserPromptSubmit|user_prompt_submit)
|
|
355
|
+
handle_user_prompt
|
|
356
|
+
;;
|
|
357
|
+
*)
|
|
358
|
+
# Unknown event, exit silently
|
|
359
|
+
exit 0
|
|
360
|
+
;;
|
|
361
|
+
esac
|
|
File without changes
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# ================================================================
|
|
3
|
+
# compact-dispatch-watchdog.sh — Warn when context usage crosses
|
|
4
|
+
# a configurable threshold without a recent compact_boundary
|
|
5
|
+
# event in the transcript, i.e. when auto-compact dispatch has
|
|
6
|
+
# gone silent on the new prompt-cache-prefix code path.
|
|
7
|
+
# ================================================================
|
|
8
|
+
# PURPOSE:
|
|
9
|
+
# Issue #63015 documents that on Claude Code v2.1.153 with Max
|
|
10
|
+
# subscription in 200K mode, the client's own statusline reports
|
|
11
|
+
# "100% context used" but auto-compact never fires — no
|
|
12
|
+
# `compact_boundary` events appear in the transcript across the
|
|
13
|
+
# entire session, despite the threshold being signalled on
|
|
14
|
+
# screen. The reporter traced the suspect to a GrowthBook A/B
|
|
15
|
+
# flag (`tengu_compact_cache_prefix`) gating a new compaction
|
|
16
|
+
# implementation whose dispatch path can fail silently.
|
|
17
|
+
#
|
|
18
|
+
# The earlier `auto-compact-context-monitor.sh` detects *when*
|
|
19
|
+
# auto-compaction *did* happen by watching context size drops.
|
|
20
|
+
# It cannot see the inverse case — context that should have
|
|
21
|
+
# compacted but didn't. This Stop hook covers that gap.
|
|
22
|
+
#
|
|
23
|
+
# The hook is operator-side and observational. The dispatch
|
|
24
|
+
# path itself is not reachable from `settings.json` overrides
|
|
25
|
+
# or any other operator surface (Cluster 10 in the cc-safe-setup
|
|
26
|
+
# tracker — server-pushed GrowthBook flags rewrite client state).
|
|
27
|
+
# Recovery on a hit is a manual `/compact` from the operator.
|
|
28
|
+
#
|
|
29
|
+
# TRIGGER: Stop MATCHER: ""
|
|
30
|
+
# CLUSTER: 10 (GrowthBook A/B flag client-side overrides)
|
|
31
|
+
#
|
|
32
|
+
# BEHAVIOR:
|
|
33
|
+
# - Read transcript_path from Stop hook input.
|
|
34
|
+
# - Extract the most recent message.usage block to compute
|
|
35
|
+
# current total input tokens (input + cache_read +
|
|
36
|
+
# cache_creation) and a ratio against a 200K window
|
|
37
|
+
# (configurable for 1M mode).
|
|
38
|
+
# - Count `compact_boundary` events in the transcript. The
|
|
39
|
+
# event marker is the substring `compact_boundary` written
|
|
40
|
+
# by the Claude Code runtime when a compaction lands.
|
|
41
|
+
# - If usage ratio crosses the warn threshold AND no
|
|
42
|
+
# compact_boundary has been seen in the trailing N messages,
|
|
43
|
+
# emit a one-screen stderr advisory.
|
|
44
|
+
# - Always exits 0 (advisory only; does not block).
|
|
45
|
+
#
|
|
46
|
+
# CONFIGURATION (env vars):
|
|
47
|
+
# CC_COMPACT_WATCHDOG_DISABLE Set to "1" to silence.
|
|
48
|
+
# CC_COMPACT_WATCHDOG_WINDOW Context window in tokens.
|
|
49
|
+
# Default 200000. Set to
|
|
50
|
+
# 1000000 if you run in 1M mode.
|
|
51
|
+
# CC_COMPACT_WATCHDOG_THRESHOLD Ratio (0-1) at which to warn
|
|
52
|
+
# when no recent compact event
|
|
53
|
+
# is seen. Default 0.85.
|
|
54
|
+
# CC_COMPACT_WATCHDOG_LOOKBACK How many recent transcript
|
|
55
|
+
# lines to scan for a
|
|
56
|
+
# compact_boundary marker.
|
|
57
|
+
# Default 200.
|
|
58
|
+
# CC_COMPACT_WATCHDOG_TRANSCRIPT Override transcript path
|
|
59
|
+
# (used by tests).
|
|
60
|
+
#
|
|
61
|
+
# UPSTREAM REFERENCES:
|
|
62
|
+
# #63015 (auto-compact never triggers on v2.1.153, 200K Max)
|
|
63
|
+
# #62205 (root-cause analysis of GrowthBook overrides)
|
|
64
|
+
# #17292 (older same-symptom report on v2.1.3; closed not-planned)
|
|
65
|
+
# ================================================================
|
|
66
|
+
|
|
67
|
+
set -u
|
|
68
|
+
|
|
69
|
+
if [ "${CC_COMPACT_WATCHDOG_DISABLE:-0}" = "1" ]; then
|
|
70
|
+
exit 0
|
|
71
|
+
fi
|
|
72
|
+
|
|
73
|
+
WINDOW="${CC_COMPACT_WATCHDOG_WINDOW:-200000}"
|
|
74
|
+
THRESHOLD="${CC_COMPACT_WATCHDOG_THRESHOLD:-0.85}"
|
|
75
|
+
LOOKBACK="${CC_COMPACT_WATCHDOG_LOOKBACK:-200}"
|
|
76
|
+
|
|
77
|
+
INPUT=$(cat 2>/dev/null || true)
|
|
78
|
+
|
|
79
|
+
TRANSCRIPT_PATH="${CC_COMPACT_WATCHDOG_TRANSCRIPT:-}"
|
|
80
|
+
if [ -z "$TRANSCRIPT_PATH" ]; then
|
|
81
|
+
TRANSCRIPT_PATH=$(printf '%s' "$INPUT" | jq -r '.transcript_path // empty' 2>/dev/null)
|
|
82
|
+
fi
|
|
83
|
+
|
|
84
|
+
if [ -z "$TRANSCRIPT_PATH" ] || [ ! -f "$TRANSCRIPT_PATH" ]; then
|
|
85
|
+
exit 0
|
|
86
|
+
fi
|
|
87
|
+
|
|
88
|
+
# Pull the most recent usage block and sum input-side tokens.
|
|
89
|
+
LATEST_USAGE=$(grep -h '"usage"' "$TRANSCRIPT_PATH" 2>/dev/null | tail -1)
|
|
90
|
+
|
|
91
|
+
if [ -z "$LATEST_USAGE" ]; then
|
|
92
|
+
exit 0
|
|
93
|
+
fi
|
|
94
|
+
|
|
95
|
+
TOTAL=$(printf '%s' "$LATEST_USAGE" | jq -r '
|
|
96
|
+
def num(x): if (x | type) == "number" then x else 0 end;
|
|
97
|
+
(..|objects|select(has("input_tokens"))) as $u
|
|
98
|
+
| (num($u.input_tokens)
|
|
99
|
+
+ num($u.cache_read_input_tokens)
|
|
100
|
+
+ num($u.cache_creation_input_tokens))
|
|
101
|
+
' 2>/dev/null | head -1)
|
|
102
|
+
|
|
103
|
+
if [ -z "$TOTAL" ] || [ "$TOTAL" = "null" ]; then
|
|
104
|
+
exit 0
|
|
105
|
+
fi
|
|
106
|
+
|
|
107
|
+
# Compute usage ratio. awk handles the float comparison portably.
|
|
108
|
+
RATIO=$(awk -v t="$TOTAL" -v w="$WINDOW" 'BEGIN { if (w > 0) printf "%.4f", t / w; else printf "0" }')
|
|
109
|
+
|
|
110
|
+
OVER=$(awk -v r="$RATIO" -v th="$THRESHOLD" 'BEGIN { print (r + 0 >= th + 0) ? 1 : 0 }')
|
|
111
|
+
|
|
112
|
+
if [ "$OVER" != "1" ]; then
|
|
113
|
+
exit 0
|
|
114
|
+
fi
|
|
115
|
+
|
|
116
|
+
# Look for compact_boundary marker in the trailing window of the
|
|
117
|
+
# transcript. The marker is a substring written by the runtime
|
|
118
|
+
# when compaction lands; matching as a substring is conservative.
|
|
119
|
+
RECENT_COMPACT=$(tail -n "$LOOKBACK" "$TRANSCRIPT_PATH" 2>/dev/null | grep -c 'compact_boundary' || true)
|
|
120
|
+
|
|
121
|
+
if [ "${RECENT_COMPACT:-0}" -gt 0 ]; then
|
|
122
|
+
exit 0
|
|
123
|
+
fi
|
|
124
|
+
|
|
125
|
+
# Crossed threshold AND no recent compact event. Emit advisory.
|
|
126
|
+
PCT=$(awk -v r="$RATIO" 'BEGIN { printf "%.1f", r * 100 }')
|
|
127
|
+
|
|
128
|
+
cat >&2 <<EOF
|
|
129
|
+
|
|
130
|
+
⚠️ Context at ${PCT}% of ${WINDOW} tokens with no compact_boundary
|
|
131
|
+
event in the last ${LOOKBACK} transcript lines.
|
|
132
|
+
|
|
133
|
+
This is the silent-dispatch failure shape documented in
|
|
134
|
+
issue #63015 (Cluster 10 in the cc-safe-setup tracker). The
|
|
135
|
+
client's threshold logic and the compaction dispatch are
|
|
136
|
+
suspected to be on separate code paths gated by the
|
|
137
|
+
\`tengu_compact_cache_prefix\` GrowthBook A/B flag, so the
|
|
138
|
+
statusline can report past-threshold while no compaction
|
|
139
|
+
fires.
|
|
140
|
+
|
|
141
|
+
Recovery: run \`/compact\` from the prompt before context
|
|
142
|
+
exhaustion. The watchdog can't dispatch compaction on your
|
|
143
|
+
behalf — the dispatch path isn't reachable from operator-side.
|
|
144
|
+
|
|
145
|
+
Silence: set CC_COMPACT_WATCHDOG_DISABLE=1.
|
|
146
|
+
|
|
147
|
+
EOF
|
|
148
|
+
|
|
149
|
+
exit 0
|