diff --git a/README.md b/README.md index 82ff039..9059277 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,38 @@ # Scribe -A Claude Code plugin that catches AI-default writing patterns before they ship. +**Make AI-assisted drafts sound like you wrote them.** -Scribe routes every draft through a persona system, picks a varied subset of anti-patterns per run (so two runs never produce the same critique), scores prose on a 0-100 sameness scale, and fixes voice, rhythm, vocabulary, structure, and rhetoric before the book goes to print. +Scribe is a Claude Code plugin for authors, essayists, and editors. It finds the patterns readers recognize as AI prose and rewrites them in a voice that fits your book. -Built for longform authors, essayists, ghostwriters, and editors. Runs a team of specialist agents that plan, draft, edit, and review collaboratively. +``` +/plugin marketplace add raymondware/kern +/plugin install scribe@raymondware +/scribe:revise +``` + +Paste a passage after `/scribe:revise`. Scribe returns the rewrite, a diff, and a 0-100 sameness score. + +### Before + +> In today's fast-paced world, leadership isn't about authority; it's about influence. Great leaders don't just manage teams, but inspire them. By leveraging empathy, clarity, and vision, they unlock the full potential of their organizations. It's important to note that this is not a destination. It is a mindset. + +| Flagged | Pattern | +|---|---| +| "In today's fast-paced world" | `in-todays-fast-paced-world` | +| "isn't about authority; it's about influence" | `negative-positive-restatement` | +| "don't just manage teams, but inspire them" | `not-just-x-but-y-reflex` | +| "empathy, clarity, and vision" | `tricolon-reflex` | +| "leveraging", "unlock the full potential" | `marketing-verb` | +| "It's important to note that" | `its-worth-noting-throat-clearing` | +| "not a destination. It is a mindset." | `negative-positive-restatement` | + +### After + + + +> Teams follow the manager who listens before deciding. She asks what is blocking the work, says plainly which goal matters this quarter, and then lets people do it. + +**18 agents · 31 anti-patterns · 5 writer personas · a different critique subset every run** ## The Problem diff --git a/tests/test_prose_fingerprints.py b/tests/test_prose_fingerprints.py index 3a13cfb..432636d 100644 --- a/tests/test_prose_fingerprints.py +++ b/tests/test_prose_fingerprints.py @@ -40,6 +40,9 @@ def test_detects_contracted_and_comma_spliced_frames(self): "It isn't a tool, it's a mindset.", "This was never about money. It was about respect.", "We don't need more speed. We need impact.", + "Great leaders don't just manage teams, but inspire them.", + "Great leaders don\u2019t just manage teams, they inspire them.", + "The tool doesn't only format code; it rewrites it.", ] for text in cases: with self.subTest(text=text): diff --git a/tools/prose_fingerprints.py b/tools/prose_fingerprints.py index 2de239a..6920321 100644 --- a/tools/prose_fingerprints.py +++ b/tools/prose_fingerprints.py @@ -33,7 +33,17 @@ class Finding: ( "not_just_but", re.compile( - r"\bnot\s+(?:just|only|merely)\b[^.!?;]{0,160}\bbut(?:\s+also)?\b[^.!?]{0,160}", + rf"(?:\bnot|n{_APOS}t)\s+(?:just|only|merely)\b[^.!?;]{{0,160}}\bbut(?:\s+also)?\b[^.!?]{{0,160}}", + re.IGNORECASE, + ), + ), + ( + # "Great leaders don't just manage teams, they inspire them." Same move as + # "not just X, but Y" with the "but" dropped and a pronoun restarting the clause. + "dont_just_comma_claim", + re.compile( + rf"\b(?:do|does|did)n{_APOS}t\s+(?:just|only|merely)\s+\w+[^.!?;]{{0,120}}?" + r"[,;]\s*(?:they|we|you|it|he|she|i)\s+\w+[^.!?]{0,140}", re.IGNORECASE, ), ),