@redocly/recheck 0.1.0 → 0.2.0

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 (591) hide show
  1. package/README.md +1006 -56
  2. package/dist/cli.js +27 -7
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/markdoc-schema.d.ts +17 -0
  5. package/dist/commands/markdoc-schema.d.ts.map +1 -0
  6. package/dist/commands/markdoc-schema.js +127 -0
  7. package/dist/commands/markdoc-schema.js.map +1 -0
  8. package/dist/commands/run.d.ts +0 -1
  9. package/dist/commands/run.d.ts.map +1 -1
  10. package/dist/commands/run.js +68 -5
  11. package/dist/commands/run.js.map +1 -1
  12. package/dist/config/load.d.ts +11 -0
  13. package/dist/config/load.d.ts.map +1 -1
  14. package/dist/config/load.js +12 -2
  15. package/dist/config/load.js.map +1 -1
  16. package/dist/config/presets/google.d.ts +3 -0
  17. package/dist/config/presets/google.d.ts.map +1 -0
  18. package/dist/config/presets/google.js +1671 -0
  19. package/dist/config/presets/google.js.map +1 -0
  20. package/dist/config/presets/inclusive-language.d.ts +3 -0
  21. package/dist/config/presets/inclusive-language.d.ts.map +1 -0
  22. package/dist/config/presets/inclusive-language.js +321 -0
  23. package/dist/config/presets/inclusive-language.js.map +1 -0
  24. package/dist/config/presets/index.d.ts +67 -0
  25. package/dist/config/presets/index.d.ts.map +1 -0
  26. package/dist/config/presets/index.js +137 -0
  27. package/dist/config/presets/index.js.map +1 -0
  28. package/dist/config/presets/markdoc.d.ts +21 -0
  29. package/dist/config/presets/markdoc.d.ts.map +1 -0
  30. package/dist/config/presets/markdoc.js +101 -0
  31. package/dist/config/presets/markdoc.js.map +1 -0
  32. package/dist/config/presets/markdown-relaxed.d.ts +3 -0
  33. package/dist/config/presets/markdown-relaxed.d.ts.map +1 -0
  34. package/dist/config/presets/markdown-relaxed.js +98 -0
  35. package/dist/config/presets/markdown-relaxed.js.map +1 -0
  36. package/dist/config/presets/markdown.d.ts +43 -0
  37. package/dist/config/presets/markdown.d.ts.map +1 -0
  38. package/dist/config/presets/markdown.js +132 -0
  39. package/dist/config/presets/markdown.js.map +1 -0
  40. package/dist/config/presets/microsoft.d.ts +3 -0
  41. package/dist/config/presets/microsoft.d.ts.map +1 -0
  42. package/dist/config/presets/microsoft.js +2268 -0
  43. package/dist/config/presets/microsoft.js.map +1 -0
  44. package/dist/config/presets/minimal.d.ts +3 -0
  45. package/dist/config/presets/minimal.d.ts.map +1 -0
  46. package/dist/config/presets/minimal.js +21 -0
  47. package/dist/config/presets/minimal.js.map +1 -0
  48. package/dist/config/presets/plain-language.d.ts +3 -0
  49. package/dist/config/presets/plain-language.d.ts.map +1 -0
  50. package/dist/config/presets/plain-language.js +351 -0
  51. package/dist/config/presets/plain-language.js.map +1 -0
  52. package/dist/config/presets/prose.d.ts +52 -0
  53. package/dist/config/presets/prose.d.ts.map +1 -0
  54. package/dist/config/presets/prose.js +138 -0
  55. package/dist/config/presets/prose.js.map +1 -0
  56. package/dist/config/schema.d.ts +128 -22
  57. package/dist/config/schema.d.ts.map +1 -1
  58. package/dist/config/schema.js +105 -21
  59. package/dist/config/schema.js.map +1 -1
  60. package/dist/config/validate.d.ts +12 -2
  61. package/dist/config/validate.d.ts.map +1 -1
  62. package/dist/config/validate.js +1200 -44
  63. package/dist/config/validate.js.map +1 -1
  64. package/dist/core/auto-fix.d.ts +8 -13
  65. package/dist/core/auto-fix.d.ts.map +1 -1
  66. package/dist/core/auto-fix.js +94 -75
  67. package/dist/core/auto-fix.js.map +1 -1
  68. package/dist/core/case-preserve.d.ts +46 -0
  69. package/dist/core/case-preserve.d.ts.map +1 -0
  70. package/dist/core/case-preserve.js +57 -0
  71. package/dist/core/case-preserve.js.map +1 -0
  72. package/dist/core/directives.d.ts +9 -0
  73. package/dist/core/directives.d.ts.map +1 -0
  74. package/dist/core/directives.js +73 -0
  75. package/dist/core/directives.js.map +1 -0
  76. package/dist/core/files.d.ts +63 -0
  77. package/dist/core/files.d.ts.map +1 -1
  78. package/dist/core/files.js +185 -0
  79. package/dist/core/files.js.map +1 -1
  80. package/dist/core/inline-code.d.ts +87 -0
  81. package/dist/core/inline-code.d.ts.map +1 -0
  82. package/dist/core/inline-code.js +104 -0
  83. package/dist/core/inline-code.js.map +1 -0
  84. package/dist/core/line-endings.d.ts +32 -0
  85. package/dist/core/line-endings.d.ts.map +1 -0
  86. package/dist/core/line-endings.js +65 -0
  87. package/dist/core/line-endings.js.map +1 -0
  88. package/dist/core/markdoc-tags.d.ts +79 -0
  89. package/dist/core/markdoc-tags.d.ts.map +1 -0
  90. package/dist/core/markdoc-tags.js +131 -0
  91. package/dist/core/markdoc-tags.js.map +1 -0
  92. package/dist/core/runner.d.ts +92 -3
  93. package/dist/core/runner.d.ts.map +1 -1
  94. package/dist/core/runner.js +348 -110
  95. package/dist/core/runner.js.map +1 -1
  96. package/dist/core/timing.d.ts.map +1 -1
  97. package/dist/data/markdoc-realm-schema.d.ts +3 -0
  98. package/dist/data/markdoc-realm-schema.d.ts.map +1 -0
  99. package/dist/data/markdoc-realm-schema.js +760 -0
  100. package/dist/data/markdoc-realm-schema.js.map +1 -0
  101. package/dist/data/proper-nouns.d.ts +2 -0
  102. package/dist/data/proper-nouns.d.ts.map +1 -0
  103. package/dist/data/proper-nouns.js +208 -0
  104. package/dist/data/proper-nouns.js.map +1 -0
  105. package/dist/index.d.ts +90 -0
  106. package/dist/index.d.ts.map +1 -0
  107. package/dist/index.js +152 -0
  108. package/dist/index.js.map +1 -0
  109. package/dist/metrics/formulas.d.ts +17 -0
  110. package/dist/metrics/formulas.d.ts.map +1 -0
  111. package/dist/metrics/formulas.js +70 -0
  112. package/dist/metrics/formulas.js.map +1 -0
  113. package/dist/metrics/index.d.ts +5 -0
  114. package/dist/metrics/index.d.ts.map +1 -0
  115. package/dist/metrics/index.js +3 -0
  116. package/dist/metrics/index.js.map +1 -0
  117. package/dist/metrics/statistics.d.ts +27 -0
  118. package/dist/metrics/statistics.d.ts.map +1 -0
  119. package/dist/metrics/statistics.js +56 -0
  120. package/dist/metrics/statistics.js.map +1 -0
  121. package/dist/parser/index.d.ts +18 -0
  122. package/dist/parser/index.d.ts.map +1 -0
  123. package/dist/parser/index.js +168 -0
  124. package/dist/parser/index.js.map +1 -0
  125. package/dist/parser/markdoc/extract-statics.d.ts +45 -0
  126. package/dist/parser/markdoc/extract-statics.d.ts.map +1 -0
  127. package/dist/parser/markdoc/extract-statics.js +139 -0
  128. package/dist/parser/markdoc/extract-statics.js.map +1 -0
  129. package/dist/parser/markdoc/pairing.d.ts +63 -0
  130. package/dist/parser/markdoc/pairing.d.ts.map +1 -0
  131. package/dist/parser/markdoc/pairing.js +94 -0
  132. package/dist/parser/markdoc/pairing.js.map +1 -0
  133. package/dist/parser/markdoc/schema.d.ts +85 -0
  134. package/dist/parser/markdoc/schema.d.ts.map +1 -0
  135. package/dist/parser/markdoc/schema.js +86 -0
  136. package/dist/parser/markdoc/schema.js.map +1 -0
  137. package/dist/parser/markdoc/span.d.ts +64 -0
  138. package/dist/parser/markdoc/span.d.ts.map +1 -0
  139. package/dist/parser/markdoc/span.js +729 -0
  140. package/dist/parser/markdoc/span.js.map +1 -0
  141. package/dist/parser/markdoc/structure.d.ts +28 -0
  142. package/dist/parser/markdoc/structure.d.ts.map +1 -0
  143. package/dist/parser/markdoc/structure.js +153 -0
  144. package/dist/parser/markdoc/structure.js.map +1 -0
  145. package/dist/parser/markdoc/syntax.d.ts +44 -0
  146. package/dist/parser/markdoc/syntax.d.ts.map +1 -0
  147. package/dist/parser/markdoc/syntax.js +317 -0
  148. package/dist/parser/markdoc/syntax.js.map +1 -0
  149. package/dist/parser/types.d.ts +18 -0
  150. package/dist/parser/types.d.ts.map +1 -0
  151. package/dist/parser/types.js.map +1 -0
  152. package/dist/reporter/fixes.d.ts.map +1 -1
  153. package/dist/reporter/fixes.js +22 -1
  154. package/dist/reporter/fixes.js.map +1 -1
  155. package/dist/reporter/statistics.d.ts +1 -8
  156. package/dist/reporter/statistics.d.ts.map +1 -1
  157. package/dist/reporter/statistics.js.map +1 -1
  158. package/dist/rules/registry.d.ts +15 -0
  159. package/dist/rules/registry.d.ts.map +1 -0
  160. package/dist/rules/registry.js +81 -0
  161. package/dist/rules/registry.js.map +1 -0
  162. package/dist/rules/scope/capitalization.d.ts +3 -0
  163. package/dist/rules/scope/capitalization.d.ts.map +1 -0
  164. package/dist/rules/scope/capitalization.js +161 -0
  165. package/dist/rules/scope/capitalization.js.map +1 -0
  166. package/dist/rules/scope/conditional.d.ts +3 -0
  167. package/dist/rules/scope/conditional.d.ts.map +1 -0
  168. package/dist/rules/scope/conditional.js +112 -0
  169. package/dist/rules/scope/conditional.js.map +1 -0
  170. package/dist/rules/scope/consistency.d.ts +3 -0
  171. package/dist/rules/scope/consistency.d.ts.map +1 -0
  172. package/dist/rules/scope/consistency.js +178 -0
  173. package/dist/rules/scope/consistency.js.map +1 -0
  174. package/dist/rules/scope/length.d.ts +3 -0
  175. package/dist/rules/scope/length.d.ts.map +1 -0
  176. package/dist/rules/scope/length.js +69 -0
  177. package/dist/rules/scope/length.js.map +1 -0
  178. package/dist/rules/scope/max-image-size.d.ts +3 -0
  179. package/dist/rules/scope/max-image-size.d.ts.map +1 -0
  180. package/dist/rules/scope/max-image-size.js +65 -0
  181. package/dist/rules/scope/max-image-size.js.map +1 -0
  182. package/dist/rules/scope/metric.d.ts +17 -0
  183. package/dist/rules/scope/metric.d.ts.map +1 -0
  184. package/dist/rules/scope/metric.js +216 -0
  185. package/dist/rules/scope/metric.js.map +1 -0
  186. package/dist/rules/scope/occurrence.d.ts +3 -0
  187. package/dist/rules/scope/occurrence.d.ts.map +1 -0
  188. package/dist/rules/scope/occurrence.js +48 -0
  189. package/dist/rules/scope/occurrence.js.map +1 -0
  190. package/dist/rules/scope/pattern.d.ts +3 -0
  191. package/dist/rules/scope/pattern.d.ts.map +1 -0
  192. package/dist/rules/scope/pattern.js +75 -0
  193. package/dist/rules/scope/pattern.js.map +1 -0
  194. package/dist/rules/scope/repetition.d.ts +3 -0
  195. package/dist/rules/scope/repetition.d.ts.map +1 -0
  196. package/dist/rules/scope/repetition.js +139 -0
  197. package/dist/rules/scope/repetition.js.map +1 -0
  198. package/dist/rules/scope/semantic-line-breaks.d.ts +3 -0
  199. package/dist/rules/scope/semantic-line-breaks.d.ts.map +1 -0
  200. package/dist/rules/scope/semantic-line-breaks.js +213 -0
  201. package/dist/rules/scope/semantic-line-breaks.js.map +1 -0
  202. package/dist/rules/scope/spelling.d.ts +27 -0
  203. package/dist/rules/scope/spelling.d.ts.map +1 -0
  204. package/dist/rules/scope/spelling.js +227 -0
  205. package/dist/rules/scope/spelling.js.map +1 -0
  206. package/dist/rules/scope/swap.d.ts +3 -0
  207. package/dist/rules/scope/swap.d.ts.map +1 -0
  208. package/dist/rules/scope/swap.js +149 -0
  209. package/dist/rules/scope/swap.js.map +1 -0
  210. package/dist/rules/scope/title-case.d.ts +42 -0
  211. package/dist/rules/scope/title-case.d.ts.map +1 -0
  212. package/dist/rules/scope/title-case.js +264 -0
  213. package/dist/rules/scope/title-case.js.map +1 -0
  214. package/dist/rules/token/blanks-around-fences.d.ts +3 -0
  215. package/dist/rules/token/blanks-around-fences.d.ts.map +1 -0
  216. package/dist/rules/token/blanks-around-fences.js +44 -0
  217. package/dist/rules/token/blanks-around-fences.js.map +1 -0
  218. package/dist/rules/token/blanks-around-headings.d.ts +3 -0
  219. package/dist/rules/token/blanks-around-headings.d.ts.map +1 -0
  220. package/dist/rules/token/blanks-around-headings.js +108 -0
  221. package/dist/rules/token/blanks-around-headings.js.map +1 -0
  222. package/dist/rules/token/blanks-around-lists.d.ts +3 -0
  223. package/dist/rules/token/blanks-around-lists.d.ts.map +1 -0
  224. package/dist/rules/token/blanks-around-lists.js +56 -0
  225. package/dist/rules/token/blanks-around-lists.js.map +1 -0
  226. package/dist/rules/token/blanks-around-tables.d.ts +3 -0
  227. package/dist/rules/token/blanks-around-tables.d.ts.map +1 -0
  228. package/dist/rules/token/blanks-around-tables.js +42 -0
  229. package/dist/rules/token/blanks-around-tables.js.map +1 -0
  230. package/dist/rules/token/code-block-style.d.ts +3 -0
  231. package/dist/rules/token/code-block-style.d.ts.map +1 -0
  232. package/dist/rules/token/code-block-style.js +30 -0
  233. package/dist/rules/token/code-block-style.js.map +1 -0
  234. package/dist/rules/token/code-fence-style.d.ts +3 -0
  235. package/dist/rules/token/code-fence-style.d.ts.map +1 -0
  236. package/dist/rules/token/code-fence-style.js +35 -0
  237. package/dist/rules/token/code-fence-style.js.map +1 -0
  238. package/dist/rules/token/commands-show-output.d.ts +3 -0
  239. package/dist/rules/token/commands-show-output.d.ts.map +1 -0
  240. package/dist/rules/token/commands-show-output.js +38 -0
  241. package/dist/rules/token/commands-show-output.js.map +1 -0
  242. package/dist/rules/token/descriptive-link-text.d.ts +3 -0
  243. package/dist/rules/token/descriptive-link-text.d.ts.map +1 -0
  244. package/dist/rules/token/descriptive-link-text.js +53 -0
  245. package/dist/rules/token/descriptive-link-text.js.map +1 -0
  246. package/dist/rules/token/emphasis-style.d.ts +3 -0
  247. package/dist/rules/token/emphasis-style.d.ts.map +1 -0
  248. package/dist/rules/token/emphasis-style.js +51 -0
  249. package/dist/rules/token/emphasis-style.js.map +1 -0
  250. package/dist/rules/token/fenced-code-language.d.ts +3 -0
  251. package/dist/rules/token/fenced-code-language.d.ts.map +1 -0
  252. package/dist/rules/token/fenced-code-language.js +35 -0
  253. package/dist/rules/token/fenced-code-language.js.map +1 -0
  254. package/dist/rules/token/first-line-h1.d.ts +3 -0
  255. package/dist/rules/token/first-line-h1.d.ts.map +1 -0
  256. package/dist/rules/token/first-line-h1.js +107 -0
  257. package/dist/rules/token/first-line-h1.js.map +1 -0
  258. package/dist/rules/token/heading-increment.d.ts +3 -0
  259. package/dist/rules/token/heading-increment.d.ts.map +1 -0
  260. package/dist/rules/token/heading-increment.js +27 -0
  261. package/dist/rules/token/heading-increment.js.map +1 -0
  262. package/dist/rules/token/heading-start-left.d.ts +3 -0
  263. package/dist/rules/token/heading-start-left.d.ts.map +1 -0
  264. package/dist/rules/token/heading-start-left.js +31 -0
  265. package/dist/rules/token/heading-start-left.js.map +1 -0
  266. package/dist/rules/token/heading-style.d.ts +3 -0
  267. package/dist/rules/token/heading-style.d.ts.map +1 -0
  268. package/dist/rules/token/heading-style.js +41 -0
  269. package/dist/rules/token/heading-style.js.map +1 -0
  270. package/dist/rules/token/helpers.d.ts +313 -0
  271. package/dist/rules/token/helpers.d.ts.map +1 -0
  272. package/dist/rules/token/helpers.js +746 -0
  273. package/dist/rules/token/helpers.js.map +1 -0
  274. package/dist/rules/token/hr-style.d.ts +3 -0
  275. package/dist/rules/token/hr-style.d.ts.map +1 -0
  276. package/dist/rules/token/hr-style.js +28 -0
  277. package/dist/rules/token/hr-style.js.map +1 -0
  278. package/dist/rules/token/index.d.ts +75 -0
  279. package/dist/rules/token/index.d.ts.map +1 -0
  280. package/dist/rules/token/index.js +226 -0
  281. package/dist/rules/token/index.js.map +1 -0
  282. package/dist/rules/token/line-length.d.ts +3 -0
  283. package/dist/rules/token/line-length.d.ts.map +1 -0
  284. package/dist/rules/token/line-length.js +120 -0
  285. package/dist/rules/token/line-length.js.map +1 -0
  286. package/dist/rules/token/link-fragments.d.ts +3 -0
  287. package/dist/rules/token/link-fragments.d.ts.map +1 -0
  288. package/dist/rules/token/link-fragments.js +145 -0
  289. package/dist/rules/token/link-fragments.js.map +1 -0
  290. package/dist/rules/token/link-image-reference-definitions.d.ts +3 -0
  291. package/dist/rules/token/link-image-reference-definitions.d.ts.map +1 -0
  292. package/dist/rules/token/link-image-reference-definitions.js +50 -0
  293. package/dist/rules/token/link-image-reference-definitions.js.map +1 -0
  294. package/dist/rules/token/link-image-style.d.ts +3 -0
  295. package/dist/rules/token/link-image-style.d.ts.map +1 -0
  296. package/dist/rules/token/link-image-style.js +131 -0
  297. package/dist/rules/token/link-image-style.js.map +1 -0
  298. package/dist/rules/token/list-indent.d.ts +3 -0
  299. package/dist/rules/token/list-indent.d.ts.map +1 -0
  300. package/dist/rules/token/list-indent.js +60 -0
  301. package/dist/rules/token/list-indent.js.map +1 -0
  302. package/dist/rules/token/list-length.d.ts +3 -0
  303. package/dist/rules/token/list-length.d.ts.map +1 -0
  304. package/dist/rules/token/list-length.js +55 -0
  305. package/dist/rules/token/list-length.js.map +1 -0
  306. package/dist/rules/token/list-marker-space.d.ts +3 -0
  307. package/dist/rules/token/list-marker-space.d.ts.map +1 -0
  308. package/dist/rules/token/list-marker-space.js +52 -0
  309. package/dist/rules/token/list-marker-space.js.map +1 -0
  310. package/dist/rules/token/markdoc-attributes.d.ts +3 -0
  311. package/dist/rules/token/markdoc-attributes.d.ts.map +1 -0
  312. package/dist/rules/token/markdoc-attributes.js +269 -0
  313. package/dist/rules/token/markdoc-attributes.js.map +1 -0
  314. package/dist/rules/token/markdoc-pairing.d.ts +3 -0
  315. package/dist/rules/token/markdoc-pairing.d.ts.map +1 -0
  316. package/dist/rules/token/markdoc-pairing.js +73 -0
  317. package/dist/rules/token/markdoc-pairing.js.map +1 -0
  318. package/dist/rules/token/markdoc-syntax.d.ts +3 -0
  319. package/dist/rules/token/markdoc-syntax.d.ts.map +1 -0
  320. package/dist/rules/token/markdoc-syntax.js +119 -0
  321. package/dist/rules/token/markdoc-syntax.js.map +1 -0
  322. package/dist/rules/token/markdoc-unknown-tag.d.ts +3 -0
  323. package/dist/rules/token/markdoc-unknown-tag.d.ts.map +1 -0
  324. package/dist/rules/token/markdoc-unknown-tag.js +64 -0
  325. package/dist/rules/token/markdoc-unknown-tag.js.map +1 -0
  326. package/dist/rules/token/messages.d.ts +4 -0
  327. package/dist/rules/token/messages.d.ts.map +1 -0
  328. package/dist/rules/token/messages.js +20 -0
  329. package/dist/rules/token/messages.js.map +1 -0
  330. package/dist/rules/token/no-alt-text.d.ts +3 -0
  331. package/dist/rules/token/no-alt-text.d.ts.map +1 -0
  332. package/dist/rules/token/no-alt-text.js +47 -0
  333. package/dist/rules/token/no-alt-text.js.map +1 -0
  334. package/dist/rules/token/no-bare-urls.d.ts +3 -0
  335. package/dist/rules/token/no-bare-urls.d.ts.map +1 -0
  336. package/dist/rules/token/no-bare-urls.js +88 -0
  337. package/dist/rules/token/no-bare-urls.js.map +1 -0
  338. package/dist/rules/token/no-blanks-blockquote.d.ts +3 -0
  339. package/dist/rules/token/no-blanks-blockquote.d.ts.map +1 -0
  340. package/dist/rules/token/no-blanks-blockquote.js +39 -0
  341. package/dist/rules/token/no-blanks-blockquote.js.map +1 -0
  342. package/dist/rules/token/no-duplicate-heading.d.ts +3 -0
  343. package/dist/rules/token/no-duplicate-heading.d.ts.map +1 -0
  344. package/dist/rules/token/no-duplicate-heading.js +101 -0
  345. package/dist/rules/token/no-duplicate-heading.js.map +1 -0
  346. package/dist/rules/token/no-duplicate-link-destinations.d.ts +3 -0
  347. package/dist/rules/token/no-duplicate-link-destinations.d.ts.map +1 -0
  348. package/dist/rules/token/no-duplicate-link-destinations.js +65 -0
  349. package/dist/rules/token/no-duplicate-link-destinations.js.map +1 -0
  350. package/dist/rules/token/no-emphasis-as-heading.d.ts +3 -0
  351. package/dist/rules/token/no-emphasis-as-heading.d.ts.map +1 -0
  352. package/dist/rules/token/no-emphasis-as-heading.js +44 -0
  353. package/dist/rules/token/no-emphasis-as-heading.js.map +1 -0
  354. package/dist/rules/token/no-empty-headings.d.ts +3 -0
  355. package/dist/rules/token/no-empty-headings.d.ts.map +1 -0
  356. package/dist/rules/token/no-empty-headings.js +28 -0
  357. package/dist/rules/token/no-empty-headings.js.map +1 -0
  358. package/dist/rules/token/no-empty-links.d.ts +3 -0
  359. package/dist/rules/token/no-empty-links.d.ts.map +1 -0
  360. package/dist/rules/token/no-empty-links.js +67 -0
  361. package/dist/rules/token/no-empty-links.js.map +1 -0
  362. package/dist/rules/token/no-hard-tabs.d.ts +3 -0
  363. package/dist/rules/token/no-hard-tabs.d.ts.map +1 -0
  364. package/dist/rules/token/no-hard-tabs.js +76 -0
  365. package/dist/rules/token/no-hard-tabs.js.map +1 -0
  366. package/dist/rules/token/no-inline-html.d.ts +3 -0
  367. package/dist/rules/token/no-inline-html.d.ts.map +1 -0
  368. package/dist/rules/token/no-inline-html.js +45 -0
  369. package/dist/rules/token/no-inline-html.js.map +1 -0
  370. package/dist/rules/token/no-missing-space-atx.d.ts +3 -0
  371. package/dist/rules/token/no-missing-space-atx.d.ts.map +1 -0
  372. package/dist/rules/token/no-missing-space-atx.js +36 -0
  373. package/dist/rules/token/no-missing-space-atx.js.map +1 -0
  374. package/dist/rules/token/no-missing-space-closed-atx.d.ts +3 -0
  375. package/dist/rules/token/no-missing-space-closed-atx.d.ts.map +1 -0
  376. package/dist/rules/token/no-missing-space-closed-atx.js +45 -0
  377. package/dist/rules/token/no-missing-space-closed-atx.js.map +1 -0
  378. package/dist/rules/token/no-multiple-blanks.d.ts +3 -0
  379. package/dist/rules/token/no-multiple-blanks.d.ts.map +1 -0
  380. package/dist/rules/token/no-multiple-blanks.js +35 -0
  381. package/dist/rules/token/no-multiple-blanks.js.map +1 -0
  382. package/dist/rules/token/no-multiple-space-atx.d.ts +13 -0
  383. package/dist/rules/token/no-multiple-space-atx.d.ts.map +1 -0
  384. package/dist/rules/token/no-multiple-space-atx.js +50 -0
  385. package/dist/rules/token/no-multiple-space-atx.js.map +1 -0
  386. package/dist/rules/token/no-multiple-space-blockquote.d.ts +3 -0
  387. package/dist/rules/token/no-multiple-space-blockquote.d.ts.map +1 -0
  388. package/dist/rules/token/no-multiple-space-blockquote.js +43 -0
  389. package/dist/rules/token/no-multiple-space-blockquote.js.map +1 -0
  390. package/dist/rules/token/no-multiple-space-closed-atx.d.ts +3 -0
  391. package/dist/rules/token/no-multiple-space-closed-atx.d.ts.map +1 -0
  392. package/dist/rules/token/no-multiple-space-closed-atx.js +19 -0
  393. package/dist/rules/token/no-multiple-space-closed-atx.js.map +1 -0
  394. package/dist/rules/token/no-reversed-links.d.ts +3 -0
  395. package/dist/rules/token/no-reversed-links.d.ts.map +1 -0
  396. package/dist/rules/token/no-reversed-links.js +52 -0
  397. package/dist/rules/token/no-reversed-links.js.map +1 -0
  398. package/dist/rules/token/no-space-in-code.d.ts +3 -0
  399. package/dist/rules/token/no-space-in-code.d.ts.map +1 -0
  400. package/dist/rules/token/no-space-in-code.js +75 -0
  401. package/dist/rules/token/no-space-in-code.js.map +1 -0
  402. package/dist/rules/token/no-space-in-emphasis.d.ts +3 -0
  403. package/dist/rules/token/no-space-in-emphasis.d.ts.map +1 -0
  404. package/dist/rules/token/no-space-in-emphasis.js +79 -0
  405. package/dist/rules/token/no-space-in-emphasis.js.map +1 -0
  406. package/dist/rules/token/no-space-in-links.d.ts +3 -0
  407. package/dist/rules/token/no-space-in-links.d.ts.map +1 -0
  408. package/dist/rules/token/no-space-in-links.js +48 -0
  409. package/dist/rules/token/no-space-in-links.js.map +1 -0
  410. package/dist/rules/token/no-trailing-punctuation.d.ts +3 -0
  411. package/dist/rules/token/no-trailing-punctuation.d.ts.map +1 -0
  412. package/dist/rules/token/no-trailing-punctuation.js +38 -0
  413. package/dist/rules/token/no-trailing-punctuation.js.map +1 -0
  414. package/dist/rules/token/no-trailing-spaces.d.ts +3 -0
  415. package/dist/rules/token/no-trailing-spaces.d.ts.map +1 -0
  416. package/dist/rules/token/no-trailing-spaces.js +89 -0
  417. package/dist/rules/token/no-trailing-spaces.js.map +1 -0
  418. package/dist/rules/token/ol-prefix.d.ts +3 -0
  419. package/dist/rules/token/ol-prefix.d.ts.map +1 -0
  420. package/dist/rules/token/ol-prefix.js +70 -0
  421. package/dist/rules/token/ol-prefix.js.map +1 -0
  422. package/dist/rules/token/proper-names.d.ts +3 -0
  423. package/dist/rules/token/proper-names.d.ts.map +1 -0
  424. package/dist/rules/token/proper-names.js +93 -0
  425. package/dist/rules/token/proper-names.js.map +1 -0
  426. package/dist/rules/token/reference-links-images.d.ts +3 -0
  427. package/dist/rules/token/reference-links-images.d.ts.map +1 -0
  428. package/dist/rules/token/reference-links-images.js +36 -0
  429. package/dist/rules/token/reference-links-images.js.map +1 -0
  430. package/dist/rules/token/required-headings.d.ts +3 -0
  431. package/dist/rules/token/required-headings.d.ts.map +1 -0
  432. package/dist/rules/token/required-headings.js +83 -0
  433. package/dist/rules/token/required-headings.js.map +1 -0
  434. package/dist/rules/token/single-h1.d.ts +3 -0
  435. package/dist/rules/token/single-h1.d.ts.map +1 -0
  436. package/dist/rules/token/single-h1.js +56 -0
  437. package/dist/rules/token/single-h1.js.map +1 -0
  438. package/dist/rules/token/single-trailing-newline.d.ts +3 -0
  439. package/dist/rules/token/single-trailing-newline.d.ts.map +1 -0
  440. package/dist/rules/token/single-trailing-newline.js +25 -0
  441. package/dist/rules/token/single-trailing-newline.js.map +1 -0
  442. package/dist/rules/token/strong-style.d.ts +3 -0
  443. package/dist/rules/token/strong-style.d.ts.map +1 -0
  444. package/dist/rules/token/strong-style.js +51 -0
  445. package/dist/rules/token/strong-style.js.map +1 -0
  446. package/dist/rules/token/table-column-count.d.ts +3 -0
  447. package/dist/rules/token/table-column-count.d.ts.map +1 -0
  448. package/dist/rules/token/table-column-count.js +44 -0
  449. package/dist/rules/token/table-column-count.js.map +1 -0
  450. package/dist/rules/token/table-column-style.d.ts +3 -0
  451. package/dist/rules/token/table-column-style.d.ts.map +1 -0
  452. package/dist/rules/token/table-column-style.js +179 -0
  453. package/dist/rules/token/table-column-style.js.map +1 -0
  454. package/dist/rules/token/table-pipe-style.d.ts +3 -0
  455. package/dist/rules/token/table-pipe-style.d.ts.map +1 -0
  456. package/dist/rules/token/table-pipe-style.js +54 -0
  457. package/dist/rules/token/table-pipe-style.js.map +1 -0
  458. package/dist/rules/token/ul-indent.d.ts +3 -0
  459. package/dist/rules/token/ul-indent.d.ts.map +1 -0
  460. package/dist/rules/token/ul-indent.js +72 -0
  461. package/dist/rules/token/ul-indent.js.map +1 -0
  462. package/dist/rules/token/ul-style.d.ts +3 -0
  463. package/dist/rules/token/ul-style.d.ts.map +1 -0
  464. package/dist/rules/token/ul-style.js +80 -0
  465. package/dist/rules/token/ul-style.js.map +1 -0
  466. package/dist/rules/types.d.ts +81 -0
  467. package/dist/rules/types.d.ts.map +1 -0
  468. package/dist/rules/types.js +2 -0
  469. package/dist/rules/types.js.map +1 -0
  470. package/dist/rules/utils.d.ts +29 -0
  471. package/dist/rules/utils.d.ts.map +1 -0
  472. package/dist/{assertions → rules}/utils.js +27 -0
  473. package/dist/rules/utils.js.map +1 -0
  474. package/dist/scopes/extractor.d.ts +7 -0
  475. package/dist/scopes/extractor.d.ts.map +1 -0
  476. package/dist/scopes/extractor.js +475 -0
  477. package/dist/scopes/extractor.js.map +1 -0
  478. package/dist/scopes/selector.d.ts +51 -0
  479. package/dist/scopes/selector.d.ts.map +1 -0
  480. package/dist/scopes/selector.js +121 -0
  481. package/dist/scopes/selector.js.map +1 -0
  482. package/dist/scopes/sentences.d.ts +7 -0
  483. package/dist/scopes/sentences.d.ts.map +1 -0
  484. package/dist/scopes/sentences.js +115 -0
  485. package/dist/scopes/sentences.js.map +1 -0
  486. package/dist/scopes/types.d.ts +44 -0
  487. package/dist/scopes/types.d.ts.map +1 -0
  488. package/dist/scopes/types.js +2 -0
  489. package/dist/scopes/types.js.map +1 -0
  490. package/dist/scopes/vocabulary.d.ts +16 -0
  491. package/dist/scopes/vocabulary.d.ts.map +1 -0
  492. package/dist/scopes/vocabulary.js +70 -0
  493. package/dist/scopes/vocabulary.js.map +1 -0
  494. package/dist/types/assertions.d.ts +95 -32
  495. package/dist/types/assertions.d.ts.map +1 -1
  496. package/dist/types/problems.d.ts +4 -5
  497. package/dist/types/problems.d.ts.map +1 -1
  498. package/dist/types/rules.d.ts +4 -6
  499. package/dist/types/rules.d.ts.map +1 -1
  500. package/examples/appendices/google.appendix.yaml +91 -0
  501. package/examples/appendices/inclusive-language.appendix.yaml +61 -0
  502. package/examples/appendices/microsoft.appendix.yaml +99 -0
  503. package/examples/appendices/plain-language.appendix.yaml +88 -0
  504. package/examples/google.yaml +1525 -0
  505. package/examples/inclusive-language.yaml +304 -0
  506. package/examples/microsoft.yaml +1542 -0
  507. package/examples/plain-language.yaml +325 -0
  508. package/package.json +49 -16
  509. package/presets/google/PROVENANCE.md +1022 -0
  510. package/presets/google/sources.json +192 -0
  511. package/presets/inclusive-language/PROVENANCE.md +174 -0
  512. package/presets/inclusive-language/sources.json +107 -0
  513. package/presets/microsoft/PROVENANCE.md +1555 -0
  514. package/presets/microsoft/sources.json +494 -0
  515. package/presets/plain-language/PROVENANCE.md +364 -0
  516. package/presets/plain-language/sources.json +108 -0
  517. package/dist/assertions/bullet-style.d.ts +0 -3
  518. package/dist/assertions/bullet-style.d.ts.map +0 -1
  519. package/dist/assertions/bullet-style.js +0 -60
  520. package/dist/assertions/bullet-style.js.map +0 -1
  521. package/dist/assertions/index.d.ts +0 -21
  522. package/dist/assertions/index.d.ts.map +0 -1
  523. package/dist/assertions/index.js +0 -30
  524. package/dist/assertions/index.js.map +0 -1
  525. package/dist/assertions/max-image-size.d.ts +0 -3
  526. package/dist/assertions/max-image-size.d.ts.map +0 -1
  527. package/dist/assertions/max-image-size.js +0 -73
  528. package/dist/assertions/max-image-size.js.map +0 -1
  529. package/dist/assertions/max-line-length.d.ts +0 -3
  530. package/dist/assertions/max-line-length.d.ts.map +0 -1
  531. package/dist/assertions/max-line-length.js +0 -68
  532. package/dist/assertions/max-line-length.js.map +0 -1
  533. package/dist/assertions/no-broken-fragment-links.d.ts +0 -3
  534. package/dist/assertions/no-broken-fragment-links.d.ts.map +0 -1
  535. package/dist/assertions/no-broken-fragment-links.js +0 -79
  536. package/dist/assertions/no-broken-fragment-links.js.map +0 -1
  537. package/dist/assertions/no-duplicate-headings.d.ts +0 -3
  538. package/dist/assertions/no-duplicate-headings.d.ts.map +0 -1
  539. package/dist/assertions/no-duplicate-headings.js +0 -66
  540. package/dist/assertions/no-duplicate-headings.js.map +0 -1
  541. package/dist/assertions/no-hard-tabs.d.ts +0 -3
  542. package/dist/assertions/no-hard-tabs.d.ts.map +0 -1
  543. package/dist/assertions/no-hard-tabs.js +0 -63
  544. package/dist/assertions/no-hard-tabs.js.map +0 -1
  545. package/dist/assertions/no-trailing-spaces.d.ts +0 -3
  546. package/dist/assertions/no-trailing-spaces.d.ts.map +0 -1
  547. package/dist/assertions/no-trailing-spaces.js +0 -72
  548. package/dist/assertions/no-trailing-spaces.js.map +0 -1
  549. package/dist/assertions/pattern.d.ts +0 -3
  550. package/dist/assertions/pattern.d.ts.map +0 -1
  551. package/dist/assertions/pattern.js +0 -39
  552. package/dist/assertions/pattern.js.map +0 -1
  553. package/dist/assertions/semantic-line-breaks.d.ts +0 -3
  554. package/dist/assertions/semantic-line-breaks.d.ts.map +0 -1
  555. package/dist/assertions/semantic-line-breaks.js +0 -152
  556. package/dist/assertions/semantic-line-breaks.js.map +0 -1
  557. package/dist/assertions/swap.d.ts +0 -3
  558. package/dist/assertions/swap.d.ts.map +0 -1
  559. package/dist/assertions/swap.js +0 -39
  560. package/dist/assertions/swap.js.map +0 -1
  561. package/dist/assertions/utils.d.ts +0 -8
  562. package/dist/assertions/utils.d.ts.map +0 -1
  563. package/dist/assertions/utils.js.map +0 -1
  564. package/dist/core/scope-parser.d.ts +0 -26
  565. package/dist/core/scope-parser.d.ts.map +0 -1
  566. package/dist/core/scope-parser.js +0 -110
  567. package/dist/core/scope-parser.js.map +0 -1
  568. package/dist/files.d.ts +0 -2
  569. package/dist/files.d.ts.map +0 -1
  570. package/dist/files.js +0 -39
  571. package/dist/files.js.map +0 -1
  572. package/dist/load-config.d.ts +0 -25
  573. package/dist/load-config.d.ts.map +0 -1
  574. package/dist/load-config.js +0 -104
  575. package/dist/load-config.js.map +0 -1
  576. package/dist/load.d.ts +0 -25
  577. package/dist/load.d.ts.map +0 -1
  578. package/dist/load.js +0 -112
  579. package/dist/load.js.map +0 -1
  580. package/dist/scope.d.ts +0 -26
  581. package/dist/scope.d.ts.map +0 -1
  582. package/dist/scope.js +0 -110
  583. package/dist/scope.js.map +0 -1
  584. package/dist/types.d.ts +0 -109
  585. package/dist/types.d.ts.map +0 -1
  586. package/dist/types.js.map +0 -1
  587. package/dist/validate.d.ts +0 -31
  588. package/dist/validate.d.ts.map +0 -1
  589. package/dist/validate.js +0 -154
  590. package/dist/validate.js.map +0 -1
  591. /package/dist/{types.js → parser/types.js} +0 -0
