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
@@ -1,6 +1,7 @@
1
1
  import { findPhraseMatches } from "../../shared/matchers/phrases.js";
2
2
  import { allParagraphSentences } from "../../shared/text/sections.js";
3
3
  import { wordTokens } from "../../shared/text/tokens.js";
4
+ import { emitTextlintFinding } from "../../adapters/textlint/report.js";
4
5
  const JARGON_FAKER_PHRASES = [
5
6
  "debug our",
6
7
  "debug your",
@@ -61,7 +62,7 @@ function isLiteralTechnicalUse(sentence, phrase, end) {
61
62
  return false;
62
63
  }
63
64
  const rule = (context) => {
64
- const { Syntax, RuleError, locator, report } = context;
65
+ const { Syntax } = context;
65
66
  return {
66
67
  [Syntax.Document](node) {
67
68
  for (const item of allParagraphSentences(node)) {
@@ -69,12 +70,15 @@ const rule = (context) => {
69
70
  if (isLiteralTechnicalUse(item.sentence.text, match.phrase, match.end)) {
70
71
  continue;
71
72
  }
72
- report(item.paragraph, new RuleError(`Fake jargon phrase found: "${match.text}". Replace the borrowed tech metaphor with plain language.`, {
73
- padding: locator.range([
74
- item.source.originalStartFor(item.sentence.start + match.start),
75
- item.source.originalEndFor(item.sentence.start + match.end)
76
- ])
77
- }));
73
+ emitTextlintFinding(context, {
74
+ node: item.paragraph,
75
+ ruleId: "phrases:jargon-faker",
76
+ message: `Fake jargon phrase found: "${match.text}". Replace the borrowed tech metaphor with plain language.`,
77
+ range: {
78
+ start: item.source.originalStartFor(item.sentence.start + match.start),
79
+ end: item.source.originalEndFor(item.sentence.start + match.end)
80
+ }
81
+ });
78
82
  }
79
83
  }
80
84
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jargon-faker.js","sourceRoot":"","sources":["../../../src/rules/phrases/jargon-faker.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,7 @@
1
1
  import { cleanSentence, containsAny, textStartsWithPattern } from "../../shared/matchers/prose-patterns.js";
2
2
  import { allParagraphSentences } from "../../shared/text/sections.js";
3
+ import llmDisclaimerExpansions from "./data/llm-disclaimer-expansions.json" with { type: "json" };
4
+ import { emitTextlintFinding } from "../../adapters/textlint/report.js";
3
5
  const START_PATTERNS = [
4
6
  "as a language model",
5
7
  "as an ai language model",
@@ -27,12 +29,20 @@ const CONTAINS_PATTERNS = [
27
29
  "don't have access to real-time data"
28
30
  ];
29
31
  const PREFIXES = ["however, ", "but "];
32
+ const EXPANDED_START_PATTERNS = [
33
+ ...START_PATTERNS,
34
+ ...llmDisclaimerExpansions.startsWith
35
+ ];
36
+ const EXPANDED_CONTAINS_PATTERNS = [
37
+ ...CONTAINS_PATTERNS,
38
+ ...llmDisclaimerExpansions.contains
39
+ ];
30
40
  function matchDisclaimer(sentence) {
31
41
  const stripped = cleanSentence(sentence, PREFIXES);
32
- return (START_PATTERNS.find((pattern) => textStartsWithPattern(stripped, pattern)) ?? containsAny(stripped, CONTAINS_PATTERNS));
42
+ return (EXPANDED_START_PATTERNS.find((pattern) => textStartsWithPattern(stripped, pattern)) ?? containsAny(stripped, EXPANDED_CONTAINS_PATTERNS));
33
43
  }
34
44
  const rule = (context) => {
35
- const { Syntax, RuleError, locator, report } = context;
45
+ const { Syntax } = context;
36
46
  return {
37
47
  [Syntax.Document](node) {
38
48
  for (const item of allParagraphSentences(node)) {
@@ -40,12 +50,15 @@ const rule = (context) => {
40
50
  if (matched === undefined) {
41
51
  continue;
42
52
  }
43
- report(item.paragraph, new RuleError(`LLM disclaimer found: "${matched}". Remove assistant leakage.`, {
44
- padding: locator.range([
45
- item.source.originalStartFor(item.sentence.start),
46
- item.source.originalEndFor(item.sentence.end)
47
- ])
48
- }));
53
+ emitTextlintFinding(context, {
54
+ node: item.paragraph,
55
+ ruleId: "phrases:llm-disclaimer",
56
+ message: `LLM disclaimer found: "${matched}". Remove assistant leakage.`,
57
+ range: {
58
+ start: item.source.originalStartFor(item.sentence.start),
59
+ end: item.source.originalEndFor(item.sentence.end)
60
+ }
61
+ });
49
62
  }
50
63
  }
51
64
  };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-disclaimer.js","sourceRoot":"","sources":["../../../src/rules/phrases/llm-disclaimer.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,aAAa,EACb,WAAW,EACX,qBAAqB,EACtB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,uBAAuB,MAAM,uCAAuC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAClG,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAExE,MAAM,cAAc,GAAG;IACrB,qBAAqB;IACrB,yBAAyB;IACzB,wBAAwB;IACxB,2BAA2B;IAC3B,2BAA2B;IAC3B,gCAAgC;IAChC,6BAA6B;IAC7B,mCAAmC;IACnC,kCAAkC;IAClC,yBAAyB;IACzB,wBAAwB;CACzB,CAAC;AAEF,MAAM,iBAAiB,GAAG;IACxB,8BAA8B;IAC9B,0BAA0B;IAC1B,2BAA2B;IAC3B,uBAAuB;IACvB,0BAA0B;IAC1B,qCAAqC;IACrC,2BAA2B;IAC3B,6CAA6C;IAC7C,4CAA4C;IAC5C,sCAAsC;IACtC,qCAAqC;CACtC,CAAC;AAEF,MAAM,QAAQ,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AAEvC,MAAM,uBAAuB,GAAG;IAC9B,GAAG,cAAc;IACjB,GAAG,uBAAuB,CAAC,UAAU;CACtC,CAAC;AAEF,MAAM,0BAA0B,GAAG;IACjC,GAAG,iBAAiB;IACpB,GAAG,uBAAuB,CAAC,QAAQ;CACpC,CAAC;AAEF,SAAS,eAAe,CAAC,QAAgB;IACvC,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAEnD,OAAO,CACL,uBAAuB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CACvC,qBAAqB,CAAC,QAAQ,EAAE,OAAO,CAAC,CACzC,IAAI,WAAW,CAAC,QAAQ,EAAE,0BAA0B,CAAC,CACvD,CAAC;AACJ,CAAC;AAED,MAAM,IAAI,GAAuB,CAAC,OAAO,EAAE,EAAE;IAC3C,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAE3B,OAAO;QACL,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAqB;YACrC,KAAK,MAAM,IAAI,IAAI,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/C,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAEpD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;oBAC1B,SAAS;gBACX,CAAC;gBAED,mBAAmB,CAAC,OAAO,EAAE;oBAC3B,IAAI,EAAE,IAAI,CAAC,SAAS;oBACpB,MAAM,EAAE,wBAAwB;oBAChC,OAAO,EAAE,0BAA0B,OAAO,8BAA8B;oBACxE,KAAK,EAAE;wBACL,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;wBACxD,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;qBACnD;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { RuleHelper } from "textlint-rule-helper";
2
+ import prohibitedPhrases from "./data/prohibited-phrases.json" with { type: "json" };
3
+ 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, prohibitedPhrases)) {
16
+ emitTextlintFinding(context, {
17
+ node: node,
18
+ ruleId: "phrases:prohibited-phrases",
19
+ message: `Prohibited phrase found: "${match.text}". Rewrite without this phrase.`,
20
+ range: { start: match.start, end: match.end }
21
+ });
22
+ }
23
+ }
24
+ };
25
+ };
26
+ export default rule;
27
+ //# sourceMappingURL=prohibited-phrases.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prohibited-phrases.js","sourceRoot":"","sources":["../../../src/rules/phrases/prohibited-phrases.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,iBAAiB,MAAM,gCAAgC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACrF,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,iBAAiB,CAAC,EAAE,CAAC;gBACvE,mBAAmB,CAAC,OAAO,EAAE;oBAC3B,IAAI,EAAE,IAAI;oBACV,MAAM,EAAE,4BAA4B;oBACpC,OAAO,EAAE,6BAA6B,KAAK,CAAC,IAAI,iCAAiC;oBACjF,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"}
@@ -0,0 +1,27 @@
1
+ import { RuleHelper } from "textlint-rule-helper";
2
+ import redundancyPatterns from "./data/redundancy-patterns.json" with { type: "json" };
3
+ 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, redundancyPatterns)) {
16
+ emitTextlintFinding(context, {
17
+ node: node,
18
+ ruleId: "phrases:redundancy",
19
+ message: `Redundant phrase found: "${match.text}". Remove the repeated meaning.`,
20
+ range: { start: match.start, end: match.end }
21
+ });
22
+ }
23
+ }
24
+ };
25
+ };
26
+ export default rule;
27
+ //# sourceMappingURL=redundancy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redundancy.js","sourceRoot":"","sources":["../../../src/rules/phrases/redundancy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,kBAAkB,MAAM,iCAAiC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACvF,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,kBAAkB,CAAC,EAAE,CAAC;gBACxE,mBAAmB,CAAC,OAAO,EAAE;oBAC3B,IAAI,EAAE,IAAI;oBACV,MAAM,EAAE,oBAAoB;oBAC5B,OAAO,EAAE,4BAA4B,KAAK,CAAC,IAAI,iCAAiC;oBAChF,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,8 +1,9 @@
1
1
  import { RuleHelper } from "textlint-rule-helper";
