skills/tirith-config/SKILL.md
Operate a tirith setup — the terminal command analyzer guarding against homograph URLs, ANSI injection, and pipe-to-shell exploits. Use when editing ~/.config/tirith/policy.yaml, debugging a blocked command, choosing between allowlist / tirith run / TIRITH=0 bypass, or verifying with tirith doctor.
npx skillsauth add nweii/agent-stuff tirith-configInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Tirith intercepts shell commands and pasted content to catch homograph URLs (Cyrillic lookalikes, mixed scripts), ANSI escape injection, and curl | bash–style pipe-to-shell patterns. This skill encodes operating procedure — decision logic, verification rituals, and inherent gotchas. The current allowlist and tool version are not encoded here; query them at runtime.
Tirith has four moving parts. Treat the live config as source of truth, not memory:
eval "$(tirith init --shell zsh)" in the user's shell profile. This is what wires per-command interception. Hook source files at ~/.local/share/tirith/shell/ are inert until the eval line is added to the profile.~/.config/tirith/policy.yaml (global) and .tirith/policy.yaml (per-project, walks up from cwd). The per-project file wins when present.~/.local/share/tirith/log.jsonl. Redacted previews, not full commands.tirith run <url>. Verifiable later with tirith receipt verify <sha256>.tirith doctor is the canonical health check; it surfaces hook status, policy detection, and bypass mode in one shot.
Three responses, each appropriate for a different shape of problem:
allowlist: in ~/.config/tirith/policy.yaml. Reserve for canonical installer domains (e.g., get.docker.com, sh.rustup.rs). Allowlist only suppresses pipe-shell rules for that exact hostname; content-level checks (homograph, mixed-script, ANSI) still run.tirith run <url> — for one-off installs you want to inspect. Downloads to a temp file, shows SHA256, runs static analysis, opens in a pager for review, executes only after confirmation, and writes a receipt.TIRITH=0 <cmd> prefix — per-command bypass when you've already vetted the script elsewhere or are operating in a known-safe context. The variable only persists for that single command. Disabled if allow_bypass: false in policy.If none of these fit, the command probably shouldn't run.
allowlist:
- "vendor.example.com" # one entry per line, exact hostname
Hostnames only — no globs, no path-aware matching. After editing:
tirith doctor # confirm policies: still resolves
tirith check -- curl -fsSL https://vendor.example.com \| bash # should exit 0
tirith check -- curl -fsSL https://vendor-not-listed.com \| bash # should still exit 1 with curl_pipe_shell
Both checks together confirm the allowlist took effect and didn't accidentally widen the policy.
raw.githubusercontent.com, gist.githubusercontent.com, cdn.jsdelivr.net, s3.amazonaws.com, *.vercel.app — anyone can host arbitrary scripts on these. Allowlisting them gives a security tool a wide blind spot. Use tirith run or TIRITH=0 for one-off scripts hosted on shared infrastructure.Run all three:
tirith doctor # hook status: configured / policies: <path>
tirith check -- <a known-blocked cmd> # confirm rules still fire
tirith check -- <an allowlisted cmd> # confirm allowlist still works
tirith doctor alone is not sufficient — it reports config detection, not rule behavior.
brew upgrade tirith may re-materialize hook source files. The shell profile line stays put, so usually nothing breaks, but verify:
tirith --version
tirith doctor
If hook status ever drops back to NOT CONFIGURED after an upgrade, re-run eval "$(tirith init --shell zsh)" and confirm the profile line is still present. Do not blindly append a duplicate.
tail -20 ~/.local/share/tirith/log.jsonl | jq . # last 20 events
tirith why # explains last triggered rule
tirith receipt last # last `tirith run` receipt
tirith receipt list # all receipts
The log only stores redacted command previews — not full commands, env vars, or file contents. Disable logging entirely with export TIRITH_LOG=0.
For client work where defaults differ from the global config, drop a .tirith/policy.yaml at the project root. Tirith walks up from the current directory and uses the first match, so the per-project file fully overrides the global one — it doesn't merge. Re-declare any global allowlist entries the project also needs.
source ~/.zshrc. The current shell will not pick up the change.tirith check -- <cmd> — the -- is required. Without it, flags on <cmd> (e.g., -sSL) get parsed as tirith's own flags.tirith check. Pipe characters and parens need escaping (\|, \() since the command is parsed by your shell first.fail_mode: open allows commands through when tirith itself errors internally. Use fail_mode: closed only in environments where blocking on parser errors is acceptable.~/.config/tirith/policy.yaml directly.tirith --version.tirith doctor.tirith init --shell zsh always prints the current correct line; pipe its output rather than copy-pasting from anywhere.The skill is a stable operating manual. Live state is queried at runtime.
testing
Command-invoked tutoring pass for understanding something deeply: a concept being learned, or work just done in the session. Locates where the learner is, teaches one step per turn, quizzes to verify, and continues until they can explain the material back and apply it. Can produce durable artifacts (a walkthrough of the work, a record of what was learned, a glossary) saved through whatever the environment supports. Best run after substantive work, or when the aim is to learn something.
testing
Search, read, filter, combine, adapt, and save recipes in the Brain vault collection. Use whenever cooking and the collection are relevant — 'what should I make', 'recipes with miso', 'save this one' all imply it.
testing
Socratic teaching pass over the work just done in a session: incremental comprehension stages, a running checklist doc, restate-understanding-first, and AskUserQuestion quizzes. The session doesn't end until the user has demonstrated understanding. Run after Claude has completed substantive work worth deeply understanding.
development
Writing-partner processes that draw out the user's own writing through questioning: guided drafting sessions, fragment mining, shaping raw material into a piece, and phrase tightening. Use for help discovering, developing, and structuring writing (notes, essays, messages, etc).