slopless 0.2.4 → 0.2.6

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 (283) hide show
  1. package/README.md +18 -106
  2. package/dist/adapters/textlint/report.js +51 -0
  3. package/dist/adapters/textlint/report.js.map +1 -0
  4. package/dist/adapters/textlint/units.js +28 -0
  5. package/dist/adapters/textlint/units.js.map +1 -0
  6. package/dist/cli.js +16 -3
  7. package/dist/cli.js.map +1 -1
  8. package/dist/index.js +4 -0
  9. package/dist/index.js.map +1 -1
  10. package/dist/presets/everything.js +8 -1
  11. package/dist/presets/everything.js.map +1 -1
  12. package/dist/registries/academic-slop.js +5 -0
  13. package/dist/registries/academic-slop.js.map +1 -0
  14. package/dist/registries/metrics.js +6 -6
  15. package/dist/registries/metrics.js.map +1 -1
  16. package/dist/registries/narrative-slop.js +11 -0
  17. package/dist/registries/narrative-slop.js.map +1 -0
  18. package/dist/registries/orthography.js +6 -6
  19. package/dist/registries/orthography.js.map +1 -1
  20. package/dist/registries/phrases.js +13 -9
  21. package/dist/registries/phrases.js.map +1 -1
  22. package/dist/registries/semantic-thinness.js +1 -1
  23. package/dist/registries/semantic-thinness.js.map +1 -1
  24. package/dist/registries/syntactic-patterns/authority.js +1 -1
  25. package/dist/registries/syntactic-patterns/authority.js.map +1 -1
  26. package/dist/registries/syntactic-patterns/closers.js +4 -4
  27. package/dist/registries/syntactic-patterns/closers.js.map +1 -1
  28. package/dist/registries/syntactic-patterns/contrast.js +3 -3
  29. package/dist/registries/syntactic-patterns/contrast.js.map +1 -1
  30. package/dist/registries/syntactic-patterns/generalization.js +2 -2
  31. package/dist/registries/syntactic-patterns/generalization.js.map +1 -1
  32. package/dist/registries/syntactic-patterns/lead-ins.js +5 -5
  33. package/dist/registries/syntactic-patterns/lead-ins.js.map +1 -1
  34. package/dist/registries/syntactic-patterns/llm-artifacts.js +1 -1
  35. package/dist/registries/syntactic-patterns/llm-artifacts.js.map +1 -1
  36. package/dist/registries/syntactic-patterns/repetition.js +4 -4
  37. package/dist/registries/syntactic-patterns/repetition.js.map +1 -1
  38. package/dist/registries/term-policy.js +2 -2
  39. package/dist/registries/term-policy.js.map +1 -1
  40. package/dist/registries/words.js +4 -4
  41. package/dist/registries/words.js.map +1 -1
  42. package/dist/reporting/reports.js +92 -0
  43. package/dist/reporting/reports.js.map +1 -0
  44. package/dist/reporting/types.js +2 -0
  45. package/dist/reporting/types.js.map +1 -0
  46. package/dist/rules/academic-slop/data/tortured-phrases.json +8 -0
  47. package/dist/rules/academic-slop/tortured-phrases.js +27 -0
  48. package/dist/rules/academic-slop/tortured-phrases.js.map +1 -0
  49. package/dist/{families → rules}/metrics/avg-sentence-length.js +8 -4
  50. package/dist/rules/metrics/avg-sentence-length.js.map +1 -0
  51. package/dist/{families → rules}/metrics/coleman-liau.js +8 -4
  52. package/dist/rules/metrics/coleman-liau.js.map +1 -0
  53. package/dist/{families → rules}/metrics/flesch-kincaid.js +8 -4
  54. package/dist/rules/metrics/flesch-kincaid.js.map +1 -0
  55. package/dist/{families → rules}/metrics/gunning-fog.js +8 -4
  56. package/dist/rules/metrics/gunning-fog.js.map +1 -0
  57. package/dist/rules/metrics/paragraph-length.js +25 -0
  58. package/dist/rules/metrics/paragraph-length.js.map +1 -0
  59. package/dist/{families → rules}/metrics/word-repetition.js +8 -4
  60. package/dist/rules/metrics/word-repetition.js.map +1 -0
  61. package/dist/rules/narrative-slop/body-action-density.js +198 -0
  62. package/dist/rules/narrative-slop/body-action-density.js.map +1 -0
  63. package/dist/rules/narrative-slop/data/narrative-cliches.json +134 -0
  64. package/dist/rules/narrative-slop/flat-action-cadence.js +322 -0
  65. package/dist/rules/narrative-slop/flat-action-cadence.js.map +1 -0
  66. package/dist/rules/narrative-slop/narrative-cliches.js +46 -0
  67. package/dist/rules/narrative-slop/narrative-cliches.js.map +1 -0
  68. package/dist/rules/narrative-slop/perception-verb-density.js +84 -0
  69. package/dist/rules/narrative-slop/perception-verb-density.js.map +1 -0
  70. package/dist/{families → rules}/orthography/colon-dramatic.js +11 -7
  71. package/dist/rules/orthography/colon-dramatic.js.map +1 -0
  72. package/dist/{families → rules}/orthography/em-dashes.js +11 -7
  73. package/dist/rules/orthography/em-dashes.js.map +1 -0
  74. package/dist/{families → rules}/orthography/exclamation-density.js +11 -7
  75. package/dist/rules/orthography/exclamation-density.js.map +1 -0
  76. package/dist/{families → rules}/orthography/fake-timestamps.js +11 -7
  77. package/dist/rules/orthography/fake-timestamps.js.map +1 -0
  78. package/dist/{families → rules}/orthography/sentence-case.js +7 -2
  79. package/dist/rules/orthography/sentence-case.js.map +1 -0
  80. package/dist/{families → rules}/orthography/smart-quotes.js +11 -7
  81. package/dist/rules/orthography/smart-quotes.js.map +1 -0
  82. package/dist/rules/phrases/cliches.js +43 -0
  83. package/dist/rules/phrases/cliches.js.map +1 -0
  84. package/dist/rules/phrases/corporate-speak.js +32 -0
  85. package/dist/rules/phrases/corporate-speak.js.map +1 -0
  86. package/dist/rules/phrases/data/cliche-templates.json +20 -0
  87. package/dist/{families → rules}/phrases/data/cliches.json +73 -1
  88. package/dist/rules/phrases/data/corporate-abstraction-patterns.json +80 -0
  89. package/dist/{families → rules}/phrases/data/corporate-speak.json +0 -3
  90. package/dist/rules/phrases/data/llm-disclaimer-expansions.json +4 -0
  91. package/dist/{families → rules}/phrases/data/prohibited-phrases.json +0 -1
  92. package/dist/rules/phrases/data/redundancy-patterns.json +74 -0
  93. package/dist/rules/phrases/data/wordiness-patterns.json +53 -0
  94. package/dist/rules/phrases/humble-bragger.js +30 -0
  95. package/dist/rules/phrases/humble-bragger.js.map +1 -0
  96. package/dist/{families → rules}/phrases/jargon-faker.js +11 -7
  97. package/dist/rules/phrases/jargon-faker.js.map +1 -0
  98. package/dist/{families → rules}/phrases/llm-disclaimer.js +21 -8
  99. package/dist/rules/phrases/llm-disclaimer.js.map +1 -0
  100. package/dist/rules/phrases/prohibited-phrases.js +27 -0
  101. package/dist/rules/phrases/prohibited-phrases.js.map +1 -0
  102. package/dist/rules/phrases/redundancy.js +27 -0
  103. package/dist/rules/phrases/redundancy.js.map +1 -0
  104. package/dist/{families → rules}/phrases/skunked-terms.js +8 -4
  105. package/dist/rules/phrases/skunked-terms.js.map +1 -0
  106. package/dist/{families → rules}/phrases/uncomparables.js +8 -4
  107. package/dist/rules/phrases/uncomparables.js.map +1 -0
  108. package/dist/rules/phrases/wordiness.js +27 -0
  109. package/dist/rules/phrases/wordiness.js.map +1 -0
  110. package/dist/rules/semantic-thinness/patterns/abstract-personification-line.json +23 -0
  111. package/dist/rules/semantic-thinness/patterns/emotion-as-substance.json +95 -0
  112. package/dist/rules/semantic-thinness/patterns/fixed-metaphor-frame.json +32 -0
  113. package/dist/rules/semantic-thinness/patterns/sensory-instead-of-frame.json +40 -0
  114. package/dist/rules/semantic-thinness/patterns/summary-fog-transition.json +30 -0
  115. package/dist/{families → rules}/semantic-thinness/private/pattern-data-a.js +2 -0
  116. package/dist/rules/semantic-thinness/private/pattern-data-a.js.map +1 -0
  117. package/dist/rules/semantic-thinness/private/pattern-data-b.js.map +1 -0
  118. package/dist/rules/semantic-thinness/private/pattern-data-c.js +17 -0
  119. package/dist/rules/semantic-thinness/private/pattern-data-c.js.map +1 -0
  120. package/dist/rules/semantic-thinness/private/pattern-data-d.js.map +1 -0
  121. package/dist/rules/semantic-thinness/private/pattern-data.js.map +1 -0
  122. package/dist/rules/semantic-thinness/private/pattern-matcher.js.map +1 -0
  123. package/dist/{families → rules}/semantic-thinness/semantic-thinness.js +11 -7
  124. package/dist/rules/semantic-thinness/semantic-thinness.js.map +1 -0
  125. package/dist/{families → rules}/syntactic-patterns/authority/authority-padding.js +11 -7
  126. package/dist/rules/syntactic-patterns/authority/authority-padding.js.map +1 -0
  127. package/dist/{families → rules}/syntactic-patterns/closers/affirmation-closers.js +20 -13
  128. package/dist/rules/syntactic-patterns/closers/affirmation-closers.js.map +1 -0
  129. package/dist/{families → rules}/syntactic-patterns/closers/boilerplate-conclusion.js +11 -7
  130. package/dist/rules/syntactic-patterns/closers/boilerplate-conclusion.js.map +1 -0
  131. package/dist/{families → rules}/syntactic-patterns/closers/false-question.js +11 -7
  132. package/dist/rules/syntactic-patterns/closers/false-question.js.map +1 -0
  133. package/dist/{families → rules}/syntactic-patterns/closers/summative-closer.js +11 -7
  134. package/dist/rules/syntactic-patterns/closers/summative-closer.js.map +1 -0
  135. package/dist/{families → rules}/syntactic-patterns/contrast/blame-reframe.js +11 -7
  136. package/dist/rules/syntactic-patterns/contrast/blame-reframe.js.map +1 -0
  137. package/dist/{families → rules}/syntactic-patterns/contrast/contrastive-aphorism.js +10 -7
  138. package/dist/rules/syntactic-patterns/contrast/contrastive-aphorism.js.map +1 -0
  139. package/dist/rules/syntactic-patterns/contrast/negation-reframe.js +24 -0
  140. package/dist/rules/syntactic-patterns/contrast/negation-reframe.js.map +1 -0
  141. package/dist/{families → rules}/syntactic-patterns/contrast/private/negation-reframe-matcher.js +22 -5
  142. package/dist/rules/syntactic-patterns/contrast/private/negation-reframe-matcher.js.map +1 -0
  143. package/dist/{families → rules}/syntactic-patterns/contrast/private/negation-reframe-parts.js +55 -0
  144. package/dist/rules/syntactic-patterns/contrast/private/negation-reframe-parts.js.map +1 -0
  145. package/dist/rules/syntactic-patterns/contrast/private/negative-slop-frames.js +103 -0
  146. package/dist/rules/syntactic-patterns/contrast/private/negative-slop-frames.js.map +1 -0
  147. package/dist/{families → rules}/syntactic-patterns/generalization/softening-language.js +11 -7
  148. package/dist/rules/syntactic-patterns/generalization/softening-language.js.map +1 -0
  149. package/dist/{families → rules}/syntactic-patterns/generalization/universalizing-claims.js +11 -7
  150. package/dist/rules/syntactic-patterns/generalization/universalizing-claims.js.map +1 -0
  151. package/dist/{families → rules}/syntactic-patterns/lead-ins/boilerplate-framing.js +11 -7
  152. package/dist/rules/syntactic-patterns/lead-ins/boilerplate-framing.js.map +1 -0
  153. package/dist/{families → rules}/syntactic-patterns/lead-ins/generic-signposting.js +11 -7
  154. package/dist/rules/syntactic-patterns/lead-ins/generic-signposting.js.map +1 -0
  155. package/dist/{families → rules}/syntactic-patterns/lead-ins/lesson-framing.js +11 -7
  156. package/dist/rules/syntactic-patterns/lead-ins/lesson-framing.js.map +1 -0
  157. package/dist/rules/syntactic-patterns/lead-ins/llm-openers.js +28 -0
  158. package/dist/rules/syntactic-patterns/lead-ins/llm-openers.js.map +1 -0
  159. package/dist/{families → rules}/syntactic-patterns/lead-ins/observer-guidance.js +11 -7
  160. package/dist/rules/syntactic-patterns/lead-ins/observer-guidance.js.map +1 -0
  161. package/dist/rules/syntactic-patterns/llm-artifacts/data/response-wrapper-patterns.json +33 -0
  162. package/dist/{families → rules}/syntactic-patterns/llm-artifacts/response-wrapper.js +55 -10
  163. package/dist/rules/syntactic-patterns/llm-artifacts/response-wrapper.js.map +1 -0
  164. package/dist/{families → rules}/syntactic-patterns/repetition/demonstrative-emphasis.js +11 -7
  165. package/dist/rules/syntactic-patterns/repetition/demonstrative-emphasis.js.map +1 -0
  166. package/dist/{families → rules}/syntactic-patterns/repetition/empty-emphasis.js +11 -7
  167. package/dist/rules/syntactic-patterns/repetition/empty-emphasis.js.map +1 -0
  168. package/dist/{families → rules}/syntactic-patterns/repetition/fragment-stacking.js +11 -7
  169. package/dist/rules/syntactic-patterns/repetition/fragment-stacking.js.map +1 -0
  170. package/dist/{families → rules}/syntactic-patterns/repetition/triple-repeat.js +13 -9
  171. package/dist/rules/syntactic-patterns/repetition/triple-repeat.js.map +1 -0
  172. package/dist/{families → rules}/term-policy/recommended-terms.js +8 -4
  173. package/dist/rules/term-policy/recommended-terms.js.map +1 -0
  174. package/dist/{families → rules}/term-policy/required-terms.js +8 -4
  175. package/dist/rules/term-policy/required-terms.js.map +1 -0
  176. package/dist/rules/types.js +2 -0
  177. package/dist/rules/types.js.map +1 -0
  178. package/dist/{families → rules}/words/hedge-stacking.js +11 -7
  179. package/dist/rules/words/hedge-stacking.js.map +1 -0
  180. package/dist/{families → rules}/words/llm-vocabulary.js +8 -4
  181. package/dist/rules/words/llm-vocabulary.js.map +1 -0
  182. package/dist/rules/words/prohibited-words.js +21 -0
  183. package/dist/rules/words/prohibited-words.js.map +1 -0
  184. package/dist/{families → rules}/words/simplicity.js +11 -7
  185. package/dist/rules/words/simplicity.js.map +1 -0
  186. package/dist/shared/matchers/phrases.js +74 -0
  187. package/dist/shared/matchers/phrases.js.map +1 -1
  188. package/package.json +58 -49
  189. package/slopless.textlintrc.json +5 -0
  190. package/dist/families/metrics/avg-sentence-length.js.map +0 -1
  191. package/dist/families/metrics/coleman-liau.js.map +0 -1
  192. package/dist/families/metrics/flesch-kincaid.js.map +0 -1
  193. package/dist/families/metrics/gunning-fog.js.map +0 -1
  194. package/dist/families/metrics/paragraph-length.js +0 -21
  195. package/dist/families/metrics/paragraph-length.js.map +0 -1
  196. package/dist/families/metrics/word-repetition.js.map +0 -1
  197. package/dist/families/orthography/colon-dramatic.js.map +0 -1
  198. package/dist/families/orthography/em-dashes.js.map +0 -1
  199. package/dist/families/orthography/exclamation-density.js.map +0 -1
  200. package/dist/families/orthography/fake-timestamps.js.map +0 -1
  201. package/dist/families/orthography/sentence-case.js.map +0 -1
  202. package/dist/families/orthography/smart-quotes.js.map +0 -1
  203. package/dist/families/phrases/cliches.js +0 -17
  204. package/dist/families/phrases/cliches.js.map +0 -1
  205. package/dist/families/phrases/corporate-speak.js +0 -23
  206. package/dist/families/phrases/corporate-speak.js.map +0 -1
  207. package/dist/families/phrases/humble-bragger.js +0 -26
  208. package/dist/families/phrases/humble-bragger.js.map +0 -1
  209. package/dist/families/phrases/jargon-faker.js.map +0 -1
  210. package/dist/families/phrases/llm-disclaimer.js.map +0 -1
  211. package/dist/families/phrases/prohibited-phrases.js +0 -17
  212. package/dist/families/phrases/prohibited-phrases.js.map +0 -1
  213. package/dist/families/phrases/skunked-terms.js.map +0 -1
  214. package/dist/families/phrases/uncomparables.js.map +0 -1
  215. package/dist/families/semantic-thinness/private/pattern-data-a.js.map +0 -1
  216. package/dist/families/semantic-thinness/private/pattern-data-b.js.map +0 -1
  217. package/dist/families/semantic-thinness/private/pattern-data-c.js +0 -9
  218. package/dist/families/semantic-thinness/private/pattern-data-c.js.map +0 -1
  219. package/dist/families/semantic-thinness/private/pattern-data-d.js.map +0 -1
  220. package/dist/families/semantic-thinness/private/pattern-data.js.map +0 -1
  221. package/dist/families/semantic-thinness/private/pattern-matcher.js.map +0 -1
  222. package/dist/families/semantic-thinness/semantic-thinness.js.map +0 -1
  223. package/dist/families/syntactic-patterns/authority/authority-padding.js.map +0 -1
  224. package/dist/families/syntactic-patterns/closers/affirmation-closers.js.map +0 -1
  225. package/dist/families/syntactic-patterns/closers/boilerplate-conclusion.js.map +0 -1
  226. package/dist/families/syntactic-patterns/closers/false-question.js.map +0 -1
  227. package/dist/families/syntactic-patterns/closers/summative-closer.js.map +0 -1
  228. package/dist/families/syntactic-patterns/contrast/blame-reframe.js.map +0 -1
  229. package/dist/families/syntactic-patterns/contrast/contrastive-aphorism.js.map +0 -1
  230. package/dist/families/syntactic-patterns/contrast/negation-reframe.js +0 -20
  231. package/dist/families/syntactic-patterns/contrast/negation-reframe.js.map +0 -1
  232. package/dist/families/syntactic-patterns/contrast/private/negation-reframe-matcher.js.map +0 -1
  233. package/dist/families/syntactic-patterns/contrast/private/negation-reframe-parts.js.map +0 -1
  234. package/dist/families/syntactic-patterns/generalization/softening-language.js.map +0 -1
  235. package/dist/families/syntactic-patterns/generalization/universalizing-claims.js.map +0 -1
  236. package/dist/families/syntactic-patterns/lead-ins/boilerplate-framing.js.map +0 -1
  237. package/dist/families/syntactic-patterns/lead-ins/generic-signposting.js.map +0 -1
  238. package/dist/families/syntactic-patterns/lead-ins/lesson-framing.js.map +0 -1
  239. package/dist/families/syntactic-patterns/lead-ins/llm-openers.js +0 -24
  240. package/dist/families/syntactic-patterns/lead-ins/llm-openers.js.map +0 -1
  241. package/dist/families/syntactic-patterns/lead-ins/observer-guidance.js.map +0 -1
  242. package/dist/families/syntactic-patterns/llm-artifacts/response-wrapper.js.map +0 -1
  243. package/dist/families/syntactic-patterns/repetition/demonstrative-emphasis.js.map +0 -1
  244. package/dist/families/syntactic-patterns/repetition/empty-emphasis.js.map +0 -1
  245. package/dist/families/syntactic-patterns/repetition/fragment-stacking.js.map +0 -1
  246. package/dist/families/syntactic-patterns/repetition/triple-repeat.js.map +0 -1
  247. package/dist/families/term-policy/recommended-terms.js.map +0 -1
  248. package/dist/families/term-policy/required-terms.js.map +0 -1
  249. package/dist/families/words/hedge-stacking.js.map +0 -1
  250. package/dist/families/words/llm-vocabulary.js.map +0 -1
  251. package/dist/families/words/prohibited-words.js +0 -17
  252. package/dist/families/words/prohibited-words.js.map +0 -1
  253. package/dist/families/words/simplicity.js.map +0 -1
  254. /package/dist/{families → rules}/phrases/data/skunked-terms.json +0 -0
  255. /package/dist/{families → rules}/phrases/data/uncomparables.json +0 -0
  256. /package/dist/{families → rules}/semantic-thinness/patterns/abstract-contrast.json +0 -0
  257. /package/dist/{families → rules}/semantic-thinness/patterns/abstract-metaphor-claim.json +0 -0
  258. /package/dist/{families → rules}/semantic-thinness/patterns/body-emotion-shorthand.json +0 -0
  259. /package/dist/{families → rules}/semantic-thinness/patterns/body-knows.json +0 -0
  260. /package/dist/{families → rules}/semantic-thinness/patterns/deictic-summary.json +0 -0
  261. /package/dist/{families → rules}/semantic-thinness/patterns/empty-atmosphere-shift.json +0 -0
  262. /package/dist/{families → rules}/semantic-thinness/patterns/empty-emotional-weather.json +0 -0
  263. /package/dist/{families → rules}/semantic-thinness/patterns/empty-scene-state.json +0 -0
  264. /package/dist/{families → rules}/semantic-thinness/patterns/empty-scene-transition.json +0 -0
  265. /package/dist/{families → rules}/semantic-thinness/patterns/gaze-choreography.json +0 -0
  266. /package/dist/{families → rules}/semantic-thinness/patterns/generic-lesson-extraction.json +0 -0
  267. /package/dist/{families → rules}/semantic-thinness/patterns/generic-pressure-or-stakes.json +0 -0
  268. /package/dist/{families → rules}/semantic-thinness/patterns/generic-realization.json +0 -0
  269. /package/dist/{families → rules}/semantic-thinness/patterns/hollow-significance.json +0 -0
  270. /package/dist/{families → rules}/semantic-thinness/patterns/low-information-physical-blocking.json +0 -0
  271. /package/dist/{families → rules}/semantic-thinness/patterns/point-is-frame.json +0 -0
  272. /package/dist/{families → rules}/semantic-thinness/patterns/real-work-begins.json +0 -0
  273. /package/dist/{families → rules}/semantic-thinness/patterns/silence-as-actor.json +0 -0
  274. /package/dist/{families → rules}/semantic-thinness/patterns/something-shifted.json +0 -0
  275. /package/dist/{families → rules}/semantic-thinness/patterns/truth-answer-moves.json +0 -0
  276. /package/dist/{families → rules}/semantic-thinness/patterns/vague-connective-payoff.json +0 -0
  277. /package/dist/{families → rules}/semantic-thinness/patterns/vague-threshold-change.json +0 -0
  278. /package/dist/{families → rules}/semantic-thinness/private/pattern-data-b.js +0 -0
  279. /package/dist/{families → rules}/semantic-thinness/private/pattern-data-d.js +0 -0
  280. /package/dist/{families → rules}/semantic-thinness/private/pattern-data.js +0 -0
  281. /package/dist/{families → rules}/semantic-thinness/private/pattern-matcher.js +0 -0
  282. /package/dist/{families → rules}/words/data/prohibited-words.json +0 -0
  283. /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