2
2
  import skunkedTerms from "./data/skunked-terms.json" with { type: "json" };
3
3
  import { findUnquotedPhraseMatches } from "../../shared/matchers/phrases.js";
4
+ import { emitTextlintFinding } from "../../adapters/textlint/report.js";
4
5
  const rule = (context) => {
5
- const { Syntax, RuleError, getSource, locator, report } = context;
6
+ const { Syntax, getSource } = context;
6
7
  const helper = new RuleHelper(context);
7
8
  const ignoredParents = [Syntax.Link, Syntax.LinkReference];
8
9
  return {
@@ -12,9 +13,12 @@ const rule = (context) => {
12
13
  }
13
14
  const text = getSource(node);
14
15
  for (const match of findUnquotedPhraseMatches(text, skunkedTerms)) {
15
- report(node, new RuleError(`Skunked term found: "${match.text}". Replace it with a less disputed word.`, {
16
- padding: locator.range([match.start, match.end])
17
- }));
16
+ emitTextlintFinding(context, {
17
+ node: node,
18
+ ruleId: "phrases:skunked-terms",
19
+ message: `Skunked term found: "${match.text}". Replace it with a less disputed word.`,
20
+ range: { start: match.start, end: match.end }
21
+ });
18
22
  }
19
23
  }
20
24
  };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skunked-terms.js","sourceRoot":"","sources":["../../../src/rules/phrases/skunked-terms.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,YAAY,MAAM,2BAA2B,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAC3E,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,YAAY,CAAC,EAAE,CAAC;gBAClE,mBAAmB,CAAC,OAAO,EAAE;oBAC3B,IAAI,EAAE,IAAI;oBACV,MAAM,EAAE,uBAAuB;oBAC/B,OAAO,EAAE,wBAAwB,KAAK,CAAC,IAAI,0CAA0C;oBACrF,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"}
