#!/usr/bin/env bash # Tarbuckle — the short way in. v2 §9: named invocation, mute, off. # # ! tarbuckle call him by name; he answers at length # ! tarbuckle what now ask him something # ! tarbuckle mute silence the utterances; he stays in the room # ! tarbuckle off remove him entirely # ! tarbuckle on bring him back # ! tarbuckle status what he is doing, and when he might speak next # # ⚠ Run this YOURSELF. A fool relayed by the executor is the executor's paraphrase of # a fool. The `!` prefix in Claude Code runs it in the session so the output is his. set -euo pipefail S="$HOME/dotfiles/scripts" M="$HOME/.claude/state/tarbuckle-mute" mkdir -p "$(dirname "$M")" case "${1-}" in mute) echo mute > "$M"; echo "muted — he stays in the room and says nothing. Never a fault." ;; off) echo off > "$M"; echo "off — removed from the status line too." ;; on|unmute) rm -f "$M"; echo "back." ;; status) st=$(cat "$M" 2>/dev/null || echo "listening") echo "state: $st" if [ -f "$HOME/.claude/state/tarbuckle-last-tick" ]; then python3 - "$HOME/.claude/state/tarbuckle-last-tick" <<'PY' import sys, time t = int(open(sys.argv[1]).read()) print("next tick:", time.strftime('%H:%M', time.localtime(t + 20*60)), "(27% he speaks)") PY fi r="$HOME/.claude/state/tarbuckle-rejects.jsonl" [ -f "$r" ] && echo "silences: $(wc -l < "$r" | tr -d ' ') logged (net rejections + timeouts)" || true ;; --help|-h) sed -n '2,14p' "$0" | sed 's/^# \{0,1\}//' ;; *) exec python3 "$S/tarbuckle-invoke.py" "$@" ;; esac