slopless 0.2.6 → 0.2.8

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 (141) hide show
  1. package/README.md +65 -4
  2. package/dist/adapters/textlint/rule.js +21 -0
  3. package/dist/adapters/textlint/rule.js.map +1 -0
  4. package/dist/adapters/textlint/units.js +133 -1
  5. package/dist/adapters/textlint/units.js.map +1 -1
  6. package/dist/cli.js +77 -5
  7. package/dist/cli.js.map +1 -1
  8. package/dist/presets/everything.js +2 -0
  9. package/dist/presets/everything.js.map +1 -1
  10. package/dist/registries/orthography.js +4 -0
  11. package/dist/registries/orthography.js.map +1 -1
  12. package/dist/reporting/reports.js +50 -0
  13. package/dist/reporting/reports.js.map +1 -1
  14. package/dist/rules/academic-slop/tortured-phrases.js +13 -23
  15. package/dist/rules/academic-slop/tortured-phrases.js.map +1 -1
  16. package/dist/rules/metrics/avg-sentence-length.js +23 -21
  17. package/dist/rules/metrics/avg-sentence-length.js.map +1 -1
  18. package/dist/rules/metrics/coleman-liau.js +23 -23
  19. package/dist/rules/metrics/coleman-liau.js.map +1 -1
  20. package/dist/rules/metrics/flesch-kincaid.js +23 -23
  21. package/dist/rules/metrics/flesch-kincaid.js.map +1 -1
  22. package/dist/rules/metrics/gunning-fog.js +23 -23
  23. package/dist/rules/metrics/gunning-fog.js.map +1 -1
  24. package/dist/rules/metrics/paragraph-length.js +19 -20
  25. package/dist/rules/metrics/paragraph-length.js.map +1 -1
  26. package/dist/rules/metrics/word-repetition.js +20 -21
  27. package/dist/rules/metrics/word-repetition.js.map +1 -1
  28. package/dist/rules/narrative-slop/body-action-density.js +60 -23
  29. package/dist/rules/narrative-slop/body-action-density.js.map +1 -1
  30. package/dist/rules/narrative-slop/data/narrative-cliches.json +27 -0
  31. package/dist/rules/narrative-slop/flat-action-cadence.js +23 -26
  32. package/dist/rules/narrative-slop/flat-action-cadence.js.map +1 -1
  33. package/dist/rules/narrative-slop/narrative-cliches.js +35 -33
  34. package/dist/rules/narrative-slop/narrative-cliches.js.map +1 -1
  35. package/dist/rules/narrative-slop/perception-verb-density.js +22 -23
  36. package/dist/rules/narrative-slop/perception-verb-density.js.map +1 -1
  37. package/dist/rules/orthography/artifact-placeholders.js +110 -0
  38. package/dist/rules/orthography/artifact-placeholders.js.map +1 -0
  39. package/dist/rules/orthography/colon-dramatic.js +24 -32
  40. package/dist/rules/orthography/colon-dramatic.js.map +1 -1
  41. package/dist/rules/orthography/em-dashes.js +19 -33
  42. package/dist/rules/orthography/em-dashes.js.map +1 -1
  43. package/dist/rules/orthography/exclamation-density.js +20 -34
  44. package/dist/rules/orthography/exclamation-density.js.map +1 -1
  45. package/dist/rules/orthography/fake-timestamps.js +12 -32
  46. package/dist/rules/orthography/fake-timestamps.js.map +1 -1
  47. package/dist/rules/orthography/hidden-unicode-controls.js +51 -0
  48. package/dist/rules/orthography/hidden-unicode-controls.js.map +1 -0
  49. package/dist/rules/orthography/sentence-case.js +24 -32
  50. package/dist/rules/orthography/sentence-case.js.map +1 -1
  51. package/dist/rules/orthography/smart-quotes.js +12 -32
  52. package/dist/rules/orthography/smart-quotes.js.map +1 -1
  53. package/dist/rules/phrases/cliches.js +16 -27
  54. package/dist/rules/phrases/cliches.js.map +1 -1
  55. package/dist/rules/phrases/corporate-speak.js +16 -27
  56. package/dist/rules/phrases/corporate-speak.js.map +1 -1
  57. package/dist/rules/phrases/data/llm-disclaimer-expansions.json +9 -2
  58. package/dist/rules/phrases/data/redundancy-patterns.json +7 -0
  59. package/dist/rules/phrases/data/wordiness-patterns.json +2 -0
  60. package/dist/rules/phrases/humble-bragger.js +12 -22
  61. package/dist/rules/phrases/humble-bragger.js.map +1 -1
  62. package/dist/rules/phrases/jargon-faker.js +14 -25
  63. package/dist/rules/phrases/jargon-faker.js.map +1 -1
  64. package/dist/rules/phrases/llm-disclaimer.js +19 -23
  65. package/dist/rules/phrases/llm-disclaimer.js.map +1 -1
  66. package/dist/rules/phrases/prohibited-phrases.js +13 -23
  67. package/dist/rules/phrases/prohibited-phrases.js.map +1 -1
  68. package/dist/rules/phrases/redundancy.js +13 -23
  69. package/dist/rules/phrases/redundancy.js.map +1 -1
  70. package/dist/rules/phrases/skunked-terms.js +13 -23
  71. package/dist/rules/phrases/skunked-terms.js.map +1 -1
  72. package/dist/rules/phrases/uncomparables.js +15 -26
  73. package/dist/rules/phrases/uncomparables.js.map +1 -1
  74. package/dist/rules/phrases/wordiness.js +13 -23
  75. package/dist/rules/phrases/wordiness.js.map +1 -1
  76. package/dist/rules/private/textlint-rule-builders.js +46 -0
  77. package/dist/rules/private/textlint-rule-builders.js.map +1 -0
  78. package/dist/rules/semantic-thinness/patterns/puffery-evaluative-claim.json +56 -0
  79. package/dist/rules/semantic-thinness/private/pattern-data-d.js +2 -0
  80. package/dist/rules/semantic-thinness/private/pattern-data-d.js.map +1 -1
  81. package/dist/rules/semantic-thinness/semantic-thinness.js +27 -23
  82. package/dist/rules/semantic-thinness/semantic-thinness.js.map +1 -1
  83. package/dist/rules/syntactic-patterns/authority/authority-padding.js +19 -23
  84. package/dist/rules/syntactic-patterns/authority/authority-padding.js.map +1 -1
  85. package/dist/rules/syntactic-patterns/closers/affirmation-closers.js +45 -43
  86. package/dist/rules/syntactic-patterns/closers/affirmation-closers.js.map +1 -1
  87. package/dist/rules/syntactic-patterns/closers/boilerplate-conclusion.js +25 -22
  88. package/dist/rules/syntactic-patterns/closers/boilerplate-conclusion.js.map +1 -1
  89. package/dist/rules/syntactic-patterns/closers/false-question.js +20 -24
  90. package/dist/rules/syntactic-patterns/closers/false-question.js.map +1 -1
  91. package/dist/rules/syntactic-patterns/closers/summative-closer.js +20 -24
  92. package/dist/rules/syntactic-patterns/closers/summative-closer.js.map +1 -1
  93. package/dist/rules/syntactic-patterns/contrast/blame-reframe.js +19 -23
  94. package/dist/rules/syntactic-patterns/contrast/blame-reframe.js.map +1 -1
  95. package/dist/rules/syntactic-patterns/contrast/contrastive-aphorism.js +39 -31
  96. package/dist/rules/syntactic-patterns/contrast/contrastive-aphorism.js.map +1 -1
  97. package/dist/rules/syntactic-patterns/contrast/negation-reframe.js +12 -21
  98. package/dist/rules/syntactic-patterns/contrast/negation-reframe.js.map +1 -1
  99. package/dist/rules/syntactic-patterns/contrast/private/negation-reframe-parts.js +4 -2
  100. package/dist/rules/syntactic-patterns/contrast/private/negation-reframe-parts.js.map +1 -1
  101. package/dist/rules/syntactic-patterns/contrast/private/negative-slop-frames.js +33 -2
  102. package/dist/rules/syntactic-patterns/contrast/private/negative-slop-frames.js.map +1 -1
  103. package/dist/rules/syntactic-patterns/generalization/softening-language.js +19 -23
  104. package/dist/rules/syntactic-patterns/generalization/softening-language.js.map +1 -1
  105. package/dist/rules/syntactic-patterns/generalization/universalizing-claims.js +19 -23
  106. package/dist/rules/syntactic-patterns/generalization/universalizing-claims.js.map +1 -1
  107. package/dist/rules/syntactic-patterns/lead-ins/boilerplate-framing.js +12 -22
  108. package/dist/rules/syntactic-patterns/lead-ins/boilerplate-framing.js.map +1 -1
  109. package/dist/rules/syntactic-patterns/lead-ins/generic-signposting.js +19 -23
  110. package/dist/rules/syntactic-patterns/lead-ins/generic-signposting.js.map +1 -1
  111. package/dist/rules/syntactic-patterns/lead-ins/lesson-framing.js +19 -23
  112. package/dist/rules/syntactic-patterns/lead-ins/lesson-framing.js.map +1 -1
  113. package/dist/rules/syntactic-patterns/lead-ins/llm-openers.js +28 -25
  114. package/dist/rules/syntactic-patterns/lead-ins/llm-openers.js.map +1 -1
  115. package/dist/rules/syntactic-patterns/lead-ins/observer-guidance.js +19 -23
  116. package/dist/rules/syntactic-patterns/lead-ins/observer-guidance.js.map +1 -1
  117. package/dist/rules/syntactic-patterns/llm-artifacts/data/response-wrapper-patterns.json +6 -0
  118. package/dist/rules/syntactic-patterns/llm-artifacts/response-wrapper.js +21 -26
  119. package/dist/rules/syntactic-patterns/llm-artifacts/response-wrapper.js.map +1 -1
  120. package/dist/rules/syntactic-patterns/repetition/demonstrative-emphasis.js +28 -51
  121. package/dist/rules/syntactic-patterns/repetition/demonstrative-emphasis.js.map +1 -1
  122. package/dist/rules/syntactic-patterns/repetition/empty-emphasis.js +19 -23
  123. package/dist/rules/syntactic-patterns/repetition/empty-emphasis.js.map +1 -1
  124. package/dist/rules/syntactic-patterns/repetition/fragment-stacking.js +12 -32
  125. package/dist/rules/syntactic-patterns/repetition/fragment-stacking.js.map +1 -1
  126. package/dist/rules/syntactic-patterns/repetition/triple-repeat.js +15 -38
  127. package/dist/rules/syntactic-patterns/repetition/triple-repeat.js.map +1 -1
  128. package/dist/rules/term-policy/recommended-terms.js +24 -22
  129. package/dist/rules/term-policy/recommended-terms.js.map +1 -1
  130. package/dist/rules/term-policy/required-terms.js +20 -24
  131. package/dist/rules/term-policy/required-terms.js.map +1 -1
  132. package/dist/rules/words/hedge-stacking.js +19 -23
  133. package/dist/rules/words/hedge-stacking.js.map +1 -1
  134. package/dist/rules/words/llm-vocabulary.js +14 -20
  135. package/dist/rules/words/llm-vocabulary.js.map +1 -1
  136. package/dist/rules/words/prohibited-words.js +12 -17
  137. package/dist/rules/words/prohibited-words.js.map +1 -1
  138. package/dist/rules/words/simplicity.js +20 -25
  139. package/dist/rules/words/simplicity.js.map +1 -1
  140. package/package.json +5 -2
  141. package/skills/slopless/SKILL.md +63 -0