@@ -3,6 +3,7 @@ import uncomparables from "./data/uncomparables.json" with { type: "json" };
3
3
  import { findUnquotedPhraseMatches } from "../../shared/matchers/phrases.js";
4
4
  import { normalizeForMatch } from "../../shared/text/normalize.js";
5
5
  import { wordTokens } from "../../shared/text/tokens.js";
6
+ import { emitTextlintFinding } from "../../adapters/textlint/report.js";
6
7
  const EXCEPTION_SEPARATOR = "\u0000";
7
8
  function exceptionKey(comparator, adjective) {
8
9
  return `${normalizeForMatch(comparator)}${EXCEPTION_SEPARATOR}${normalizeForMatch(adjective)}`;
@@ -54,7 +55,7 @@ function shouldReport(text, match) {
54
55
  return !previousTokenIsAt(text, match);
55
56
  }
56
57
  const rule = (context) => {
57
- const { Syntax, RuleError, getSource, locator, report } = context;
58
+ const { Syntax, getSource } = context;
58
59
  const helper = new RuleHelper(context);
59
60
  const ignoredParents = [Syntax.Link, Syntax.LinkReference];
60
61
  return {
@@ -67,9 +68,12 @@ const rule = (context) => {
67
68
  if (!shouldReport(text, match)) {
68
69
  continue;
69
70
  }
70
- report(node, new RuleError(`Uncomparable phrase found: "${match.text}". Remove the modifier.`, {
71
- padding: locator.range([match.start, match.end])
72
- }));
71
+ emitTextlintFinding(context, {
72
+ node: node,
73
+ ruleId: "phrases:uncomparables",
74
+ message: `Uncomparable phrase found: "${match.text}". Remove the modifier.`,
75
+ range: { start: match.start, end: match.end }
76
+ });
73
77
  }
74
78
  }
75
79
  };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uncomparables.js","sourceRoot":"","sources":["../../../src/rules/phrases/uncomparables.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { RuleHelper } from "textlint-rule-helper";
2
+ import wordinessPatterns from "./data/wordiness-patterns.json" with { type: "json" };
3
+ 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, wordinessPatterns)) {
16
+ emitTextlintFinding(context, {
17
+ node: node,
18
+ ruleId: "phrases:wordiness",
19
+ message: `Wordy phrase found: "${match.text}". Replace it with direct wording.`,
20
+ range: { start: match.start, end: match.end }
21
+ });
22
+ }
23
+ }
24
+ };
25
+ };
26
+ export default rule;
27
+ //# sourceMappingURL=wordiness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wordiness.js","sourceRoot":"","sources":["../../../src/rules/phrases/wordiness.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,iBAAiB,MAAM,gCAAgC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACrF,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,iBAAiB,CAAC,EAAE,CAAC;gBACvE,mBAAmB,CAAC,OAAO,EAAE;oBAC3B,IAAI,EAAE,IAAI;oBACV,MAAM,EAAE,mBAAmB;oBAC3B,OAAO,EAAE,wBAAwB,KAAK,CAAC,IAAI,oCAAoC;oBAC/E,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"}
@@ -0,0 +1,23 @@
1
+ {
2
+ "id": "abstract-personification-line",
3
+ "class": "abstract-personification",
4
+ "purpose": "Catch abstract nouns treated as social actors in short payoff lines without concrete action or cause.",
5
+ "templates": ["{abstractSubject} had no place in {thinContainer}."],
6
+ "slots": {
7
+ "abstractSubject": ["fear"],
8
+ "thinContainer": ["her schedule", "his schedule", "their schedule"]
9
+ },
10
+ "rejectIf": [
11
+ "sentence includes a concrete policy, safety, legal, or logistical reason",
12
+ "sentence includes a cause clause",
13
+ "sentence refers to a literal place allocation"
14
+ ],
15
+ "positiveExamples": ["Fear had no place in her schedule."],
16
+ "negativeExamples": [
17
+ "Fear had no place in the posted evacuation plan because the exits were marked and staffed."
18
+ ],
19
+ "notes": [
20
+ "This starts with the Sunstone source frame only.",
21
+ "The common matcher rejects full-mode cause clauses such as because."
22
+ ]
23
+ }
@@ -0,0 +1,95 @@
1
+ {
2
+ "id": "emotion-as-substance",
3
+ "class": "emotion-physicalization",
4
+ "purpose": "Catch abstract emotion or state treated as a physical substance moving through bodies, voices, rooms, or groups.",
5
+ "maxTokens": 14,
6
+ "templates": [
7
+ "the {abstractEmotion} finally {substanceMotion} out of {bodyContainer}.",
8
+ "the {abstractEmotion} {substanceMotion} out of {bodyContainer}.",
9
+ "{abstractEmotion} {substanceMotion} out of {bodyContainer}.",
10
+ "{abstractEmotion} {substanceMotion} over {personTarget}.",
11
+ "{abstractEmotion} {substanceMotion} over {placeTarget}.",
12
+ "{abstractEmotion} {substanceMotion} in {bodyContainer}."
13
+ ],
14
+ "slots": {
15
+ "abstractEmotion": [
16
+ "anger",
17
+ "dread",
18
+ "fear",
19
+ "guilt",
20
+ "panic",
21
+ "regret",
22
+ "relief",
23
+ "shame",
24
+ "tension"
25
+ ],
26
+ "substanceMotion": [
27
+ "built",
28
+ "coiled",
29
+ "drained",
30
+ "flooded",
31
+ "left",
32
+ "melted",
33
+ "rolled",
34
+ "rose",
35
+ "sat",
36
+ "settled",
37
+ "rested",
38
+ "hung",
39
+ "washed"
40
+ ],
41
+ "bodyContainer": [
42
+ "her chest",
43
+ "his chest",
44
+ "their chest",
45
+ "her posture",
46
+ "his posture",
47
+ "their posture",
48
+ "her voice",
49
+ "his voice",
50
+ "their voice",
51
+ "her eyes",
52
+ "his eyes",
53
+ "their eyes"
54
+ ],
55
+ "personTarget": [
56
+ "cassia",
57
+ "arden",
58
+ "liska",
59
+ "her",
60
+ "him",
61
+ "them",
62
+ "the girl",
63
+ "the group"
64
+ ],
65
+ "placeTarget": [
66
+ "the room",
67
+ "the yard",
68
+ "the courtyard",
69
+ "the alley",
70
+ "the group",
71
+ "the table"
72
+ ]
73
+ },
74
+ "rejectIf": [
75
+ "sentence describes a literal fluid, wax, gas, weather, or measured physical substance",
76
+ "sentence includes a cause clause",
77
+ "sentence names the concrete action causing the feeling"
78
+ ],
79
+ "positiveExamples": [
80
+ "The anger finally melted out of her posture.",
81
+ "Relief washed over Cassia.",
82
+ "Tension settled over the room.",
83
+ "Panic rose in her chest.",
84
+ "Regret rested in his voice."
85
+ ],
86
+ "negativeExamples": [
87
+ "The wax melted out of the mold because the kiln overheated.",
88
+ "Water washed over the stones after the bucket tipped.",
89
+ "The measured tension settled after the cable was loosened."
90
+ ],
91
+ "notes": [
92
+ "The slots deliberately abstract the emotion as a moving physical substance.",
93
+ "This catches stock emotional physics, not literal physical substances."
94
+ ]
95
+ }
@@ -0,0 +1,32 @@
1
+ {
2
+ "id": "fixed-metaphor-frame",
3
+ "class": "fixed-metaphor",
4
+ "purpose": "Catch fixed scene metaphors that present a place as a stock metaphor of stacked image nouns.",
5
+ "templates": [
6
+ "{placeSubject} was a {metaphorNoun} of {imageNoun} and {imageNoun}."
7
+ ],
8
+ "slots": {
9
+ "placeSubject": [
10
+ "the south pier",
11
+ "the pier",
12
+ "the catwalk",
13
+ "the courtyard"
14
+ ],
15
+ "metaphorNoun": ["graveyard", "tightrope", "maze"],
16
+ "imageNoun": ["shadows", "salt spray", "dust", "ash", "vipers", "smoke"]
17
+ },
18
+ "rejectIf": [
19
+ "sentence uses the noun literally",
20
+ "sentence includes concrete damage, history, measurement, or source detail",
21
+ "sentence includes a cause clause"
22
+ ],
23
+ "positiveExamples": [
24
+ "The south pier was a graveyard of shadows and salt spray."
25
+ ],
26
+ "negativeExamples": [
27
+ "The south pier was a graveyard after the storm destroyed twelve boats."
28
+ ],
29
+ "notes": [
30
+ "The frame is intentionally narrow: place plus was a metaphor noun of two image nouns."
31
+ ]
32
+ }
@@ -0,0 +1,40 @@
1
+ {
2
+ "id": "sensory-instead-of-frame",
3
+ "class": "sensory-substitution",
4
+ "purpose": "Catch sensory atmosphere substitution frames that replace concrete scene information with stacked scent nouns.",
5
+ "maxTokens": 16,
6
+ "templates": [
7
+ "{placeSubject} smelled of {sensoryNoun} and {sensoryNoun} instead of {expectedScent}."
8
+ ],
9
+ "slots": {
10
+ "placeSubject": [
11
+ "the courtyard",
12
+ "the yard",
13
+ "the morning yard",
14
+ "the market"
15
+ ],
16
+ "sensoryNoun": [
17
+ "disturbed dust",
18
+ "old ash",
19
+ "dry tea",
20
+ "old hemp",
21
+ "smoke",
22
+ "salt"
23
+ ],
24
+ "expectedScent": ["hot metal", "oil", "fresh bread", "wet stone"]
25
+ },
26
+ "rejectIf": [
27
+ "sentence includes a concrete source for the smell",
28
+ "sentence includes a cause clause",
29
+ "sentence identifies the object producing the odor"
30
+ ],
31
+ "positiveExamples": [
32
+ "The courtyard smelled of disturbed dust and old ash instead of hot metal."
33
+ ],
34
+ "negativeExamples": [
35
+ "The courtyard smelled of ash because the kiln had cracked during firing."
36
+ ],
37
+ "notes": [
38
+ "This targets the explicit instead-of scent substitution frame, not ordinary concrete smell description."
39
+ ]
40
+ }
@@ -0,0 +1,30 @@
1
+ {
2
+ "id": "summary-fog-transition",
3
+ "class": "summary-fog",
4
+ "purpose": "Catch vague transition lines that replace an event sequence with blur, haze, or fog.",
5
+ "templates": ["{summarySpan} was a {fogNoun}."],
6
+ "slots": {
7
+ "summarySpan": [
8
+ "the rest of the drill",
9
+ "the rest of the morning",
10
+ "the rest of the walk",
11
+ "the next hour",
12
+ "everything after that",
13
+ "everything after the bell"
14
+ ],
15
+ "fogNoun": ["blur", "haze", "fog"]
16
+ },
17
+ "rejectIf": [
18
+ "sentence describes literal image blur, smoke, fog, haze, or optical conditions",
19
+ "sentence includes a concrete cause"
20
+ ],
21
+ "positiveExamples": [
22
+ "The rest of the drill was a blur.",
23
+ "Everything after that was a haze."
24
+ ],
25
+ "negativeExamples": [
26
+ "The blur in the photo came from a cracked lens.",
27
+ "The haze over the harbor came from smoke after the warehouse fire."
28
+ ],
29
+ "notes": ["This is a summary-fog transition, not a literal visual condition."]
30
+ }
@@ -3,10 +3,12 @@ import abstractMetaphorClaim from "../patterns/abstract-metaphor-claim.json" wit
3
3
  import emptyEmotionalWeather from "../patterns/empty-emotional-weather.json" with { type: "json" };
