slopless 0.2.20 → 0.2.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/README.md +51 -27
  2. package/package.json +2 -10
package/README.md CHANGED
@@ -2,44 +2,35 @@
2
2
 
3
3
  [![npm](https://img.shields.io/npm/v/slopless?label=npm)](https://www.npmjs.com/package/slopless)
4
4
  [![downloads](https://img.shields.io/npm/dm/slopless)](https://www.npmjs.com/package/slopless)
5
- [![bundle size](https://img.shields.io/bundlephobia/minzip/slopless?label=minzip)](https://bundlephobia.com/package/slopless)
6
5
  [![install size](https://packagephobia.com/badge?p=slopless)](https://packagephobia.com/result?p=slopless)
7
6
  [![license](https://img.shields.io/npm/l/slopless)](LICENSE)
8
7
  [![node](https://img.shields.io/badge/node-22%2B-brightgreen)](package.json)
9
8
 
10
9
  [![ci](https://img.shields.io/github/actions/workflow/status/seochecks-ai%2Fslopless/ci.yml?branch=main&label=ci)](/actions/workflows/ci.yml)
11
- [![scorecard](https://api.scorecard.dev/projects/github.com/seochecks-ai/slopless/badge)](https://scorecard.dev/viewer/?uri=github.com/seochecks-ai/slopless)
12
10
  [![socket](https://socket.dev/api/badge/npm/package/slopless)](https://socket.dev/npm/package/slopless)
13
- [![snyk advisor](https://snyk.io/advisor/npm-package/slopless/badge.svg)](https://snyk.io/advisor/npm-package/slopless)
14
11
 
15
- Catch AI and human slop in English Markdown without calling an LLM. Slopless ships 50+ deterministic textlint rules and a CLI that emits structured JSON findings.
12
+ Give it to your writing agent and it stops handing you AI-slop prose. Slopless is a deterministic linter - a textlint preset and a zero-config CLI - that flags the LLM tells (hollow framing, fake contrasts, hedging, em-dash tics, vacuous closers, and many more) so the agent rewrites until the text reads human. No model calls, no API key.
16
13
 
17
14
  ## What it catches
18
15
 
19
- Given this paragraph (typical LLM prose):
16
+ Given this paragraph of confident-sounding slop:
20
17
 
21
18
  ```markdown
22
- In today's rapidly evolving landscape, it's important to note that AI tools
23
- are revolutionizing how we work - truly transforming workflows in
24
- unprecedented ways. By harnessing the power of large language models, teams
25
- can delve into complex challenges, streamline operations, and unlock new
26
- possibilities. But what does this really mean for you? In essence, the
27
- future belongs to those who embrace these tools today. Not just to keep up,
28
- not just to stay competitive, but to thrive.
19
+ Let me be honest: in a world where everyone is racing to ship, most teams
20
+ forget the basics. We do not sell software. We sell outcomes. Everyone knows
21
+ the best products feel effortless. At the end of the day, the future belongs
22
+ to the teams that slow down to think.
29
23
  ```
30
24
 
31
- `npx slopless` returns nine findings across seven rules:
25
+ `npx slopless` flags six findings across five rules - structure and rhetoric, not just a word list:
32
26
 
33
27
  ```
34
- [slopless/generic-signposting] it's important to note
35
- [slopless/prohibited-phrases] it's important to note
36
- [slopless/llm-vocabulary] landscape
37
- [slopless/llm-vocabulary] delve
38
- [slopless/prohibited-words] delve
39
- [slopless/prohibited-words] unlock
40
- [slopless/prohibited-phrases] the future belongs to
41
- [slopless/negation-reframe] Not just X, not just Y, but Z
42
- [slopless/flesch-kincaid] Flesch Reading Ease 56.05 (keep >= 61)
28
+ [slopless/boilerplate-framing] let me be honest
29
+ [slopless/prohibited-phrases] in a world where
30
+ [slopless/negation-reframe] We do not sell software. We sell outcomes.
31
+ [slopless/universalizing-claims] everyone knows
32
+ [slopless/cliches] at the end of the day
33
+ [slopless/prohibited-phrases] the future belongs to
43
34
  ```
44
35
 
45
36
  Full JSON output is the default. See the [Rules](https://github.com/seochecks-ai/slopless/wiki/Rules) page for the complete inventory.
@@ -48,6 +39,7 @@ Full JSON output is the default. See the [Rules](https://github.com/seochecks-ai
48
39
 
49
40
  ```bash
50
41
  npm install -D slopless
42
+ npx slopless --help
51
43
  npx slopless install-skill codex
52
44
  npx slopless install-skill claude
53
45
  ```
@@ -61,14 +53,18 @@ Use the Slopless skill. Check this Markdown, rewrite the prose, and keep iterati
61
53
  Loop:
62
54
 
63
55
  1. Install Slopless.
64
- 2. Install the agent skill for Codex or Claude Code.
65
- 3. Tell the writing agent to use the skill.
66
- 4. Let the agent run Slopless, rewrite, and rerun until the JSON output has no findings.
67
- 5. Profit.
56
+ 2. Read the core help (`npx slopless --help`).
57
+ 3. Install the agent skill for Codex or Claude Code.
58
+ 4. Tell the writing agent to use the skill.
59
+ 5. Let the agent run Slopless, rewrite, and rerun until the JSON output has no findings.
60
+ 6. Profit.
61
+
62
+ ## Set up the CLI
68
63
 
69
- ## Direct CLI Use
64
+ The CLI bundles textlint, so it needs no separate textlint install and no `.textlintrc`. This is the recommended path for writing agents and one-off checks.
70
65
 
71
66
  ```bash
67
+ npm install -D slopless
72
68
  npx slopless "docs/**/*.md"
73
69
  ```
74
70
 
@@ -83,6 +79,30 @@ mkdir -p .slopless/findings
83
79
  npx slopless "docs/**/*.md" > ".slopless/findings/$(date +%Y-%m-%d-%H%M%S)--review.json"
84
80
  ```
85
81
 
82
+ ## Set up the textlint preset
83
+
84
+ If you already run [textlint](https://textlint.github.io/), add slopless as a preset instead. It runs through your existing textlint, alongside your other rules and `.textlintrc`, and supports textlint's output formatters (the CLI is always JSON).
85
+
86
+ ```bash
87
+ npm install -D slopless textlint
88
+ ```
89
+
90
+ Add `preset-slopless` to your `.textlintrc.json`:
91
+
92
+ ```json
93
+ {
94
+ "rules": {
95
+ "preset-slopless": true
96
+ }
97
+ }
98
+ ```
99
+
100
+ ```bash
101
+ npx textlint "docs/**/*.md"
102
+ ```
103
+
104
+ Findings use the same `slopless/<rule>` ids as the CLI. Turn off individual rules with `"preset-slopless": { "cliches": false }`. To honor the `<!-- textlint-disable -->` blocks below, also `npm install -D textlint-filter-rule-comments` and add `"filters": { "comments": true }` to the config.
105
+
86
106
  ## Agent Use
87
107
 
88
108
  Agents should run help first:
@@ -144,6 +164,10 @@ This confirms the tarball you installed was built in the published source reposi
144
164
 
145
165
  [![Star History Chart](https://api.star-history.com/svg?repos=seochecks-ai/slopless&type=Date)](https://star-history.com/#seochecks-ai/slopless&Date)
146
166
 
167
+ ## Credits
168
+
169
+ [Graham Rowe](https://github.com/grahamrowe82/antislop), thanks for giving me new ideas for classes of slop to detect. Your lib is now fully incorporated with your permission.
170
+
147
171
  ---
148
172
 
149
173
  Developed by [seochecks.ai](https://seochecks.ai) to keep content specific, useful, and recognizably human.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "slopless",
3
- "version": "0.2.20",
3
+ "version": "0.2.22",
4
4
  "description": "Deterministic textlint rules and CLI for catching prose slop in English Markdown.",
5
5
  "keywords": [
6
6
  "textlint",
@@ -124,7 +124,6 @@
124
124
  "textlint-util-to-string": "3.3.4"
125
125
  },
126
126
  "devDependencies": {
127
- "@double-great/stylelint-a11y": "3.4.13",
128
127
  "@eslint-community/eslint-plugin-eslint-comments": "4.7.1",
129
128
  "@types/node": "22.19.19",
130
129
  "@typescript-eslint/eslint-plugin": "8.59.4",
@@ -132,15 +131,9 @@
132
131
  "cspell": "10.0.0",
133
132
  "eslint": "10.4.0",
134
133
  "eslint-plugin-import-x": "4.16.2",
135
- "eslint-plugin-regexp": "3.1.0",
136
134
  "eslint-plugin-sonarjs": "4.0.3",
137
135
  "eslint-plugin-unicorn": "64.0.0",
138
- "g3ts-eslint-plugin-style-policy": "0.1.3",
139
- "jscpd": "4.2.3",
140
136
  "prettier": "3.8.3",
141
- "stylelint": "17.12.0",
142
- "stylelint-config-standard": "40.0.0",
143
- "stylelint-config-tailwindcss": "1.0.1",
144
137
  "syncpack": "15.3.1",
145
138
  "type-coverage": "2.29.7",
146
139
  "typescript": "6.0.3"
@@ -150,9 +143,8 @@
150
143
  "format": "prettier --write .",
151
144
  "format:check": "prettier --check .",
152
145
  "lint": "eslint --max-warnings 0 .",
153
- "lint:css": "stylelint --max-warnings 0 \"styles/**/*.css\"",
154
146
  "spellcheck": "cspell .",
155
147
  "typecov": "type-coverage --strict --at-least 100",
156
- "validate": "pnpm run build && node scripts/verify-cli-version.mjs && pnpm run lint && pnpm run lint:css && prettier --check . && cspell . && type-coverage --strict --at-least 100"
148
+ "validate": "pnpm run build && node scripts/verify-cli-version.mjs && pnpm run lint && prettier --check . && cspell . && type-coverage --strict --at-least 100"
157
149
  }
158
150
  }