slopless 0.2.5 → 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 +43 -124
- package/dist/adapters/textlint/report.js +51 -0
- package/dist/adapters/textlint/report.js.map +1 -0
- package/dist/adapters/textlint/units.js +28 -0
- package/dist/adapters/textlint/units.js.map +1 -0
- package/dist/cli.js +77 -5
- package/dist/cli.js.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/presets/everything.js +8 -1
- package/dist/presets/everything.js.map +1 -1
- package/dist/registries/academic-slop.js +5 -0
- package/dist/registries/academic-slop.js.map +1 -0
- package/dist/registries/metrics.js +6 -6
- package/dist/registries/metrics.js.map +1 -1
- package/dist/registries/narrative-slop.js +11 -0
- package/dist/registries/narrative-slop.js.map +1 -0
- package/dist/registries/orthography.js +6 -6
- package/dist/registries/orthography.js.map +1 -1
- package/dist/registries/phrases.js +13 -9
- package/dist/registries/phrases.js.map +1 -1
- package/dist/registries/semantic-thinness.js +1 -1
- package/dist/registries/semantic-thinness.js.map +1 -1
- package/dist/registries/syntactic-patterns/authority.js +1 -1
- package/dist/registries/syntactic-patterns/authority.js.map +1 -1
- package/dist/registries/syntactic-patterns/closers.js +4 -4
- package/dist/registries/syntactic-patterns/closers.js.map +1 -1
- package/dist/registries/syntactic-patterns/contrast.js +3 -3
- package/dist/registries/syntactic-patterns/contrast.js.map +1 -1
- package/dist/registries/syntactic-patterns/generalization.js +2 -2
- package/dist/registries/syntactic-patterns/generalization.js.map +1 -1
- package/dist/registries/syntactic-patterns/lead-ins.js +5 -5
- package/dist/registries/syntactic-patterns/lead-ins.js.map +1 -1
- package/dist/registries/syntactic-patterns/llm-artifacts.js +1 -1
- package/dist/registries/syntactic-patterns/llm-artifacts.js.map +1 -1
- package/dist/registries/syntactic-patterns/repetition.js +4 -4
- package/dist/registries/syntactic-patterns/repetition.js.map +1 -1
- package/dist/registries/term-policy.js +2 -2
- package/dist/registries/term-policy.js.map +1 -1
- package/dist/registries/words.js +4 -4
- package/dist/registries/words.js.map +1 -1
- package/dist/reporting/reports.js +92 -0
- package/dist/reporting/reports.js.map +1 -0
- package/dist/reporting/types.js +2 -0
- package/dist/reporting/types.js.map +1 -0
- package/dist/rules/academic-slop/data/tortured-phrases.json +8 -0
- package/dist/rules/academic-slop/tortured-phrases.js +27 -0
- package/dist/rules/academic-slop/tortured-phrases.js.map +1 -0
- package/dist/{families → rules}/metrics/avg-sentence-length.js +8 -4
- package/dist/rules/metrics/avg-sentence-length.js.map +1 -0
- package/dist/{families → rules}/metrics/coleman-liau.js +8 -4
- package/dist/rules/metrics/coleman-liau.js.map +1 -0
- package/dist/{families → rules}/metrics/flesch-kincaid.js +8 -4
- package/dist/rules/metrics/flesch-kincaid.js.map +1 -0
- package/dist/{families → rules}/metrics/gunning-fog.js +8 -4
- package/dist/rules/metrics/gunning-fog.js.map +1 -0
- package/dist/rules/metrics/paragraph-length.js +25 -0
- package/dist/rules/metrics/paragraph-length.js.map +1 -0
- package/dist/{families → rules}/metrics/word-repetition.js +8 -4
- package/dist/rules/metrics/word-repetition.js.map +1 -0
- package/dist/rules/narrative-slop/body-action-density.js +198 -0
- package/dist/rules/narrative-slop/body-action-density.js.map +1 -0
- package/dist/rules/narrative-slop/data/narrative-cliches.json +134 -0
- package/dist/rules/narrative-slop/flat-action-cadence.js +322 -0
- package/dist/rules/narrative-slop/flat-action-cadence.js.map +1 -0
- package/dist/rules/narrative-slop/narrative-cliches.js +46 -0
- package/dist/rules/narrative-slop/narrative-cliches.js.map +1 -0
- package/dist/rules/narrative-slop/perception-verb-density.js +84 -0
- package/dist/rules/narrative-slop/perception-verb-density.js.map +1 -0
- package/dist/{families → rules}/orthography/colon-dramatic.js +11 -7
- package/dist/rules/orthography/colon-dramatic.js.map +1 -0
- package/dist/{families → rules}/orthography/em-dashes.js +11 -7
- package/dist/rules/orthography/em-dashes.js.map +1 -0
- package/dist/{families → rules}/orthography/exclamation-density.js +11 -7
- package/dist/rules/orthography/exclamation-density.js.map +1 -0
- package/dist/{families → rules}/orthography/fake-timestamps.js +11 -7
- package/dist/rules/orthography/fake-timestamps.js.map +1 -0
- package/dist/{families → rules}/orthography/sentence-case.js +7 -2
- package/dist/rules/orthography/sentence-case.js.map +1 -0
- package/dist/{families → rules}/orthography/smart-quotes.js +11 -7
- package/dist/rules/orthography/smart-quotes.js.map +1 -0
- package/dist/rules/phrases/cliches.js +43 -0
- package/dist/rules/phrases/cliches.js.map +1 -0
- package/dist/rules/phrases/corporate-speak.js +32 -0
- package/dist/rules/phrases/corporate-speak.js.map +1 -0
- package/dist/rules/phrases/data/cliche-templates.json +20 -0
- package/dist/{families → rules}/phrases/data/cliches.json +73 -1
- package/dist/rules/phrases/data/corporate-abstraction-patterns.json +80 -0
- package/dist/{families → rules}/phrases/data/corporate-speak.json +0 -3
- package/dist/rules/phrases/data/llm-disclaimer-expansions.json +4 -0
- package/dist/{families → rules}/phrases/data/prohibited-phrases.json +0 -1
- package/dist/rules/phrases/data/redundancy-patterns.json +74 -0
- package/dist/rules/phrases/data/wordiness-patterns.json +53 -0
- package/dist/rules/phrases/humble-bragger.js +30 -0
- package/dist/rules/phrases/humble-bragger.js.map +1 -0
- package/dist/{families → rules}/phrases/jargon-faker.js +11 -7
- package/dist/rules/phrases/jargon-faker.js.map +1 -0
- package/dist/{families → rules}/phrases/llm-disclaimer.js +21 -8
- package/dist/rules/phrases/llm-disclaimer.js.map +1 -0
- package/dist/rules/phrases/prohibited-phrases.js +27 -0
- package/dist/rules/phrases/prohibited-phrases.js.map +1 -0
- package/dist/rules/phrases/redundancy.js +27 -0
- package/dist/rules/phrases/redundancy.js.map +1 -0
- package/dist/{families → rules}/phrases/skunked-terms.js +8 -4
- package/dist/rules/phrases/skunked-terms.js.map +1 -0
- package/dist/{families → rules}/phrases/uncomparables.js +8 -4
- package/dist/rules/phrases/uncomparables.js.map +1 -0
- package/dist/rules/phrases/wordiness.js +27 -0
- package/dist/rules/phrases/wordiness.js.map +1 -0
- package/dist/rules/semantic-thinness/patterns/abstract-personification-line.json +23 -0
- package/dist/rules/semantic-thinness/patterns/emotion-as-substance.json +95 -0
- package/dist/rules/semantic-thinness/patterns/fixed-metaphor-frame.json +32 -0
- package/dist/rules/semantic-thinness/patterns/sensory-instead-of-frame.json +40 -0
- package/dist/rules/semantic-thinness/patterns/summary-fog-transition.json +30 -0
- package/dist/{families → rules}/semantic-thinness/private/pattern-data-a.js +2 -0
- package/dist/rules/semantic-thinness/private/pattern-data-a.js.map +1 -0
- package/dist/rules/semantic-thinness/private/pattern-data-b.js.map +1 -0
- package/dist/rules/semantic-thinness/private/pattern-data-c.js +17 -0
- package/dist/rules/semantic-thinness/private/pattern-data-c.js.map +1 -0
- package/dist/rules/semantic-thinness/private/pattern-data-d.js.map +1 -0
- package/dist/rules/semantic-thinness/private/pattern-data.js.map +1 -0
- package/dist/rules/semantic-thinness/private/pattern-matcher.js.map +1 -0
- package/dist/{families → rules}/semantic-thinness/semantic-thinness.js +11 -7
- package/dist/rules/semantic-thinness/semantic-thinness.js.map +1 -0
- package/dist/{families → rules}/syntactic-patterns/authority/authority-padding.js +11 -7
- package/dist/rules/syntactic-patterns/authority/authority-padding.js.map +1 -0
- package/dist/{families → rules}/syntactic-patterns/closers/affirmation-closers.js +20 -13
- package/dist/rules/syntactic-patterns/closers/affirmation-closers.js.map +1 -0
- package/dist/{families → rules}/syntactic-patterns/closers/boilerplate-conclusion.js +11 -7
- package/dist/rules/syntactic-patterns/closers/boilerplate-conclusion.js.map +1 -0
- package/dist/{families → rules}/syntactic-patterns/closers/false-question.js +11 -7
- package/dist/rules/syntactic-patterns/closers/false-question.js.map +1 -0
- package/dist/{families → rules}/syntactic-patterns/closers/summative-closer.js +11 -7
- package/dist/rules/syntactic-patterns/closers/summative-closer.js.map +1 -0
- package/dist/{families → rules}/syntactic-patterns/contrast/blame-reframe.js +11 -7
- package/dist/rules/syntactic-patterns/contrast/blame-reframe.js.map +1 -0
- package/dist/{families → rules}/syntactic-patterns/contrast/contrastive-aphorism.js +10 -7
- package/dist/rules/syntactic-patterns/contrast/contrastive-aphorism.js.map +1 -0
- package/dist/rules/syntactic-patterns/contrast/negation-reframe.js +24 -0
- package/dist/rules/syntactic-patterns/contrast/negation-reframe.js.map +1 -0
- package/dist/{families → rules}/syntactic-patterns/contrast/private/negation-reframe-matcher.js +22 -5
- package/dist/rules/syntactic-patterns/contrast/private/negation-reframe-matcher.js.map +1 -0
- package/dist/{families → rules}/syntactic-patterns/contrast/private/negation-reframe-parts.js +55 -0
- package/dist/rules/syntactic-patterns/contrast/private/negation-reframe-parts.js.map +1 -0
- package/dist/rules/syntactic-patterns/contrast/private/negative-slop-frames.js +103 -0
- package/dist/rules/syntactic-patterns/contrast/private/negative-slop-frames.js.map +1 -0
- package/dist/{families → rules}/syntactic-patterns/generalization/softening-language.js +11 -7
- package/dist/rules/syntactic-patterns/generalization/softening-language.js.map +1 -0
- package/dist/{families → rules}/syntactic-patterns/generalization/universalizing-claims.js +11 -7
- package/dist/rules/syntactic-patterns/generalization/universalizing-claims.js.map +1 -0
- package/dist/{families → rules}/syntactic-patterns/lead-ins/boilerplate-framing.js +11 -7
- package/dist/rules/syntactic-patterns/lead-ins/boilerplate-framing.js.map +1 -0
- package/dist/{families → rules}/syntactic-patterns/lead-ins/generic-signposting.js +11 -7
- package/dist/rules/syntactic-patterns/lead-ins/generic-signposting.js.map +1 -0
- package/dist/{families → rules}/syntactic-patterns/lead-ins/lesson-framing.js +11 -7
- package/dist/rules/syntactic-patterns/lead-ins/lesson-framing.js.map +1 -0
- package/dist/rules/syntactic-patterns/lead-ins/llm-openers.js +28 -0
- package/dist/rules/syntactic-patterns/lead-ins/llm-openers.js.map +1 -0
- package/dist/{families → rules}/syntactic-patterns/lead-ins/observer-guidance.js +11 -7
- package/dist/rules/syntactic-patterns/lead-ins/observer-guidance.js.map +1 -0
- package/dist/rules/syntactic-patterns/llm-artifacts/data/response-wrapper-patterns.json +33 -0
- package/dist/{families → rules}/syntactic-patterns/llm-artifacts/response-wrapper.js +55 -10
- package/dist/rules/syntactic-patterns/llm-artifacts/response-wrapper.js.map +1 -0
- package/dist/{families → rules}/syntactic-patterns/repetition/demonstrative-emphasis.js +11 -7
- package/dist/rules/syntactic-patterns/repetition/demonstrative-emphasis.js.map +1 -0
- package/dist/{families → rules}/syntactic-patterns/repetition/empty-emphasis.js +11 -7
- package/dist/rules/syntactic-patterns/repetition/empty-emphasis.js.map +1 -0
- package/dist/{families → rules}/syntactic-patterns/repetition/fragment-stacking.js +11 -7
- package/dist/rules/syntactic-patterns/repetition/fragment-stacking.js.map +1 -0
- package/dist/{families → rules}/syntactic-patterns/repetition/triple-repeat.js +13 -9
- package/dist/rules/syntactic-patterns/repetition/triple-repeat.js.map +1 -0
- package/dist/{families → rules}/term-policy/recommended-terms.js +8 -4
- package/dist/rules/term-policy/recommended-terms.js.map +1 -0
- package/dist/{families → rules}/term-policy/required-terms.js +8 -4
- package/dist/rules/term-policy/required-terms.js.map +1 -0
- package/dist/rules/types.js +2 -0
- package/dist/rules/types.js.map +1 -0
- package/dist/{families → rules}/words/hedge-stacking.js +11 -7
- package/dist/rules/words/hedge-stacking.js.map +1 -0
- package/dist/{families → rules}/words/llm-vocabulary.js +8 -4
- package/dist/rules/words/llm-vocabulary.js.map +1 -0
- package/dist/rules/words/prohibited-words.js +21 -0
- package/dist/rules/words/prohibited-words.js.map +1 -0
- package/dist/{families → rules}/words/simplicity.js +11 -7
- package/dist/rules/words/simplicity.js.map +1 -0
- package/dist/shared/matchers/phrases.js +74 -0
- package/dist/shared/matchers/phrases.js.map +1 -1
- package/package.json +57 -49
- package/skills/slopless/SKILL.md +63 -0
- package/dist/families/metrics/avg-sentence-length.js.map +0 -1
- package/dist/families/metrics/coleman-liau.js.map +0 -1
- package/dist/families/metrics/flesch-kincaid.js.map +0 -1
- package/dist/families/metrics/gunning-fog.js.map +0 -1
- package/dist/families/metrics/paragraph-length.js +0 -21
- package/dist/families/metrics/paragraph-length.js.map +0 -1
- package/dist/families/metrics/word-repetition.js.map +0 -1
- package/dist/families/orthography/colon-dramatic.js.map +0 -1
- package/dist/families/orthography/em-dashes.js.map +0 -1
- package/dist/families/orthography/exclamation-density.js.map +0 -1
- package/dist/families/orthography/fake-timestamps.js.map +0 -1
- package/dist/families/orthography/sentence-case.js.map +0 -1
- package/dist/families/orthography/smart-quotes.js.map +0 -1
- package/dist/families/phrases/cliches.js +0 -17
- package/dist/families/phrases/cliches.js.map +0 -1
- package/dist/families/phrases/corporate-speak.js +0 -23
- package/dist/families/phrases/corporate-speak.js.map +0 -1
- package/dist/families/phrases/humble-bragger.js +0 -26
- package/dist/families/phrases/humble-bragger.js.map +0 -1
- package/dist/families/phrases/jargon-faker.js.map +0 -1
- package/dist/families/phrases/llm-disclaimer.js.map +0 -1
- package/dist/families/phrases/prohibited-phrases.js +0 -17
- package/dist/families/phrases/prohibited-phrases.js.map +0 -1
- package/dist/families/phrases/skunked-terms.js.map +0 -1
- package/dist/families/phrases/uncomparables.js.map +0 -1
- package/dist/families/semantic-thinness/private/pattern-data-a.js.map +0 -1
- package/dist/families/semantic-thinness/private/pattern-data-b.js.map +0 -1
- package/dist/families/semantic-thinness/private/pattern-data-c.js +0 -9
- package/dist/families/semantic-thinness/private/pattern-data-c.js.map +0 -1
- package/dist/families/semantic-thinness/private/pattern-data-d.js.map +0 -1
- package/dist/families/semantic-thinness/private/pattern-data.js.map +0 -1
- package/dist/families/semantic-thinness/private/pattern-matcher.js.map +0 -1
- package/dist/families/semantic-thinness/semantic-thinness.js.map +0 -1
- package/dist/families/syntactic-patterns/authority/authority-padding.js.map +0 -1
- package/dist/families/syntactic-patterns/closers/affirmation-closers.js.map +0 -1
- package/dist/families/syntactic-patterns/closers/boilerplate-conclusion.js.map +0 -1
- package/dist/families/syntactic-patterns/closers/false-question.js.map +0 -1
- package/dist/families/syntactic-patterns/closers/summative-closer.js.map +0 -1
- package/dist/families/syntactic-patterns/contrast/blame-reframe.js.map +0 -1
- package/dist/families/syntactic-patterns/contrast/contrastive-aphorism.js.map +0 -1
- package/dist/families/syntactic-patterns/contrast/negation-reframe.js +0 -20
- package/dist/families/syntactic-patterns/contrast/negation-reframe.js.map +0 -1
- package/dist/families/syntactic-patterns/contrast/private/negation-reframe-matcher.js.map +0 -1
- package/dist/families/syntactic-patterns/contrast/private/negation-reframe-parts.js.map +0 -1
- package/dist/families/syntactic-patterns/generalization/softening-language.js.map +0 -1
- package/dist/families/syntactic-patterns/generalization/universalizing-claims.js.map +0 -1
- package/dist/families/syntactic-patterns/lead-ins/boilerplate-framing.js.map +0 -1
- package/dist/families/syntactic-patterns/lead-ins/generic-signposting.js.map +0 -1
- package/dist/families/syntactic-patterns/lead-ins/lesson-framing.js.map +0 -1
- package/dist/families/syntactic-patterns/lead-ins/llm-openers.js +0 -24
- package/dist/families/syntactic-patterns/lead-ins/llm-openers.js.map +0 -1
- package/dist/families/syntactic-patterns/lead-ins/observer-guidance.js.map +0 -1
- package/dist/families/syntactic-patterns/llm-artifacts/response-wrapper.js.map +0 -1
- package/dist/families/syntactic-patterns/repetition/demonstrative-emphasis.js.map +0 -1
- package/dist/families/syntactic-patterns/repetition/empty-emphasis.js.map +0 -1
- package/dist/families/syntactic-patterns/repetition/fragment-stacking.js.map +0 -1
- package/dist/families/syntactic-patterns/repetition/triple-repeat.js.map +0 -1
- package/dist/families/term-policy/recommended-terms.js.map +0 -1
- package/dist/families/term-policy/required-terms.js.map +0 -1
- package/dist/families/words/hedge-stacking.js.map +0 -1
- package/dist/families/words/llm-vocabulary.js.map +0 -1
- package/dist/families/words/prohibited-words.js +0 -17
- package/dist/families/words/prohibited-words.js.map +0 -1
- package/dist/families/words/simplicity.js.map +0 -1
- /package/dist/{families → rules}/phrases/data/skunked-terms.json +0 -0
- /package/dist/{families → rules}/phrases/data/uncomparables.json +0 -0
- /package/dist/{families → rules}/semantic-thinness/patterns/abstract-contrast.json +0 -0
- /package/dist/{families → rules}/semantic-thinness/patterns/abstract-metaphor-claim.json +0 -0
- /package/dist/{families → rules}/semantic-thinness/patterns/body-emotion-shorthand.json +0 -0
- /package/dist/{families → rules}/semantic-thinness/patterns/body-knows.json +0 -0
- /package/dist/{families → rules}/semantic-thinness/patterns/deictic-summary.json +0 -0
- /package/dist/{families → rules}/semantic-thinness/patterns/empty-atmosphere-shift.json +0 -0
- /package/dist/{families → rules}/semantic-thinness/patterns/empty-emotional-weather.json +0 -0
- /package/dist/{families → rules}/semantic-thinness/patterns/empty-scene-state.json +0 -0
- /package/dist/{families → rules}/semantic-thinness/patterns/empty-scene-transition.json +0 -0
- /package/dist/{families → rules}/semantic-thinness/patterns/gaze-choreography.json +0 -0
- /package/dist/{families → rules}/semantic-thinness/patterns/generic-lesson-extraction.json +0 -0
- /package/dist/{families → rules}/semantic-thinness/patterns/generic-pressure-or-stakes.json +0 -0
- /package/dist/{families → rules}/semantic-thinness/patterns/generic-realization.json +0 -0
- /package/dist/{families → rules}/semantic-thinness/patterns/hollow-significance.json +0 -0
- /package/dist/{families → rules}/semantic-thinness/patterns/low-information-physical-blocking.json +0 -0
- /package/dist/{families → rules}/semantic-thinness/patterns/point-is-frame.json +0 -0
- /package/dist/{families → rules}/semantic-thinness/patterns/real-work-begins.json +0 -0
- /package/dist/{families → rules}/semantic-thinness/patterns/silence-as-actor.json +0 -0
- /package/dist/{families → rules}/semantic-thinness/patterns/something-shifted.json +0 -0
- /package/dist/{families → rules}/semantic-thinness/patterns/truth-answer-moves.json +0 -0
- /package/dist/{families → rules}/semantic-thinness/patterns/vague-connective-payoff.json +0 -0
- /package/dist/{families → rules}/semantic-thinness/patterns/vague-threshold-change.json +0 -0
- /package/dist/{families → rules}/semantic-thinness/private/pattern-data-b.js +0 -0
- /package/dist/{families → rules}/semantic-thinness/private/pattern-data-d.js +0 -0
- /package/dist/{families → rules}/semantic-thinness/private/pattern-data.js +0 -0
- /package/dist/{families → rules}/semantic-thinness/private/pattern-matcher.js +0 -0
- /package/dist/{families → rules}/words/data/prohibited-words.json +0 -0
- /package/dist/{families → rules}/words/data/simplicity-pairs.json +0 -0
package/README.md
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
# slopless
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://www.npmjs.com/package/slopless)
|
|
4
|
+
[](https://www.npmjs.com/package/slopless)
|
|
5
|
+
[](LICENSE)
|
|
6
|
+
[](/actions/workflows/ci.yml)
|
|
7
|
+
[](package.json)
|
|
4
8
|
|
|
5
|
-
|
|
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.
|
|
6
10
|
|
|
7
11
|
## Install
|
|
8
12
|
|
|
@@ -10,154 +14,69 @@ It reports patterns that make prose padded, vague, generic, formulaic, or mechan
|
|
|
10
14
|
npm install -D slopless
|
|
11
15
|
```
|
|
12
16
|
|
|
13
|
-
##
|
|
17
|
+
## Quick start
|
|
14
18
|
|
|
15
19
|
```bash
|
|
16
20
|
npx slopless "docs/**/*.md"
|
|
17
|
-
npx slopless draft.md > slopless.json
|
|
18
|
-
cat draft.md | npx slopless --stdin --stdin-filename draft.md
|
|
19
21
|
```
|
|
20
22
|
|
|
21
|
-
|
|
23
|
+
Slopless is English-only. It requires a file path, glob, or stdin input. A bare `npx slopless` exits with code `2`.
|
|
22
24
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
"lint:prose": "slopless \"docs/**/*.md\""
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
```
|
|
25
|
+
Exit `0` means clean. Exit `1` means findings. Exit `2` means failure.
|
|
26
|
+
|
|
27
|
+
Output is always JSON:
|
|
30
28
|
|
|
31
29
|
```bash
|
|
32
|
-
|
|
30
|
+
mkdir -p .slopless/findings
|
|
31
|
+
npx slopless "docs/**/*.md" > ".slopless/findings/$(date +%Y-%m-%d-%H%M%S)--review.json"
|
|
33
32
|
```
|
|
34
33
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
## Behavior
|
|
34
|
+
## Agent use
|
|
38
35
|
|
|
39
|
-
|
|
40
|
-
- Requires no `.textlintrc.json`.
|
|
41
|
-
- Requires no separate `textlint` install.
|
|
42
|
-
- Supports inline `textlint-disable` comments for rule ignores.
|
|
43
|
-
- Emits textlint JSON only.
|
|
44
|
-
- Rejects `--format` and `-f`.
|
|
45
|
-
- Exits `0` for no findings, `1` for prose findings, and `2` for command failure.
|
|
36
|
+
Agents should run help first:
|
|
46
37
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
Ignore one rule for a block:
|
|
38
|
+
```bash
|
|
39
|
+
npx slopless --help
|
|
40
|
+
```
|
|
52
41
|
|
|
53
|
-
|
|
54
|
-
<!-- textlint-disable slopless/semantic-thinness -->
|
|
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.
|
|
55
43
|
|
|
56
|
-
|
|
44
|
+
Install the Codex skill into the current repo:
|
|
57
45
|
|
|
58
|
-
|
|
46
|
+
```bash
|
|
47
|
+
npx slopless install-skill codex
|
|
59
48
|
```
|
|
60
49
|
|
|
61
|
-
|
|
50
|
+
Install the Claude Code skill into the current repo:
|
|
62
51
|
|
|
63
|
-
```
|
|
64
|
-
|
|
52
|
+
```bash
|
|
53
|
+
npx slopless install-skill claude
|
|
54
|
+
```
|
|
65
55
|
|
|
66
|
-
|
|
56
|
+
Both commands install the same `slopless` skill body. Start a new agent session after installing if the skill is not visible.
|
|
67
57
|
|
|
68
|
-
|
|
69
|
-
```
|
|
58
|
+
## Ignore rules
|
|
70
59
|
|
|
71
|
-
|
|
60
|
+
Use textlint comments around intentional exceptions:
|
|
72
61
|
|
|
73
62
|
```markdown
|
|
74
|
-
<!-- textlint-disable -->
|
|
63
|
+
<!-- textlint-disable slopless/semantic-thinness -->
|
|
75
64
|
|
|
76
65
|
Something shifted in the room.
|
|
77
66
|
|
|
78
|
-
<!-- textlint-enable -->
|
|
67
|
+
<!-- textlint-enable slopless/semantic-thinness -->
|
|
79
68
|
```
|
|
80
69
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
## Rules
|
|
84
|
-
|
|
85
|
-
Metrics:
|
|
86
|
-
|
|
87
|
-
- `avg-sentence-length`: average sentence length above 24 words.
|
|
88
|
-
- `paragraph-length`: paragraphs over 6 sentences.
|
|
89
|
-
- `word-repetition`: one non-trivial word repeated over 5 times.
|
|
90
|
-
- `flesch-kincaid`: Flesch Reading Ease below 61.
|
|
91
|
-
- `gunning-fog` and `coleman-liau`: grade scores above 12.
|
|
92
|
-
|
|
93
|
-
Orthography:
|
|
94
|
-
|
|
95
|
-
- `colon-dramatic`: short reveals after a colon, such as `And then: everything changed.`
|
|
96
|
-
- `em-dashes`: closed em dashes.
|
|
97
|
-
- `exclamation-density`: more than 1 exclamation mark per paragraph.
|
|
98
|
-
- `fake-timestamps`: clock specificity, such as `5:47 PM`.
|
|
99
|
-
- `sentence-case`: title-case headings.
|
|
100
|
-
- `smart-quotes`: curly quotes.
|
|
101
|
-
|
|
102
|
-
Phrases and words:
|
|
103
|
-
|
|
104
|
-
- `cliches`: stock phrases, such as `at the end of the day`.
|
|
105
|
-
- `corporate-speak`: business filler, such as `move the needle`.
|
|
106
|
-
- `hedge-stacking`: stacked hedges, such as `might perhaps`.
|
|
107
|
-
- `humble-bragger`: credential lead-ins, such as `in my experience`.
|
|
108
|
-
- `jargon-faker`: borrowed tech metaphors, such as `debug your morning`.
|
|
109
|
-
- `llm-disclaimer`: assistant disclaimers, such as `as an AI language model`.
|
|
110
|
-
- `llm-vocabulary`: common AI diction, such as `delve`.
|
|
111
|
-
- `prohibited-phrases` and `prohibited-words`: package-owned banned lists.
|
|
112
|
-
- `recommended-terms` and `required-terms`: configured missing terms.
|
|
113
|
-
- `simplicity`: complex words with simple replacements, such as `utilize`.
|
|
114
|
-
- `skunked-terms`: contested broad-use terms.
|
|
115
|
-
- `uncomparables`: impossible modifiers, such as `very unique`.
|
|
116
|
-
|
|
117
|
-
Semantic thinness:
|
|
118
|
-
|
|
119
|
-
- `semantic-thinness`: low-information templates, such as `Something shifted in the room.`
|
|
120
|
-
|
|
121
|
-
Syntactic patterns:
|
|
122
|
-
|
|
123
|
-
- `affirmation-closers`: empty certainty endings, such as `and that is the key`.
|
|
124
|
-
- `authority-padding`: soft authority padding, such as `research shows`.
|
|
125
|
-
- `blame-reframe`: blame-to-insight reframes, such as `the problem is not X, it is Y`.
|
|
126
|
-
- `boilerplate-conclusion`: generic endings, such as `in conclusion`.
|
|
127
|
-
- `boilerplate-framing`: generic setup, such as `when it comes to`.
|
|
128
|
-
- `contrastive-aphorism`: slogan contrasts, such as `not faster, but smarter`.
|
|
129
|
-
- `demonstrative-emphasis`: vague `this is what` emphasis.
|
|
130
|
-
- `empty-emphasis`: unsupported importance claims, such as `this matters`.
|
|
131
|
-
- `false-question`: rhetorical questions, such as `isn't that what we all want?`
|
|
132
|
-
- `fragment-stacking`: clipped cadence, such as `Too broad. Too vague. Too late.`
|
|
133
|
-
- `generic-signposting`: generic transitions, such as `it is important to note`.
|
|
134
|
-
- `lesson-framing`: lesson extraction, such as `the lesson is`.
|
|
135
|
-
- `llm-openers`: generic openers, such as `the important thing is`.
|
|
136
|
-
- `negation-reframe`: `not X. It is Y.` constructions.
|
|
137
|
-
- `observer-guidance`: reader-instruction frames, such as `notice how`.
|
|
138
|
-
- `response-wrapper`: chat wrappers, such as `here is a revised version`.
|
|
139
|
-
- `softening-language`: vague softeners, such as `in many ways`.
|
|
140
|
-
- `summative-closer`: summary payoff lines, such as `that is what makes it work`.
|
|
141
|
-
- `triple-repeat`: repeated sentence openers, such as `It is X. It is Y. It is Z.`
|
|
142
|
-
- `universalizing-claims`: broad claims, such as `everyone knows`.
|
|
143
|
-
|
|
144
|
-
## Direct Textlint Use
|
|
145
|
-
|
|
146
|
-
Most users should run `npx slopless "docs/**/*.md"`.
|
|
147
|
-
|
|
148
|
-
The package also exports a textlint preset:
|
|
149
|
-
|
|
150
|
-
```json
|
|
151
|
-
{
|
|
152
|
-
"filters": {
|
|
153
|
-
"comments": true
|
|
154
|
-
},
|
|
155
|
-
"rules": {
|
|
156
|
-
"preset-slopless": true
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
```
|
|
70
|
+
## More
|
|
160
71
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
72
|
+
- [Philosophy](/wiki/Philosophy) - what slopless is for, design principles, why deterministic.
|
|
73
|
+
- [Comparison](/wiki/Comparison) - slopless vs proselint, write-good, alex, vale, default textlint presets.
|
|
74
|
+
- [Rules](/wiki/Rules) - full 50+ rule inventory across seven families.
|
|
75
|
+
- [Behavior](/wiki/Behavior) - CLI flags, exit codes, JSON output shape, direct textlint integration.
|
|
76
|
+
- [Ignore rules](/wiki/Ignore-Rules) - inline `textlint-disable` block syntax.
|
|
77
|
+
- [Thanks](/wiki/Thanks) - direct rule sources, dependencies, and acknowledgments.
|
|
78
|
+
- [Contributing](.github/CONTRIBUTING.md) - open a detailed issue first; PRs must pass the G3TS pre-commit gate.
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
Part of [Agent Quality Controls](https://github.com/agent-quality-controls).
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { textUnitForNode } from "./units.js";
|
|
2
|
+
import { oneToOneReports } from "../../reporting/reports.js";
|
|
3
|
+
function isTextlintTextUnit(unit) {
|
|
4
|
+
return (typeof unit.node === "object" && unit.node !== null && "type" in unit.node);
|
|
5
|
+
}
|
|
6
|
+
export function emitTextlintReport(context, unitsById, report) {
|
|
7
|
+
const unit = unitsById.get(report.unitId);
|
|
8
|
+
if (unit === undefined || !isTextlintTextUnit(unit)) {
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
const padding = report.range.start === report.range.end
|
|
12
|
+
? context.locator.at(report.range.start)
|
|
13
|
+
: context.locator.range([report.range.start, report.range.end]);
|
|
14
|
+
context.report(unit.node, new context.RuleError(report.message, {
|
|
15
|
+
padding
|
|
16
|
+
}));
|
|
17
|
+
}
|
|
18
|
+
export function emitTextlintReports(context, unitsById, reports) {
|
|
19
|
+
for (const report of reports) {
|
|
20
|
+
emitTextlintReport(context, unitsById, report);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export function emitTextlintDetection(context, input) {
|
|
24
|
+
const detection = {
|
|
25
|
+
evidence: input.evidence,
|
|
26
|
+
label: input.label,
|
|
27
|
+
range: input.range,
|
|
28
|
+
ruleId: input.ruleId,
|
|
29
|
+
unitId: input.unit.id
|
|
30
|
+
};
|
|
31
|
+
if (input.data !== undefined) {
|
|
32
|
+
Object.assign(detection, { data: input.data });
|
|
33
|
+
}
|
|
34
|
+
emitTextlintReports(context, new Map([[input.unit.id, input.unit]]), oneToOneReports([detection], () => input.message));
|
|
35
|
+
}
|
|
36
|
+
export function emitTextlintFinding(context, input) {
|
|
37
|
+
const evidence = input.evidence ?? input.message;
|
|
38
|
+
emitTextlintDetection(context, {
|
|
39
|
+
...(input.data === undefined ? {} : { data: input.data }),
|
|
40
|
+
evidence,
|
|
41
|
+
label: input.label ?? input.ruleId,
|
|
42
|
+
message: input.message,
|
|
43
|
+
range: input.range,
|
|
44
|
+
ruleId: input.ruleId,
|
|
45
|
+
unit: textUnitForNode("finding", "text", input.node, evidence)
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
export function emitTextlintNodeFinding(context, input) {
|
|
49
|
+
context.report(input.node, new context.RuleError(input.message));
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/adapters/textlint/report.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { normalizeForMatch } from "../../shared/text/normalize.js";
|
|
2
|
+
import { allParagraphs } from "../../shared/text/sections.js";
|
|
3
|
+
export function paragraphUnits(document) {
|
|
4
|
+
return allParagraphs(document).map((paragraph, index) => ({
|
|
5
|
+
id: `paragraph:${index}`,
|
|
6
|
+
kind: "paragraph",
|
|
7
|
+
node: paragraph.paragraph,
|
|
8
|
+
normalizedText: normalizeForMatch(paragraph.text),
|
|
9
|
+
range: { end: paragraph.source.text.length, start: 0 },
|
|
10
|
+
sourceRangeFor: (range) => ({
|
|
11
|
+
end: paragraph.source.originalEndFor(range.end),
|
|
12
|
+
start: paragraph.source.originalStartFor(range.start)
|
|
13
|
+
}),
|
|
14
|
+
text: paragraph.text
|
|
15
|
+
}));
|
|
16
|
+
}
|
|
17
|
+
export function textUnitForNode(id, kind, node, text) {
|
|
18
|
+
return {
|
|
19
|
+
id,
|
|
20
|
+
kind,
|
|
21
|
+
node,
|
|
22
|
+
normalizedText: normalizeForMatch(text),
|
|
23
|
+
range: { end: text.length, start: 0 },
|
|
24
|
+
sourceRangeFor: (range) => range,
|
|
25
|
+
text
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=units.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"units.js","sourceRoot":"","sources":["../../../src/adapters/textlint/units.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAG9D,MAAM,UAAU,cAAc,CAAC,QAAyB;IACtD,OAAO,aAAa,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QACxD,EAAE,EAAE,aAAa,KAAK,EAAE;QACxB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,SAAS,CAAC,SAAS;QACzB,cAAc,EAAE,iBAAiB,CAAC,SAAS,CAAC,IAAI,CAAC;QACjD,KAAK,EAAE,EAAE,GAAG,EAAE,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE;QACtD,cAAc,EAAE,CAAC,KAAkB,EAAE,EAAE,CAAC,CAAC;YACvC,GAAG,EAAE,SAAS,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC;YAC/C,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC;SACtD,CAAC;QACF,IAAI,EAAE,SAAS,CAAC,IAAI;KACrB,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,EAAU,EACV,IAAsB,EACtB,IAAa,EACb,IAAY;IAEZ,OAAO;QACL,EAAE;QACF,IAAI;QACJ,IAAI;QACJ,cAAc,EAAE,iBAAiB,CAAC,IAAI,CAAC;QACvC,KAAK,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE;QACrC,cAAc,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;QAChC,IAAI;KACL,CAAC;AACJ,CAAC"}
|
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/dist/index.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { everything } from "./presets/everything.js";
|
|
2
|
+
import { academicSlopRules } from "./registries/academic-slop.js";
|
|
2
3
|
import { metricRules } from "./registries/metrics.js";
|
|
4
|
+
import { narrativeSlopRules } from "./registries/narrative-slop.js";
|
|
3
5
|
import { orthographyRules } from "./registries/orthography.js";
|
|
4
6
|
import { phraseRules } from "./registries/phrases.js";
|
|
5
7
|
import { semanticThinnessRules } from "./registries/semantic-thinness.js";
|
|
@@ -7,7 +9,9 @@ import { syntacticPatternRules } from "./registries/syntactic-patterns.js";
|
|
|
7
9
|
import { termPolicyRules } from "./registries/term-policy.js";
|
|
8
10
|
import { wordRules } from "./registries/words.js";
|
|
9
11
|
export const rules = {
|
|
12
|
+
...academicSlopRules,
|
|
10
13
|
...metricRules,
|
|
14
|
+
...narrativeSlopRules,
|
|
11
15
|
...orthographyRules,
|
|
12
16
|
...phraseRules,
|
|
13
17
|
...semanticThinnessRules,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,GAAG,WAAW;IACd,GAAG,gBAAgB;IACnB,GAAG,WAAW;IACd,GAAG,qBAAqB;IACxB,GAAG,qBAAqB;IACxB,GAAG,eAAe;IAClB,GAAG,SAAS;CACb,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,UAAU;CACX,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CAAC,KAAK,CAAC;AAE5C,eAAe;IACb,KAAK;IACL,WAAW;CACZ,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,GAAG,iBAAiB;IACpB,GAAG,WAAW;IACd,GAAG,kBAAkB;IACrB,GAAG,gBAAgB;IACnB,GAAG,WAAW;IACd,GAAG,qBAAqB;IACxB,GAAG,qBAAqB;IACxB,GAAG,eAAe;IAClB,GAAG,SAAS;CACb,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,UAAU;CACX,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CAAC,KAAK,CAAC;AAE5C,eAAe;IACb,KAAK;IACL,WAAW;CACZ,CAAC"}
|
|
@@ -4,6 +4,7 @@ export const everything = {
|
|
|
4
4
|
"authority-padding": true,
|
|
5
5
|
"avg-sentence-length": true,
|
|
6
6
|
"blame-reframe": true,
|
|
7
|
+
"body-action-density": true,
|
|
7
8
|
"boilerplate-conclusion": true,
|
|
8
9
|
"boilerplate-framing": true,
|
|
9
10
|
cliches: true,
|
|
@@ -17,6 +18,7 @@ export const everything = {
|
|
|
17
18
|
"exclamation-density": true,
|
|
18
19
|
"fake-timestamps": true,
|
|
19
20
|
"false-question": true,
|
|
21
|
+
"flat-action-cadence": true,
|
|
20
22
|
"flesch-kincaid": true,
|
|
21
23
|
"fragment-stacking": true,
|
|
22
24
|
"gunning-fog": true,
|
|
@@ -29,11 +31,14 @@ export const everything = {
|
|
|
29
31
|
"llm-openers": true,
|
|
30
32
|
"llm-vocabulary": true,
|
|
31
33
|
"negation-reframe": true,
|
|
34
|
+
"narrative-cliches": true,
|
|
32
35
|
"observer-guidance": true,
|
|
33
36
|
"paragraph-length": true,
|
|
37
|
+
"perception-verb-density": true,
|
|
34
38
|
"prohibited-phrases": true,
|
|
35
39
|
"prohibited-words": true,
|
|
36
40
|
"recommended-terms": true,
|
|
41
|
+
redundancy: true,
|
|
37
42
|
"response-wrapper": true,
|
|
38
43
|
"required-terms": true,
|
|
39
44
|
"sentence-case": true,
|
|
@@ -44,9 +49,11 @@ export const everything = {
|
|
|
44
49
|
"smart-quotes": true,
|
|
45
50
|
"summative-closer": true,
|
|
46
51
|
"triple-repeat": true,
|
|
52
|
+
"tortured-phrases": true,
|
|
47
53
|
uncomparables: true,
|
|
48
54
|
"universalizing-claims": true,
|
|
49
|
-
"word-repetition": true
|
|
55
|
+
"word-repetition": true,
|
|
56
|
+
wordiness: true
|
|
50
57
|
}
|
|
51
58
|
};
|
|
52
59
|
//# sourceMappingURL=everything.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"everything.js","sourceRoot":"","sources":["../../src/presets/everything.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,KAAK,EAAE;QACL,qBAAqB,EAAE,IAAI;QAC3B,mBAAmB,EAAE,IAAI;QACzB,qBAAqB,EAAE,IAAI;QAC3B,eAAe,EAAE,IAAI;QACrB,wBAAwB,EAAE,IAAI;QAC9B,qBAAqB,EAAE,IAAI;QAC3B,OAAO,EAAE,IAAI;QACb,gBAAgB,EAAE,IAAI;QACtB,cAAc,EAAE,IAAI;QACpB,iBAAiB,EAAE,IAAI;QACvB,sBAAsB,EAAE,IAAI;QAC5B,wBAAwB,EAAE,IAAI;QAC9B,WAAW,EAAE,IAAI;QACjB,gBAAgB,EAAE,IAAI;QACtB,qBAAqB,EAAE,IAAI;QAC3B,iBAAiB,EAAE,IAAI;QACvB,gBAAgB,EAAE,IAAI;QACtB,gBAAgB,EAAE,IAAI;QACtB,mBAAmB,EAAE,IAAI;QACzB,aAAa,EAAE,IAAI;QACnB,gBAAgB,EAAE,IAAI;QACtB,gBAAgB,EAAE,IAAI;QACtB,cAAc,EAAE,IAAI;QACpB,qBAAqB,EAAE,IAAI;QAC3B,gBAAgB,EAAE,IAAI;QACtB,gBAAgB,EAAE,IAAI;QACtB,aAAa,EAAE,IAAI;QACnB,gBAAgB,EAAE,IAAI;QACtB,kBAAkB,EAAE,IAAI;QACxB,mBAAmB,EAAE,IAAI;QACzB,kBAAkB,EAAE,IAAI;QACxB,oBAAoB,EAAE,IAAI;QAC1B,kBAAkB,EAAE,IAAI;QACxB,mBAAmB,EAAE,IAAI;QACzB,kBAAkB,EAAE,IAAI;QACxB,gBAAgB,EAAE,IAAI;QACtB,eAAe,EAAE,IAAI;QACrB,mBAAmB,EAAE,IAAI;QACzB,UAAU,EAAE,IAAI;QAChB,eAAe,EAAE,IAAI;QACrB,oBAAoB,EAAE,IAAI;QAC1B,cAAc,EAAE,IAAI;QACpB,kBAAkB,EAAE,IAAI;QACxB,eAAe,EAAE,IAAI;QACrB,aAAa,EAAE,IAAI;QACnB,uBAAuB,EAAE,IAAI;QAC7B,iBAAiB,EAAE,IAAI;
|
|
1
|
+
{"version":3,"file":"everything.js","sourceRoot":"","sources":["../../src/presets/everything.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,KAAK,EAAE;QACL,qBAAqB,EAAE,IAAI;QAC3B,mBAAmB,EAAE,IAAI;QACzB,qBAAqB,EAAE,IAAI;QAC3B,eAAe,EAAE,IAAI;QACrB,qBAAqB,EAAE,IAAI;QAC3B,wBAAwB,EAAE,IAAI;QAC9B,qBAAqB,EAAE,IAAI;QAC3B,OAAO,EAAE,IAAI;QACb,gBAAgB,EAAE,IAAI;QACtB,cAAc,EAAE,IAAI;QACpB,iBAAiB,EAAE,IAAI;QACvB,sBAAsB,EAAE,IAAI;QAC5B,wBAAwB,EAAE,IAAI;QAC9B,WAAW,EAAE,IAAI;QACjB,gBAAgB,EAAE,IAAI;QACtB,qBAAqB,EAAE,IAAI;QAC3B,iBAAiB,EAAE,IAAI;QACvB,gBAAgB,EAAE,IAAI;QACtB,qBAAqB,EAAE,IAAI;QAC3B,gBAAgB,EAAE,IAAI;QACtB,mBAAmB,EAAE,IAAI;QACzB,aAAa,EAAE,IAAI;QACnB,gBAAgB,EAAE,IAAI;QACtB,gBAAgB,EAAE,IAAI;QACtB,cAAc,EAAE,IAAI;QACpB,qBAAqB,EAAE,IAAI;QAC3B,gBAAgB,EAAE,IAAI;QACtB,gBAAgB,EAAE,IAAI;QACtB,aAAa,EAAE,IAAI;QACnB,gBAAgB,EAAE,IAAI;QACtB,kBAAkB,EAAE,IAAI;QACxB,mBAAmB,EAAE,IAAI;QACzB,mBAAmB,EAAE,IAAI;QACzB,kBAAkB,EAAE,IAAI;QACxB,yBAAyB,EAAE,IAAI;QAC/B,oBAAoB,EAAE,IAAI;QAC1B,kBAAkB,EAAE,IAAI;QACxB,mBAAmB,EAAE,IAAI;QACzB,UAAU,EAAE,IAAI;QAChB,kBAAkB,EAAE,IAAI;QACxB,gBAAgB,EAAE,IAAI;QACtB,eAAe,EAAE,IAAI;QACrB,mBAAmB,EAAE,IAAI;QACzB,UAAU,EAAE,IAAI;QAChB,eAAe,EAAE,IAAI;QACrB,oBAAoB,EAAE,IAAI;QAC1B,cAAc,EAAE,IAAI;QACpB,kBAAkB,EAAE,IAAI;QACxB,eAAe,EAAE,IAAI;QACrB,kBAAkB,EAAE,IAAI;QACxB,aAAa,EAAE,IAAI;QACnB,uBAAuB,EAAE,IAAI;QAC7B,iBAAiB,EAAE,IAAI;QACvB,SAAS,EAAE,IAAI;KAChB;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"academic-slop.js","sourceRoot":"","sources":["../../src/registries/academic-slop.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,4CAA4C,CAAC;AAEzE,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,kBAAkB,EAAE,eAAe;CACpC,CAAC"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import avgSentenceLength from "../
|
|
2
|
-
import colemanLiau from "../
|
|
3
|
-
import fleschKincaid from "../
|
|
4
|
-
import gunningFog from "../
|
|
5
|
-
import paragraphLength from "../
|
|
6
|
-
import wordRepetition from "../
|
|
1
|
+
import avgSentenceLength from "../rules/metrics/avg-sentence-length.js";
|
|
2
|
+
import colemanLiau from "../rules/metrics/coleman-liau.js";
|
|
3
|
+
import fleschKincaid from "../rules/metrics/flesch-kincaid.js";
|
|
4
|
+
import gunningFog from "../rules/metrics/gunning-fog.js";
|
|
5
|
+
import paragraphLength from "../rules/metrics/paragraph-length.js";
|
|
6
|
+
import wordRepetition from "../rules/metrics/word-repetition.js";
|
|
7
7
|
export const metricRules = {
|
|
8
8
|
"avg-sentence-length": avgSentenceLength,
|
|
9
9
|
"coleman-liau": colemanLiau,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/registries/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,iBAAiB,MAAM,
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/registries/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,iBAAiB,MAAM,yCAAyC,CAAC;AACxE,OAAO,WAAW,MAAM,kCAAkC,CAAC;AAC3D,OAAO,aAAa,MAAM,oCAAoC,CAAC;AAC/D,OAAO,UAAU,MAAM,iCAAiC,CAAC;AACzD,OAAO,eAAe,MAAM,sCAAsC,CAAC;AACnE,OAAO,cAAc,MAAM,qCAAqC,CAAC;AAEjE,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,qBAAqB,EAAE,iBAAiB;IACxC,cAAc,EAAE,WAAW;IAC3B,gBAAgB,EAAE,aAAa;IAC/B,aAAa,EAAE,UAAU;IACzB,kBAAkB,EAAE,eAAe;IACnC,iBAAiB,EAAE,cAAc;CAClC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import bodyActionDensity from "../rules/narrative-slop/body-action-density.js";
|
|
2
|
+
import flatActionCadence from "../rules/narrative-slop/flat-action-cadence.js";
|
|
3
|
+
import narrativeCliches from "../rules/narrative-slop/narrative-cliches.js";
|
|
4
|
+
import perceptionVerbDensity from "../rules/narrative-slop/perception-verb-density.js";
|
|
5
|
+
export const narrativeSlopRules = {
|
|
6
|
+
"body-action-density": bodyActionDensity,
|
|
7
|
+
"flat-action-cadence": flatActionCadence,
|
|
8
|
+
"perception-verb-density": perceptionVerbDensity,
|
|
9
|
+
"narrative-cliches": narrativeCliches
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=narrative-slop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"narrative-slop.js","sourceRoot":"","sources":["../../src/registries/narrative-slop.ts"],"names":[],"mappings":"AAAA,OAAO,iBAAiB,MAAM,gDAAgD,CAAC;AAC/E,OAAO,iBAAiB,MAAM,gDAAgD,CAAC;AAC/E,OAAO,gBAAgB,MAAM,8CAA8C,CAAC;AAC5E,OAAO,qBAAqB,MAAM,oDAAoD,CAAC;AAEvF,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,qBAAqB,EAAE,iBAAiB;IACxC,qBAAqB,EAAE,iBAAiB;IACxC,yBAAyB,EAAE,qBAAqB;IAChD,mBAAmB,EAAE,gBAAgB;CACtC,CAAC"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import colonDramatic from "../
|
|
2
|
-
import emDashes from "../
|
|
3
|
-
import exclamationDensity from "../
|
|
4
|
-
import fakeTimestamps from "../
|
|
5
|
-
import sentenceCase from "../
|
|
6
|
-
import smartQuotes from "../
|
|
1
|
+
import colonDramatic from "../rules/orthography/colon-dramatic.js";
|
|
2
|
+
import emDashes from "../rules/orthography/em-dashes.js";
|
|
3
|
+
import exclamationDensity from "../rules/orthography/exclamation-density.js";
|
|
4
|
+
import fakeTimestamps from "../rules/orthography/fake-timestamps.js";
|
|
5
|
+
import sentenceCase from "../rules/orthography/sentence-case.js";
|
|
6
|
+
import smartQuotes from "../rules/orthography/smart-quotes.js";
|
|
7
7
|
export const orthographyRules = {
|
|
8
8
|
"colon-dramatic": colonDramatic,
|
|
9
9
|
"em-dashes": emDashes,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orthography.js","sourceRoot":"","sources":["../../src/registries/orthography.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,
|
|
1
|
+
{"version":3,"file":"orthography.js","sourceRoot":"","sources":["../../src/registries/orthography.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,wCAAwC,CAAC;AACnE,OAAO,QAAQ,MAAM,mCAAmC,CAAC;AACzD,OAAO,kBAAkB,MAAM,6CAA6C,CAAC;AAC7E,OAAO,cAAc,MAAM,yCAAyC,CAAC;AACrE,OAAO,YAAY,MAAM,uCAAuC,CAAC;AACjE,OAAO,WAAW,MAAM,sCAAsC,CAAC;AAE/D,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,gBAAgB,EAAE,aAAa;IAC/B,WAAW,EAAE,QAAQ;IACrB,qBAAqB,EAAE,kBAAkB;IACzC,iBAAiB,EAAE,cAAc;IACjC,eAAe,EAAE,YAAY;IAC7B,cAAc,EAAE,WAAW;CAC5B,CAAC"}
|