@@ -0,0 +1,364 @@
1
+ # Provenance: `recheck/plain-language`
2
+
3
+ Source: US federal plain-language guidance, as actually LIVE today —
4
+ `https://digital.gov/guides/plain-language` and its subpages, plus the OMB
5
+ Memo M-11-15 PDF (`whitehouse.gov`). Public domain: no CC-BY attribution
6
+ constraint, but pages are cited here (and in each rule's `link:`) for
7
+ auditability. Sync/verification date: **2026-07-30**.
8
+
9
+ Modification note: rules are adapted to Recheck's assertion vocabulary
10
+ (`length`, `swap`, `pattern`); wording is paraphrased into each rule's
11
+ `message`, not quoted verbatim. Every rule carries a `link:` to its source
12
+ page.
13
+
14
+ ## `plainlanguage.gov` is dead
15
+
16
+ Every path under `plainlanguage.gov` — `/guidelines/words/simple-words-
17
+ phrases/`, `/guidelines/sentences/`, `/guidelines/paragraphs/`, even the
18
+ classic `/media/FederalPlainLanguageGuidelines.pdf` — now issues an HTTP 301
19
+ to a single, much thinner overview page: `https://digital.gov/guides/plain-
20
+ language`. That page itself states its content is "adapted from
21
+ PlainLanguage.gov" and that the original site survives only "archived in the
22
+ PlainLanguage.gov GitHub repository" — a non-`.gov` domain, and therefore
23
+ **not used as a source** here, per the verification's own `.gov`-only rule.
24
+ Every citation below is what is actually live on `digital.gov`,
25
+ `plainlanguage.gov` (the redirect target), or `whitehouse.gov` (the OMB PDF)
26
+ as of 2026-07-30.
27
+
28
+ ## Method
29
+
30
+ `curl -sL` (redirects followed) fetched every page; a small local Python 3
31
+ script (`extract.py`, regex-based tag stripping + `html.unescape`, no
32
+ summarizing tool) parsed the result, preserving block structure as line
33
+ breaks; tables were re-parsed directly from raw HTML `<tr>/<td>` structure.
34
+ The one PDF (OMB Memo M-11-15) was read directly via a native PDF reader, not
35
+ summarized. **No `WebFetch` or other summarizing tool was used at any
36
+ point** — the same discipline this phase's provenance work requires
37
+ everywhere else, after the fabrication incident that motivated it.
38
+
39
+ ## `sources.json` normalization
40
+
41
+ `sources.json` records one hash per source page as drift detection for a
42
+ future re-check: re-fetch a page later, and a changed digest means the
43
+ guide's content changed. The version of this file that shipped before this
44
+ correction hashed the raw HTML response directly and claimed digital.gov's
45
+ plain-language pages are stable enough for that to work as reproducible
46
+ drift detection ("two consecutive fetches of the same URL are
47
+ byte-identical"). **That claim does not hold.** On independent re-fetch of
48
+ all 9 pages listed in `sources.json`, every recorded `bytes` (raw page
49
+ length) matched the live page exactly, but **none** of the 9 recorded raw-
50
+ HTML `sha256` values did — a 100% mismatch rate against a claim of
51
+ byte-for-byte reproducibility, which is the same shape of unearned
52
+ auditability claim already caught and fixed in `recheck/google`'s own
53
+ `sources.json` (its raw-HTML hashes failed to reproduce for a different
54
+ reason — see that file's own normalization section).
55
+
56
+ **Cause, found by diffing two raw fetches of the same URL:** unlike
57
+ Google's per-request analytics/nonce/feature-flag noise, digital.gov's
58
+ instability is not per-request — repeated fetches within one short session
59
+ are identical. It is Drupal build/deploy metadata embedded in every
60
+ response, outside the guide content: an anonymous-user `permissionsHash`
61
+ (a 64-hex-char token inside the inline `<script type="application/json"
62
+ data-drupal-selector="drupal-settings-json">` block), Drupal's
63
+ asset-aggregation CSS/JS filenames (`css_<hash>.css`, `js_<hash>.js` —
64
+ content-hashed per build), and an `ajaxPageState.libraries` deflate+base64
65
+ blob describing which asset libraries loaded. All of these regenerate
66
+ across Drupal deploys/cache-clears rather than every single request, and
67
+ each is a fixed-format token (a hash of a given length, a compressed list
68
+ of a given rough size) — so the page's overall byte count stays constant
69
+ across a deploy even when the exact bytes don't, which is exactly why the
70
+ `bytes` field alone looked reproducible while `sha256` wasn't.
71
+
72
+ **Fix**: hash the extracted `<main>...</main>` region instead of the full
73
+ page — the same fix `recheck/google` and `recheck/microsoft` already
74
+ applied for their own per-request/per-build noise. Every one of the
75
+ Drupal tokens above was confirmed to live before the opening `<main>` tag
76
+ (checked by scanning the extracted region of all 9 pages for any 16+
77
+ character hex/base64-like token — zero hits). Reproduction recipe: fetch
78
+ the page's HTML with `curl -sL` (redirects followed), take the first
79
+ `<main ...>...</main>` match (a non-greedy, dot-matches-newline regex
80
+ scan against `[\s\S]`; every page has exactly one), and sha256 the UTF-8
81
+ bytes of that substring.
82
+
83
+ **Reproducibility, verified rather than assumed**: all 9 pages in
84
+ `sources.json` were fetched TWICE each, ~80 seconds apart — past this
85
+ site's own `cache-control: max-age=60` CDN TTL, so the second fetch is not
86
+ guaranteed to be served from cache — and the extracted `<main>` region was
87
+ byte-identical (and therefore sha256-identical) both times, for every
88
+ page. `bytes` in `sources.json` now records the extracted region's length,
89
+ not the raw page's, matching the `recheck/google`/`recheck/microsoft`
90
+ convention — a future re-check with a matching `bytes` but a different
91
+ `sha256` (or vice versa) is a signal to check whether the extraction shape
92
+ itself changed before treating the result as real guide drift.
93
+
94
+ ## THE NUMBER — why no `metric`/readability rule ships
95
+
96
+ **No live federal plain-language page states a grade level, a Flesch/
97
+ readability score, or any other scorable numeric target for prose.** Grepped
98
+ for `flesch`, `reading ease`, `readab`, `grade level`, `grade-level`, `grade
99
+ point`, `reading level`, `lexile` across all 21 fetched `digital.gov` pages
100
+ plus the OMB M-11-15 PDF text — zero numeric hits.
101
+
102
+ The one grade-level mention that exists is the OPPOSITE of a licensed
103
+ target. From `https://digital.gov/guides/plain-language/principles`
104
+ ("Write for your audience"):
105
+
106
+ > "Don't write for an 8th-grade class if your readers are PhD candidates,
107
+ > small business owners, or working parents."
108
+ >
109
+ > "Only write for 8th graders if your audience is, in fact, an 8th-grade
110
+ > class."
111
+
112
+ Reporting this as a licensed "8th grade" number would be the exact
113
+ fabrication shape flagged elsewhere in this phase (a scorable threshold
114
+ attributed to a guide that never published one). The guidance's own testing
115
+ method (`https://digital.gov/guides/plain-language/test`) is user testing
116
+ (paraphrase testing, usability testing, comparative studies), not an
117
+ automated readability formula — there is no algorithmic substitute offered
118
+ anywhere on the site. **Verdict: `metric` stays a documented opt-in.** No
119
+ change to `DOCUMENTED_OPT_IN_ASSERTIONS` (`presets/index.ts`) or the
120
+ README's "Opt-in prose assertions" section.
121
+
122
+ ## Sentence length — no stated number either
123
+
124
+ Only qualitative advice exists on the live site: "Express only one idea in
125
+ each sentence" / "Write short sentences"
126
+ (`https://digital.gov/guides/plain-language/writing/clear-short`). No word
127
+ count is given for sentences on any live page — no `length` rule ships for
128
+ sentences.
129
+
130
+ ## Paragraph length — the one family with real numbers
131
+
132
+ From the same `clear-short` page:
133
+
134
+ | Claim | Live quote | Shipped as |
135
+ |---|---|---|
136
+ | Soft target (attributed to "writing experts", not the guide's own voice) | "Writing experts recommend paragraphs of no more than 150 words in three to eight sentences." | `plain-language/paragraph-sentence-count` — `length`, `unit: sentences`, `max: 8`, `severity: warn`. No `min`: a floor over-fires on ordinary, correct single-sentence paragraphs (a short lead-in to a code block, an image caption) — the identical reasoning `microsoft/paragraph-length` already documents for the same family. |
137
+ | Hard ceiling, stated in the guide's own unconditional voice | "Paragraphs should never be longer than 250 words." | `plain-language/paragraph-max-words` — `length`, `unit: words`, `max: 250`, `severity: error` (unconditional, guide-stated — matches the severity policy behind `google/sentence-length`). |
138
+
139
+ ## Word/phrase families shipped
140
+
141
+ ### Filler / wordy phrases
142
+ Source: `https://digital.gov/guides/plain-language/writing/style`
143
+ ("Check your prepositions" table).
144
+
145
+ | avoid | prefer (shipped) | note |
146
+ |---|---|---|
147
+ | a number of | several, a few, or many | |
148
+ | a sufficient number of | enough | |
149
+ | at this point in time | now | |
150
+ | is able to | can | |
151
+ | on a monthly basis | monthly | |
152
+ | on the ground that | because | |
153
+ | in order to | to | the exact pair the original plan named, confirmed verbatim |
154
+ | an amount of X | X | templated (variable X) — ships separately as `plain-language/an-amount-of`, detection-only (`pattern`, no fixed replacement) |
155
+
156
+ **Deliberately NOT shipped: `be responsible for` → `must`.** Live, verbatim
157
+ on the same table, but this pairing is an odd 1:1 substitution that
158
+ misreads ordinary, correct accountability language ("the team is
159
+ responsible for the migration") as wordiness. Unlike the other pairs above,
160
+ there is no textual signal distinguishing the guide's intended sense
161
+ (padding) from the extremely common correct sense (genuine responsibility) —
162
+ excluded rather than shipped noisy.
163
+
164
+ ### Excess intensifiers
165
+ Source: `https://digital.gov/guides/plain-language/principles/short-simple`
166
+ — a literal cut-list, not paired substitutions: "absolutely, actually,
167
+ completely, really, quite, totally, very." Shipped as
168
+ `plain-language/excess-intensifiers`, detection-only (`pattern`) — cutting
169
+ an intensifier is an editorial call, not a mechanical substitution.
170
+
171
+ ### Complex words / simple substitutes
172
+ Source: `https://digital.gov/guides/writing-understanding/familiar-terms`
173
+ ("Complex words and recommended terms to use instead").
174
+
175
+ | avoid | prefer (shipped) |
176
+ |---|---|
177
+ | addressee | you |
178
+ | assist, assistance | help |
179
+ | commence | begin |
180
+ | in order that | for |
181
+ | in the amount of | for |
182
+ | in the event of | if |
183
+ | promulgate | issue |
184
+ | utilize, utilization | use |
185
+
186
+ **Deliberately NOT shipped: `implement` → carry out, start.** Live,
187
+ verbatim on this table — but in software/API documentation, "implement an
188
+ interface," "implement this endpoint," "implement the spec" is ordinary,
189
+ correct technical vocabulary, not wordiness. Flagging it would misfire
190
+ across nearly every technical document Recheck targets.
191
+
192
+ **Deliberately NOT shipped: `this activity, command` → us, we.** This row is
193
+ itself a garbled/mismatched pairing on the live page (confirmed live, not an
194
+ extraction error, but reads as a stray editorial artifact rather than a
195
+ clean semantic pair) — and separately, "command" has a strong, unrelated,
196
+ extremely common technical sense (CLI command, terminal command) that is
197
+ core developer-docs vocabulary. Excluded on both grounds.
198
+
199
+ **`shall` never appears anywhere in this preset**, in any family — even
200
+ though the SAME `familiar-terms` page, immediately after the table above,
201
+ explicitly names it: *"Avoid 'shall' — Use 'must' not 'shall' to impose
202
+ requirements. 'Shall' is ambiguous... 'Shall' is an aggressive and outdated
203
+ word often used in legal style writing."* (verified verbatim, live,
204
+ 2026-07-30). **SHALL is a defined RFC 2119 normative keyword** (alongside
205
+ MUST/SHOULD/MAY/MUST NOT) used throughout specifications and API/interface
206
+ documentation — exactly Recheck's target content. A rule flagging it would
207
+ be actively wrong for that whole document class: RFC 2119 usage is a
208
+ different, correct register the federal guidance never anticipated, not an
209
+ exception it carves out. This is the single highest-risk exclusion in this
210
+ preset, named explicitly in the task's own domain-hazard callout alongside
211
+ `implement`
212
+ and `command`.
213
+
214
+ ### Redundant pairs (doublets)
215
+ Source:
216
+ `https://digital.gov/guides/plain-language/principles/short-simple`
217
+ ("Avoid doublets and triplets... Examples of doublets and recommended
218
+ alternatives").
219
+
220
+ | avoid | prefer (shipped) |
221
+ |---|---|
222
+ | Due and payable | Due |
223
+ | Cease and desist | Stop |
224
+ | Knowledge and information | Knowledge or information |
225
+
226
+ **Note: "each and every," "null and void," "true and correct," "first and
227
+ foremost," "any and all," and "full and complete" do NOT appear anywhere on
228
+ the live site** (grepped explicitly, zero hits) — only the three doublets
229
+ above are actually live. Do not cite the others as guide-derived if a future
230
+ edit touches this family.
231
+
232
+ **Cease and desist** is also a fixed legal term of art / the name of a
233
+ document type ("a cease-and-desist letter"). Shipped anyway (detection-only,
234
+ `warn` severity, matching the same risk tolerance `google/black-white-box-
235
+ testing` and similar entries already accept for phrase-level matches with a
236
+ documented ambiguity) — flagged here rather than silently excluded.
237
+
238
+ **"Due"** alone is never matched — the swap key is the full phrase "due and
239
+ payable", so ordinary uses of bare "due" (due date, due diligence, past due)
240
+ are unaffected.
241
+
242
+ ### Double negatives
243
+ Source: `https://digital.gov/guides/plain-language/writing/style`
244
+ ("Examples of recommended alternative terms for double negatives").
245
+
246
+ | avoid | prefer (shipped) | mechanism |
247
+ |---|---|---|
248
+ | has not yet attained | is under | `swap` (fixed phrase) |
249
+ | no fewer than | at least | `swap` (fixed phrase) |
250
+ | may not … until | may only … when | `pattern` (variable text between the two halves in the guide's own quote — can't be a literal-phrase swap) |
251
+ | is not … unless | only if | `pattern` (same reason) |
252
+
253
+ ### Jargon → everyday language
254
+ Source: `https://digital.gov/guides/plain-language/principles/avoid-jargon`
255
+ ("Consider the following pairs").
256
+
257
+ | avoid | prefer (shipped) |
258
+ |---|---|
259
+ | Riverine avifauna | River birds |
260
+ | Involuntarily undomiciled | Unhoused |
261
+
262
+ ## Families considered and NOT shipped (abstract advice, not concrete pairs)
263
+
264
+ - **Nominalizations ("hidden verbs")** — the live page
265
+ (`https://digital.gov/guides/plain-language/writing`) gives only two
266
+ full-sentence before/after examples ("We conduct an analysis of the
267
+ data." → "We analyze data."; "We are responsible for management of the
268
+ program." → "We manage the program.") plus a morphological pattern
269
+ (suffixes `-ment`, `-tion`, `-sion`, `-ance` combined with link verbs
270
+ achieve/effect/give/have/make/reach/take). That pattern is not safely
271
+ concrete: ordinary, entirely correct nouns sharing those suffixes
272
+ ("chance", "moment", "information", "attention", "decision" used plainly,
273
+ "assurance", "distance") would false-positive constantly under any
274
+ verb+suffix pattern rule — a materially worse hit rate than the excluded
275
+ word-level pairs above. Omitted rather than shipped noisy.
276
+ - **Sentence-length numeric rule** — no word count is stated anywhere on
277
+ the live site; see above.
278
+ - **Grade-level/readability `metric` rule** — no number is stated anywhere
279
+ on the live site; see above.
280
+ - **Abbreviation count per document** ("Limit the number of abbreviations
281
+ you use in one document to no more than three, preferably two" —
282
+ `https://digital.gov/guides/plain-language/writing/style`). A real,
283
+ quotable number — but it counts DISTINCT abbreviation TYPES per document,
284
+ not total occurrences. Neither `occurrence` nor `length` can express
285
+ "count of distinct matching values" (both count total matches/size), so
286
+ faithfully enforcing this specific number is an engine gap, not a
287
+ judgment call — out of scope for this preset.
288
+ - **Paraphrase-testing sample size, testing iteration count** — both are
289
+ user-testing METHODOLOGY recommendations, not document content; not
290
+ something a markdown/prose linter can ever evaluate from text alone.
291
+
292
+ ## Duplicate-finding audit
293
+
294
+ A composable preset that duplicates a flagship's own findings on the same
295
+ span is noise, not value — measured directly with `lintContent` over this
296
+ preset's own violations fixture, stacked onto each flagship in turn (see
297
+ `preset-composition.test.ts`'s "duplicate findings" describe block for the
298
+ live, asserted counts).
299
+
300
+ Stacking `recheck/plain-language` onto `recheck/google` originally produced
301
+ **6** duplicate positions (same file/line/column, 2+ distinct rule names);
302
+ onto `recheck/microsoft`, **5**. Two pairs accounted for 3 of those on each
303
+ side and are REMOVED as a result:
304
+
305
+ | Removed pair | Was in | Already shipped, identically, by |
306
+ |---|---|---|
307
+ | `in order to` → `to` | `plain-language/filler-phrases` | `google/in-order-to` AND `microsoft/simple-words` |
308
+ | `utilize`/`utilization` → `use` | `plain-language/complex-words` | `google/utilize` AND `microsoft/simple-words` |
309
+
310
+ Both are removed outright, not merely documented as an accepted overlap:
311
+ they add zero coverage for anyone already running either flagship, and a
312
+ user running neither flagship loses nothing meaningful by their absence —
313
+ these are common enough words that a project without either flagship
314
+ almost certainly has its own opinion, or none, either way. This is the
315
+ general rule of thumb for this class of overlap: prefer removal when the
316
+ flagship's coverage is genuinely equivalent (same phrase, same
317
+ replacement), which both of these are.
318
+
319
+ **3** duplicate positions remain against each flagship (google+plain-
320
+ language: 3 of 35 total problems on the violations fixture;
321
+ microsoft+plain-language: 3 of 35). These are KEPT, not removed, because
322
+ they are not content-equivalence — each is either:
323
+
324
+ 1. **The accepted paragraph-length overlap** — `plain-language/paragraph-
325
+ max-words` and `plain-language/paragraph-sentence-count` always co-fire
326
+ on the same long paragraph (that's two independently-sourced numbers,
327
+ words vs. sentences, both real); against `recheck/microsoft`
328
+ specifically, `microsoft/paragraph-length` (a DIFFERENT number, 7
329
+ sentences vs. this preset's 8, sourced from Microsoft's own distinct
330
+ "3-7 lines" proxy) joins that overlap too. See plain-language.ts's file
331
+ header for why this one is a deliberate keep, not an oversight.
332
+ 2. **A coincidental substring collision with `use-contractions`** — this
333
+ preset's own `has not yet attained`/`is not … unless` double-negative
334
+ content happens to contain the literal substrings "has not"/"is not",
335
+ which both flagships' own `use-contractions` rule ALSO flags (toward
336
+ "hasn't"/"isn't") for a completely unrelated reason (contraction
337
+ preference, not double-negative wordiness). This is not a design
338
+ overlap between the two presets' actual TERM LISTS — it is two
339
+ independently-motivated rules that happen to have an opinion about the
340
+ same span of text. Keeping both is correct: removing the double-
341
+ negative content would lose real, unrelated value, and there is no way
342
+ to narrow it to avoid every phrase containing "has not"/"is not"
343
+ without gutting the family.
344
+
345
+ ## Fetch log (2026-07-30, `curl -sL`)
346
+
347
+ | URL | Result |
348
+ |---|---|
349
+ | `https://www.plainlanguage.gov/` | 301 → `https://digital.gov/guides/plain-language` |
350
+ | `https://www.plainlanguage.gov/guidelines/words/simple-words-phrases/` | 301 → same target |
351
+ | `https://www.plainlanguage.gov/guidelines/sentences/` | 301 → same target |
352
+ | `https://www.plainlanguage.gov/guidelines/paragraphs/` | 301 → same target |
353
+ | `https://www.plainlanguage.gov/media/FederalPlainLanguageGuidelines.pdf` | 301 → same target |
354
+ | `https://digital.gov/guides/plain-language` | 200 |
355
+ | `https://digital.gov/guides/plain-language/principles` (+ 4 subpages) | 200 |
356
+ | `https://digital.gov/guides/plain-language/writing` (+ 4 subpages) | 200 |
357
+ | `https://digital.gov/guides/writing-understanding/familiar-terms` | 200 |
358
+ | `https://digital.gov/guides/plain-language/design` (+ 5 subpages) | 200 |
359
+ | `https://digital.gov/guides/plain-language/test` (+ 3 subpages) | 200 |
360
+ | `https://digital.gov/resources/plain-writing-act` | 200 |
361
+ | `https://www.whitehouse.gov/wp-content/uploads/legacy_drupal_files/omb/memoranda/2011/m11-15.pdf` (OMB Memo M-11-15) | 200, read natively as PDF |
362
+
363
+ **Not fetched, and not used as a source**: the PlainLanguage.gov GitHub
364
+ archive repository — off-domain, out of scope per the `.gov`-only rule.
@@ -0,0 +1,108 @@
1
+ {
2
+ "normalization": {
3
+ "method": "main-region-sha256",
4
+ "description": "Each digest is sha256 over the UTF-8 bytes of the first <main>...</main> region extracted from the raw HTML response -- NOT the full page. Correction (2026-07-30): a prior version of this file hashed the raw HTML directly and claimed digital.gov's plain-language pages are static enough for that to be reproducible ('two consecutive fetches ... byte-identical'). That claim does not hold: on independent re-fetch of all 9 pages below, every recorded `bytes` (raw page length) matched exactly, but NONE of the recorded raw-HTML `sha256` values did. Cause, found by diffing two raw fetches: digital.gov runs on Drupal, and every response embeds Drupal-generated metadata OUTSIDE the guide content -- an anonymous-user `permissionsHash` (a 64-hex-char token in the inline `drupal-settings-json` <script>), aggregated CSS/JS asset filenames (`css_<hash>.css`, `js_<hash>.js`, content-hashed per Drupal's asset-aggregation build), and an `ajaxPageState.libraries` deflate+base64 blob describing loaded asset libraries. These change across Drupal deploys/cache-clears (not on every single request -- repeated fetches within one test session are identical) but are each a fixed-format token, so the overall page BYTE LENGTH stays constant even when the exact bytes differ -- a length-preserving drift raw-HTML hashing cannot catch as anything but total mismatch. All of this metadata lives before the opening <main> tag; none of it was found inside <main>...</main> (checked by scanning the extracted region for any 16+ char hex/base64-like token -- zero hits across all 9 pages).",
5
+ "extractionPattern": "<main[\\s\\S]*?</main>",
6
+ "extractionFlags": "first match, dot-matches-newline via [\\s\\S]",
7
+ "hashedBytesField": "bytes -- the byte length of the EXTRACTED <main> region (UTF-8), not the raw page. A future re-check with a matching bytes but different sha256 (or vice versa) signals the extraction may have changed shape rather than the content, and should be triaged before treating it as drift.",
8
+ "fetchMethod": "curl -sL (redirects followed), matching the method recorded in .superpowers/sdd/task-11-verify-plain-language.md.",
9
+ "reproducibilityCheck": "All 9 pages below were fetched TWICE each, ~80 seconds apart (past this site's `cache-control: max-age=60` CDN TTL, so the second fetch is not guaranteed to be a cached copy of the first) -- the extracted <main> region was byte-identical (and therefore sha256-identical) both times for every page (see reproducible: true on every entry). Confirmed empirically, not assumed."
10
+ },
11
+ "deadSiteNote": "plainlanguage.gov itself is dead: every path under it 301-redirects to https://digital.gov/guides/plain-language. See PROVENANCE.md's 'plainlanguage.gov is dead' section. Redirect targets, not the plainlanguage.gov URLs themselves, are what's hashed below.",
12
+ "pages": [
13
+ {
14
+ "url": "https://digital.gov/guides/plain-language",
15
+ "fetchedAt": "2026-07-30",
16
+ "bytes": 5892,
17
+ "sha256": "91e2c32a9563e673d9227190534542a25f6a4500603f907d9ab4caf3b8fb0975",
18
+ "reproducible": true,
19
+ "coversTerms": [
20
+ "overview; establishes the plainlanguage.gov redirect and public-domain status"
21
+ ]
22
+ },
23
+ {
24
+ "url": "https://digital.gov/guides/plain-language/principles",
25
+ "fetchedAt": "2026-07-30",
26
+ "bytes": 10406,
27
+ "sha256": "afdbcd6f3a2752ff6e6e35bd46349429c4b3ec02d2f1b170cc739c820f1cf3d2",
28
+ "reproducible": true,
29
+ "coversTerms": [
30
+ "the '8th-grade' quote that argues AGAINST a fixed readability target -- why no metric rule ships"
31
+ ]
32
+ },
33
+ {
34
+ "url": "https://digital.gov/guides/plain-language/writing",
35
+ "fetchedAt": "2026-07-30",
36
+ "bytes": 15569,
37
+ "sha256": "abaaa5b42aafb0f4e1523d8059639165d854c18eb121247c48e484f85fed9a2a",
38
+ "reproducible": true,
39
+ "coversTerms": [
40
+ "nominalizations (hidden verbs) -- considered, not shipped; see PROVENANCE.md"
41
+ ]
42
+ },
43
+ {
44
+ "url": "https://digital.gov/guides/plain-language/writing/clear-short",
45
+ "fetchedAt": "2026-07-30",
46
+ "bytes": 12116,
47
+ "sha256": "cccdabde1fbd41322858568c29d46b246a4f7daef7e412354a7165e520fb737d",
48
+ "reproducible": true,
49
+ "coversTerms": [
50
+ "plain-language/paragraph-max-words",
51
+ "plain-language/paragraph-sentence-count"
52
+ ]
53
+ },
54
+ {
55
+ "url": "https://digital.gov/guides/plain-language/writing/style",
56
+ "fetchedAt": "2026-07-30",
57
+ "bytes": 22278,
58
+ "sha256": "df247d43335f57a7c861a7a5204828947dbe97412980b8cfafd72e6e809ae0ec",
59
+ "reproducible": true,
60
+ "coversTerms": [
61
+ "plain-language/filler-phrases",
62
+ "plain-language/an-amount-of",
63
+ "plain-language/double-negative-phrases",
64
+ "plain-language/double-negative-patterns"
65
+ ]
66
+ },
67
+ {
68
+ "url": "https://digital.gov/guides/writing-understanding/familiar-terms",
69
+ "fetchedAt": "2026-07-30",
70
+ "bytes": 10597,
71
+ "sha256": "93eadf5196a121f3f23978b346af45a39c5efa089adb2e448d0a40a7836f6b4a",
72
+ "reproducible": true,
73
+ "coversTerms": ["plain-language/complex-words"]
74
+ },
75
+ {
76
+ "url": "https://digital.gov/guides/plain-language/principles/short-simple",
77
+ "fetchedAt": "2026-07-30",
78
+ "bytes": 12449,
79
+ "sha256": "aedc14e0f7b1eadc5f1674cf87132ace08f9846c9da7606fdfb6f53b4c5ad3d2",
80
+ "reproducible": true,
81
+ "coversTerms": ["plain-language/redundant-pairs", "plain-language/excess-intensifiers"]
82
+ },
83
+ {
84
+ "url": "https://digital.gov/guides/plain-language/principles/avoid-jargon",
85
+ "fetchedAt": "2026-07-30",
86
+ "bytes": 12356,
87
+ "sha256": "843427bb3d96e8accb832adba736877d2b9577ba5270808abceaa5bdd8f06eaf",
88
+ "reproducible": true,
89
+ "coversTerms": ["plain-language/jargon-terms"]
90
+ },
91
+ {
92
+ "url": "https://digital.gov/guides/plain-language/test",
93
+ "fetchedAt": "2026-07-30",
94
+ "bytes": 8161,
95
+ "sha256": "907f005e694966076904fd945bb186a29b6780ce0a78a5cc9a667ee4bfcd06a0",
96
+ "reproducible": true,
97
+ "coversTerms": [
98
+ "confirms testing method is user-testing-based, not an automated readability formula -- why no metric rule ships"
99
+ ]
100
+ }
101
+ ],
102
+ "notIndependentlyHashed": [
103
+ {
104
+ "url": "https://www.whitehouse.gov/wp-content/uploads/legacy_drupal_files/omb/memoranda/2011/m11-15.pdf",
105
+ "note": "OMB Memo M-11-15. Read natively as a PDF in task-11-verify-plain-language.md, not re-fetched or hashed here; defines 'plain writing' only in prose terms, no numeric target."
106
+ }
107
+ ]
108
+ }
@@ -1,3 +0,0 @@
1
- import type { RuleDefinition } from './index.js';
2
- export declare const bulletStyle: RuleDefinition;
3
- //# sourceMappingURL=bullet-style.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bullet-style.d.ts","sourceRoot":"","sources":["../../src/assertions/bullet-style.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAW,MAAM,YAAY,CAAC;AAmE1D,eAAO,MAAM,WAAW,EAAE,cAIzB,CAAC"}
@@ -1,60 +0,0 @@
1
- async function execute(rule, file, { content }) {
2
- const problems = [];
3
- const options = rule.assertions['bullet-style'];
4
- const expectedStyle = options.style;
5
- const lines = content.split('\n');
6
- for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {
7
- const lineText = lines[lineIndex];
8
- const lineNumber = lineIndex + 1;
9
- const bulletMatch = lineText.match(/^(\s*)([*-])\s+/);
10
- if (bulletMatch) {
11
- const actualStyle = bulletMatch[2];
12
- if (actualStyle !== expectedStyle) {
13
- problems.push({
14
- file,
15
- line: lineNumber,
16
- column: bulletMatch[1].length + 1,
17
- text: lineText,
18
- match: actualStyle,
19
- ruleName: rule.name,
20
- severity: rule.severity,
21
- message: rule.message,
22
- });
23
- }
24
- }
25
- }
26
- return problems;
27
- }
28
- async function fix(rule, file, { content }) {
29
- const fixes = [];
30
- const options = rule.assertions['bullet-style'];
31
- const expectedStyle = options.style;
32
- const lines = content.split('\n');
33
- for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {
34
- const lineText = lines[lineIndex];
35
- const lineNumber = lineIndex + 1;
36
- const bulletMatch = lineText.match(/^(\s*)([*-])(\s+)/);
37
- if (bulletMatch) {
38
- const [fullMatch, indentation, actualStyle, spacing] = bulletMatch;
39
- if (actualStyle !== expectedStyle) {
40
- const newText = indentation + expectedStyle + spacing + lineText.substring(fullMatch.length);
41
- fixes.push({
42
- file,
43
- line: lineNumber,
44
- column: 1,
45
- oldText: lineText,
46
- newText,
47
- ruleName: rule.name,
48
- description: `Change bullet style from '${actualStyle}' to '${expectedStyle}'`,
49
- });
50
- }
51
- }
52
- }
53
- return fixes;
54
- }
55
- export const bulletStyle = {
56
- id: 'bullet-style',
57
- execute,
58
- fix,
59
- };
60
- //# sourceMappingURL=bullet-style.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bullet-style.js","sourceRoot":"","sources":["../../src/assertions/bullet-style.ts"],"names":[],"mappings":"AAGA,KAAK,UAAU,OAAO,CACpB,IAAoB,EACpB,IAAY,EACZ,EAAE,OAAO,EAAW;IAEpB,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc,CAAyB,CAAC;IACxE,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC;IAEpC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC;QAC9D,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;QAClC,MAAM,UAAU,GAAG,SAAS,GAAG,CAAC,CAAC;QACjC,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACtD,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YACnC,IAAI,WAAW,KAAK,aAAa,EAAE,CAAC;gBAClC,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI;oBACJ,IAAI,EAAE,UAAU;oBAChB,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC;oBACjC,IAAI,EAAE,QAAQ;oBACd,KAAK,EAAE,WAAW;oBAClB,QAAQ,EAAE,IAAI,CAAC,IAAI;oBACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,OAAO,EAAE,IAAI,CAAC,OAAO;iBACtB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,GAAG,CAAC,IAAoB,EAAE,IAAY,EAAE,EAAE,OAAO,EAAW;IACzE,MAAM,KAAK,GAAU,EAAE,CAAC;IACxB,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc,CAAyB,CAAC;IACxE,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC;IAEpC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC;QAC9D,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;QAClC,MAAM,UAAU,GAAG,SAAS,GAAG,CAAC,CAAC;QACjC,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACxD,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,CAAC,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,GAAG,WAAW,CAAC;YACnE,IAAI,WAAW,KAAK,aAAa,EAAE,CAAC;gBAClC,MAAM,OAAO,GACX,WAAW,GAAG,aAAa,GAAG,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;gBAC/E,KAAK,CAAC,IAAI,CAAC;oBACT,IAAI;oBACJ,IAAI,EAAE,UAAU;oBAChB,MAAM,EAAE,CAAC;oBACT,OAAO,EAAE,QAAQ;oBACjB,OAAO;oBACP,QAAQ,EAAE,IAAI,CAAC,IAAI;oBACnB,WAAW,EAAE,6BAA6B,WAAW,SAAS,aAAa,GAAG;iBAC/E,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAmB;IACzC,EAAE,EAAE,cAAc;IAClB,OAAO;IACP,GAAG;CACJ,CAAC"}
@@ -1,21 +0,0 @@
1
- import type { NormalizedRule, Problem, Fix } from '../types/index.js';
2
- import type { ScopedSegment } from '../core/scope-parser.js';
3
- export interface Context {
4
- content: string;
5
- segments: ScopedSegment[];
6
- fileMetadata?: {
7
- images: Map<string, {
8
- path: string;
9
- size: number;
10
- exists: boolean;
11
- }>;
12
- };
13
- }
14
- export interface RuleDefinition {
15
- id: string;
16
- execute: (rule: NormalizedRule, file: string, { content, segments }: Context) => Promise<Problem[]>;
17
- fix?: (rule: NormalizedRule, file: string, { content, segments }: Context) => Promise<Fix[]>;
18
- }
19
- export declare const assertionRules: Record<string, RuleDefinition>;
20
- export declare function getAssertion(id: string): RuleDefinition;
21
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/assertions/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAa7D,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE;QACb,MAAM,EAAE,GAAG,CACT,MAAM,EACN;YACE,IAAI,EAAE,MAAM,CAAC;YACb,IAAI,EAAE,MAAM,CAAC;YACb,MAAM,EAAE,OAAO,CAAC;SACjB,CACF,CAAC;KACH,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,CACP,IAAI,EAAE,cAAc,EACpB,IAAI,EAAE,MAAM,EACZ,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,OAAO,KAC3B,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACxB,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,OAAO,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;CAC9F;AAED,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAWzD,CAAC;AAEF,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,CAMvD"}
@@ -1,30 +0,0 @@
1
- import { bulletStyle } from './bullet-style.js';
2
- import { maxImageSize } from './max-image-size.js';
3
- import { maxLineLength } from './max-line-length.js';
4
- import { noDuplicateHeadings } from './no-duplicate-headings.js';
5
- import { noHardTabs } from './no-hard-tabs.js';
6
- import { noTrailingSpaces } from './no-trailing-spaces.js';
7
- import { noBrokenFragmentLinks } from './no-broken-fragment-links.js';
8
- import { pattern } from './pattern.js';
9
- import { semanticLineBreaks } from './semantic-line-breaks.js';
10
- import { swap } from './swap.js';
11
- export const assertionRules = {
12
- 'max-image-size': maxImageSize,
13
- 'max-line-length': maxLineLength,
14
- 'no-trailing-spaces': noTrailingSpaces,
15
- 'bullet-style': bulletStyle,
16
- 'semantic-line-breaks': semanticLineBreaks,
17
- 'no-hard-tabs': noHardTabs,
18
- 'no-duplicate-headings': noDuplicateHeadings,
19
- 'no-broken-fragment-links': noBrokenFragmentLinks,
20
- swap,
21
- pattern,
22
- };
23
- export function getAssertion(id) {
24
- const assertion = assertionRules[id];
25
- if (!assertion) {
26
- throw new Error(`Assertion not found: ${id}`);
27
- }
28
- return assertion;
29
- }
30
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/assertions/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AA2BjC,MAAM,CAAC,MAAM,cAAc,GAAmC;IAC5D,gBAAgB,EAAE,YAAY;IAC9B,iBAAiB,EAAE,aAAa;IAChC,oBAAoB,EAAE,gBAAgB;IACtC,cAAc,EAAE,WAAW;IAC3B,sBAAsB,EAAE,kBAAkB;IAC1C,cAAc,EAAE,UAAU;IAC1B,uBAAuB,EAAE,mBAAmB;IAC5C,0BAA0B,EAAE,qBAAqB;IACjD,IAAI;IACJ,OAAO;CACR,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,EAAU;IACrC,MAAM,SAAS,GAAG,cAAc,CAAC,EAAE,CAAC,CAAC;IACrC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -1,3 +0,0 @@
1
- import type { RuleDefinition } from './index.js';
2
- export declare const maxImageSize: RuleDefinition;
3
- //# sourceMappingURL=max-image-size.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"max-image-size.d.ts","sourceRoot":"","sources":["../../src/assertions/max-image-size.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAW,MAAM,YAAY,CAAC;AAoG1D,eAAO,MAAM,YAAY,EAAE,cAI1B,CAAC"}