尚未收集仓库信息。
尚未检测到更新。GitHub 发布版本后会显示在这里。
Catch the tells of machine-written prose. Deterministic LLM cliche checker with a Claude Code hook.
翻译准备中
正在加载完整 README。
查看完整 README ↗Catch the tells of machine-written prose before a person reads it.
Website: https://cliche-cc.netlify.app
cliche is a small deterministic checker for LLM cliches: delve, in short, the
it's not X, it's Y frame, sentence runs that echo the same skeleton, and about a hundred
more. Same text in, same hits out, no model in the loop. Run it by hand, wire it into
Claude Code as a hook so outbound messages get checked before they send, or ask Claude to
run it with the /cliche skill.
curl -fsSL https://raw.githubusercontent.com/jah2488/cliche/main/install.sh | bash
It clones into ~/.local/share/cliche, links cliche into ~/.local/bin, and offers to
add the /cliche skill. It never edits your Claude Code settings; it prints the hook
entries for you to paste. Needs git and node 18+.
Update any time:
cliche update
To install by hand, clone the repo and put cliche on your PATH.
cliche draft.md # check a file
pbpaste | cliche # check stdin
cliche --json draft.md # machine-readable
cliche --group house f.md # one rule group
cliche --only colon-triple f # one pattern, including the default-off ones
cliche --ignore no-chain f # drop patterns by id
cliche --list # every pattern and its group
cliche update # pull the latest patterns and rules
Exit 0 clean, 1 hits found, 2 usage error.
Code is exempt: fenced and indented blocks, inline code, URLs, and blockquotes are blanked before matching, so a cliche inside a code sample never blocks a send.
not X, it's Y), compliance narration (as you asked), in short recaps,
smoking gun, load-bearing, and a full sentence used to introduce a list. Turn off any of them with
--ignore, or run upstream alone with --group upstream.colon-triple is off by default, on upstream's own advice: it is noisy in technical
writing. Reach it with --only.
hook.js runs in two modes.
pretooluse blocks outbound tool calls whose prose has hits: Slack, Gmail, Linear and
Notion writes, gh pr and gh issue bodies via Bash, and Artifact publishes. Claude gets
the hit list and rewrites before trying again.
stop checks Claude's own final reply when it runs past 280 characters and hands the hits
back as context, without blocking.
Any parse or read failure exits 0, so a bug here never wedges a send. CLICHE_SKIP=1 in
the environment lets one call through for a genuine false positive.
The installer prints these entries with your paths filled in. Add them under hooks in
~/.claude/settings.json:
"PreToolUse": [{
"matcher": "Bash|Artifact|mcp__.*Slack.*|mcp__.*Gmail.*|mcp__.*Linear.*|mcp__.*Notion.*",
"hooks": [{ "type": "command", "command": "node ~/.local/share/cliche/hook.js pretooluse", "timeout": 10 }]
}],
"Stop": [{
"hooks": [{ "type": "command", "command": "node ~/.local/share/cliche/hook.js stop", "timeout": 10 }]
}]
./sync.sh re-fetches upstream's page and re-extracts lib/upstream-patterns.js and
lib/upstream-tests.js. Neither file is hand-edited. Run node test.js after: upstream's
own self-tests run against the extraction, so a breaking upstream change shows up as a
test failure rather than as silently wrong output.
node test.js
Upstream's 192 self-tests (extraction fidelity) plus ours: the house patterns, the code
exemptions, the tool-field extraction, the hook's exit codes as real subprocesses, and
cliche update against a throwaway clone.
MIT for this project. The vendored upstream files are Apache 2.0, Simon Willison; see
NOTICE and lib/LICENSE-upstream.