The questions that get asked first.
If your question isn't here, check TROUBLESHOOTING.md or open an issue with the bug-report template.
Editing prose (Russian or English) inside Claude Code without your output reading like LLM output. Plus a few related tools: viral-post generator, fiction/non-fiction wrappers, story-bible auditor, multilingual translation parity checker.
No. Install a subset:
curl -fsSL https://raw.githubusercontent.com/Mikefluff/skills/main/install.sh | bash -s -- --skills writer,viral-textThe wrappers (viral-text, prose-edit, essay-write, pelevin-digression) do need writer installed — they invoke it as their final pass. Linters (style-check, translation-sync, canon-check) are standalone. skills-update is standalone.
If you skip a wrapper's dep, the wrapper will fail at runtime with a clear "missing dependency: writer" message. Easier to just install all 9 and ignore what you don't use — they're plain markdown, near-zero cost on disk.
Yes — the base linter (writer) covers EN as well as RU, with most rules being language-neutral. The structural-synthesis rules (staccato, double-negation, comma-stitching, etc.) and AI-style patterns (intensifiers, pseudo-causal bridges, balance hedges) apply equally to English prose.
The wrappers (prose-edit, essay-write) and viral-text are mostly English-capable but were calibrated against Russian fiction / non-fiction. Output quality in EN is fine; the examples in their references/ are mostly Russian.
translation-sync is by design multilingual (RU / EN / PT-BR). If you only edit one language, use style-check instead.
The skills run entirely inside Claude Code on your machine. Your text goes to Anthropic's API (because that's how Claude Code works in general — no special channel for these skills), and the standard Anthropic data-use policy applies. No third-party services.
Two skills make outbound network calls to GitHub only, and only when you invoke them:
skills-update— fetches the latest release tag and CHANGELOG to compare against your local markerhooks/skills-update-banner.js(only if you opted in viabash scripts/install-hook.sh) — fetches the latest release tag every 24 hours and caches the result locally
If you want to disable the banner's network call entirely, just don't install it (scripts/install-hook.sh is opt-in; default install doesn't touch your ~/.claude/settings.json).
viral-text and essay-write use Claude Code's WebSearch tool — same network constraints as Claude Code itself.
bash install.sh --uninstall # interactive with [y/N]
bash install.sh --uninstall --yes # scriptableOr by hand:
rm -rf ~/.claude/skills/{writer,viral-text,prose-edit,essay-write,style-check,translation-sync,canon-check,pelevin-digression,skills-update}
rm -f ~/.claude/skills/.skills-collection.jsonIf you installed the status-line banner, also: bash scripts/install-hook.sh --uninstall.
Two reasons.
Discovery. Claude Code matches a skill to a user request via the skill's description: field. A single "edit prose" skill would match almost any text task, even when the user wanted something narrow ("make this viral" or "verify the translation parity"). Splitting lets each skill have a sharp, discriminating description.
Composition. Different tasks need different rule layers. Viral posts need hooks + 41 viral rules; fiction needs voice rules + canon check; non-fiction needs sources + V/H/P markers. Stacking them as wrappers around a shared base (writer) keeps each one focused while sharing the heavy regex / typography pass.
If you have a use case that none of the 11 fits, the right answer is usually a new skill, not bloating an existing one. See CONTRIBUTING.md.
Not by design. The contract of every wrapper is "output is ready to ship" — that means the writer pass has run. If you want pre-cleanup raw output, you probably want writer clean directly with your text, then layer voice rules manually.
The 23-category regex linter is high-recall by design — it's a pre-check, not the final word. False positives mostly come from:
- Idioms (
"ни рыба ни мясо"triggers DOUBLE_NEG_REGEX) — there's an explicit exception list inskills/writer/references/structural-prose.mdfor these. If you find more, open a PR adding them. - Technical terms (
"нерв"in anatomical context) — the cat 22 NEURAL_METAPHOR rules document the literal-vs-metaphorical distinction. Pass through context to Claude when in doubt. - Anaphora / lestnichny accord / mantra —
skills/essay-write/references/structural-synthesis-keepers.mdlists the 7 patterns where parallelism is a device, not nyeyroslop. The structural detector should skip these.
If the linter still fires on something that's clearly fine, file a bug with the exact fragment — the regex needs tightening.
Two paths:
A. Local override. Edit the relevant file in ~/.claude/skills/<skill>/references/ after install. Your changes survive until the next --update, which overwrites them. Not durable.
B. Upstream contribution. Fork the repo, add your rules to the right references/*.md file, open a PR. See CONTRIBUTING.md. This is the right answer if your rule benefits other users.
Local-only project rules (e.g. project-specific terminology canon for translation-sync) usually go in option A — they're yours alone.
skills-update and the banner hook silently fall back: banner shows nothing, skills-update prints "could not reach GitHub — try again later". Both fail open — your normal Claude Code session is unaffected.
If you hit GitHub's unauthenticated 60-req/hr limit (rare for personal use), wait an hour, or check via bash install.sh --check (which uses the same endpoint).
Yes — but verify if you're paranoid:
curl -fsSL https://raw.githubusercontent.com/Mikefluff/skills/main/install.sh -o /tmp/install.sh
less /tmp/install.sh # read it
bash /tmp/install.shThe installer is pure bash, ~280 lines, well-commented, and does only: enumerate skills from skills.json, cp -R each skill into ~/.claude/skills/, write a marker JSON. No sudo, no system writes outside ~/.claude/skills/, no third-party downloads (only the GitHub release tarball).
The same script lives at install.sh in the repo — pin a specific version if you want reproducibility: bash install.sh --version 1.0.1.
Likely one of:
- Banner needs Node.js installed locally — the hook is a
.jsscript invoked vianode. Runnode --version; if missing, install from nodejs.org or your package manager. - Marker file missing —
~/.claude/skills/.skills-collection.jsonis written byinstall.sh. If you installed by hand (symlinking or copying without the installer), there's no marker, and the banner stays silent. Runbash install.sh --copy-from <repo> --updateto write the marker. - You're on the latest version — the banner only appears when a newer release exists. Run
bash install.sh --check; if it says "up to date", that's why. - Network unreachable — banner fails open after 1.5-second HTTP timeout. Behaves exactly like "no update".
See TROUBLESHOOTING.md for more.
Mostly you don't — they're designed for the Claude Code matcher. But two pieces are CLI-callable:
skills/writer/scripts/lint.py— offline regex linter, runs on any text filescripts/install-hook.sh/scripts/validate.sh/scripts/smoke.sh/scripts/coverage.py— repo maintenance
Everything else (the rule application, voice editing, viral generation, multilingual parity) needs Claude Code as the inference layer.
writerwrites / cleans. Takes raw text → outputs cleaner text. Mutates content.prose-editrewrites with a voice. Wrapswriter, adds fiction voice rules. Also mutates content.style-checkonly reports. Wraps writer + prose-edit + essay-write rules (not the skills themselves) and produces a structured report. Never mutates anything.
Use style-check as a pre-commit gate; use writer / prose-edit / essay-write to actually edit.
Manual, whenever there are real changes — no schedule. Releases used to be cut by a release.yml workflow that parsed commit messages, but it kept picking the wrong major bump on additive commits and was removed.
The maintainer runs make bump-{patch,minor,major}, fills in the CHANGELOG section, then make release to tag. Conventional-commit prefixes still guide which level to pick, but nothing parses them automatically:
feat:→ minorfix:/perf:/refactor:→ patch!after type orBREAKING CHANGE:in body → majordocs:/chore:/style:/ci:/test:→ no release on their own
The status-line banner caches the latest published release for 24 h, so it reflects yesterday's-or-newer state. Full process: docs/VERSIONING.md.
- Bug (a skill misbehaves, installer breaks): open an issue with the bug-report template
- New skill proposal: same — new-skill-proposal template
- Design / open-ended question: Discussions
- Security: see SECURITY.md for the responsible-disclosure flow