@hawkeyexl/manni 4.11.0 → 4.12.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 (238) hide show
  1. package/README.md +1 -1
  2. package/dist/{batch-UAULUMGH.js → batch-EFSFG6GC.js} +20 -19
  3. package/dist/build-NIO3UIWJ.js +36 -0
  4. package/dist/calibrate-6VO7URRV.js +41 -0
  5. package/dist/capture-NMBVJO3C.js +38 -0
  6. package/dist/check-SHOYX2B5.js +30 -0
  7. package/dist/check-XMJKH3KV.js +34 -0
  8. package/dist/{check-VELUQAUW.js → check-Y62BJNC4.js} +35 -34
  9. package/dist/{check-VELUQAUW.js.map → check-Y62BJNC4.js.map} +1 -1
  10. package/dist/{check-YEOYBFST.js → check-ZMO3ZLMW.js} +19 -18
  11. package/dist/{chunk-BKVHX6FU.js → chunk-24AJK2RG.js} +5 -10
  12. package/dist/chunk-24AJK2RG.js.map +1 -0
  13. package/dist/{chunk-M42DZCOU.js → chunk-2OZF2VUB.js} +2 -2
  14. package/dist/chunk-2UJZXVHR.js +1868 -0
  15. package/dist/chunk-2UJZXVHR.js.map +1 -0
  16. package/dist/{chunk-HQR2ZBHW.js → chunk-3BRJCQPY.js} +36 -7
  17. package/dist/chunk-3BRJCQPY.js.map +1 -0
  18. package/dist/{chunk-U7CTFN2J.js → chunk-42VFJOAF.js} +7 -7
  19. package/dist/{chunk-LBSCW232.js → chunk-4Q24OYI3.js} +7 -7
  20. package/dist/{chunk-OPXWPJDA.js → chunk-4WJTURRO.js} +14 -14
  21. package/dist/{chunk-GDVZ5VII.js → chunk-5SID2SVL.js} +4 -4
  22. package/dist/{chunk-FUCPZVRY.js → chunk-AANUY4BH.js} +2 -2
  23. package/dist/chunk-ANPIIYRH.js +2272 -0
  24. package/dist/chunk-ANPIIYRH.js.map +1 -0
  25. package/dist/{chunk-WDWXAYVH.js → chunk-AYVKN3PG.js} +4 -4
  26. package/dist/{chunk-FQXWVS6J.js → chunk-CH6IOGXV.js} +9 -9
  27. package/dist/{chunk-4CK6ZSOK.js → chunk-D5Z6B4M7.js} +3 -3
  28. package/dist/{chunk-HA6MQMOY.js → chunk-D6SELXQ2.js} +6 -6
  29. package/dist/{chunk-2DRHT73U.js → chunk-DDILEF5F.js} +890 -1399
  30. package/dist/chunk-DDILEF5F.js.map +1 -0
  31. package/dist/{chunk-PCS4VJBV.js → chunk-DGRLHDM4.js} +9 -9
  32. package/dist/{chunk-2MJ62AYQ.js → chunk-DHGB4JBG.js} +4 -3
  33. package/dist/chunk-DHGB4JBG.js.map +1 -0
  34. package/dist/{chunk-Y6DOMTQD.js → chunk-DLU5FCFT.js} +27 -27
  35. package/dist/chunk-DLU5FCFT.js.map +1 -0
  36. package/dist/chunk-DSWKBZWW.js +16 -0
  37. package/dist/chunk-DSWKBZWW.js.map +1 -0
  38. package/dist/{chunk-KGEQJ5CC.js → chunk-F564FHMQ.js} +8 -8
  39. package/dist/{chunk-J6IDQGJL.js → chunk-FKAZUZQU.js} +469 -85
  40. package/dist/chunk-FKAZUZQU.js.map +1 -0
  41. package/dist/{chunk-IGSHYP74.js → chunk-G3MBUL5M.js} +4 -4
  42. package/dist/{chunk-ADMEPUBT.js → chunk-GQ3KRY3B.js} +3 -3
  43. package/dist/{chunk-T7JAOYE5.js → chunk-HDPN46JP.js} +6 -6
  44. package/dist/{chunk-R4WXQIOZ.js → chunk-IQQAJROD.js} +3 -3
  45. package/dist/{chunk-2IR4T5PO.js → chunk-IZXN3WI6.js} +2 -2
  46. package/dist/{chunk-NCPWXHDO.js → chunk-JEUFYSFQ.js} +4 -4
  47. package/dist/{chunk-LKP7QDFN.js → chunk-JSSM7VVV.js} +4 -4
  48. package/dist/{chunk-2IAZEB45.js → chunk-KFGZPVFA.js} +229 -821
  49. package/dist/chunk-KFGZPVFA.js.map +1 -0
  50. package/dist/{chunk-EIFCP6CZ.js → chunk-KGFSPJLD.js} +2 -2
  51. package/dist/{chunk-RLT5SEML.js → chunk-KMORGMCW.js} +6 -6
  52. package/dist/{chunk-WQWKYAAK.js → chunk-NUQF5F5J.js} +2 -2
  53. package/dist/{chunk-54F74XR3.js → chunk-NZ6KSHFD.js} +19 -19
  54. package/dist/{chunk-4D5IZSXM.js → chunk-OHUDZRLK.js} +3 -3
  55. package/dist/{chunk-FBMZJEB3.js → chunk-OKMTUAWO.js} +4 -4
  56. package/dist/{chunk-QLWC7MKD.js → chunk-OTJOBZJ5.js} +135 -135
  57. package/dist/chunk-OTJOBZJ5.js.map +1 -0
  58. package/dist/{chunk-6HWBRZIN.js → chunk-PS257NIU.js} +252 -193
  59. package/dist/chunk-PS257NIU.js.map +1 -0
  60. package/dist/chunk-QDC7JPFG.js +685 -0
  61. package/dist/chunk-QDC7JPFG.js.map +1 -0
  62. package/dist/{chunk-PCQ7ELJH.js → chunk-QEAGL4V5.js} +109 -5
  63. package/dist/chunk-QEAGL4V5.js.map +1 -0
  64. package/dist/{chunk-BBT6AVUG.js → chunk-QMY57PVW.js} +2 -2
  65. package/dist/{chunk-LPIF5LIE.js → chunk-QNDDPXFR.js} +2 -2
  66. package/dist/{chunk-PWBH7DCQ.js → chunk-QSIXNTRV.js} +4 -4
  67. package/dist/{chunk-VSEBFHAY.js → chunk-RGLFV4KO.js} +11369 -10218
  68. package/dist/chunk-RGLFV4KO.js.map +1 -0
  69. package/dist/{chunk-D4N2V43Z.js → chunk-SGR7ZAVE.js} +13 -7
  70. package/dist/chunk-SGR7ZAVE.js.map +1 -0
  71. package/dist/{chunk-GV56WGL2.js → chunk-SMHAYK6I.js} +1036 -883
  72. package/dist/chunk-SMHAYK6I.js.map +1 -0
  73. package/dist/{chunk-JPQDNYXH.js → chunk-STPGIKPY.js} +8 -2
  74. package/dist/chunk-STPGIKPY.js.map +1 -0
  75. package/dist/{chunk-NSBXVPZL.js → chunk-U22TOL5Y.js} +17 -17
  76. package/dist/{chunk-NGTVREIH.js → chunk-U6IHLEWT.js} +2 -2
  77. package/dist/{chunk-ODRPL3WB.js → chunk-UUCCV3SI.js} +2 -2
  78. package/dist/{chunk-MSRU4D4P.js → chunk-UXMCHBOJ.js} +2 -2
  79. package/dist/{chunk-B7XYNRJQ.js → chunk-VFAKGIDG.js} +2 -2
  80. package/dist/{chunk-QCHVR4ZM.js → chunk-VM7VAFJW.js} +33 -7
  81. package/dist/chunk-VM7VAFJW.js.map +1 -0
  82. package/dist/{chunk-VQK4VHLF.js → chunk-YQV75FIL.js} +2 -2
  83. package/dist/chunk-YUTVAMWW.js +2 -0
  84. package/dist/{cli-4MF37HAQ.js → cli-4CR7QIOK.js} +26 -25
  85. package/dist/{cli-4MF37HAQ.js.map → cli-4CR7QIOK.js.map} +1 -1
  86. package/dist/{cli-6KZTHWGP.js → cli-6R4W3HAH.js} +37 -36
  87. package/dist/{cli-6KZTHWGP.js.map → cli-6R4W3HAH.js.map} +1 -1
  88. package/dist/{cli-I62SRH3R.js → cli-BOMA2FMP.js} +14 -13
  89. package/dist/{cli-DRMZBZLB.js → cli-EDQPQOCE.js} +43 -42
  90. package/dist/{cli-DRMZBZLB.js.map → cli-EDQPQOCE.js.map} +1 -1
  91. package/dist/{cli-VID7PJS3.js → cli-GBF76EXT.js} +23 -22
  92. package/dist/{cli-VID7PJS3.js.map → cli-GBF76EXT.js.map} +1 -1
  93. package/dist/{cli-3BTCK4AB.js → cli-MQYCF3SR.js} +27 -26
  94. package/dist/{cli-3BTCK4AB.js.map → cli-MQYCF3SR.js.map} +1 -1
  95. package/dist/{cli-ONTC5PKT.js → cli-OJKFXQOM.js} +9 -9
  96. package/dist/{cli-VUKMWSSF.js → cli-PHZAO4LZ.js} +4 -4
  97. package/dist/{cli-RORDPAPE.js → cli-PTKFFNOW.js} +59 -38
  98. package/dist/cli-PTKFFNOW.js.map +1 -0
  99. package/dist/{cli-O4ABTN4Z.js → cli-UW2K5Z5J.js} +31 -30
  100. package/dist/{cli-O4ABTN4Z.js.map → cli-UW2K5Z5J.js.map} +1 -1
  101. package/dist/{cli-JJMOVIKS.js → cli-XXTNPPKB.js} +14 -14
  102. package/dist/cli.js +19 -13
  103. package/dist/cli.js.map +1 -1
  104. package/dist/{config-XDA42RJL.js → config-JJW75SBX.js} +5 -5
  105. package/dist/docmeta.js +13 -12
  106. package/dist/docmeta.js.map +1 -1
  107. package/dist/github-6VQKSB67.js +35 -0
  108. package/dist/github-RBSEM7ZK.js +30 -0
  109. package/dist/graph/runtime.d.ts +4 -1
  110. package/dist/graph/runtime.js +20 -9
  111. package/dist/graph/runtime.js.map +1 -1
  112. package/dist/{host-6GURH5HE.js → host-YSTYO5DX.js} +3 -3
  113. package/dist/index.d.ts +192 -26
  114. package/dist/index.js +129 -124
  115. package/dist/index.js.map +1 -1
  116. package/dist/{json-BXY44ED7.js → json-PU2HLHDQ.js} +18 -17
  117. package/dist/labels-SJNSOPBI.js +73 -0
  118. package/dist/labels-SJNSOPBI.js.map +1 -0
  119. package/dist/lint-KIVTHLGU.js +34 -0
  120. package/dist/list-RDEJDDJF.js +32 -0
  121. package/dist/list-SUTDWL2J.js +35 -0
  122. package/dist/{page-EV7OUBAU.js → page-UMAA3NCM.js} +18 -16
  123. package/dist/{prepare-JHJDJB6I.js → prepare-3I3LOXXD.js} +22 -21
  124. package/dist/{prepare-JHJDJB6I.js.map → prepare-3I3LOXXD.js.map} +1 -1
  125. package/dist/{pretty-SCRK66M5.js → pretty-ANLRHU4O.js} +18 -17
  126. package/dist/{pretty-Q5Y2PA64.js → pretty-Q3ZFKOR7.js} +18 -17
  127. package/dist/{provider-527CO4DM.js → provider-LBX4IXGX.js} +3 -3
  128. package/dist/{release-3D5PK6M7.js → release-VV3UTKE5.js} +3 -3
  129. package/dist/{reporters-M6LJ2IYU.js → reporters-26H3N2KW.js} +3 -3
  130. package/dist/{reporters-RBYTASMI.js → reporters-ILT36CIH.js} +7 -7
  131. package/dist/{reporters-A5ADKDYR.js → reporters-PNDLWT6K.js} +16 -15
  132. package/dist/run-QXCK33Z4.js +37 -0
  133. package/dist/{term-CQAGNG3Q.js → term-D2N7UN4P.js} +981 -141
  134. package/dist/term-D2N7UN4P.js.map +1 -0
  135. package/dist/validate-BRUCOT2O.js +19 -0
  136. package/package.json +3 -2
  137. package/plugin/manni/.claude-plugin/plugin.json +1 -1
  138. package/shapes/graph/shapes-1.1.0.ttl +785 -0
  139. package/dist/build-QSPNK5AL.js +0 -35
  140. package/dist/calibrate-KXN4URPM.js +0 -40
  141. package/dist/capture-JHTSUPUC.js +0 -37
  142. package/dist/check-MDGXEUWL.js +0 -20
  143. package/dist/check-WOQRKNZK.js +0 -29
  144. package/dist/chunk-2DRHT73U.js.map +0 -1
  145. package/dist/chunk-2IAZEB45.js.map +0 -1
  146. package/dist/chunk-2MJ62AYQ.js.map +0 -1
  147. package/dist/chunk-4VBSTXN6.js +0 -392
  148. package/dist/chunk-4VBSTXN6.js.map +0 -1
  149. package/dist/chunk-6HWBRZIN.js.map +0 -1
  150. package/dist/chunk-BKVHX6FU.js.map +0 -1
  151. package/dist/chunk-D4N2V43Z.js.map +0 -1
  152. package/dist/chunk-EFW7CAG4.js +0 -387
  153. package/dist/chunk-EFW7CAG4.js.map +0 -1
  154. package/dist/chunk-GV56WGL2.js.map +0 -1
  155. package/dist/chunk-HQR2ZBHW.js.map +0 -1
  156. package/dist/chunk-J6IDQGJL.js.map +0 -1
  157. package/dist/chunk-JPQDNYXH.js.map +0 -1
  158. package/dist/chunk-JROBZ7JA.js +0 -818
  159. package/dist/chunk-JROBZ7JA.js.map +0 -1
  160. package/dist/chunk-PCQ7ELJH.js.map +0 -1
  161. package/dist/chunk-QCHVR4ZM.js.map +0 -1
  162. package/dist/chunk-QLWC7MKD.js.map +0 -1
  163. package/dist/chunk-TU2WUBVZ.js +0 -2
  164. package/dist/chunk-VSEBFHAY.js.map +0 -1
  165. package/dist/chunk-Y6DOMTQD.js.map +0 -1
  166. package/dist/cli-RORDPAPE.js.map +0 -1
  167. package/dist/github-RY3FRA6P.js +0 -29
  168. package/dist/github-YKQSH7FS.js +0 -34
  169. package/dist/lint-YJ2L22BW.js +0 -33
  170. package/dist/list-NSG24VVX.js +0 -31
  171. package/dist/list-V6EGCSHX.js +0 -34
  172. package/dist/run-BUE2DDXN.js +0 -36
  173. package/dist/term-CQAGNG3Q.js.map +0 -1
  174. package/dist/validate-ZBW44RHT.js +0 -18
  175. /package/dist/{batch-UAULUMGH.js.map → batch-EFSFG6GC.js.map} +0 -0
  176. /package/dist/{build-QSPNK5AL.js.map → build-NIO3UIWJ.js.map} +0 -0
  177. /package/dist/{calibrate-KXN4URPM.js.map → calibrate-6VO7URRV.js.map} +0 -0
  178. /package/dist/{capture-JHTSUPUC.js.map → capture-NMBVJO3C.js.map} +0 -0
  179. /package/dist/{check-MDGXEUWL.js.map → check-SHOYX2B5.js.map} +0 -0
  180. /package/dist/{check-WOQRKNZK.js.map → check-XMJKH3KV.js.map} +0 -0
  181. /package/dist/{check-YEOYBFST.js.map → check-ZMO3ZLMW.js.map} +0 -0
  182. /package/dist/{chunk-M42DZCOU.js.map → chunk-2OZF2VUB.js.map} +0 -0
  183. /package/dist/{chunk-U7CTFN2J.js.map → chunk-42VFJOAF.js.map} +0 -0
  184. /package/dist/{chunk-LBSCW232.js.map → chunk-4Q24OYI3.js.map} +0 -0
  185. /package/dist/{chunk-OPXWPJDA.js.map → chunk-4WJTURRO.js.map} +0 -0
  186. /package/dist/{chunk-GDVZ5VII.js.map → chunk-5SID2SVL.js.map} +0 -0
  187. /package/dist/{chunk-FUCPZVRY.js.map → chunk-AANUY4BH.js.map} +0 -0
  188. /package/dist/{chunk-WDWXAYVH.js.map → chunk-AYVKN3PG.js.map} +0 -0
  189. /package/dist/{chunk-FQXWVS6J.js.map → chunk-CH6IOGXV.js.map} +0 -0
  190. /package/dist/{chunk-4CK6ZSOK.js.map → chunk-D5Z6B4M7.js.map} +0 -0
  191. /package/dist/{chunk-HA6MQMOY.js.map → chunk-D6SELXQ2.js.map} +0 -0
  192. /package/dist/{chunk-PCS4VJBV.js.map → chunk-DGRLHDM4.js.map} +0 -0
  193. /package/dist/{chunk-KGEQJ5CC.js.map → chunk-F564FHMQ.js.map} +0 -0
  194. /package/dist/{chunk-IGSHYP74.js.map → chunk-G3MBUL5M.js.map} +0 -0
  195. /package/dist/{chunk-ADMEPUBT.js.map → chunk-GQ3KRY3B.js.map} +0 -0
  196. /package/dist/{chunk-T7JAOYE5.js.map → chunk-HDPN46JP.js.map} +0 -0
  197. /package/dist/{chunk-R4WXQIOZ.js.map → chunk-IQQAJROD.js.map} +0 -0
  198. /package/dist/{chunk-2IR4T5PO.js.map → chunk-IZXN3WI6.js.map} +0 -0
  199. /package/dist/{chunk-NCPWXHDO.js.map → chunk-JEUFYSFQ.js.map} +0 -0
  200. /package/dist/{chunk-LKP7QDFN.js.map → chunk-JSSM7VVV.js.map} +0 -0
  201. /package/dist/{chunk-EIFCP6CZ.js.map → chunk-KGFSPJLD.js.map} +0 -0
  202. /package/dist/{chunk-RLT5SEML.js.map → chunk-KMORGMCW.js.map} +0 -0
  203. /package/dist/{chunk-WQWKYAAK.js.map → chunk-NUQF5F5J.js.map} +0 -0
  204. /package/dist/{chunk-54F74XR3.js.map → chunk-NZ6KSHFD.js.map} +0 -0
  205. /package/dist/{chunk-4D5IZSXM.js.map → chunk-OHUDZRLK.js.map} +0 -0
  206. /package/dist/{chunk-FBMZJEB3.js.map → chunk-OKMTUAWO.js.map} +0 -0
  207. /package/dist/{chunk-BBT6AVUG.js.map → chunk-QMY57PVW.js.map} +0 -0
  208. /package/dist/{chunk-LPIF5LIE.js.map → chunk-QNDDPXFR.js.map} +0 -0
  209. /package/dist/{chunk-PWBH7DCQ.js.map → chunk-QSIXNTRV.js.map} +0 -0
  210. /package/dist/{chunk-NSBXVPZL.js.map → chunk-U22TOL5Y.js.map} +0 -0
  211. /package/dist/{chunk-NGTVREIH.js.map → chunk-U6IHLEWT.js.map} +0 -0
  212. /package/dist/{chunk-ODRPL3WB.js.map → chunk-UUCCV3SI.js.map} +0 -0
  213. /package/dist/{chunk-MSRU4D4P.js.map → chunk-UXMCHBOJ.js.map} +0 -0
  214. /package/dist/{chunk-B7XYNRJQ.js.map → chunk-VFAKGIDG.js.map} +0 -0
  215. /package/dist/{chunk-VQK4VHLF.js.map → chunk-YQV75FIL.js.map} +0 -0
  216. /package/dist/{chunk-TU2WUBVZ.js.map → chunk-YUTVAMWW.js.map} +0 -0
  217. /package/dist/{cli-I62SRH3R.js.map → cli-BOMA2FMP.js.map} +0 -0
  218. /package/dist/{cli-ONTC5PKT.js.map → cli-OJKFXQOM.js.map} +0 -0
  219. /package/dist/{cli-VUKMWSSF.js.map → cli-PHZAO4LZ.js.map} +0 -0
  220. /package/dist/{cli-JJMOVIKS.js.map → cli-XXTNPPKB.js.map} +0 -0
  221. /package/dist/{config-XDA42RJL.js.map → config-JJW75SBX.js.map} +0 -0
  222. /package/dist/{github-RY3FRA6P.js.map → github-6VQKSB67.js.map} +0 -0
  223. /package/dist/{github-YKQSH7FS.js.map → github-RBSEM7ZK.js.map} +0 -0
  224. /package/dist/{host-6GURH5HE.js.map → host-YSTYO5DX.js.map} +0 -0
  225. /package/dist/{json-BXY44ED7.js.map → json-PU2HLHDQ.js.map} +0 -0
  226. /package/dist/{lint-YJ2L22BW.js.map → lint-KIVTHLGU.js.map} +0 -0
  227. /package/dist/{list-NSG24VVX.js.map → list-RDEJDDJF.js.map} +0 -0
  228. /package/dist/{list-V6EGCSHX.js.map → list-SUTDWL2J.js.map} +0 -0
  229. /package/dist/{page-EV7OUBAU.js.map → page-UMAA3NCM.js.map} +0 -0
  230. /package/dist/{pretty-Q5Y2PA64.js.map → pretty-ANLRHU4O.js.map} +0 -0
  231. /package/dist/{pretty-SCRK66M5.js.map → pretty-Q3ZFKOR7.js.map} +0 -0
  232. /package/dist/{provider-527CO4DM.js.map → provider-LBX4IXGX.js.map} +0 -0
  233. /package/dist/{release-3D5PK6M7.js.map → release-VV3UTKE5.js.map} +0 -0
  234. /package/dist/{reporters-A5ADKDYR.js.map → reporters-26H3N2KW.js.map} +0 -0
  235. /package/dist/{reporters-M6LJ2IYU.js.map → reporters-ILT36CIH.js.map} +0 -0
  236. /package/dist/{reporters-RBYTASMI.js.map → reporters-PNDLWT6K.js.map} +0 -0
  237. /package/dist/{run-BUE2DDXN.js.map → run-QXCK33Z4.js.map} +0 -0
  238. /package/dist/{validate-ZBW44RHT.js.map → validate-BRUCOT2O.js.map} +0 -0