4
4
  import emptySceneState from "../patterns/empty-scene-state.json" with { type: "json" };
5
5
  import emptySceneTransition from "../patterns/empty-scene-transition.json" with { type: "json" };
6
+ import emotionAsSubstance from "../patterns/emotion-as-substance.json" with { type: "json" };
6
7
  import genericLessonExtraction from "../patterns/generic-lesson-extraction.json" with { type: "json" };
7
8
  export const semanticThinnessPatternSetA = [
8
9
  abstractContrast,
9
10
  abstractMetaphorClaim,
11
+ emotionAsSubstance,
10
12
  emptyEmotionalWeather,
11
13
  emptySceneState,
12
14
  emptySceneTransition,
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pattern-data-a.js","sourceRoot":"","sources":["../../../../src/rules/semantic-thinness/private/pattern-data-a.ts"],"names":[],"mappings":"AAAA,OAAO,gBAAgB,MAAM,oCAAoC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACxF,OAAO,qBAAqB,MAAM,0CAA0C,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACnG,OAAO,qBAAqB,MAAM,0CAA0C,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACnG,OAAO,eAAe,MAAM,oCAAoC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACvF,OAAO,oBAAoB,MAAM,yCAAyC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACjG,OAAO,kBAAkB,MAAM,uCAAuC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAC7F,OAAO,uBAAuB,MAAM,4CAA4C,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAGvG,MAAM,CAAC,MAAM,2BAA2B,GAAuC;IAC7E,gBAAgB;IAChB,qBAAqB;IACrB,kBAAkB;IAClB,qBAAqB;IACrB,eAAe;IACf,oBAAoB;IACpB,uBAAuB;CACxB,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pattern-data-b.js","sourceRoot":"","sources":["../../../../src/rules/semantic-thinness/private/pattern-data-b.ts"],"names":[],"mappings":"AAAA,OAAO,uBAAuB,MAAM,6CAA6C,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACxG,OAAO,kBAAkB,MAAM,sCAAsC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAC5F,OAAO,kBAAkB,MAAM,sCAAsC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAC5F,OAAO,8BAA8B,MAAM,oDAAoD,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACtH,OAAO,qBAAqB,MAAM,0CAA0C,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACnG,OAAO,oBAAoB,MAAM,yCAAyC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAGjG,MAAM,CAAC,MAAM,2BAA2B,GAAuC;IAC7E,uBAAuB;IACvB,kBAAkB;IAClB,kBAAkB;IAClB,8BAA8B;IAC9B,qBAAqB;IACrB,oBAAoB;CACrB,CAAC"}
@@ -0,0 +1,17 @@
1
+ import abstractPersonificationLine from "../patterns/abstract-personification-line.json" with { type: "json" };
2
+ import bodyEmotionShorthand from "../patterns/body-emotion-shorthand.json" with { type: "json" };
3
+ import emptyAtmosphereShift from "../patterns/empty-atmosphere-shift.json" with { type: "json" };
4
+ import fixedMetaphorFrame from "../patterns/fixed-metaphor-frame.json" with { type: "json" };
5
+ import gazeChoreography from "../patterns/gaze-choreography.json" with { type: "json" };
6
+ import sensoryInsteadOfFrame from "../patterns/sensory-instead-of-frame.json" with { type: "json" };
7
+ import summaryFogTransition from "../patterns/summary-fog-transition.json" with { type: "json" };
8
+ export const semanticThinnessPatternSetC = [
9
+ abstractPersonificationLine,
10
+ bodyEmotionShorthand,
11
+ emptyAtmosphereShift,
12
+ fixedMetaphorFrame,
13
+ gazeChoreography,
14
+ sensoryInsteadOfFrame,
15
+ summaryFogTransition
16
+ ];
17
+ //# sourceMappingURL=pattern-data-c.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pattern-data-c.js","sourceRoot":"","sources":["../../../../src/rules/semantic-thinness/private/pattern-data-c.ts"],"names":[],"mappings":"AAAA,OAAO,2BAA2B,MAAM,gDAAgD,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAC/G,OAAO,oBAAoB,MAAM,yCAAyC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACjG,OAAO,oBAAoB,MAAM,yCAAyC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACjG,OAAO,kBAAkB,MAAM,uCAAuC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAC7F,OAAO,gBAAgB,MAAM,oCAAoC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACxF,OAAO,qBAAqB,MAAM,2CAA2C,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACpG,OAAO,oBAAoB,MAAM,yCAAyC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAGjG,MAAM,CAAC,MAAM,2BAA2B,GAAuC;IAC7E,2BAA2B;IAC3B,oBAAoB;IACpB,oBAAoB;IACpB,kBAAkB;IAClB,gBAAgB;IAChB,qBAAqB;IACrB,oBAAoB;CACrB,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pattern-data-d.js","sourceRoot":"","sources":["../../../../src/rules/semantic-thinness/private/pattern-data-d.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,6BAA6B,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAC1E,OAAO,cAAc,MAAM,kCAAkC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACpF,OAAO,YAAY,MAAM,iCAAiC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACjF,OAAO,cAAc,MAAM,mCAAmC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACrF,OAAO,cAAc,MAAM,mCAAmC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACrF,OAAO,gBAAgB,MAAM,oCAAoC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACxF,OAAO,gBAAgB,MAAM,qCAAqC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAGzF,MAAM,CAAC,MAAM,2BAA2B,GAAuC;IAC7E,SAAS;IACT,cAAc;IACd,YAAY;IACZ,cAAc;IACd,cAAc;IACd,gBAAgB;IAChB,gBAAgB;CACjB,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pattern-data.js","sourceRoot":"","sources":["../../../../src/rules/semantic-thinness/private/pattern-data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAElE,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,GAAG,2BAA2B;IAC9B,GAAG,2BAA2B;IAC9B,GAAG,2BAA2B;IAC9B,GAAG,2BAA2B;CAC/B,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pattern-matcher.js","sourceRoot":"","sources":["../../../../src/rules/semantic-thinness/private/pattern-matcher.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,10 @@
1
1
  import { allParagraphSentences } from "../../shared/text/sections.js";
2
2
  import { semanticThinnessPatterns } from "./private/pattern-data.js";
3
+ import { emitTextlintFinding } from "../../adapters/textlint/report.js";
3
4
  import { compileSemanticThinnessPatterns, findSemanticThinnessMatch } from "./private/pattern-matcher.js";
4
5
  const COMPILED_PATTERNS = compileSemanticThinnessPatterns(semanticThinnessPatterns);
5
6
  const rule = (context) => {
6
- const { Syntax, RuleError, locator, report } = context;
7
+ const { Syntax } = context;
7
8
  return {
8
9
  [Syntax.Document](node) {
9
10
  for (const item of allParagraphSentences(node)) {
@@ -11,12 +12,15 @@ const rule = (context) => {
11
12
  if (match === undefined) {
12
13
  continue;
13
14
  }
14
- report(item.paragraph, new RuleError(`Semantic thinness (${match.patternId}): ${match.purpose} Matched template: ${match.signal}`, {
15
- padding: locator.range([
16
- item.source.originalStartFor(item.sentence.start),
17
- item.source.originalEndFor(item.sentence.end)
18
- ])
19
- }));
15
+ emitTextlintFinding(context, {
16
+ node: item.paragraph,
17
+ ruleId: "semantic-thinness:semantic-thinness",
18
+ message: `Semantic thinness (${match.patternId}): ${match.purpose} Matched template: ${match.signal}`,
19
+ range: {
20
+ start: item.source.originalStartFor(item.sentence.start),
21
+ end: item.source.originalEndFor(item.sentence.end)
22
+ }
23
+ });
20
24
  }
21
25
  }
22
26
  };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-thinness.js","sourceRoot":"","sources":["../../../src/rules/semantic-thinness/semantic-thinness.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EACL,+BAA+B,EAC/B,yBAAyB,EAC1B,MAAM,8BAA8B,CAAC;AAEtC,MAAM,iBAAiB,GAAG,+BAA+B,CACvD,wBAAwB,CACzB,CAAC;AAEF,MAAM,IAAI,GAAuB,CAAC,OAAO,EAAE,EAAE;IAC3C,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAE3B,OAAO;QACL,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAqB;YACrC,KAAK,MAAM,IAAI,IAAI,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/C,MAAM,KAAK,GAAG,yBAAyB,CACrC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAClB,iBAAiB,CAClB,CAAC;gBACF,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBACxB,SAAS;gBACX,CAAC;gBAED,mBAAmB,CAAC,OAAO,EAAE;oBAC3B,IAAI,EAAE,IAAI,CAAC,SAAS;oBACpB,MAAM,EAAE,qCAAqC;oBAC7C,OAAO,EAAE,sBAAsB,KAAK,CAAC,SAAS,MAAM,KAAK,CAAC,OAAO,sBAAsB,KAAK,CAAC,MAAM,EAAE;oBACrG,KAAK,EAAE;wBACL,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;wBACxD,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;qBACnD;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,IAAI,CAAC"}