package/README.md CHANGED
@@ -6,21 +6,82 @@
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
- ## Install
11
+ ## Intended Usage Loop
12
12
 
13
13
  ```bash
14
14
  npm install -D slopless
15
+ npx slopless install-skill codex
16
+ npx slopless install-skill claude
15
17
  ```
16
18
 
17
- ## Quick start
19
+ Then start a fresh writing-agent session and tell it to use the Slopless skill:
20
+
21
+ ```text
22
+ Use the Slopless skill. Check this Markdown, rewrite the prose, and keep iterating until Slopless passes.
23
+ ```
24
+
25
+ Loop:
26
+
27
+ 1. Install Slopless.
28
+ 2. Install the agent skill for Codex or Claude Code.
29
+ 3. Tell the writing agent to use the skill.
30
+ 4. Let the agent run Slopless, rewrite, and rerun until the JSON output has no findings.
31
+ 5. Profit.
32
+
33
+ ## Direct CLI Use
18
34
 
19
35
  ```bash
20
36
  npx slopless "docs/**/*.md"
21
37
  ```
22
38
 
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.
39
+ Slopless is English-only. It requires a file path, glob, or stdin input. A bare `npx slopless` exits with code `2`.
40
+
41
+ Exit `0` means clean. Exit `1` means findings. Exit `2` means failure.
42
+
43
+ Output is always JSON:
44
+
45
+ ```bash
46
+ mkdir -p .slopless/findings
47
+ npx slopless "docs/**/*.md" > ".slopless/findings/$(date +%Y-%m-%d-%H%M%S)--review.json"
48
+ ```
49
+
50
+ ## Agent Use
51
+
52
+ Agents should run help first:
53
+
54
+ ```bash
55
+ npx slopless --help
56
+ ```
57
+
58
+ Agents should save raw JSON findings under `.slopless/findings/` in the current working directory. Slopless does not choose redirected output filenames, slugs, or timestamps.
59
+
60
+ Install the Codex skill into the current repo:
61
+
62
+ ```bash
63
+ npx slopless install-skill codex
64
+ ```
65
+
66
+ Install the Claude Code skill into the current repo:
67
+
68
+ ```bash
69
+ npx slopless install-skill claude
70
+ ```
71
+
72
+ Both commands install the same `slopless` skill body. Start a new agent session after installing if the skill is not visible.
73
+
74
+ ## Ignore rules
75
+
76
+ Use textlint comments around intentional exceptions:
77
+
78
+ ```markdown
79
+ <!-- textlint-disable slopless/semantic-thinness -->
80
+
81
+ Something shifted in the room.
82
+
83
+ <!-- textlint-enable slopless/semantic-thinness -->
84
+ ```
24
85
 