@@ -1,392 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- DEFAULT_ABSTRACT_MAX_LENGTH,
4
- DEFAULT_TERM_BASELINE_PATH,
5
- TERM_RULES,
6
- TermError,
7
- languageKey,
8
- loadTerms
9
- } from "./chunk-J6IDQGJL.js";
10
- import {
11
- TERM_RELATION_FIELDS
12
- } from "./chunk-6HWBRZIN.js";
13
- import {
14
- isErrorSeverity,
15
- resolveBaselineRequest,
16
- settleBaseline
17
- } from "./chunk-VSEBFHAY.js";
18
-
19
- // src/term/commands/check.ts
20
- import { existsSync } from "node:fs";
21
-
22
- // src/term/core/severity.ts
23
- var RULE_ID_PREFIX = "manni:term";
24
- var DEFAULT_SEVERITY = {
25
- "undefined-term": "error",
26
- "duplicate-id": "error",
27
- "label-collision": "error",
28
- "alt-label-collision": "error",
29
- "dangling-reference": "error",
30
- "broader-cycle": "error",
31
- "see-not-empty": "error",
32
- "asymmetric-hierarchy": "warning",
33
- "abstract-too-long": "notice",
34
- "unused-term": "notice"
35
- };
36
- function ruleId(rule) {
37
- return `${RULE_ID_PREFIX}/${rule}`;
38
- }
39
- function proseRuleId(check) {
40
- return `${RULE_ID_PREFIX}/prose/${check}`;
41
- }
42
- function isTermRule(value) {
43
- return TERM_RULES.includes(value);
44
- }
45
- function resolveSeverity(overrides) {
46
- return { ...DEFAULT_SEVERITY, ...overrides };
47
- }
48
- function foldValeSeverity(severity) {
49
- return severity === "suggestion" ? "notice" : severity;
50
- }
51
-
52
- // src/term/core/check.ts
53
- var REFERENCE_FIELDS = TERM_RELATION_FIELDS;
54
- function checkTermSet(set, opts = {}) {
55
- const levels = resolveSeverity(opts.severity);
56
- const maxLength = opts.abstractMaxLength ?? DEFAULT_ABSTRACT_MAX_LENGTH;
57
- const { terms } = set;
58
- const drafts = [];
59
- const fold = (value) => value.toLowerCase();
60
- const where = (t) => `${t.location.file}:${String(t.location.line)}`;
61
- const onEntry = (t, rule, message, field) => ({
62
- rule,
63
- message,
64
- file: t.location.file,
65
- line: (field === void 0 ? void 0 : t.location.fieldLines[field]) ?? t.location.line,
66
- id: t.id,
67
- ...field === void 0 ? {} : { field }
68
- });
69
- const byLabel = /* @__PURE__ */ new Map();
70
- const byId = /* @__PURE__ */ new Map();
71
- const inLanguage = /* @__PURE__ */ new Map();
72
- const labelled = /* @__PURE__ */ new Map();
73
- const claim = (map, key, index) => {
74
- if (!map.has(key)) map.set(key, index);
75
- };
76
- terms.forEach((t, index) => {
77
- claim(byLabel, fold(t.record.label), index);
78
- const group = labelled.get(fold(t.record.label));
79
- if (group === void 0) labelled.set(fold(t.record.label), [index]);
80
- else group.push(index);
81
- claim(byId, fold(t.id), index);
82
- claim(inLanguage, `${languageKey(t)} label ${fold(t.record.label)}`, index);
83
- claim(inLanguage, `${languageKey(t)} id ${fold(t.id)}`, index);
84
- });
85
- const clash = (t, a, other, b) => fold(a) === fold(b) && (languageKey(t) === languageKey(other) || a !== b);
86
- const collider = (t, index, value, before) => {
87
- for (const otherIndex of labelled.get(fold(value)) ?? []) {
88
- if (otherIndex === index || before && otherIndex > index) continue;
89
- const other = terms[otherIndex];
90
- if (other !== void 0 && clash(t, value, other, other.record.label)) return other;
91
- }
92
- return void 0;
93
- };
94
- const resolveReference = (from, value) => inLanguage.get(`${languageKey(from)} label ${fold(value)}`) ?? inLanguage.get(`${languageKey(from)} id ${fold(value)}`) ?? byLabel.get(fold(value)) ?? byId.get(fold(value));
95
- const referenced = /* @__PURE__ */ new Set();
96
- for (const reference of set.references) {
97
- const label = fold(reference.label);
98
- referenced.add(label);
99
- if (byLabel.has(label)) continue;
100
- let message = `concepts: "${reference.label}" names no entry.`;
101
- const synonym = terms.find((t) => (t.record["alt-labels"] ?? []).some((alt) => fold(alt) === label));
102
- if (synonym !== void 0) {
103
- message += ` "${synonym.record.label}" lists it as an alt-label.`;
104
- }
105
- drafts.push({
106
- rule: "undefined-term",
107
- message,
108
- file: reference.file,
109
- ...reference.line === void 0 ? {} : { line: reference.line }
110
- });
111
- }
112
- const usedIds = new Set(terms.filter((t) => referenced.has(fold(t.record.label))).map((t) => fold(t.id)));
113
- const sharing = /* @__PURE__ */ new Map();
114
- for (const t of terms) {
115
- const id = `${languageKey(t)} ${fold(t.id)}`;
116
- const group = sharing.get(id);
117
- if (group === void 0) sharing.set(id, [t]);
118
- else group.push(t);
119
- }
120
- for (const group of sharing.values()) {
121
- if (group.length < 2) continue;
122
- for (const t of group) {
123
- const others = group.filter((other) => other !== t).map(where);
124
- drafts.push(onEntry(t, "duplicate-id", `id: "${t.id}" is also used by ${others.join(", ")}`));
125
- }
126
- }
127
- terms.forEach((t, index) => {
128
- const firstTerm = collider(t, index, t.record.label, true);
129
- if (firstTerm !== void 0) {
130
- drafts.push(
131
- onEntry(
132
- t,
133
- "label-collision",
134
- `"${t.record.label}" is claimed by ${where(firstTerm)} as "${firstTerm.record.label}"`,
135
- "label"
136
- )
137
- );
138
- }
139
- for (const alt of t.record["alt-labels"] ?? []) {
140
- const owner = collider(t, index, alt, false);
141
- if (owner !== void 0) {
142
- drafts.push(
143
- onEntry(t, "alt-label-collision", `alt-labels: "${alt}" is the label of ${where(owner)}`, "alt-labels")
144
- );
145
- }
146
- }
147
- for (const field of REFERENCE_FIELDS) {
148
- for (const value of referenceValues(t, field)) {
149
- if (resolveReference(t, value) === void 0) {
150
- drafts.push(onEntry(t, "dangling-reference", `${field}: "${value}" names no entry`, field));
151
- }
152
- }
153
- }
154
- if (t.record.see !== void 0 && t.record.definition !== void 0) {
155
- drafts.push(
156
- onEntry(t, "see-not-empty", `see: "${t.record.see}" redirects this entry, so remove its definition`, "see")
157
- );
158
- }
159
- const abstract = t.record.abstract;
160
- if (abstract !== void 0 && abstract.length > maxLength) {
161
- drafts.push(
162
- onEntry(
163
- t,
164
- "abstract-too-long",
165
- `abstract: ${String(abstract.length)} characters is over the limit of ${String(maxLength)}, so shorten it`,
166
- "abstract"
167
- )
168
- );
169
- }
170
- if (!usedIds.has(fold(t.id))) {
171
- drafts.push(onEntry(t, "unused-term", "no page's concepts: names this term"));
172
- }
173
- });
174
- const edges = (field) => terms.map((t) => {
175
- const targets = /* @__PURE__ */ new Set();
176
- for (const value of referenceValues(t, field)) {
177
- const target = resolveReference(t, value);
178
- if (target !== void 0) targets.add(target);
179
- }
180
- return targets;
181
- });
182
- const broader = edges("broader");
183
- const narrower = edges("narrower");
184
- terms.forEach((t, index) => {
185
- for (const parent of broader[index] ?? []) {
186
- const parentTerm = terms[parent];
187
- if (parentTerm !== void 0 && !(narrower[parent]?.has(index) ?? false)) {
188
- drafts.push(
189
- onEntry(
190
- parentTerm,
191
- "asymmetric-hierarchy",
192
- `narrower: omits "${t.record.label}", which lists this entry as broader`,
193
- "narrower"
194
- )
195
- );
196
- }
197
- }
198
- for (const child of narrower[index] ?? []) {
199
- const childTerm = terms[child];
200
- if (childTerm !== void 0 && !(broader[child]?.has(index) ?? false)) {
201
- drafts.push(
202
- onEntry(
203
- childTerm,
204
- "asymmetric-hierarchy",
205
- `broader: omits "${t.record.label}", which lists this entry as narrower`,
206
- "broader"
207
- )
208
- );
209
- }
210
- }
211
- });
212
- for (const [start, path] of broaderCycles(broader)) {
213
- const startTerm = terms[start];
214
- if (startTerm === void 0) continue;
215
- const labels = [...path, start].map((index) => terms[index]?.record.label ?? "");
216
- drafts.push(onEntry(startTerm, "broader-cycle", `broader: ${labels.join(" > ")}`, "broader"));
217
- }
218
- const findings = [];
219
- for (const draft of drafts) {
220
- const level = levels[draft.rule];
221
- if (level === "off") continue;
222
- findings.push({
223
- rule: draft.rule,
224
- ruleId: ruleId(draft.rule),
225
- severity: level,
226
- message: draft.message,
227
- file: draft.file,
228
- ...draft.line === void 0 ? {} : { line: draft.line },
229
- ...draft.id === void 0 ? {} : { id: draft.id },
230
- ...draft.field === void 0 ? {} : { field: draft.field }
231
- });
232
- }
233
- return findings.sort(compareFindings);
234
- }
235
- function referenceValues(t, field) {
236
- const value = t.record[field];
237
- if (value === void 0) return [];
238
- return typeof value === "string" ? [value] : value;
239
- }
240
- function broaderCycles(broader) {
241
- const cycles = [];
242
- for (let start = 0; start < broader.length; start++) {
243
- const path = [start];
244
- const onPath = /* @__PURE__ */ new Set([start]);
245
- const walk = (node) => {
246
- for (const next of broader[node] ?? []) {
247
- if (next === start) {
248
- cycles.push([start, [...path]]);
249
- } else if (next > start && !onPath.has(next)) {
250
- path.push(next);
251
- onPath.add(next);
252
- walk(next);
253
- path.pop();
254
- onPath.delete(next);
255
- }
256
- }
257
- };
258
- walk(start);
259
- }
260
- return cycles;
261
- }
262
- function compareText(a, b) {
263
- return a < b ? -1 : a > b ? 1 : 0;
264
- }
265
- function compareFindings(a, b) {
266
- return compareText(a.file, b.file) || (a.line ?? 0) - (b.line ?? 0) || compareText(a.ruleId, b.ruleId) || compareText(a.message, b.message);
267
- }
268
-
269
- // src/term/commands/findings.ts
270
- var FINDING_FORMATS = ["pretty", "json", "github", "sarif", "junit"];
271
- var JUNIT_CLASSNAME = "manni.term";
272
- var LINE_REFERENCE = /:\d+\b/g;
273
- function toFieldError(finding) {
274
- const keyword = finding.ruleId.startsWith(`${RULE_ID_PREFIX}/`) ? finding.ruleId.slice(RULE_ID_PREFIX.length + 1) : finding.ruleId;
275
- const { field } = finding;
276
- const subject = [finding.id ?? "", field ?? "", finding.message.replace(LINE_REFERENCE, "")].join("\0");
277
- const error = {
278
- schema: RULE_ID_PREFIX,
279
- instancePath: field === void 0 ? "" : `/${field}`,
280
- message: finding.message,
281
- keyword,
282
- subject,
283
- severity: finding.severity
284
- };
285
- if (finding.line !== void 0) error.line = finding.line;
286
- return error;
287
- }
288
- function toResults(set, findings) {
289
- const origin = /* @__PURE__ */ new Map();
290
- const byFile = /* @__PURE__ */ new Map();
291
- for (const term of set.terms) {
292
- if (!byFile.has(term.location.file)) byFile.set(term.location.file, []);
293
- }
294
- for (const finding of findings) {
295
- const error = toFieldError(finding);
296
- origin.set(error, finding);
297
- const list = byFile.get(finding.file) ?? [];
298
- list.push(error);
299
- byFile.set(finding.file, list);
300
- }
301
- const results = [...byFile.keys()].sort().map((file) => {
302
- const errors = byFile.get(file) ?? [];
303
- return { file, format: "term", ok: !errors.some(isErrorSeverity), schemas: [RULE_ID_PREFIX], errors };
304
- });
305
- return { results, origin };
306
- }
307
- function summarize(results, baseline) {
308
- const failed = results.filter((r) => !r.ok).length;
309
- const count = (keep) => results.reduce((n, r) => n + r.errors.filter(keep).length, 0);
310
- const warnings = count((e) => e.severity === "warning");
311
- const notices = count((e) => e.severity === "notice");
312
- return {
313
- files: results.length,
314
- passed: results.length - failed,
315
- failed,
316
- errors: count(isErrorSeverity),
317
- ...warnings > 0 ? { warnings } : {},
318
- ...notices > 0 ? { notices } : {},
319
- ...baseline ? { baseline } : {}
320
- };
321
- }
322
- function reportedFindings(results, origin) {
323
- const kept = [];
324
- for (const result of results) {
325
- for (const error of result.errors) {
326
- const finding = origin.get(error);
327
- if (finding !== void 0) kept.push(finding);
328
- }
329
- }
330
- return kept.sort(compareFindings2);
331
- }
332
- function compareFindings2(a, b) {
333
- if (a.file !== b.file) return a.file < b.file ? -1 : 1;
334
- const lineA = a.line ?? 0;
335
- const lineB = b.line ?? 0;
336
- if (lineA !== lineB) return lineA - lineB;
337
- if (a.ruleId !== b.ruleId) return a.ruleId < b.ruleId ? -1 : 1;
338
- return a.message < b.message ? -1 : a.message > b.message ? 1 : 0;
339
- }
340
-
341
- // src/term/commands/check.ts
342
- async function runCheck(opts) {
343
- const { cwd, run, set } = await loadTerms(opts);
344
- const config = run.config;
345
- const findings = checkTermSet(set, {
346
- ...config?.severity === void 0 ? {} : { severity: config.severity },
347
- ...config?.abstractMaxLength === void 0 ? {} : { abstractMaxLength: config.abstractMaxLength }
348
- });
349
- const { results, origin } = toResults(set, findings);
350
- const frame = { cwd, base: run.configDir ?? cwd, runBase: run.base };
351
- let request = resolveBaselineRequest(
352
- opts.baseline === true ? { baseline: true } : {},
353
- config?.baseline,
354
- run.configDir,
355
- cwd,
356
- { current: DEFAULT_TERM_BASELINE_PATH }
357
- );
358
- if (request !== null && !existsSync(request.absPath)) {
359
- if (opts.baseline !== true) {
360
- throw new TermError(
361
- `Baseline "${request.label}" not found. Record one with \`manni term check --baseline\`.`
362
- );
363
- }
364
- request = { ...request, write: true };
365
- }
366
- const { results: reported, baseline } = await settleBaseline(results, request, frame);
367
- return {
368
- findings: reportedFindings(reported, origin),
369
- results: reported,
370
- summary: summarize(reported, baseline),
371
- frame,
372
- terms: set.terms.length,
373
- references: set.references.length,
374
- ...baseline === void 0 ? {} : { baseline },
375
- found: findings.length,
376
- cwd
377
- };
378
- }
379
-
380
- export {
381
- RULE_ID_PREFIX,
382
- proseRuleId,
383
- isTermRule,
384
- foldValeSeverity,
385
- FINDING_FORMATS,
386
- JUNIT_CLASSNAME,
387
- toResults,
388
- summarize,
389
- reportedFindings,
390
- runCheck
391
- };
392
- //# sourceMappingURL=chunk-4VBSTXN6.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/term/commands/check.ts","../src/term/core/severity.ts","../src/term/core/check.ts","../src/term/commands/findings.ts"],"sourcesContent":["/**\n * `manni term check`: the referential integrity of the set (proposal 0052 § 7),\n * with the baseline ratchet meta and cite use.\n *\n * `--baseline` is one flag for both halves of the ratchet. When the baseline\n * file is not there yet, the run records one and exits 0: that is how a docset\n * whose terms were never checked ramps in. When it is there, the run fails only\n * on findings it does not hold. A configured `term.baseline` compares without\n * the flag, as `cite.baseline` does.\n */\nimport { existsSync } from \"node:fs\";\nimport { resolveBaselineRequest, settleBaseline } from \"../../meta/internal.js\";\nimport { checkTermSet } from \"../core/check.js\";\nimport { DEFAULT_TERM_BASELINE_PATH } from \"../core/config.js\";\nimport { TermError } from \"../errors.js\";\nimport { reportedFindings, summarize, toResults, type TermReport } from \"./findings.js\";\nimport { loadTerms, type TermCommandOptions } from \"./run.js\";\n\nexport interface CheckOptions extends TermCommandOptions {\n /** `--baseline`. */\n baseline?: boolean;\n}\n\nexport async function runCheck(opts: CheckOptions): Promise<TermReport> {\n const { cwd, run, set } = await loadTerms(opts);\n const config = run.config;\n const findings = checkTermSet(set, {\n ...(config?.severity === undefined ? {} : { severity: config.severity }),\n ...(config?.abstractMaxLength === undefined ? {} : { abstractMaxLength: config.abstractMaxLength }),\n });\n const { results, origin } = toResults(set, findings);\n\n // Fingerprints must not depend on where the command was run from.\n const frame = { cwd, base: run.configDir ?? cwd, runBase: run.base };\n let request = resolveBaselineRequest(\n opts.baseline === true ? { baseline: true } : {},\n config?.baseline,\n run.configDir,\n cwd,\n { current: DEFAULT_TERM_BASELINE_PATH },\n );\n if (request !== null && !existsSync(request.absPath)) {\n if (opts.baseline !== true) {\n throw new TermError(\n `Baseline \"${request.label}\" not found. Record one with \\`manni term check --baseline\\`.`,\n );\n }\n request = { ...request, write: true };\n }\n const { results: reported, baseline } = await settleBaseline(results, request, frame);\n\n return {\n findings: reportedFindings(reported, origin),\n results: reported,\n summary: summarize(reported, baseline),\n frame,\n terms: set.terms.length,\n references: set.references.length,\n ...(baseline === undefined ? {} : { baseline }),\n found: findings.length,\n cwd,\n };\n}\n","/**\n * Rule ids and levels for the term tool (proposal 0052). `check` findings are\n * `manni:term/<rule>`. A `lint` finding keeps Vale's own rule name,\n * `manni:term/prose/<Style.Rule>`, in the shape lint's proposal 0050 set for\n * its prose job, because that is the name Vale's documentation uses.\n */\nimport type { Severity } from \"../../shared/severity.js\";\nimport { TERM_RULES, type TermRule, type TermSeverity, type ValeSeverity } from \"../types.js\";\n\nexport const RULE_ID_PREFIX = \"manni:term\";\n\nexport const DEFAULT_SEVERITY: Readonly<Record<TermRule, TermSeverity>> = {\n \"undefined-term\": \"error\",\n \"duplicate-id\": \"error\",\n \"label-collision\": \"error\",\n \"alt-label-collision\": \"error\",\n \"dangling-reference\": \"error\",\n \"broader-cycle\": \"error\",\n \"see-not-empty\": \"error\",\n \"asymmetric-hierarchy\": \"warning\",\n \"abstract-too-long\": \"notice\",\n \"unused-term\": \"notice\",\n};\n\nexport function ruleId(rule: TermRule): string {\n return `${RULE_ID_PREFIX}/${rule}`;\n}\n\nexport function proseRuleId(check: string): string {\n return `${RULE_ID_PREFIX}/prose/${check}`;\n}\n\nexport function isTermRule(value: string): value is TermRule {\n return (TERM_RULES as readonly string[]).includes(value);\n}\n\n/** The defaults with config's overrides laid over them. */\nexport function resolveSeverity(\n overrides?: Partial<Record<TermRule, TermSeverity>>,\n): Record<TermRule, TermSeverity> {\n return { ...DEFAULT_SEVERITY, ...overrides };\n}\n\n/**\n * Vale's scale onto the family's. A finding keeps Vale's own value beside the\n * folded one, as an a11y violation keeps axe's `impact`.\n */\nexport function foldValeSeverity(severity: ValeSeverity): Severity {\n return severity === \"suggestion\" ? \"notice\" : severity;\n}\n","/**\n * `term check`'s rules (proposal 0052 § 7): the referential integrity of a term\n * set. Pure: it reads records and references and returns findings, so the\n * command core owns every file and the rules are tested on sets built inline.\n *\n * Every label comparison ignores case, because the Vale style `write -f vale`\n * renders is a `swap` map keyed on the lowercased term. Two labels that differ\n * only in case collide there silently, so they collide here out loud. Ids\n * compare ignoring case too, because references resolve them that way.\n *\n * A set may hold one term per language, joined on `id` (proposal 0084). A term\n * with no language counts as `en`, and languages compare ignoring case. Across\n * languages, two labels collide only when they differ in spelling but not in\n * case: `API` in en and de is one word, `Kubernetes`/`kubernetes` is a clash.\n */\nimport { TERM_RELATION_FIELDS } from \"../../shared/reference-fields.js\";\nimport { DEFAULT_ABSTRACT_MAX_LENGTH } from \"./config.js\";\nimport { languageKey as language } from \"./writers/render-util.js\";\nimport { resolveSeverity, ruleId } from \"./severity.js\";\nimport type { Term, TermField, TermFinding, TermRule, TermSet, TermSeverity } from \"../types.js\";\n\nexport interface CheckTermSetOptions {\n severity?: Partial<Record<TermRule, TermSeverity>>;\n /** Default `DEFAULT_ABSTRACT_MAX_LENGTH`. */\n abstractMaxLength?: number;\n}\n\n/** The fields whose values name other entries. */\nconst REFERENCE_FIELDS = TERM_RELATION_FIELDS;\ntype ReferenceField = (typeof REFERENCE_FIELDS)[number];\n\ninterface Draft {\n rule: TermRule;\n message: string;\n file: string;\n line?: number;\n id?: string;\n field?: TermField;\n}\n\nexport function checkTermSet(set: TermSet, opts: CheckTermSetOptions = {}): TermFinding[] {\n const levels = resolveSeverity(opts.severity);\n const maxLength = opts.abstractMaxLength ?? DEFAULT_ABSTRACT_MAX_LENGTH;\n const { terms } = set;\n const drafts: Draft[] = [];\n\n const fold = (value: string): string => value.toLowerCase();\n const where = (t: Term): string => `${t.location.file}:${String(t.location.line)}`;\n const onEntry = (t: Term, rule: TermRule, message: string, field?: TermField): Draft => ({\n rule,\n message,\n file: t.location.file,\n line: (field === undefined ? undefined : t.location.fieldLines[field]) ?? t.location.line,\n id: t.id,\n ...(field === undefined ? {} : { field }),\n });\n\n // The first entry claiming each folded label, and each folded id, overall\n // and per language.\n const byLabel = new Map<string, number>();\n const byId = new Map<string, number>();\n const inLanguage = new Map<string, number>();\n // Every entry per folded label, in set order, for the collision rules.\n const labelled = new Map<string, number[]>();\n const claim = (map: Map<string, number>, key: string, index: number): void => {\n if (!map.has(key)) map.set(key, index);\n };\n terms.forEach((t, index) => {\n claim(byLabel, fold(t.record.label), index);\n const group = labelled.get(fold(t.record.label));\n if (group === undefined) labelled.set(fold(t.record.label), [index]);\n else group.push(index);\n claim(byId, fold(t.id), index);\n claim(inLanguage, `${language(t)} label ${fold(t.record.label)}`, index);\n claim(inLanguage, `${language(t)} id ${fold(t.id)}`, index);\n });\n /** Whether `t`'s label `a` collides with `other`'s label `b`: within a language when they fold alike, across languages only when their spelling differs too. */\n const clash = (t: Term, a: string, other: Term, b: string): boolean =>\n fold(a) === fold(b) && (language(t) === language(other) || a !== b);\n /** The first entry other than `index` whose label collides with `value` on `t`, among those `before` allows. */\n const collider = (t: Term, index: number, value: string, before: boolean): Term | undefined => {\n for (const otherIndex of labelled.get(fold(value)) ?? []) {\n if (otherIndex === index || (before && otherIndex > index)) continue;\n const other = terms[otherIndex];\n if (other !== undefined && clash(t, value, other, other.record.label)) return other;\n }\n return undefined;\n };\n\n // A same-language label, then a same-language id, then any language.\n const resolveReference = (from: Term, value: string): number | undefined =>\n inLanguage.get(`${language(from)} label ${fold(value)}`) ??\n inLanguage.get(`${language(from)} id ${fold(value)}`) ??\n byLabel.get(fold(value)) ??\n byId.get(fold(value));\n\n // undefined-term, and the folded labels some page names, for unused-term.\n const referenced = new Set<string>();\n for (const reference of set.references) {\n const label = fold(reference.label);\n referenced.add(label);\n if (byLabel.has(label)) continue;\n let message = `concepts: \"${reference.label}\" names no entry.`;\n const synonym = terms.find((t) => (t.record[\"alt-labels\"] ?? []).some((alt) => fold(alt) === label));\n if (synonym !== undefined) {\n message += ` \"${synonym.record.label}\" lists it as an alt-label.`;\n }\n drafts.push({\n rule: \"undefined-term\",\n message,\n file: reference.file,\n ...(reference.line === undefined ? {} : { line: reference.line }),\n });\n }\n\n // unused-term: a term is used when a page names any term sharing its id.\n const usedIds = new Set(terms.filter((t) => referenced.has(fold(t.record.label))).map((t) => fold(t.id)));\n\n // duplicate-id: ignoring case, as references resolve ids, on every entry\n // sharing the id in one language.\n const sharing = new Map<string, Term[]>();\n for (const t of terms) {\n const id = `${language(t)} ${fold(t.id)}`;\n const group = sharing.get(id);\n if (group === undefined) sharing.set(id, [t]);\n else group.push(t);\n }\n for (const group of sharing.values()) {\n if (group.length < 2) continue;\n for (const t of group) {\n const others = group.filter((other) => other !== t).map(where);\n drafts.push(onEntry(t, \"duplicate-id\", `id: \"${t.id}\" is also used by ${others.join(\", \")}`));\n }\n }\n\n terms.forEach((t, index) => {\n // label-collision: on each later entry, naming the first.\n const firstTerm = collider(t, index, t.record.label, true);\n if (firstTerm !== undefined) {\n drafts.push(\n onEntry(\n t,\n \"label-collision\",\n `\"${t.record.label}\" is claimed by ${where(firstTerm)} as \"${firstTerm.record.label}\"`,\n \"label\",\n ),\n );\n }\n\n // alt-label-collision: an alt-label that is another entry's label.\n for (const alt of t.record[\"alt-labels\"] ?? []) {\n const owner = collider(t, index, alt, false);\n if (owner !== undefined) {\n drafts.push(\n onEntry(t, \"alt-label-collision\", `alt-labels: \"${alt}\" is the label of ${where(owner)}`, \"alt-labels\"),\n );\n }\n }\n\n // dangling-reference: one finding per value that resolves to nothing.\n for (const field of REFERENCE_FIELDS) {\n for (const value of referenceValues(t, field)) {\n if (resolveReference(t, value) === undefined) {\n drafts.push(onEntry(t, \"dangling-reference\", `${field}: \"${value}\" names no entry`, field));\n }\n }\n }\n\n // see-not-empty: a redirect carries no definition.\n if (t.record.see !== undefined && t.record.definition !== undefined) {\n drafts.push(\n onEntry(t, \"see-not-empty\", `see: \"${t.record.see}\" redirects this entry, so remove its definition`, \"see\"),\n );\n }\n\n // abstract-too-long.\n const abstract = t.record.abstract;\n if (abstract !== undefined && abstract.length > maxLength) {\n drafts.push(\n onEntry(\n t,\n \"abstract-too-long\",\n `abstract: ${String(abstract.length)} characters is over the limit of ${String(maxLength)}, so shorten it`,\n \"abstract\",\n ),\n );\n }\n\n // unused-term: no reference names the label of any term sharing the id.\n if (!usedIds.has(fold(t.id))) {\n drafts.push(onEntry(t, \"unused-term\", \"no page's concepts: names this term\"));\n }\n });\n\n // The resolved hierarchy, one edge per pair.\n const edges = (field: \"broader\" | \"narrower\"): Set<number>[] =>\n terms.map((t) => {\n const targets = new Set<number>();\n for (const value of referenceValues(t, field)) {\n const target = resolveReference(t, value);\n if (target !== undefined) targets.add(target);\n }\n return targets;\n });\n const broader = edges(\"broader\");\n const narrower = edges(\"narrower\");\n\n // asymmetric-hierarchy: each missing half, on the entry that should carry it.\n terms.forEach((t, index) => {\n for (const parent of broader[index] ?? []) {\n const parentTerm = terms[parent];\n if (parentTerm !== undefined && !(narrower[parent]?.has(index) ?? false)) {\n drafts.push(\n onEntry(\n parentTerm,\n \"asymmetric-hierarchy\",\n `narrower: omits \"${t.record.label}\", which lists this entry as broader`,\n \"narrower\",\n ),\n );\n }\n }\n for (const child of narrower[index] ?? []) {\n const childTerm = terms[child];\n if (childTerm !== undefined && !(broader[child]?.has(index) ?? false)) {\n drafts.push(\n onEntry(\n childTerm,\n \"asymmetric-hierarchy\",\n `broader: omits \"${t.record.label}\", which lists this entry as narrower`,\n \"broader\",\n ),\n );\n }\n }\n });\n\n // broader-cycle: every elementary cycle once, found from its earliest entry.\n for (const [start, path] of broaderCycles(broader)) {\n const startTerm = terms[start];\n if (startTerm === undefined) continue;\n const labels = [...path, start].map((index) => terms[index]?.record.label ?? \"\");\n drafts.push(onEntry(startTerm, \"broader-cycle\", `broader: ${labels.join(\" > \")}`, \"broader\"));\n }\n\n const findings: TermFinding[] = [];\n for (const draft of drafts) {\n const level = levels[draft.rule];\n if (level === \"off\") continue;\n findings.push({\n rule: draft.rule,\n ruleId: ruleId(draft.rule),\n severity: level,\n message: draft.message,\n file: draft.file,\n ...(draft.line === undefined ? {} : { line: draft.line }),\n ...(draft.id === undefined ? {} : { id: draft.id }),\n ...(draft.field === undefined ? {} : { field: draft.field }),\n });\n }\n return findings.sort(compareFindings);\n}\n\nfunction referenceValues(t: Term, field: ReferenceField): string[] {\n const value = t.record[field];\n if (value === undefined) return [];\n return typeof value === \"string\" ? [value] : value;\n}\n\n/**\n * Each elementary cycle of the `broader` graph, as its start and the path from\n * it. A search from `start` only visits later entries, so a cycle is found\n * exactly once, from the entry of it that comes first in set order.\n */\nfunction broaderCycles(broader: readonly Set<number>[]): [number, number[]][] {\n const cycles: [number, number[]][] = [];\n for (let start = 0; start < broader.length; start++) {\n const path: number[] = [start];\n const onPath = new Set<number>([start]);\n const walk = (node: number): void => {\n for (const next of broader[node] ?? []) {\n if (next === start) {\n cycles.push([start, [...path]]);\n } else if (next > start && !onPath.has(next)) {\n path.push(next);\n onPath.add(next);\n walk(next);\n path.pop();\n onPath.delete(next);\n }\n }\n };\n walk(start);\n }\n return cycles;\n}\n\nfunction compareText(a: string, b: string): number {\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\nfunction compareFindings(a: TermFinding, b: TermFinding): number {\n return (\n compareText(a.file, b.file) ||\n (a.line ?? 0) - (b.line ?? 0) ||\n compareText(a.ruleId, b.ruleId) ||\n compareText(a.message, b.message)\n );\n}\n","/**\n * The report `check` and `lint` share, and the bridge from term findings to\n * meta's `ValidationResult`, so the SARIF and JUnit renderers and the baseline\n * ratchet work unchanged, as cite's adapter does for citations.\n *\n * FieldError: schema `manni:term` (a builtin-shaped ref, so fingerprints and\n * rule ids never depend on where the command ran), keyword = the rule id after\n * `manni:term/`, instancePath `/<field>` when the finding concerns one field\n * and `\"\"` when it concerns none (`undefined-term`, `duplicate-id`,\n * `unused-term`). A check finding and a lint finding carry the field the same\n * way. The subject is the entry, the field, and what the finding says, with any\n * `file:line` taken out: a line moves when a page is edited above the entry,\n * and a moved finding is not a new one.\n */\nimport {\n isErrorSeverity,\n type BaselineSummary,\n type FieldError,\n type FingerprintContext,\n type RunSummary,\n type ValidationResult,\n} from \"../../meta/index.js\";\nimport { RULE_ID_PREFIX } from \"../core/severity.js\";\nimport type { TermFinding, TermSet } from \"../types.js\";\n\nexport const FINDING_FORMATS = [\"pretty\", \"json\", \"github\", \"sarif\", \"junit\"] as const;\nexport type FindingFormat = (typeof FINDING_FORMATS)[number];\n\n/** JUnit `classname` for the term tool's findings. */\nexport const JUNIT_CLASSNAME = \"manni.term\";\n\n/** What `check` and `lint` return. */\nexport interface TermReport {\n /** The findings reported: a baselined one is not among them. */\n findings: TermFinding[];\n /** The same findings as meta's results, for SARIF and JUnit. One per file. */\n results: ValidationResult[];\n summary: RunSummary;\n frame: FingerprintContext;\n /** Entries in the set. */\n terms: number;\n /** `concepts:` values the run read. */\n references: number;\n /** How a baseline shaped the run, when one did. */\n baseline?: BaselineSummary;\n /** Findings before the baseline, for the line a recording run prints. */\n found: number;\n /** Where the run stood, for the paths the reporters print. */\n cwd: string;\n}\n\nconst LINE_REFERENCE = /:\\d+\\b/g;\n\nfunction toFieldError(finding: TermFinding): FieldError {\n const keyword = finding.ruleId.startsWith(`${RULE_ID_PREFIX}/`)\n ? finding.ruleId.slice(RULE_ID_PREFIX.length + 1)\n : finding.ruleId;\n const { field } = finding;\n const subject = [finding.id ?? \"\", field ?? \"\", finding.message.replace(LINE_REFERENCE, \"\")].join(\"\\u0000\");\n const error: FieldError = {\n schema: RULE_ID_PREFIX,\n instancePath: field === undefined ? \"\" : `/${field}`,\n message: finding.message,\n keyword,\n subject,\n severity: finding.severity,\n };\n if (finding.line !== undefined) error.line = finding.line;\n return error;\n}\n\n/**\n * One result per file: every file a term was read from, clean or not, and\n * every file a finding sits in. `origin` maps each error back to its finding.\n */\nexport function toResults(\n set: TermSet,\n findings: readonly TermFinding[],\n): { results: ValidationResult[]; origin: Map<FieldError, TermFinding> } {\n const origin = new Map<FieldError, TermFinding>();\n const byFile = new Map<string, FieldError[]>();\n for (const term of set.terms) {\n if (!byFile.has(term.location.file)) byFile.set(term.location.file, []);\n }\n for (const finding of findings) {\n const error = toFieldError(finding);\n origin.set(error, finding);\n const list = byFile.get(finding.file) ?? [];\n list.push(error);\n byFile.set(finding.file, list);\n }\n const results = [...byFile.keys()].sort().map((file): ValidationResult => {\n const errors = byFile.get(file) ?? [];\n return { file, format: \"term\", ok: !errors.some(isErrorSeverity), schemas: [RULE_ID_PREFIX], errors };\n });\n return { results, origin };\n}\n\n/** The run summary meta's renderers read, from results a baseline may have thinned. */\nexport function summarize(results: readonly ValidationResult[], baseline?: BaselineSummary): RunSummary {\n const failed = results.filter((r) => !r.ok).length;\n const count = (keep: (e: FieldError) => boolean): number =>\n results.reduce((n, r) => n + r.errors.filter(keep).length, 0);\n const warnings = count((e) => e.severity === \"warning\");\n const notices = count((e) => e.severity === \"notice\");\n return {\n files: results.length,\n passed: results.length - failed,\n failed,\n errors: count(isErrorSeverity),\n ...(warnings > 0 ? { warnings } : {}),\n ...(notices > 0 ? { notices } : {}),\n ...(baseline ? { baseline } : {}),\n };\n}\n\n/** The findings still reported once a baseline has thinned the results. */\nexport function reportedFindings(\n results: readonly ValidationResult[],\n origin: ReadonlyMap<FieldError, TermFinding>,\n): TermFinding[] {\n const kept: TermFinding[] = [];\n for (const result of results) {\n for (const error of result.errors) {\n const finding = origin.get(error);\n if (finding !== undefined) kept.push(finding);\n }\n }\n return kept.sort(compareFindings);\n}\n\nfunction compareFindings(a: TermFinding, b: TermFinding): number {\n if (a.file !== b.file) return a.file < b.file ? -1 : 1;\n const lineA = a.line ?? 0;\n const lineB = b.line ?? 0;\n if (lineA !== lineB) return lineA - lineB;\n if (a.ruleId !== b.ruleId) return a.ruleId < b.ruleId ? -1 : 1;\n return a.message < b.message ? -1 : a.message > b.message ? 1 : 0;\n}\n"],"mappings":"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","names":["compareFindings"]}