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,467 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# claim-verify-audit.sh — Diagnostic one-shot audit for Claude Code claim/reality divergence patterns
|
|
3
|
+
#
|
|
4
|
+
# What this does: read-only scan of your Claude Code configuration and reports
|
|
5
|
+
# known risk patterns observed in May 2026 GitHub issues. Reports severity,
|
|
6
|
+
# evidence, and the issue number + book chapter where the structural pattern
|
|
7
|
+
# and prevention defense are documented.
|
|
8
|
+
#
|
|
9
|
+
# What this does NOT do: modify any file, run any tool call, send any network
|
|
10
|
+
# request, or read any file outside ~/.claude/, ~/.cache/claude-cli-nodejs/,
|
|
11
|
+
# %AppData%/Claude/ (Windows), or the directory you run it from. All checks
|
|
12
|
+
# are local and read-only.
|
|
13
|
+
#
|
|
14
|
+
# Safety: bash strict mode, no eval of config content, all reads use grep/jq.
|
|
15
|
+
# License: MIT. Author: yurukusa (@yurukusa_dev).
|
|
16
|
+
#
|
|
17
|
+
# Companion to:
|
|
18
|
+
# - cc-safe-setup (MIT, 911 example hooks as of 2026-08-12)
|
|
19
|
+
# https://github.com/yurukusa/cc-safe-setup
|
|
20
|
+
#
|
|
21
|
+
# Usage: bash claim-verify-audit.sh
|
|
22
|
+
# Tested: bash 4+, macOS 14+, Ubuntu 22.04+, WSL2.
|
|
23
|
+
|
|
24
|
+
set -uo pipefail
|
|
25
|
+
|
|
26
|
+
# Parse args (single optional flag: --json for machine-readable output)
|
|
27
|
+
JSON_MODE=0
|
|
28
|
+
case "${1:-}" in
|
|
29
|
+
--json) JSON_MODE=1 ;;
|
|
30
|
+
-h|--help)
|
|
31
|
+
cat <<'USAGE'
|
|
32
|
+
claim-verify-audit.sh — Diagnostic for Claude Code claim/reality divergence patterns
|
|
33
|
+
|
|
34
|
+
Usage:
|
|
35
|
+
bash claim-verify-audit.sh # human-readable text output
|
|
36
|
+
bash claim-verify-audit.sh --json # machine-readable JSON (for CI integration)
|
|
37
|
+
|
|
38
|
+
Exit codes:
|
|
39
|
+
0 — no HIGH-severity findings
|
|
40
|
+
1 — one or more HIGH-severity findings
|
|
41
|
+
|
|
42
|
+
Read-only, MIT, no network access, runs in ~1 second.
|
|
43
|
+
USAGE
|
|
44
|
+
exit 0
|
|
45
|
+
;;
|
|
46
|
+
esac
|
|
47
|
+
|
|
48
|
+
# Severity counts
|
|
49
|
+
HIGH=0
|
|
50
|
+
MED=0
|
|
51
|
+
LOW=0
|
|
52
|
+
INFO=0
|
|
53
|
+
|
|
54
|
+
# JSON findings buffer (lines of pre-escaped JSON)
|
|
55
|
+
JSON_FINDINGS=""
|
|
56
|
+
|
|
57
|
+
# Color codes (respect NO_COLOR + JSON mode)
|
|
58
|
+
if (( JSON_MODE )) || [[ -n "${NO_COLOR:-}" ]] || [[ ! -t 1 ]]; then
|
|
59
|
+
R="" Y="" B="" G="" N=""
|
|
60
|
+
else
|
|
61
|
+
R=$'\033[31m' Y=$'\033[33m' B=$'\033[34m' G=$'\033[32m' N=$'\033[0m'
|
|
62
|
+
fi
|
|
63
|
+
|
|
64
|
+
# JSON escape for string values (handles backslash, quote, newline, tab)
|
|
65
|
+
json_escape() {
|
|
66
|
+
local s="$1"
|
|
67
|
+
s="${s//\\/\\\\}"
|
|
68
|
+
s="${s//\"/\\\"}"
|
|
69
|
+
s="${s//$'\n'/\\n}"
|
|
70
|
+
s="${s//$'\t'/\\t}"
|
|
71
|
+
printf '%s' "$s"
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
report() {
|
|
75
|
+
local sev="$1" title="$2" detail="$3" fix="$4"
|
|
76
|
+
case "$sev" in
|
|
77
|
+
HIGH) HIGH=$((HIGH+1)) ;;
|
|
78
|
+
MEDIUM) MED=$((MED+1)) ;;
|
|
79
|
+
LOW) LOW=$((LOW+1)) ;;
|
|
80
|
+
INFO) INFO=$((INFO+1)) ;;
|
|
81
|
+
esac
|
|
82
|
+
if (( JSON_MODE )); then
|
|
83
|
+
# Append JSON object for this finding
|
|
84
|
+
local obj="{\"severity\":\"$sev\",\"title\":\"$(json_escape "$title")\",\"detail\":\"$(json_escape "$detail")\",\"fix\":\"$(json_escape "$fix")\"}"
|
|
85
|
+
if [[ -z "$JSON_FINDINGS" ]]; then
|
|
86
|
+
JSON_FINDINGS="$obj"
|
|
87
|
+
else
|
|
88
|
+
JSON_FINDINGS="$JSON_FINDINGS,$obj"
|
|
89
|
+
fi
|
|
90
|
+
else
|
|
91
|
+
case "$sev" in
|
|
92
|
+
HIGH) echo "${R}[HIGH]${N} $title" ;;
|
|
93
|
+
MEDIUM) echo "${Y}[MEDIUM]${N} $title" ;;
|
|
94
|
+
LOW) echo "${B}[LOW]${N} $title" ;;
|
|
95
|
+
INFO) echo "${G}[INFO]${N} $title" ;;
|
|
96
|
+
esac
|
|
97
|
+
[[ -n "$detail" ]] && echo " $detail"
|
|
98
|
+
[[ -n "$fix" ]] && echo " Fix: $fix"
|
|
99
|
+
echo
|
|
100
|
+
fi
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
section() {
|
|
104
|
+
if (( JSON_MODE )); then
|
|
105
|
+
return # sections are suppressed in JSON mode
|
|
106
|
+
fi
|
|
107
|
+
echo
|
|
108
|
+
echo "=== $1 ==="
|
|
109
|
+
echo
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
# ============================================================
|
|
113
|
+
# Header
|
|
114
|
+
# ============================================================
|
|
115
|
+
if (( JSON_MODE == 0 )); then
|
|
116
|
+
cat <<'HEADER'
|
|
117
|
+
|
|
118
|
+
Claude Code Claim-Verify Audit
|
|
119
|
+
==============================
|
|
120
|
+
Read-only scan for known May 2026 failure-mode patterns.
|
|
121
|
+
Each finding cites the source GitHub issue and the book chapter
|
|
122
|
+
where the structural pattern + prevention defense are documented.
|
|
123
|
+
|
|
124
|
+
HEADER
|
|
125
|
+
fi
|
|
126
|
+
|
|
127
|
+
# ============================================================
|
|
128
|
+
# Platform detection
|
|
129
|
+
# ============================================================
|
|
130
|
+
OS="unknown"
|
|
131
|
+
case "$(uname -s)" in
|
|
132
|
+
Linux*) OS="linux"; [[ -d /mnt/c/Users ]] && OS="wsl" ;;
|
|
133
|
+
Darwin*) OS="macos" ;;
|
|
134
|
+
MINGW*|MSYS*|CYGWIN*) OS="windows" ;;
|
|
135
|
+
esac
|
|
136
|
+
|
|
137
|
+
USERNAME="${USER:-$(whoami 2>/dev/null || echo unknown)}"
|
|
138
|
+
# Under WSL, $USER is the Linux distro account, not the Windows profile that owns
|
|
139
|
+
# the C:\Users\... 8.3 short path issue #58614 actually triggers from. Derive the
|
|
140
|
+
# Windows username from /mnt/c/Users/, skipping system pseudo-accounts (Default,
|
|
141
|
+
# Public, ".NET v4.5", etc.) and accepting only profiles that contain a real
|
|
142
|
+
# AppData subdirectory.
|
|
143
|
+
WIN_USERNAME=""
|
|
144
|
+
if [[ "$(uname -s)" == Linux* ]] && [[ -d /mnt/c/Users ]]; then
|
|
145
|
+
while IFS= read -r d; do
|
|
146
|
+
name="$(basename "$d")"
|
|
147
|
+
case "$name" in
|
|
148
|
+
.*|Default|Default*|Public|"All Users"|desktop.ini) continue ;;
|
|
149
|
+
esac
|
|
150
|
+
# Real user profiles have AppData; system pseudo-accounts don't.
|
|
151
|
+
if [[ -d "$d/AppData" ]]; then
|
|
152
|
+
WIN_USERNAME="$name"
|
|
153
|
+
break
|
|
154
|
+
fi
|
|
155
|
+
done < <(find /mnt/c/Users -mindepth 1 -maxdepth 1 -type d 2>/dev/null)
|
|
156
|
+
fi
|
|
157
|
+
CLAUDE_DIR="${HOME}/.claude"
|
|
158
|
+
SETTINGS_FILE="${CLAUDE_DIR}/settings.json"
|
|
159
|
+
CACHE_DIR="${HOME}/.cache/claude-cli-nodejs"
|
|
160
|
+
|
|
161
|
+
if (( JSON_MODE == 0 )); then
|
|
162
|
+
echo "Platform: $OS"
|
|
163
|
+
echo "User: $USERNAME"
|
|
164
|
+
echo "Claude dir: $CLAUDE_DIR"
|
|
165
|
+
echo
|
|
166
|
+
fi
|
|
167
|
+
|
|
168
|
+
# ============================================================
|
|
169
|
+
# Check 1 — Settings file presence and JSON validity (issue #57491 family)
|
|
170
|
+
# ============================================================
|
|
171
|
+
section "Check 1: settings.json validity"
|
|
172
|
+
|
|
173
|
+
if [[ ! -f "$SETTINGS_FILE" ]]; then
|
|
174
|
+
report INFO "settings.json not found" \
|
|
175
|
+
"Path: $SETTINGS_FILE" \
|
|
176
|
+
"If you've never configured Claude Code, this is expected."
|
|
177
|
+
else
|
|
178
|
+
if command -v jq >/dev/null 2>&1; then
|
|
179
|
+
if jq empty "$SETTINGS_FILE" 2>/dev/null; then
|
|
180
|
+
report INFO "settings.json parses as valid JSON" \
|
|
181
|
+
"Size: $(wc -c < "$SETTINGS_FILE") bytes" ""
|
|
182
|
+
else
|
|
183
|
+
report HIGH "settings.json has invalid JSON syntax" \
|
|
184
|
+
"Path: $SETTINGS_FILE — Claude Code may silently fall back to defaults without warning you." \
|
|
185
|
+
"Run jq . on the file to find the syntax error. See issue #57491 (settings silent fallback)."
|
|
186
|
+
fi
|
|
187
|
+
else
|
|
188
|
+
report LOW "jq not installed — skipping JSON validation" \
|
|
189
|
+
"Install jq for stronger checks (apt-get install jq / brew install jq)." \
|
|
190
|
+
""
|
|
191
|
+
fi
|
|
192
|
+
fi
|
|
193
|
+
|
|
194
|
+
# ============================================================
|
|
195
|
+
# Check 2 — Windows 8.3 short-name allow-rule bypass (issue #58614)
|
|
196
|
+
# ============================================================
|
|
197
|
+
section "Check 2: Windows 8.3 short-name allow-rule bypass"
|
|
198
|
+
|
|
199
|
+
if [[ "$OS" == "windows" ]] || [[ "$OS" == "wsl" ]]; then
|
|
200
|
+
# Under WSL, the relevant username is the Windows profile owner, not the
|
|
201
|
+
# Linux distro account. Issue #58614 triggers when the Windows profile path
|
|
202
|
+
# contains non-ASCII chars and therefore gets an 8.3 short name.
|
|
203
|
+
CHECK_NAME="$USERNAME"
|
|
204
|
+
NAME_SOURCE="Linux user"
|
|
205
|
+
if [[ "$OS" == "wsl" ]] && [[ -n "$WIN_USERNAME" ]]; then
|
|
206
|
+
CHECK_NAME="$WIN_USERNAME"
|
|
207
|
+
NAME_SOURCE="Windows profile under /mnt/c/Users"
|
|
208
|
+
fi
|
|
209
|
+
if [[ "$CHECK_NAME" =~ [^[:ascii:]] ]] || [[ "$CHECK_NAME" =~ [äöüåéÄÖÜÅÉàèìòùÀÈÌÒÙ] ]]; then
|
|
210
|
+
report HIGH "Windows username contains non-ASCII character — 8.3 scanner will bypass allow-rules" \
|
|
211
|
+
"Username ($CHECK_NAME, source: $NAME_SOURCE) generates an 8.3 short name (e.g. ${CHECK_NAME:0:6}~1). Claude Code's path-pattern scanner runs above the permission/allow-list layer and forces manual approval on every Read/Write touching paths in that account, even when settings.json has an explicit allow rule." \
|
|
212
|
+
"Issue #58614 — book Chapter 5 (silent override) extends to allow-rule site. Workarounds (none clean): rename Windows account / move %TEMP% to ASCII path / disable 8.3 generation system-wide. Track vendor fix: https://github.com/anthropics/claude-code/issues/58614"
|
|
213
|
+
else
|
|
214
|
+
report INFO "Windows username is ASCII-clean — 8.3 short-name scanner won't trigger on you" \
|
|
215
|
+
"Checked: $CHECK_NAME (source: $NAME_SOURCE)" \
|
|
216
|
+
""
|
|
217
|
+
fi
|
|
218
|
+
else
|
|
219
|
+
report INFO "Not on Windows — issue #58614 (8.3 short-name) does not apply" \
|
|
220
|
+
"Platform: $OS" \
|
|
221
|
+
""
|
|
222
|
+
fi
|
|
223
|
+
|
|
224
|
+
# ============================================================
|
|
225
|
+
# Check 3 — Skill bloat / per-session token tax (Reddit 1tbbove)
|
|
226
|
+
# ============================================================
|
|
227
|
+
section "Check 3: skill bloat per-session token cost"
|
|
228
|
+
|
|
229
|
+
SKILLS_DIR="${CLAUDE_DIR}/skills"
|
|
230
|
+
if [[ -d "$SKILLS_DIR" ]]; then
|
|
231
|
+
SKILL_COUNT=$(find "$SKILLS_DIR" -maxdepth 1 -mindepth 1 -type d 2>/dev/null | wc -l | tr -d ' ')
|
|
232
|
+
# Per-skill descriptor estimate calibrated against:
|
|
233
|
+
# - Reporter 1tbbove's measurement: 2,596 skills → 102K tokens (~40 tokens/skill avg)
|
|
234
|
+
# - Dogfooding measurement via eliransu/skill-tax against this author's install:
|
|
235
|
+
# 97 skills → 6,031 tokens (~62 tokens/skill avg, tiktoken cl100k_base)
|
|
236
|
+
# Conservative estimate at 80 tokens/skill captures verbose-metadata installs.
|
|
237
|
+
# For accurate per-skill measurement, use eliransu/skill-tax (tiktoken-based).
|
|
238
|
+
EST_TOKENS=$((SKILL_COUNT * 80))
|
|
239
|
+
|
|
240
|
+
if (( EST_TOKENS > 30000 )); then
|
|
241
|
+
report HIGH "$SKILL_COUNT skills installed — heavy per-session token tax (~${EST_TOKENS} tokens estimated)" \
|
|
242
|
+
"Every installed skill loads its descriptor into every session regardless of invocation. Reporter 1tbbove measured ~\$91/month at 2,596 skills with 102K tokens/session. Your estimated cost at typical Pro usage: ~\$$(( EST_TOKENS / 1100 ))/month. For accurate measurement use eliransu/skill-tax." \
|
|
243
|
+
"Use eliransu/skill-tax (https://github.com/eliransu/skill-tax) for per-skill cost measurement and pruning. See book §1tbbove."
|
|
244
|
+
elif (( EST_TOKENS > 10000 )); then
|
|
245
|
+
report MEDIUM "$SKILL_COUNT skills installed — moderate per-session token tax (~${EST_TOKENS} tokens estimated)" \
|
|
246
|
+
"Review which skills you actually invoke. For accurate measurement use eliransu/skill-tax." \
|
|
247
|
+
"Run eliransu/skill-tax report to identify never-invoked skills."
|
|
248
|
+
elif (( EST_TOKENS > 3000 )); then
|
|
249
|
+
report LOW "$SKILL_COUNT skills installed — minor per-session token tax (~${EST_TOKENS} tokens estimated)" \
|
|
250
|
+
"Worth a periodic audit if invocation rate is low. eliransu/skill-tax gives accurate per-skill costs." \
|
|
251
|
+
""
|
|
252
|
+
else
|
|
253
|
+
report INFO "$SKILL_COUNT skills installed — token tax is negligible (~${EST_TOKENS} tokens estimated)" \
|
|
254
|
+
"" \
|
|
255
|
+
""
|
|
256
|
+
fi
|
|
257
|
+
else
|
|
258
|
+
report INFO "No skills directory — skill bloat not applicable" \
|
|
259
|
+
"Path: $SKILLS_DIR" \
|
|
260
|
+
""
|
|
261
|
+
fi
|
|
262
|
+
|
|
263
|
+
# ============================================================
|
|
264
|
+
# Check 4 — Session backup state (issue #58608)
|
|
265
|
+
# ============================================================
|
|
266
|
+
section "Check 4: session backup against silent deletion"
|
|
267
|
+
|
|
268
|
+
PROJECTS_DIR="${CLAUDE_DIR}/projects"
|
|
269
|
+
if [[ -d "$PROJECTS_DIR" ]]; then
|
|
270
|
+
SESSION_COUNT=$(find "$PROJECTS_DIR" -name "*.jsonl" 2>/dev/null | wc -l | tr -d ' ')
|
|
271
|
+
NEWEST=$(find "$PROJECTS_DIR" -name "*.jsonl" -printf '%T@ %p\n' 2>/dev/null | sort -nr | head -1 | awk '{print $2}')
|
|
272
|
+
|
|
273
|
+
if (( SESSION_COUNT == 0 )); then
|
|
274
|
+
report MEDIUM "No .jsonl session files found under projects/" \
|
|
275
|
+
"If you have used Claude Code, sessions may have been silently deleted (see #58608 — Windows background-update wiped session storage)." \
|
|
276
|
+
"If you have an Electron cache, check it for old paths that prove sessions existed. Book Chapter 3 + defense #5."
|
|
277
|
+
else
|
|
278
|
+
report INFO "$SESSION_COUNT session .jsonl files present" \
|
|
279
|
+
"Newest: $NEWEST" \
|
|
280
|
+
""
|
|
281
|
+
|
|
282
|
+
# Check for any backup mechanism — accept either ~/.claude/backups or
|
|
283
|
+
# ~/.claude/session-backups (the latter is what this repo's own
|
|
284
|
+
# examples/session-backup-on-start.sh writes to per COOKBOOK.md).
|
|
285
|
+
BACKUP_FILE_COUNT=0
|
|
286
|
+
FOUND_BACKUP_DIR=""
|
|
287
|
+
for cand in "${CLAUDE_DIR}/backups" "${CLAUDE_DIR}/session-backups"; do
|
|
288
|
+
if [[ -d "$cand" ]]; then
|
|
289
|
+
cand_count=$(find "$cand" -type f 2>/dev/null | wc -l | tr -d ' ')
|
|
290
|
+
if (( cand_count > 0 )); then
|
|
291
|
+
BACKUP_FILE_COUNT=$((BACKUP_FILE_COUNT + cand_count))
|
|
292
|
+
FOUND_BACKUP_DIR="${FOUND_BACKUP_DIR:+$FOUND_BACKUP_DIR, }$cand ($cand_count file(s))"
|
|
293
|
+
fi
|
|
294
|
+
fi
|
|
295
|
+
done
|
|
296
|
+
|
|
297
|
+
if (( BACKUP_FILE_COUNT == 0 )); then
|
|
298
|
+
report MEDIUM "No session backups present — protection against silent deletion is absent" \
|
|
299
|
+
"Issues #58608 (Windows auto-update), #57453 (session jsonl silent deletion), #58361 (transcript silent overwrite) all result in unrecoverable session loss. Without an off-system backup, weeks of conversation context can vanish without warning. Checked: ${CLAUDE_DIR}/backups and ${CLAUDE_DIR}/session-backups (the latter is where this repo's session-backup-on-start.sh writes)." \
|
|
300
|
+
"Install cc-safe-setup's session-backup-on-start.sh (writes to ~/.claude/session-backups) or set up rsync/restic. Book defense #5 + Chapter 3."
|
|
301
|
+
else
|
|
302
|
+
report INFO "Backup directory has $BACKUP_FILE_COUNT file(s)" \
|
|
303
|
+
"Found: $FOUND_BACKUP_DIR" \
|
|
304
|
+
""
|
|
305
|
+
fi
|
|
306
|
+
fi
|
|
307
|
+
else
|
|
308
|
+
report INFO "No projects directory — session backup check not applicable" \
|
|
309
|
+
"Path: $PROJECTS_DIR" \
|
|
310
|
+
""
|
|
311
|
+
fi
|
|
312
|
+
|
|
313
|
+
# ============================================================
|
|
314
|
+
# Check 5 — Sub-agent .env inheritance (issue #57068)
|
|
315
|
+
# ============================================================
|
|
316
|
+
section "Check 5: sub-agent .env protection inheritance"
|
|
317
|
+
|
|
318
|
+
# First: classify what's present in cwd. The cwd .env risk is independent of
|
|
319
|
+
# whether ~/.claude/settings.json exists or jq is installed — if settings is
|
|
320
|
+
# missing/unparseable, the user definitely has no deny rules, which is the
|
|
321
|
+
# worst case and must still surface a HIGH warning.
|
|
322
|
+
ENV_IN_CWD=0
|
|
323
|
+
if [[ -f .env ]] || ls .env.* >/dev/null 2>&1; then
|
|
324
|
+
ENV_IN_CWD=1
|
|
325
|
+
fi
|
|
326
|
+
|
|
327
|
+
DENY_ENV=0
|
|
328
|
+
SETTINGS_USABLE=0
|
|
329
|
+
if [[ -f "$SETTINGS_FILE" ]] && command -v jq >/dev/null 2>&1 && jq empty "$SETTINGS_FILE" >/dev/null 2>&1; then
|
|
330
|
+
SETTINGS_USABLE=1
|
|
331
|
+
DENY_ENV=$(jq -r '.permissions.deny // [] | map(select(. | tostring | test("\\.env|credentials|secrets"; "i"))) | length' "$SETTINGS_FILE" 2>/dev/null || echo 0)
|
|
332
|
+
fi
|
|
333
|
+
|
|
334
|
+
if (( DENY_ENV > 0 )); then
|
|
335
|
+
# Settings has deny rules — check sub-agent inheritance
|
|
336
|
+
AGENT_COUNT=0
|
|
337
|
+
[[ -d "${CLAUDE_DIR}/agents" ]] && AGENT_COUNT=$(find "${CLAUDE_DIR}/agents" -name "*.md" 2>/dev/null | wc -l | tr -d ' ')
|
|
338
|
+
|
|
339
|
+
if (( AGENT_COUNT > 0 )); then
|
|
340
|
+
report MEDIUM "Parent has $DENY_ENV .env-related deny rules + $AGENT_COUNT sub-agents — verify inheritance" \
|
|
341
|
+
"Issue #57068: sub-agents do not inherit parent's .env deny rules by default. The parent's allow-list propagates, but the deny-list does not. Your sub-agents may be able to read .env files even though your parent settings deny it." \
|
|
342
|
+
"Add an explicit PreToolUse hook that blocks Read/Edit/Write against .env paths in the sub-agent dispatch chain. cc-safe-setup ships credential-exfil-guard.sh for this. Book Chapter 4 + defense #10."
|
|
343
|
+
else
|
|
344
|
+
report INFO ".env deny rules present + no sub-agents defined" \
|
|
345
|
+
"Deny rules: $DENY_ENV / Sub-agents: 0" \
|
|
346
|
+
""
|
|
347
|
+
fi
|
|
348
|
+
elif (( ENV_IN_CWD )); then
|
|
349
|
+
# No deny rules (settings missing, unparseable, or simply has none) but
|
|
350
|
+
# .env present in cwd. This is the worst case — always HIGH.
|
|
351
|
+
if (( SETTINGS_USABLE )); then
|
|
352
|
+
reason="Your settings.json does not deny Read/Edit/Write on .env files."
|
|
353
|
+
elif [[ ! -f "$SETTINGS_FILE" ]]; then
|
|
354
|
+
reason="No ~/.claude/settings.json — no deny rules anywhere."
|
|
355
|
+
elif ! command -v jq >/dev/null 2>&1; then
|
|
356
|
+
reason="jq not installed — could not parse settings.json to verify deny rules. Assuming no protection."
|
|
357
|
+
else
|
|
358
|
+
reason="~/.claude/settings.json failed to parse — cannot rely on any deny rule in it."
|
|
359
|
+
fi
|
|
360
|
+
report HIGH "Found .env file in current directory but NO usable deny rules" \
|
|
361
|
+
"$reason Claude Code or its sub-agents may read your credentials into a transcript. Issue #58173 reports leaks of GitHub PAT, Vercel token, Slack bot token, Supabase service key, Anthropic API key, Brave search key from this exact pattern." \
|
|
362
|
+
"Add to settings.json: \"permissions\": {\"deny\": [\"Read(./.env)\", \"Edit(./.env)\", \"Write(./.env)\"]}. Then test that sub-agents respect it (see #57068). Book Chapter 4 + defense #10."
|
|
363
|
+
else
|
|
364
|
+
report INFO "No .env in cwd, no .env deny rules needed — clean state" \
|
|
365
|
+
"" \
|
|
366
|
+
""
|
|
367
|
+
fi
|
|
368
|
+
|
|
369
|
+
# ============================================================
|
|
370
|
+
# Check 6 — Auto-compact configuration drift (issues #57490, #58373)
|
|
371
|
+
# ============================================================
|
|
372
|
+
section "Check 6: auto-compact configuration drift"
|
|
373
|
+
|
|
374
|
+
if [[ -f "$SETTINGS_FILE" ]] && command -v jq >/dev/null 2>&1; then
|
|
375
|
+
AUTOCOMPACT=$(jq -r '.autoCompact // empty' "$SETTINGS_FILE" 2>/dev/null)
|
|
376
|
+
if [[ "$AUTOCOMPACT" == "false" ]]; then
|
|
377
|
+
report MEDIUM "autoCompact set to false in settings.json — verify it actually holds at runtime" \
|
|
378
|
+
"Issue #57490 reports auto-compaction firing despite explicit disable in /config. Issue #58373 reports the inverse: /goal-bounded long work fails to trigger auto-compact even when it should. The display state and runtime state diverge in both directions." \
|
|
379
|
+
"Add a SessionStart hook that captures the /context state and a Stop hook that compares post-session. See book Chapter 5 + defense #11 (context snapshot)."
|
|
380
|
+
fi
|
|
381
|
+
fi
|
|
382
|
+
|
|
383
|
+
# ============================================================
|
|
384
|
+
# Check 7 — bypassPermissions remote override (issue #57810)
|
|
385
|
+
# ============================================================
|
|
386
|
+
section "Check 7: bypassPermissions remote override"
|
|
387
|
+
|
|
388
|
+
if [[ -f "$SETTINGS_FILE" ]] && command -v jq >/dev/null 2>&1; then
|
|
389
|
+
BYPASS=$(jq -r '.permissions.defaultMode // empty' "$SETTINGS_FILE" 2>/dev/null)
|
|
390
|
+
if [[ "$BYPASS" == "bypassPermissions" ]]; then
|
|
391
|
+
report LOW "permissions.defaultMode set to bypassPermissions" \
|
|
392
|
+
"Issue #57810: in claude.ai/code remote sessions, this setting is silently ignored and approval prompts continue to fire. Your local setting may not transfer when you start a remote session." \
|
|
393
|
+
"Re-confirm permissions behavior in any remote session you start. Book Chapter 5 + defense #13."
|
|
394
|
+
fi
|
|
395
|
+
fi
|
|
396
|
+
|
|
397
|
+
# ============================================================
|
|
398
|
+
# Check 8 — Cache directory references to deleted storage (issue #58608 evidence trail)
|
|
399
|
+
# ============================================================
|
|
400
|
+
section "Check 8: forensic — cache references to deleted storage"
|
|
401
|
+
|
|
402
|
+
if [[ -d "$CACHE_DIR" ]]; then
|
|
403
|
+
SUSPICIOUS=$(find "$CACHE_DIR" -name "*local-agent-mode-sessions*" 2>/dev/null | head -3 | wc -l | tr -d ' ')
|
|
404
|
+
if (( SUSPICIOUS > 0 )); then
|
|
405
|
+
report MEDIUM "Cache contains references to legacy session storage paths" \
|
|
406
|
+
"Found $SUSPICIOUS folders matching legacy 'local-agent-mode-sessions' path. Per issue #58608, this is the forensic trail of session data that existed under the legacy path. If your projects/ directory is also empty, you may have experienced a silent migration loss." \
|
|
407
|
+
"Compare current session count (Check 4 above) against the cache folder dates. If sessions are gone but cache references remain, file or +1 #58608."
|
|
408
|
+
else
|
|
409
|
+
report INFO "Cache directory has no legacy-storage references" \
|
|
410
|
+
"Path: $CACHE_DIR" \
|
|
411
|
+
""
|
|
412
|
+
fi
|
|
413
|
+
fi
|
|
414
|
+
|
|
415
|
+
# ============================================================
|
|
416
|
+
# Summary
|
|
417
|
+
# ============================================================
|
|
418
|
+
TOTAL_FINDINGS=$((HIGH + MED + LOW))
|
|
419
|
+
|
|
420
|
+
if (( JSON_MODE )); then
|
|
421
|
+
# Emit single JSON object to stdout
|
|
422
|
+
TIMESTAMP="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
|
|
423
|
+
printf '{"schema":"claim-verify-audit/v1","timestamp":"%s","platform":"%s","user":"%s","claude_dir":"%s","summary":{"high":%d,"medium":%d,"low":%d,"info":%d},"findings":[%s]}\n' \
|
|
424
|
+
"$TIMESTAMP" "$OS" "$(json_escape "$USERNAME")" "$(json_escape "$CLAUDE_DIR")" \
|
|
425
|
+
"$HIGH" "$MED" "$LOW" "$INFO" "$JSON_FINDINGS"
|
|
426
|
+
else
|
|
427
|
+
section "Audit Summary"
|
|
428
|
+
echo "Findings: ${R}${HIGH} HIGH${N} ${Y}${MED} MEDIUM${N} ${B}${LOW} LOW${N} ${G}${INFO} INFO${N}"
|
|
429
|
+
echo
|
|
430
|
+
|
|
431
|
+
if (( HIGH > 0 )); then
|
|
432
|
+
echo "${R}Action required${N}: $HIGH high-severity finding(s) above. Each cites the source issue and the book chapter for structural prevention."
|
|
433
|
+
elif (( MED > 0 )); then
|
|
434
|
+
echo "${Y}Review recommended${N}: $MED medium-severity finding(s) above. Worth addressing in your next operations review."
|
|
435
|
+
else
|
|
436
|
+
echo "${G}No high or medium-severity findings.${N} Continue periodic auditing as Claude Code ships changes."
|
|
437
|
+
fi
|
|
438
|
+
|
|
439
|
+
cat <<'FOOTER'
|
|
440
|
+
|
|
441
|
+
────────────────────────────────────────────────────────────────
|
|
442
|
+
Structural prevention reference:
|
|
443
|
+
• Claim-Verify case collection — 58 cases (15 body + 43 appendix D) with
|
|
444
|
+
14 prevention defenses mapped per case. The write-up is free to read:
|
|
445
|
+
https://gist.github.com/yurukusa/6dd608049064ed66c54f1a545a7b47a8
|
|
446
|
+
(Corrected 2026-08-12: this footer used to say "Ships 2026-05-22, USD 19".
|
|
447
|
+
That book is not on sale anywhere, so the line pointed everyone who ran this
|
|
448
|
+
tool at something they could not buy. The free preview above is what exists.)
|
|
449
|
+
|
|
450
|
+
Runtime prevention (hooks):
|
|
451
|
+
• cc-safe-setup — MIT-licensed PreToolUse/PostToolUse hook collection.
|
|
452
|
+
https://github.com/yurukusa/cc-safe-setup
|
|
453
|
+
• skill-tax — per-skill token cost audit.
|
|
454
|
+
https://github.com/eliransu/skill-tax
|
|
455
|
+
|
|
456
|
+
This audit is read-only and stateless. Rerun anytime after updates.
|
|
457
|
+
Run `bash claim-verify-audit.sh --json` for machine-readable output.
|
|
458
|
+
Patches welcome: open an issue or PR against the gist.
|
|
459
|
+
────────────────────────────────────────────────────────────────
|
|
460
|
+
FOOTER
|
|
461
|
+
fi
|
|
462
|
+
|
|
463
|
+
# Exit code: 1 if any HIGH-severity finding, 0 otherwise (for CI integration)
|
|
464
|
+
if (( HIGH > 0 )); then
|
|
465
|
+
exit 1
|
|
466
|
+
fi
|
|
467
|
+
exit 0
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# ================================================================
|
|
3
|
+
# cowork-claudemd-helper.sh — Workaround for Cowork sessions not
|
|
4
|
+
# loading ~/.claude/CLAUDE.md at session start
|
|
5
|
+
# ================================================================
|
|
6
|
+
# PURPOSE:
|
|
7
|
+
# Issue #62859 reports that Cowork (the Claude desktop app's
|
|
8
|
+
# sandboxed remote-control session) does not load
|
|
9
|
+
# ~/.claude/CLAUDE.md or any project-scoped CLAUDE.md at
|
|
10
|
+
# session start. The user-side workaround documented in the
|
|
11
|
+
# issue is to manually paste the contents into the first chat
|
|
12
|
+
# message. This script prints those contents pre-formatted for
|
|
13
|
+
# paste, so the workaround takes one command instead of
|
|
14
|
+
# navigating files in a terminal.
|
|
15
|
+
#
|
|
16
|
+
# Cluster 11 (Cowork) in the cc-safe-setup tracker. Hooks do
|
|
17
|
+
# not fire in Cowork's GUI sandbox, so this is a standalone
|
|
18
|
+
# script rather than a hook.
|
|
19
|
+
#
|
|
20
|
+
# UPSTREAM REFERENCES:
|
|
21
|
+
# #62859 (Cowork does not load ~/.claude/CLAUDE.md at session
|
|
22
|
+
# start) — 2026-05-27
|
|
23
|
+
#
|
|
24
|
+
# USAGE:
|
|
25
|
+
# bash scripts/cowork-claudemd-helper.sh # print to stdout
|
|
26
|
+
# bash scripts/cowork-claudemd-helper.sh --copy # also copy to clipboard
|
|
27
|
+
# bash scripts/cowork-claudemd-helper.sh --paths # list files that would be included
|
|
28
|
+
# bash scripts/cowork-claudemd-helper.sh PROJECT # include PROJECT/.claude/CLAUDE.md too
|
|
29
|
+
#
|
|
30
|
+
# BEHAVIOR:
|
|
31
|
+
# - Reads ~/.claude/CLAUDE.md if present.
|
|
32
|
+
# - Optionally reads $1/.claude/CLAUDE.md when a project path is given.
|
|
33
|
+
# - Prints both with section headers Cowork's chat can render.
|
|
34
|
+
# - Exits 0 with informational stderr when nothing is found
|
|
35
|
+
# (not an error — many operators don't use user-scoped CLAUDE.md).
|
|
36
|
+
# - --copy uses pbcopy (macOS), xclip (Linux), or wl-copy (Wayland),
|
|
37
|
+
# whichever is available. Silent fallback to stdout if none.
|
|
38
|
+
#
|
|
39
|
+
# CONFIGURATION (env vars):
|
|
40
|
+
# CC_COWORK_HELPER_USER_PATH Override ~/.claude/CLAUDE.md path
|
|
41
|
+
# (used by tests).
|
|
42
|
+
# CC_COWORK_HELPER_HEADER Prefix string for the pasted block
|
|
43
|
+
# (default: "Standing instructions from CLAUDE.md:")
|
|
44
|
+
# ================================================================
|
|
45
|
+
|
|
46
|
+
set -u
|
|
47
|
+
|
|
48
|
+
USER_PATH="${CC_COWORK_HELPER_USER_PATH:-$HOME/.claude/CLAUDE.md}"
|
|
49
|
+
HEADER="${CC_COWORK_HELPER_HEADER:-Standing instructions from CLAUDE.md:}"
|
|
50
|
+
|
|
51
|
+
COPY=0
|
|
52
|
+
LIST_PATHS=0
|
|
53
|
+
PROJECT=""
|
|
54
|
+
|
|
55
|
+
while [ $# -gt 0 ]; do
|
|
56
|
+
case "$1" in
|
|
57
|
+
--copy) COPY=1; shift ;;
|
|
58
|
+
--paths) LIST_PATHS=1; shift ;;
|
|
59
|
+
-h|--help)
|
|
60
|
+
sed -n '2,46p' "$0" | sed 's/^# //; s/^#//'
|
|
61
|
+
exit 0
|
|
62
|
+
;;
|
|
63
|
+
*) PROJECT="$1"; shift ;;
|
|
64
|
+
esac
|
|
65
|
+
done
|
|
66
|
+
|
|
67
|
+
USER_EXISTS=0
|
|
68
|
+
PROJECT_EXISTS=0
|
|
69
|
+
PROJECT_PATH=""
|
|
70
|
+
|
|
71
|
+
if [ -f "$USER_PATH" ] && [ -r "$USER_PATH" ]; then
|
|
72
|
+
USER_EXISTS=1
|
|
73
|
+
fi
|
|
74
|
+
|
|
75
|
+
if [ -n "$PROJECT" ]; then
|
|
76
|
+
PROJECT_PATH="${PROJECT%/}/.claude/CLAUDE.md"
|
|
77
|
+
if [ -f "$PROJECT_PATH" ] && [ -r "$PROJECT_PATH" ]; then
|
|
78
|
+
PROJECT_EXISTS=1
|
|
79
|
+
fi
|
|
80
|
+
fi
|
|
81
|
+
|
|
82
|
+
if [ "$LIST_PATHS" = "1" ]; then
|
|
83
|
+
if [ "$USER_EXISTS" = "1" ]; then
|
|
84
|
+
echo "$USER_PATH"
|
|
85
|
+
fi
|
|
86
|
+
if [ "$PROJECT_EXISTS" = "1" ]; then
|
|
87
|
+
echo "$PROJECT_PATH"
|
|
88
|
+
fi
|
|
89
|
+
exit 0
|
|
90
|
+
fi
|
|
91
|
+
|
|
92
|
+
if [ "$USER_EXISTS" = "0" ] && [ "$PROJECT_EXISTS" = "0" ]; then
|
|
93
|
+
echo "cowork-claudemd-helper: no CLAUDE.md found at $USER_PATH${PROJECT:+ or $PROJECT_PATH}." >&2
|
|
94
|
+
echo "cowork-claudemd-helper: create $USER_PATH with your standing instructions, then re-run." >&2
|
|
95
|
+
exit 0
|
|
96
|
+
fi
|
|
97
|
+
|
|
98
|
+
build_output() {
|
|
99
|
+
echo "$HEADER"
|
|
100
|
+
echo ""
|
|
101
|
+
if [ "$USER_EXISTS" = "1" ]; then
|
|
102
|
+
echo "## User-scoped ($USER_PATH)"
|
|
103
|
+
echo ""
|
|
104
|
+
cat "$USER_PATH"
|
|
105
|
+
echo ""
|
|
106
|
+
fi
|
|
107
|
+
if [ "$PROJECT_EXISTS" = "1" ]; then
|
|
108
|
+
echo "## Project-scoped ($PROJECT_PATH)"
|
|
109
|
+
echo ""
|
|
110
|
+
cat "$PROJECT_PATH"
|
|
111
|
+
echo ""
|
|
112
|
+
fi
|
|
113
|
+
echo "(Pasted as Cowork workaround for issue #62859 — Cowork does not auto-load CLAUDE.md.)"
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
OUTPUT=$(build_output)
|
|
117
|
+
|
|
118
|
+
if [ "$COPY" = "1" ]; then
|
|
119
|
+
if command -v pbcopy >/dev/null 2>&1; then
|
|
120
|
+
printf '%s\n' "$OUTPUT" | pbcopy
|
|
121
|
+
echo "cowork-claudemd-helper: copied to clipboard via pbcopy." >&2
|
|
122
|
+
elif command -v wl-copy >/dev/null 2>&1; then
|
|
123
|
+
printf '%s\n' "$OUTPUT" | wl-copy
|
|
124
|
+
echo "cowork-claudemd-helper: copied to clipboard via wl-copy." >&2
|
|
125
|
+
elif command -v xclip >/dev/null 2>&1; then
|
|
126
|
+
printf '%s\n' "$OUTPUT" | xclip -selection clipboard
|
|
127
|
+
echo "cowork-claudemd-helper: copied to clipboard via xclip." >&2
|
|
128
|
+
else
|
|
129
|
+
echo "cowork-claudemd-helper: no clipboard tool found (pbcopy/wl-copy/xclip). Falling back to stdout." >&2
|
|
130
|
+
printf '%s\n' "$OUTPUT"
|
|
131
|
+
fi
|
|
132
|
+
else
|
|
133
|
+
printf '%s\n' "$OUTPUT"
|
|
134
|
+
fi
|
|
135
|
+
|
|
136
|
+
exit 0
|