chaffjs 0.27.1 → 0.29.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 (923) hide show
  1. package/README.md +2 -1
  2. package/dist/ai-score/of-document.d.ts.map +1 -1
  3. package/dist/ai-score/of-document.js +23 -14
  4. package/dist/ai-score/of-document.js.map +1 -1
  5. package/dist/ai-score/render.d.ts.map +1 -1
  6. package/dist/ai-score/render.js +13 -4
  7. package/dist/ai-score/render.js.map +1 -1
  8. package/dist/ai-score/score.d.ts +16 -1
  9. package/dist/ai-score/score.d.ts.map +1 -1
  10. package/dist/ai-score/score.js +15 -3
  11. package/dist/ai-score/score.js.map +1 -1
  12. package/dist/ai-score/signals.d.ts +2 -4
  13. package/dist/ai-score/signals.d.ts.map +1 -1
  14. package/dist/ai-score/signals.js +11 -2
  15. package/dist/ai-score/signals.js.map +1 -1
  16. package/dist/ai-score/text.d.ts +2 -0
  17. package/dist/ai-score/text.d.ts.map +1 -1
  18. package/dist/ai-score/text.js +4 -2
  19. package/dist/ai-score/text.js.map +1 -1
  20. package/dist/announced-count.d.ts +2 -0
  21. package/dist/announced-count.d.ts.map +1 -1
  22. package/dist/announced-count.js +14 -7
  23. package/dist/announced-count.js.map +1 -1
  24. package/dist/check-source.d.ts +3 -1
  25. package/dist/check-source.d.ts.map +1 -1
  26. package/dist/check-source.js +3 -1
  27. package/dist/check-source.js.map +1 -1
  28. package/dist/cli-text.d.ts.map +1 -1
  29. package/dist/cli-text.js +42 -18
  30. package/dist/cli-text.js.map +1 -1
  31. package/dist/cli.d.ts.map +1 -1
  32. package/dist/cli.js +2 -1
  33. package/dist/cli.js.map +1 -1
  34. package/dist/commands/cite-claims.d.ts +36 -0
  35. package/dist/commands/cite-claims.d.ts.map +1 -0
  36. package/dist/commands/cite-claims.js +81 -0
  37. package/dist/commands/cite-claims.js.map +1 -0
  38. package/dist/commands/cite-page.d.ts +14 -0
  39. package/dist/commands/cite-page.d.ts.map +1 -0
  40. package/dist/commands/cite-page.js +47 -0
  41. package/dist/commands/cite-page.js.map +1 -0
  42. package/dist/commands/cite-scaffold.d.ts +16 -0
  43. package/dist/commands/cite-scaffold.d.ts.map +1 -0
  44. package/dist/commands/cite-scaffold.js +21 -0
  45. package/dist/commands/cite-scaffold.js.map +1 -0
  46. package/dist/commands/cite.d.ts +3 -12
  47. package/dist/commands/cite.d.ts.map +1 -1
  48. package/dist/commands/cite.js +110 -51
  49. package/dist/commands/cite.js.map +1 -1
  50. package/dist/company-names.d.ts +34 -0
  51. package/dist/company-names.d.ts.map +1 -0
  52. package/dist/company-names.js +158 -0
  53. package/dist/company-names.js.map +1 -0
  54. package/dist/default-values.d.ts +17 -0
  55. package/dist/default-values.d.ts.map +1 -0
  56. package/dist/default-values.js +134 -0
  57. package/dist/default-values.js.map +1 -0
  58. package/dist/deprecated-use.d.ts +17 -0
  59. package/dist/deprecated-use.d.ts.map +1 -0
  60. package/dist/deprecated-use.js +95 -0
  61. package/dist/deprecated-use.js.map +1 -0
  62. package/dist/derived/number-word-counts.d.ts +10 -0
  63. package/dist/derived/number-word-counts.d.ts.map +1 -0
  64. package/dist/derived/number-word-counts.js +21 -0
  65. package/dist/derived/number-word-counts.js.map +1 -0
  66. package/dist/derived/stays.d.ts +43 -0
  67. package/dist/derived/stays.d.ts.map +1 -0
  68. package/dist/derived/stays.js +105 -0
  69. package/dist/derived/stays.js.map +1 -0
  70. package/dist/detectors/acronym-context.d.ts +2 -2
  71. package/dist/detectors/acronym-context.d.ts.map +1 -1
  72. package/dist/detectors/acronym-context.js +6 -0
  73. package/dist/detectors/acronym-context.js.map +1 -1
  74. package/dist/detectors/address-word.d.ts +3 -0
  75. package/dist/detectors/address-word.d.ts.map +1 -0
  76. package/dist/detectors/address-word.js +7 -0
  77. package/dist/detectors/address-word.js.map +1 -0
  78. package/dist/detectors/agreement-slip.d.ts.map +1 -1
  79. package/dist/detectors/agreement-slip.js +4 -1
  80. package/dist/detectors/agreement-slip.js.map +1 -1
  81. package/dist/detectors/ai-phrasing.d.ts +0 -4
  82. package/dist/detectors/ai-phrasing.d.ts.map +1 -1
  83. package/dist/detectors/ai-phrasing.js +5 -1
  84. package/dist/detectors/ai-phrasing.js.map +1 -1
  85. package/dist/detectors/amount-range.d.ts +3 -0
  86. package/dist/detectors/amount-range.d.ts.map +1 -0
  87. package/dist/detectors/amount-range.js +38 -0
  88. package/dist/detectors/amount-range.js.map +1 -0
  89. package/dist/detectors/amount-scale.d.ts +8 -0
  90. package/dist/detectors/amount-scale.d.ts.map +1 -0
  91. package/dist/detectors/amount-scale.js +74 -0
  92. package/dist/detectors/amount-scale.js.map +1 -0
  93. package/dist/detectors/announced-count.d.ts +1 -1
  94. package/dist/detectors/announced-count.d.ts.map +1 -1
  95. package/dist/detectors/announced-count.js +18 -3
  96. package/dist/detectors/announced-count.js.map +1 -1
  97. package/dist/detectors/bare-comparative.d.ts.map +1 -1
  98. package/dist/detectors/bare-comparative.js +4 -1
  99. package/dist/detectors/bare-comparative.js.map +1 -1
  100. package/dist/detectors/block-quotation.d.ts +13 -0
  101. package/dist/detectors/block-quotation.d.ts.map +1 -0
  102. package/dist/detectors/block-quotation.js +86 -0
  103. package/dist/detectors/block-quotation.js.map +1 -0
  104. package/dist/detectors/bracket-label.d.ts +10 -0
  105. package/dist/detectors/bracket-label.d.ts.map +1 -0
  106. package/dist/detectors/bracket-label.js +51 -0
  107. package/dist/detectors/bracket-label.js.map +1 -0
  108. package/dist/detectors/change-rate.d.ts.map +1 -1
  109. package/dist/detectors/change-rate.js +12 -1
  110. package/dist/detectors/change-rate.js.map +1 -1
  111. package/dist/detectors/citation-entry.d.ts +5 -0
  112. package/dist/detectors/citation-entry.d.ts.map +1 -1
  113. package/dist/detectors/citation-entry.js +19 -5
  114. package/dist/detectors/citation-entry.js.map +1 -1
  115. package/dist/detectors/code-before.d.ts +6 -0
  116. package/dist/detectors/code-before.d.ts.map +1 -0
  117. package/dist/detectors/code-before.js +15 -0
  118. package/dist/detectors/code-before.js.map +1 -0
  119. package/dist/detectors/connective-hierarchy.d.ts +11 -1
  120. package/dist/detectors/connective-hierarchy.d.ts.map +1 -1
  121. package/dist/detectors/connective-hierarchy.js +26 -6
  122. package/dist/detectors/connective-hierarchy.js.map +1 -1
  123. package/dist/detectors/currency-notation.d.ts +3 -1
  124. package/dist/detectors/currency-notation.d.ts.map +1 -1
  125. package/dist/detectors/currency-notation.js +4 -3
  126. package/dist/detectors/currency-notation.js.map +1 -1
  127. package/dist/detectors/date-outside-period.d.ts +4 -0
  128. package/dist/detectors/date-outside-period.d.ts.map +1 -0
  129. package/dist/detectors/date-outside-period.js +34 -0
  130. package/dist/detectors/date-outside-period.js.map +1 -0
  131. package/dist/detectors/default-values.d.ts +3 -0
  132. package/dist/detectors/default-values.d.ts.map +1 -0
  133. package/dist/detectors/default-values.js +14 -0
  134. package/dist/detectors/default-values.js.map +1 -0
  135. package/dist/detectors/defined-term-form.d.ts +6 -2
  136. package/dist/detectors/defined-term-form.d.ts.map +1 -1
  137. package/dist/detectors/defined-term-form.js +72 -12
  138. package/dist/detectors/defined-term-form.js.map +1 -1
  139. package/dist/detectors/definition-use.d.ts.map +1 -1
  140. package/dist/detectors/definition-use.js +8 -1
  141. package/dist/detectors/definition-use.js.map +1 -1
  142. package/dist/detectors/deprecated-use.d.ts +3 -0
  143. package/dist/detectors/deprecated-use.d.ts.map +1 -0
  144. package/dist/detectors/deprecated-use.js +14 -0
  145. package/dist/detectors/deprecated-use.js.map +1 -0
  146. package/dist/detectors/derived-numbers.d.ts +1 -1
  147. package/dist/detectors/derived-numbers.d.ts.map +1 -1
  148. package/dist/detectors/derived-numbers.js +79 -16
  149. package/dist/detectors/derived-numbers.js.map +1 -1
  150. package/dist/detectors/document-shape.d.ts +1 -0
  151. package/dist/detectors/document-shape.d.ts.map +1 -1
  152. package/dist/detectors/document-shape.js +4 -1
  153. package/dist/detectors/document-shape.js.map +1 -1
  154. package/dist/detectors/due-date.d.ts +3 -0
  155. package/dist/detectors/due-date.d.ts.map +1 -0
  156. package/dist/detectors/due-date.js +38 -0
  157. package/dist/detectors/due-date.js.map +1 -0
  158. package/dist/detectors/en-shape.d.ts.map +1 -1
  159. package/dist/detectors/en-shape.js +17 -9
  160. package/dist/detectors/en-shape.js.map +1 -1
  161. package/dist/detectors/fact-consistency.d.ts.map +1 -1
  162. package/dist/detectors/fact-consistency.js +89 -2
  163. package/dist/detectors/fact-consistency.js.map +1 -1
  164. package/dist/detectors/heading-echo.d.ts.map +1 -1
  165. package/dist/detectors/heading-echo.js +10 -1
  166. package/dist/detectors/heading-echo.js.map +1 -1
  167. package/dist/detectors/kana-function-word.d.ts +12 -0
  168. package/dist/detectors/kana-function-word.d.ts.map +1 -0
  169. package/dist/detectors/kana-function-word.js +59 -0
  170. package/dist/detectors/kana-function-word.js.map +1 -0
  171. package/dist/detectors/line-amount.d.ts +3 -0
  172. package/dist/detectors/line-amount.d.ts.map +1 -0
  173. package/dist/detectors/line-amount.js +22 -0
  174. package/dist/detectors/line-amount.js.map +1 -0
  175. package/dist/detectors/location-pointer.d.ts +6 -0
  176. package/dist/detectors/location-pointer.d.ts.map +1 -0
  177. package/dist/detectors/location-pointer.js +22 -0
  178. package/dist/detectors/location-pointer.js.map +1 -0
  179. package/dist/detectors/mark-shape.d.ts.map +1 -1
  180. package/dist/detectors/mark-shape.js +13 -1
  181. package/dist/detectors/mark-shape.js.map +1 -1
  182. package/dist/detectors/nado-closed-list.d.ts +3 -0
  183. package/dist/detectors/nado-closed-list.d.ts.map +1 -0
  184. package/dist/detectors/nado-closed-list.js +21 -0
  185. package/dist/detectors/nado-closed-list.js.map +1 -0
  186. package/dist/detectors/name-variant.d.ts.map +1 -1
  187. package/dist/detectors/name-variant.js +92 -10
  188. package/dist/detectors/name-variant.js.map +1 -1
  189. package/dist/detectors/next-word.d.ts.map +1 -1
  190. package/dist/detectors/next-word.js +41 -8
  191. package/dist/detectors/next-word.js.map +1 -1
  192. package/dist/detectors/number-word-figure.d.ts +5 -0
  193. package/dist/detectors/number-word-figure.d.ts.map +1 -0
  194. package/dist/detectors/number-word-figure.js +32 -0
  195. package/dist/detectors/number-word-figure.js.map +1 -0
  196. package/dist/detectors/obligation-without-deadline.d.ts +39 -0
  197. package/dist/detectors/obligation-without-deadline.d.ts.map +1 -0
  198. package/dist/detectors/obligation-without-deadline.js +148 -0
  199. package/dist/detectors/obligation-without-deadline.js.map +1 -0
  200. package/dist/detectors/open-end-names.d.ts +23 -0
  201. package/dist/detectors/open-end-names.d.ts.map +1 -0
  202. package/dist/detectors/open-end-names.js +95 -0
  203. package/dist/detectors/open-end-names.js.map +1 -0
  204. package/dist/detectors/ordinal-run-gaps.d.ts +8 -0
  205. package/dist/detectors/ordinal-run-gaps.d.ts.map +1 -0
  206. package/dist/detectors/ordinal-run-gaps.js +80 -0
  207. package/dist/detectors/ordinal-run-gaps.js.map +1 -0
  208. package/dist/detectors/orthographic-variant.d.ts.map +1 -1
  209. package/dist/detectors/orthographic-variant.js +26 -9
  210. package/dist/detectors/orthographic-variant.js.map +1 -1
  211. package/dist/detectors/orthography.d.ts.map +1 -1
  212. package/dist/detectors/orthography.js +5 -0
  213. package/dist/detectors/orthography.js.map +1 -1
  214. package/dist/detectors/parameter-table.d.ts +3 -0
  215. package/dist/detectors/parameter-table.d.ts.map +1 -0
  216. package/dist/detectors/parameter-table.js +16 -0
  217. package/dist/detectors/parameter-table.js.map +1 -0
  218. package/dist/detectors/phone-number-variant.d.ts +3 -0
  219. package/dist/detectors/phone-number-variant.d.ts.map +1 -0
  220. package/dist/detectors/phone-number-variant.js +18 -0
  221. package/dist/detectors/phone-number-variant.js.map +1 -0
  222. package/dist/detectors/prerequisite-order.d.ts +3 -0
  223. package/dist/detectors/prerequisite-order.d.ts.map +1 -0
  224. package/dist/detectors/prerequisite-order.js +30 -0
  225. package/dist/detectors/prerequisite-order.js.map +1 -0
  226. package/dist/detectors/quote-unnamed-speaker.d.ts +3 -0
  227. package/dist/detectors/quote-unnamed-speaker.d.ts.map +1 -0
  228. package/dist/detectors/quote-unnamed-speaker.js +18 -0
  229. package/dist/detectors/quote-unnamed-speaker.js.map +1 -0
  230. package/dist/detectors/quote-without-source.d.ts +12 -2
  231. package/dist/detectors/quote-without-source.d.ts.map +1 -1
  232. package/dist/detectors/quote-without-source.js +45 -11
  233. package/dist/detectors/quote-without-source.js.map +1 -1
  234. package/dist/detectors/registry/amount-range.d.ts +3 -0
  235. package/dist/detectors/registry/amount-range.d.ts.map +1 -0
  236. package/dist/detectors/registry/amount-range.js +3 -0
  237. package/dist/detectors/registry/amount-range.js.map +1 -0
  238. package/dist/detectors/registry/amount-scale.d.ts +3 -0
  239. package/dist/detectors/registry/amount-scale.d.ts.map +1 -0
  240. package/dist/detectors/registry/amount-scale.js +3 -0
  241. package/dist/detectors/registry/amount-scale.js.map +1 -0
  242. package/dist/detectors/registry/arrival-before-departure.d.ts +3 -0
  243. package/dist/detectors/registry/arrival-before-departure.d.ts.map +1 -0
  244. package/dist/detectors/registry/arrival-before-departure.js +3 -0
  245. package/dist/detectors/registry/arrival-before-departure.js.map +1 -0
  246. package/dist/detectors/registry/date-outside-period.d.ts +3 -0
  247. package/dist/detectors/registry/date-outside-period.d.ts.map +1 -0
  248. package/dist/detectors/registry/date-outside-period.js +3 -0
  249. package/dist/detectors/registry/date-outside-period.js.map +1 -0
  250. package/dist/detectors/registry/default-values.d.ts +3 -0
  251. package/dist/detectors/registry/default-values.d.ts.map +1 -0
  252. package/dist/detectors/registry/default-values.js +3 -0
  253. package/dist/detectors/registry/default-values.js.map +1 -0
  254. package/dist/detectors/registry/deprecated-use.d.ts +3 -0
  255. package/dist/detectors/registry/deprecated-use.d.ts.map +1 -0
  256. package/dist/detectors/registry/deprecated-use.js +3 -0
  257. package/dist/detectors/registry/deprecated-use.js.map +1 -0
  258. package/dist/detectors/registry/due-date.d.ts +3 -0
  259. package/dist/detectors/registry/due-date.d.ts.map +1 -0
  260. package/dist/detectors/registry/due-date.js +3 -0
  261. package/dist/detectors/registry/due-date.js.map +1 -0
  262. package/dist/detectors/registry/kana-function-word.d.ts +3 -0
  263. package/dist/detectors/registry/kana-function-word.d.ts.map +1 -0
  264. package/dist/detectors/registry/kana-function-word.js +3 -0
  265. package/dist/detectors/registry/kana-function-word.js.map +1 -0
  266. package/dist/detectors/registry/line-amount.d.ts +3 -0
  267. package/dist/detectors/registry/line-amount.d.ts.map +1 -0
  268. package/dist/detectors/registry/line-amount.js +3 -0
  269. package/dist/detectors/registry/line-amount.js.map +1 -0
  270. package/dist/detectors/registry/nado-closed-list.d.ts +3 -0
  271. package/dist/detectors/registry/nado-closed-list.d.ts.map +1 -0
  272. package/dist/detectors/registry/nado-closed-list.js +3 -0
  273. package/dist/detectors/registry/nado-closed-list.js.map +1 -0
  274. package/dist/detectors/registry/number-word-figure.d.ts +3 -0
  275. package/dist/detectors/registry/number-word-figure.d.ts.map +1 -0
  276. package/dist/detectors/registry/number-word-figure.js +3 -0
  277. package/dist/detectors/registry/number-word-figure.js.map +1 -0
  278. package/dist/detectors/registry/obligation-without-deadline.d.ts +3 -0
  279. package/dist/detectors/registry/obligation-without-deadline.d.ts.map +1 -0
  280. package/dist/detectors/registry/obligation-without-deadline.js +3 -0
  281. package/dist/detectors/registry/obligation-without-deadline.js.map +1 -0
  282. package/dist/detectors/registry/parameter-table.d.ts +3 -0
  283. package/dist/detectors/registry/parameter-table.d.ts.map +1 -0
  284. package/dist/detectors/registry/parameter-table.js +3 -0
  285. package/dist/detectors/registry/parameter-table.js.map +1 -0
  286. package/dist/detectors/registry/phone-number-variant.d.ts +3 -0
  287. package/dist/detectors/registry/phone-number-variant.d.ts.map +1 -0
  288. package/dist/detectors/registry/phone-number-variant.js +3 -0
  289. package/dist/detectors/registry/phone-number-variant.js.map +1 -0
  290. package/dist/detectors/registry/prerequisite-order.d.ts +3 -0
  291. package/dist/detectors/registry/prerequisite-order.d.ts.map +1 -0
  292. package/dist/detectors/registry/prerequisite-order.js +3 -0
  293. package/dist/detectors/registry/prerequisite-order.js.map +1 -0
  294. package/dist/detectors/registry/quote-unnamed-speaker.d.ts +3 -0
  295. package/dist/detectors/registry/quote-unnamed-speaker.d.ts.map +1 -0
  296. package/dist/detectors/registry/quote-unnamed-speaker.js +3 -0
  297. package/dist/detectors/registry/quote-unnamed-speaker.js.map +1 -0
  298. package/dist/detectors/registry/tax-amount.d.ts +3 -0
  299. package/dist/detectors/registry/tax-amount.d.ts.map +1 -0
  300. package/dist/detectors/registry/tax-amount.js +3 -0
  301. package/dist/detectors/registry/tax-amount.js.map +1 -0
  302. package/dist/detectors/registry/time-order.d.ts +3 -0
  303. package/dist/detectors/registry/time-order.d.ts.map +1 -0
  304. package/dist/detectors/registry/time-order.js +3 -0
  305. package/dist/detectors/registry/time-order.js.map +1 -0
  306. package/dist/detectors/registry/ui-label.d.ts +3 -0
  307. package/dist/detectors/registry/ui-label.d.ts.map +1 -0
  308. package/dist/detectors/registry/ui-label.js +3 -0
  309. package/dist/detectors/registry/ui-label.js.map +1 -0
  310. package/dist/detectors/registry/undefined-call.d.ts +3 -0
  311. package/dist/detectors/registry/undefined-call.d.ts.map +1 -0
  312. package/dist/detectors/registry/undefined-call.js +3 -0
  313. package/dist/detectors/registry/undefined-call.js.map +1 -0
  314. package/dist/detectors/registry/undefined-term.d.ts +3 -0
  315. package/dist/detectors/registry/undefined-term.d.ts.map +1 -0
  316. package/dist/detectors/registry/undefined-term.js +3 -0
  317. package/dist/detectors/registry/undefined-term.js.map +1 -0
  318. package/dist/detectors/registry/version-order.d.ts +3 -0
  319. package/dist/detectors/registry/version-order.d.ts.map +1 -0
  320. package/dist/detectors/registry/version-order.js +3 -0
  321. package/dist/detectors/registry/version-order.js.map +1 -0
  322. package/dist/detectors/registry/warning-action.d.ts +3 -0
  323. package/dist/detectors/registry/warning-action.d.ts.map +1 -0
  324. package/dist/detectors/registry/warning-action.js +3 -0
  325. package/dist/detectors/registry/warning-action.js.map +1 -0
  326. package/dist/detectors/requirement-smell.d.ts.map +1 -1
  327. package/dist/detectors/requirement-smell.js +25 -8
  328. package/dist/detectors/requirement-smell.js.map +1 -1
  329. package/dist/detectors/structure-tree.d.ts +12 -4
  330. package/dist/detectors/structure-tree.d.ts.map +1 -1
  331. package/dist/detectors/structure-tree.js +31 -14
  332. package/dist/detectors/structure-tree.js.map +1 -1
  333. package/dist/detectors/superlative-scope.d.ts.map +1 -1
  334. package/dist/detectors/superlative-scope.js +11 -1
  335. package/dist/detectors/superlative-scope.js.map +1 -1
  336. package/dist/detectors/tax-amount.d.ts +3 -0
  337. package/dist/detectors/tax-amount.d.ts.map +1 -0
  338. package/dist/detectors/tax-amount.js +19 -0
  339. package/dist/detectors/tax-amount.js.map +1 -0
  340. package/dist/detectors/technical-docs.d.ts.map +1 -1
  341. package/dist/detectors/technical-docs.js +5 -1
  342. package/dist/detectors/technical-docs.js.map +1 -1
  343. package/dist/detectors/term-extension.d.ts +14 -0
  344. package/dist/detectors/term-extension.d.ts.map +1 -0
  345. package/dist/detectors/term-extension.js +67 -0
  346. package/dist/detectors/term-extension.js.map +1 -0
  347. package/dist/detectors/time-order.d.ts +4 -0
  348. package/dist/detectors/time-order.d.ts.map +1 -0
  349. package/dist/detectors/time-order.js +32 -0
  350. package/dist/detectors/time-order.js.map +1 -0
  351. package/dist/detectors/ui-label.d.ts +3 -0
  352. package/dist/detectors/ui-label.d.ts.map +1 -0
  353. package/dist/detectors/ui-label.js +16 -0
  354. package/dist/detectors/ui-label.js.map +1 -0
  355. package/dist/detectors/unbalanced-bracket.d.ts.map +1 -1
  356. package/dist/detectors/unbalanced-bracket.js +8 -13
  357. package/dist/detectors/unbalanced-bracket.js.map +1 -1
  358. package/dist/detectors/undefined-call.d.ts +3 -0
  359. package/dist/detectors/undefined-call.d.ts.map +1 -0
  360. package/dist/detectors/undefined-call.js +18 -0
  361. package/dist/detectors/undefined-call.js.map +1 -0
  362. package/dist/detectors/undefined-term.d.ts +22 -0
  363. package/dist/detectors/undefined-term.d.ts.map +1 -0
  364. package/dist/detectors/undefined-term.js +85 -0
  365. package/dist/detectors/undefined-term.js.map +1 -0
  366. package/dist/detectors/unknown-word.d.ts +1 -1
  367. package/dist/detectors/unknown-word.js +3 -3
  368. package/dist/detectors/unknown-word.js.map +1 -1
  369. package/dist/detectors/vague-deadline.d.ts +4 -0
  370. package/dist/detectors/vague-deadline.d.ts.map +1 -1
  371. package/dist/detectors/vague-deadline.js +3 -3
  372. package/dist/detectors/vague-deadline.js.map +1 -1
  373. package/dist/detectors/version-mismatch.d.ts.map +1 -1
  374. package/dist/detectors/version-mismatch.js +18 -1
  375. package/dist/detectors/version-mismatch.js.map +1 -1
  376. package/dist/detectors/version-order.d.ts +3 -0
  377. package/dist/detectors/version-order.d.ts.map +1 -0
  378. package/dist/detectors/version-order.js +43 -0
  379. package/dist/detectors/version-order.js.map +1 -0
  380. package/dist/detectors/warning-action.d.ts +3 -0
  381. package/dist/detectors/warning-action.d.ts.map +1 -0
  382. package/dist/detectors/warning-action.js +48 -0
  383. package/dist/detectors/warning-action.js.map +1 -0
  384. package/dist/facts/condition-pairs.d.ts +51 -0
  385. package/dist/facts/condition-pairs.d.ts.map +1 -0
  386. package/dist/facts/condition-pairs.js +203 -0
  387. package/dist/facts/condition-pairs.js.map +1 -0
  388. package/dist/facts/counted-facts.d.ts +16 -0
  389. package/dist/facts/counted-facts.d.ts.map +1 -0
  390. package/dist/facts/counted-facts.js +45 -0
  391. package/dist/facts/counted-facts.js.map +1 -0
  392. package/dist/facts/event-dates.d.ts +26 -0
  393. package/dist/facts/event-dates.d.ts.map +1 -0
  394. package/dist/facts/event-dates.js +38 -0
  395. package/dist/facts/event-dates.js.map +1 -0
  396. package/dist/facts/fact-scope.d.ts +2 -0
  397. package/dist/facts/fact-scope.d.ts.map +1 -1
  398. package/dist/facts/fact-scope.js +5 -0
  399. package/dist/facts/fact-scope.js.map +1 -1
  400. package/dist/facts/labelled-facts.d.ts +2 -0
  401. package/dist/facts/labelled-facts.d.ts.map +1 -1
  402. package/dist/facts/labelled-facts.js +9 -1
  403. package/dist/facts/labelled-facts.js.map +1 -1
  404. package/dist/facts/table-facts.d.ts +16 -0
  405. package/dist/facts/table-facts.d.ts.map +1 -1
  406. package/dist/facts/table-facts.js +2 -2
  407. package/dist/facts/table-facts.js.map +1 -1
  408. package/dist/grade/ai-score.d.ts +1 -1
  409. package/dist/grade/ai-score.d.ts.map +1 -1
  410. package/dist/grade/text.js +2 -2
  411. package/dist/grade/text.js.map +1 -1
  412. package/dist/heading-numbering.js +2 -2
  413. package/dist/heading-numbering.js.map +1 -1
  414. package/dist/html/fetch-page.d.ts +20 -0
  415. package/dist/html/fetch-page.d.ts.map +1 -0
  416. package/dist/html/fetch-page.js +51 -0
  417. package/dist/html/fetch-page.js.map +1 -0
  418. package/dist/html/fetched-text.d.ts +5 -0
  419. package/dist/html/fetched-text.d.ts.map +1 -0
  420. package/dist/html/fetched-text.js +25 -0
  421. package/dist/html/fetched-text.js.map +1 -0
  422. package/dist/html/html-content-block.d.ts +6 -0
  423. package/dist/html/html-content-block.d.ts.map +1 -0
  424. package/dist/html/html-content-block.js +86 -0
  425. package/dist/html/html-content-block.js.map +1 -0
  426. package/dist/html/html-elements.d.ts +41 -0
  427. package/dist/html/html-elements.d.ts.map +1 -0
  428. package/dist/html/html-elements.js +91 -0
  429. package/dist/html/html-elements.js.map +1 -0
  430. package/dist/html/html-footnote-marks.d.ts +2 -0
  431. package/dist/html/html-footnote-marks.d.ts.map +1 -0
  432. package/dist/html/html-footnote-marks.js +15 -0
  433. package/dist/html/html-footnote-marks.js.map +1 -0
  434. package/dist/html/html-heading-links.d.ts +6 -0
  435. package/dist/html/html-heading-links.d.ts.map +1 -0
  436. package/dist/html/html-heading-links.js +71 -0
  437. package/dist/html/html-heading-links.js.map +1 -0
  438. package/dist/html/html-lost-tags.d.ts +3 -0
  439. package/dist/html/html-lost-tags.d.ts.map +1 -0
  440. package/dist/html/html-lost-tags.js +11 -0
  441. package/dist/html/html-lost-tags.js.map +1 -0
  442. package/dist/html/html-markdown.d.ts +2 -0
  443. package/dist/html/html-markdown.d.ts.map +1 -0
  444. package/dist/html/html-markdown.js +347 -0
  445. package/dist/html/html-markdown.js.map +1 -0
  446. package/dist/html/html-preformatted.d.ts +17 -0
  447. package/dist/html/html-preformatted.d.ts.map +1 -0
  448. package/dist/html/html-preformatted.js +82 -0
  449. package/dist/html/html-preformatted.js.map +1 -0
  450. package/dist/html/html-reader-only.d.ts +6 -0
  451. package/dist/html/html-reader-only.d.ts.map +1 -0
  452. package/dist/html/html-reader-only.js +63 -0
  453. package/dist/html/html-reader-only.js.map +1 -0
  454. package/dist/html/html-run-in-headings.d.ts +2 -0
  455. package/dist/html/html-run-in-headings.d.ts.map +1 -0
  456. package/dist/html/html-run-in-headings.js +36 -0
  457. package/dist/html/html-run-in-headings.js.map +1 -0
  458. package/dist/html/html-tables.d.ts +3 -0
  459. package/dist/html/html-tables.d.ts.map +1 -0
  460. package/dist/html/html-tables.js +58 -0
  461. package/dist/html/html-tables.js.map +1 -0
  462. package/dist/html/html-widgets.d.ts +3 -0
  463. package/dist/html/html-widgets.d.ts.map +1 -0
  464. package/dist/html/html-widgets.js +71 -0
  465. package/dist/html/html-widgets.js.map +1 -0
  466. package/dist/html/markup-text.d.ts +5 -0
  467. package/dist/html/markup-text.d.ts.map +1 -0
  468. package/dist/html/markup-text.js +32 -0
  469. package/dist/html/markup-text.js.map +1 -0
  470. package/dist/html/page-document.d.ts +9 -0
  471. package/dist/html/page-document.d.ts.map +1 -0
  472. package/dist/html/page-document.js +19 -0
  473. package/dist/html/page-document.js.map +1 -0
  474. package/dist/inline-count.d.ts +19 -0
  475. package/dist/inline-count.d.ts.map +1 -0
  476. package/dist/inline-count.js +109 -0
  477. package/dist/inline-count.js.map +1 -0
  478. package/dist/kana-spelling.d.ts +5 -0
  479. package/dist/kana-spelling.d.ts.map +1 -1
  480. package/dist/kana-spelling.js +5 -0
  481. package/dist/kana-spelling.js.map +1 -1
  482. package/dist/location-part.d.ts +13 -0
  483. package/dist/location-part.d.ts.map +1 -0
  484. package/dist/location-part.js +24 -0
  485. package/dist/location-part.js.map +1 -0
  486. package/dist/nado-closed-list.d.ts +20 -0
  487. package/dist/nado-closed-list.d.ts.map +1 -0
  488. package/dist/nado-closed-list.js +72 -0
  489. package/dist/nado-closed-list.js.map +1 -0
  490. package/dist/name-cue.d.ts +17 -0
  491. package/dist/name-cue.d.ts.map +1 -0
  492. package/dist/name-cue.js +29 -0
  493. package/dist/name-cue.js.map +1 -0
  494. package/dist/name-variants.d.ts +41 -5
  495. package/dist/name-variants.d.ts.map +1 -1
  496. package/dist/name-variants.js +93 -8
  497. package/dist/name-variants.js.map +1 -1
  498. package/dist/paragraph-runs.d.ts +6 -1
  499. package/dist/paragraph-runs.d.ts.map +1 -1
  500. package/dist/paragraph-runs.js +9 -2
  501. package/dist/paragraph-runs.js.map +1 -1
  502. package/dist/parameter-table.d.ts +19 -0
  503. package/dist/parameter-table.d.ts.map +1 -0
  504. package/dist/parameter-table.js +191 -0
  505. package/dist/parameter-table.js.map +1 -0
  506. package/dist/phone-numbers.d.ts +23 -0
  507. package/dist/phone-numbers.d.ts.map +1 -0
  508. package/dist/phone-numbers.js +83 -0
  509. package/dist/phone-numbers.js.map +1 -0
  510. package/dist/place-names.d.ts +55 -0
  511. package/dist/place-names.d.ts.map +1 -0
  512. package/dist/place-names.js +196 -0
  513. package/dist/place-names.js.map +1 -0
  514. package/dist/plugin.d.ts +4 -0
  515. package/dist/plugin.d.ts.map +1 -1
  516. package/dist/prerequisite-order.d.ts +16 -0
  517. package/dist/prerequisite-order.d.ts.map +1 -0
  518. package/dist/prerequisite-order.js +29 -0
  519. package/dist/prerequisite-order.js.map +1 -0
  520. package/dist/profile/parse.d.ts.map +1 -1
  521. package/dist/profile/parse.js +10 -1
  522. package/dist/profile/parse.js.map +1 -1
  523. package/dist/reasons.d.ts +2 -0
  524. package/dist/reasons.d.ts.map +1 -1
  525. package/dist/reasons.js +2 -0
  526. package/dist/reasons.js.map +1 -1
  527. package/dist/render/rules-json.d.ts.map +1 -1
  528. package/dist/render/rules-json.js +4 -0
  529. package/dist/render/rules-json.js.map +1 -1
  530. package/dist/render/rules-table.d.ts.map +1 -1
  531. package/dist/render/rules-table.js +6 -2
  532. package/dist/render/rules-table.js.map +1 -1
  533. package/dist/rule-genres.d.ts +5 -2
  534. package/dist/rule-genres.d.ts.map +1 -1
  535. package/dist/rule-genres.js +2 -0
  536. package/dist/rule-genres.js.map +1 -1
  537. package/dist/rule-load.d.ts.map +1 -1
  538. package/dist/rule-load.js +2 -1
  539. package/dist/rule-load.js.map +1 -1
  540. package/dist/run.d.ts.map +1 -1
  541. package/dist/run.js +5 -1
  542. package/dist/run.js.map +1 -1
  543. package/dist/spelling.d.ts +2 -0
  544. package/dist/spelling.d.ts.map +1 -1
  545. package/dist/spelling.js +6 -0
  546. package/dist/spelling.js.map +1 -1
  547. package/dist/structure/action-due.d.ts +21 -0
  548. package/dist/structure/action-due.d.ts.map +1 -0
  549. package/dist/structure/action-due.js +126 -0
  550. package/dist/structure/action-due.js.map +1 -0
  551. package/dist/structure/amount-range.d.ts +30 -0
  552. package/dist/structure/amount-range.d.ts.map +1 -0
  553. package/dist/structure/amount-range.js +153 -0
  554. package/dist/structure/amount-range.js.map +1 -0
  555. package/dist/structure/amount-scale.d.ts +35 -0
  556. package/dist/structure/amount-scale.d.ts.map +1 -0
  557. package/dist/structure/amount-scale.js +83 -0
  558. package/dist/structure/amount-scale.js.map +1 -0
  559. package/dist/structure/cite.d.ts +5 -2
  560. package/dist/structure/cite.d.ts.map +1 -1
  561. package/dist/structure/cite.js +20 -1
  562. package/dist/structure/cite.js.map +1 -1
  563. package/dist/structure/counted-amounts.d.ts +12 -0
  564. package/dist/structure/counted-amounts.d.ts.map +1 -0
  565. package/dist/structure/counted-amounts.js +30 -0
  566. package/dist/structure/counted-amounts.js.map +1 -0
  567. package/dist/structure/date-order.d.ts +24 -3
  568. package/dist/structure/date-order.d.ts.map +1 -1
  569. package/dist/structure/date-order.js +49 -17
  570. package/dist/structure/date-order.js.map +1 -1
  571. package/dist/structure/date-outside-period.d.ts +27 -0
  572. package/dist/structure/date-outside-period.d.ts.map +1 -0
  573. package/dist/structure/date-outside-period.js +86 -0
  574. package/dist/structure/date-outside-period.js.map +1 -0
  575. package/dist/structure/definition-use.d.ts +5 -2
  576. package/dist/structure/definition-use.d.ts.map +1 -1
  577. package/dist/structure/definition-use.js +11 -3
  578. package/dist/structure/definition-use.js.map +1 -1
  579. package/dist/structure/due-date.d.ts +19 -0
  580. package/dist/structure/due-date.d.ts.map +1 -0
  581. package/dist/structure/due-date.js +30 -0
  582. package/dist/structure/due-date.js.map +1 -0
  583. package/dist/structure/heading-runs.d.ts +9 -0
  584. package/dist/structure/heading-runs.d.ts.map +1 -0
  585. package/dist/structure/heading-runs.js +23 -0
  586. package/dist/structure/heading-runs.js.map +1 -0
  587. package/dist/structure/install-pin.d.ts +46 -0
  588. package/dist/structure/install-pin.d.ts.map +1 -0
  589. package/dist/structure/install-pin.js +85 -0
  590. package/dist/structure/install-pin.js.map +1 -0
  591. package/dist/structure/leg-times.d.ts +34 -0
  592. package/dist/structure/leg-times.d.ts.map +1 -0
  593. package/dist/structure/leg-times.js +135 -0
  594. package/dist/structure/leg-times.js.map +1 -0
  595. package/dist/structure/line-amount-unit.d.ts +24 -0
  596. package/dist/structure/line-amount-unit.d.ts.map +1 -0
  597. package/dist/structure/line-amount-unit.js +24 -0
  598. package/dist/structure/line-amount-unit.js.map +1 -0
  599. package/dist/structure/line-amount.d.ts +40 -0
  600. package/dist/structure/line-amount.d.ts.map +1 -0
  601. package/dist/structure/line-amount.js +118 -0
  602. package/dist/structure/line-amount.js.map +1 -0
  603. package/dist/structure/number-word-figure.d.ts +37 -0
  604. package/dist/structure/number-word-figure.d.ts.map +1 -0
  605. package/dist/structure/number-word-figure.js +151 -0
  606. package/dist/structure/number-word-figure.js.map +1 -0
  607. package/dist/structure/numbering.d.ts +1 -0
  608. package/dist/structure/numbering.d.ts.map +1 -1
  609. package/dist/structure/numbering.js +3 -0
  610. package/dist/structure/numbering.js.map +1 -1
  611. package/dist/structure/ordinal-runs.d.ts +45 -0
  612. package/dist/structure/ordinal-runs.d.ts.map +1 -0
  613. package/dist/structure/ordinal-runs.js +78 -0
  614. package/dist/structure/ordinal-runs.js.map +1 -0
  615. package/dist/structure/percent-sum-prose.d.ts +1 -1
  616. package/dist/structure/percent-sum-prose.d.ts.map +1 -1
  617. package/dist/structure/percent-sum-prose.js +45 -3
  618. package/dist/structure/percent-sum-prose.js.map +1 -1
  619. package/dist/structure/percent-sum.d.ts +8 -0
  620. package/dist/structure/percent-sum.d.ts.map +1 -1
  621. package/dist/structure/percent-sum.js +8 -1
  622. package/dist/structure/percent-sum.js.map +1 -1
  623. package/dist/structure/release-list.d.ts +9 -0
  624. package/dist/structure/release-list.d.ts.map +1 -0
  625. package/dist/structure/release-list.js +46 -0
  626. package/dist/structure/release-list.js.map +1 -0
  627. package/dist/structure/share-column.d.ts +7 -0
  628. package/dist/structure/share-column.d.ts.map +1 -0
  629. package/dist/structure/share-column.js +22 -0
  630. package/dist/structure/share-column.js.map +1 -0
  631. package/dist/structure/stated-period.d.ts +31 -0
  632. package/dist/structure/stated-period.d.ts.map +1 -0
  633. package/dist/structure/stated-period.js +127 -0
  634. package/dist/structure/stated-period.js.map +1 -0
  635. package/dist/structure/subject-change.d.ts +8 -0
  636. package/dist/structure/subject-change.d.ts.map +1 -0
  637. package/dist/structure/subject-change.js +31 -0
  638. package/dist/structure/subject-change.js.map +1 -0
  639. package/dist/structure/tax.d.ts +25 -0
  640. package/dist/structure/tax.d.ts.map +1 -0
  641. package/dist/structure/tax.js +86 -0
  642. package/dist/structure/tax.js.map +1 -0
  643. package/dist/structure/time-marks.d.ts +58 -0
  644. package/dist/structure/time-marks.d.ts.map +1 -0
  645. package/dist/structure/time-marks.js +74 -0
  646. package/dist/structure/time-marks.js.map +1 -0
  647. package/dist/structure/time-order.d.ts +21 -0
  648. package/dist/structure/time-order.d.ts.map +1 -0
  649. package/dist/structure/time-order.js +108 -0
  650. package/dist/structure/time-order.js.map +1 -0
  651. package/dist/structure/title-lines.d.ts +8 -0
  652. package/dist/structure/title-lines.d.ts.map +1 -0
  653. package/dist/structure/title-lines.js +27 -0
  654. package/dist/structure/title-lines.js.map +1 -0
  655. package/dist/structure/total.d.ts.map +1 -1
  656. package/dist/structure/total.js +3 -1
  657. package/dist/structure/total.js.map +1 -1
  658. package/dist/structure/version-mismatch.d.ts +1 -5
  659. package/dist/structure/version-mismatch.d.ts.map +1 -1
  660. package/dist/structure/version-mismatch.js +65 -12
  661. package/dist/structure/version-mismatch.js.map +1 -1
  662. package/dist/structure/version-order.d.ts +23 -0
  663. package/dist/structure/version-order.d.ts.map +1 -0
  664. package/dist/structure/version-order.js +67 -0
  665. package/dist/structure/version-order.js.map +1 -0
  666. package/dist/table-text.d.ts +9 -0
  667. package/dist/table-text.d.ts.map +1 -0
  668. package/dist/table-text.js +36 -0
  669. package/dist/table-text.js.map +1 -0
  670. package/dist/ui-labels.d.ts +16 -0
  671. package/dist/ui-labels.d.ts.map +1 -0
  672. package/dist/ui-labels.js +42 -0
  673. package/dist/ui-labels.js.map +1 -0
  674. package/dist/undefined-call.d.ts +13 -0
  675. package/dist/undefined-call.d.ts.map +1 -0
  676. package/dist/undefined-call.js +55 -0
  677. package/dist/undefined-call.js.map +1 -0
  678. package/dist/unnamed-speaker.d.ts +23 -0
  679. package/dist/unnamed-speaker.d.ts.map +1 -0
  680. package/dist/unnamed-speaker.js +176 -0
  681. package/dist/unnamed-speaker.js.map +1 -0
  682. package/dist/warning-action.d.ts +22 -0
  683. package/dist/warning-action.d.ts.map +1 -0
  684. package/dist/warning-action.js +58 -0
  685. package/dist/warning-action.js.map +1 -0
  686. package/genres.yaml +2 -0
  687. package/package.json +4 -3
  688. package/profiles/statute.yaml +8 -0
  689. package/rules/agreement-slip.yaml +2 -2
  690. package/rules/amount-range-reversed.yaml +52 -0
  691. package/rules/amount-scale-consistency.yaml +74 -0
  692. package/rules/announced-count-mismatch.yaml +9 -4
  693. package/rules/arrival-before-departure.yaml +48 -0
  694. package/rules/change-rate-mismatch.yaml +5 -4
  695. package/rules/connective-hierarchy.yaml +3 -3
  696. package/rules/currency-notation-consistency.yaml +2 -2
  697. package/rules/date-order.yaml +9 -4
  698. package/rules/date-outside-period.yaml +64 -0
  699. package/rules/default-value-mismatch.yaml +79 -0
  700. package/rules/defined-term-form.yaml +9 -7
  701. package/rules/deprecated-option-used.yaml +78 -0
  702. package/rules/doubled-nado.yaml +28 -12
  703. package/rules/due-before-issue.yaml +68 -0
  704. package/rules/duplicate-definition.yaml +2 -2
  705. package/rules/duration-mismatch.yaml +12 -4
  706. package/rules/elapsed-years-mismatch.yaml +2 -2
  707. package/rules/heading-echo.yaml +2 -2
  708. package/rules/hyphen-as-dash.yaml +2 -2
  709. package/rules/kana-function-word.yaml +58 -0
  710. package/rules/latin-spacing.yaml +6 -5
  711. package/rules/line-amount-mismatch.yaml +58 -0
  712. package/rules/nado-closed-list.yaml +77 -0
  713. package/rules/name-variant.yaml +17 -2
  714. package/rules/number-word-figure-mismatch.yaml +76 -0
  715. package/rules/numbering-gap.yaml +2 -2
  716. package/rules/obligation-without-deadline.yaml +95 -0
  717. package/rules/one-sentence-paragraph-run.yaml +2 -3
  718. package/rules/parameter-table-mismatch.yaml +90 -0
  719. package/rules/percent-sum-mismatch.yaml +2 -2
  720. package/rules/phone-number-variant.yaml +68 -0
  721. package/rules/prerequisite-after-step.yaml +78 -0
  722. package/rules/quote-unnamed-speaker.yaml +67 -0
  723. package/rules/quote-without-source.yaml +6 -6
  724. package/rules/requirement-smell.yaml +3 -3
  725. package/rules/sentence-initial-conjunction-run.yaml +13 -7
  726. package/rules/summary-fact-mismatch.yaml +4 -4
  727. package/rules/tax-mismatch.yaml +71 -0
  728. package/rules/time-order.yaml +65 -0
  729. package/rules/title-length.yaml +2 -2
  730. package/rules/ui-label-variant.yaml +70 -0
  731. package/rules/unbalanced-bracket.yaml +4 -4
  732. package/rules/uncomparable-graded.yaml +29 -10
  733. package/rules/undefined-function-call.yaml +77 -0
  734. package/rules/undefined-term.yaml +72 -0
  735. package/rules/unknown-word.yaml +2 -2
  736. package/rules/unqualified-superlative.yaml +2 -2
  737. package/rules/use-before-definition.yaml +2 -2
  738. package/rules/version-mismatch.yaml +12 -4
  739. package/rules/version-order.yaml +85 -0
  740. package/rules/very-adjective.yaml +31 -13
  741. package/rules/warning-without-action.yaml +64 -0
  742. package/rules/wordy-phrase.yaml +27 -9
  743. package/src/ai-score/of-document.ts +19 -9
  744. package/src/ai-score/render.ts +24 -4
  745. package/src/ai-score/score.ts +24 -3
  746. package/src/ai-score/signals.ts +12 -2
  747. package/src/ai-score/text.ts +7 -2
  748. package/src/announced-count.ts +19 -12
  749. package/src/check-source.ts +11 -2
  750. package/src/cli-text.ts +42 -18
  751. package/src/cli.ts +2 -1
  752. package/src/commands/cite-claims.ts +103 -0
  753. package/src/commands/cite-page.ts +61 -0
  754. package/src/commands/cite-scaffold.ts +27 -0
  755. package/src/commands/cite.ts +127 -58
  756. package/src/company-names.ts +202 -0
  757. package/src/default-values.ts +158 -0
  758. package/src/deprecated-use.ts +122 -0
  759. package/src/derived/number-word-counts.ts +28 -0
  760. package/src/derived/stays.ts +145 -0
  761. package/src/detectors/acronym-context.ts +10 -2
  762. package/src/detectors/address-word.ts +9 -0
  763. package/src/detectors/agreement-slip.ts +7 -1
  764. package/src/detectors/ai-phrasing.ts +6 -1
  765. package/src/detectors/amount-range.ts +54 -0
  766. package/src/detectors/amount-scale.ts +96 -0
  767. package/src/detectors/announced-count.ts +29 -11
  768. package/src/detectors/bare-comparative.ts +7 -2
  769. package/src/detectors/block-quotation.ts +95 -0
  770. package/src/detectors/bracket-label.ts +58 -0
  771. package/src/detectors/change-rate.ts +15 -2
  772. package/src/detectors/citation-entry.ts +20 -5
  773. package/src/detectors/code-before.ts +14 -0
  774. package/src/detectors/connective-hierarchy.ts +39 -11
  775. package/src/detectors/currency-notation.ts +4 -3
  776. package/src/detectors/date-outside-period.ts +38 -0
  777. package/src/detectors/default-values.ts +17 -0
  778. package/src/detectors/defined-term-form.ts +84 -15
  779. package/src/detectors/definition-use.ts +10 -2
  780. package/src/detectors/deprecated-use.ts +17 -0
  781. package/src/detectors/derived-numbers.ts +115 -17
  782. package/src/detectors/document-shape.ts +6 -1
  783. package/src/detectors/due-date.ts +47 -0
  784. package/src/detectors/en-shape.ts +27 -11
  785. package/src/detectors/fact-consistency.ts +110 -2
  786. package/src/detectors/heading-echo.ts +11 -1
  787. package/src/detectors/kana-function-word.ts +71 -0
  788. package/src/detectors/line-amount.ts +33 -0
  789. package/src/detectors/location-pointer.ts +30 -0
  790. package/src/detectors/mark-shape.ts +18 -1
  791. package/src/detectors/nado-closed-list.ts +25 -0
  792. package/src/detectors/name-variant.ts +114 -11
  793. package/src/detectors/next-word.ts +56 -9
  794. package/src/detectors/number-word-figure.ts +43 -0
  795. package/src/detectors/obligation-without-deadline.ts +192 -0
  796. package/src/detectors/open-end-names.ts +140 -0
  797. package/src/detectors/ordinal-run-gaps.ts +101 -0
  798. package/src/detectors/orthographic-variant.ts +39 -14
  799. package/src/detectors/orthography.ts +6 -1
  800. package/src/detectors/parameter-table.ts +17 -0
  801. package/src/detectors/phone-number-variant.ts +18 -0
  802. package/src/detectors/prerequisite-order.ts +35 -0
  803. package/src/detectors/quote-unnamed-speaker.ts +19 -0
  804. package/src/detectors/quote-without-source.ts +57 -10
  805. package/src/detectors/registry/amount-range.ts +4 -0
  806. package/src/detectors/registry/amount-scale.ts +4 -0
  807. package/src/detectors/registry/arrival-before-departure.ts +4 -0
  808. package/src/detectors/registry/date-outside-period.ts +4 -0
  809. package/src/detectors/registry/default-values.ts +4 -0
  810. package/src/detectors/registry/deprecated-use.ts +4 -0
  811. package/src/detectors/registry/due-date.ts +4 -0
  812. package/src/detectors/registry/kana-function-word.ts +4 -0
  813. package/src/detectors/registry/line-amount.ts +4 -0
  814. package/src/detectors/registry/nado-closed-list.ts +4 -0
  815. package/src/detectors/registry/number-word-figure.ts +4 -0
  816. package/src/detectors/registry/obligation-without-deadline.ts +4 -0
  817. package/src/detectors/registry/parameter-table.ts +4 -0
  818. package/src/detectors/registry/phone-number-variant.ts +4 -0
  819. package/src/detectors/registry/prerequisite-order.ts +4 -0
  820. package/src/detectors/registry/quote-unnamed-speaker.ts +4 -0
  821. package/src/detectors/registry/tax-amount.ts +4 -0
  822. package/src/detectors/registry/time-order.ts +4 -0
  823. package/src/detectors/registry/ui-label.ts +4 -0
  824. package/src/detectors/registry/undefined-call.ts +4 -0
  825. package/src/detectors/registry/undefined-term.ts +4 -0
  826. package/src/detectors/registry/version-order.ts +4 -0
  827. package/src/detectors/registry/warning-action.ts +4 -0
  828. package/src/detectors/requirement-smell.ts +29 -9
  829. package/src/detectors/structure-tree.ts +43 -21
  830. package/src/detectors/superlative-scope.ts +13 -1
  831. package/src/detectors/tax-amount.ts +25 -0
  832. package/src/detectors/technical-docs.ts +7 -1
  833. package/src/detectors/term-extension.ts +67 -0
  834. package/src/detectors/time-order.ts +49 -0
  835. package/src/detectors/ui-label.ts +17 -0
  836. package/src/detectors/unbalanced-bracket.ts +7 -14
  837. package/src/detectors/undefined-call.ts +19 -0
  838. package/src/detectors/undefined-term.ts +103 -0
  839. package/src/detectors/unknown-word.ts +3 -3
  840. package/src/detectors/vague-deadline.ts +3 -3
  841. package/src/detectors/version-mismatch.ts +26 -5
  842. package/src/detectors/version-order.ts +50 -0
  843. package/src/detectors/warning-action.ts +49 -0
  844. package/src/facts/condition-pairs.ts +289 -0
  845. package/src/facts/counted-facts.ts +59 -0
  846. package/src/facts/event-dates.ts +63 -0
  847. package/src/facts/fact-scope.ts +6 -0
  848. package/src/facts/labelled-facts.ts +13 -1
  849. package/src/facts/table-facts.ts +3 -3
  850. package/src/grade/ai-score.ts +1 -1
  851. package/src/grade/text.ts +2 -2
  852. package/src/heading-numbering.ts +2 -2
  853. package/src/html/fetch-page.ts +64 -0
  854. package/src/html/fetched-text.ts +32 -0
  855. package/src/html/html-content-block.ts +107 -0
  856. package/src/html/html-elements.ts +127 -0
  857. package/src/html/html-footnote-marks.ts +20 -0
  858. package/src/html/html-heading-links.ts +93 -0
  859. package/src/html/html-lost-tags.ts +14 -0
  860. package/src/html/html-markdown.ts +481 -0
  861. package/src/html/html-preformatted.ts +110 -0
  862. package/src/html/html-reader-only.ts +82 -0
  863. package/src/html/html-run-in-headings.ts +43 -0
  864. package/src/html/html-tables.ts +76 -0
  865. package/src/html/html-widgets.ts +114 -0
  866. package/src/html/markup-text.ts +35 -0
  867. package/src/html/page-document.ts +22 -0
  868. package/src/inline-count.ts +146 -0
  869. package/src/kana-spelling.ts +7 -0
  870. package/src/location-part.ts +30 -0
  871. package/src/nado-closed-list.ts +106 -0
  872. package/src/name-cue.ts +35 -0
  873. package/src/name-variants.ts +152 -11
  874. package/src/paragraph-runs.ts +12 -2
  875. package/src/parameter-table.ts +208 -0
  876. package/src/phone-numbers.ts +98 -0
  877. package/src/place-names.ts +248 -0
  878. package/src/plugin.ts +4 -0
  879. package/src/prerequisite-order.ts +39 -0
  880. package/src/profile/parse.ts +10 -1
  881. package/src/reasons.ts +4 -0
  882. package/src/render/rules-json.ts +4 -0
  883. package/src/render/rules-table.ts +6 -3
  884. package/src/rule-genres.ts +5 -2
  885. package/src/rule-load.ts +3 -2
  886. package/src/run.ts +3 -1
  887. package/src/spelling.ts +8 -0
  888. package/src/structure/action-due.ts +179 -0
  889. package/src/structure/amount-range.ts +219 -0
  890. package/src/structure/amount-scale.ts +115 -0
  891. package/src/structure/cite.ts +21 -2
  892. package/src/structure/counted-amounts.ts +42 -0
  893. package/src/structure/date-order.ts +72 -22
  894. package/src/structure/date-outside-period.ts +127 -0
  895. package/src/structure/definition-use.ts +24 -3
  896. package/src/structure/due-date.ts +46 -0
  897. package/src/structure/heading-runs.ts +24 -0
  898. package/src/structure/install-pin.ts +115 -0
  899. package/src/structure/leg-times.ts +198 -0
  900. package/src/structure/line-amount-unit.ts +35 -0
  901. package/src/structure/line-amount.ts +162 -0
  902. package/src/structure/number-word-figure.ts +199 -0
  903. package/src/structure/numbering.ts +3 -0
  904. package/src/structure/ordinal-runs.ts +107 -0
  905. package/src/structure/percent-sum-prose.ts +46 -3
  906. package/src/structure/percent-sum.ts +16 -2
  907. package/src/structure/release-list.ts +69 -0
  908. package/src/structure/share-column.ts +25 -0
  909. package/src/structure/stated-period.ts +161 -0
  910. package/src/structure/subject-change.ts +35 -0
  911. package/src/structure/tax.ts +114 -0
  912. package/src/structure/time-marks.ts +127 -0
  913. package/src/structure/time-order.ts +140 -0
  914. package/src/structure/title-lines.ts +33 -0
  915. package/src/structure/total.ts +5 -1
  916. package/src/structure/version-mismatch.ts +67 -13
  917. package/src/structure/version-order.ts +84 -0
  918. package/src/table-text.ts +39 -0
  919. package/src/ui-labels.ts +55 -0
  920. package/src/undefined-call.ts +65 -0
  921. package/src/unnamed-speaker.ts +224 -0
  922. package/src/warning-action.ts +73 -0
  923. package/styles/koyobun.yaml +7 -4
@@ -6,7 +6,7 @@ import { limitsFor } from "./config/style.ts";
6
6
  import { rulesOf } from "./custom/load.ts";
7
7
  import { guessLanguage } from "./detect.ts";
8
8
  import { buildDocument, teamRules } from "./document.ts";
9
- import type { CrossDetector, ProseDocument, RuleDefinition } from "./plugin.ts";
9
+ import type { AdapterNeeds, CrossDetector, ProseDocument, RuleDefinition } from "./plugin.ts";
10
10
  import { profileFor } from "./profile/for-file.ts";
11
11
  import { resolveGenre, type ResolvedGenre } from "./resolve-genre.ts";
12
12
  import { neededBy, runRulesWith, type RunContext, type RunResult } from "./run.ts";
@@ -33,13 +33,22 @@ export type SourceCheck = {
33
33
  readonly applied: Applied;
34
34
  };
35
35
 
36
+ /** What the language adapter is asked to prepare for these rules under this chaff.yaml: what the running rules read, nothing more. */
37
+ export const adapterNeedsOf = (
38
+ rules: readonly RuleDefinition[],
39
+ config: Pick<Config, "rules">,
40
+ experimental: boolean,
41
+ genre: string,
42
+ language: string,
43
+ ): AdapterNeeds => neededBy(rules, config.rules, experimental, genre, language);
44
+
36
45
  /** Lints one text as `chaff <file>` does. The file need not exist: `chaff grade` checks a model's output from memory. */
