diff --git a/bin/tarbuckle b/bin/tarbuckle index 32ebe34..f914146 100755 --- a/bin/tarbuckle +++ b/bin/tarbuckle @@ -3,6 +3,13 @@ # # ! tarbuckle call him by name; he answers at length # ! tarbuckle what now ask him something +# ! tarbuckle "opinion?" a QUESTION MARK must be quoted, or dropped +# +# ⚠ zsh expands `?`, `*` and `[` as globs before this script is ever reached, so an +# unquoted `tarbuckle opinion?` dies at "no matches found" in the shell. Three ways +# past it, in order of least fuss: drop the `?`, quote the phrase, or rely on the +# `alias tarbuckle='noglob tarbuckle'` in shell/.zshrc — which only helps if the +# calling shell is interactive, since that is the only kind that reads .zshrc. # ! tarbuckle mute silence the utterances; he stays in the room # ! tarbuckle off remove him entirely # ! tarbuckle on bring him back @@ -31,6 +38,6 @@ PY 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\}//' ;; + --help|-h) sed -n '2,22p' "$0" | sed 's/^# \{0,1\}//' ;; *) exec python3 "$S/tarbuckle-invoke.py" "$@" ;; esac diff --git a/shell/.zshrc b/shell/.zshrc index 01edaf0..07c634b 100644 --- a/shell/.zshrc +++ b/shell/.zshrc @@ -205,4 +205,11 @@ typeset -U path PATH # - Each section has clear purpose and boundaries # - Graceful degradation when tools are missing # - Performance considerations for different use cases -# - Modular structure for maintainability \ No newline at end of file +# - Modular structure for maintainability + +# Tarbuckle — call him by name with an actual question. +# zsh treats `?` (and `*`, `[`) as globs, so `tarbuckle opinion?` dies at +# "no matches found" before the wrapper is ever reached. noglob suspends filename +# generation for this command only. Not `unsetopt nomatch`, which would change how +# every command in the shell behaves to fix one of them. +alias tarbuckle='noglob tarbuckle'