- Slopless is a deterministic Markdown checker for AI and human slop in writing.
3
+ [![npm](https://img.shields.io/npm/v/slopless?label=npm)](https://www.npmjs.com/package/slopless)
4
+ [![downloads](https://img.shields.io/npm/dm/slopless)](https://www.npmjs.com/package/slopless)
5
+ [![license](https://img.shields.io/npm/l/slopless)](LICENSE)
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
+ [![node](https://img.shields.io/node/v/slopless)](package.json)
4
8
 
5
- It reports patterns that make prose padded, vague, generic, formulaic, or mechanically careless. It does not call an LLM. Output is always textlint JSON.
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.
6
10
 
7
11
  ## Install
8
12
 
@@ -10,116 +14,24 @@ It reports patterns that make prose padded, vague, generic, formulaic, or mechan
10
14
  npm install -D slopless
11
15
  ```
12
16
 
13
- ## Run
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
- Add an npm script:
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.
22
24
 
23
- ```json
24
- {
25
- "scripts": {
26
- "lint:prose": "slopless \"docs/**/*.md\""
27
- }
28
- }
29
- ```
30
-
31
- ```bash
32
- npm run lint:prose
33
- ```
34
-
35
- Slopless requires a file path, glob, or stdin input. A bare `npx slopless` exits with code `2`.
36
-
37
- ## Behavior
38
-
39
- - Requires Node.js 20 or newer.
40
- - Requires no `.textlintrc.json`.
41
- - Requires no separate `textlint` install.
42
- - Emits textlint JSON only.
43
- - Rejects `--format` and `-f`.
44
- - Exits `0` for no findings, `1` for prose findings, and `2` for command failure.
45
-
46
- Each JSON message includes the rule ID, line, column, message, and range data when textlint provides it. Rule IDs use `slopless/<rule-name>` in wrapped textlint output, such as `slopless/semantic-thinness`.
47
-
48
- ## Rules
49
-
50
- Metrics:
51
-
52
- - `avg-sentence-length`: average sentence length above 24 words.
53
- - `paragraph-length`: paragraphs over 6 sentences.
54
- - `word-repetition`: one non-trivial word repeated over 5 times.
55
- - `flesch-kincaid`: Flesch Reading Ease below 61.
56
- - `gunning-fog` and `coleman-liau`: grade scores above 12.
57
-
58
- Orthography:
25
+ ## More
59
26
 
60
- - `colon-dramatic`: short reveals after a colon, such as `And then: everything changed.`
61
- - `em-dashes`: closed em dashes.
62
- - `exclamation-density`: more than 1 exclamation mark per paragraph.
63
- - `fake-timestamps`: clock specificity, such as `5:47 PM`.
64
- - `sentence-case`: title-case headings.
65
- - `smart-quotes`: curly quotes.
27
+ - [Philosophy](/wiki/Philosophy) - what slopless is for, design principles, why deterministic.
28
+ - [Comparison](/wiki/Comparison) - slopless vs proselint, write-good, alex, vale, default textlint presets.
29
+ - [Rules](/wiki/Rules) - full 50+ rule inventory across seven families.
30
+ - [Behavior](/wiki/Behavior) - CLI flags, exit codes, JSON output shape, direct textlint integration.
31
+ - [Ignore rules](/wiki/Ignore-Rules) - inline `textlint-disable` block syntax.
32
+ - [Thanks](/wiki/Thanks) - direct rule sources, dependencies, and acknowledgments.
33
+ - [Contributing](.github/CONTRIBUTING.md) - open a detailed issue first; PRs must pass the G3TS pre-commit gate.
66
34
 
67
- Phrases and words:
35
+ ---
68
36
 
69
- - `cliches`: stock phrases, such as `at the end of the day`.
70
- - `corporate-speak`: business filler, such as `move the needle`.
71
- - `hedge-stacking`: stacked hedges, such as `might perhaps`.
72
- - `humble-bragger`: credential lead-ins, such as `in my experience`.
73
- - `jargon-faker`: borrowed tech metaphors, such as `debug your morning`.
74
- - `llm-disclaimer`: assistant disclaimers, such as `as an AI language model`.
75
- - `llm-vocabulary`: common AI diction, such as `delve`.
76
- - `prohibited-phrases` and `prohibited-words`: package-owned banned lists.
77
- - `recommended-terms` and `required-terms`: configured missing terms.
78
- - `simplicity`: complex words with simple replacements, such as `utilize`.
79
- - `skunked-terms`: contested broad-use terms.
80
- - `uncomparables`: impossible modifiers, such as `very unique`.
81
-
82
- Semantic thinness:
83
-
84
- - `semantic-thinness`: low-information templates, such as `Something shifted in the room.`
85
-
86
- Syntactic patterns:
87
-
88
- - `affirmation-closers`: empty certainty endings, such as `and that is the key`.
89
- - `authority-padding`: soft authority padding, such as `research shows`.
90
- - `blame-reframe`: blame-to-insight reframes, such as `the problem is not X, it is Y`.
91
- - `boilerplate-conclusion`: generic endings, such as `in conclusion`.
92
- - `boilerplate-framing`: generic setup, such as `when it comes to`.
93
- - `contrastive-aphorism`: slogan contrasts, such as `not faster, but smarter`.
94
- - `demonstrative-emphasis`: vague `this is what` emphasis.
95
- - `empty-emphasis`: unsupported importance claims, such as `this matters`.
96
- - `false-question`: rhetorical questions, such as `isn't that what we all want?`
97
- - `fragment-stacking`: clipped cadence, such as `Too broad. Too vague. Too late.`
98
- - `generic-signposting`: generic transitions, such as `it is important to note`.
99
- - `lesson-framing`: lesson extraction, such as `the lesson is`.
100
- - `llm-openers`: generic openers, such as `the important thing is`.
101
- - `negation-reframe`: `not X. It is Y.` constructions.
102
- - `observer-guidance`: reader-instruction frames, such as `notice how`.
103
- - `response-wrapper`: chat wrappers, such as `here is a revised version`.
104
- - `softening-language`: vague softeners, such as `in many ways`.
105
- - `summative-closer`: summary payoff lines, such as `that is what makes it work`.
106
- - `triple-repeat`: repeated sentence openers, such as `It is X. It is Y. It is Z.`
107
- - `universalizing-claims`: broad claims, such as `everyone knows`.
108
-
109
- ## Direct Textlint Use
110
-
111
- Most users should run `npx slopless "docs/**/*.md"`.
112
-
113
- The package also exports a textlint preset:
114
-
115
- ```json
116
- {
117
- "rules": {
118
- "preset-slopless": true
119
- }
120
- }
121
- ```
122
-
123
- ```bash
124
- npx textlint "docs/**/*.md"
125
- ```
37
+ 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
@@ -6,6 +6,7 @@ const FORMAT_FLAGS = new Set(["--format", "-f"]);
6
6
  const HELP_FLAGS = new Set(["--help", "-h"]);
7
7
  const STDIN_FLAGS = new Set(["--stdin"]);
8
8
  const VERSION_FLAGS = new Set(["--version", "-v"]);
9
+ const CONFIG_FLAGS = new Set(["--config", "-c"]);
9
10
  const VALUE_OPTIONS = new Set([
10
11
  "--cache-location",
11
12
  "--config",
@@ -20,7 +21,7 @@ const VALUE_OPTIONS = new Set([
20
21
  "-c",
21
22
  "-o"
22
23
  ]);
23
- const VERSION = "0.2.4";
24
+ const VERSION = "0.2.5";
24
25
  const HELP_TEXT = `Slopless checks Markdown prose for deterministic AI and human slop signals.
25
26
 
26
27
  It reports concrete patterns that make writing padded, vague, generic,
@@ -65,6 +66,13 @@ Useful forms:
65
66
  npx slopless "docs/**/*.md" > slopless.json
66
67
  npx slopless "docs/**/*.md" --quiet
67
68
 
69
+ Ignore one rule:
70
+ <!-- textlint-disable slopless/semantic-thinness -->
71
+
72
+ Something shifted in the room.
73
+
74
+ <!-- textlint-enable slopless/semantic-thinness -->
75
+
68
76
  Unsupported:
69
77
  --format and -f are rejected. JSON is the only output format.
70
78
  `;
@@ -96,9 +104,11 @@ function hasFileTarget(args) {
96
104
  }
97
105
  return false;
98
106
  }
107
+ function packageRoot() {
108
+ return dirname(dirname(fileURLToPath(import.meta.url)));
109
+ }
99
110
  function packageNodeModules() {
100
- const packageRoot = dirname(dirname(fileURLToPath(import.meta.url)));
101
- return resolve(packageRoot, "..");
111
+ return resolve(packageRoot(), "..");
102
112
  }
103
113
  async function readStdin() {
104
114
  let text = "";
@@ -129,6 +139,9 @@ async function main() {
129
139
  const args = [
130
140
  "node",
131
141
  "slopless",
142
+ ...(hasFlag(userArgs, CONFIG_FLAGS)
143
+ ? []
144
+ : ["--config", resolve(packageRoot(), "slopless.textlintrc.json")]),
132
145
  "--preset",
133
146
  "slopless",
134
147
  "--rules-base-directory",
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/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;KACxB;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,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,5 @@
1
+ import torturedPhrases from "../rules/academic-slop/tortured-phrases.js";
2
+ export const academicSlopRules = {
3
+ "tortured-phrases": torturedPhrases
4
+ };
5
+ //# sourceMappingURL=academic-slop.js.map
@@ -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 "../families/metrics/avg-sentence-length.js";
2
- import colemanLiau from "../families/metrics/coleman-liau.js";
3
- import fleschKincaid from "../families/metrics/flesch-kincaid.js";
4
- import gunningFog from "../families/metrics/gunning-fog.js";
5
- import paragraphLength from "../families/metrics/paragraph-length.js";
6
- import wordRepetition from "../families/metrics/word-repetition.js";
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,4CAA4C,CAAC;AAC3E,OAAO,WAAW,MAAM,qCAAqC,CAAC;AAC9D,OAAO,aAAa,MAAM,uCAAuC,CAAC;AAClE,OAAO,UAAU,MAAM,oCAAoC,CAAC;AAC5D,OAAO,eAAe,MAAM,yCAAyC,CAAC;AACtE,OAAO,cAAc,MAAM,wCAAwC,CAAC;AAEpE,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"}
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 "../families/orthography/colon-dramatic.js";
2
- import emDashes from "../families/orthography/em-dashes.js";
3
- import exclamationDensity from "../families/orthography/exclamation-density.js";
4
- import fakeTimestamps from "../families/orthography/fake-timestamps.js";
5
- import sentenceCase from "../families/orthography/sentence-case.js";
6
- import smartQuotes from "../families/orthography/smart-quotes.js";
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,2CAA2C,CAAC;AACtE,OAAO,QAAQ,MAAM,sCAAsC,CAAC;AAC5D,OAAO,kBAAkB,MAAM,gDAAgD,CAAC;AAChF,OAAO,cAAc,MAAM,4CAA4C,CAAC;AACxE,OAAO,YAAY,MAAM,0CAA0C,CAAC;AACpE,OAAO,WAAW,MAAM,yCAAyC,CAAC;AAElE,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,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,11 +1,13 @@
1
- import cliches from "../families/phrases/cliches.js";
2
- import corporateSpeak from "../families/phrases/corporate-speak.js";
3
- import humbleBragger from "../families/phrases/humble-bragger.js";
4
- import jargonFaker from "../families/phrases/jargon-faker.js";
5
- import llmDisclaimer from "../families/phrases/llm-disclaimer.js";
6
- import prohibitedPhrases from "../families/phrases/prohibited-phrases.js";
7
- import skunkedTerms from "../families/phrases/skunked-terms.js";
8
- import uncomparables from "../families/phrases/uncomparables.js";
1
+ import cliches from "../rules/phrases/cliches.js";
2
+ import corporateSpeak from "../rules/phrases/corporate-speak.js";
3
+ import humbleBragger from "../rules/phrases/humble-bragger.js";
4
+ import jargonFaker from "../rules/phrases/jargon-faker.js";
5
+ import llmDisclaimer from "../rules/phrases/llm-disclaimer.js";
6
+ import prohibitedPhrases from "../rules/phrases/prohibited-phrases.js";
7
+ import redundancy from "../rules/phrases/redundancy.js";
8
+ import skunkedTerms from "../rules/phrases/skunked-terms.js";
9
+ import uncomparables from "../rules/phrases/uncomparables.js";
10
+ import wordiness from "../rules/phrases/wordiness.js";
9
11
  export const phraseRules = {
10
12
  cliches,
11
13
  "corporate-speak": corporateSpeak,
@@ -13,7 +15,9 @@ export const phraseRules = {
13
15
  "jargon-faker": jargonFaker,
14
16
  "llm-disclaimer": llmDisclaimer,
15
17
  "prohibited-phrases": prohibitedPhrases,
18
+ redundancy,
16
19
  "skunked-terms": skunkedTerms,
17
- uncomparables
20
+ uncomparables,
21
+ wordiness
18
22
  };
19
23
  //# sourceMappingURL=phrases.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"phrases.js","sourceRoot":"","sources":["../../src/registries/phrases.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,gCAAgC,CAAC;AACrD,OAAO,cAAc,MAAM,wCAAwC,CAAC;AACpE,OAAO,aAAa,MAAM,uCAAuC,CAAC;AAClE,OAAO,WAAW,MAAM,qCAAqC,CAAC;AAC9D,OAAO,aAAa,MAAM,uCAAuC,CAAC;AAClE,OAAO,iBAAiB,MAAM,2CAA2C,CAAC;AAC1E,OAAO,YAAY,MAAM,sCAAsC,CAAC;AAChE,OAAO,aAAa,MAAM,sCAAsC,CAAC;AAEjE,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,OAAO;IACP,iBAAiB,EAAE,cAAc;IACjC,gBAAgB,EAAE,aAAa;IAC/B,cAAc,EAAE,WAAW;IAC3B,gBAAgB,EAAE,aAAa;IAC/B,oBAAoB,EAAE,iBAAiB;IACvC,eAAe,EAAE,YAAY;IAC7B,aAAa;CACd,CAAC"}
1
+ {"version":3,"file":"phrases.js","sourceRoot":"","sources":["../../src/registries/phrases.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,6BAA6B,CAAC;AAClD,OAAO,cAAc,MAAM,qCAAqC,CAAC;AACjE,OAAO,aAAa,MAAM,oCAAoC,CAAC;AAC/D,OAAO,WAAW,MAAM,kCAAkC,CAAC;AAC3D,OAAO,aAAa,MAAM,oCAAoC,CAAC;AAC/D,OAAO,iBAAiB,MAAM,wCAAwC,CAAC;AACvE,OAAO,UAAU,MAAM,gCAAgC,CAAC;AACxD,OAAO,YAAY,MAAM,mCAAmC,CAAC;AAC7D,OAAO,aAAa,MAAM,mCAAmC,CAAC;AAC9D,OAAO,SAAS,MAAM,+BAA+B,CAAC;AAEtD,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,OAAO;IACP,iBAAiB,EAAE,cAAc;IACjC,gBAAgB,EAAE,aAAa;IAC/B,cAAc,EAAE,WAAW;IAC3B,gBAAgB,EAAE,aAAa;IAC/B,oBAAoB,EAAE,iBAAiB;IACvC,UAAU;IACV,eAAe,EAAE,YAAY;IAC7B,aAAa;IACb,SAAS;CACV,CAAC"}
@@ -1,4 +1,4 @@
1
- import semanticThinness from "../families/semantic-thinness/semantic-thinness.js";
1
+ import semanticThinness from "../rules/semantic-thinness/semantic-thinness.js";
2
2
  export const semanticThinnessRules = {
3
3
  "semantic-thinness": semanticThinness
4
4
  };
@@ -1 +1 @@
1
- {"version":3,"file":"semantic-thinness.js","sourceRoot":"","sources":["../../src/registries/semantic-thinness.ts"],"names":[],"mappings":"AAAA,OAAO,gBAAgB,MAAM,oDAAoD,CAAC;AAElF,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,mBAAmB,EAAE,gBAAgB;CACtC,CAAC"}
1
+ {"version":3,"file":"semantic-thinness.js","sourceRoot":"","sources":["../../src/registries/semantic-thinness.ts"],"names":[],"mappings":"AAAA,OAAO,gBAAgB,MAAM,iDAAiD,CAAC;AAE/E,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,mBAAmB,EAAE,gBAAgB;CACtC,CAAC"}
@@ -1,4 +1,4 @@
1
- import authorityPadding from "../../families/syntactic-patterns/authority/authority-padding.js";
1
+ import authorityPadding from "../../rules/syntactic-patterns/authority/authority-padding.js";
2
2
  export const authorityRules = {
3
3
  "authority-padding": authorityPadding
4
4
  };
@@ -1 +1 @@
1
- {"version":3,"file":"authority.js","sourceRoot":"","sources":["../../../src/registries/syntactic-patterns/authority.ts"],"names":[],"mappings":"AAAA,OAAO,gBAAgB,MAAM,kEAAkE,CAAC;AAEhG,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,mBAAmB,EAAE,gBAAgB;CACtC,CAAC"}
1
+ {"version":3,"file":"authority.js","sourceRoot":"","sources":["../../../src/registries/syntactic-patterns/authority.ts"],"names":[],"mappings":"AAAA,OAAO,gBAAgB,MAAM,+DAA+D,CAAC;AAE7F,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,mBAAmB,EAAE,gBAAgB;CACtC,CAAC"}
@@ -1,7 +1,7 @@
1
- import affirmationClosers from "../../families/syntactic-patterns/closers/affirmation-closers.js";
2
- import boilerplateConclusion from "../../families/syntactic-patterns/closers/boilerplate-conclusion.js";
3
- import falseQuestion from "../../families/syntactic-patterns/closers/false-question.js";
4
- import summativeCloser from "../../families/syntactic-patterns/closers/summative-closer.js";
1
+ import affirmationClosers from "../../rules/syntactic-patterns/closers/affirmation-closers.js";
2
+ import boilerplateConclusion from "../../rules/syntactic-patterns/closers/boilerplate-conclusion.js";
3
+ import falseQuestion from "../../rules/syntactic-patterns/closers/false-question.js";
4
+ import summativeCloser from "../../rules/syntactic-patterns/closers/summative-closer.js";
5
5
  export const closerRules = {
6
6
  "affirmation-closers": affirmationClosers,
7
7
  "boilerplate-conclusion": boilerplateConclusion,
@@ -1 +1 @@
1
- {"version":3,"file":"closers.js","sourceRoot":"","sources":["../../../src/registries/syntactic-patterns/closers.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,MAAM,kEAAkE,CAAC;AAClG,OAAO,qBAAqB,MAAM,qEAAqE,CAAC;AACxG,OAAO,aAAa,MAAM,6DAA6D,CAAC;AACxF,OAAO,eAAe,MAAM,+DAA+D,CAAC;AAE5F,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,qBAAqB,EAAE,kBAAkB;IACzC,wBAAwB,EAAE,qBAAqB;IAC/C,gBAAgB,EAAE,aAAa;IAC/B,kBAAkB,EAAE,eAAe;CACpC,CAAC"}
1
+ {"version":3,"file":"closers.js","sourceRoot":"","sources":["../../../src/registries/syntactic-patterns/closers.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,MAAM,+DAA+D,CAAC;AAC/F,OAAO,qBAAqB,MAAM,kEAAkE,CAAC;AACrG,OAAO,aAAa,MAAM,0DAA0D,CAAC;AACrF,OAAO,eAAe,MAAM,4DAA4D,CAAC;AAEzF,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,qBAAqB,EAAE,kBAAkB;IACzC,wBAAwB,EAAE,qBAAqB;IAC/C,gBAAgB,EAAE,aAAa;IAC/B,kBAAkB,EAAE,eAAe;CACpC,CAAC"}
@@ -1,6 +1,6 @@
1
- import blameReframe from "../../families/syntactic-patterns/contrast/blame-reframe.js";
2
- import contrastiveAphorism from "../../families/syntactic-patterns/contrast/contrastive-aphorism.js";
3
- import negationReframe from "../../families/syntactic-patterns/contrast/negation-reframe.js";
1
+ import blameReframe from "../../rules/syntactic-patterns/contrast/blame-reframe.js";
2
+ import contrastiveAphorism from "../../rules/syntactic-patterns/contrast/contrastive-aphorism.js";
3
+ import negationReframe from "../../rules/syntactic-patterns/contrast/negation-reframe.js";
4
4
  export const contrastRules = {
5
5
  "blame-reframe": blameReframe,
6
6
  "contrastive-aphorism": contrastiveAphorism,
@@ -1 +1 @@
1
- {"version":3,"file":"contrast.js","sourceRoot":"","sources":["../../../src/registries/syntactic-patterns/contrast.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,6DAA6D,CAAC;AACvF,OAAO,mBAAmB,MAAM,oEAAoE,CAAC;AACrG,OAAO,eAAe,MAAM,gEAAgE,CAAC;AAE7F,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,eAAe,EAAE,YAAY;IAC7B,sBAAsB,EAAE,mBAAmB;IAC3C,kBAAkB,EAAE,eAAe;CACpC,CAAC"}
1
+ {"version":3,"file":"contrast.js","sourceRoot":"","sources":["../../../src/registries/syntactic-patterns/contrast.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,0DAA0D,CAAC;AACpF,OAAO,mBAAmB,MAAM,iEAAiE,CAAC;AAClG,OAAO,eAAe,MAAM,6DAA6D,CAAC;AAE1F,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,eAAe,EAAE,YAAY;IAC7B,sBAAsB,EAAE,mBAAmB;IAC3C,kBAAkB,EAAE,eAAe;CACpC,CAAC"}
@@ -1,5 +1,5 @@
1
- import softeningLanguage from "../../families/syntactic-patterns/generalization/softening-language.js";
2
- import universalizingClaims from "../../families/syntactic-patterns/generalization/universalizing-claims.js";
1
+ import softeningLanguage from "../../rules/syntactic-patterns/generalization/softening-language.js";
2
+ import universalizingClaims from "../../rules/syntactic-patterns/generalization/universalizing-claims.js";
3
3
  export const generalizationRules = {
4
4
  "softening-language": softeningLanguage,
5
5
  "universalizing-claims": universalizingClaims
@@ -1 +1 @@
1
- {"version":3,"file":"generalization.js","sourceRoot":"","sources":["../../../src/registries/syntactic-patterns/generalization.ts"],"names":[],"mappings":"AAAA,OAAO,iBAAiB,MAAM,wEAAwE,CAAC;AACvG,OAAO,oBAAoB,MAAM,2EAA2E,CAAC;AAE7G,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,oBAAoB,EAAE,iBAAiB;IACvC,uBAAuB,EAAE,oBAAoB;CAC9C,CAAC"}
1
+ {"version":3,"file":"generalization.js","sourceRoot":"","sources":["../../../src/registries/syntactic-patterns/generalization.ts"],"names":[],"mappings":"AAAA,OAAO,iBAAiB,MAAM,qEAAqE,CAAC;AACpG,OAAO,oBAAoB,MAAM,wEAAwE,CAAC;AAE1G,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,oBAAoB,EAAE,iBAAiB;IACvC,uBAAuB,EAAE,oBAAoB;CAC9C,CAAC"}
@@ -1,8 +1,8 @@
1
- import boilerplateFraming from "../../families/syntactic-patterns/lead-ins/boilerplate-framing.js";
2
- import genericSignposting from "../../families/syntactic-patterns/lead-ins/generic-signposting.js";
3
- import lessonFraming from "../../families/syntactic-patterns/lead-ins/lesson-framing.js";
4
- import llmOpeners from "../../families/syntactic-patterns/lead-ins/llm-openers.js";
5
- import observerGuidance from "../../families/syntactic-patterns/lead-ins/observer-guidance.js";
1
+ import boilerplateFraming from "../../rules/syntactic-patterns/lead-ins/boilerplate-framing.js";
2
+ import genericSignposting from "../../rules/syntactic-patterns/lead-ins/generic-signposting.js";
3
+ import lessonFraming from "../../rules/syntactic-patterns/lead-ins/lesson-framing.js";
4
+ import llmOpeners from "../../rules/syntactic-patterns/lead-ins/llm-openers.js";
5
+ import observerGuidance from "../../rules/syntactic-patterns/lead-ins/observer-guidance.js";
6
6
  export const leadInRules = {
7
7
  "boilerplate-framing": boilerplateFraming,
8
8
  "generic-signposting": genericSignposting,
@@ -1 +1 @@
1
- {"version":3,"file":"lead-ins.js","sourceRoot":"","sources":["../../../src/registries/syntactic-patterns/lead-ins.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,MAAM,mEAAmE,CAAC;AACnG,OAAO,kBAAkB,MAAM,mEAAmE,CAAC;AACnG,OAAO,aAAa,MAAM,8DAA8D,CAAC;AACzF,OAAO,UAAU,MAAM,2DAA2D,CAAC;AACnF,OAAO,gBAAgB,MAAM,iEAAiE,CAAC;AAE/F,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,qBAAqB,EAAE,kBAAkB;IACzC,qBAAqB,EAAE,kBAAkB;IACzC,gBAAgB,EAAE,aAAa;IAC/B,aAAa,EAAE,UAAU;IACzB,mBAAmB,EAAE,gBAAgB;CACtC,CAAC"}
1
+ {"version":3,"file":"lead-ins.js","sourceRoot":"","sources":["../../../src/registries/syntactic-patterns/lead-ins.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,MAAM,gEAAgE,CAAC;AAChG,OAAO,kBAAkB,MAAM,gEAAgE,CAAC;AAChG,OAAO,aAAa,MAAM,2DAA2D,CAAC;AACtF,OAAO,UAAU,MAAM,wDAAwD,CAAC;AAChF,OAAO,gBAAgB,MAAM,8DAA8D,CAAC;AAE5F,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,qBAAqB,EAAE,kBAAkB;IACzC,qBAAqB,EAAE,kBAAkB;IACzC,gBAAgB,EAAE,aAAa;IAC/B,aAAa,EAAE,UAAU;IACzB,mBAAmB,EAAE,gBAAgB;CACtC,CAAC"}
@@ -1,4 +1,4 @@
1
- import responseWrapper from "../../families/syntactic-patterns/llm-artifacts/response-wrapper.js";
1
+ import responseWrapper from "../../rules/syntactic-patterns/llm-artifacts/response-wrapper.js";
2
2
  export const llmArtifactRules = {
3
3
  "response-wrapper": responseWrapper
4
4
  };