[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-81079":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":13,"stars7d":16,"stars30d":16,"stars90d":15,"forks30d":15,"starsTrendScore":17,"compositeScore":18,"rankGlobal":10,"rankLanguage":10,"license":19,"archived":20,"fork":20,"defaultBranch":21,"hasWiki":22,"hasPages":22,"topics":23,"createdAt":10,"pushedAt":10,"updatedAt":24,"readmeContent":25,"aiSummary":26,"trendingCount":15,"starSnapshotCount":15,"syncStatus":16,"lastSyncTime":27,"discoverSource":28},81079,"pilcrow","SamGalanakis\u002Fpilcrow","SamGalanakis","A skill suite for writing","https:\u002F\u002Fpilcrow.ink\u002F",null,"JavaScript",45,1,43,0,2,3,44.1,"MIT License",false,"main",true,[],"2026-06-12 04:01:31","# pilcrow ¶\n\n**pilcrow** turns the LLM in your AI harness into the editor it should be. A prose linter and harness skill anchored in classical style guides (Strunk, Williams, Zinsser, Pinker, Orwell, King): mechanical checks for what regex catches, LLM-judged ones for what it can't. Docs and catalog: [pilcrow.ink](https:\u002F\u002Fpilcrow.ink).\n\nCatches AI tells as one feature among many. Works for prose you wrote, prose the model wrote, and everything in between.\n\nInspired by [impeccable.style](https:\u002F\u002Fimpeccable.style\u002F): same idea, applied to writing. Detection-only. Findings carry line, column, excerpt, and an optional suggestion. The engine never edits.\n\n**Bare invocation triages.** Run `\u002Fpilcrow` with no arguments. The skill finds the prose in scope, runs lint, identifies the genre, and proposes an ordered sequence of editor commands tuned to the piece. The plan gates on confirmation.\n\nEvery editor command applies three meta-disciplines: a reflex-rewrite catalog, a proposal ritual that surfaces and rejects LLM defaults, and a slop self-test on the editor's own output.\n\nThe full rule catalog lists 50 deterministic and 22 LLM-judged base rules at [pilcrow.ink\u002Frules.html](https:\u002F\u002Fpilcrow.ink\u002Frules.html). Per-genre extras add 76 more LLM rules across 39 leaves at [pilcrow.ink\u002Fgenres.html](https:\u002F\u002Fpilcrow.ink\u002Fgenres.html).\n\n## Install\n\nGlobal, recommended:\n\n```\nnpm install -g pilcrow-ink\n```\n\nThe package on npm is `pilcrow-ink`; the binary it installs is `pilcrow`.\n\nOr per-project without installing:\n\n```\nnpx pilcrow-ink audit drafts\u002F\n```\n\nAdd the skill to your AI harness (Claude Code, Cursor, Gemini CLI, Codex\u002FAgents, OpenCode, Kiro, Pi, Qoder, Trae, GitHub Copilot):\n\n```\ncd your-project\npilcrow skills install            # auto-detects which harness dirs exist\npilcrow skills install --all      # install into every supported provider\npilcrow skills update             # re-sync after `npm update -g pilcrow-ink`\npilcrow skills check              # show installed version + content-hash status\npilcrow skills cleanup            # remove pilcrow installs under deprecated names\n```\n\n`install` and `update` use a content hash, not just the version string, so they detect a copy that's already on the current version but was edited locally. Modified installs are skipped with a notice; pass `--force` to overwrite. `cleanup` removes orphan skill folders left behind when pilcrow renames a sub-skill (verifies each is pilcrow-owned before deleting).\n\n### Without the npm package\n\nThe skill is committed at `skills\u002Fpilcrow\u002F`, so you can pull it straight from GitHub without installing `pilcrow-ink` first:\n\n```\nnpx skills add SamGalanakis\u002Fpilcrow          # via skills.sh (skills.sh\u002FSamGalanakis\u002Fpilcrow)\n```\n\nOr add it as a Claude Code plugin marketplace:\n\n```\n\u002Fplugin marketplace add SamGalanakis\u002Fpilcrow\n\u002Fplugin install pilcrow@pilcrow\n```\n\nBoth routes copy the skill as-is. The deterministic linter still needs the `pilcrow` binary on PATH (`npm i -g pilcrow-ink` or `npx pilcrow-ink`); without it the interpretive lenses fall back to manual reads. The Cowork zip below bundles the binary.\n\n### Claude Cowork\n\nCowork installs plugins from a zip, not from npm. Every [release](https:\u002F\u002Fgithub.com\u002FSamGalanakis\u002Fpilcrow\u002Freleases\u002Flatest) ships a `pilcrow-cowork.zip` asset. Download it, then in Cowork: Customize : Plugins : Install : upload the zip. Invoke with `\u002Fpilcrow audit`, `\u002Fpilcrow polish`, and the rest.\n\nThe zip bundles the compiled CLI (it has no npm dependencies), so the 50-rule deterministic linter runs inside Cowork's sandbox; only `node` need be present. To build the zip yourself: `npm run build:cowork` writes it to `dist\u002Fpilcrow-cowork.zip`.\n\n## CLI\n\nFive engine commands:\n\n```\npilcrow audit [paths...] [--ignore-quoted]   Human-readable findings (default)\npilcrow lint  [paths...] [--ignore-quoted]   JSON output for LLM consumption\npilcrow critique [path] [--genre slug]       Print the LLM-critique prompt\npilcrow rules [--json]                       List all rules\npilcrow skills \u003Csubcommand>                  Install or update the skill in your AI harness\n```\n\nReads stdin if no paths. Recurses directories, scanning `.md`, `.mdx`, `.markdown`, `.txt`, `.html`, `.htm`.\n\nHTML support strips `\u003Cscript>`, `\u003Cstyle>`, `\u003Cpre>`, and `\u003Ccode>` content; decodes common entities; treats closing block tags as sentence breaks. Pass `--ignore-quoted` to skip phrases inside straight or curly double quotes; useful when prose discusses AI tells without quoting them in backticks.\n\n## Editor commands\n\nEditor commands sit on top of the engine. Each loads its own reference file with a methodology drawn from a classical style guide. They're invoked through the skill, not the CLI binary: `\u002Fpilcrow \u003Ccommand> \u003Ctarget>` in any AI harness with the skill installed.\n\n| Command | Anchor | What it does |\n|---|---|---|\n| `polish` | Strunk & White, Zinsser | Final pre-ship pass; triages findings into ship-blockers, worth-fixing, taste-calls |\n| `humanize` | Wikipedia *Signs of AI writing* | Strip AI tells while preserving voice; classifies findings into vocabulary, cadence, template, fossil |\n| `tighten` | Williams *Style* | Cut zombie nouns and weak verbs; per-sentence rewrites with the buried action surfaced |\n| `clarify` | Pinker *Sense of Style*, Orwell | Reduce reader's working-memory load; per-passage rewrites with mental-model commentary |\n| `pace` | King *On Writing*, Strunk | Restore rhythm; cadence histogram plus split\u002Fmerge proposals |\n| `lead` | Zinsser on leads | Sharpen openings; finds the buried lede, proposes three alternative first sentences |\n| `verify` | journalism fact-check tradition | Surface load-bearing claims; classify each as unsupported \u002F vague \u002F hedged \u002F unchecked |\n| `aloud` | aural reading tradition | Play the prose back via OpenAI TTS in an interactive session; gates on writer response |\n| `argue` | Toulmin \u002F IBIS \u002F Argdown | Map the argument structure; surface supports, objections, and load-bearing unstated premises; generate the strongest counter and check coverage |\n\nAn editor command is not a rule filter. Each defines its own procedure, rubric, and output. See `skills\u002Fpilcrow\u002Freference\u002F\u003Ccommand>.md` for the playbooks.\n\n## Project commands\n\nProject commands act on the repo, not on a single passage. They capture the writer's voice so editor proposals sound like the writer.\n\n| Command | What it does |\n|---|---|\n| `document` | Scan existing prose. Find recurring moves: phrases, cadences, punctuation tics. Draft `VOICE.md` with citations and open questions |\n| `teach` | Interview the writer. Refine an existing `VOICE.md` by answering open questions, confirming Signatures, and editing Taboos; or create one from scratch |\n| `craft` | End-to-end essay writing with gates: shape → draft → critique → polish; respects `VOICE.md` |\n\nEach writes to disk only after explicit confirmation. Once `VOICE.md` exists, every editor command reads it on invocation and weights findings accordingly.\n\n`teach` captures four axes for editor commands:\n\n- **genre**: a slug from the taxonomy. Common ones: `essay`, `tutorial`, `readme`, `postmortem`, `cv`, `fiction`. Full tree at [pilcrow.ink\u002Fgenres.html](https:\u002F\u002Fpilcrow.ink\u002Fgenres.html).\n- **audience**: a concrete reader, optionally one of the built-in personas\n- **stance**: `claim` \u002F `explain` \u002F `persuade` \u002F `narrate`\n- **method**: `outliner` \u002F `discovery` \u002F `iterative` \u002F `model-drafter`\n\n`craft` reads `method:` and runs one of four phase-2 variants: outline-first for outliners, free first pass for discovery, paragraph-gated for iterative, rewrite-the-model for model-drafter.\n\nEach genre leaf adds 1–2 LLM lint targets specific to that genre (e.g., `postmortem-counterfactual` flags `should have` \u002F `could have` framing; `cv-vague-impact` flags `drove growth` without a number; `error-message-blame-user` flags `You entered an invalid X`). Pass `--genre \u003Cslug>` to `critique` and the prompt merges the base 22 rules with the active leaf's additions, walking the parent chain.\n\n## Cross-cutting references\n\nThe skill's `reference\u002F` folder contains underscore-prefixed files loaded by multiple commands:\n\n| File | Content |\n|---|---|\n| `_ai-tell-catalog.md` | Exhaustive AI-tell catalog organized by class (vocabulary, cadence, template, fossil) |\n| `_readers.md` | Reader personas (skeptical engineer, busy executive, casual blog reader, fellow expert, undergraduate) |\n| `_cadence-theory.md` | King and Strunk on rhythm: sentence-length variation, fragment use, parallel triplets in moderation |\n| `_genres.md` | Genre taxonomy: 12 families, parent rules, path inference |\n| `genres\u002F\u003Cslug>.md` | Per-leaf Demands \u002F Forbids \u002F Tolerates \u002F AI tells \u002F LLM lint additions (one file per leaf, ≤ 50 lines) |\n\nUniversal writing laws, the editor reflex catalog, the proposal ritual, and the editor slop test are inlined in the parent `SKILL.md`; they apply to every command without an explicit load. The four files above carry content the command references load explicitly when they need it.\n\n## Pin \u002F unpin\n\nTurn `\u002Fpilcrow polish` into `\u002Fpolish` (and back) for commands you repeat on every piece:\n\n```\nnode skills\u002Fpilcrow\u002Fscripts\u002Fpin.mjs pin polish\nnode skills\u002Fpilcrow\u002Fscripts\u002Fpin.mjs unpin polish\n```\n\nThe script writes a redirect skill into every harness directory where pilcrow is installed. Pinned shortcuts carry a marker comment, so `unpin` only deletes shortcuts it created, never user-owned skills with the same name.\n\n## aloud and TTS\n\n`aloud` plays prose back to you via OpenAI TTS in an interactive session: walkthrough, full read, targeted (only the paragraphs `pace` flagged), or compare two passages. It depends on the [OpenAI speech skill](https:\u002F\u002Fgithub.com\u002Fopenai\u002Fskills\u002Ftree\u002Fmain\u002Fskills\u002F.curated\u002Fspeech) (Apache 2.0).\n\nSet up:\n\n```\nexport OPENAI_API_KEY=...\n# python3 + the openai package (install once)\npython3 -m pip install openai\n```\n\nThe lens auto-resolves the speech skill. If it's installed in your harness (`.claude\u002Fskills\u002Fspeech\u002F`, `.cursor\u002Fskills\u002Fspeech\u002F`, etc.) it uses that; otherwise it fetches a pinned snapshot into `\u002Ftmp\u002Fpilcrow\u002Fskills\u002Fspeech\u002F`.\n\nAudio is cached in `\u002Ftmp\u002Fpilcrow\u002Faloud\u002F\u003Csha256>.mp3`. Replays across sessions are free. A 14-day mtime GC sweep runs on every `aloud` invocation. Per-piece voice and speed live in `VOICE.md` (`aloud-voice:`, `aloud-speed:`, `default-aloud-mode:`).\n\n## Rules\n\n**50 deterministic** (regex + fuzzy stem matching, no LLM):\n\n| Group | Rules |\n|---|---|\n| AI phrasebank | `ai-tell-phrasebank`, `overused-words`, `antithesis-cadence`, `throat-clearing-openers`, `cliche-closers`, `meta-discourse`, `copula-dodge` |\n| AI fossils | `signoff-chatbot`, `sycophant-opener`, `disclaimer-tail`, `citation-artifact`, `placeholder-leak` |\n| Phrase | `corporate-cliche`, `cliche-list`, `wordy-phrases`, `redundant-pairs`, `weasel-hedges`, `vague-quantifiers` |\n| Density | `em-dash-density`, `adverb-density`, `nominalization-density`, `boosters`, `passive-voice`, `pronoun-density-low`, `parenthetical-aside-density`, `inline-bold-emphasis` |\n| Cadence | `sentence-length-monotony`, `sentence-too-long`, `paragraph-monotony`, `parallel-triplet-density`, `transition-stacking`, `repeated-words-window`, `noun-stacking`, `anaphora-cadence`, `fragment-cadence`, `hero-tagline-imperative`, `from-x-to-y`, `present-participle-tail` |\n| Consistency | `dash-style-inconsistency`, `quote-style-inconsistency`, `oxford-comma-inconsistency` |\n| Weak constructions | `there-is-there-are`, `expletives`, `negation-of-negation`, `pronoun-it-vague` |\n| Markdown shape | `bullet-bold-lead`, `title-case-headers`, `colon-headline`, `decorative-emoji`, `false-precision-headline` |\n\n**22 LLM-judged base rules** (surfaced as a prompt the model evaluates):\n`buried-lede`, `voice-consistency`, `mixed-metaphor`, `claim-without-support`, `missing-stakes`, `distinctive-vs-generic`, `abstract-without-concrete`, `showing-vs-telling`, `transition-coherence`, `register-mismatch`, `excessive-balance`, `redundant-thesis`, `marketing-template-cadence`, `sycophantic-tone`, `stakes-inflation`, `false-reframe`, `invented-concept-label`, `listicle-disguise`, `one-point-dilution`, `unsupported-claim`, `feature-tally`, `instruction-as-copy`.\n\n**76 genre-specific LLM rules** across 39 leaves, merged into the prompt when `critique --genre \u003Cslug>` is set. Browse the full taxonomy at [pilcrow.ink\u002Fgenres.html](https:\u002F\u002Fpilcrow.ink\u002Fgenres.html).\n\nDeterministic rules cover patterns regex can pin down with low false positives. LLM rules cover semantic and rhetorical judgments: was the move empty, were the stakes inflated, is the passage a list pretending to be prose. Genre rules cover patterns that fire usefully only in one context; `postmortem-counterfactual` is meaningless in fiction, and `cv-vague-impact` would over-fire in an essay.\n\n## Fuzzy matching\n\nPhrase rules tokenize and stem before comparing, so `delve` \u002F `delves` \u002F `delving` \u002F `delved` all match one phrase entry. One inserted word is allowed between phrase tokens (`delve deeply into` matches `delve into`). Apostrophes are stripped (`Let's` matches `lets`).\n\n## Layout\n\n```\nengine\u002F         the rules engine: 50 deterministic + 22 LLM base rules + per-genre extras (generated)\ncli\u002F            the pilcrow binary and the skills subcommand\nskills\u002Fpilcrow\u002F the skill, shipped verbatim — what skills.sh, the plugin, and `pilcrow skills install` all copy\ndocs\u002F           the GitHub Pages site\n```\n\n## Develop\n\n```\nnpm install\nnpm run build\nnpm test\nnode cli\u002Fdist\u002Findex.js audit README.md\n```\n\n## Release\n\nTrunk-based. Everything ships from `main`. To cut a release:\n\n```\nnpm run release -- --bump patch --dry-run    # rehearse\nnpm run release -- --bump patch              # bump + tag + GitHub release\nnpm publish                                  # separate, manual\n```\n\nThe script bumps `package.json`, syncs `skills\u002Fpilcrow\u002FSKILL.md` and `docs\u002Findex.html`, commits, pushes, tags `v\u003Cversion>`, and creates a GitHub release with auto-extracted commit notes. The Pages workflow redeploys `pilcrow.ink` from the bump commit. `npm publish` stays manual so npm credentials never leave your machine.\n\nUse `--bump major|minor|patch` to bump in one step, or omit `--bump` if you already edited the version yourself.\n\n## License\n\nMIT. See [LICENSE](.\u002FLICENSE).\n","Pilcrow 是一个旨在提升写作质量的技能套件。它结合了正则表达式检查与大型语言模型（LLM）判断，依据经典风格指南如斯特伦克、威廉姆斯等对文本进行校验，提供机械性错误检测及基于AI的语义建议。项目支持多种使用场景，包括人工撰写的文本、AI生成的内容及其混合体，并且能够识别文本类型，为不同类型的文稿定制编辑指令序列。适用于需要高质量文本输出的个人或团队，特别是那些希望在保留作者原意的同时改进文本流畅性和准确性的用户。","2026-06-11 04:03:26","CREATED_QUERY"]