25
86
  ## More
26
87
 
@@ -0,0 +1,21 @@
1
+ import { emitTextlintReports } from "./report.js";
2
+ import { reportsForPolicy } from "../../reporting/reports.js";
3
+ export function defineTextlintRule(definition) {
4
+ return (context, options = {}) => {
5
+ const { Syntax } = context;
6
+ return {
7
+ [Syntax.Document](document) {
8
+ const units = definition.units(document, context, options);
9
+ const unitsById = new Map(units.map((unit) => [unit.id, unit]));
10
+ const detections = definition.detector.detect({
11
+ options,
12
+ ruleId: definition.detector.id,
13
+ units
14
+ });
15
+ const reports = reportsForPolicy(units, detections, definition.reportPolicy, definition.formatMessage);
16
+ emitTextlintReports(context, unitsById, reports);
17
+ }
18
+ };
19
+ };
20
+ }
21
+ //# sourceMappingURL=rule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule.js","sourceRoot":"","sources":["../../../src/adapters/textlint/rule.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAGlD,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAa9D,MAAM,UAAU,kBAAkB,CAEhC,UAA2C;IAC3C,OAAO,CAAC,OAAO,EAAE,UAAU,EAAa,EAAE,EAAE;QAC1C,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAE3B,OAAO;YACL,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,QAAyB;gBACzC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;gBAC3D,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;gBAChE,MAAM,UAAU,GAAG,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC;oBAC5C,OAAO;oBACP,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,EAAE;oBAC9B,KAAK;iBACN,CAAC,CAAC;gBACH,MAAM,OAAO,GAAG,gBAAgB,CAC9B,KAAK,EACL,UAAU,EACV,UAAU,CAAC,YAAY,EACvB,UAAU,CAAC,aAAa,CACzB,CAAC;gBAEF,mBAAmB,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YACnD,CAAC;SACF,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
@@ -1,5 +1,60 @@
1
1
  import { normalizeForMatch } from "../../shared/text/normalize.js";
