@julianelda/typos
v1.0.0
Published
Lint/format a single file directly, without touching git — a nano-staged-config-compatible replacement for the naive nano-staged-in-a-hook approach
Readme
typos
In all things shewing thyself a pattern of good works.
Lint/format a single edited file — safe for Claude Code hooks, no git involved.
Reads a repo's existing .nano-staged.json and runs the matching
lint/format commands against a single file path, replicating
nano-staged's command
execution semantics without any git staging — safe to call concurrently
from a Claude Code PostToolUse hook.
Usage
Wired up as a Claude Code hook, in .claude/settings.json:
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit|MultiEdit",
"hooks": [
{
"type": "command",
"command": "typos"
}
]
}
]
}
}Claude Code pipes the tool call's JSON payload to the command's stdin;
typos reads tool_input.file_path from it, finds the nearest
.nano-staged.json by walking up from that file's directory, and runs
whichever configured commands match it. Anything else — a Bash call, no
matching glob pattern, no config found at all — is a silent no-op (exit 0).
Called directly, e.g. to try a config against one file:
echo '{"tool_name":"Write","tool_input":{"file_path":"src/index.ts"}}' \
| typos-c/--config overrides auto-discovery with an explicit config path:
echo '{"tool_name":"Write","tool_input":{"file_path":"src/index.ts"}}' \
| typos --config ./.nano-staged.jsonA failing command's exit code and stderr are surfaced as Claude Code's "blocking feedback" (exit code 2), so Claude sees the actual lint/format error and can self-correct.
See CLAUDE.md for the full design and current implementation status.
