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,167 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# ================================================================
|
|
3
|
+
# cowork-hook-absence-warner.sh — Warn CLI operators with a non-trivial
|
|
4
|
+
# ~/.claude/settings.json hook stack
|
|
5
|
+
# that the Cowork sandbox silently
|
|
6
|
+
# drops every one of those hooks
|
|
7
|
+
# ================================================================
|
|
8
|
+
# PURPOSE:
|
|
9
|
+
# Cluster 11 sub-pattern 11E (Hook surface absence) documents that
|
|
10
|
+
# the Cowork sandbox does not fire any hook defined in
|
|
11
|
+
# ~/.claude/settings.json. The operator-side defense surface that
|
|
12
|
+
# 14-day-active 1,582+ cc-safe-setup users rely on (UserPromptSubmit,
|
|
13
|
+
# Stop, PostToolUse, PreToolUse, SessionStart) is silently inert
|
|
14
|
+
# once the operator switches to a Cowork session.
|
|
15
|
+
#
|
|
16
|
+
# Cluster 11 axis 11E issues:
|
|
17
|
+
# #63360 — Cowork: Support Claude Code hooks (~/.claude/settings.json
|
|
18
|
+
# — UserPromptSubmit, Stop, etc.) — feature request, 2026-05-28
|
|
19
|
+
# #63047 — Plugin PostToolUse hooks still silently skip in Claude
|
|
20
|
+
# Desktop / Cowork (re-filing closed #51904) — re-filing
|
|
21
|
+
# with 7+ weeks of additional evidence, 2026-05-28
|
|
22
|
+
# #51904 — original report, auto-closed for inactivity
|
|
23
|
+
# #51281 — April 2026, French — auto-closed
|
|
24
|
+
# #27398 — February 2026 — auto-closed as duplicate
|
|
25
|
+
#
|
|
26
|
+
# The operator who installed a serious hook stack on the CLI surface
|
|
27
|
+
# for cluster-1-19 defense will, on switching to Cowork, lose all of
|
|
28
|
+
# that defense without any visible signal. This hook runs at
|
|
29
|
+
# SessionStart on the CLI side, reads the operator's hook stack from
|
|
30
|
+
# ~/.claude/settings.json, and — when the stack is non-trivial — once
|
|
31
|
+
# per calendar day surfaces a stderr advisory: "your N hooks do not
|
|
32
|
+
# fire in Cowork; here are the three operator-side workarounds."
|
|
33
|
+
#
|
|
34
|
+
# The hook does NOT block. The advisory is a one-shot per calendar
|
|
35
|
+
# day so multi-session-per-day operators are not nagged repeatedly.
|
|
36
|
+
#
|
|
37
|
+
# TRIGGER: SessionStart
|
|
38
|
+
# MATCHER: ""
|
|
39
|
+
# EXIT: 0 (always; advisory only)
|
|
40
|
+
#
|
|
41
|
+
# SETUP:
|
|
42
|
+
# {
|
|
43
|
+
# "hooks": {
|
|
44
|
+
# "SessionStart": [
|
|
45
|
+
# { "matcher": "",
|
|
46
|
+
# "hooks": [
|
|
47
|
+
# { "type": "command",
|
|
48
|
+
# "command": "bash ~/path/to/cowork-hook-absence-warner.sh"
|
|
49
|
+
# }
|
|
50
|
+
# ]
|
|
51
|
+
# }
|
|
52
|
+
# ]
|
|
53
|
+
# }
|
|
54
|
+
# }
|
|
55
|
+
#
|
|
56
|
+
# CONFIGURATION:
|
|
57
|
+
# CC_COWORK_WARNER_DISABLE=1 — silence the hook entirely
|
|
58
|
+
# CC_COWORK_WARNER_STATE_DIR=PATH — override state dir
|
|
59
|
+
# (default $HOME/.claude)
|
|
60
|
+
# CC_COWORK_WARNER_DATE=YYYY-MM-DD — date override (tests only)
|
|
61
|
+
# CC_COWORK_WARNER_SETTINGS=PATH — settings file path override
|
|
62
|
+
# (default $HOME/.claude/settings.json)
|
|
63
|
+
# CC_COWORK_WARNER_MIN_HOOKS=N — min hook count to trigger advisory
|
|
64
|
+
# (default 1)
|
|
65
|
+
#
|
|
66
|
+
# RELATED CLUSTER 11 SHIPPED TOOLS:
|
|
67
|
+
# - cowork-claudemd-helper.sh (standalone, addresses 11A #62859)
|
|
68
|
+
# - cowork-claude-md-load-checker.sh (CLI-side, addresses 11A #62859)
|
|
69
|
+
# - cowork-fuse-staleness-watcher.sh (CLI-side, addresses 11A #62932)
|
|
70
|
+
# - cowork-model-picker-advisor.sh (CLI-side, addresses 11C #62949)
|
|
71
|
+
#
|
|
72
|
+
# WHAT THIS HOOK ADDS:
|
|
73
|
+
# The four shipped tools above address 11A and 11C. 11E (hook
|
|
74
|
+
# surface absence) was not covered until this hook. The defense
|
|
75
|
+
# surface for 11E is "warn the operator who has the most to lose"
|
|
76
|
+
# — the operator whose CLI hook stack carries real defense value.
|
|
77
|
+
# ================================================================
|
|
78
|
+
|
|
79
|
+
set -uo pipefail
|
|
80
|
+
|
|
81
|
+
[ "${CC_COWORK_WARNER_DISABLE:-0}" = "1" ] && exit 0
|
|
82
|
+
|
|
83
|
+
SETTINGS="${CC_COWORK_WARNER_SETTINGS:-${HOME}/.claude/settings.json}"
|
|
84
|
+
STATE_DIR="${CC_COWORK_WARNER_STATE_DIR:-${HOME}/.claude}"
|
|
85
|
+
MIN_HOOKS="${CC_COWORK_WARNER_MIN_HOOKS:-1}"
|
|
86
|
+
|
|
87
|
+
# If no settings file, the operator has no hook stack to lose.
|
|
88
|
+
[ ! -f "$SETTINGS" ] && exit 0
|
|
89
|
+
|
|
90
|
+
# Count hooks across all event types. We count the leaf commands, not
|
|
91
|
+
# the matcher entries, so {"Stop":[{"matcher":"","hooks":[a,b,c]}]}
|
|
92
|
+
# correctly reports 3 hooks (not 1 matcher).
|
|
93
|
+
HOOK_COUNT=$(jq -r '
|
|
94
|
+
(.hooks // {})
|
|
95
|
+
| [.SessionStart, .UserPromptSubmit, .Stop, .PreToolUse, .PostToolUse, .PreCompact, .Notification]
|
|
96
|
+
| map(. // [])
|
|
97
|
+
| map([.[]? | .hooks // [] | .[]?] | length)
|
|
98
|
+
| add
|
|
99
|
+
' "$SETTINGS" 2>/dev/null)
|
|
100
|
+
|
|
101
|
+
# If jq failed or returned non-numeric, exit silently.
|
|
102
|
+
case "$HOOK_COUNT" in
|
|
103
|
+
''|*[!0-9]*) exit 0 ;;
|
|
104
|
+
esac
|
|
105
|
+
|
|
106
|
+
# Below the threshold → not worth warning about.
|
|
107
|
+
[ "$HOOK_COUNT" -lt "$MIN_HOOKS" ] && exit 0
|
|
108
|
+
|
|
109
|
+
# One-shot per calendar day.
|
|
110
|
+
TODAY="${CC_COWORK_WARNER_DATE:-}"
|
|
111
|
+
if [ -z "$TODAY" ]; then
|
|
112
|
+
TODAY=$(date '+%Y-%m-%d' 2>/dev/null) || exit 0
|
|
113
|
+
fi
|
|
114
|
+
|
|
115
|
+
mkdir -p "$STATE_DIR" 2>/dev/null || exit 0
|
|
116
|
+
STATE_FILE="$STATE_DIR/cowork-hook-absence-warner.last"
|
|
117
|
+
|
|
118
|
+
if [ -f "$STATE_FILE" ]; then
|
|
119
|
+
LAST_DATE=$(head -1 "$STATE_FILE" 2>/dev/null)
|
|
120
|
+
if [ "$LAST_DATE" = "$TODAY" ]; then
|
|
121
|
+
exit 0
|
|
122
|
+
fi
|
|
123
|
+
fi
|
|
124
|
+
|
|
125
|
+
# Stamp the state file BEFORE emitting (crash-mid-emit doesn't re-fire).
|
|
126
|
+
printf '%s\n' "$TODAY" > "$STATE_FILE" 2>/dev/null || true
|
|
127
|
+
|
|
128
|
+
cat >&2 <<EOF
|
|
129
|
+
|
|
130
|
+
[cowork-hook-absence-warner] NOTE: your ${HOOK_COUNT} CLI hooks do not
|
|
131
|
+
fire in the Cowork sandbox.
|
|
132
|
+
|
|
133
|
+
Cluster 11 sub-pattern 11E (Hook surface absence) — issues #63360 and
|
|
134
|
+
#63047 (re-filing of #51904) — documents that Cowork's GUI sandbox is
|
|
135
|
+
a different distribution surface than the CLI or Desktop, and
|
|
136
|
+
~/.claude/settings.json hooks are silently inert in it. Your
|
|
137
|
+
${HOOK_COUNT} configured hooks (across SessionStart, UserPromptSubmit,
|
|
138
|
+
Stop, PreToolUse, PostToolUse, PreCompact, Notification) will not
|
|
139
|
+
provide defense when you switch to a Cowork session.
|
|
140
|
+
|
|
141
|
+
Three operator-side workarounds:
|
|
142
|
+
|
|
143
|
+
1. **Delay Cowork adoption for hook-dependent workflows.** If your
|
|
144
|
+
hook stack carries real defense value (cluster-1/9/13/19 type
|
|
145
|
+
coverage), continue using the CLI for that work until upstream
|
|
146
|
+
#63360 lands.
|
|
147
|
+
|
|
148
|
+
2. **Manual execution at Cowork boundaries.** For each hook your
|
|
149
|
+
CLI workflow relies on, document the manual equivalent you'll
|
|
150
|
+
run before and after a Cowork session (the cowork-claudemd-helper
|
|
151
|
+
standalone script is the model for this — manual replication of
|
|
152
|
+
what the SessionStart hook would have done).
|
|
153
|
+
|
|
154
|
+
3. **CLI-only for sensitive operations.** Restrict Cowork to
|
|
155
|
+
low-defense-value tasks (read-only exploration, documentation
|
|
156
|
+
review, etc.) and keep code execution / destructive ops / cost-
|
|
157
|
+
sensitive work in the CLI where your hooks apply.
|
|
158
|
+
|
|
159
|
+
This reminder fires once per calendar day. To silence it:
|
|
160
|
+
export CC_COWORK_WARNER_DISABLE=1
|
|
161
|
+
|
|
162
|
+
Tracked at https://github.com/yurukusa/cc-safe-setup/blob/main/docs/cluster-tracker.html
|
|
163
|
+
(Cluster 11, sub-pattern 11E).
|
|
164
|
+
|
|
165
|
+
EOF
|
|
166
|
+
|
|
167
|
+
exit 0
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# cowork-model-picker-advisor.sh — Surface the Cowork Sonnet 4.6 [1m] silent
|
|
3
|
+
# default at SessionStart so CLI users do not accidentally burn usage credits
|
|
4
|
+
#
|
|
5
|
+
# Solves: #62949 — Claude Cowork Desktop only presents a single Sonnet 4.6
|
|
6
|
+
# option in the model picker. It silently defaults to the 1M context
|
|
7
|
+
# variant, which requires usage credits even on a fresh session at
|
|
8
|
+
# low plan usage on Max (5x). The documented behavior — separate
|
|
9
|
+
# `sonnet` and `sonnet[1m]` entries — is missing in Cowork. CLI
|
|
10
|
+
# users can use `--model` to force standard 200K context; Cowork
|
|
11
|
+
# users have no workaround until the picker is fixed. Related:
|
|
12
|
+
# #61869, #62100, #61692.
|
|
13
|
+
#
|
|
14
|
+
# Also covers #62199 — the same silent 1M default reaches the plain
|
|
15
|
+
# CLI and the VS Code extension, where CLAUDE_CODE_DISABLE_1M_CONTEXT=1
|
|
16
|
+
# is reported NOT to be respected. For users already mid-session
|
|
17
|
+
# draining their 5h/weekly limit, the reliable fix is the in-session
|
|
18
|
+
# `/model claude-opus-4-7` (or any non-[1m] model), not just the
|
|
19
|
+
# launch-time `--model`.
|
|
20
|
+
#
|
|
21
|
+
# WHO THIS PROTECTS:
|
|
22
|
+
# CLI users who:
|
|
23
|
+
# - leave ANTHROPIC_MODEL unset and may inherit the same silent 1M
|
|
24
|
+
# default Cowork enforces;
|
|
25
|
+
# - explicitly set ANTHROPIC_MODEL to a 1m variant and want a reminder
|
|
26
|
+
# that this consumes usage credits separately from the plan;
|
|
27
|
+
# - also use Cowork on the same machine and benefit from a clear
|
|
28
|
+
# articulation of the picker bug + the CLI-only workaround.
|
|
29
|
+
#
|
|
30
|
+
# HOW IT WORKS:
|
|
31
|
+
# On SessionStart:
|
|
32
|
+
# 1. Check $ANTHROPIC_MODEL.
|
|
33
|
+
# 2. If unset or contains "1m" / "[1m]" / "1M", print stderr block:
|
|
34
|
+
# - explains #62949 and the silent 1M default
|
|
35
|
+
# - explains how to force standard 200K context via --model
|
|
36
|
+
# - links related issues
|
|
37
|
+
# 3. If set to a non-1m model, print a one-line confirmation (suppressible
|
|
38
|
+
# with CC_COWORK_MODEL_QUIET=1).
|
|
39
|
+
# Always exit 0 (advisory).
|
|
40
|
+
#
|
|
41
|
+
# TRIGGER: SessionStart MATCHER: ""
|
|
42
|
+
#
|
|
43
|
+
# CONFIGURATION:
|
|
44
|
+
# CC_COWORK_MODEL_QUIET=1 suppress the confirmation line for safe models
|
|
45
|
+
# CC_COWORK_MODEL_LOG=path append model-check events (default off)
|
|
46
|
+
# CC_COWORK_MODEL_FORCE_WARN=1 always show the full warning regardless of env
|
|
47
|
+
#
|
|
48
|
+
# USAGE:
|
|
49
|
+
# {
|
|
50
|
+
# "hooks": {
|
|
51
|
+
# "SessionStart": [{
|
|
52
|
+
# "hooks": [{
|
|
53
|
+
# "type": "command",
|
|
54
|
+
# "command": "~/.claude/hooks/cowork-model-picker-advisor.sh"
|
|
55
|
+
# }]
|
|
56
|
+
# }]
|
|
57
|
+
# }
|
|
58
|
+
# }
|
|
59
|
+
|
|
60
|
+
INPUT=$(cat 2>/dev/null || true)
|
|
61
|
+
|
|
62
|
+
MODEL="${ANTHROPIC_MODEL:-}"
|
|
63
|
+
|
|
64
|
+
is_1m_variant=0
|
|
65
|
+
if [ -z "$MODEL" ]; then
|
|
66
|
+
is_1m_variant=1 # unset means we may inherit Cowork's silent 1M default
|
|
67
|
+
elif echo "$MODEL" | grep -qiE '(\[1m\]|-1m|_1m|1m$|1M)'; then
|
|
68
|
+
is_1m_variant=1
|
|
69
|
+
fi
|
|
70
|
+
|
|
71
|
+
if [ -n "${CC_COWORK_MODEL_FORCE_WARN:-}" ]; then
|
|
72
|
+
is_1m_variant=1
|
|
73
|
+
fi
|
|
74
|
+
|
|
75
|
+
if [ "$is_1m_variant" -eq 1 ]; then
|
|
76
|
+
cat >&2 <<EOF
|
|
77
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
78
|
+
[cowork-model-picker-advisor] SessionStart — model exposure check
|
|
79
|
+
ANTHROPIC_MODEL='${MODEL:-(unset)}'
|
|
80
|
+
|
|
81
|
+
Addresses #62949: Claude Cowork Desktop silently defaults to Sonnet 4.6
|
|
82
|
+
[1m] (1M context). The picker shows only one Sonnet 4.6 option; the
|
|
83
|
+
standard 200K context variant is NOT selectable. The 1M variant requires
|
|
84
|
+
usage credits separately from Max-plan inclusion, so a Cowork session
|
|
85
|
+
at ~9% plan usage can still trip:
|
|
86
|
+
|
|
87
|
+
API Error: Usage credits required for 1M context
|
|
88
|
+
|
|
89
|
+
CLI workaround (Cowork has none until the picker is fixed):
|
|
90
|
+
--model claude-sonnet-4-6 # forces standard 200K context
|
|
91
|
+
--model claude-haiku-4-5 # smaller, plan-included
|
|
92
|
+
Or: export ANTHROPIC_MODEL=claude-sonnet-4-6 in your shell init.
|
|
93
|
+
|
|
94
|
+
The same silent 1M default also hits the plain CLI and the VS Code
|
|
95
|
+
extension, not only Cowork (#62199). CLAUDE_CODE_DISABLE_1M_CONTEXT=1 is
|
|
96
|
+
reported NOT to be respected by the VS Code extension, so if you are
|
|
97
|
+
already inside a session and watching the 5h/weekly limit drain, the
|
|
98
|
+
reliable fix is the in-session command (no restart needed):
|
|
99
|
+
/model claude-opus-4-7 # switches immediately; any non-[1m] model
|
|
100
|
+
|
|
101
|
+
Related issues: #62199 #61869 #62100 #61692
|
|
102
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
103
|
+
EOF
|
|
104
|
+
else
|
|
105
|
+
if [ -z "${CC_COWORK_MODEL_QUIET:-}" ]; then
|
|
106
|
+
echo "[cowork-model-picker-advisor] ANTHROPIC_MODEL=${MODEL} — standard context, not 1m. No usage-credit risk from #62949." >&2
|
|
107
|
+
fi
|
|
108
|
+
fi
|
|
109
|
+
|
|
110
|
+
if [ -n "${CC_COWORK_MODEL_LOG:-}" ]; then
|
|
111
|
+
mkdir -p "$(dirname "$CC_COWORK_MODEL_LOG")" 2>/dev/null
|
|
112
|
+
echo "$(date -Iseconds) model=${MODEL:-unset} is_1m=${is_1m_variant}" >> "$CC_COWORK_MODEL_LOG"
|
|
113
|
+
fi
|
|
114
|
+
|
|
115
|
+
exit 0
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
# find / -name "*.token" -o -name "*credentials*"
|
|
10
10
|
# cat ~/.ssh/id_rsa
|
|
11
11
|
# printenv | grep SECRET
|
|
12
|
+
# env | grep JIRA (warns — an env dump piped to grep prints values even when the term is not a secret keyword, #69053)
|
|
12
13
|
# cat /etc/shadow
|
|
13
14
|
#
|
|
14
15
|
# Usage: Add to settings.json as a PreToolUse hook
|
|
@@ -24,6 +25,18 @@
|
|
|
24
25
|
#
|
|
25
26
|
# TRIGGER: PreToolUse MATCHER: "Bash"
|
|
26
27
|
|
|
28
|
+
# Without jq, the parse below silently yields empty and this hook stops
|
|
29
|
+
# guarding - with no error anywhere. Say so. We deliberately do not exit
|
|
30
|
+
# here: blocking would halt every tool call, and exiting 0 would change
|
|
31
|
+
# the behaviour of guards that do not depend on the parsed value.
|
|
32
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
33
|
+
_nojq_warned="/tmp/cc-nojq-warned-credential-exfil-guard-$PPID"
|
|
34
|
+
[ -f "$_nojq_warned" ] || {
|
|
35
|
+
echo "WARNING [credential-exfil-guard]: jq not found - this hook cannot inspect tool calls and is NOT protecting you. Install jq." >&2
|
|
36
|
+
: > "$_nojq_warned"
|
|
37
|
+
}
|
|
38
|
+
fi
|
|
39
|
+
|
|
27
40
|
INPUT=$(cat)
|
|
28
41
|
COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty' 2>/dev/null)
|
|
29
42
|
|
|
@@ -35,6 +48,16 @@ if echo "$COMMAND" | grep -qiE '(env|printenv|set)\s*\|.*grep.*\b(token|secret|k
|
|
|
35
48
|
exit 2
|
|
36
49
|
fi
|
|
37
50
|
|
|
51
|
+
# Pattern 1b: env/printenv piped to grep by a NON-secret term still dumps the
|
|
52
|
+
# matching live VALUES. In #69053, `env | grep JIRA` dumped JIRA_API_TOKEN — the
|
|
53
|
+
# filter term ("JIRA") is not a secret keyword so Pattern 1 misses it, and it is
|
|
54
|
+
# not a bare dump so Pattern 7 misses it, so it passed silently. Warn (not block)
|
|
55
|
+
# to stay consistent with Pattern 7 and avoid over-blocking benign `env | grep PATH`.
|
|
56
|
+
if echo "$COMMAND" | grep -qiE '(env|printenv|set)\s*\|.*grep'; then
|
|
57
|
+
echo "WARNING: piping an environment dump to grep prints the matching live values into the transcript/API; if a matched variable holds a token it is now exposed (#69053). To find where a credential is configured, grep config files for the variable NAME instead of dumping environment values." >&2
|
|
58
|
+
exit 0
|
|
59
|
+
fi
|
|
60
|
+
|
|
38
61
|
# Pattern 2: find searching for credential files
|
|
39
62
|
if echo "$COMMAND" | grep -qiE 'find\s.*-name\s.*\*?(token|secret|credential|password|\.key|\.pem|\.p12|\.pfx|\.keystore|\.jks|\.env)'; then
|
|
40
63
|
echo "BLOCKED: Credential hunting via file system search" >&2
|
|
@@ -42,7 +65,13 @@ if echo "$COMMAND" | grep -qiE 'find\s.*-name\s.*\*?(token|secret|credential|pas
|
|
|
42
65
|
fi
|
|
43
66
|
|
|
44
67
|
# Pattern 3: Direct access to known credential locations
|
|
45
|
-
|
|
68
|
+
# 2026-08-30: the home alternation used to be (~|/home|/root), which only matches
|
|
69
|
+
# when /.ssh follows /home directly. Real paths carry a username segment
|
|
70
|
+
# (/home/alice/.ssh/id_rsa), so the tilde form was blocked while the expanded
|
|
71
|
+
# form walked straight through - measured on this machine, rc=2 vs rc=0 for the
|
|
72
|
+
# same file. Whether an agent writes the tilde or the expanded path is arbitrary,
|
|
73
|
+
# so a guard that only sees one of them is a coin flip.
|
|
74
|
+
if echo "$COMMAND" | grep -qE 'cat\s+(~|/home/[^/[:space:]]+|/Users/[^/[:space:]]+|/root|/home|/Users)/\.ssh/(id_|authorized_keys|known_hosts|config)'; then
|
|
46
75
|
echo "BLOCKED: Direct SSH credential access" >&2
|
|
47
76
|
exit 2
|
|
48
77
|
fi
|
|
@@ -54,7 +83,7 @@ if echo "$COMMAND" | grep -qE 'cat\s+(/etc/shadow|/etc/gshadow|/etc/passwd)'; th
|
|
|
54
83
|
fi
|
|
55
84
|
|
|
56
85
|
# Pattern 5: AWS/cloud credential files
|
|
57
|
-
if echo "$COMMAND" | grep -qE 'cat\s+(~|/home|/
|
|
86
|
+
if echo "$COMMAND" | grep -qE 'cat\s+(~|/home/[^/[:space:]]+|/Users/[^/[:space:]]+|/root|/home|/Users)/\.(aws|gcloud|azure|kube)/(credentials|config|token)'; then
|
|
58
87
|
echo "BLOCKED: Cloud provider credential access" >&2
|
|
59
88
|
exit 2
|
|
60
89
|
fi
|
|
@@ -73,15 +102,47 @@ if echo "$COMMAND" | grep -qE '^\s*(env|printenv|set)\s*$'; then
|
|
|
73
102
|
fi
|
|
74
103
|
|
|
75
104
|
# Pattern 8: curl/wget posting credential files
|
|
76
|
-
|
|
105
|
+
# Uses -E, not -P: BSD grep (macOS) rejects -P outright, which made this block
|
|
106
|
+
# exit 0 and let the upload through. \s/\S are Perl-only, so they are written as
|
|
107
|
+
# POSIX classes here.
|
|
108
|
+
if echo "$COMMAND" | grep -qiE 'curl[[:space:]].*-d[[:space:]]+@[^[:space:]]*(\.env|\.pem|\.key|credentials|\.ssh/id_)|wget[[:space:]].*--post-file[= ][^[:space:]]*(\.env|\.pem|\.key|credentials|\.ssh/id_)'; then
|
|
77
109
|
echo "BLOCKED: Credential file exfiltration via HTTP upload" >&2
|
|
78
110
|
exit 2
|
|
79
111
|
fi
|
|
80
112
|
|
|
81
113
|
# Pattern 9: Piping credential files to curl/wget
|
|
82
|
-
if echo "$COMMAND" | grep -
|
|
114
|
+
if echo "$COMMAND" | grep -qiE 'cat[[:space:]]+[^[:space:]]*(\.env|\.pem|\.key|credentials|\.ssh/id_)[^[:space:]]*[[:space:]]*\|.*curl|cat[[:space:]]+[^[:space:]]*(\.env|\.pem|\.key|credentials|\.ssh/id_)[^[:space:]]*[[:space:]]*\|.*wget'; then
|
|
83
115
|
echo "BLOCKED: Credential file piped to HTTP client" >&2
|
|
84
116
|
exit 2
|
|
85
117
|
fi
|
|
86
118
|
|
|
119
|
+
# Pattern 10: macOS keychain extraction of a known secret token (#65350 —
|
|
120
|
+
# a plugin shipped `security find-generic-password -s ANTHROPIC_AUTH_TOKEN -w`
|
|
121
|
+
# in skill files to silently exfiltrate the user's Anthropic token). Require
|
|
122
|
+
# the -w flag (prints the raw secret) AND a high-signal secret service name,
|
|
123
|
+
# so reading a non-secret keychain item (e.g. a wifi password) is not blocked.
|
|
124
|
+
if echo "$COMMAND" | grep -qiE 'security\s+find-(generic|internet)-password' \
|
|
125
|
+
&& echo "$COMMAND" | grep -qE '(^|[[:space:]])-w([[:space:]]|$)' \
|
|
126
|
+
&& echo "$COMMAND" | grep -qiE 'ANTHROPIC|OPENAI|AUTH[_-]?TOKEN|API[_-]?KEY|ACCESS[_-]?TOKEN|[_-]SECRET|OAUTH|GITHUB[_-]?TOKEN|(^|[^a-z])secret([^a-z]|$)'; then
|
|
127
|
+
echo "BLOCKED: macOS keychain extraction of a secret token (security find-generic-password -w of a credential)" >&2
|
|
128
|
+
exit 2
|
|
129
|
+
fi
|
|
130
|
+
|
|
131
|
+
# Pattern 11: keychain secret piped straight into a network client.
|
|
132
|
+
if echo "$COMMAND" | grep -qiE 'security\s+find-(generic|internet)-password' \
|
|
133
|
+
&& echo "$COMMAND" | grep -qiE '\|[[:space:]]*(curl|wget|nc|ncat|telnet)([[:space:]]|$)'; then
|
|
134
|
+
echo "BLOCKED: keychain secret piped to a network client (possible exfiltration)" >&2
|
|
135
|
+
exit 2
|
|
136
|
+
fi
|
|
137
|
+
|
|
138
|
+
# Pattern 12: a secret-named env var piped into a network client as data.
|
|
139
|
+
# Legit auth uses a header (-H "Authorization: Bearer $TOKEN") where the pipe,
|
|
140
|
+
# if any, goes to a parser like jq — not to the network client — so this only
|
|
141
|
+
# fires when the secret value itself is piped straight to curl/wget/nc.
|
|
142
|
+
if echo "$COMMAND" | grep -qE '\$\{?[A-Za-z_]*(TOKEN|SECRET|API[_-]?KEY|PASSWORD|CREDENTIAL|AUTH)[A-Za-z_]*' \
|
|
143
|
+
&& echo "$COMMAND" | grep -qiE '\|[[:space:]]*(curl|wget|nc|ncat|telnet)([[:space:]]|$)'; then
|
|
144
|
+
echo "BLOCKED: secret environment variable piped to a network client (possible exfiltration)" >&2
|
|
145
|
+
exit 2
|
|
146
|
+
fi
|
|
147
|
+
|
|
87
148
|
exit 0
|
|
@@ -21,13 +21,29 @@
|
|
|
21
21
|
#
|
|
22
22
|
# TRIGGER: PreToolUse MATCHER: "Bash"
|
|
23
23
|
|
|
24
|
+
# Without jq, the parse below silently yields empty and this hook stops
|
|
25
|
+
# guarding - with no error anywhere. Say so. We deliberately do not exit
|
|
26
|
+
# here: blocking would halt every tool call, and exiting 0 would change
|
|
27
|
+
# the behaviour of guards that do not depend on the parsed value.
|
|
28
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
29
|
+
_nojq_warned="/tmp/cc-nojq-warned-credential-file-cat-guard-$PPID"
|
|
30
|
+
[ -f "$_nojq_warned" ] || {
|
|
31
|
+
echo "WARNING [credential-file-cat-guard]: jq not found - this hook cannot inspect tool calls and is NOT protecting you. Install jq." >&2
|
|
32
|
+
: > "$_nojq_warned"
|
|
33
|
+
}
|
|
34
|
+
fi
|
|
35
|
+
|
|
24
36
|
INPUT=$(cat)
|
|
25
37
|
COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty' 2>/dev/null)
|
|
26
38
|
|
|
27
39
|
[ -z "$COMMAND" ] && exit 0
|
|
28
40
|
|
|
29
41
|
# Known credential files that contain tokens/passwords
|
|
30
|
-
|
|
42
|
+
|
|
43
|
+
# .git-credentials holds "https://user:token@host" in plain text, which makes it
|
|
44
|
+
# the highest-value file on most dev machines. It was missing from this list
|
|
45
|
+
# while .pypirc and .npmrc were covered - measured 2026-08-29 on CC 2.1.246.
|
|
46
|
+
CRED_FILES='\.git-credentials|\.netrc|\.npmrc|\.yarnrc\.yml|\.cargo/credentials|\.docker/config\.json|\.kube/config|\.config/gh/hosts\.yml|\.nuget/NuGet\.Config|\.m2/settings\.xml|\.gradle/gradle\.properties|\.pypirc|\.gem/credentials|\.config/pip/pip\.conf|\.bowerrc|\.composer/auth\.json'
|
|
31
47
|
|
|
32
48
|
# Block cat/head/tail/less/more/grep reading credential files
|
|
33
49
|
if echo "$COMMAND" | grep -qE "(cat|head|tail|less|more|bat)\s+[^\|;]*($CRED_FILES)"; then
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# ================================================================
|
|
3
|
+
# cron-create-receipt.sh — Log every CronCreate registration
|
|
4
|
+
# ================================================================
|
|
5
|
+
# PURPOSE:
|
|
6
|
+
# When the model calls CronCreate, write a receipt file so the
|
|
7
|
+
# operator can later audit which cron jobs were registered and
|
|
8
|
+
# compare against actual fire events.
|
|
9
|
+
#
|
|
10
|
+
# TRIGGER: PostToolUse
|
|
11
|
+
# MATCHER: "CronCreate"
|
|
12
|
+
#
|
|
13
|
+
# WHY THIS MATTERS:
|
|
14
|
+
# CronCreate registration is silent by default — no log entry is
|
|
15
|
+
# produced. When session-scoped cron jobs silently miss fires
|
|
16
|
+
# (issue #62036, #51296, #56108), operators need the registration
|
|
17
|
+
# list to compare against actual fire timestamps. Without this
|
|
18
|
+
# receipt, the registration side of the audit is invisible.
|
|
19
|
+
#
|
|
20
|
+
# Pair with the prompt-side receipt pattern (touch on each fire)
|
|
21
|
+
# to produce a full audit:
|
|
22
|
+
# Registration count (this hook) vs fire count (touch receipts)
|
|
23
|
+
#
|
|
24
|
+
# WHAT IT WRITES:
|
|
25
|
+
# ~/.claude/state/crons/registered/<timestamp>-<seq>.json
|
|
26
|
+
# Each receipt contains:
|
|
27
|
+
# - registered_at: ISO 8601 timestamp
|
|
28
|
+
# - cron_expression: the cron spec (e.g. "40 * * * *")
|
|
29
|
+
# - recurring: boolean
|
|
30
|
+
# - prompt_excerpt: first 200 chars of the prompt (truncated)
|
|
31
|
+
# - tool_output_excerpt: first 200 chars of the response
|
|
32
|
+
#
|
|
33
|
+
# DEFENSIVE BEHAVIOR:
|
|
34
|
+
# - Always exits 0 (advisory only, never blocks)
|
|
35
|
+
# - Skips silently if state directory cannot be created
|
|
36
|
+
# - Skips silently if jq is missing
|
|
37
|
+
# - Truncates prompt to 200 chars to keep receipt file size bounded
|
|
38
|
+
#
|
|
39
|
+
# CONFIGURATION (environment variables):
|
|
40
|
+
# CC_CRON_RECEIPT_DISABLE=1 skip the hook entirely
|
|
41
|
+
# CC_CRON_RECEIPT_DIR=... override the state directory
|
|
42
|
+
# CC_CRON_RECEIPT_EXCERPT_LEN truncation length (default 200)
|
|
43
|
+
#
|
|
44
|
+
# RELATED ISSUES:
|
|
45
|
+
# https://github.com/anthropics/claude-code/issues/62036 (ulogan, 2026-05-24)
|
|
46
|
+
# https://github.com/anthropics/claude-code/issues/56108 (one-shot queue)
|
|
47
|
+
# https://github.com/anthropics/claude-code/issues/51296 (never fires)
|
|
48
|
+
#
|
|
49
|
+
# RELATED PUBLIC RESOURCES:
|
|
50
|
+
# https://gist.github.com/yurukusa/a56f858169688b264510ed1c07181e65 (structural analysis)
|
|
51
|
+
# https://gist.github.com/yurukusa/42b6da4c53a836ac3aa809f463da45be (scheduled-routine-watchdog.sh)
|
|
52
|
+
# ================================================================
|
|
53
|
+
|
|
54
|
+
set -u
|
|
55
|
+
|
|
56
|
+
# Skip if disabled
|
|
57
|
+
if [ "${CC_CRON_RECEIPT_DISABLE:-0}" = "1" ]; then
|
|
58
|
+
exit 0
|
|
59
|
+
fi
|
|
60
|
+
|
|
61
|
+
# Skip if jq is missing — we cannot parse tool_input without it
|
|
62
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
63
|
+
exit 0
|
|
64
|
+
fi
|
|
65
|
+
|
|
66
|
+
INPUT=$(cat)
|
|
67
|
+
|
|
68
|
+
STATE_DIR="${CC_CRON_RECEIPT_DIR:-$HOME/.claude/state/crons/registered}"
|
|
69
|
+
EXCERPT_LEN="${CC_CRON_RECEIPT_EXCERPT_LEN:-200}"
|
|
70
|
+
|
|
71
|
+
# Create state directory; skip silently on failure (read-only fs, etc.)
|
|
72
|
+
mkdir -p "$STATE_DIR" 2>/dev/null || exit 0
|
|
73
|
+
|
|
74
|
+
# Extract fields defensively
|
|
75
|
+
CRON_EXPR=$(printf '%s' "$INPUT" | jq -r '.tool_input.cron // empty' 2>/dev/null)
|
|
76
|
+
|
|
77
|
+
# Skip if no cron expression — the hook only fires on CronCreate but
|
|
78
|
+
# defensive check guards against malformed input
|
|
79
|
+
if [ -z "$CRON_EXPR" ]; then
|
|
80
|
+
exit 0
|
|
81
|
+
fi
|
|
82
|
+
|
|
83
|
+
RECURRING=$(printf '%s' "$INPUT" | jq -r '.tool_input.recurring // false' 2>/dev/null)
|
|
84
|
+
PROMPT_RAW=$(printf '%s' "$INPUT" | jq -r '.tool_input.prompt // empty' 2>/dev/null)
|
|
85
|
+
RESULT_RAW=$(printf '%s' "$INPUT" | jq -r '.tool_result // empty' 2>/dev/null)
|
|
86
|
+
|
|
87
|
+
# Truncate to bounded length
|
|
88
|
+
PROMPT_EXCERPT=$(printf '%s' "$PROMPT_RAW" | head -c "$EXCERPT_LEN")
|
|
89
|
+
RESULT_EXCERPT=$(printf '%s' "$RESULT_RAW" | head -c "$EXCERPT_LEN")
|
|
90
|
+
|
|
91
|
+
# Generate unique receipt filename: timestamp + 4-char random suffix
|
|
92
|
+
TS=$(date -u '+%Y%m%dT%H%M%SZ')
|
|
93
|
+
SEQ=$(printf '%04x' "$RANDOM" 2>/dev/null || echo "0000")
|
|
94
|
+
RECEIPT_FILE="$STATE_DIR/$TS-$SEQ.json"
|
|
95
|
+
|
|
96
|
+
# Compose receipt JSON via jq for safe quoting
|
|
97
|
+
jq -n \
|
|
98
|
+
--arg registered_at "$(date -u '+%Y-%m-%dT%H:%M:%SZ')" \
|
|
99
|
+
--arg cron_expression "$CRON_EXPR" \
|
|
100
|
+
--argjson recurring "$RECURRING" \
|
|
101
|
+
--arg prompt_excerpt "$PROMPT_EXCERPT" \
|
|
102
|
+
--arg tool_output_excerpt "$RESULT_EXCERPT" \
|
|
103
|
+
'{
|
|
104
|
+
registered_at: $registered_at,
|
|
105
|
+
cron_expression: $cron_expression,
|
|
106
|
+
recurring: $recurring,
|
|
107
|
+
prompt_excerpt: $prompt_excerpt,
|
|
108
|
+
tool_output_excerpt: $tool_output_excerpt
|
|
109
|
+
}' > "$RECEIPT_FILE" 2>/dev/null || exit 0
|
|
110
|
+
|
|
111
|
+
# Always exit 0 — advisory only, never blocks CronCreate
|
|
112
|
+
exit 0
|
|
@@ -13,6 +13,18 @@
|
|
|
13
13
|
# TRIGGER: PreToolUse
|
|
14
14
|
# MATCHER: "Bash"
|
|
15
15
|
|
|
16
|
+
# Without jq, the parse below silently yields empty and this hook stops
|
|
17
|
+
# guarding - with no error anywhere. Say so. We deliberately do not exit
|
|
18
|
+
# here: blocking would halt every tool call, and exiting 0 would change
|
|
19
|
+
# the behaviour of guards that do not depend on the parsed value.
|
|
20
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
21
|
+
_nojq_warned="/tmp/cc-nojq-warned-cron-modification-guard-$PPID"
|
|
22
|
+
[ -f "$_nojq_warned" ] || {
|
|
23
|
+
echo "WARNING [cron-modification-guard]: jq not found - this hook cannot inspect tool calls and is NOT protecting you. Install jq." >&2
|
|
24
|
+
: > "$_nojq_warned"
|
|
25
|
+
}
|
|
26
|
+
fi
|
|
27
|
+
|
|
16
28
|
INPUT=$(cat)
|
|
17
29
|
COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty' 2>/dev/null)
|
|
18
30
|
[ -z "$COMMAND" ] && exit 0
|