2
- import { allParagraphs } from "../../shared/text/sections.js";
2
+ import { allParagraphSentences, allParagraphs, sectionFirstSentences, sectionLastSentences } from "../../shared/text/sections.js";
3
+ import { documentText } from "../../shared/text/document.js";
4
+ import { sourceText } from "../../shared/text/traverse.js";
5
+ function isParentNode(node) {
6
+ return "children" in node;
7
+ }
8
+ function visitNodes(node, ancestors, visitor) {
9
+ visitor({ ancestors, node });
10
+ if (!isParentNode(node)) {
11
+ return;
12
+ }
13
+ for (const child of node.children) {
14
+ visitNodes(child, [...ancestors, node], visitor);
15
+ }
16
+ }
17
+ function hasIgnoredAncestor(ancestors, ignoredTypes) {
18
+ return ancestors.some((ancestor) => ignoredTypes.has(ancestor.type));
19
+ }
20
+ function isHeaderNode(node) {
21
+ return node.type === "Header";
22
+ }
23
+ function isParagraphNode(node) {
24
+ return node.type === "Paragraph";
25
+ }
26
+ function isStrNode(node) {
27
+ return node.type === "Str";
28
+ }
29
+ function isLinkNode(node) {
30
+ return node.type === "Link";
31
+ }
32
+ function sentenceUnit(id, item) {
33
+ return {
34
+ id,
35
+ kind: "sentence",
36
+ node: item.paragraph,
37
+ normalizedText: normalizeForMatch(item.sentence.text),
38
+ range: { end: item.sentence.text.length, start: 0 },
39
+ sourceRangeFor: (range) => ({
40
+ end: item.source.originalEndFor(item.sentence.start + range.end),
41
+ start: item.source.originalStartFor(item.sentence.start + range.start)
42
+ }),
43
+ text: item.sentence.text
44
+ };
45
+ }
46
+ export function documentUnit(document) {
47
+ const text = documentText(document);
48
+ return {
49
+ id: "document:0",
50
+ kind: "document",
51
+ node: document,
52
+ normalizedText: normalizeForMatch(text),
53
+ range: { end: text.length, start: 0 },
54
+ sourceRangeFor: (range) => range,
55
+ text
56
+ };
57
+ }
3
58
  export function paragraphUnits(document) {
4
59
  return allParagraphs(document).map((paragraph, index) => ({
5
60
  id: `paragraph:${index}`,
@@ -14,6 +69,83 @@ export function paragraphUnits(document) {
14
69
  text: paragraph.text
15
70
  }));
16
71
  }
72
+ export function sentenceUnits(document) {
73
+ return allParagraphSentences(document).map((item, index) => sentenceUnit(`sentence:${index}`, item));
74
+ }
75
+ export function sectionFirstSentenceUnits(document) {
76
+ return sectionFirstSentences(document).map((item, index) => sentenceUnit(`section-first-sentence:${index}`, item));
77
+ }
78
+ export function sectionLastSentenceUnits(document) {
79
+ return sectionLastSentences(document).map((item, index) => sentenceUnit(`section-last-sentence:${index}`, item));
80
+ }
81
+ export function headingUnits(document, ignoredAncestorTypes = []) {
82
+ const ignoredTypes = new Set(ignoredAncestorTypes);
83
+ const units = [];
84
+ visitNodes(document, [], ({ ancestors, node }) => {
85
+ if (!isHeaderNode(node) || hasIgnoredAncestor(ancestors, ignoredTypes)) {
86
+ return;
87
+ }
88
+ const source = sourceText(node);
89
+ units.push({
90
+ id: `heading:${units.length}`,
91
+ kind: "heading",
92
+ node,
93
+ normalizedText: normalizeForMatch(source.text),
94
+ range: { end: source.text.length, start: 0 },
95
+ sourceRangeFor: (range) => ({
96
+ end: source.originalEndFor(range.end),
97
+ start: Math.max(0, source.originalStartFor(range.start) - 3)
98
+ }),
99
+ text: source.text
100
+ });
101
+ });
102
+ return units;
103
+ }
104
+ export function allParagraphUnits(document, ignoredAncestorTypes = []) {
105
+ const ignoredTypes = new Set(ignoredAncestorTypes);
106
+ const units = [];
107
+ visitNodes(document, [], ({ ancestors, node }) => {
108
+ if (!isParagraphNode(node) || hasIgnoredAncestor(ancestors, ignoredTypes)) {
109
+ return;
110
+ }
111
+ const source = sourceText(node);
112
+ units.push({
113
+ id: `all-paragraph:${units.length}`,
114
+ kind: "paragraph",
115
+ node,
116
+ normalizedText: normalizeForMatch(source.text),
117
+ range: { end: source.text.length, start: 0 },
118
+ sourceRangeFor: (range) => ({
119
+ end: source.originalEndFor(range.end),
120
+ start: source.originalStartFor(range.start)
121
+ }),
122
+ text: source.text
123
+ });
124
+ });
125
+ return units;
126
+ }
127
+ export function strUnits(document, ignoredAncestorTypes = []) {
128
+ const ignoredTypes = new Set(ignoredAncestorTypes);
129
+ const units = [];
130
+ visitNodes(document, [], ({ ancestors, node }) => {
131
+ if (!isStrNode(node) || hasIgnoredAncestor(ancestors, ignoredTypes)) {
132
+ return;
133
+ }
134
+ units.push(textUnitForNode(`str:${units.length}`, "text", node, node.value));
135
+ });
136
+ return units;
137
+ }
138
+ export function linkUnits(document, ignoredAncestorTypes = []) {
139
+ const ignoredTypes = new Set(ignoredAncestorTypes);
140
+ const units = [];
141
+ visitNodes(document, [], ({ ancestors, node }) => {
142
+ if (!isLinkNode(node) || hasIgnoredAncestor(ancestors, ignoredTypes)) {
143
+ return;
144
+ }
145
+ units.push(textUnitForNode(`link:${units.length}`, "text", node, node.url));
146
+ });
147
+ return units;
148
+ }
17
149
  export function textUnitForNode(id, kind, node, text) {
18
150
  return {
19
151
  id,
@@ -1 +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"}
1
+ {"version":3,"file":"units.js","sourceRoot":"","sources":["../../../src/adapters/textlint/units.ts"],"names":[],"mappings":"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"}
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.8";
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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"}
@@ -1,6 +1,7 @@
1
1
  export const everything = {
2
2
  rules: {
3
3
  "affirmation-closers": true,
4
+ "artifact-placeholders": true,
4
5
  "authority-padding": true,
5
6
  "avg-sentence-length": true,
6
7
  "blame-reframe": true,
@@ -23,6 +24,7 @@ export const everything = {
23
24
  "fragment-stacking": true,
24
25
  "gunning-fog": true,
25
26
  "hedge-stacking": true,
27
+ "hidden-unicode-controls": true,
26
28
  "humble-bragger": true,
27
29
  "jargon-faker": true,
28
30
  "generic-signposting": true,
@@ -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,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"}
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,uBAAuB,EAAE,IAAI;QAC7B,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,yBAAyB,EAAE,IAAI;QAC/B,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"}
@@ -1,14 +1,18 @@
1
+ import artifactPlaceholders from "../rules/orthography/artifact-placeholders.js";
1
2
  import colonDramatic from "../rules/orthography/colon-dramatic.js";
2
3
  import emDashes from "../rules/orthography/em-dashes.js";
3
4
  import exclamationDensity from "../rules/orthography/exclamation-density.js";
4
5
  import fakeTimestamps from "../rules/orthography/fake-timestamps.js";
6
+ import hiddenUnicodeControls from "../rules/orthography/hidden-unicode-controls.js";
5
7
  import sentenceCase from "../rules/orthography/sentence-case.js";
6
8
  import smartQuotes from "../rules/orthography/smart-quotes.js";
7
9
  export const orthographyRules = {
10
+ "artifact-placeholders": artifactPlaceholders,
8
11
  "colon-dramatic": colonDramatic,
9
12
  "em-dashes": emDashes,
10
13
  "exclamation-density": exclamationDensity,
11
14
  "fake-timestamps": fakeTimestamps,
15
+ "hidden-unicode-controls": hiddenUnicodeControls,
12
16
  "sentence-case": sentenceCase,
13
17
  "smart-quotes": smartQuotes
14
18
  };
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"orthography.js","sourceRoot":"","sources":["../../src/registries/orthography.ts"],"names":[],"mappings":"AAAA,OAAO,oBAAoB,MAAM,+CAA+C,CAAC;AACjF,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,qBAAqB,MAAM,iDAAiD,CAAC;AACpF,OAAO,YAAY,MAAM,uCAAuC,CAAC;AACjE,OAAO,WAAW,MAAM,sCAAsC,CAAC;AAE/D,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,uBAAuB,EAAE,oBAAoB;IAC7C,gBAAgB,EAAE,aAAa;IAC/B,WAAW,EAAE,QAAQ;IACrB,qBAAqB,EAAE,kBAAkB;IACzC,iBAAiB,EAAE,cAAc;IACjC,yBAAyB,EAAE,qBAAqB;IAChD,eAAe,EAAE,YAAY;IAC7B,cAAc,EAAE,WAAW;CAC5B,CAAC"}
@@ -89,4 +89,54 @@ export function densityReports(unit, detections, config) {
89
89
  }
90
90
  ];
91
91
  }
92
+ export function reportsForPolicy(units, detections, policy, formatMessage) {
93
+ switch (policy.kind) {
94
+ case "one-to-one": {
95
+ const unitsById = new Map(units.map((unit) => [unit.id, unit]));
96
+ const reports = detections.map((detection) => {
97
+ const unit = unitsById.get(detection.unitId);
98
+ return {
99
+ detections: [detection],
100
+ evidence: detection.evidence,
101
+ message: "",
102
+ range: unit?.sourceRangeFor(detection.range) ?? detection.range,
103
+ ruleId: detection.ruleId,
104
+ unitId: detection.unitId
105
+ };
106
+ });
107
+ return reports.map((report) => ({
108
+ ...report,
109
+ message: formatMessage(report)
110
+ }));
111
+ }
112
+ case "density": {
113
+ const reports = [];
114
+ for (const unit of units) {
115
+ reports.push(...densityReports(unit, detections.filter((detection) => detection.unitId === unit.id), {
116
+ groups: policy.groups,
117
+ maxParagraphTokens: policy.maxParagraphTokens,
118
+ maxWindowTokens: policy.maxWindowTokens,
119
+ message: () => "",
120
+ paragraphMinimumHits: policy.paragraphMinimumHits,
121
+ windowMinimumHits: policy.windowMinimumHits,
122
+ windowSentences: policy.windowSentences
123
+ }).map((report) => ({
124
+ ...report,
125
+ message: formatMessage(report)
126
+ })));
127
+ }
128
+ return reports;
129
+ }
130
+ case "threshold": {
131
+ if (policy.scope !== "document" || detections.length <= policy.minimum) {
132
+ return [];
133
+ }
134
+ const reports = oneToOneReports(detections, () => "");
135
+ return reports.map((report) => ({
136
+ ...report,
137
+ message: formatMessage(report)
138
+ }));
139
+ }
140
+ }
141
+ }
92
142
  //# sourceMappingURL=reports.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"reports.js","sourceRoot":"","sources":["../../src/reporting/reports.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reports.js","sourceRoot":"","sources":["../../src/reporting/reports.ts"],"names":[],"mappings":"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"}
@@ -1,27 +1,17 @@
1
- import { RuleHelper } from "textlint-rule-helper";
2
1
  import torturedPhrases from "./data/tortured-phrases.json" with { type: "json" };
3
2
  import { findUnquotedPhraseMatches } from "../../shared/matchers/phrases.js";
4
- import { emitTextlintFinding } from "../../adapters/textlint/report.js";
5
- const rule = (context) => {
6
- const { Syntax, getSource } = context;
7
- const helper = new RuleHelper(context);
8
- const ignoredParents = [Syntax.Link, Syntax.LinkReference];
9
- return {
10
- [Syntax.Str](node) {
11
- if (helper.isChildNode(node, ignoredParents)) {
12
- return;
13
- }
14
- const text = getSource(node);
15
- for (const match of findUnquotedPhraseMatches(text, torturedPhrases)) {
16
- emitTextlintFinding(context, {
17
- node: node,
18
- ruleId: "academic-slop:tortured-phrases",
19
- message: `Tortured phrase found: "${match.text}". Replace it with the standard scientific term.`,
20
- range: { start: match.start, end: match.end }
21
- });
22
- }
23
- }
24
- };
25
- };
3
+ import { oneToOneRule } from "../private/textlint-rule-builders.js";
4
+ const rule = oneToOneRule({
5
+ detect: (unit) => findUnquotedPhraseMatches(unit.text, torturedPhrases).map((match) => ({
6
+ evidence: match.text,
7
+ label: match.text,
8
+ range: { start: match.start, end: match.end }
9
+ })),
10
+ family: "academic-slop",
11
+ formatMessage: (report) => `Tortured phrase found: "${report.evidence}". Replace it with the standard scientific term.`,
12
+ ignoredAncestorTypes: ["Link", "LinkReference"],
13
+ ruleId: "academic-slop:tortured-phrases",
14
+ unitKind: "str"
15
+ });
26
16
  export default rule;
27
17
  //# sourceMappingURL=tortured-phrases.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tortured-phrases.js","sourceRoot":"","sources":["../../../src/rules/academic-slop/tortured-phrases.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,eAAe,MAAM,8BAA8B,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACjF,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAExE,MAAM,IAAI,GAAuB,CAAC,OAAO,EAAE,EAAE;IAC3C,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IACtC,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,cAAc,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;IAE3D,OAAO;QACL,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI;YACf,IAAI,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,CAAC;gBAC7C,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAE7B,KAAK,MAAM,KAAK,IAAI,yBAAyB,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,CAAC;gBACrE,mBAAmB,CAAC,OAAO,EAAE;oBAC3B,IAAI,EAAE,IAAI;oBACV,MAAM,EAAE,gCAAgC;oBACxC,OAAO,EAAE,2BAA2B,KAAK,CAAC,IAAI,kDAAkD;oBAChG,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE;iBAC9C,CAAC,CAAC;YACL,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,IAAI,CAAC"}
1
+ {"version":3,"file":"tortured-phrases.js","sourceRoot":"","sources":["../../../src/rules/academic-slop/tortured-phrases.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,8BAA8B,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACjF,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAC7E,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AAEpE,MAAM,IAAI,GAAG,YAAY,CAAC;IACxB,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CACf,yBAAyB,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACpE,QAAQ,EAAE,KAAK,CAAC,IAAI;QACpB,KAAK,EAAE,KAAK,CAAC,IAAI;QACjB,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE;KAC9C,CAAC,CAAC;IACL,MAAM,EAAE,eAAe;IACvB,aAAa,EAAE,CAAC,MAAM,EAAE,EAAE,CACxB,2BAA2B,MAAM,CAAC,QAAQ,kDAAkD;IAC9F,oBAAoB,EAAE,CAAC,MAAM,EAAE,eAAe,CAAC;IAC/C,MAAM,EAAE,gCAAgC;IACxC,QAAQ,EAAE,KAAK;CAChB,CAAC,CAAC;AAEH,eAAe,IAAI,CAAC"}