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 CHANGED
@@ -6,7 +6,7 @@
6
6
  [![ci](https://img.shields.io/github/actions/workflow/status/agent-quality-controls%2Fslopless/ci.yml?branch=main&label=ci)](/actions/workflows/ci.yml)
7
7
  [![node](https://img.shields.io/node/v/slopless)](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`. Exit `0` means clean, `1` means findings, `2` means failure.
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.5";
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 textlint JSON.
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":"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"}
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.6",
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 validate --path . --rules-only"
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
+ ```