Install Anti-Slop Oxlint Rules
dmmulroy/anti-slop
Installs, updates or migrates the vendored anti-slop Oxlint plugin in a repository, keeping local rule changes and the plugin's license and provenance files.
Rewords a document so its lint checks pass. An agent skill from tbhb/vale-ai-tells.
$ npx skills add tbhb/vale-ai-tells --skill write-prose-fix -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install tbhb/vale-ai-tells write-prose-fix --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/tbhb/vale-ai-tells.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/write-prose-fix .claude/skills/write-prose-fix && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "write-prose-fix" agent skill from https://github.com/tbhb/vale-ai-tells/tree/main/.claude/skills/write-prose-fix into .claude/skills/write-prose-fix/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "write-prose-fix", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/tbhb/vale-ai-tells/tree/main/.claude/skills/write-prose-fixType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add tbhb/vale-ai-tells --skill write-prose-fix -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install tbhb/vale-ai-tells write-prose-fix --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/tbhb/vale-ai-tells.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/write-prose-fix .agents/skills/write-prose-fix && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "write-prose-fix" agent skill from https://github.com/tbhb/vale-ai-tells/tree/main/.claude/skills/write-prose-fix into .agents/skills/write-prose-fix/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "write-prose-fix", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add tbhb/vale-ai-tells --skill write-prose-fix -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install tbhb/vale-ai-tells write-prose-fix --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/tbhb/vale-ai-tells.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/write-prose-fix .cursor/skills/write-prose-fix && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "write-prose-fix" agent skill from https://github.com/tbhb/vale-ai-tells/tree/main/.claude/skills/write-prose-fix into .cursor/skills/write-prose-fix/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "write-prose-fix", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/tbhb/vale-ai-tells.git --path .claude/skills/write-prose-fix--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add tbhb/vale-ai-tells --skill write-prose-fix -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install tbhb/vale-ai-tells write-prose-fix --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/tbhb/vale-ai-tells.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/write-prose-fix .gemini/skills/write-prose-fix && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "write-prose-fix" agent skill from https://github.com/tbhb/vale-ai-tells/tree/main/.claude/skills/write-prose-fix into .gemini/skills/write-prose-fix/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "write-prose-fix", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install tbhb/vale-ai-tells write-prose-fixInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add tbhb/vale-ai-tells --skill write-prose-fix -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/tbhb/vale-ai-tells.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/write-prose-fix .github/skills/write-prose-fix && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "write-prose-fix" agent skill from https://github.com/tbhb/vale-ai-tells/tree/main/.claude/skills/write-prose-fix into .github/skills/write-prose-fix/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "write-prose-fix", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add tbhb/vale-ai-tells --skill write-prose-fix -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install tbhb/vale-ai-tells write-prose-fix --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/tbhb/vale-ai-tells.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/write-prose-fix .opencode/skills/write-prose-fix && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "write-prose-fix" agent skill from https://github.com/tbhb/vale-ai-tells/tree/main/.claude/skills/write-prose-fix into .opencode/skills/write-prose-fix/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "write-prose-fix", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
write-prose-fixRewords a document so its lint checks pass. An agent skill from tbhb/vale-ai-tells.
Write Prose Fix is an agent skill from tbhb/vale-ai-tells. Rewords a document so its lint checks pass. The fix-prose skill invokes this by name.
Its SKILL.md is about 2.8k tokens, which your agent loads only when the skill is triggered. The skill folder holds 3 other files, including scripts (for example `scripts/context.sh` and `tokens.json`).
It sits in Development, covering Linting and formatting. The repository describes itself as: In today's rapidly evolving landscape, vale-ai-tells is a comprehensive, cutting-edge Vale style package that empowers writers to seamlessly delve into the rich tapestry of AI…. The licence is Apache-2.0.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 4c7abc9. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships 1 file in scripts/ (Shell), which the agent can run.
Shell commands in SKILL.md call:
misebashFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Write Prose Fix loads about 2.8k tokens when it runs. Until then it costs about 25 tokens; SKILL.md has 1,766 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
The full file from tbhb/vale-ai-tells at commit 4c7abc9, republished under its Apache-2.0 licence (© tbhb). 1,766 words, ~2,834 tokens.
.claude/skills/write-prose-fix/SKILL.md (or your agent's skills folder). This skill also uses 2 other files; get the full folder from GitHub.Reword one file until its linters report nothing. Someone has already decided what the document says, and that part stays fixed. Change how it reads, and only as far as the findings require.
!bash ${CLAUDE_SKILL_DIR}/scripts/context.sh $ARGUMENTS
Leave the meaning alone. Every claim the document makes survives your pass intact, and so does every number, path, identifier, and name in it.
A finding you can only clear by saying something different is a finding you leave alone. Report it instead. Inventing a claim to please a linter is the worst outcome available here, because it reads as clean and puts words into the document that nobody wrote.
Reword. Don't rewrite.
$ARGUMENTS carries the target first, then the command that judges it. Anything after a -- is what the caller wants addressed, which on a second pass is the findings review-prose-fix returned. Treat those as the work: resolve each and say so.
The context below already ran the command and printed the document, so the findings and the text are both in front of you. Don't re-run the command to see them again.
Never re-run after one edit. Each round costs the same whether it clears one finding or twelve, and the session behind this skill spent half its Bash calls on linters it re-ran a fix at a time.
Stop at any of these:
The session this skill exists for spent thirty-one rounds on one commit message. Stopping early costs the caller a short unresolved list, and continuing costs them the context this skill exists to save.
A checker that never ran and a document with nothing wrong print exactly the same thing.
Vale matches a path against the sections in .vale.ini, and the match is exact. A path that no section names doesn't load any styles, so vale reads the file and applies nothing to it. Vale then prints nothing and exits zero. Measured against this repository, one paragraph of deliberately bad prose draws 13 findings as probe.md and draws zero as probe.txt, zero under a different filename, and zero at the same filename one directory down.
The preceding context answered this before you started. It pushed known-bad text through vale under this document's own path and reported whether the rules are live, so read that line rather than reasoning about it. Where it says UNSCOPED, report BLOCKED and stop. For a run where it went missing, your first lint run is what answers the question:
CLEAN.BLOCKED and say the document may already be clean or the command may not cover this path. Never report CLEAN off a silence you haven't seen the command break.A commit draft is the common case. The section covering one names the file at the repository root, so vale doesn't check a draft anywhere else, or one under any other name.
The rule set names many figurative verbs and still misses the category around them. where this bites, sails through every gate, moving the goalposts, and its blast radius each passed every gate in this repository while somebody was writing the file you are reading now, and each became a rule only after a person noticed it there. Assume the phrase you are about to write sits in that same gap.
Rewording is the whole task here, which makes this run the most likely place for a phrase the gates were never going to question to enter the document.
These hold even though nothing enforces them:
No linter checks these. An independent reviewer does, reading your before and after against each other, and its findings come back to you in also: for another pass. Getting them right the first time is what keeps that loop to one round.
The vale tasks print one self-contained line per finding:
12:5-19 [error] Google.Contractions match="do not" replace_with="don't" msg="Use 'don't' instead of 'do not'."Everything you need is on that line. match gives the exact offending text. replace_with appears whenever the rule includes a replacement, and applying it verbatim beats composing your own. Read the line. Don't search for context the line already contains.
cspell prints its own shape, one line per unknown word with a location.
Run this first, before you read the findings at all:
mise run fix-prose-replacements <target>It applies every finding whose rule carries its own correction, which is roughly a third of a typical run. Contractions, WordList, Semicolons, Ellipses, Ranges, and HeadingPunctuation all qualify. It refuses any finding whose span no longer holds the text the report quoted, so a stale report skips rather than corrupts the line.
What it leaves is the part that needs you. Reading a lookup so you can retype its answer is the cheapest habit to drop here.
Some rules judge a whole block rather than a phrase. The experimental set is where they live: sentence length variance, paragraph length variance, sentence-start repetition, sentence-start entropy, average sentence length, passive density, complex word density, content duplication, transition repetition, and the document-level verb-series count.
Any local edit changes the distribution, so clearing one can trigger a related rule. That antagonism is inherent rather than a defect you can edit around.
Fix them structurally, never by changing content:
Attempt any of these twice at most. Report the finding after that.
ai-tells.VerbTricolon misfires, and a commit message is where it appears most often. The rule looks for three parallel verb phrases in a comma series. Nothing bounds its match to a sentence or a paragraph, and one branch of the rule anchors on a colon, so the : in a Conventional Commits subject counts the subject's verb as part of a series that doesn't exist. Commas placed the wrong way in the body are enough.
It triggers on either shape:
, andBoth span sentence and paragraph boundaries.
The fix that keeps meaning is fewer commas. Splitting a comma clause into two sentences clears it outright, and the prose improves more often than not. Where the sentence really needs its commas, report the finding and say the rule is misfiring. A correction is coming upstream in tbhb/vale-ai-tells.
Treat any rule this way once you've established that nothing clears it. Report it, name what you tried, and leave the text correct.
Correct a real misspelling. That's the easy half.
The other half is a token cspell doesn't know but the document is right to use, such as a dependency name, a proper noun, or an acronym. Adding it to .cspell-words.txt edits a shared project file, which isn't yours to decide. Where naming the concept instead keeps the claim exactly as strong, prefer that: the fuzzing dependency clears both the spelling and the acronym rules. Where the specific token is the point, report the finding along with the line somebody would add.
.vale.ini, the .vale/ styles, .cspell.jsonc, .cspell-words.txt, mise.toml, and the hook configuration.sed, awk, or a shell redirect. Use the file editing tools. This machine runs a hybrid toolchain: sed is GNU, cat is BSD, and timeout is absent. The session behind this skill spent four round trips on commands whose variant it guessed wrong.A script verifies these after you return, comparing the working tree against a baseline recorded before you started. It hashes the style packages directly rather than asking git, so an edit to one git never tracks shows up the same as any other. Reporting a finding you couldn't clear takes one line. Silencing it forces the caller to revert your edit and answer the finding regardless.
Return the block and stop there. Skip the preamble, the running commentary, and the praise. Whoever reads this started the run precisely so they wouldn't have to see the rounds.
PROSE: CLEAN
changed: <one line per class of edit>or, where something survived:
PROSE: PARTIAL
changed: <one line per class of edit, or "nothing">
unresolved:
1. [<rule>] <line>: <the exact text>
why: <what clearing it would cost, in one line>
2. ...or:
PROSE: BLOCKED
reason: <what stopped you>BLOCKED covers a target that doesn't exist, a lint command that fails to run, and a first run that printed nothing. That last one means the document was already clean or the command never covered it, and saying which takes a look the caller has to make. It doesn't cover findings you simply haven't worked yet.
Keep unresolved short and specific. Each entry is a decision someone has to make, so give them the text and the cost rather than a paragraph about the rule.
© tbhb, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 2 other files (scripts) in .claude/skills/write-prose-fix of tbhb/vale-ai-tells.
Open the folder on GitHubat commit 4c7abc9
Write Prose Fix next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Write Prose Fix this skilltbhb/vale-ai-tells | 115 | — | ~2.8k | Automated safety check: Pass | Apache-2.0 | |
| Install Anti-Slop Oxlint Rulesdmmulroy/anti-slop | 5.3k | 1 repos | ~2.2k | Automated safety check: Pass | MIT | |
| Summarise Ecosystem Resultsastral-sh/ruff | 50k | 1 repos | ~2.2k | Automated safety check: Pass | MIT | |
| Minimizing Ty Ecosystem Changesastral-sh/ruff | 50k | — | ~4.6k | Automated safety check: Pass | MIT | |
| Babysit PR To Pass CIsgl-project/sglang | 37k | 2 repos | ~3k | Automated safety check: Pass | Apache-2.0 | |
| Rust Best Practicesfarm-fe/farm | 5.6k | 3 repos | ~1.1k | Automated safety check: Pass | MIT |
dmmulroy/anti-slop
Installs, updates or migrates the vendored anti-slop Oxlint plugin in a repository, keeping local rule changes and the plugin's license and provenance files.
astral-sh/ruff
A skill your agent uses when a user says "summarise ecosystem results", "summarize this ty ecosystem report", "what changed in this ecosystem run?", or asks to summarise or summarize ty ecosystem…
astral-sh/ruff
A skill your agent uses when a user says "minimize this ty ecosystem change", "reproduce this ecosystem result", "investigate a primer difference", "investigate a mypyprimer difference"…
sgl-project/sglang
Start and persistently pursue a goal to babysit an SGLang pull request until selected GitHub Actions workflows pass on the latest PR head.
farm-fe/farm
Guide for writing idiomatic Rust code based on Apollo GraphQL's best practices handbook.
chromedp/chromedp
This skill should be used when the user is writing Go code and needs guidance on Go-specific pedantry: error wrapping with fmt.Errorf and %w, interface design (accept interfaces return structs)…
tbhb/vale-ai-tells
Query a Claude Code transcript without reading it into context, then write the retrospective to disk so it remains available after the session ends.
tbhb/vale-ai-tells
Query a Codex transcript without reading it into context, then write the retrospective to disk so it remains available after the session ends.
tbhb/vale-ai-tells
Diagnose failing pull request checks, reproduce them locally, make focused fixes, commit them through codex-commit, and refresh the published description when needed.
tbhb/vale-ai-tells
Squash merge a pull request. An agent skill from tbhb/vale-ai-tells.
tbhb/vale-ai-tells
Open or update a pull request for the current branch with an independently drafted and reviewed PRAGENTDESC.md.
tbhb/vale-ai-tells
Replay the current branch onto its base and establish that the result is sound.
Categories
Rewords a document so its lint checks pass. An agent skill from tbhb/vale-ai-tells. Write Prose Fix is an agent skill from tbhb/vale-ai-tells. Rewords a document so its lint checks pass.
Write Prose Fix fits situations like: tasks that involve Linting and formatting.
Run `npx skills add tbhb/vale-ai-tells --skill write-prose-fix -a claude-code`. Or copy the skill folder (.claude/skills/write-prose-fix in tbhb/vale-ai-tells) into .claude/skills/write-prose-fix in your project. Claude Code loads it when a task matches its description.
Run `npx skills add tbhb/vale-ai-tells --skill write-prose-fix -a codex`. Or copy the skill folder (.claude/skills/write-prose-fix in tbhb/vale-ai-tells) into .agents/skills/write-prose-fix in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add tbhb/vale-ai-tells --skill write-prose-fix -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/write-prose-fix, .gemini/skills/write-prose-fix, .github/skills/write-prose-fix and .opencode/skills/write-prose-fix in your project.
Going by SKILL.md and its folder, Write Prose Fix needs a shell for the scripts in its folder and the command-line tools its instructions call (mise and bash). Our summary lists: A Bash shell.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Write Prose Fix is published under the Apache-2.0 licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.8k tokens (SKILL.md is roughly 11k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Write Prose Fix: Install Anti-Slop Oxlint Rules (dmmulroy/anti-slop, 5.3k stars), Summarise Ecosystem Results (astral-sh/ruff, 50k stars), Minimizing Ty Ecosystem Changes (astral-sh/ruff, 50k stars) and Babysit PR To Pass CI (sgl-project/sglang, 37k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
tbhb (a GitHub user) maintains it in tbhb/vale-ai-tells, which has 115 GitHub stars. The repository holds 27 skills in this directory. The repository was last updated on October 7, 2026.
Source: tbhb/vale-ai-tells on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.