Strip AI slop from prose. CLI + Claude Code skill for hard-locking em dashes, banned phrases, and structural cliches in markdown.
Project description
unsloppify
Strip AI slop from your prose. A fast CLI prose linter for markdown, plus a Claude Code skill and output-style for the judgment calls a regex can't make.
uvx unsloppify draft.md # report findings, exit 1 if any
uvx unsloppify draft.md --fix # rewrite safe deterministic fixes in place
uvx unsloppify docs/ --format json # recursive scan, JSON output
Why this exists
Existing Claude skills like stop-slop and anti-ai-slop-writing ask Claude to scan your prose for tells. That works, but it costs tokens and Claude can miss obvious cases.
unsloppify splits the work:
| Tier | Examples | Handled by |
|---|---|---|
| 1. Punctuation | em dashes, smart quotes, ellipsis chars | CLI, auto-fixed |
| 2. Banned phrases | delve into, tapestry, In today's fast-paced world |
CLI, flagged or auto-fixed |
| 3. Structures | binary contrasts, false agency, parataxis | Skill (LLM judgment) |
Run the CLI first to nuke the obvious stuff. Let the skill handle the rest.
Install
uvx unsloppify --help # one-shot, no install
pipx install unsloppify # persistent CLI
uv add --dev unsloppify # as a dev dep in a uv project
Usage
CLI
unsloppify FILE [FILE...] # lint one or more files / directories
--fix # apply safe fixes in place
--format {text,json,github} # output format (default: text)
--severity {error,warning,info} # minimum severity to report
--rules PATH # add custom rules YAML
--list-rules # print bundled rule catalogue
Exit codes: 0 clean, 1 findings present, 2 invocation error.
Pre-commit
Works with pre-commit and prek:
repos:
- repo: https://github.com/petems/unsloppify
rev: v0.1.1
hooks:
- id: unsloppify
With prek:
prek install
prek run --all-files
The hook creates a Python 3.11 environment. If your Git config uses a global
core.hooksPath, make sure that global hook runner chains into
.git/hooks/pre-commit, or Git will not invoke the generated hook.
GitHub Actions
- run: uvx unsloppify docs/ --format github
Claude Code skill
Two ways to install:
Plugin marketplace (recommended for Claude Code):
/plugin marketplace add petems/unsloppify
/plugin install unsloppify@unsloppify
Skills CLI (works with Claude Code, Codex, Cursor, and other agents):
npx skills add petems/unsloppify
Then ask the agent to "unsloppify this draft" and it will invoke the CLI first for the deterministic catches, then do a judgment pass on structures.
Claude Code output style
cp output-styles/unsloppified.md ~/.claude/output-styles/ then /output-style unsloppified. Claude's own responses will avoid em dashes, banned phrases, and structural cliches.
Rule catalogue
unsloppify --list-rules
Or browse src/unsloppify/rules/*.yaml directly. Rules are versioned with the package.
Credit
The vocabulary lists and structural patterns are adapted from MIT-licensed upstream skills. See THIRD_PARTY_NOTICES.md.
License
MIT
Project details
Release history Release notifications | RSS feed
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 unsloppify-0.1.1.tar.gz.
File metadata
- Download URL: unsloppify-0.1.1.tar.gz
- Upload date:
- Size: 49.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ae72a97c3581bb24c2090ace073a712b4cb3055a8dce70475682a7154c682e09
|
|
| MD5 |
ff60e1a59edadc5c8bc663e2c290b329
|
|
| BLAKE2b-256 |
053740a33a8034ed73eb98a0cc0cbe6f10c888cecf52f82af8b6c57287f515ea
|
Provenance
The following attestation bundles were made for unsloppify-0.1.1.tar.gz:
Publisher:
publish.yml on petems/unsloppify
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
unsloppify-0.1.1.tar.gz -
Subject digest:
ae72a97c3581bb24c2090ace073a712b4cb3055a8dce70475682a7154c682e09 - Sigstore transparency entry: 1551572333
- Sigstore integration time:
-
Permalink:
petems/unsloppify@8ac438bb4e824d0017c1137bdf9f973e34d9f0ad -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/petems
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@8ac438bb4e824d0017c1137bdf9f973e34d9f0ad -
Trigger Event:
push
-
Statement type:
File details
Details for the file unsloppify-0.1.1-py3-none-any.whl.
File metadata
- Download URL: unsloppify-0.1.1-py3-none-any.whl
- Upload date:
- Size: 19.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5f1874dd7306492dc4f0af3af7ff246b79ecf3080cdd9720d633ba772c589c26
|
|
| MD5 |
91dd8edc90398fce26ad73822c21fded
|
|
| BLAKE2b-256 |
f405c52dba2ab5fca182fba1c76b1f7336a9b115057a2fd62644a328adb60a63
|
Provenance
The following attestation bundles were made for unsloppify-0.1.1-py3-none-any.whl:
Publisher:
publish.yml on petems/unsloppify
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
unsloppify-0.1.1-py3-none-any.whl -
Subject digest:
5f1874dd7306492dc4f0af3af7ff246b79ecf3080cdd9720d633ba772c589c26 - Sigstore transparency entry: 1551572373
- Sigstore integration time:
-
Permalink:
petems/unsloppify@8ac438bb4e824d0017c1137bdf9f973e34d9f0ad -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/petems
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@8ac438bb4e824d0017c1137bdf9f973e34d9f0ad -
Trigger Event:
push
-
Statement type: