veto doctorThis checks config, auth methods, keyring, Claude Code hooks, and binary access.
Healthy output:
veto Doctor
Configuration:
config.toml: found
Claude Code Integration:
settings.json: found
PreToolUse hook: configured
veto binary: accessible
Keyring Status:
Backend: system
Keyring test: write/read OK
| Symptom | Cause | Fix |
|---|---|---|
config not found |
No config file | veto init |
| PIN not working | Wrong or corrupted PIN | veto auth set-pin |
| TOTP invalid code | Device clock out of sync | Sync device time |
| Touch ID unavailable | Not macOS, or hardware issue | Falls back to password; set [auth.fallback] touchid = "pin" |
| Telegram timeout | Bot not started or slow network | Increase timeout_seconds; verify with veto auth test telegram |
| Keyring errors | No system keychain available | veto auto-falls back to file storage |
| Command keeps getting blocked after denial | Deny cache active | Override with VETO_FORCE=yes |
veto auth set-pin # Overwrites existing
veto auth test pin # Verify- Check device time is synchronized
- Regenerate:
veto auth remove totp
veto auth setup-totp- Make sure you tapped Start on your bot
- Verify bot token and chat_id:
veto auth test telegram - Increase timeout:
[auth.telegram]
timeout_seconds = 120- Run
veto doctorβ check "PreToolUse hook: configured" - Restart Claude Code after running
veto setup claude - Inspect manually:
cat ~/.claude/settings.json | jq '.hooks'
veto setup claude --uninstall
veto setup claudeveto falls back to encrypted file storage automatically. To use a system keyring:
- GNOME:
apt install gnome-keyring - KDE:
apt install kwalletmanager
Check status: veto doctor β "Keyring Status"
sudo gates privilege escalation. AI agents run as you β they don't need root to rm -rf ~/Documents. veto gates agent actions, not permissions.
True. veto catches the 99% case: AI confidently running git push --force or terraform destroy. It's a seatbelt, not an airbag β and most accidents don't need an airbag.
Add to whitelist in ~/.veto/rules.toml:
[whitelist]
commands = ["your-safe-command*"]veto check -v "git push -f origin main"Yes. File-based keyring is used automatically.
rm -rf ~/.veto
veto initveto setup claude --uninstall
# Re-enable later:
veto setup claudecurl -fsSL https://raw.githubusercontent.com/runkids/veto/main/uninstall.sh | bashRemoves: binary, ~/.veto/, Claude Code hooks.
Keychain secrets preserved. To remove everything:
curl -fsSL https://raw.githubusercontent.com/runkids/veto/main/uninstall.sh | bash -s -- --purge- Run
veto doctorand copy the output - Check GitHub Issues
- Open a new issue with diagnostic output