PromptTailor
Model-aware prompt rewriting for Claude Code. Write a rough request — get it rewritten the way your current Claude model works best.
Why
Claude Fable 5, Opus 5, Sonnet 5, and Haiku respond best to different prompt styles — Fable wants goals and constraints in prose (no step lists), Opus over-verifies if you tell it to double-check, Haiku wants small numbered steps. PromptTailor keeps these differences as data (model profiles), detects which model you're running, and rewrites your rough request to match — also routing by task intent (fix / build / research / refactor / docs).
Your input language is preserved: English in → English out, Korean in → Korean out.
Example
$ prompt-tailor "fix the login bug asap, users keep getting logged out" --model fable-5
Users are repeatedly logging out unexpectedly. Before fixing, investigate: exact reproduction steps (when and under what conditions does this happen?), when this started, relevant error logs or console messages, and the login/session management code structure.
Once you've identified the reproduction path and root cause, apply the minimum fix to prevent unintended logouts. Scope: session and login logic only — do not modify other features.
Validation: confirm the issue no longer reproduces through direct testing, or verify that related tests pass.
Notice what happened: vague urgency ("asap") became an investigation directive, a scope boundary, and a validation criterion — and nothing was invented. Unknowns become investigation steps; any added specifics are tagged as assumptions.
Install
As a Claude Code plugin (recommended):
/plugin marketplace add Createyouracccount/PromptTailor
/plugin install prompt-tailor@prompt-tailor
This gives you the /pm command with no path setup.
As a CLI / MCP server:
pip install prompt-tailor # installs `prompt-tailor` and `prompt-tailor-mcp`
Requirements: Python 3.10+, the claude CLI installed and logged in (no separate API key). Verified on macOS/Linux; Windows untested.
Usage
prompt-tailor "rough request" --model fable-5 # rewrite for a target model
prompt-tailor "rough request" --json # JSON output
prompt-tailor "rough request" --concise # faster, condensed meta-prompt
Inside Claude Code — /pm rough request: rewrites for your session's detected model, shows a one-line change summary, then executes the rewritten request. In auto mode, add the permission rule printed by claude-code/install.sh so prompts containing risky-looking words (e.g. "docker prune") aren't false-positive blocked — the backend only rewrites text.
Hook auto mode (opt-in) — rewrite every prompt automatically via a UserPromptSubmit hook. Run bash claude-code/install.sh for the settings snippet. Escape hatch: include #raw in a prompt to pass it through untouched. Prompts under 6 tokens or over 800 chars are skipped; if a rewrite doesn't finish within 28s it fails open (your original prompt goes through).
Cursor / any MCP client — a built-in stdio MCP server exposes refine_prompt(raw, target_model, concise):
// ~/.cursor/mcp.json
{ "mcpServers": { "prompt-tailor": { "command": "prompt-tailor-mcp" } } }
claude mcp add prompt-tailor -- prompt-tailor-mcp # register in Claude Code
Same input, different models (real outputs)
Input: 로그인 버그 고쳐줘 ("fix the login bug" — Korean in, Korean out):
target fable-5 |
target haiku-4-5 |
|---|---|
| Prose: symptoms to identify first, then "find the cause and apply the simplest fix; verify by test or manual check". No step lists. | Step 1 locate the bug (error message? where?) → Step 2 fix ([assumption] tagged) → Step 3 test with valid/invalid credentials → deliverable: fixed code + one-line commit message. |
Full texts in eval/results.json.
Measured cost (n=2, 2026-08-15)
| What you pay | Measured |
|---|---|
| Per rewrite call (haiku) | ≈$0.03 API-equivalent · ~1.8k output tokens · 18–33s wall. ~29.5k input tokens, but ~99% is claude -p's own system prompt (cached: ~8k cache-write + ~21.6k cache-read); the meta-prompt itself adds only hundreds |
| Hook context injection | +527 input tokens in your main conversation (measured as token delta), and it stays in history for the rest of the session |
| Subscription users | No per-call bill — it consumes usage quota instead |
Raw data: runs/cost_measurement.json, method: eval/measure_cost.py.
Evidence — including the negative result
Every claim is backed by ledgered experiments (blind pairwise LLM judging; LOOP_LOG.md):
- Prompt quality (golden set of 20 vague requests): 20/20 judged better than the original (clarity 5.0, fidelity 4.8, actionability 5.0) — EVAL.md
- Model profiles produce structurally different rewrites: 5/5; intent routing beat profile-only meta 4–1–1
- Task outcome pilot (n=3): the raw prompt won 3–0. On already-clear, self-contained codegen tasks run headless, rewriting hurt: it inflated scope, its investigation directives stalled a run, and its verification demands made the executor fabricate test results — eval/ab_task_outcome_results.json
What this means: the measured benefit is on vague, underspecified requests — the golden set's territory. Already-clear requests should be left alone, so since v0.2.0 the rewriter runs a clarity gate first: if your request is already specific it returns it untouched (action: keep; the hook then injects nothing). Gate accuracy on a balanced 40-prompt benchmark: 39/40 (98%) — vague recall 20/20, clear recall 19/20. Dataset, runner, and the one miss are documented in BENCHMARK.md.
What we do NOT guarantee
- Higher task success is not proven. Prompt-quality wins are judge-based; the only outcome data so far is the 3-task pilot above, which the raw prompt won.
- The rewriter occasionally adds specifics without an
[assumption]tag (fidelity 4.8, not 5.0), and can misclassify intent. - All experiments are small-n, single-LLM-judge, and were run in this repo's environment.
Development
python3 -m unittest discover tests # 37 offline tests, no LLM calls
python3 eval/run_eval.py # golden-set evaluation (spawns claude)
Project docs (Korean): PLAN.md · ARCHITECTURE.md · RESEARCH.md · gate criteria in GATES.md.
License
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file prompt_tailor-0.2.0.tar.gz.
File metadata
- Download URL: prompt_tailor-0.2.0.tar.gz
- Upload date:
- Size: 24.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8e4ad553a9caba99b6087ca98f74967cba3c20bbb89b7b7da392db1c60866891
|
|
| MD5 |
33cbb807b88436257c2d628ac514ebec
|
|
| BLAKE2b-256 |
2e97fa712d642a6ad910ebdf6b0eafe6b24d259415daead86f7cd9eeeb0ed4e5
|
Provenance
The following attestation bundles were made for prompt_tailor-0.2.0.tar.gz:
Publisher:
publish.yml on Createyouracccount/PromptTailor
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
prompt_tailor-0.2.0.tar.gz -
Subject digest:
8e4ad553a9caba99b6087ca98f74967cba3c20bbb89b7b7da392db1c60866891 - Sigstore transparency entry: 2478213207
- Sigstore integration time:
-
Permalink:
Createyouracccount/PromptTailor@c4964970da6264ca31eba59d176f82eb2135fba4 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/Createyouracccount
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@c4964970da6264ca31eba59d176f82eb2135fba4 -
Trigger Event:
release
-
Statement type:
File details
Details for the file prompt_tailor-0.2.0-py3-none-any.whl.
File metadata
- Download URL: prompt_tailor-0.2.0-py3-none-any.whl
- Upload date:
- Size: 22.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
19808f47c7c8989c0cd60e976b1bad29766a69793cbdb5803f69f9c3f93fc867
|
|
| MD5 |
fc1a5471bf5c2e8af1d3c96f288d3431
|
|
| BLAKE2b-256 |
6c622e906e3820c85232f297592cd7b8596237baf1e8c60317ae8fb40f274138
|
Provenance
The following attestation bundles were made for prompt_tailor-0.2.0-py3-none-any.whl:
Publisher:
publish.yml on Createyouracccount/PromptTailor
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
prompt_tailor-0.2.0-py3-none-any.whl -
Subject digest:
19808f47c7c8989c0cd60e976b1bad29766a69793cbdb5803f69f9c3f93fc867 - Sigstore transparency entry: 2478213283
- Sigstore integration time:
-
Permalink:
Createyouracccount/PromptTailor@c4964970da6264ca31eba59d176f82eb2135fba4 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/Createyouracccount
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@c4964970da6264ca31eba59d176f82eb2135fba4 -
Trigger Event:
release
-
Statement type: