cc-safe-setup 29.7.0 → 30.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +72 -19
- package/.claude-plugin/plugin.json +1 -1
- package/CONTRIBUTING.md +7 -2
- package/COOKBOOK.md +50 -46
- package/LICENSE +21 -0
- package/MIGRATION.md +8 -8
- package/README.md +419 -512
- package/SAFETY_CHECKLIST.md +15 -7
- package/SERVICES.md +194 -0
- package/SETTINGS_REFERENCE.md +236 -17
- package/SKILL.md +5 -5
- package/TROUBLESHOOTING.md +35 -14
- package/action.yml +12 -4
- package/audit/README.md +84 -0
- package/audit/audit-checklist.md +152 -0
- package/audit/boundary-selftest.sh +85 -0
- package/audit/boundary.sh +123 -0
- package/audit/count-hooks.py +42 -0
- package/audit/find-dead-hooks.sh +82 -0
- package/audit/find-unfirable-rules.sh +142 -0
- package/audit/fire.sh +97 -0
- package/audit/selftest.sh +42 -0
- package/audit/unfirable-selftest.sh +81 -0
- package/audit-web/index.html +9 -9
- package/examples/README.md +54 -17
- package/examples/account-billing-log.sh +98 -0
- package/examples/account-routing-preflight.sh +123 -0
- package/examples/agent-sdk-credit-pool-monitor.sh +145 -0
- package/examples/agent-view-quota-decrement.sh +32 -0
- package/examples/agent-view-quota-warn.sh +94 -0
- package/examples/agents-md-edit-drift-warner.sh +223 -0
- package/examples/agents-md-loader.sh +160 -0
- package/examples/agents-md-sync-checker.sh +102 -0
- package/examples/ai-slop-punctuation-arrest.sh +210 -0
- package/examples/allowlist.sh +70 -10
- package/examples/always-allow-pattern-suggester.sh +125 -0
- package/examples/ansible-vault-guard.sh +2 -1
- package/examples/anthropic-base-url-guard.sh +76 -0
- package/examples/api-busyloop-guard.sh +123 -0
- package/examples/api-endpoint-guard.sh +12 -0
- package/examples/api-key-in-url-guard.sh +17 -1
- package/examples/api-rate-limit-guard.sh +36 -1
- package/examples/api-rate-limit-tracker.sh +12 -0
- package/examples/articulated-scope-capture.sh +101 -0
- package/examples/askuserquestion-autonomy-gate.sh +102 -0
- package/examples/attachment-traversal-guard.sh +118 -0
- package/examples/aup-block-pattern-logger.sh +161 -0
- package/examples/aup-false-positive-helper.sh +124 -0
- package/examples/aup-large-tool-output-warner.sh +282 -0
- package/examples/aup-retry-loop-guard.sh +229 -0
- package/examples/auth-expiry-reminder.sh +157 -0
- package/examples/auth-macos-sleep-detector.sh +185 -0
- package/examples/auth-path-detector.sh +171 -0
- package/examples/auth-status-checker.sh +157 -0
- package/examples/authorized-reconfirmation-detector.sh +195 -0
- package/examples/auto-approve-build.sh +39 -0
- package/examples/auto-approve-cargo.sh +31 -1
- package/examples/auto-approve-docker.sh +35 -0
- package/examples/auto-approve-git-read.sh +37 -14
- package/examples/auto-approve-go.sh +30 -1
- package/examples/auto-approve-gradle.sh +29 -1
- package/examples/auto-approve-make.sh +29 -1
- package/examples/auto-approve-maven.sh +29 -1
- package/examples/auto-approve-python.sh +41 -1
- package/examples/auto-approve-readonly-tools.sh +1 -0
- package/examples/auto-approve-readonly.sh +110 -33
- package/examples/auto-approve-ssh.sh +30 -1
- package/examples/auto-approve-test.sh +44 -0
- package/examples/auto-checkpoint.sh +1 -1
- package/examples/auto-compact-prep.sh +0 -0
- package/examples/auto-git-checkpoint.sh +0 -0
- package/examples/auto-mode-safe-commands.sh +53 -1
- package/examples/auto-mode-safety-enforcer.sh +151 -4
- package/examples/auto-push-session-branch.sh +22 -0
- package/examples/aws-production-guard.sh +13 -1
- package/examples/aws-region-guard.sh +1 -1
- package/examples/background-cost-launch-guard.sh +82 -0
- package/examples/background-task-guard.sh +12 -0
- package/examples/backup-before-refactor.sh +0 -0
- package/examples/banned-command-guard.sh +12 -0
- package/examples/bash-allowlist-secondary-check.sh +157 -0
- package/examples/bash-domain-allowlist.sh +12 -0
- package/examples/bash-fanout-bounded-rewriter.sh +191 -0
- package/examples/bash-heuristic-approver.sh +112 -10
- package/examples/bash-project-fence.sh +194 -0
- package/examples/bash-safety-auto-deny.sh +12 -0
- package/examples/bash-secret-output-detector.sh +44 -3
- package/examples/bash-trace-guard.sh +12 -0
- package/examples/bashrc-safety-check.sh +0 -0
- package/examples/bg-permission-prompt-warner.sh +182 -0
- package/examples/bg-task-cooldown-guard.sh +12 -0
- package/examples/binary-read-detector.sh +135 -0
- package/examples/binary-upload-guard.sh +12 -0
- package/examples/block-database-wipe.sh +35 -10
- package/examples/branch-name-check.sh +8 -3
- package/examples/branch-naming-convention.sh +0 -0
- package/examples/broad-find-guard.sh +12 -0
- package/examples/broad-prefix-session-trap-warner.sh +106 -0
- package/examples/bulk-file-delete-guard.sh +45 -0
- package/examples/bypass-mode-effective-verifier.sh +203 -0
- package/examples/cache-creation-drift-detector.sh +120 -0
- package/examples/cache-residue-detector.sh +195 -0
- package/examples/cache-tier-logger.sh +70 -0
- package/examples/cache-ttl-eviction-detector.sh +149 -0
- package/examples/cargo-publish-guard.sh +14 -1
- package/examples/case-insensitive-path-guard.sh +21 -2
- package/examples/case-sensitive-guard.sh +23 -2
- package/examples/cch-cache-guard.sh +0 -0
- package/examples/cch-sentinel-precommit-guard.sh +47 -0
- package/examples/check-abort-controller.sh +1 -1
- package/examples/check-accessibility.sh +0 -0
- package/examples/check-aria-labels.sh +0 -0
- package/examples/check-before-act-enforcer.sh +12 -0
- package/examples/check-charset-meta.sh +0 -0
- package/examples/check-cookie-flags.sh +0 -0
- package/examples/check-cors-config.sh +0 -0
- package/examples/check-csp-headers.sh +0 -0
- package/examples/check-csrf-protection.sh +0 -0
- package/examples/check-debounce.sh +1 -1
- package/examples/check-dependency-age.sh +0 -0
- package/examples/check-dependency-license.sh +0 -0
- package/examples/check-dockerfile-best-practice.sh +0 -0
- package/examples/check-error-boundaries.sh +0 -0
- package/examples/check-error-class.sh +1 -1
- package/examples/check-error-handling.sh +0 -0
- package/examples/check-error-logging.sh +1 -1
- package/examples/check-error-message.sh +0 -0
- package/examples/check-error-stack.sh +0 -0
- package/examples/check-favicon.sh +0 -0
- package/examples/check-git-hooks-compat.sh +0 -0
- package/examples/check-gitattributes.sh +0 -0
- package/examples/check-https-redirect.sh +0 -0
- package/examples/check-input-validation.sh +0 -0
- package/examples/check-lang-attribute.sh +0 -0
- package/examples/check-npm-scripts-exist.sh +0 -0
- package/examples/check-package-size.sh +0 -0
- package/examples/check-port-availability.sh +0 -0
- package/examples/check-promise-all.sh +1 -1
- package/examples/check-rate-limiting.sh +0 -0
- package/examples/check-return-types.sh +0 -0
- package/examples/check-semantic-versioning.sh +0 -0
- package/examples/check-suspense-fallback.sh +1 -1
- package/examples/check-test-exists.sh +0 -0
- package/examples/check-test-naming.sh +0 -0
- package/examples/check-timeout-cleanup.sh +1 -1
- package/examples/check-tls-version.sh +0 -0
- package/examples/check-unsubscribe.sh +1 -1
- package/examples/check-viewport-meta.sh +0 -0
- package/examples/check-worker-terminate.sh +1 -1
- package/examples/checkpoint-tamper-guard.sh +12 -0
- package/examples/chmod-guard.sh +12 -0
- package/examples/chown-guard.sh +24 -0
- package/examples/ci-workflow-guard.sh +6 -1
- package/examples/claim-verify-detector.sh +109 -0
- package/examples/claim-vs-caveat-checker.sh +77 -0
- package/examples/classifier-fallback-allow.sh +114 -40
- package/examples/claude-cache-gc.sh +1 -0
- package/examples/claude-code-version-pin-advisor.sh +183 -0
- package/examples/claude-md-reinjector.sh +129 -0
- package/examples/claude-md-size-monitor.sh +66 -0
- package/examples/claude-update-budget-guard.sh +123 -0
- package/examples/claude-update-smart.sh +113 -0
- package/examples/claudeignore-enforce-guard.sh +12 -0
- package/examples/claudemd-enforcer.sh +0 -0
- package/examples/claudemd-tool-prohibition.sh +128 -0
- package/examples/clear-command-confirm-guard.sh +32 -15
- package/examples/cli-config-pinning-detector.sh +162 -0
- package/examples/cliff-countdown-advisor.sh +96 -0
- package/examples/clipboard-secret-guard.sh +12 -0
- package/examples/closure-word-verify-gate.sh +150 -0
- package/examples/cloud-cli-guard.sh +39 -2
- package/examples/commit-all-scope-guard.sh +44 -0
- package/examples/commit-message-check.sh +1 -1
- package/examples/commit-message-quality.sh +6 -1
- package/examples/commitment-carry-forward-arrest.sh +361 -0
- package/examples/compact-alert-notification.sh +0 -0
- package/examples/compact-circuit-breaker.sh +72 -0
- package/examples/compact-dispatch-watchdog.sh +149 -0
- package/examples/completion-claim-without-verification-detector.sh +207 -0
- package/examples/composer-guard.sh +12 -0
- package/examples/compound-bash-permission-resolver.sh +156 -0
- package/examples/compound-command-allow.sh +1 -1
- package/examples/compound-command-deny-enforcer.sh +183 -0
- package/examples/compound-inject-guard.sh +12 -0
- package/examples/concurrent-edit-lock.sh +12 -0
- package/examples/conflict-marker-guard.sh +12 -0
- package/examples/consecutive-error-breaker.sh +0 -0
- package/examples/console-log-count.sh +1 -0
- package/examples/context-compact-advisor.sh +29 -2
- package/examples/context-length-budget.sh +69 -0
- package/examples/context-threshold-alert.sh +12 -0
- package/examples/context-usage-drift-alert.sh +41 -13
- package/examples/conversation-history-guard.sh +12 -0
- package/examples/core-file-protect-guard.sh +12 -0
- package/examples/cors-star-warn.sh +0 -0
- package/examples/cost-incident-self-audit.sh +162 -0
- package/examples/cowork-claude-md-load-checker.sh +100 -0
- package/examples/cowork-fuse-staleness-watcher.sh +140 -0
- package/examples/cowork-hook-absence-warner.sh +167 -0
- package/examples/cowork-model-picker-advisor.sh +115 -0
- package/examples/credential-exfil-guard.sh +65 -4
- package/examples/credential-file-cat-guard.sh +17 -1
- package/examples/cron-create-receipt.sh +112 -0
- package/examples/cron-modification-guard.sh +12 -0
- package/examples/cross-product-mcp-spawn-detector.sh +178 -0
- package/examples/cwd-project-boundary-guard.sh +0 -0
- package/examples/daemon-zombie-worker-surfacer.sh +118 -0
- package/examples/daily-cost-guard.sh +164 -0
- package/examples/daily-usage-tracker.sh +0 -0
- package/examples/dangerous-pip-flag-guard.sh +12 -0
- package/examples/db-connect-guard.sh +13 -1
- package/examples/denied-action-retry-guard.sh +12 -0
- package/examples/deny-bypass-detector.sh +12 -0
- package/examples/deny-rule-integrity-verifier.sh +181 -0
- package/examples/dependency-install-guard.sh +12 -0
- package/examples/deploy-guard.sh +14 -2
- package/examples/deploy-path-verify-guard.sh +12 -0
- package/examples/deployment-readback-gate.sh +135 -0
- package/examples/deployment-readback-gh-adapter.sh +247 -0
- package/examples/deployment-verify-guard.sh +25 -2
- package/examples/destructive-db-script-write-guard.sh +166 -0
- package/examples/destructive-migration-write-guard.sh +163 -0
- package/examples/diff-size-guard.sh +12 -0
- package/examples/disabled-feature-toggle-advisor.sh +88 -0
- package/examples/disk-partition-guard.sh +12 -0
- package/examples/dispatch-allowlist-preflight.sh +301 -0
- package/examples/dispatch-liveness-watchdog.sh +216 -0
- package/examples/dispatch-receipt.sh +174 -0
- package/examples/django-migrate-guard.sh +12 -0
- package/examples/dns-config-guard.sh +12 -0
- package/examples/docker-dangerous-guard.sh +12 -0
- package/examples/docker-volume-guard.sh +0 -0
- package/examples/dockerfile-latest-guard.sh +1 -0
- package/examples/dotenv-anthropic-key-billing-guard.sh +99 -0
- package/examples/dotenv-commit-guard.sh +12 -0
- package/examples/dotenv-read-guard.sh +12 -0
- package/examples/dotfile-protection-guard.sh +12 -0
- package/examples/dotnet-build-on-edit.sh +1 -1
- package/examples/drizzle-migrate-guard.sh +27 -2
- package/examples/echo-probe-spam-detector.sh +176 -0
- package/examples/edit-counter-test-gate.sh +12 -0
- package/examples/edit-error-counter.sh +1 -1
- package/examples/edit-guard.sh +12 -0
- package/examples/edit-old-string-validator.sh +12 -0
- package/examples/edit-quote-ambiguity-guard.sh +97 -0
- package/examples/edit-retry-loop-guard.sh +0 -0
- package/examples/edit-verify.sh +0 -0
- package/examples/env-inline-secret-guard.sh +14 -2
- package/examples/env-naming-convention.sh +0 -0
- package/examples/env-prod-guard.sh +0 -0
- package/examples/env-required-check.sh +0 -0
- package/examples/env-source-guard.sh +12 -0
- package/examples/env-var-check.sh +24 -1
- package/examples/ephemeral-container-detector.sh +147 -0
- package/examples/error-memory-guard.sh +12 -0
- package/examples/evidence-claim-gate.sh +187 -0
- package/examples/exploration-budget-guard.sh +89 -0
- package/examples/expo-eject-guard.sh +13 -0
- package/examples/extended-thinking-loop-guard.sh +139 -0
- package/examples/extended-thinking-resume-warning.sh +119 -0
- package/examples/extended-thinking-tool-use-mismatch-detector.sh +212 -0
- package/examples/fabricated-command-detector.sh +145 -0
- package/examples/false-disk-full-guard.sh +63 -0
- package/examples/feature-deprecation-detector.sh +109 -0
- package/examples/file-change-tracker.sh +1 -1
- package/examples/file-change-undo-tracker.sh +0 -0
- package/examples/file-edit-backup.sh +63 -14
- package/examples/file-reference-check.sh +0 -0
- package/examples/file-size-limit.sh +12 -0
- package/examples/financial-operation-guard.sh +12 -0
- package/examples/firewall-guard.sh +12 -0
- package/examples/fish-shell-wrapper.sh +125 -7
- package/examples/five-hundred-milestone.sh +1 -0
- package/examples/flask-static-route-guard.sh +89 -0
- package/examples/forbidden-response-phrase-detector.sh +161 -0
- package/examples/gem-push-guard.sh +13 -0
- package/examples/gh-cli-destructive-guard.sh +13 -1
- package/examples/git-checkout-safety-guard.sh +12 -0
- package/examples/git-checkout-uncommitted-guard.sh +12 -0
- package/examples/git-config-guard.sh +12 -0
- package/examples/git-crypt-worktree-guard.sh +12 -0
- package/examples/git-filter-repo-guard.sh +56 -0
- package/examples/git-history-rewrite-guard.sh +12 -0
- package/examples/git-hook-bypass-guard.sh +0 -0
- package/examples/git-maintenance-guard.sh +83 -0
- package/examples/git-merge-conflict-prevent.sh +0 -0
- package/examples/git-message-length-check.sh +0 -0
- package/examples/git-message-length.sh +0 -0
- package/examples/git-operations-require-approval.sh +68 -14
- package/examples/git-pack-temp-cleanup-guard.sh +102 -0
- package/examples/git-push-blast-radius-guard.sh +218 -0
- package/examples/git-remote-guard.sh +24 -3
- package/examples/git-rm-orphan-wipe-guard.sh +85 -0
- package/examples/git-stash-before-checkout.sh +12 -0
- package/examples/git-stash-before-danger.sh +0 -0
- package/examples/git-submodule-guard.sh +69 -2
- package/examples/git-tag-guard.sh +12 -0
- package/examples/github-actions-secret-guard.sh +0 -0
- package/examples/gitignore-check.sh +0 -0
- package/examples/gitops-drift-guard.sh +12 -0
- package/examples/go-mod-tidy-warn.sh +1 -0
- package/examples/go-vet-after-edit.sh +12 -0
- package/examples/goal-iteration-limit-warner.sh +152 -0
- package/examples/grep-nul-false-negative-guard.sh +30 -0
- package/examples/growthbook-flag-monitor.sh +257 -0
- package/examples/hallucination-url-check.sh +1 -1
- package/examples/halt-signal-detector.sh +135 -0
- package/examples/handoff-on-clear.sh +65 -0
- package/examples/hardcoded-ip-guard.sh +1 -0
- package/examples/headless-empty-result-guard.sh +0 -0
- package/examples/headless-stop-guard.sh +0 -0
- package/examples/helm-install-guard.sh +2 -1
- package/examples/home-critical-bash-guard.sh +17 -1
- package/examples/hook-debug-wrapper.sh +6 -2
- package/examples/hook-permission-fixer.sh +0 -0
- package/examples/hook-self-disable-detector.sh +99 -0
- package/examples/hook-stdout-sanitizer.sh +6 -2
- package/examples/hook-tamper-guard.sh +12 -0
- package/examples/idle-session-cost-alert.sh +0 -0
- package/examples/image-dimension-guard.sh +109 -0
- package/examples/image-file-validator.sh +0 -0
- package/examples/iteration-quality-degradation-detector.sh +170 -0
- package/examples/java-compile-on-edit.sh +1 -1
- package/examples/json-syntax-check.sh +0 -0
- package/examples/k8s-production-guard.sh +13 -1
- package/examples/kill-process-guard.sh +12 -0
- package/examples/kubernetes-guard.sh +13 -1
- package/examples/laravel-artisan-guard.sh +13 -0
- package/examples/large-file-guard.sh +1 -1
- package/examples/log-level-guard.sh +0 -0
- package/examples/log-truncation-guard.sh +12 -0
- package/examples/long-session-malformed-tool-call-detector.sh +183 -0
- package/examples/loop-detector.sh +12 -0
- package/examples/magic-number-warn.sh +1 -0
- package/examples/main-branch-warn.sh +12 -0
- package/examples/markdown-link-check.sh +0 -0
- package/examples/max-concurrent-agents.sh +12 -0
- package/examples/max-edit-size-guard.sh +13 -0
- package/examples/max-file-count-guard.sh +0 -0
- package/examples/max-file-delete-count.sh +0 -0
- package/examples/max-function-length.sh +1 -0
- package/examples/max-import-count.sh +0 -0
- package/examples/max-subagent-count.sh +0 -0
- package/examples/mcp-config-freeze.sh +12 -0
- package/examples/mcp-config-poisoning-audit.sh +150 -0
- package/examples/mcp-data-boundary.sh +1 -1
- package/examples/mcp-misdiagnosis-arrest.sh +209 -0
- package/examples/mcp-orphan-leak-warner.sh +49 -0
- package/examples/mcp-permissions-ask-warner.sh +151 -0
- package/examples/mcp-routine-approval-detector.sh +154 -0
- package/examples/mcp-server-allowlist.sh +12 -0
- package/examples/mcp-server-guard.sh +12 -0
- package/examples/mcp-startup-bloat-detector.sh +87 -0
- package/examples/mcp-stdio-compatibility-test.sh +153 -0
- package/examples/mcp-tool-audit-log.sh +0 -0
- package/examples/mcp-tool-guard.sh +101 -1
- package/examples/mcp-warmup-wait.sh +0 -0
- package/examples/memory-chain-audit.sh +56 -0
- package/examples/memory-orphan-detector.sh +188 -0
- package/examples/memory-write-guard.sh +99 -17
- package/examples/migration-verify-guard.sh +12 -0
- package/examples/model-swap-suggester.sh +177 -0
- package/examples/model-version-alert.sh +5 -1
- package/examples/model-version-lock.sh +63 -0
- package/examples/move-delete-sequence-guard.sh +33 -2
- package/examples/multi-file-plan-routing-gate.sh +192 -0
- package/examples/multi-vendor-concurrent-warner.sh +108 -0
- package/examples/multi-window-auth-drift-detector.sh +183 -0
- package/examples/multiline-command-approver.sh +161 -23
- package/examples/nested-background-agent-guard.sh +109 -0
- package/examples/nested-spawn-inflight-guard.sh +178 -0
- package/examples/network-exfil-guard.sh +12 -0
- package/examples/network-guard.sh +12 -0
- package/examples/network-interface-guard.sh +12 -0
- package/examples/nextjs-env-guard.sh +1 -1
- package/examples/no-absolute-import.sh +0 -0
- package/examples/no-alert-confirm-prompt.sh +0 -0
- package/examples/no-anonymous-default-export.sh +0 -0
- package/examples/no-any-type.sh +0 -0
- package/examples/no-any-typescript.sh +1 -0
- package/examples/no-ask-human.sh +12 -0
- package/examples/no-assignment-in-condition.sh +0 -0
- package/examples/no-base64-exfil.sh +12 -0
- package/examples/no-callback-hell.sh +0 -0
- package/examples/no-circular-dependency.sh +0 -0
- package/examples/no-cleartext-storage.sh +0 -0
- package/examples/no-commented-code.sh +0 -0
- package/examples/no-commit-fixup.sh +0 -0
- package/examples/no-console-assert.sh +0 -0
- package/examples/no-console-error-swallow.sh +0 -0
- package/examples/no-console-in-prod.sh +0 -0
- package/examples/no-console-log-commit.sh +12 -0
- package/examples/no-console-log.sh +0 -0
- package/examples/no-console-time.sh +0 -0
- package/examples/no-cors-wildcard.sh +4 -1
- package/examples/no-curl-upload.sh +0 -0
- package/examples/no-dangerouslySetInnerHTML.sh +0 -0
- package/examples/no-dangling-await.sh +1 -0
- package/examples/no-debug-commit.sh +12 -0
- package/examples/no-debug-in-commit.sh +0 -0
- package/examples/no-deep-nesting.sh +0 -0
- package/examples/no-deep-relative-import.sh +1 -0
- package/examples/no-default-credentials.sh +0 -0
- package/examples/no-deploy-friday.sh +13 -1
- package/examples/no-disabled-test.sh +0 -0
- package/examples/no-document-write.sh +0 -0
- package/examples/no-empty-function.sh +0 -0
- package/examples/no-eval-in-template.sh +0 -0
- package/examples/no-eval-template.sh +3 -1
- package/examples/no-eval.sh +0 -0
- package/examples/no-exec-user-input.sh +0 -0
- package/examples/no-fixme-ship.sh +12 -0
- package/examples/no-floating-promises.sh +0 -0
- package/examples/no-force-flag.sh +22 -5
- package/examples/no-force-install.sh +0 -0
- package/examples/no-git-amend.sh +12 -0
- package/examples/no-git-rebase-public.sh +0 -0
- package/examples/no-global-install.sh +12 -0
- package/examples/no-global-state.sh +0 -0
- package/examples/no-hardcoded-port.sh +1 -0
- package/examples/no-hardcoded-url.sh +0 -0
- package/examples/no-helmet-missing.sh +0 -0
- package/examples/no-http-url.sh +1 -0
- package/examples/no-http-without-https.sh +0 -0
- package/examples/no-inline-style.sh +0 -0
- package/examples/no-inline-styles.sh +1 -0
- package/examples/no-innerhtml.sh +0 -0
- package/examples/no-install-global.sh +12 -0
- package/examples/no-jwt-in-url.sh +0 -0
- package/examples/no-large-commit.sh +0 -0
- package/examples/no-localhost-expose.sh +0 -0
- package/examples/no-magic-number.sh +0 -0
- package/examples/no-md5-sha1.sh +0 -0
- package/examples/no-mixed-line-endings.sh +8 -1
- package/examples/no-mutation-in-reducer.sh +0 -0
- package/examples/no-nested-ternary.sh +0 -0
- package/examples/no-network-exfil.sh +0 -0
- package/examples/no-open-redirect.sh +0 -0
- package/examples/no-output-truncation.sh +12 -0
- package/examples/no-package-downgrade.sh +0 -0
- package/examples/no-package-lock-edit.sh +12 -0
- package/examples/no-path-join-user-input.sh +0 -0
- package/examples/no-port-bind.sh +0 -0
- package/examples/no-process-exit.sh +0 -0
- package/examples/no-prototype-pollution.sh +0 -0
- package/examples/no-push-without-ci.sh +0 -0
- package/examples/no-push-without-tests.sh +12 -0
- package/examples/no-raw-password-in-url.sh +0 -0
- package/examples/no-root-user-docker.sh +1 -0
- package/examples/no-root-write.sh +12 -0
- package/examples/no-secrets-in-args.sh +4 -1
- package/examples/no-secrets-in-logs.sh +0 -0
- package/examples/no-sensitive-log.sh +0 -0
- package/examples/no-sleep-in-hooks.sh +0 -0
- package/examples/no-star-import-python.sh +1 -0
- package/examples/no-string-concat-sql.sh +0 -0
- package/examples/no-sudo-guard.sh +12 -0
- package/examples/no-sync-fs.sh +0 -0
- package/examples/no-todo-in-merge.sh +0 -0
- package/examples/no-todo-in-production.sh +1 -0
- package/examples/no-todo-without-issue.sh +0 -0
- package/examples/no-unused-import.sh +0 -0
- package/examples/no-var-keyword.sh +0 -0
- package/examples/no-verify-blocker.sh +12 -0
- package/examples/no-wget-piped-bash.sh +12 -0
- package/examples/no-wildcard-cors.sh +0 -0
- package/examples/no-wildcard-delete.sh +0 -0
- package/examples/no-wildcard-import.sh +0 -0
- package/examples/no-with-statement.sh +0 -0
- package/examples/no-write-outside-src.sh +0 -0
- package/examples/no-xml-external-entity.sh +0 -0
- package/examples/non-english-quality-warner.sh +156 -0
- package/examples/notify-waiting.sh +1 -1
- package/examples/npm-audit-warn.sh +0 -0
- package/examples/npm-global-install-guard.sh +12 -0
- package/examples/npm-publish-guard.sh +12 -0
- package/examples/npm-script-injection.sh +0 -0
- package/examples/npm-supply-chain-guard.sh +0 -0
- package/examples/nuxt-config-guard.sh +1 -0
- package/examples/oauth-refresh-monitor.sh +210 -0
- package/examples/opus-degradation-tracker.sh +187 -0
- package/examples/opus48-routine-task-warning.sh +196 -0
- package/examples/opus48-thinking-wedge-advisor.sh +143 -0
- package/examples/output-credential-scan.sh +1 -1
- package/examples/output-secret-mask.sh +31 -9
- package/examples/output-token-spike-detector.sh +145 -0
- package/examples/package-json-guard.sh +12 -0
- package/examples/package-lock-frozen.sh +12 -0
- package/examples/parallel-batch-size-limiter.sh +121 -0
- package/examples/parallel-cascade-detector.sh +116 -0
- package/examples/partial-view-claim-arrest.sh +174 -0
- package/examples/path-deny-bash-guard.sh +12 -0
- package/examples/path-traversal-guard.sh +12 -0
- package/examples/per-prompt-token-cap.sh +124 -0
- package/examples/permission-audit-log.sh +1 -1
- package/examples/permission-denial-enforcer.sh +12 -0
- package/examples/permission-entry-validator.sh +0 -0
- package/examples/persisted-1m-model-advisor.sh +88 -0
- package/examples/php-lint-on-edit.sh +1 -1
- package/examples/pii-upload-guard.sh +12 -0
- package/examples/pip-publish-guard.sh +13 -0
- package/examples/pip-requirements-guard.sh +12 -0
- package/examples/pip-venv-required.sh +12 -0
- package/examples/plan-mode-edit-guard.sh +12 -0
- package/examples/plan-mode-enforcer.sh +12 -0
- package/examples/plan-mode-strict-guard.sh +12 -0
- package/examples/plugin-hooks-json-bloat-detector.sh +169 -0
- package/examples/plugin-process-cleanup.sh +0 -0
- package/examples/polyglot-rm-guard.sh +12 -0
- package/examples/post-compact-safety.sh +12 -0
- package/examples/post-edit-disk-verify.sh +152 -0
- package/examples/powershell-remove-item-guard.sh +85 -0
- package/examples/pr-description-check.sh +0 -0
- package/examples/pr-duplicate-guard.sh +13 -0
- package/examples/pre-bash-sed-line-ending-windows.sh +87 -0
- package/examples/pre-compact-knowledge-save.sh +0 -0
- package/examples/pre-compact-transcript-backup.sh +0 -0
- package/examples/pre-execution-claim-detector.sh +179 -0
- package/examples/prefer-builtin-tools.sh +10 -1
- package/examples/prefer-const.sh +0 -0
- package/examples/prefer-dedicated-tools.sh +12 -0
- package/examples/prefer-optional-chaining.sh +0 -0
- package/examples/prisma-migrate-guard.sh +24 -7
- package/examples/production-port-kill-guard.sh +12 -0
- package/examples/prompt-injection-guard.sh +2 -1
- package/examples/prompt-usage-logger.sh +0 -0
- package/examples/protect-claudemd.sh +12 -0
- package/examples/protect-dotfiles.sh +12 -0
- package/examples/proxy-capture-suggester.sh +159 -0
- package/examples/public-artefact-socratic-narrowing.sh +232 -0
- package/examples/public-repo-push-guard.sh +12 -0
- package/examples/push-requires-test-pass-record.sh +0 -0
- package/examples/push-requires-test-pass.sh +12 -0
- package/examples/quota-anomaly-detector.sh +173 -0
- package/examples/quota-reset-audit.sh +58 -0
- package/examples/quoted-flag-approver.sh +99 -10
- package/examples/rails-migration-guard.sh +12 -0
- package/examples/rate-limit-guard.sh +0 -0
- package/examples/read-all-files-enforcer.sh +0 -0
- package/examples/read-budget-guard.sh +12 -0
- package/examples/read-loop-detector.sh +59 -0
- package/examples/read-once-guard.sh +96 -0
- package/examples/read-only-mode.sh +12 -0
- package/examples/readme-exists-check.sh +0 -0
- package/examples/record-read-coverage.sh +73 -0
- package/examples/redirect-fragment-warner.sh +149 -0
- package/examples/redis-flushall-guard.sh +13 -0
- package/examples/redundant-read-blocker.sh +132 -0
- package/examples/refusal-arrest-gate.sh +248 -0
- package/examples/registry-publish-guard.sh +13 -1
- package/examples/remote-control-billing-classifier.sh +135 -0
- package/examples/replace-all-guard.sh +12 -0
- package/examples/repo-visibility-guard.sh +12 -0
- package/examples/reroute-after-block-guard.sh +150 -0
- package/examples/response-budget-guard.sh +0 -0
- package/examples/resume-drift-watcher.sh +57 -0
- package/examples/rg-replace-flag-detector.sh +125 -0
- package/examples/rhetorical-verification-prompt-detector.sh +102 -0
- package/examples/ripgrep-permission-fix.sh +0 -0
- package/examples/rm-safety-net.sh +151 -8
- package/examples/role-tool-guard.sh +12 -0
- package/examples/route-handler-emptiness-gate.sh +324 -0
- package/examples/ruby-lint-on-edit.sh +1 -1
- package/examples/runtime-binary-change-detector.sh +102 -0
- package/examples/same-command-repeat-detector.sh +196 -0
- package/examples/same-correction-arrest.sh +169 -0
- package/examples/sandbox-denywrite-enforcer.sh +78 -0
- package/examples/sandbox-relative-path-audit.sh +83 -25
- package/examples/sandbox-write-verify.sh +12 -0
- package/examples/schema-migration-guard.sh +0 -0
- package/examples/scope-expansion-receipt.sh +178 -0
- package/examples/scope-guard.sh +88 -9
- package/examples/secret-file-read-guard.sh +12 -0
- package/examples/secret-file-write-guard.sh +150 -0
- package/examples/self-modify-bypass-guard.sh +0 -0
- package/examples/sensitive-file-read-guard.sh +23 -3
- package/examples/sensitive-log-guard.sh +1 -0
- package/examples/server-side-prompt-injection-detector.sh +69 -0
- package/examples/session-agent-cost-limiter.sh +12 -0
- package/examples/session-backup-on-start.sh +1 -1
- package/examples/session-cost-alert.sh +12 -0
- package/examples/session-drift-guard.sh +12 -0
- package/examples/session-duration-guard.sh +25 -2
- package/examples/session-end-logger.sh +0 -0
- package/examples/session-health-monitor.sh +0 -0
- package/examples/session-index-repair.sh +1 -1
- package/examples/session-memory-watchdog.sh +1 -0
- package/examples/session-permission-reset-guard.sh +12 -0
- package/examples/session-persistence-verifier.sh +93 -0
- package/examples/session-plugin-pin-watch.sh +68 -0
- package/examples/session-rate-monitor.sh +176 -0
- package/examples/session-resume-env-fix.sh +0 -0
- package/examples/session-start-quota-status.sh +193 -0
- package/examples/session-start-safety-check.sh +55 -3
- package/examples/session-state-saver.sh +0 -0
- package/examples/session-summary-stop.sh +1 -1
- package/examples/session-summary.sh +0 -0
- package/examples/session-token-counter.sh +1 -1
- package/examples/settings-hooks-key-restorer.sh +99 -0
- package/examples/settings-json-health-check.sh +57 -0
- package/examples/settings-json-model-guard.sh +0 -0
- package/examples/settings-regression-tester.sh +188 -0
- package/examples/shell-config-truncation-guard.sh +12 -0
- package/examples/shell-wrapper-guard.sh +12 -0
- package/examples/skill-cumulative-size-detector.sh +104 -0
- package/examples/skill-description-drop-detector.sh +148 -0
- package/examples/skill-gate.sh +0 -0
- package/examples/skill-truncation-detector.sh +154 -0
- package/examples/skills-context-recorder.sh +167 -0
- package/examples/skills-load-verifier.sh +96 -0
- package/examples/skills-settings-validator.sh +139 -0
- package/examples/sonnet-45-deprecation-helper.sh +85 -0
- package/examples/spec-file-scope-guard.sh +12 -0
- package/examples/spring-profile-guard.sh +1 -0
- package/examples/spurious-malformed-notice-detector.sh +247 -0
- package/examples/sql-bulk-delete-warn.sh +88 -0
- package/examples/sql-injection-detect.sh +0 -0
- package/examples/ssh-key-protect.sh +12 -0
- package/examples/staged-secret-scan.sh +22 -1
- package/examples/stale-temp-settings-detector.sh +86 -0
- package/examples/standing-rule-session-surfacer.sh +137 -0
- package/examples/stop-hook-sigterm-wrapper.sh +182 -0
- package/examples/stop-transcript-write-health.sh +64 -0
- package/examples/strict-allowlist.sh +57 -15
- package/examples/strip-coauthored-by.sh +50 -10
- package/examples/subagent-blast-radius-guard.sh +184 -0
- package/examples/subagent-boundary-precheck.sh +126 -0
- package/examples/subagent-budget-guard.sh +12 -0
- package/examples/subagent-claudemd-inject.sh +0 -0
- package/examples/subagent-closure-verify-gate.sh +164 -0
- package/examples/subagent-destructive-git-guard.sh +120 -0
- package/examples/subagent-error-detector.sh +0 -0
- package/examples/subagent-forged-system-reminder-guard.sh +156 -0
- package/examples/subagent-identity-leak-guard.sh +102 -0
- package/examples/subagent-identity-reassertion.sh +51 -0
- package/examples/subagent-inheritance-tester.sh +179 -0
- package/examples/subagent-permission-mode-guard.sh +110 -0
- package/examples/subagent-scope-guard.sh +12 -0
- package/examples/subagent-spawn-verification-enforcer.sh +102 -0
- package/examples/subagent-tool-allowlist-enforcer.sh +101 -0
- package/examples/subagent-tool-call-limiter.sh +87 -15
- package/examples/subcommand-chain-guard.sh +12 -0
- package/examples/subscription-api-billing-warner.sh +160 -0
- package/examples/subscription-bypass-detector.sh +152 -0
- package/examples/svelte-lint-on-edit.sh +1 -0
- package/examples/swift-build-on-edit.sh +1 -1
- package/examples/symlink-guard.sh +27 -2
- package/examples/symlink-protect.sh +1 -0
- package/examples/system-dir-protection-guard.sh +73 -8
- package/examples/system-message-workaround.sh +38 -13
- package/examples/system-package-guard.sh +12 -0
- package/examples/systemd-service-guard.sh +12 -0
- package/examples/task-integrity-guard.sh +12 -0
- package/examples/temp-file-cleanup.sh +1 -1
- package/examples/temporal-suggestion-detector.sh +135 -0
- package/examples/terraform-guard.sh +27 -6
- package/examples/test-after-edit.sh +1 -1
- package/examples/test-before-push.sh +12 -0
- package/examples/test-coverage-reminder.sh +24 -1
- package/examples/thinking-budget-effort-mismatch-detector.sh +149 -0
- package/examples/thinking-stall-detector.sh +61 -0
- package/examples/timezone-guard.sh +0 -0
- package/examples/tmp-output-size-guard.sh +0 -0
- package/examples/todo-check.sh +1 -1
- package/examples/token-budget-guard.sh +12 -0
- package/examples/token-budget-per-task.sh +12 -0
- package/examples/token-usage-tracker.sh +7 -1
- package/examples/tokenizer-ratio-alert-corpus.sh +90 -0
- package/examples/tokenizer-ratio-alert.sh +104 -0
- package/examples/tool-call-rate-limiter.sh +0 -0
- package/examples/tool-result-correlation-checker.sh +167 -0
- package/examples/tool-result-size-guard.sh +132 -0
- package/examples/tool-retry-budget-guard.sh +12 -0
- package/examples/transcript-contamination-detector.sh +138 -0
- package/examples/trustfall-mcp-injection-guard.sh +103 -0
- package/examples/ultrareview-large-diff-advisor.sh +184 -0
- package/examples/unbounded-output-guard.sh +94 -0
- package/examples/uncommitted-changes-stop.sh +1 -0
- package/examples/uncommitted-discard-guard.sh +23 -5
- package/examples/uncommitted-work-guard.sh +12 -0
- package/examples/usage-warn.sh +0 -0
- package/examples/user-account-guard.sh +12 -0
- package/examples/userprompt-submit-receipt.sh +123 -0
- package/examples/variable-expansion-guard.sh +12 -0
- package/examples/verify-after-publish-reminder.sh +93 -0
- package/examples/verify-before-commit.sh +12 -0
- package/examples/version-bump-detector.sh +156 -0
- package/examples/version-regression-warner.sh +144 -0
- package/examples/vue-lint-on-edit.sh +1 -0
- package/examples/warn-cron-cost-trap.sh +173 -0
- package/examples/webfetch-runaway-guard.sh +89 -0
- package/examples/wellness-break-reminder.sh +118 -0
- package/examples/windows-destructive-command-guard.sh +177 -0
- package/examples/windows-path-guard.sh +12 -0
- package/examples/windows-python-stub-detector.sh +63 -0
- package/examples/work-hours-guard.sh +12 -0
- package/examples/working-directory-fence.sh +12 -0
- package/examples/workspace-lease-guard.sh +205 -0
- package/examples/worktree-create-log.sh +1 -0
- package/examples/worktree-delete-guard.sh +12 -0
- package/examples/worktree-edit-boundary-guard.sh +127 -0
- package/examples/worktree-escape-write-guard.sh +114 -0
- package/examples/worktree-hook-linker.sh +0 -0
- package/examples/worktree-hooks-path-fix.sh +111 -0
- package/examples/worktree-parent-write-guard.sh +43 -0
- package/examples/worktree-project-unify.sh +2 -1
- package/examples/worktree-remove-uncommitted-guard.sh +13 -0
- package/examples/worktree-unmerged-guard.sh +7 -1
- package/examples/write-byte-integrity-verifier.sh +190 -0
- package/examples/write-empty-content-guard.sh +67 -0
- package/examples/write-nul-corruption-detector.sh +61 -0
- package/examples/write-overwrite-confirm.sh +160 -14
- package/examples/write-secret-guard.sh +27 -5
- package/examples/write-shrink-guard.sh +12 -0
- package/examples/write-test-ratio.sh +0 -0
- package/examples/wsl-host-disk-space-guard.sh +97 -0
- package/examples/xml-format-leak-detector.sh +266 -0
- package/examples/yaml-syntax-check.sh +12 -0
- package/hooks/hooks.json +6 -6
- package/index.mjs +1699 -183
- package/mission.md +2 -0
- package/package.json +4 -4
- package/plugins/credential-guard/.claude-plugin/plugin.json +9 -7
- package/plugins/git-protection/.claude-plugin/plugin.json +10 -8
- package/plugins/safety-essentials/.claude-plugin/plugin.json +9 -7
- package/plugins/token-guard/.claude-plugin/plugin.json +10 -8
- package/scripts/agents-md-sync-setup.sh +156 -0
- package/scripts/autonomy-blocked-summary.sh +148 -0
- package/scripts/build-search-index.py +43 -0
- package/scripts/build-sitemap.py +119 -0
- package/scripts/cc-doctor.sh +192 -0
- package/scripts/check-hook-event-names.py +127 -0
- package/scripts/check-misfire-instrument.sh +64 -0
- package/scripts/claim-verify-audit.sh +467 -0
- package/scripts/cowork-claudemd-helper.sh +136 -0
- package/scripts/june-15-deprecated-model-scan.sh +111 -0
- package/scripts/measure-heredoc-shapes.sh +67 -0
- package/scripts/measure-literal-match-misfire.sh +110 -0
- package/scripts/probe-scope-guard-branches.sh +48 -0
- package/scripts/probe-skip-line-both-ways.sh +65 -0
- package/scripts/receipts-aggregate.py +199 -0
- package/scripts/session-forensic-audit.py +360 -0
- package/scripts.json +9 -9
- package/scripts.json.bak-2026-07-27-find +13 -0
- package/skills/safety-setup/SKILL.md +5 -5
- package/tests/approve-side-remaining-two.test.sh +129 -0
- package/tests/approver-list-granularity.test.sh +145 -0
- package/tests/askuserquestion-autonomy-gate.test.sh +181 -0
- package/tests/audit-ci-gate.test.sh +87 -0
- package/tests/audit-cross-layer-claudemd.test.sh +170 -0
- package/tests/audit-fail-open-parse.test.sh +100 -0
- package/tests/auto-approve-compound-tail.test.sh +194 -0
- package/tests/auto-mode-path-invoked-commands.test.sh +89 -0
- package/tests/auto-mode-quoted-targets.test.sh +127 -0
- package/tests/auto-mode-unquoted-targets.test.sh +112 -0
- package/tests/bash-secret-output-detector-detects.test.sh +102 -0
- package/tests/blindspots-cross-layer.test.sh +177 -0
- package/tests/block-database-wipe.test.sh +64 -0
- package/tests/bundled-short-flags-bypass.test.sh +85 -0
- package/tests/cd-git-allow-compound-tail.test.sh +67 -0
- package/tests/chown-guard-filesystem-root.test.sh +64 -0
- package/tests/ci-workflow-guard-skip-rule.test.sh +115 -0
- package/tests/compound-deny-safe-rm-targets.test.sh +105 -0
- package/tests/core-scripts-parser-fallback.test.sh +140 -0
- package/tests/destructive-guard-bare-glob.test.sh +74 -0
- package/tests/destructive-guard-every-operand.test.sh +100 -0
- package/tests/destructive-guard-find-deletion.test.sh +114 -0
- package/tests/destructive-guard-flag-order.test.sh +106 -0
- package/tests/destructive-guard-mentions-vs-invocations.test.sh +107 -0
- package/tests/destructive-guard-quoted-target.test.sh +89 -0
- package/tests/destructive-guard-separators.test.sh +105 -0
- package/tests/destructive-guard-variable-target.test.sh +98 -0
- package/tests/destructive-guard-wrapped-command.test.sh +91 -0
- package/tests/doctor-hook-disabling-env.test.sh +92 -0
- package/tests/doctor-misspelled-settings-keys.test.sh +106 -0
- package/tests/example-guards-wrapped-command.test.sh +169 -0
- package/tests/file-edit-backup.test.sh +93 -0
- package/tests/git-filter-repo-guard.test.sh +60 -0
- package/tests/git-global-options-bypass.test.sh +141 -0
- package/tests/git-invocation-prefixes-all-guards.test.sh +114 -0
- package/tests/git-maintenance-guard.test.sh +83 -0
- package/tests/git-pack-temp-cleanup-guard.test.sh +133 -0
- package/tests/git-rm-orphan-wipe-guard.test.sh +66 -0
- package/tests/git-submodule-guard.test.sh +50 -0
- package/tests/grep-pcre-portability.test.sh +155 -0
- package/tests/hook-registration-matches-input.test.sh +73 -0
- package/tests/hook-trigger-matches-envelope.test.sh +178 -0
- package/tests/install-does-not-claim-protection.test.sh +110 -0
- package/tests/install-example-standalone-tools.test.sh +139 -0
- package/tests/line-continuation-bypass.test.sh +114 -0
- package/tests/mcp-config-poisoning-audit.test.sh +106 -0
- package/tests/nested-background-agent-guard.test.sh +58 -0
- package/tests/no-unqualified-safety-claims.test.sh +114 -0
- package/tests/option-eating-grep-patterns.test.sh +130 -0
- package/tests/outdated-core-guards.test.sh +134 -0
- package/tests/outdated-report.test.sh +155 -0
- package/tests/output-secret-mask-warns.test.sh +73 -0
- package/tests/plugin-hooks-fail-open-under-sh.test.sh +165 -0
- package/tests/plugins-word-order.test.sh +126 -0
- package/tests/powershell-remove-item-guard.test.sh +85 -0
- package/tests/project-dir-naming.test.sh +103 -0
- package/tests/quoted-safe-targets-and-mentions.test.sh +190 -0
- package/tests/reroute-after-block-guard.test.sh +104 -0
- package/tests/secret-guard-documented-promises.test.sh +97 -0
- package/tests/session-plugin-pin-watch.test.sh +45 -0
- package/tests/settings-unreadable-refuses-to-write.test.sh +95 -0
- package/tests/shield-no-silent-adoption.test.py +110 -0
- package/tests/shield-no-silent-adoption.test.sh +46 -0
- package/tests/stop-transcript-write-health.test.sh +46 -0
- package/tests/system-dir-guard-root-erased.test.sh +66 -0
- package/tests/test-account-billing-log.sh +100 -0
- package/tests/test-account-routing-preflight.sh +77 -0
- package/tests/test-agent-sdk-credit-pool-monitor.sh +157 -0
- package/tests/test-agent-view-quota-warn.sh +184 -0
- package/tests/test-agents-md-edit-drift-warner.sh +176 -0
- package/tests/test-agents-md-loader.sh +204 -0
- package/tests/test-agents-md-sync-checker.sh +125 -0
- package/tests/test-ai-slop-punctuation-arrest.sh +280 -0
- package/tests/test-allowlist.sh +60 -0
- package/tests/test-always-allow-pattern-suggester.sh +147 -0
- package/tests/test-anthropic-base-url-guard.sh +88 -0
- package/tests/test-articulated-scope-capture.sh +139 -0
- package/tests/test-attachment-traversal-guard.sh +168 -0
- package/tests/test-aup-block-pattern-logger.sh +315 -0
- package/tests/test-aup-false-positive-helper.sh +188 -0
- package/tests/test-aup-large-tool-output-warner.sh +370 -0
- package/tests/test-aup-retry-loop-guard.sh +341 -0
- package/tests/test-auth-expiry-reminder.sh +303 -0
- package/tests/test-auth-macos-sleep-detector.sh +254 -0
- package/tests/test-auth-path-detector.sh +232 -0
- package/tests/test-auth-status-checker.sh +233 -0
- package/tests/test-authorized-reconfirmation-detector.sh +280 -0
- package/tests/test-background-cost-launch-guard.sh +62 -0
- package/tests/test-bash-allowlist-secondary-check.sh +143 -0
- package/tests/test-bash-fanout-bounded-rewriter.sh +186 -0
- package/tests/test-bash-project-fence.sh +127 -0
- package/tests/test-bg-permission-prompt-warner.sh +221 -0
- package/tests/test-binary-read-detector.sh +173 -0
- package/tests/test-broad-prefix-session-trap-warner.sh +167 -0
- package/tests/test-bulk-delete-target-resolution.sh +49 -0
- package/tests/test-bypass-mode-effective-verifier.sh +179 -0
- package/tests/test-cache-creation-drift-detector.sh +244 -0
- package/tests/test-cache-residue-detector.sh +429 -0
- package/tests/test-cache-tier-logger.sh +59 -0
- package/tests/test-cache-ttl-eviction-detector.sh +282 -0
- package/tests/test-cch-sentinel-precommit-guard.sh +64 -0
- package/tests/test-claim-verify-detector.sh +222 -0
- package/tests/test-claim-vs-caveat-checker.sh +134 -0
- package/tests/test-claude-code-version-pin-advisor.sh +353 -0
- package/tests/test-claude-md-reinjector.sh +173 -0
- package/tests/test-claude-md-size-monitor.sh +107 -0
- package/tests/test-claude-update-budget-guard.sh +132 -0
- package/tests/test-claude-update-smart.sh +91 -0
- package/tests/test-claudemd-tool-prohibition.sh +239 -0
- package/tests/test-cli-config-pinning-detector.sh +233 -0
- package/tests/test-cliff-countdown-advisor.sh +138 -0
- package/tests/test-closure-word-verify-gate.sh +158 -0
- package/tests/test-commit-all-scope-guard.sh +73 -0
- package/tests/test-commitment-carry-forward-arrest.sh +250 -0
- package/tests/test-compact-circuit-breaker.sh +134 -0
- package/tests/test-compact-dispatch-watchdog.sh +147 -0
- package/tests/test-completion-claim-without-verification-detector.sh +326 -0
- package/tests/test-compound-bash-permission-resolver.sh +264 -0
- package/tests/test-compound-command-deny-enforcer.sh +67 -0
- package/tests/test-context-length-budget.sh +68 -0
- package/tests/test-context-usage-drift-alert.sh +52 -22
- package/tests/test-cost-incident-self-audit.sh +94 -0
- package/tests/test-cowork-claude-md-load-checker.sh +257 -0
- package/tests/test-cowork-claudemd-helper.sh +141 -0
- package/tests/test-cowork-fuse-staleness-watcher.sh +287 -0
- package/tests/test-cowork-hook-absence-warner.sh +230 -0
- package/tests/test-cowork-model-picker-advisor.sh +317 -0
- package/tests/test-credential-exfil-guard.sh +62 -0
- package/tests/test-cron-create-receipt.sh +165 -0
- package/tests/test-cross-product-mcp-spawn-detector.sh +112 -0
- package/tests/test-daemon-zombie-worker-surfacer.sh +71 -0
- package/tests/test-daily-cost-guard.sh +131 -0
- package/tests/test-deny-rule-integrity-verifier.sh +288 -0
- package/tests/test-deployment-readback-gate.sh +92 -0
- package/tests/test-deployment-readback-gh-adapter.sh +163 -0
- package/tests/test-disabled-feature-toggle-advisor.sh +78 -0
- package/tests/test-dispatch-allowlist-preflight.sh +385 -0
- package/tests/test-dispatch-liveness-watchdog.sh +319 -0
- package/tests/test-dispatch-receipt.sh +314 -0
- package/tests/test-dotenv-anthropic-key-billing-guard.sh +160 -0
- package/tests/test-echo-probe-spam-detector.sh +143 -0
- package/tests/test-edit-quote-ambiguity-guard.sh +75 -0
- package/tests/test-ephemeral-container-detector.sh +251 -0
- package/tests/test-evidence-claim-gate.sh +291 -0
- package/tests/test-exploration-budget-guard.sh +164 -0
- package/tests/test-extended-thinking-loop-guard.sh +289 -0
- package/tests/test-extended-thinking-resume-warning.sh +240 -0
- package/tests/test-extended-thinking-tool-use-mismatch-detector.sh +236 -0
- package/tests/test-fabricated-command-detector.sh +296 -0
- package/tests/test-false-disk-full-guard.sh +36 -0
- package/tests/test-feature-deprecation-detector.sh +117 -0
- package/tests/test-forbidden-response-phrase-detector.sh +246 -0
- package/tests/test-git-operations-require-approval.sh +53 -0
- package/tests/test-git-push-blast-radius-guard.sh +115 -0
- package/tests/test-goal-iteration-limit-warner.sh +128 -0
- package/tests/test-growthbook-flag-monitor.sh +428 -0
- package/tests/test-halt-signal-detector.sh +120 -0
- package/tests/test-hook-self-disable-detector.sh +232 -0
- package/tests/test-iteration-quality-degradation-detector.sh +244 -0
- package/tests/test-long-session-malformed-tool-call-detector.sh +185 -0
- package/tests/test-marketplace-plugins.sh +193 -0
- package/tests/test-mcp-misdiagnosis-arrest.sh +235 -0
- package/tests/test-mcp-orphan-leak-warner.sh +71 -0
- package/tests/test-mcp-permissions-ask-warner.sh +207 -0
- package/tests/test-mcp-routine-approval-detector.sh +229 -0
- package/tests/test-mcp-startup-bloat-detector.sh +141 -0
- package/tests/test-mcp-stdio-compatibility-test.sh +112 -0
- package/tests/test-memory-chain-audit.sh +59 -0
- package/tests/test-memory-orphan-detector.sh +227 -0
- package/tests/test-model-swap-suggester.sh +368 -0
- package/tests/test-model-version-lock.sh +83 -0
- package/tests/test-multi-file-plan-routing-gate.sh +277 -0
- package/tests/test-multi-window-auth-drift-detector.sh +262 -0
- package/tests/test-nested-spawn-inflight-guard.sh +281 -0
- package/tests/test-no-force-flag.sh +49 -0
- package/tests/test-non-english-quality-warner.sh +229 -0
- package/tests/test-oauth-refresh-monitor.sh +311 -0
- package/tests/test-opus-degradation-tracker.sh +274 -0
- package/tests/test-opus48-routine-task-warning.sh +201 -0
- package/tests/test-opus48-thinking-wedge-advisor.sh +249 -0
- package/tests/test-output-token-spike-detector.sh +315 -0
- package/tests/test-parallel-batch-size-limiter.sh +228 -0
- package/tests/test-parallel-cascade-detector.sh +191 -0
- package/tests/test-partial-view-claim-arrest.sh +272 -0
- package/tests/test-per-prompt-token-cap.sh +136 -0
- package/tests/test-persisted-1m-model-advisor.sh +71 -0
- package/tests/test-plugin-hooks-json-bloat-detector.sh +267 -0
- package/tests/test-post-edit-disk-verify.sh +294 -0
- package/tests/test-pre-bash-sed-line-ending-windows.sh +108 -0
- package/tests/test-pre-execution-claim-detector.sh +366 -0
- package/tests/test-private-key-backup-and-git-credentials.sh +100 -0
- package/tests/test-proxy-capture-suggester.sh +214 -0
- package/tests/test-public-artefact-socratic-narrowing.sh +346 -0
- package/tests/test-quota-anomaly-detector.sh +321 -0
- package/tests/test-quota-reset-audit.sh +81 -0
- package/tests/test-read-loop-detector.sh +137 -0
- package/tests/test-read-once-guard.sh +85 -0
- package/tests/test-receipts-aggregate.sh +143 -0
- package/tests/test-redirect-fragment-warner.sh +130 -0
- package/tests/test-redundant-read-blocker.sh +155 -0
- package/tests/test-refusal-arrest-gate.sh +303 -0
- package/tests/test-remote-control-billing-classifier.sh +125 -0
- package/tests/test-resume-drift-watcher.sh +65 -0
- package/tests/test-rg-replace-flag-detector.sh +175 -0
- package/tests/test-rhetorical-verification-prompt-detector.sh +237 -0
- package/tests/test-rm-safety-net.sh +115 -0
- package/tests/test-route-handler-emptiness-gate.sh +300 -0
- package/tests/test-runtime-binary-change-detector.sh +196 -0
- package/tests/test-same-command-repeat-detector.sh +165 -0
- package/tests/test-same-correction-arrest.sh +165 -0
- package/tests/test-scope-expansion-receipt.sh +207 -0
- package/tests/test-server-side-prompt-injection-detector.sh +181 -0
- package/tests/test-session-persistence-verifier.sh +128 -0
- package/tests/test-session-rate-monitor.sh +284 -0
- package/tests/test-session-start-quota-status.sh +210 -0
- package/tests/test-session-start-safety-check.sh +138 -0
- package/tests/test-settings-hooks-key-restorer.sh +257 -0
- package/tests/test-settings-json-health-check.sh +70 -0
- package/tests/test-settings-regression-tester.sh +197 -0
- package/tests/test-skill-cumulative-size-detector.sh +198 -0
- package/tests/test-skill-description-drop-detector.sh +236 -0
- package/tests/test-skill-truncation-detector.sh +263 -0
- package/tests/test-skills-context-recorder.sh +329 -0
- package/tests/test-skills-load-verifier.sh +184 -0
- package/tests/test-skills-settings-validator.sh +242 -0
- package/tests/test-sonnet-45-deprecation-helper.sh +150 -0
- package/tests/test-spurious-malformed-notice-detector.sh +290 -0
- package/tests/test-sql-bulk-delete-warn.sh +123 -0
- package/tests/test-ssh-key-protect.sh +81 -0
- package/tests/test-stale-temp-settings-detector.sh +161 -0
- package/tests/test-standing-rule-session-surfacer.sh +215 -0
- package/tests/test-starter-hooks-manifest.sh +96 -0
- package/tests/test-stop-hook-sigterm-wrapper.sh +258 -0
- package/tests/test-strict-allowlist.sh +72 -0
- package/tests/test-subagent-boundary-precheck.sh +137 -0
- package/tests/test-subagent-closure-verify-gate.sh +193 -0
- package/tests/test-subagent-destructive-git-guard.sh +86 -0
- package/tests/test-subagent-identity-leak-guard.sh +62 -0
- package/tests/test-subagent-identity-reassertion.sh +61 -0
- package/tests/test-subagent-inheritance-tester.sh +319 -0
- package/tests/test-subagent-permission-mode-guard.sh +61 -0
- package/tests/test-subagent-spawn-verification-enforcer.sh +60 -0
- package/tests/test-subagent-tool-allowlist-enforcer.sh +62 -0
- package/tests/test-subagent-tool-call-limiter.sh +97 -0
- package/tests/test-subscription-api-billing-warner.sh +138 -0
- package/tests/test-subscription-bypass-detector.sh +255 -0
- package/tests/test-temporal-suggestion-detector.sh +183 -0
- package/tests/test-thinking-budget-effort-mismatch-detector.sh +327 -0
- package/tests/test-thinking-stall-detector.sh +151 -0
- package/tests/test-tokenizer-ratio-alert-corpus.sh +77 -0
- package/tests/test-tokenizer-ratio-alert.sh +93 -0
- package/tests/test-tool-result-correlation-checker.sh +264 -0
- package/tests/test-tool-result-size-guard.sh +121 -0
- package/tests/test-transcript-contamination-detector.sh +264 -0
- package/tests/test-trigger-header-parsing.sh +151 -0
- package/tests/test-ultrareview-large-diff-advisor.sh +192 -0
- package/tests/test-userprompt-submit-receipt.sh +181 -0
- package/tests/test-verify-after-publish-reminder.sh +184 -0
- package/tests/test-version-bump-detector.sh +212 -0
- package/tests/test-version-regression-warner.sh +165 -0
- package/tests/test-warn-cron-cost-trap.sh +82 -0
- package/tests/test-webfetch-runaway-guard.sh +77 -0
- package/tests/test-wellness-break-reminder.sh +138 -0
- package/tests/test-windows-destructive-command-guard.sh +169 -0
- package/tests/test-windows-python-stub-detector.sh +146 -0
- package/tests/test-worktree-edit-boundary-guard.sh +219 -0
- package/tests/test-write-byte-integrity-verifier.sh +192 -0
- package/tests/test-xml-format-leak-detector.sh +299 -0
- package/tests/trustfall-mcp-injection-guard.test.sh +183 -0
- package/tests/workspace-lease-guard.test.sh +144 -0
- package/tests/worktree-escape-write-guard.test.sh +68 -0
- package/tests/worktree-hooks-path-fix.test.sh +181 -0
- package/tests/worktree-parent-write-guard.test.sh +51 -0
- package/tests/write-empty-content-guard.test.sh +39 -0
- package/tests/write-nul-corruption-detector.test.sh +29 -0
- package/tests/write-overwrite-unread-content.test.sh +178 -0
- package/tests/wsl-host-disk-space-guard.test.sh +55 -0
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# ================================================================
|
|
3
|
+
# dispatch-allowlist-preflight.sh — Pre-flight MCP tool allowlist
|
|
4
|
+
# propagation check for background
|
|
5
|
+
# sub-agent dispatches
|
|
6
|
+
# ================================================================
|
|
7
|
+
# PURPOSE:
|
|
8
|
+
# PreToolUse on Agent. When a sub-agent is dispatched with
|
|
9
|
+
# run_in_background=true and the dispatch prompt references one or
|
|
10
|
+
# more MCP tools (mcp__*), checks whether the parent's allowlist
|
|
11
|
+
# covers those tools and emits a loud warning (or refuses) when the
|
|
12
|
+
# known inheritance bug shape applies. Converts the silent stall
|
|
13
|
+
# into an observable signal *before* the sub-agent process hangs
|
|
14
|
+
# on the MCP permission gate with no UI surface.
|
|
15
|
+
#
|
|
16
|
+
# TRIGGER: PreToolUse
|
|
17
|
+
# MATCHER: "Agent"
|
|
18
|
+
#
|
|
19
|
+
# WHY THIS MATTERS:
|
|
20
|
+
# Issue #61315 (mitselek, 2026-05-21) reported a background sub-agent
|
|
21
|
+
# silently stalling on an MCP permission gate. The sub-agent process
|
|
22
|
+
# stays alive, recognizes the permission gate, but emits no
|
|
23
|
+
# notification, no log line, no error. The parent CLI receives no
|
|
24
|
+
# permission prompt. The PO has no surface to approve. Two observed
|
|
25
|
+
# stalls: 28 min (Session 10, never recovered, sub-agent dropped)
|
|
26
|
+
# and 58 min (Session 11, recovered only when an unrelated PO action
|
|
27
|
+
# surfaced a different pending permission, which unblocked the
|
|
28
|
+
# sub-agent).
|
|
29
|
+
#
|
|
30
|
+
# Root cause: the parent's allowlist (project-scoped
|
|
31
|
+
# .claude/settings.local.json or user-scoped ~/.claude/settings.json
|
|
32
|
+
# permissions.allow) does not propagate to sub-agents dispatched
|
|
33
|
+
# via the Agent tool with run_in_background=true. The structural
|
|
34
|
+
# parent is recognition-without-arrest (#60226): the permission
|
|
35
|
+
# gate fires inside the sub-agent (recognition), but the parent's
|
|
36
|
+
# expectation of progress is not arrested (no UI surface, no idle
|
|
37
|
+
# signal). The cluster: #61315, #32402 (Write tool variant), #38859
|
|
38
|
+
# (Bash + bypassPermissions variant), #47339 (enhancement request),
|
|
39
|
+
# #51288 (root-cause umbrella), #56686 (Read path variant).
|
|
40
|
+
#
|
|
41
|
+
# This hook moves the failure mode from silent stall to loud
|
|
42
|
+
# refusal (or warning) at the dispatch boundary. Sibling of
|
|
43
|
+
# dispatch-receipt.sh (#61167 phantom-agent prevention) and
|
|
44
|
+
# post-edit-disk-verify.sh (#61303 silent persist failure).
|
|
45
|
+
#
|
|
46
|
+
# WHAT IT CHECKS:
|
|
47
|
+
# 1. tool_input is an Agent dispatch with subagent_type and prompt
|
|
48
|
+
# 2. tool_input contains run_in_background=true (heuristic check;
|
|
49
|
+
# foreground dispatches are not vulnerable to the silent-stall
|
|
50
|
+
# shape because the user sees the parent CLI directly)
|
|
51
|
+
# 3. The prompt references at least one MCP tool (regex: mcp__*)
|
|
52
|
+
# 4. The parent's allowlist (project + user settings) covers each
|
|
53
|
+
# referenced MCP tool
|
|
54
|
+
#
|
|
55
|
+
# DECISION:
|
|
56
|
+
# - If no MCP tools referenced: exit 0 (no risk).
|
|
57
|
+
# - If MCP tools referenced AND not in parent's allowlist: warn
|
|
58
|
+
# loudly to stderr (the dispatch would stall on the permission
|
|
59
|
+
# gate even at the parent scope; in strict mode, refuse).
|
|
60
|
+
# - If MCP tools referenced AND in parent's allowlist: warn that
|
|
61
|
+
# the parent's allowlist does NOT propagate to the sub-agent
|
|
62
|
+
# (the known #61315 inheritance bug shape), and document the
|
|
63
|
+
# mitigation paths.
|
|
64
|
+
#
|
|
65
|
+
# OUTPUT:
|
|
66
|
+
# Receipt JSONL at ${CC_DISPATCH_RECEIPT_DIR:-~/.claude/receipts}/
|
|
67
|
+
# dispatch-preflight-YYYY-MM-DD.jsonl with:
|
|
68
|
+
# ts, subagent_type, prompt_hash, prompt_length,
|
|
69
|
+
# mcp_tools_referenced, parent_allowlist_coverage, decision
|
|
70
|
+
#
|
|
71
|
+
# CONFIGURATION:
|
|
72
|
+
# CC_DISPATCH_PREFLIGHT_MODE — one of:
|
|
73
|
+
# "warn" (default): exit 0, warn to stderr
|
|
74
|
+
# "refuse": exit 2 when MCP tools referenced (loud refusal)
|
|
75
|
+
# "off": exit 0, no warnings, only writes receipt
|
|
76
|
+
#
|
|
77
|
+
# CC_DISPATCH_RECEIPT_DIR — override the receipt directory
|
|
78
|
+
# (default: ~/.claude/receipts)
|
|
79
|
+
#
|
|
80
|
+
# CC_PROJECT_SETTINGS_PATH — override the project-scoped settings
|
|
81
|
+
# path (default: ${CLAUDE_PROJECT_DIR:-${PWD}}/.claude/
|
|
82
|
+
# settings.local.json)
|
|
83
|
+
#
|
|
84
|
+
# CC_USER_SETTINGS_PATH — override the user-scoped settings path
|
|
85
|
+
# (default: ${HOME}/.claude/settings.json)
|
|
86
|
+
#
|
|
87
|
+
# AUDIT QUERY:
|
|
88
|
+
# To find all dispatches that hit the inheritance-bug shape over
|
|
89
|
+
# the last 7 days:
|
|
90
|
+
# find ~/.claude/receipts -name 'dispatch-preflight-*.jsonl' \
|
|
91
|
+
# -mtime -7 -exec cat {} \; | \
|
|
92
|
+
# jq -c 'select(.mcp_tools_referenced | length > 0)'
|
|
93
|
+
#
|
|
94
|
+
# To correlate stalled sub-agents with their dispatch receipts,
|
|
95
|
+
# join on (ts, subagent_type, prompt_hash) against session
|
|
96
|
+
# transcripts.
|
|
97
|
+
#
|
|
98
|
+
# RELATED:
|
|
99
|
+
# https://github.com/anthropics/claude-code/issues/61315
|
|
100
|
+
# https://github.com/anthropics/claude-code/issues/32402
|
|
101
|
+
# https://github.com/anthropics/claude-code/issues/38859
|
|
102
|
+
# https://github.com/anthropics/claude-code/issues/47339
|
|
103
|
+
# https://github.com/anthropics/claude-code/issues/51288
|
|
104
|
+
# https://github.com/anthropics/claude-code/issues/56686
|
|
105
|
+
# https://github.com/anthropics/claude-code/issues/60226
|
|
106
|
+
# https://gist.github.com/yurukusa/8c0d19d59730868672270e7312492d1d
|
|
107
|
+
# (Receipt-Persistence Layer architecture)
|
|
108
|
+
# ================================================================
|
|
109
|
+
|
|
110
|
+
set -u
|
|
111
|
+
|
|
112
|
+
# Without jq, the parse below silently yields empty and this hook stops
|
|
113
|
+
# guarding - with no error anywhere. Say so. We deliberately do not exit
|
|
114
|
+
# here: blocking would halt every tool call, and exiting 0 would change
|
|
115
|
+
# the behaviour of guards that do not depend on the parsed value.
|
|
116
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
117
|
+
_nojq_warned="/tmp/cc-nojq-warned-dispatch-allowlist-preflight-$PPID"
|
|
118
|
+
[ -f "$_nojq_warned" ] || {
|
|
119
|
+
echo "WARNING [dispatch-allowlist-preflight]: jq not found - this hook cannot inspect tool calls and is NOT protecting you. Install jq." >&2
|
|
120
|
+
: > "$_nojq_warned"
|
|
121
|
+
}
|
|
122
|
+
fi
|
|
123
|
+
|
|
124
|
+
INPUT=$(cat)
|
|
125
|
+
|
|
126
|
+
# Parse dispatch payload. Tolerate missing fields — a Task call with
|
|
127
|
+
# no subagent_type or no prompt is malformed upstream; refusing here
|
|
128
|
+
# would create false-positive friction without audit value.
|
|
129
|
+
SUBAGENT_TYPE=$(printf '%s' "$INPUT" | jq -r '.tool_input.subagent_type // empty' 2>/dev/null)
|
|
130
|
+
PROMPT=$(printf '%s' "$INPUT" | jq -r '.tool_input.prompt // empty' 2>/dev/null)
|
|
131
|
+
RUN_BG=$(printf '%s' "$INPUT" | jq -r '.tool_input.run_in_background // false' 2>/dev/null)
|
|
132
|
+
TOOL_NAME=$(printf '%s' "$INPUT" | jq -r '.tool_name // empty' 2>/dev/null)
|
|
133
|
+
|
|
134
|
+
if [ -z "$SUBAGENT_TYPE" ] && [ -z "$PROMPT" ]; then
|
|
135
|
+
exit 0
|
|
136
|
+
fi
|
|
137
|
+
|
|
138
|
+
# Default subagent_type when omitted (Claude Code uses general-purpose).
|
|
139
|
+
[ -z "$SUBAGENT_TYPE" ] && SUBAGENT_TYPE="general-purpose"
|
|
140
|
+
|
|
141
|
+
MODE="${CC_DISPATCH_PREFLIGHT_MODE:-warn}"
|
|
142
|
+
|
|
143
|
+
# Extract MCP tool references from the prompt.
|
|
144
|
+
# Pattern: mcp__<server>__<tool> — server and tool both alphanumeric/_/-
|
|
145
|
+
# Use grep with -oE; the regex is conservative to avoid false matches
|
|
146
|
+
# against code snippets that contain mcp__ in non-tool contexts.
|
|
147
|
+
MCP_REFS=$(printf '%s' "$PROMPT" | grep -oE 'mcp__[a-zA-Z0-9_-]+(__[a-zA-Z0-9_-]+)?' 2>/dev/null | sort -u)
|
|
148
|
+
if [ -n "$MCP_REFS" ]; then
|
|
149
|
+
MCP_REF_COUNT=$(printf '%s\n' "$MCP_REFS" | grep -c '.')
|
|
150
|
+
else
|
|
151
|
+
MCP_REF_COUNT=0
|
|
152
|
+
fi
|
|
153
|
+
|
|
154
|
+
# Compute prompt hash and length (PHI-safe: never store the prompt).
|
|
155
|
+
PROMPT_LEN=$(printf '%s' "$PROMPT" | wc -c | tr -d ' ')
|
|
156
|
+
PROMPT_HASH=$(printf '%s' "$PROMPT" | sha256sum 2>/dev/null | awk '{print $1}')
|
|
157
|
+
[ -z "$PROMPT_HASH" ] && PROMPT_HASH="$(printf '%s' "$PROMPT" | shasum -a 256 2>/dev/null | awk '{print $1}')"
|
|
158
|
+
|
|
159
|
+
# Schema v2 — read the operator's verbatim UserPromptSubmit text from the
|
|
160
|
+
# companion log written by examples/userprompt-submit-receipt.sh, if any.
|
|
161
|
+
# This lets the receipt corpus answer MAST 2.6 (Action-Reasoning Mismatch)
|
|
162
|
+
# operationally — the executed argv vs the operator's articulated scope
|
|
163
|
+
# at the prompt boundary — distinct from the LLM-judge labelled definition
|
|
164
|
+
# of reasoning-vs-action mismatch. The architecture rationale is at:
|
|
165
|
+
# https://github.com/anthropics/claude-code/issues/61102#issuecomment-4514215413
|
|
166
|
+
# When the companion log is absent, the fields are written as null so the
|
|
167
|
+
# corpus stays joinable on the rest of the schema.
|
|
168
|
+
ARTICULATED_HASH_JSON="null"
|
|
169
|
+
ARTICULATED_LEN_JSON="null"
|
|
170
|
+
COMPANION_LOG="${CC_DISPATCH_RECEIPT_DIR:-${HOME}/.claude/receipts}/userprompt-submit-$(date +%Y-%m-%d).jsonl"
|
|
171
|
+
if [ -f "$COMPANION_LOG" ]; then
|
|
172
|
+
# The companion writes one JSONL entry per UserPromptSubmit event.
|
|
173
|
+
# The most recent entry within the current session is the closest
|
|
174
|
+
# articulated scope for this dispatch.
|
|
175
|
+
LAST_USERPROMPT=$(tail -1 "$COMPANION_LOG" 2>/dev/null)
|
|
176
|
+
if [ -n "$LAST_USERPROMPT" ]; then
|
|
177
|
+
ART_HASH=$(printf '%s' "$LAST_USERPROMPT" | jq -r '.prompt_hash // empty' 2>/dev/null)
|
|
178
|
+
ART_LEN=$(printf '%s' "$LAST_USERPROMPT" | jq -r '.prompt_length // empty' 2>/dev/null)
|
|
179
|
+
[ -n "$ART_HASH" ] && ARTICULATED_HASH_JSON="\"$ART_HASH\""
|
|
180
|
+
[ -n "$ART_LEN" ] && ARTICULATED_LEN_JSON="$ART_LEN"
|
|
181
|
+
fi
|
|
182
|
+
fi
|
|
183
|
+
|
|
184
|
+
TS=$(date -u +%Y-%m-%dT%H:%M:%SZ)
|
|
185
|
+
TYPE_JSON=$(printf '%s' "$SUBAGENT_TYPE" | jq -Rs -c .)
|
|
186
|
+
|
|
187
|
+
# Read parent's allowlist (project + user scopes).
|
|
188
|
+
PROJ_SETTINGS="${CC_PROJECT_SETTINGS_PATH:-${CLAUDE_PROJECT_DIR:-${PWD}}/.claude/settings.local.json}"
|
|
189
|
+
USER_SETTINGS="${CC_USER_SETTINGS_PATH:-${HOME}/.claude/settings.json}"
|
|
190
|
+
|
|
191
|
+
read_allowlist() {
|
|
192
|
+
local file="$1"
|
|
193
|
+
[ -f "$file" ] || return
|
|
194
|
+
jq -r '.permissions.allow[]?' "$file" 2>/dev/null
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
PARENT_ALLOW=$( { read_allowlist "$PROJ_SETTINGS"; read_allowlist "$USER_SETTINGS"; } | sort -u)
|
|
198
|
+
|
|
199
|
+
# Build per-tool coverage report.
|
|
200
|
+
COVERAGE_JSON="[]"
|
|
201
|
+
DECISION="execute"
|
|
202
|
+
UNCOVERED_REFS=""
|
|
203
|
+
COVERED_REFS=""
|
|
204
|
+
|
|
205
|
+
if [ "$MCP_REF_COUNT" -gt 0 ] && [ -n "$MCP_REFS" ]; then
|
|
206
|
+
# Build coverage JSON: array of {tool, covered: bool}
|
|
207
|
+
COVERAGE_PARTS=""
|
|
208
|
+
while IFS= read -r ref; do
|
|
209
|
+
[ -z "$ref" ] && continue
|
|
210
|
+
# An allowlist entry matches if it equals the ref, OR if it's
|
|
211
|
+
# a prefix glob (rare in MCP context).
|
|
212
|
+
if printf '%s\n' "$PARENT_ALLOW" | grep -Fxq "$ref" 2>/dev/null; then
|
|
213
|
+
COVERED="true"
|
|
214
|
+
COVERED_REFS="${COVERED_REFS}${ref}\n"
|
|
215
|
+
else
|
|
216
|
+
COVERED="false"
|
|
217
|
+
UNCOVERED_REFS="${UNCOVERED_REFS}${ref}\n"
|
|
218
|
+
fi
|
|
219
|
+
REF_JSON=$(printf '%s' "$ref" | jq -Rs -c .)
|
|
220
|
+
COVERAGE_PARTS="${COVERAGE_PARTS}{\"tool\":${REF_JSON},\"parent_covered\":${COVERED}},"
|
|
221
|
+
done <<EOF
|
|
222
|
+
$MCP_REFS
|
|
223
|
+
EOF
|
|
224
|
+
COVERAGE_PARTS=$(printf '%s' "$COVERAGE_PARTS" | sed 's/,$//')
|
|
225
|
+
COVERAGE_JSON="[${COVERAGE_PARTS}]"
|
|
226
|
+
fi
|
|
227
|
+
|
|
228
|
+
# Build MCP refs JSON array.
|
|
229
|
+
if [ "$MCP_REF_COUNT" -gt 0 ]; then
|
|
230
|
+
REFS_JSON=$(printf '%s' "$MCP_REFS" | jq -Rs -c 'split("\n") | map(select(length > 0))')
|
|
231
|
+
else
|
|
232
|
+
REFS_JSON="[]"
|
|
233
|
+
fi
|
|
234
|
+
|
|
235
|
+
# Decision logic.
|
|
236
|
+
# - off: no decision noise (still writes receipt)
|
|
237
|
+
# - warn (default): warn but exit 0
|
|
238
|
+
# - refuse: exit 2 when MCP refs found
|
|
239
|
+
if [ "$MCP_REF_COUNT" -gt 0 ] && [ "$RUN_BG" = "true" ] && [ "$MODE" = "refuse" ]; then
|
|
240
|
+
DECISION="refuse"
|
|
241
|
+
fi
|
|
242
|
+
|
|
243
|
+
# Write receipt.
|
|
244
|
+
RECEIPT_DIR="${CC_DISPATCH_RECEIPT_DIR:-${HOME}/.claude/receipts}"
|
|
245
|
+
mkdir -p "$RECEIPT_DIR" 2>/dev/null
|
|
246
|
+
RECEIPT_FILE="${RECEIPT_DIR}/dispatch-preflight-$(date +%Y-%m-%d).jsonl"
|
|
247
|
+
|
|
248
|
+
printf '{"ts":"%s","subagent_type":%s,"run_in_background":%s,"prompt_hash":"%s","prompt_length":%s,"articulated_scope_hash":%s,"articulated_scope_length":%s,"mcp_tools_referenced":%s,"coverage":%s,"decision":"%s","schema_version":2}\n' \
|
|
249
|
+
"$TS" "$TYPE_JSON" "$RUN_BG" "$PROMPT_HASH" "$PROMPT_LEN" "$ARTICULATED_HASH_JSON" "$ARTICULATED_LEN_JSON" "$REFS_JSON" "$COVERAGE_JSON" "$DECISION" \
|
|
250
|
+
>> "$RECEIPT_FILE" 2>/dev/null
|
|
251
|
+
|
|
252
|
+
# Emit warnings / refusal output.
|
|
253
|
+
if [ "$MCP_REF_COUNT" -gt 0 ] && [ "$RUN_BG" = "true" ] && [ "$MODE" != "off" ]; then
|
|
254
|
+
if [ "$DECISION" = "refuse" ]; then
|
|
255
|
+
SEVERITY="BLOCKED"
|
|
256
|
+
else
|
|
257
|
+
SEVERITY="WARNING"
|
|
258
|
+
fi
|
|
259
|
+
{
|
|
260
|
+
printf '%s: dispatch-allowlist-preflight — background sub-agent dispatch references MCP tool(s).\n' "$SEVERITY"
|
|
261
|
+
printf '\n'
|
|
262
|
+
printf 'Sub-agent: %s (run_in_background=true)\n' "$SUBAGENT_TYPE"
|
|
263
|
+
printf 'MCP tool(s) referenced in prompt:\n'
|
|
264
|
+
printf '%s\n' "$MCP_REFS" | sed 's/^/ - /'
|
|
265
|
+
printf '\n'
|
|
266
|
+
if [ -n "$COVERED_REFS" ]; then
|
|
267
|
+
printf 'In parent allowlist (will NOT propagate to sub-agent — issue #61315):\n'
|
|
268
|
+
printf '%b' "$COVERED_REFS" | sed 's/^/ - /' | grep -v '^ - $' || true
|
|
269
|
+
printf '\n'
|
|
270
|
+
fi
|
|
271
|
+
if [ -n "$UNCOVERED_REFS" ]; then
|
|
272
|
+
printf 'NOT in parent allowlist (sub-agent will hit silent permission gate):\n'
|
|
273
|
+
printf '%b' "$UNCOVERED_REFS" | sed 's/^/ - /' | grep -v '^ - $' || true
|
|
274
|
+
printf '\n'
|
|
275
|
+
fi
|
|
276
|
+
printf 'Receipt: %s\n' "$RECEIPT_FILE"
|
|
277
|
+
printf '\n'
|
|
278
|
+
printf 'Why this matters: a background sub-agent that hits a permission gate stalls\n'
|
|
279
|
+
printf ' silently — no UI surface in the parent CLI, no idle notification, no log line.\n'
|
|
280
|
+
printf ' Observed stalls: 28 min (#61315 Session 10, dropped) and 58 min (Session 11).\n'
|
|
281
|
+
printf '\n'
|
|
282
|
+
printf 'Mitigations (in order of preference):\n'
|
|
283
|
+
printf ' 1. Inline the MCP tool result into the parent and pass the result via prompt,\n'
|
|
284
|
+
printf ' instead of dispatching a sub-agent that needs the MCP tool itself.\n'
|
|
285
|
+
printf ' 2. If the sub-agent must invoke the tool, dispatch it foreground (no\n'
|
|
286
|
+
printf ' run_in_background=true) so the permission prompt surfaces in the parent CLI.\n'
|
|
287
|
+
printf ' 3. Establish a heartbeat contract: instruct the sub-agent to send a SendMessage\n'
|
|
288
|
+
printf ' ping within 60s of dispatch and every 5 min thereafter. The absence of a\n'
|
|
289
|
+
printf ' ping past the deadline is an observable stall signal.\n'
|
|
290
|
+
printf '\n'
|
|
291
|
+
printf 'Set CC_DISPATCH_PREFLIGHT_MODE=off to silence this warning (receipt is still written).\n'
|
|
292
|
+
printf 'Set CC_DISPATCH_PREFLIGHT_MODE=refuse to block dispatches that match this shape.\n'
|
|
293
|
+
printf 'Reference: https://github.com/anthropics/claude-code/issues/61315\n'
|
|
294
|
+
} >&2
|
|
295
|
+
fi
|
|
296
|
+
|
|
297
|
+
if [ "$DECISION" = "refuse" ]; then
|
|
298
|
+
exit 2
|
|
299
|
+
fi
|
|
300
|
+
|
|
301
|
+
exit 0
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# dispatch-liveness-watchdog.sh — Surface in-flight sub-agent dispatches that
|
|
3
|
+
# have been running longer than a configurable threshold, so operators see
|
|
4
|
+
# the hang before they have to kill the session at the OS level.
|
|
5
|
+
#
|
|
6
|
+
# Solves: #61405 ("Subagent delegation lacks timeout, monitoring, and abort
|
|
7
|
+
# controls — caused 12+ hour session hang"). The harness has no built-in
|
|
8
|
+
# timeout primitive for Agent-tool dispatches; this hook is the operator-
|
|
9
|
+
# side proxy that surfaces the hang at the next UserPromptSubmit so the
|
|
10
|
+
# operator has a visible signal rather than having to notice that nothing
|
|
11
|
+
# is happening.
|
|
12
|
+
#
|
|
13
|
+
# This is *symptom surfacing*, not root cause fixing. The full repair (a
|
|
14
|
+
# real timeout / abort primitive in the harness) has to land at the Agent-
|
|
15
|
+
# tool layer. The hook just makes the symptom observable at a point the
|
|
16
|
+
# operator already looks (the next prompt they type).
|
|
17
|
+
#
|
|
18
|
+
# Architecture:
|
|
19
|
+
# * PreToolUse + matcher "Agent": writes a per-dispatch state file under
|
|
20
|
+
# ~/.claude/state/dispatch-watchdog/<session>/<unix-timestamp>-<rand>.
|
|
21
|
+
# * PostToolUse + matcher "Agent": removes the OLDEST state file in the
|
|
22
|
+
# session's directory (FIFO assumption — dispatches that complete in
|
|
23
|
+
# order have their state files retired in order; out-of-order completion
|
|
24
|
+
# simply causes the wrong file to be retired but the in-flight count
|
|
25
|
+
# stays accurate, which is what the advisory cares about).
|
|
26
|
+
# * UserPromptSubmit: lists state files older than the threshold and
|
|
27
|
+
# emits an advisory naming each (with elapsed wall-clock) so the
|
|
28
|
+
# operator sees the hang.
|
|
29
|
+
#
|
|
30
|
+
# Companion to:
|
|
31
|
+
# * #61102's PR #281 scope-expansion-receipt.sh (sub-pattern 4 defense)
|
|
32
|
+
# * #61315's PR #286 dispatch-allowlist-preflight.sh (sub-pattern 2 prevention)
|
|
33
|
+
# * #61107's PR #275 route-handler-body-emptiness-gate.sh (sub-pattern 1 defense)
|
|
34
|
+
#
|
|
35
|
+
# This hook addresses sub-pattern 3 (absence of observation and control) in
|
|
36
|
+
# the four-sub-pattern decomposition documented at
|
|
37
|
+
# https://gist.github.com/yurukusa/9857a9ed407696ba8483b354917ff161
|
|
38
|
+
#
|
|
39
|
+
# TRIGGER: PreToolUse, PostToolUse, UserPromptSubmit
|
|
40
|
+
# MATCHER (for the two ToolUse events): "Agent"
|
|
41
|
+
#
|
|
42
|
+
# CONFIGURATION (environment variables):
|
|
43
|
+
# CC_DISPATCH_WATCHDOG_THRESHOLD_SEC default 1800 (30 minutes)
|
|
44
|
+
# CC_DISPATCH_WATCHDOG_STATE_DIR default ~/.claude/state/dispatch-watchdog
|
|
45
|
+
# CC_DISPATCH_WATCHDOG_DISABLE "1" → skip entirely
|
|
46
|
+
# CC_DISPATCH_WATCHDOG_MODE "strict" → exit 2 when stale
|
|
47
|
+
# dispatches are present (default:
|
|
48
|
+
# advisory / exit 0)
|
|
49
|
+
#
|
|
50
|
+
# USAGE (settings.json — three registrations of the same hook):
|
|
51
|
+
# {
|
|
52
|
+
# "hooks": {
|
|
53
|
+
# "PreToolUse": [{
|
|
54
|
+
# "matcher": "Agent",
|
|
55
|
+
# "hooks": [{ "type": "command", "command": "~/.claude/hooks/dispatch-liveness-watchdog.sh" }]
|
|
56
|
+
# }],
|
|
57
|
+
# "PostToolUse": [{
|
|
58
|
+
# "matcher": "Agent",
|
|
59
|
+
# "hooks": [{ "type": "command", "command": "~/.claude/hooks/dispatch-liveness-watchdog.sh" }]
|
|
60
|
+
# }],
|
|
61
|
+
# "UserPromptSubmit": [{
|
|
62
|
+
# "matcher": "",
|
|
63
|
+
# "hooks": [{ "type": "command", "command": "~/.claude/hooks/dispatch-liveness-watchdog.sh" }]
|
|
64
|
+
# }]
|
|
65
|
+
# }
|
|
66
|
+
# }
|
|
67
|
+
|
|
68
|
+
set -uo pipefail
|
|
69
|
+
|
|
70
|
+
# Read stdin first so the upstream writer never sees EPIPE/141, even when the
|
|
71
|
+
# watchdog is disabled.
|
|
72
|
+
# Without jq, the parse below silently yields empty and this hook stops
|
|
73
|
+
# guarding - with no error anywhere. Say so. We deliberately do not exit
|
|
74
|
+
# here: blocking would halt every tool call, and exiting 0 would change
|
|
75
|
+
# the behaviour of guards that do not depend on the parsed value.
|
|
76
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
77
|
+
_nojq_warned="/tmp/cc-nojq-warned-dispatch-liveness-watchdog-$PPID"
|
|
78
|
+
[ -f "$_nojq_warned" ] || {
|
|
79
|
+
echo "WARNING [dispatch-liveness-watchdog]: jq not found - this hook cannot inspect tool calls and is NOT protecting you. Install jq." >&2
|
|
80
|
+
: > "$_nojq_warned"
|
|
81
|
+
}
|
|
82
|
+
fi
|
|
83
|
+
|
|
84
|
+
INPUT=$(cat 2>/dev/null || true)
|
|
85
|
+
|
|
86
|
+
[ "${CC_DISPATCH_WATCHDOG_DISABLE:-0}" = "1" ] && exit 0
|
|
87
|
+
[ -z "$INPUT" ] && exit 0
|
|
88
|
+
|
|
89
|
+
# Identify which event we are servicing. Claude Code's hook input includes
|
|
90
|
+
# hook_event_name in newer versions; we infer when it's not present.
|
|
91
|
+
EVENT=$(printf '%s' "$INPUT" | jq -r '.hook_event_name // empty' 2>/dev/null)
|
|
92
|
+
TOOL_NAME=$(printf '%s' "$INPUT" | jq -r '.tool_name // empty' 2>/dev/null)
|
|
93
|
+
HAS_TOOL_RESPONSE=$(printf '%s' "$INPUT" | jq -r 'has("tool_response")' 2>/dev/null)
|
|
94
|
+
HAS_TOOL_INPUT=$(printf '%s' "$INPUT" | jq -r 'has("tool_input")' 2>/dev/null)
|
|
95
|
+
HAS_PROMPT=$(printf '%s' "$INPUT" | jq -r 'has("prompt") or has("user_prompt") or has("submitted_prompt")' 2>/dev/null)
|
|
96
|
+
|
|
97
|
+
if [ -z "$EVENT" ]; then
|
|
98
|
+
if [ "$HAS_TOOL_RESPONSE" = "true" ]; then
|
|
99
|
+
EVENT="PostToolUse"
|
|
100
|
+
elif [ "$HAS_TOOL_INPUT" = "true" ]; then
|
|
101
|
+
EVENT="PreToolUse"
|
|
102
|
+
elif [ "$HAS_PROMPT" = "true" ]; then
|
|
103
|
+
EVENT="UserPromptSubmit"
|
|
104
|
+
else
|
|
105
|
+
exit 0
|
|
106
|
+
fi
|
|
107
|
+
fi
|
|
108
|
+
|
|
109
|
+
SESSION_ID=$(printf '%s' "$INPUT" | jq -r '.session_id // .session // "default"' 2>/dev/null)
|
|
110
|
+
[ -z "$SESSION_ID" ] && SESSION_ID="default"
|
|
111
|
+
# Sanitize session id for filesystem use (alnum + dash + underscore only).
|
|
112
|
+
SESSION_ID=$(printf '%s' "$SESSION_ID" | tr -c 'A-Za-z0-9_-' '_' | head -c 64)
|
|
113
|
+
|
|
114
|
+
STATE_ROOT="${CC_DISPATCH_WATCHDOG_STATE_DIR:-$HOME/.claude/state/dispatch-watchdog}"
|
|
115
|
+
SESSION_DIR="$STATE_ROOT/$SESSION_ID"
|
|
116
|
+
THRESHOLD="${CC_DISPATCH_WATCHDOG_THRESHOLD_SEC:-1800}"
|
|
117
|
+
|
|
118
|
+
mkdir -p "$SESSION_DIR" 2>/dev/null || exit 0
|
|
119
|
+
|
|
120
|
+
case "$EVENT" in
|
|
121
|
+
PreToolUse)
|
|
122
|
+
# Only track Agent dispatches.
|
|
123
|
+
if [ "$TOOL_NAME" != "Agent" ]; then
|
|
124
|
+
exit 0
|
|
125
|
+
fi
|
|
126
|
+
TS=$(date +%s)
|
|
127
|
+
# 6-byte random to disambiguate concurrent dispatches at the same second.
|
|
128
|
+
RAND=$(od -An -N6 -tx1 /dev/urandom 2>/dev/null | tr -d ' \n' || echo "0000")
|
|
129
|
+
STATE_FILE="$SESSION_DIR/${TS}-${RAND}"
|
|
130
|
+
# Capture a short summary of the dispatch for the advisory.
|
|
131
|
+
SUMMARY=$(printf '%s' "$INPUT" | jq -r '
|
|
132
|
+
(.tool_input.subagent_type // "")
|
|
133
|
+
+ " | "
|
|
134
|
+
+ ((.tool_input.description // .tool_input.prompt // "")[0:120] | gsub("\n"; " "))
|
|
135
|
+
' 2>/dev/null)
|
|
136
|
+
printf '%s\n' "${SUMMARY:-(no summary)}" > "$STATE_FILE" 2>/dev/null
|
|
137
|
+
exit 0
|
|
138
|
+
;;
|
|
139
|
+
PostToolUse)
|
|
140
|
+
if [ "$TOOL_NAME" != "Agent" ]; then
|
|
141
|
+
exit 0
|
|
142
|
+
fi
|
|
143
|
+
# Remove the oldest state file for this session. FIFO assumption;
|
|
144
|
+
# see header comment.
|
|
145
|
+
OLDEST=$(ls -1tr "$SESSION_DIR" 2>/dev/null | head -1)
|
|
146
|
+
if [ -n "$OLDEST" ]; then
|
|
147
|
+
rm -f "$SESSION_DIR/$OLDEST" 2>/dev/null
|
|
148
|
+
fi
|
|
149
|
+
exit 0
|
|
150
|
+
;;
|
|
151
|
+
UserPromptSubmit)
|
|
152
|
+
NOW=$(date +%s)
|
|
153
|
+
STALE_COUNT=0
|
|
154
|
+
# Build a list of stale dispatches.
|
|
155
|
+
STALE_LINES=""
|
|
156
|
+
if [ -d "$SESSION_DIR" ]; then
|
|
157
|
+
for f in "$SESSION_DIR"/*; do
|
|
158
|
+
[ -f "$f" ] || continue
|
|
159
|
+
BASENAME=$(basename "$f")
|
|
160
|
+
START_TS=${BASENAME%%-*}
|
|
161
|
+
# Skip if filename is not parseable as a timestamp.
|
|
162
|
+
case "$START_TS" in
|
|
163
|
+
''|*[!0-9]*) continue ;;
|
|
164
|
+
esac
|
|
165
|
+
ELAPSED=$((NOW - START_TS))
|
|
166
|
+
if [ "$ELAPSED" -ge "$THRESHOLD" ]; then
|
|
167
|
+
STALE_COUNT=$((STALE_COUNT + 1))
|
|
168
|
+
SUMMARY=$(head -c 200 "$f" 2>/dev/null | head -1)
|
|
169
|
+
HUMAN_ELAPSED=$(printf '%dm %ds' $((ELAPSED / 60)) $((ELAPSED % 60)))
|
|
170
|
+
STALE_LINES="${STALE_LINES} - started ${HUMAN_ELAPSED} ago: ${SUMMARY:-(no summary)}"$'\n'
|
|
171
|
+
fi
|
|
172
|
+
done
|
|
173
|
+
fi
|
|
174
|
+
|
|
175
|
+
if [ "$STALE_COUNT" -eq 0 ]; then
|
|
176
|
+
exit 0
|
|
177
|
+
fi
|
|
178
|
+
|
|
179
|
+
HUMAN_THRESHOLD=$(printf '%dm' $((THRESHOLD / 60)))
|
|
180
|
+
{
|
|
181
|
+
echo "<system-reminder>"
|
|
182
|
+
echo "STALE SUB-AGENT DISPATCH(ES) — ${STALE_COUNT} Agent-tool dispatch(es)"
|
|
183
|
+
echo "have been running longer than the watchdog threshold (${HUMAN_THRESHOLD})"
|
|
184
|
+
echo "without a corresponding PostToolUse signal:"
|
|
185
|
+
echo ""
|
|
186
|
+
printf '%s' "$STALE_LINES"
|
|
187
|
+
echo ""
|
|
188
|
+
echo "Sub-agent dispatches in Claude Code have no built-in timeout, monitoring,"
|
|
189
|
+
echo "or abort affordance (anthropics/claude-code#61405). The harness will wait"
|
|
190
|
+
echo "indefinitely for the dispatch to return; a hung dispatch will block the"
|
|
191
|
+
echo "session until the operator force-kills it at the OS level."
|
|
192
|
+
echo ""
|
|
193
|
+
echo "Operator-side options:"
|
|
194
|
+
echo " 1. Wait, if the dispatch is plausibly still progressing."
|
|
195
|
+
echo " 2. Identify the OS-level process (\`ps\` / Task Manager) and SIGKILL it."
|
|
196
|
+
echo " Note: this will lose in-flight state in the parent session too."
|
|
197
|
+
echo " 3. Adjust CC_DISPATCH_WATCHDOG_THRESHOLD_SEC if your normal dispatches"
|
|
198
|
+
echo " legitimately run longer than ${HUMAN_THRESHOLD}."
|
|
199
|
+
echo ""
|
|
200
|
+
echo "To clear the watchdog state (after force-killing a hung dispatch):"
|
|
201
|
+
echo " rm -f ${SESSION_DIR}/*"
|
|
202
|
+
echo ""
|
|
203
|
+
echo "To disable this watchdog entirely, set"
|
|
204
|
+
echo "CC_DISPATCH_WATCHDOG_DISABLE=1 in your environment."
|
|
205
|
+
echo "</system-reminder>"
|
|
206
|
+
} >&2
|
|
207
|
+
|
|
208
|
+
if [ "${CC_DISPATCH_WATCHDOG_MODE:-advisory}" = "strict" ]; then
|
|
209
|
+
exit 2
|
|
210
|
+
fi
|
|
211
|
+
exit 0
|
|
212
|
+
;;
|
|
213
|
+
*)
|
|
214
|
+
exit 0
|
|
215
|
+
;;
|
|
216
|
+
esac
|