37
46
  export const checkSource = async (path: string, source: string, config: Config, choice: CheckChoice): Promise<SourceCheck> => {
38
47
  const language = choice.language ?? documentLanguage(path, source, config);
39
48
  const adapter = await loadAdapter(language);
40
49
  const genre = resolveGenre(path, source, config, choice.genre);
41
50
  const rules = rulesOf(language, config);
42
- await adapter.prepare?.(neededBy(rules, config.rules, choice.experimental, genre.genre, language));
51
+ await adapter.prepare?.(adapterNeedsOf(rules, config, choice.experimental, genre.genre, language));
43
52
  const doc = buildDocument(path, source, adapter, teamRules(config, language), profileFor(config, path, source, language, genre.genre));
44
53
  const context: RunContext = {
45
54
  settings: config.rules,
package/src/cli-text.ts CHANGED
@@ -34,25 +34,36 @@ const USAGE_JA = `chaff — 文章の読みにくいところを見つけます
34
34
  chaff init --plugin <名前> YAML だけのルールの束(chaff-plugin-<名前>/)を作る
35
35
  chaff plugin-test [フォルダ] プラグインの各ルールを、そのルールの例にかけて確かめる
36
36
  chaff --version chaffjs と言語パッケージの版
37
- chaff eval <dir> 手元の文書で閾値を測り直す
37
+ chaff eval <dir> [--rule <rule>] 手元の文書で閾値を測り直す(--rule でそのルールだけ)
38
38
  chaff explain <rule> そのルールの意図と根拠を読む
39
39
  chaff genres ジャンル(文書の種類)の一覧と、それぞれ何向けか
40
40
  chaff tree <file> [--format sexp|json] 文書を番地の付いた木にする(条・項・定義・参照)
41
- chaff cite <原文> <引用.json> 回答の引用(番地と引用文)が原文にあるかを確かめる
42
- chaff compare <前> <後> 書き換えで事実(数・日付・URL・コード・名前・引用…)が落ちても足されてもいないかを確かめる
43
- chaff facts <file> compare が照合する事実を、書き直す前の控えとして一覧にする
44
- chaff outline <file> [<後>] 見出しの構成と形(見出しの数・節の平均の長さ・箇条書きの割合・太字)を測る。2 つなら前と後を並べる
45
- chaff ai-score <file>... [--format json] AI らしさの簡易判定(低・中・高)。生成文に多い目印を、同じジャンルの人の文書と比べる(書いたのが AI かは判定しない)
46
- chaff grade <items.jsonl> [--out <results.jsonl>] [--json]
41
+ chaff cite <原文> <引用.json> [--format text|json] 回答の引用(番地と引用文)が原文にあるかを確かめる
42
+ chaff cite --scaffold <file> 出典の無い引用を、出典を書き込む引用.json のひな形にする
43
+ chaff cite --url <URL> <引用.json> 引用が Web のページにあるかを確かめる(取得したページは HTML から Markdown にして読む)
44
+ chaff compare <前> <後> [--json|--compact] 書き換えで事実(数・日付・URL・コード・名前・引用…)が落ちても足されてもいないかを確かめる
45
+ --allow-dropped <種類> と --allow-added <種類> は、その種類の欠落・追加を許す(カンマで並べる。種類は number date time url code name quote heading reference footnote)
46
+ --distinct は、何回述べたかではなく、述べているかだけを比べる
47
+ chaff facts <file> [--json|--compact] compare が照合する事実を、書き直す前の控えとして一覧にする
48
+ chaff outline <file> [<後>] [--json|--compact] 見出しの構成と形(見出しの数・節の平均の長さ・箇条書きの割合・太字)を測る。2 つなら前と後を並べる
49
+ chaff ai-score <file>... [--format text|json] [--json] [--compact]
50
+ AI らしさの簡易判定(低・中・高)。生成文に多い目印を、同じジャンルの人の文書と比べる(書いたのが AI かは判定しない)
51
+ --json は --format json と同じ。--compact はファイルごとに 1 行
52
+ chaff grade <items.jsonl> [--out <results.jsonl>] [--baseline <前の results.jsonl>] [--allow-stamp-mismatch]
53
+ [--variant-key <欄>] [--format text|json|markdown] [--json] [--compact]
47
54
  AI の出力を JSONL でまとめて採点する(指摘の率・事実・引用・合否。何も送らない)
48
- chaff fix-plan <file> [--json] 指摘をルールごとにまとめ、直す方向と確かめのコマンドを、書き直す人や AI 向けの計画にする(何も送らない)
55
+ --allow-stamp-mismatch はルールか設定が前の回と違っても比べる(そのことを先に出す)
56
+ --variant-key は variant の欄の代わりにその欄で出力を分けて並べる。--json は --format json と同じ。markdown は PR のコメント向け
57
+ chaff fix-plan <file> [--depth light|structure|register] [--json]
58
+ 指摘をルールごとにまとめ、直す方向と確かめのコマンドを、書き直す人や AI 向けの計画にする(何も送らない)
49
59
  chaff rules ルールの一覧を、グループごとに表で出す(いまの段階つき)
50
60
  chaff rules --json いまの設定とルールの説明を JSON で出す(AI に渡す用)
51
61
  chaff baseline <dir> いまある指摘を棚上げする(既存の repo に入れるとき)
52
62
  chaff suppressions <dir> stet で黙らせている指摘を数える
53
63
  chaff relax|strict|off <rule> [--why "理由"]
54
64
  chaff enable <rule> [--why "理由"] 試験中のルールを 1 つだけ動かす(chaff.yaml の rules に <rule>: normal と書く)
55
- chaff skill [--global] Claude Code の skill を入れる(.claude/skills/chaff/、--global で ~/.claude/)
65
+ chaff skill [--global] [--force] Claude Code の skill を入れる(.claude/skills/chaff/、--global で ~/.claude/)
66
+ 手で直したらしい skill は置き換えない。--force で置き換える
56
67
  chaff feedback <file> --rule <rule> [--line N] | --missed --line N
57
68
  誤った指摘・見逃しの報告の下書きを作る(何も送らない。--with-config で chaff.yaml 全体も載せる)
58
69
 
@@ -65,6 +76,7 @@ const USAGE_JA = `chaff — 文章の読みにくいところを見つけます
65
76
  --dry-run test で、何を AI に送るかだけを見る(API を呼びません)
66
77
  --sarif <path> 指摘を SARIF で書き出す(GitHub の PR の行に出すため)
67
78
  --include <glob> フォルダを見るとき、Markdown のほかにこのファイルも検査する(--include "*.yaml"。chaff.yaml の include と同じ)
79
+ --language <ja|en> tree・cite・compare・facts・outline・ai-score で、文書の言語を決める(chaff.yaml と中身からの推定より優先)
68
80
 
69
81
  この箇所だけ黙らせる: <!-- stet: rule-id — 理由 -->
70
82
 
@@ -81,25 +93,36 @@ const USAGE_EN = `chaff — finds what makes writing hard to read. It never rewr
81
93
  chaff init --plugin <name> create a YAML rule pack, chaff-plugin-<name>/
82
94
  chaff plugin-test [folder] run each rule of a plugin on the rule's own example
83
95
  chaff --version the version of chaffjs and its language packages
84
- chaff eval <dir> re-measure the limits on your own documents
96
+ chaff eval <dir> [--rule <rule>] re-measure the limits on your own documents (--rule: that rule only)
85
97
  chaff explain <rule> read what a rule is for and why
86
98
  chaff genres list the genres (kinds of document) and what each is for
87
99
  chaff tree <file> [--format sexp|json] the document as a tree of addresses (sections, clauses, definitions, references)
88
- chaff cite <source> <quotes.json> check that quoted passages (address and text) are in the source
89
- chaff compare <before> <after> check that a rewrite dropped no fact and added none (numbers, dates, URLs, code, names, quotations…)
90
- chaff facts <file> list the facts compare checks, as an inventory to keep before a rewrite
91
- chaff outline <file> [<after>] measure the outline and its shape (headings, average section length, text in lists, bold); two files side by side
92
- chaff ai-score <file>... [--format json] quick AI-likeness score (low, medium, high): signs common in generated text against human documents of the genre (not a verdict on who wrote it)
93
- chaff grade <items.jsonl> [--out <results.jsonl>] [--json]
100
+ chaff cite <source> <quotes.json> [--format text|json] check that quoted passages (address and text) are in the source
101
+ chaff cite --scaffold <file> a quotes.json to fill in with sources, from the quotations that give none
102
+ chaff cite --url <URL> <quotes.json> check quotations against a web page (fetched, HTML read as Markdown)
103
+ chaff compare <before> <after> [--json|--compact] check that a rewrite dropped no fact and added none (numbers, dates, URLs, code, names, quotations…)
104
+ --allow-dropped <kinds> and --allow-added <kinds> allow those kinds to go or come (comma-separated: number date time url code name quote heading reference footnote)
105
+ --distinct compares only whether a fact is stated, not how many times
106
+ chaff facts <file> [--json|--compact] list the facts compare checks, as an inventory to keep before a rewrite
107
+ chaff outline <file> [<after>] [--json|--compact] measure the outline and its shape (headings, average section length, text in lists, bold); two files side by side
108
+ chaff ai-score <file>... [--format text|json] [--json] [--compact]
109
+ quick AI-likeness score (low, medium, high): signs common in generated text against human documents of the genre (not a verdict on who wrote it)
110
+ --json is --format json; --compact prints one line per file
111
+ chaff grade <items.jsonl> [--out <results.jsonl>] [--baseline <earlier results.jsonl>] [--allow-stamp-mismatch]
112
+ [--variant-key <field>] [--format text|json|markdown] [--json] [--compact]
94
113
  grade a JSONL file of model outputs (finding rates, facts, quotations, pass or fail; sends nothing)
95
- chaff fix-plan <file> [--json] a plan for whoever rewrites the file, a person or an AI: findings by rule, how to rewrite each, the checks to run after (sends nothing)
114
+ --allow-stamp-mismatch compares with the baseline even when its rules or settings differ, saying so first
115
+ --variant-key splits the outputs by that field instead of variant; --json is --format json; markdown is for a PR comment
116
+ chaff fix-plan <file> [--depth light|structure|register] [--json]
117
+ a plan for whoever rewrites the file, a person or an AI: findings by rule, how to rewrite each, the checks to run after (sends nothing)
96
118
  chaff rules the rules as a table, by group, with the level each runs at now
97
119
  chaff rules --json the current settings and what each rule is, as JSON (to give to an AI)
98
120
  chaff baseline <dir> shelve today's findings (when adding chaff to an existing repository)
99
121
  chaff suppressions <dir> count the findings silenced with stet
100
122
  chaff relax|strict|off <rule> [--why "reason"]
101
123
  chaff enable <rule> [--why "reason"] turn on one experimental rule alone (writes <rule>: normal under rules in chaff.yaml)
102
- chaff skill [--global] install the Claude Code skill (.claude/skills/chaff/; --global for ~/.claude/)
124
+ chaff skill [--global] [--force] install the Claude Code skill (.claude/skills/chaff/; --global for ~/.claude/)
125
+ a skill that looks edited by hand is kept; --force replaces it
103
126
  chaff feedback <file> --rule <rule> [--line N] | --missed --line N
104
127
  draft a report of a wrong or missed finding (sends nothing; --with-config adds all of chaff.yaml)
105
128
 
@@ -112,6 +135,7 @@ const USAGE_EN = `chaff — finds what makes writing hard to read. It never rewr
112
135
  --dry-run with test, show what would be sent to the AI (no API call)
113
136
  --sarif <path> write the findings as SARIF (for comments on a GitHub PR)
114
137
  --include <glob> in a folder, check these files besides Markdown (--include "*.yaml"; as include in chaff.yaml)
138
+ --language <ja|en> with tree, cite, compare, facts, outline and ai-score, the document's language (wins over chaff.yaml and the guess from the text)
115
139
 
116
140
  Silence one spot: <!-- stet: rule-id — reason -->
117
141
 
package/src/cli.ts CHANGED
@@ -50,6 +50,7 @@ import { notRunAmong } from "./not-run.ts";
50
50
  import { settingProblems } from "./setting-problems.ts";
51
51
  import { withExtensions } from "./extension/load.ts";
52
52
  import { offOnlyAsExperimental } from "./experimental-alone.ts";
53
+ import { levelFor } from "./run.ts";
53
54
  import { DEFAULT_GENRE } from "./init-choice.ts";
54
55
  import { stoppingOnYamlFileError } from "./config/yaml-file.ts";
55
56
 
@@ -236,7 +237,7 @@ const explain = (config: Config, ruleId: string | undefined, genreFlag: string |
236
237
  return 1;
237
238
  }
238
239
  const preset = genre === undefined ? {} : presetLevels(genre);
239
- const current = config.rules[rule.id] ?? preset[rule.id] ?? (rule.status === "experimental" && !config.experimental ? "off" : "normal");
240
+ const current = levelFor(rule, config.rules, config.experimental, preset);
240
241
  const alone = offOnlyAsExperimental(rule, config, genre ?? DEFAULT_GENRE, preset, language);
241
242
  console.log(renderExplain(rule, current, language, genre, { ...settingSourcesOf(config, rule.id, language), offOnlyAsExperimental: alone }));
242
243
  return 0;
@@ -0,0 +1,103 @@
1
+ // The claims file `chaff cite` reads: [{ source?, address?, quote }]. Pure: the shape is checked and every problem named,
2
+ // so a half-filled file (a scaffold with a source left empty) stops with a reason instead of passing.
3
+ import { isAnywhere, type Citation } from "../structure/cite.ts";
4
+ import type { Texts, UiLanguage } from "../ui.ts";
5
+
6
+ /** A citation and, when the claims file names it, the source it quotes: a file path, relative to the claims file. */
7
+ export type Claim = Citation & { readonly source?: string };
8
+
9
+ export type ParsedCitations = { readonly citations: readonly Claim[] } | { readonly error: string };
10
+
11
+ type RawClaim = { readonly source?: string; readonly address?: string; readonly quote: string };
12
+
13
+ const isRecord = (value: unknown): value is Record<string, unknown> => typeof value === "object" && value !== null && !Array.isArray(value);
14
+
15
+ const isOptionalString = (value: unknown): boolean => value === undefined || typeof value === "string";
16
+
17
+ const isRawClaim = (value: unknown): value is RawClaim =>
18
+ isRecord(value) && isOptionalString(value["address"]) && isOptionalString(value["source"]) && typeof value["quote"] === "string";
19
+
20
+ const claimOf = (raw: RawClaim): Claim => ({
21
+ ...(raw.source === undefined ? {} : { source: raw.source }),
22
+ address: raw.address ?? "",
23
+ quote: raw.quote,
24
+ });
25
+
26
+ /** Neither an address nor a quote: saying ✓ would pass an entry nobody filled in. */
27
+ const isEmpty = (claim: Claim): boolean => isAnywhere(claim) && claim.quote.trim() === "";
28
+
29
+ /** The source a claim names, or undefined when it names none (missing, empty or blank). */
30
+ export const sourceOf = (claim: Claim): string | undefined => {
31
+ const source = claim.source?.trim() ?? "";
32
+ return source === "" ? undefined : source;
33
+ };
34
+
35
+ type ClaimsText = {
36
+ readonly notJson: (why: string) => string;
37
+ readonly notArray: string;
38
+ readonly badEntry: (n: number) => string;
39
+ readonly emptyEntry: (n: number) => string;
40
+ readonly noSource: (n: number) => string;
41
+ readonly twoSources: (n: number) => string;
42
+ };
43
+
44
+ export const CLAIMS_TEXT: Texts<ClaimsText> = {
45
+ ja: {
46
+ notJson: (why) => `JSON として読めません: ${why}`,
47
+ notArray: '引用は配列で渡してください: [{ "address": "3.2", "quote": "…" }]',
48
+ badEntry: (n) => `${String(n)} 件目に quote(文字列)が無いか、address か source が文字列ではありません`,
49
+ emptyEntry: (n) => `${String(n)} 件目は address も quote も空で、確かめることがありません`,
50
+ noSource: (n) => `${String(n)} 件目に source がありません。原文を引数で渡さないときは、どの引用にも source(原文のファイル)を書いてください`,
51
+ twoSources: (n) => `${String(n)} 件目が source を書いていますが、原文も引数で渡されています。どちらか一方にしてください`,
52
+ },
53
+ en: {
54
+ notJson: (why) => `Not valid JSON: ${why}`,
55
+ notArray: 'Give the quotations as an array: [{ "address": "3.2", "quote": "…" }]',
56
+ badEntry: (n) => `Entry ${String(n)} needs quote (a string), and its address and source, if it has them, must be strings`,
57
+ emptyEntry: (n) => `Entry ${String(n)} has neither an address nor a quote, so there is nothing to check`,
58
+ noSource: (n) => `Entry ${String(n)} has no source. Without a source on the command line, every quotation needs one (the source's file)`,
59
+ twoSources: (n) => `Entry ${String(n)} names a source, and a source was also given on the command line. Give one or the other`,
60
+ },
61
+ };
62
+
63
+ const parseJson = (text: string, ui: UiLanguage): { readonly value: unknown } | { readonly error: string } => {
64
+ try {
65
+ return { value: JSON.parse(text) };
66
+ } catch (err) {
67
+ return { error: CLAIMS_TEXT[ui].notJson(err instanceof Error ? err.message : String(err)) };
68
+ }
69
+ };
70
+
71
+ /** 引用の一覧。[{ source?, address?, quote }] の配列だけを受け取る。address を省けば原文のどこか。形が違えば理由を返す。 */
72
+ export const parseCitations = (text: string, ui: UiLanguage = "ja"): ParsedCitations => {
73
+ const parsed = parseJson(text, ui);
74
+ if ("error" in parsed) return parsed;
75
+ if (!Array.isArray(parsed.value)) return { error: CLAIMS_TEXT[ui].notArray };
76
+ const entries: readonly unknown[] = parsed.value;
77
+ const bad = entries.findIndex((entry) => !isRawClaim(entry));
78
+ if (bad !== -1) return { error: CLAIMS_TEXT[ui].badEntry(bad + 1) };
79
+ const citations = entries.filter(isRawClaim).map(claimOf);
80
+ const empty = citations.findIndex(isEmpty);
81
+ if (empty !== -1) return { error: CLAIMS_TEXT[ui].emptyEntry(empty + 1) };
82
+ return { citations };
83
+ };
84
+
85
+ /**
86
+ * Where each claim's source comes from. With a source on the command line, no claim may name its own; without one,
87
+ * every claim must. undefined when the claims agree with how cite was called, otherwise the reason.
88
+ */
89
+ export const sourceProblem = (claims: readonly Claim[], sourceGiven: boolean, ui: UiLanguage): string | undefined => {
90
+ const at = claims.findIndex((claim) => (sourceOf(claim) === undefined) !== sourceGiven);
91
+ if (at === -1) return undefined;
92
+ return sourceGiven ? CLAIMS_TEXT[ui].twoSources(at + 1) : CLAIMS_TEXT[ui].noSource(at + 1);
93
+ };
94
+
95
+ /** The claims of each source, in the order the sources first appear. Every claim names its source (sourceProblem passed). */
96
+ export const bySource = (claims: readonly Claim[]): { readonly source: string; readonly claims: readonly Claim[] }[] => {
97
+ const groups = new Map<string, Claim[]>();
98
+ claims.forEach((claim) => {
99
+ const source = sourceOf(claim) ?? "";
100
+ groups.set(source, [...(groups.get(source) ?? []), claim]);
101
+ });
102
+ return [...groups].map(([source, own]) => ({ source, claims: own }));
103
+ };
@@ -0,0 +1,61 @@
1
+ import { fetchPage, type Fetcher } from "../html/fetch-page.ts";
2
+ import { pageDocument } from "../html/page-document.ts";
3
+ import { resolveGenre } from "../resolve-genre.ts";
4
+ import { treeFromSource, treeLanguage, type SourceTree, type TreeContext } from "./tree.ts";
5
+ import type { Texts } from "../ui.ts";
6
+
7
+ /** A source on the web: read once, then checked like a file. The network is reached only through fetchPage. */
8
+ export type CiteContext = TreeContext & {
9
+ /** What fetches a page. Tests pass a stand-in; the command line never does. */
10
+ readonly fetcher?: Fetcher;
11
+ };
12
+
13
+ /** Long enough for a slow page, short enough that a dead host does not hold up a run of checks. */
14
+ const PAGE_TIMEOUT_MS = 30_000;
15
+
16
+ /** Far beyond any article or statute page; a log or a dump served as text is refused instead of read whole. */
17
+ const MAX_PAGE_BYTES = 20 * 1024 * 1024;
18
+
19
+ const WEB = /^https?:\/\//iu;
20
+
21
+ export const isWebSource = (source: string): boolean => WEB.test(source);
22
+
23
+ const TEXT: Texts<{
24
+ readonly unfetched: (why: string) => string;
25
+ readonly unsupported: (url: string, type: string) => string;
26
+ readonly noStructure: (url: string, language: string) => string;
27
+ }> = {
28
+ ja: {
29
+ unfetched: (why) => `ページを取得できませんでした: ${why}`,
30
+ unsupported: (url, type) => `${url}: ${type} は文字の文書として読めません(HTML、Markdown、テキストのページを渡してください)`,
31
+ noStructure: (url, language) => `${url}: 言語 ${language} のパッケージは文書の構造を読めません(structure がありません)`,
32
+ },
33
+ en: {
34
+ unfetched: (why) => `Could not fetch the page: ${why}`,
35
+ unsupported: (url, type) => `${url}: ${type} cannot be read as a text document (give an HTML, Markdown or plain-text page)`,
36
+ noStructure: (url, language) => `${url}: the ${language} package cannot read a document's structure (it has no structure)`,
37
+ },
38
+ };
39
+
40
+ /**
41
+ * A web page as a tree, read as `chaff tree` reads a file: HTML becomes Markdown first, so its headings are addresses.
42
+ * Once fetched, the same page gives the same tree. undefined, after saying why, when it cannot be fetched or read.
43
+ */
44
+ export const readPageTree = async (url: string, argv: readonly string[], context: CiteContext): Promise<SourceTree | undefined> => {
45
+ const text = TEXT[context.ui ?? "ja"];
46
+ const fetched = await fetchPage(url, { timeout_ms: PAGE_TIMEOUT_MS, max_bytes: MAX_PAGE_BYTES }, context.fetcher).catch((err: unknown) => {
47
+ console.error(text.unfetched(err instanceof Error ? err.message : String(err)));
48
+ return undefined;
49
+ });
50
+ if (fetched === undefined) return undefined;
51
+ const page = pageDocument(fetched.contentType, fetched.text);
52
+ if ("unsupported" in page) {
53
+ console.error(text.unsupported(url, page.unsupported));
54
+ return undefined;
55
+ }
56
+ const language = treeLanguage(page.path, page.text, argv, context);
57
+ const genre = resolveGenre(page.path, page.text, context.config, context.flag(argv, "--genre")).genre;
58
+ const tree = await treeFromSource(page.path, page.text, language, genre, context.config);
59
+ if (tree === undefined) console.error(text.noStructure(url, language));
60
+ return tree === undefined ? undefined : { source: page.text, tree };
61
+ };
@@ -0,0 +1,27 @@
1
+ import { documentQuotesWithoutSource } from "../detectors/quote-without-source.ts";
2
+ import type { ProseDocument } from "../plugin.ts";
3
+ import { readDocument } from "./read-document.ts";
4
+ import type { TreeContext } from "./tree.ts";
5
+
6
+ /** One entry of the claims file the writer fills in: the source the words come from, and where in it (empty: anywhere). */
7
+ export type ScaffoldClaim = { readonly source: string; readonly address: string; readonly quote: string };
8
+
9
+ /**
10
+ * The quotations quote-without-source finds in a document, as cite's claims with the source and address left for the
11
+ * writer. The rule's genre and level do not apply: asking for a scaffold is asking for every such quotation.
12
+ */
13
+ export const scaffoldClaims = (doc: ProseDocument): ScaffoldClaim[] =>
14
+ documentQuotesWithoutSource(doc).map((found) => ({ source: "", address: "", quote: found.quote }));
15
+
16
+ /** Prints the claims file for one document. The writer fills in each source and runs `chaff cite <claims.json>`. */
17
+ export const runScaffold = async (targets: readonly string[], argv: readonly string[], context: TreeContext, usage: string): Promise<number> => {
18
+ const [path] = targets;
19
+ if (path === undefined || targets.length !== 1) {
20
+ console.error(usage);
21
+ return 1;
22
+ }
23
+ const read = await readDocument(path, argv, context, false);
24
+ if (read === undefined) return 1;
25
+ console.log(JSON.stringify(scaffoldClaims(read.doc), null, 2));
26
+ return 0;
27
+ };
@@ -1,55 +1,39 @@
1
- import { checkCitations, type Citation, type CitationResult } from "../structure/cite.ts";
1
+ import { dirname, isAbsolute, join } from "node:path";
2
+ import { checkCitations, isAnywhere, type CitationResult } from "../structure/cite.ts";
3
+ import { bySource, parseCitations, sourceOf, sourceProblem, type Claim } from "./cite-claims.ts";
4
+ import { runScaffold } from "./cite-scaffold.ts";
5
+ import { isWebSource, readPageTree, type CiteContext } from "./cite-page.ts";
2
6
  import { readSource, readTree, type TreeContext } from "./tree.ts";
3
- import type { Texts, UiLanguage } from "../ui.ts";
7
+ import type { Texts } from "../ui.ts";
4
8
 
5
9
  const FORMATS: ReadonlySet<string> = new Set(["text", "json"]);
6
10
  const QUOTE_WIDTH = 40;
7
- const VALUED: ReadonlySet<string> = new Set(["--format", "--language", "--genre"]);
11
+ const VALUED: ReadonlySet<string> = new Set(["--format", "--language", "--genre", "--url"]);
8
12
 
9
13
  export const citeTargets = (argv: readonly string[]): string[] =>
10
14
  argv.slice(1).filter((arg, index, all) => !arg.startsWith("--") && !VALUED.has(all[index - 1] ?? ""));
11
15
 
12
- const isRecord = (value: unknown): value is Record<string, unknown> => typeof value === "object" && value !== null && !Array.isArray(value);
13
-
14
- const isCitation = (value: unknown): value is Citation => isRecord(value) && typeof value["address"] === "string" && typeof value["quote"] === "string";
15
-
16
- export type ParsedCitations = { readonly citations: readonly Citation[] } | { readonly error: string };
17
-
18
- const parseJson = (text: string, ui: UiLanguage): { readonly value: unknown } | { readonly error: string } => {
19
- try {
20
- return { value: JSON.parse(text) };
21
- } catch (err) {
22
- return { error: TEXT[ui].notJson(err instanceof Error ? err.message : String(err)) };
23
- }
24
- };
25
-
26
- /** 引用の一覧。[{ address, quote }] の配列だけを受け取る。形が違えば理由を返す。 */
27
- export const parseCitations = (text: string, ui: UiLanguage = "ja"): ParsedCitations => {
28
- const parsed = parseJson(text, ui);
29
- if ("error" in parsed) return parsed;
30
- if (!Array.isArray(parsed.value)) return { error: TEXT[ui].notArray };
31
- const entries: readonly unknown[] = parsed.value;
32
- const bad = entries.findIndex((entry) => !isCitation(entry));
33
- if (bad !== -1) return { error: TEXT[ui].badEntry(bad + 1) };
34
- return { citations: entries.filter(isCitation).map((entry) => ({ address: entry.address, quote: entry.quote })) };
35
- };
36
-
37
16
  type CiteText = {
38
17
  readonly usage: string;
39
18
  readonly quoted: (text: string) => string;
40
- readonly notJson: (why: string) => string;
41
- readonly notArray: string;
42
- readonly badEntry: (n: number) => string;
19
+ readonly anywhere: string;
20
+ readonly foundAt: (parts: readonly string[]) => string;
21
+ readonly line: (line: number) => string;
43
22
  readonly results: Readonly<Record<CitationResult["status"], (result: CitationResult) => string>>;
44
23
  };
45
24
 
46
25
  const TEXT: Texts<CiteText> = {
47
26
  ja: {
48
27
  quoted: (text) => `「${text}」`,
49
- usage: "使い方: chaff cite <原文> <引用.json> [--format text|json] [--language ja|en|…]",
50
- notJson: (why) => `JSON として読めません: ${why}`,
51
- notArray: '引用は配列で渡してください: [{ "address": "3.2", "quote": "…" }]',
52
- badEntry: (n) => `${String(n)} 件目に address(文字列)と quote(文字列)がありません`,
28
+ usage: [
29
+ "使い方: chaff cite <原文> <引用.json> [--format text|json] [--language ja|en|…]",
30
+ " chaff cite --url <URL> <引用.json> (原文が Web のページのとき)",
31
+ " chaff cite <引用.json> (引用ごとに source で原文のファイルか URL を書いたとき)",
32
+ " chaff cite --scaffold <文書> (出典の無い引用から引用.json のひな形を作る)",
33
+ ].join("\n"),
34
+ anywhere: "(番地なし)",
35
+ foundAt: (parts) => `(${parts.join("、")})`,
36
+ line: (line) => `${String(line)} 行目`,
53
37
  results: {
54
38
  ok: () => "一致",
55
39
  "missing-address": (result) => `番地 ${result.citation.address} は原文にありません`,
@@ -60,10 +44,15 @@ const TEXT: Texts<CiteText> = {
60
44
  },
61
45
  en: {
62
46
  quoted: (text) => ` "${text}"`,
63
- usage: "usage: chaff cite <source> <quotes.json> [--format text|json] [--language ja|en|…]",
64
- notJson: (why) => `Not valid JSON: ${why}`,
65
- notArray: 'Give the quotations as an array: [{ "address": "3.2", "quote": "…" }]',
66
- badEntry: (n) => `Entry ${String(n)} needs address (a string) and quote (a string)`,
47
+ usage: [
48
+ "usage: chaff cite <source> <quotes.json> [--format text|json] [--language ja|en|…]",
49
+ " chaff cite --url <URL> <quotes.json> (the source is a web page)",
50
+ " chaff cite <quotes.json> (each quotation names its source, a file or a URL)",
51
+ " chaff cite --scaffold <document> (a quotes.json to fill in, from the quotations with no source)",
52
+ ].join("\n"),
53
+ anywhere: "(anywhere)",
54
+ foundAt: (parts) => ` (${parts.join(", ")})`,
55
+ line: (line) => `line ${String(line)}`,
67
56
  results: {
68
57
  ok: () => "matches",
69
58
  "missing-address": (result) => `address ${result.citation.address} is not in the source`,
@@ -74,34 +63,114 @@ const TEXT: Texts<CiteText> = {
74
63
  },
75
64
  };
76
65
 
66
+ /** Where a quote given no address was found, so the reader can write the address in. */
67
+ const whereFound = (result: CitationResult, text: CiteText): string => {
68
+ if (result.status !== "ok" || !isAnywhere(result.citation) || result.line === undefined) return "";
69
+ return text.foundAt([...(result.foundAt === undefined ? [] : [result.foundAt]), text.line(result.line)]);
70
+ };
71
+
72
+ /** A claim that names its own source says which, before its address. */
73
+ const sourcePrefix = (result: CitationResult): string => {
74
+ const source = sourceOf(result.citation);
75
+ return source === undefined ? "" : `${source} `;
76
+ };
77
+
77
78
  const describe = (result: CitationResult, text: CiteText): string => {
78
79
  const mark = result.status === "ok" ? "✓" : "✗";
79
80
  const oneLine = result.citation.quote.replace(/\s+/gu, " ").trim();
80
81
  const quote = oneLine.length > QUOTE_WIDTH ? `${oneLine.slice(0, QUOTE_WIDTH)}…` : oneLine;
81
- return `${mark} ${result.citation.address}${text.quoted(quote)}: ${text.results[result.status](result)}`;
82
+ const address = isAnywhere(result.citation) ? text.anywhere : result.citation.address;
83
+ return `${mark} ${sourcePrefix(result)}${address}${text.quoted(quote)}: ${text.results[result.status](result)}${whereFound(result, text)}`;
84
+ };
85
+
86
+ /** Each claim checked against one source, a file or a web page. undefined when it cannot be read as a tree (already said why). */
87
+ const checkAgainst = async (
88
+ location: string,
89
+ claims: readonly Claim[],
90
+ argv: readonly string[],
91
+ context: CiteContext,
92
+ ): Promise<CitationResult[] | undefined> => {
93
+ const read = isWebSource(location) ? await readPageTree(location, argv, context) : await readTree(location, argv, context);
94
+ return read === undefined ? undefined : checkCitations(read.source, read.tree, claims);
95
+ };
96
+
97
+ /** A claim's source, read from where the claims file is: a scaffold sits next to the document that quotes. A URL is a URL. */
98
+ const sourcePath = (claimsPath: string, source: string): string => {
99
+ if (isWebSource(source)) return source;
100
+ // A claims file written on Windows says sources\talk.md; it names the same file everywhere.
101
+ const portable = source.replaceAll("\\", "/");
102
+ return isAbsolute(portable) ? portable : join(dirname(claimsPath), portable);
103
+ };
104
+
105
+ /**
106
+ * Each claim checked against the source it names, in the claims file's order. Sources are read one at a time, so what
107
+ * an unreadable one prints comes in the same order every run; any unreadable source fails the run.
108
+ */
109
+ const checkEachSource = async (
110
+ claimsPath: string,
111
+ claims: readonly Claim[],
112
+ argv: readonly string[],
113
+ context: CiteContext,
114
+ ): Promise<CitationResult[] | undefined> => {
115
+ const groups = bySource(claims);
116
+ const checked = await groups.reduce<Promise<(CitationResult[] | undefined)[]>>(async (previous, group) => {
117
+ const done = await previous;
118
+ return [...done, await checkAgainst(sourcePath(claimsPath, group.source), group.claims, argv, context)];
119
+ }, Promise.resolve([]));
120
+ const byClaim = new Map<Claim, CitationResult>();
121
+ const unread = groups.some((group, index) => {
122
+ const results = checked[index];
123
+ results?.forEach((result, at) => byClaim.set(group.claims[at] ?? result.citation, result));
124
+ return results === undefined;
125
+ });
126
+ return unread ? undefined : claims.flatMap((claim) => byClaim.get(claim) ?? []);
127
+ };
128
+
129
+ const readClaims = async (claimsPath: string, sourceGiven: boolean, context: TreeContext): Promise<readonly Claim[] | undefined> => {
130
+ const text = await readSource(claimsPath, context);
131
+ if (text === undefined) return undefined;
132
+ const ui = context.ui ?? "ja";
133
+ const parsed = parseCitations(text, ui);
134
+ const problem = "error" in parsed ? parsed.error : sourceProblem(parsed.citations, sourceGiven, ui);
135
+ if (problem === undefined && "citations" in parsed) return parsed.citations;
136
+ console.error(`${claimsPath}: ${problem ?? ""}`);
137
+ return undefined;
138
+ };
139
+
140
+ const usageError = (text: CiteText): number => {
141
+ console.error(text.usage);
142
+ return 1;
143
+ };
144
+
145
+ /** The claims file, and the one source the command line gives (a file, or a page after --url), if any. */
146
+ type Run = { readonly claimsPath: string; readonly sourceGiven: string | undefined };
147
+
148
+ /** What the arguments ask to check, or undefined when they do not fit any usage. */
149
+ const runOf = (targets: readonly string[], argv: readonly string[], context: CiteContext): Run | undefined => {
150
+ const url = context.flag(argv, "--url");
151
+ if (argv.includes("--url") && (url === undefined || !isWebSource(url))) return undefined;
152
+ const claimsPath = targets.at(-1);
153
+ if (claimsPath === undefined || targets.length > (url === undefined ? 2 : 1)) return undefined;
154
+ return { claimsPath, sourceGiven: url ?? (targets.length === 2 ? targets[0] : undefined) };
82
155
  };
83
156
 
84
157
  /**
85
- * 回答の引用が原文にあるかを確かめる。書き換えはしない。
158
+ * 回答の引用が原文にあるかを確かめる。書き換えはしない。原文は引数で一つ渡すか、引用ごとに source で書く。
86
159
  * 一つでも外れていれば 1 で終わるので、AI の回答を単体試験のように検査できる。
87
160
  */
88
- export const runCite = async (targets: readonly string[], argv: readonly string[], context: TreeContext): Promise<number> => {
89
- const [sourcePath, citationsPath] = targets;
161
+ export const runCite = async (targets: readonly string[], argv: readonly string[], context: CiteContext): Promise<number> => {
162
+ const text = TEXT[context.ui ?? "ja"];
90
163
  const format = context.flag(argv, "--format") ?? "text";
91
- if (sourcePath === undefined || citationsPath === undefined || targets.length !== 2 || !FORMATS.has(format)) {
92
- console.error(TEXT[context.ui ?? "ja"].usage);
93
- return 1;
94
- }
95
- const citationsText = await readSource(citationsPath, context);
96
- if (citationsText === undefined) return 1;
97
- const parsed = parseCitations(citationsText, context.ui ?? "ja");
98
- if ("error" in parsed) {
99
- console.error(`${citationsPath}: ${parsed.error}`);
100
- return 1;
101
- }
102
- const read = await readTree(sourcePath, argv, context);
103
- if (read === undefined) return 1;
104
- const results = checkCitations(read.source, read.tree, parsed.citations);
105
- console.log(format === "json" ? JSON.stringify(results, null, 2) : results.map((result) => describe(result, TEXT[context.ui ?? "ja"])).join("\n"));
164
+ if (!FORMATS.has(format)) return usageError(text);
165
+ // The scaffold is always JSON: it is a file to fill in.
166
+ if (argv.includes("--scaffold")) return argv.includes("--url") ? usageError(text) : runScaffold(targets, argv, context, text.usage);
167
+ const run = runOf(targets, argv, context);
168
+ if (run === undefined) return usageError(text);
169
+ const { claimsPath, sourceGiven } = run;
170
+ const claims = await readClaims(claimsPath, sourceGiven !== undefined, context);
171
+ if (claims === undefined) return 1;
172
+ const results = sourceGiven === undefined ? await checkEachSource(claimsPath, claims, argv, context) : await checkAgainst(sourceGiven, claims, argv, context);
173
+ if (results === undefined) return 1;
174
+ console.log(format === "json" ? JSON.stringify(results, null, 2) : results.map((result) => describe(result, text)).join("\n"));
106
175
  return results.every((result) => result.status === "ok") ? 0 : 1;
107
176
  };