Tooling & Lab
prompt-lift
Claude Code mod: one press rewrites a vague prompt from your CLAUDE.md and skills
3 min read · 631 words
prompt-lift is a Claude Code mod, an in-process hooks module rather than a skill, that rewrites a vague draft into a specific one before it is sent. It is for people who already keep project instructions in CLAUDE.md and rules files and want those applied to every prompt without retyping them. It has a single author (178 of 178 commits) and was renamed from prompt-master at v0.4.0; it is not the prompt-master skill.
- Enhance / Send / Undo band — One row above the prompt box shows state, buttons and the call's cost; nothing is sent until Send or Enter, and Undo and Redo swap the original back until you submit or
/clear. - Context the session already loaded — The rewrite draws on the instruction files and skill listing from the session's own usage breakdown, plus up to eight keyword-matched skill descriptions.
- Per-rung fallback chain — Three rungs (fable, sonnet, haiku by default) run in order, advancing on a refusal, an empty reply, a rate limit, a server error or a timeout, never on your Cancel.
- Nine post-call guards — A rewrite is refused, and the draft kept, if it grows too long, drops too much of the draft, flips a question into a task, or adds a command, URL or path you did not write.
- Cost on the band — Each press is priced from a built-in Bedrock
us.*table; session and day spend caps, off by default, refuse a press before any model call once reached.
At v0.6.0 (2026-10-21): 178 commits by one author and 446 test cases across 46 files (counted by grep, not re-run for this entry), on a repository created 2026-10-17 with 0 stars, 0 forks and a catalogue-listing PR (#341) still open with changes requested.
Architecture
prompt-lift is a hooks module with no build step and no package.json: hooks/hooks.json names register.tsx, which registers six hooks, and the plugin is read live from its folder. At v0.6.0 hooks/ holds 27 TypeScript files and 5,536 lines. All I/O goes through the engine's $ interface; a grep of hooks/ finds no http.fetch, process.run, setTimeout or setInterval.
A press moves through layers: no-model pre-guards, a gather step, prompt assembly, the fallback chain, the post-call guards, then recording of the held Undo pair, usage and spend. The band is one above-prompt row chained above whatever other mods draw.
Gates exist as claude plugin validate ., claude plugin test ., a strict tsc --noEmit against the engine's own type declarations, three headless evals, and scripts/demo.sh, which records the README GIF in a tmux and asciinema sandbox and fails the take if an expected band row is missing.
How It Works
- Press —
ctrl+x b,ctrl+x tabthene, or/prompt-lift <text>. Pre-call guards end the press with no model call for drafts under 3 words or over 4,000 characters, lines starting/,!or#, or a reached spend cap. - Gather — The loaded instruction files are read, each capped at 40,000 characters; skill names come from the same breakdown; a named subproject's
CLAUDE.mdis added when the draft mentions it. - Build — A static block (ten rewrite rules, instruction files, skill names) is sent cached; a dynamic block (draft, matched skills, optional conversation tail) is not. Fourteen envelope tag names are escaped so a hostile
CLAUDE.mdcannot close the envelope; this and the guards are mitigation, not immunity, and the guards sometimes refuse a valid rewrite. - Call the chain — The first rung gets 30 s and later rungs 15 s; the model answers one JSON verdict, either fine or improve with the rewrite.
- Judge — The nine guards run on the rewrite; a refusal leaves the draft untouched and puts the reason on the band.
- Fill and send — The rewrite goes into the box with the inserted words highlighted, the original is held for Undo, and Send or Enter submits it.