slopless 0.2.6 → 0.2.7
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.
- package/README.md +47 -2
- package/dist/cli.js +77 -5
- package/dist/cli.js.map +1 -1
- package/package.json +3 -2
- package/skills/slopless/SKILL.md +63 -0
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
[](/actions/workflows/ci.yml)
|
|
7
7
|
[](package.json)
|
|
8
8
|
|
|
9
|
-
Catch AI and human slop in Markdown without calling an LLM. Slopless ships 50+ deterministic textlint rules and a CLI that emits structured JSON findings.
|
|
9
|
+
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.
|
|
10
10
|
|
|
11
11
|
## Install
|
|
12
12
|
|
|
@@ -20,7 +20,52 @@ npm install -D slopless
|
|
|
20
20
|
npx slopless "docs/**/*.md"
|
|
21
21
|
```
|
|
22
22
|
|
|
23
|
-
Slopless requires a file path, glob, or stdin input. A bare `npx slopless` exits with code `2`.
|
|
23
|
+
Slopless is English-only. It requires a file path, glob, or stdin input. A bare `npx slopless` exits with code `2`.
|
|
24
|
+
|
|
25
|
+
Exit `0` means clean. Exit `1` means findings. Exit `2` means failure.
|
|
26
|
+
|
|
27
|
+
Output is always JSON:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
mkdir -p .slopless/findings
|
|
31
|
+
npx slopless "docs/**/*.md" > ".slopless/findings/$(date +%Y-%m-%d-%H%M%S)--review.json"
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Agent use
|
|
35
|
+
|
|
36
|
+
Agents should run help first:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
npx slopless --help
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Agents should save raw JSON findings under `.slopless/findings/` in the current working directory. Slopless does not choose redirected output filenames, slugs, or timestamps.
|
|
43
|
+
|
|
44
|
+
Install the Codex skill into the current repo:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
npx slopless install-skill codex
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Install the Claude Code skill into the current repo:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
npx slopless install-skill claude
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Both commands install the same `slopless` skill body. Start a new agent session after installing if the skill is not visible.
|
|
57
|
+
|
|
58
|
+
## Ignore rules
|
|
59
|
+
|
|
60
|
+
Use textlint comments around intentional exceptions:
|
|
61
|
+
|
|
62
|
+
```markdown
|
|
63
|
+
<!-- textlint-disable slopless/semantic-thinness -->
|
|
64
|
+
|
|
65
|
+
Something shifted in the room.
|
|
66
|
+
|
|
67
|
+
<!-- textlint-enable slopless/semantic-thinness -->
|
|
68
|
+
```
|
|
24
69
|
|
|
25
70
|
## More
|
|
26
71
|
|
package/dist/cli.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import { cp, rm, stat } from "node:fs/promises";
|
|
2
3
|
import { dirname, resolve } from "node:path";
|
|
3
4
|
import { fileURLToPath } from "node:url";
|
|
4
5
|
import { cli } from "textlint/lib/src/cli.js";
|
|
@@ -7,6 +8,8 @@ const HELP_FLAGS = new Set(["--help", "-h"]);
|
|
|
7
8
|
const STDIN_FLAGS = new Set(["--stdin"]);
|
|
8
9
|
const VERSION_FLAGS = new Set(["--version", "-v"]);
|
|
9
10
|
const CONFIG_FLAGS = new Set(["--config", "-c"]);
|
|
11
|
+
const FORCE_FLAGS = new Set(["--force"]);
|
|
12
|
+
const INSTALL_SKILL_COMMAND = "install-skill";
|
|
10
13
|
const VALUE_OPTIONS = new Set([
|
|
11
14
|
"--cache-location",
|
|
12
15
|
"--config",
|
|
@@ -21,18 +24,28 @@ const VALUE_OPTIONS = new Set([
|
|
|
21
24
|
"-c",
|
|
22
25
|
"-o"
|
|
23
26
|
]);
|
|
24
|
-
const VERSION = "0.2.
|
|
25
|
-
const HELP_TEXT = `Slopless checks Markdown prose for deterministic AI and human slop signals.
|
|
27
|
+
const VERSION = "0.2.7";
|
|
28
|
+
const HELP_TEXT = `Slopless checks English Markdown prose for deterministic AI and human slop signals.
|
|
26
29
|
|
|
27
30
|
It reports concrete patterns that make writing padded, vague, generic,
|
|
28
|
-
formulaic, or mechanically careless. Output is always
|
|
31
|
+
formulaic, or mechanically careless. It is English-only. Output is always
|
|
32
|
+
textlint JSON.
|
|
29
33
|
|
|
30
34
|
Install:
|
|
31
35
|
npm install -D slopless
|
|
32
36
|
|
|
33
37
|
Run:
|
|
34
38
|
npx slopless "docs/**/*.md"
|
|
35
|
-
npx slopless draft.md > slopless.json
|
|
39
|
+
npx slopless draft.md > .slopless/findings/2026-05-18-150000--draft.json
|
|
40
|
+
|
|
41
|
+
Agent run:
|
|
42
|
+
npx slopless --help
|
|
43
|
+
mkdir -p .slopless/findings
|
|
44
|
+
npx slopless "docs/**/*.md" > ".slopless/findings/$(date +%Y-%m-%d-%H%M%S)--review.json"
|
|
45
|
+
|
|
46
|
+
Agent skill install:
|
|
47
|
+
npx slopless install-skill codex
|
|
48
|
+
npx slopless install-skill claude
|
|
36
49
|
|
|
37
50
|
Package script:
|
|
38
51
|
{
|
|
@@ -43,6 +56,7 @@ Package script:
|
|
|
43
56
|
|
|
44
57
|
Default behavior:
|
|
45
58
|
- A file path, glob, or stdin input is required.
|
|
59
|
+
- Slopless is English-only.
|
|
46
60
|
- Output is always JSON.
|
|
47
61
|
- Exit 0 means no findings.
|
|
48
62
|
- Exit 1 means Slopless found prose issues.
|
|
@@ -63,9 +77,14 @@ What it is not for:
|
|
|
63
77
|
|
|
64
78
|
Useful forms:
|
|
65
79
|
npx slopless --stdin --stdin-filename draft.md
|
|
66
|
-
npx slopless "docs/**/*.md" > slopless.json
|
|
80
|
+
npx slopless "docs/**/*.md" > .slopless/findings/review.json
|
|
67
81
|
npx slopless "docs/**/*.md" --quiet
|
|
68
82
|
|
|
83
|
+
Agent storage convention:
|
|
84
|
+
Agents should save raw JSON findings inside .slopless/findings/ in the
|
|
85
|
+
current working directory. Slopless does not choose filenames, slugs, or
|
|
86
|
+
timestamps for redirected output.
|
|
87
|
+
|
|
69
88
|
Ignore one rule:
|
|
70
89
|
<!-- textlint-disable slopless/semantic-thinness -->
|
|
71
90
|
|
|
@@ -76,6 +95,26 @@ Ignore one rule:
|
|
|
76
95
|
Unsupported:
|
|
77
96
|
--format and -f are rejected. JSON is the only output format.
|
|
78
97
|
`;
|
|
98
|
+
function skillDestination(target) {
|
|
99
|
+
switch (target) {
|
|
100
|
+
case "claude":
|
|
101
|
+
return ".claude/skills/slopless";
|
|
102
|
+
case "codex":
|
|
103
|
+
return ".agents/skills/slopless";
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
function isSkillTarget(value) {
|
|
107
|
+
return value === "claude" || value === "codex";
|
|
108
|
+
}
|
|
109
|
+
async function pathExists(path) {
|
|
110
|
+
try {
|
|
111
|
+
await stat(path);
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
79
118
|
function hasFormatOverride(args) {
|
|
80
119
|
return args.some((arg, index) => FORMAT_FLAGS.has(arg) ||
|
|
81
120
|
arg.startsWith("--format=") ||
|
|
@@ -110,6 +149,26 @@ function packageRoot() {
|
|
|
110
149
|
function packageNodeModules() {
|
|
111
150
|
return resolve(packageRoot(), "..");
|
|
112
151
|
}
|
|
152
|
+
async function installSkill(target, force) {
|
|
153
|
+
const source = resolve(packageRoot(), "skills", "slopless");
|
|
154
|
+
const destination = resolve(process.cwd(), skillDestination(target));
|
|
155
|
+
if ((await pathExists(destination)) && !force) {
|
|
156
|
+
process.stderr.write(`Slopless skill already exists at ${skillDestination(target)}. Re-run with --force to replace it.\n`);
|
|
157
|
+
return 2;
|
|
158
|
+
}
|
|
159
|
+
if (force) {
|
|
160
|
+
await rm(destination, { force: true, recursive: true });
|
|
161
|
+
}
|
|
162
|
+
await cp(source, destination, { recursive: true });
|
|
163
|
+
process.stdout.write([
|
|
164
|
+
`Installed Slopless skill for ${target}:`,
|
|
165
|
+
`${skillDestination(target)}/SKILL.md`,
|
|
166
|
+
"",
|
|
167
|
+
`Start a new ${target === "codex" ? "Codex" : "Claude Code"} session before relying on automatic skill discovery.`,
|
|
168
|
+
`If the skill is not visible, load ${skillDestination(target)}/SKILL.md as context.`
|
|
169
|
+
].join("\n") + "\n");
|
|
170
|
+
return 0;
|
|
171
|
+
}
|
|
113
172
|
async function readStdin() {
|
|
114
173
|
let text = "";
|
|
115
174
|
const stream = process.stdin.setEncoding("utf8");
|
|
@@ -128,6 +187,19 @@ async function main() {
|
|
|
128
187
|
process.stdout.write(`${VERSION}\n`);
|
|
129
188
|
return 0;
|
|
130
189
|
}
|
|
190
|
+
if (userArgs[0] === INSTALL_SKILL_COMMAND) {
|
|
191
|
+
const target = userArgs[1];
|
|
192
|
+
if (!isSkillTarget(target)) {
|
|
193
|
+
process.stderr.write("Usage: slopless install-skill codex|claude [--force]\n");
|
|
194
|
+
return 2;
|
|
195
|
+
}
|
|
196
|
+
const extraArgs = userArgs.slice(2);
|
|
197
|
+
if (extraArgs.some((arg) => !FORCE_FLAGS.has(arg))) {
|
|
198
|
+
process.stderr.write("Usage: slopless install-skill codex|claude [--force]\n");
|
|
199
|
+
return 2;
|
|
200
|
+
}
|
|
201
|
+
return installSkill(target, hasFlag(extraArgs, FORCE_FLAGS));
|
|
202
|
+
}
|
|
131
203
|
if (hasFormatOverride(userArgs)) {
|
|
132
204
|
process.stderr.write("slopless always writes JSON output. Remove --format / -f.\n");
|
|
133
205
|
return 2;
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "slopless",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.7",
|
|
4
4
|
"description": "Deterministic textlint rules for detecting slop in prose.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -24,11 +24,12 @@
|
|
|
24
24
|
"lint:css": "stylelint --max-warnings 0 \"styles/**/*.css\"",
|
|
25
25
|
"spellcheck": "cspell .",
|
|
26
26
|
"typecov": "type-coverage --at-least 100",
|
|
27
|
-
"validate": "npm run build && npm run lint && npm run lint:css && npm run format:check && npm run spellcheck && npm run typecov && g3ts
|
|
27
|
+
"validate": "npm run build && npm run lint && npm run lint:css && npm run format:check && npm run spellcheck && npm run typecov && scripts/validate-g3ts.sh"
|
|
28
28
|
},
|
|
29
29
|
"files": [
|
|
30
30
|
"dist",
|
|
31
31
|
"README.md",
|
|
32
|
+
"skills",
|
|
32
33
|
"slopless.textlintrc.json"
|
|
33
34
|
],
|
|
34
35
|
"bin": {
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: slopless
|
|
3
|
+
description: Use Slopless to review English Markdown for deterministic AI and human slop signals, including vague phrasing, formulaic prose, weak rhythm, filler, cliches, and readability issues.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Slopless
|
|
7
|
+
|
|
8
|
+
Use this skill when asked to review English Markdown prose for AI slop, human slop, weak phrasing, cliches, filler, formulaic prose, or readability problems.
|
|
9
|
+
|
|
10
|
+
## Scope
|
|
11
|
+
|
|
12
|
+
- Slopless is English-only.
|
|
13
|
+
- Slopless emits JSON only.
|
|
14
|
+
- Slopless reports findings. It does not rewrite prose.
|
|
15
|
+
- Do not use Slopless as a fact checker.
|
|
16
|
+
|
|
17
|
+
## Required Workflow
|
|
18
|
+
|
|
19
|
+
1. Run `npx slopless --help` before the first Slopless run in the session.
|
|
20
|
+
2. Create `.slopless/findings` in the current working directory.
|
|
21
|
+
3. Run Slopless on the requested Markdown files, folders, globs, or stdin.
|
|
22
|
+
4. Save raw JSON output under `.slopless/findings/`.
|
|
23
|
+
5. Use a timestamped filename that identifies the input.
|
|
24
|
+
6. If the user asks for explanation, summarize the saved JSON findings for the user.
|
|
25
|
+
7. Do not leave the only useful result in a temp directory.
|
|
26
|
+
|
|
27
|
+
## Commands
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
mkdir -p .slopless/findings
|
|
31
|
+
npx slopless "docs/**/*.md" > ".slopless/findings/$(date +%Y-%m-%d-%H%M%S)--docs-review.json"
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
mkdir -p .slopless/findings
|
|
36
|
+
npx slopless draft.md > ".slopless/findings/$(date +%Y-%m-%d-%H%M%S)--draft.json"
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
mkdir -p .slopless/findings
|
|
41
|
+
npx slopless --stdin --stdin-filename draft.md > ".slopless/findings/$(date +%Y-%m-%d-%H%M%S)--stdin-draft.json"
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Output Handling
|
|
45
|
+
|
|
46
|
+
- Exit `0`: no findings.
|
|
47
|
+
- Exit `1`: findings were reported.
|
|
48
|
+
- Exit `2`: command failed before linting.
|
|
49
|
+
- Treat exit `1` as successful execution with prose findings.
|
|
50
|
+
- Read the JSON before explaining results.
|
|
51
|
+
- Preserve rule IDs, file paths, line numbers, and excerpts when summarizing.
|
|
52
|
+
|
|
53
|
+
## Ignore Rules
|
|
54
|
+
|
|
55
|
+
Use textlint comments when a finding is intentionally ignored:
|
|
56
|
+
|
|
57
|
+
```markdown
|
|
58
|
+
<!-- textlint-disable slopless/semantic-thinness -->
|
|
59
|
+
|
|
60
|
+
Something shifted in the room.
|
|
61
|
+
|
|
62
|
+
<!-- textlint-enable slopless/semantic-thinness -->
|
|
63
|
+
```
|