@hawkeyexl/manni 4.10.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 (243) hide show
  1. package/README.md +1 -1
  2. package/dist/batch-EFSFG6GC.js +46 -0
  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-NLL4NRYA.js → check-Y62BJNC4.js} +35 -31
  9. package/dist/{check-NLL4NRYA.js.map → check-Y62BJNC4.js.map} +1 -1
  10. package/dist/{check-7B77ZD2N.js → check-ZMO3ZLMW.js} +19 -15
  11. package/dist/{chunk-PK7EKJ5T.js → chunk-24AJK2RG.js} +5 -10
  12. package/dist/chunk-24AJK2RG.js.map +1 -0
  13. package/dist/chunk-2OZF2VUB.js +164 -0
  14. package/dist/chunk-2OZF2VUB.js.map +1 -0
  15. package/dist/chunk-2UJZXVHR.js +1868 -0
  16. package/dist/chunk-2UJZXVHR.js.map +1 -0
  17. package/dist/{chunk-DNZUBCGZ.js → chunk-3BRJCQPY.js} +36 -7
  18. package/dist/chunk-3BRJCQPY.js.map +1 -0
  19. package/dist/{chunk-D2UW3ZCK.js → chunk-42VFJOAF.js} +13 -11
  20. package/dist/{chunk-D2UW3ZCK.js.map → chunk-42VFJOAF.js.map} +1 -1
  21. package/dist/{chunk-LQZQ5KGG.js → chunk-4Q24OYI3.js} +7 -7
  22. package/dist/{chunk-XU73V5XT.js → chunk-4WJTURRO.js} +15 -15
  23. package/dist/{chunk-WN47MNSK.js → chunk-5SID2SVL.js} +4 -4
  24. package/dist/{chunk-5REEVKGH.js → chunk-AANUY4BH.js} +2 -2
  25. package/dist/chunk-ANPIIYRH.js +2272 -0
  26. package/dist/chunk-ANPIIYRH.js.map +1 -0
  27. package/dist/{chunk-RZVCWX5R.js → chunk-AYVKN3PG.js} +4 -4
  28. package/dist/{chunk-2UCC26MO.js → chunk-CH6IOGXV.js} +9 -9
  29. package/dist/{chunk-RODZ7MB7.js → chunk-D5Z6B4M7.js} +6 -6
  30. package/dist/{chunk-IJ62BB2T.js → chunk-D6SELXQ2.js} +7 -7
  31. package/dist/{chunk-2JV7C4YV.js → chunk-DDILEF5F.js} +890 -1399
  32. package/dist/chunk-DDILEF5F.js.map +1 -0
  33. package/dist/{chunk-3E2X2RBU.js → chunk-DGRLHDM4.js} +9 -9
  34. package/dist/{chunk-2BV4FBC7.js → chunk-DHGB4JBG.js} +4 -3
  35. package/dist/chunk-DHGB4JBG.js.map +1 -0
  36. package/dist/{chunk-6LR73NMO.js → chunk-DLU5FCFT.js} +30 -28
  37. package/dist/chunk-DLU5FCFT.js.map +1 -0
  38. package/dist/chunk-DSWKBZWW.js +16 -0
  39. package/dist/chunk-DSWKBZWW.js.map +1 -0
  40. package/dist/{chunk-BD7IXBWE.js → chunk-F564FHMQ.js} +8 -8
  41. package/dist/{chunk-ABHG6I3G.js → chunk-FKAZUZQU.js} +469 -85
  42. package/dist/chunk-FKAZUZQU.js.map +1 -0
  43. package/dist/{chunk-DFCQ6BMI.js → chunk-G3MBUL5M.js} +4 -4
  44. package/dist/{chunk-SUTMSDQ2.js → chunk-GQ3KRY3B.js} +3 -3
  45. package/dist/chunk-HDPN46JP.js +393 -0
  46. package/dist/chunk-HDPN46JP.js.map +1 -0
  47. package/dist/{chunk-EAUIQADY.js → chunk-IQQAJROD.js} +6 -6
  48. package/dist/{chunk-ZHRPH52H.js → chunk-IZXN3WI6.js} +2 -2
  49. package/dist/{chunk-NCPWXHDO.js → chunk-JEUFYSFQ.js} +4 -4
  50. package/dist/{chunk-G6FNWRAI.js → chunk-JSSM7VVV.js} +4 -4
  51. package/dist/{chunk-CCWMACJL.js → chunk-KFGZPVFA.js} +229 -821
  52. package/dist/chunk-KFGZPVFA.js.map +1 -0
  53. package/dist/{chunk-H26VDFDS.js → chunk-KGFSPJLD.js} +2 -2
  54. package/dist/{chunk-AO5TSDKT.js → chunk-KMORGMCW.js} +7 -7
  55. package/dist/{chunk-WQWKYAAK.js → chunk-NUQF5F5J.js} +2 -2
  56. package/dist/{chunk-2YJ5H5E6.js → chunk-NZ6KSHFD.js} +23 -21
  57. package/dist/{chunk-2YJ5H5E6.js.map → chunk-NZ6KSHFD.js.map} +1 -1
  58. package/dist/{chunk-7Y3N4Y72.js → chunk-OHUDZRLK.js} +3 -3
  59. package/dist/{chunk-GCKHSBEN.js → chunk-OKMTUAWO.js} +4 -4
  60. package/dist/{chunk-6M5VJOC2.js → chunk-OTJOBZJ5.js} +167 -166
  61. package/dist/chunk-OTJOBZJ5.js.map +1 -0
  62. package/dist/{chunk-2W34HX2U.js → chunk-PS257NIU.js} +288 -373
  63. package/dist/chunk-PS257NIU.js.map +1 -0
  64. package/dist/chunk-QDC7JPFG.js +685 -0
  65. package/dist/chunk-QDC7JPFG.js.map +1 -0
  66. package/dist/chunk-QEAGL4V5.js +3185 -0
  67. package/dist/chunk-QEAGL4V5.js.map +1 -0
  68. package/dist/{chunk-GB2XPITA.js → chunk-QMY57PVW.js} +2 -2
  69. package/dist/{chunk-55GMOVKW.js → chunk-QNDDPXFR.js} +2 -2
  70. package/dist/{chunk-GXN7RRHR.js → chunk-QSIXNTRV.js} +4 -4
  71. package/dist/{chunk-G7XD4QH5.js → chunk-RGLFV4KO.js} +11372 -10218
  72. package/dist/chunk-RGLFV4KO.js.map +1 -0
  73. package/dist/{chunk-QBVP3SQP.js → chunk-SGR7ZAVE.js} +13 -7
  74. package/dist/chunk-SGR7ZAVE.js.map +1 -0
  75. package/dist/{chunk-KBG463UK.js → chunk-SMHAYK6I.js} +2409 -5243
  76. package/dist/chunk-SMHAYK6I.js.map +1 -0
  77. package/dist/{chunk-XG6PVB5S.js → chunk-SSQZB5SQ.js} +1 -11
  78. package/dist/chunk-SSQZB5SQ.js.map +1 -0
  79. package/dist/{chunk-GDLHTI5R.js → chunk-STPGIKPY.js} +8 -2
  80. package/dist/chunk-STPGIKPY.js.map +1 -0
  81. package/dist/{chunk-QJRQ4BRC.js → chunk-U22TOL5Y.js} +17 -17
  82. package/dist/{chunk-NGTVREIH.js → chunk-U6IHLEWT.js} +2 -2
  83. package/dist/{chunk-Z5YHMRLF.js → chunk-UUCCV3SI.js} +2 -2
  84. package/dist/{chunk-ZXXFP2LA.js → chunk-UXMCHBOJ.js} +2 -2
  85. package/dist/{chunk-VZVEP2OZ.js → chunk-VFAKGIDG.js} +2 -2
  86. package/dist/{chunk-QCHVR4ZM.js → chunk-VM7VAFJW.js} +33 -7
  87. package/dist/chunk-VM7VAFJW.js.map +1 -0
  88. package/dist/{chunk-VQK4VHLF.js → chunk-YQV75FIL.js} +2 -2
  89. package/dist/chunk-YUTVAMWW.js +2 -0
  90. package/dist/chunk-ZPLVANY2.js +15 -0
  91. package/dist/chunk-ZPLVANY2.js.map +1 -0
  92. package/dist/{cli-BIIUKPTE.js → cli-4CR7QIOK.js} +26 -22
  93. package/dist/{cli-BIIUKPTE.js.map → cli-4CR7QIOK.js.map} +1 -1
  94. package/dist/{cli-V2DI3K2R.js → cli-6R4W3HAH.js} +37 -33
  95. package/dist/{cli-V2DI3K2R.js.map → cli-6R4W3HAH.js.map} +1 -1
  96. package/dist/{cli-HO62TOM2.js → cli-BOMA2FMP.js} +14 -11
  97. package/dist/{cli-EH3I4IUX.js → cli-EDQPQOCE.js} +47 -41
  98. package/dist/cli-EDQPQOCE.js.map +1 -0
  99. package/dist/{cli-P2X7PNY6.js → cli-GBF76EXT.js} +25 -20
  100. package/dist/{cli-P2X7PNY6.js.map → cli-GBF76EXT.js.map} +1 -1
  101. package/dist/{cli-4YYC6LCY.js → cli-MQYCF3SR.js} +27 -23
  102. package/dist/{cli-4YYC6LCY.js.map → cli-MQYCF3SR.js.map} +1 -1
  103. package/dist/{cli-UETKXHJN.js → cli-OJKFXQOM.js} +9 -9
  104. package/dist/{cli-LWST5FQH.js → cli-PHZAO4LZ.js} +4 -4
  105. package/dist/{cli-TELPAMJO.js → cli-PTKFFNOW.js} +59 -35
  106. package/dist/cli-PTKFFNOW.js.map +1 -0
  107. package/dist/{cli-SGVFZOAW.js → cli-UW2K5Z5J.js} +34 -29
  108. package/dist/{cli-SGVFZOAW.js.map → cli-UW2K5Z5J.js.map} +1 -1
  109. package/dist/cli-XXTNPPKB.js +83 -0
  110. package/dist/cli-XXTNPPKB.js.map +1 -0
  111. package/dist/cli.js +24 -12
  112. package/dist/cli.js.map +1 -1
  113. package/dist/{config-TYXYQK3I.js → config-JJW75SBX.js} +5 -5
  114. package/dist/docmeta.js +13 -10
  115. package/dist/docmeta.js.map +1 -1
  116. package/dist/github-6VQKSB67.js +35 -0
  117. package/dist/github-RBSEM7ZK.js +30 -0
  118. package/dist/graph/runtime.d.ts +4 -1
  119. package/dist/graph/runtime.js +20 -9
  120. package/dist/graph/runtime.js.map +1 -1
  121. package/dist/{host-6GURH5HE.js → host-YSTYO5DX.js} +3 -3
  122. package/dist/index.d.ts +1214 -940
  123. package/dist/index.js +190 -160
  124. package/dist/index.js.map +1 -1
  125. package/dist/{json-QR4G35KA.js → json-PU2HLHDQ.js} +18 -14
  126. package/dist/labels-SJNSOPBI.js +73 -0
  127. package/dist/labels-SJNSOPBI.js.map +1 -0
  128. package/dist/lint-KIVTHLGU.js +34 -0
  129. package/dist/list-RDEJDDJF.js +32 -0
  130. package/dist/list-SUTDWL2J.js +35 -0
  131. package/dist/{page-FSXDXCDD.js → page-UMAA3NCM.js} +18 -13
  132. package/dist/{prepare-UPIBTFNS.js → prepare-3I3LOXXD.js} +24 -20
  133. package/dist/{prepare-UPIBTFNS.js.map → prepare-3I3LOXXD.js.map} +1 -1
  134. package/dist/{pretty-4IONWSEP.js → pretty-ANLRHU4O.js} +18 -14
  135. package/dist/{pretty-R4BQD2VH.js → pretty-Q3ZFKOR7.js} +18 -14
  136. package/dist/{provider-527CO4DM.js → provider-LBX4IXGX.js} +3 -3
  137. package/dist/{release-3D5PK6M7.js → release-VV3UTKE5.js} +3 -3
  138. package/dist/{reporters-M6LJ2IYU.js → reporters-26H3N2KW.js} +3 -3
  139. package/dist/{reporters-DHO2BXAD.js → reporters-ILT36CIH.js} +7 -7
  140. package/dist/{reporters-FPP6JNDP.js → reporters-PNDLWT6K.js} +16 -12
  141. package/dist/run-QXCK33Z4.js +37 -0
  142. package/dist/{term-ASM4LVYC.js → term-D2N7UN4P.js} +981 -138
  143. package/dist/term-D2N7UN4P.js.map +1 -0
  144. package/dist/validate-BRUCOT2O.js +19 -0
  145. package/dist/validate-BRUCOT2O.js.map +1 -0
  146. package/package.json +3 -2
  147. package/plugin/manni/.claude-plugin/plugin.json +1 -1
  148. package/shapes/graph/shapes-1.1.0.ttl +785 -0
  149. package/dist/batch-6NICDKRE.js +0 -41
  150. package/dist/build-3KP2K3XN.js +0 -32
  151. package/dist/calibrate-LUA3DWKD.js +0 -36
  152. package/dist/capture-NETOHCB4.js +0 -34
  153. package/dist/check-E4QCB7LS.js +0 -20
  154. package/dist/check-PTECPIIB.js +0 -26
  155. package/dist/chunk-2BV4FBC7.js.map +0 -1
  156. package/dist/chunk-2JV7C4YV.js.map +0 -1
  157. package/dist/chunk-2W34HX2U.js.map +0 -1
  158. package/dist/chunk-4DLF5SA4.js +0 -392
  159. package/dist/chunk-4DLF5SA4.js.map +0 -1
  160. package/dist/chunk-6AGESHHM.js +0 -387
  161. package/dist/chunk-6AGESHHM.js.map +0 -1
  162. package/dist/chunk-6LR73NMO.js.map +0 -1
  163. package/dist/chunk-6M5VJOC2.js.map +0 -1
  164. package/dist/chunk-ABHG6I3G.js.map +0 -1
  165. package/dist/chunk-CCWMACJL.js.map +0 -1
  166. package/dist/chunk-DNZUBCGZ.js.map +0 -1
  167. package/dist/chunk-G7XD4QH5.js.map +0 -1
  168. package/dist/chunk-GDLHTI5R.js.map +0 -1
  169. package/dist/chunk-KBG463UK.js.map +0 -1
  170. package/dist/chunk-PK7EKJ5T.js.map +0 -1
  171. package/dist/chunk-QBVP3SQP.js.map +0 -1
  172. package/dist/chunk-QCHVR4ZM.js.map +0 -1
  173. package/dist/chunk-VVVKBUBO.js +0 -818
  174. package/dist/chunk-VVVKBUBO.js.map +0 -1
  175. package/dist/chunk-XG6PVB5S.js.map +0 -1
  176. package/dist/cli-EH3I4IUX.js.map +0 -1
  177. package/dist/cli-TELPAMJO.js.map +0 -1
  178. package/dist/github-ESK45CEZ.js +0 -26
  179. package/dist/github-WER7JUTN.js +0 -31
  180. package/dist/lint-QTI7XK2A.js +0 -30
  181. package/dist/list-JO4G3TS3.js +0 -30
  182. package/dist/list-O2MJUP5V.js +0 -28
  183. package/dist/run-YH5Z7RJ7.js +0 -32
  184. package/dist/term-ASM4LVYC.js.map +0 -1
  185. package/dist/validate-7JI3H57P.js +0 -17
  186. /package/dist/{batch-6NICDKRE.js.map → batch-EFSFG6GC.js.map} +0 -0
  187. /package/dist/{build-3KP2K3XN.js.map → build-NIO3UIWJ.js.map} +0 -0
  188. /package/dist/{calibrate-LUA3DWKD.js.map → calibrate-6VO7URRV.js.map} +0 -0
  189. /package/dist/{capture-NETOHCB4.js.map → capture-NMBVJO3C.js.map} +0 -0
  190. /package/dist/{check-7B77ZD2N.js.map → check-SHOYX2B5.js.map} +0 -0
  191. /package/dist/{check-E4QCB7LS.js.map → check-XMJKH3KV.js.map} +0 -0
  192. /package/dist/{check-PTECPIIB.js.map → check-ZMO3ZLMW.js.map} +0 -0
  193. /package/dist/{chunk-LQZQ5KGG.js.map → chunk-4Q24OYI3.js.map} +0 -0
  194. /package/dist/{chunk-XU73V5XT.js.map → chunk-4WJTURRO.js.map} +0 -0
  195. /package/dist/{chunk-WN47MNSK.js.map → chunk-5SID2SVL.js.map} +0 -0
  196. /package/dist/{chunk-5REEVKGH.js.map → chunk-AANUY4BH.js.map} +0 -0
  197. /package/dist/{chunk-RZVCWX5R.js.map → chunk-AYVKN3PG.js.map} +0 -0
  198. /package/dist/{chunk-2UCC26MO.js.map → chunk-CH6IOGXV.js.map} +0 -0
  199. /package/dist/{chunk-RODZ7MB7.js.map → chunk-D5Z6B4M7.js.map} +0 -0
  200. /package/dist/{chunk-IJ62BB2T.js.map → chunk-D6SELXQ2.js.map} +0 -0
  201. /package/dist/{chunk-3E2X2RBU.js.map → chunk-DGRLHDM4.js.map} +0 -0
  202. /package/dist/{chunk-BD7IXBWE.js.map → chunk-F564FHMQ.js.map} +0 -0
  203. /package/dist/{chunk-DFCQ6BMI.js.map → chunk-G3MBUL5M.js.map} +0 -0
  204. /package/dist/{chunk-SUTMSDQ2.js.map → chunk-GQ3KRY3B.js.map} +0 -0
  205. /package/dist/{chunk-EAUIQADY.js.map → chunk-IQQAJROD.js.map} +0 -0
  206. /package/dist/{chunk-ZHRPH52H.js.map → chunk-IZXN3WI6.js.map} +0 -0
  207. /package/dist/{chunk-NCPWXHDO.js.map → chunk-JEUFYSFQ.js.map} +0 -0
  208. /package/dist/{chunk-G6FNWRAI.js.map → chunk-JSSM7VVV.js.map} +0 -0
  209. /package/dist/{chunk-H26VDFDS.js.map → chunk-KGFSPJLD.js.map} +0 -0
  210. /package/dist/{chunk-AO5TSDKT.js.map → chunk-KMORGMCW.js.map} +0 -0
  211. /package/dist/{chunk-WQWKYAAK.js.map → chunk-NUQF5F5J.js.map} +0 -0
  212. /package/dist/{chunk-7Y3N4Y72.js.map → chunk-OHUDZRLK.js.map} +0 -0
  213. /package/dist/{chunk-GCKHSBEN.js.map → chunk-OKMTUAWO.js.map} +0 -0
  214. /package/dist/{chunk-GB2XPITA.js.map → chunk-QMY57PVW.js.map} +0 -0
  215. /package/dist/{chunk-55GMOVKW.js.map → chunk-QNDDPXFR.js.map} +0 -0
  216. /package/dist/{chunk-GXN7RRHR.js.map → chunk-QSIXNTRV.js.map} +0 -0
  217. /package/dist/{chunk-QJRQ4BRC.js.map → chunk-U22TOL5Y.js.map} +0 -0
  218. /package/dist/{chunk-NGTVREIH.js.map → chunk-U6IHLEWT.js.map} +0 -0
  219. /package/dist/{chunk-Z5YHMRLF.js.map → chunk-UUCCV3SI.js.map} +0 -0
  220. /package/dist/{chunk-ZXXFP2LA.js.map → chunk-UXMCHBOJ.js.map} +0 -0
  221. /package/dist/{chunk-VZVEP2OZ.js.map → chunk-VFAKGIDG.js.map} +0 -0
  222. /package/dist/{chunk-VQK4VHLF.js.map → chunk-YQV75FIL.js.map} +0 -0
  223. /package/dist/{cli-HO62TOM2.js.map → chunk-YUTVAMWW.js.map} +0 -0
  224. /package/dist/{config-TYXYQK3I.js.map → cli-BOMA2FMP.js.map} +0 -0
  225. /package/dist/{cli-UETKXHJN.js.map → cli-OJKFXQOM.js.map} +0 -0
  226. /package/dist/{cli-LWST5FQH.js.map → cli-PHZAO4LZ.js.map} +0 -0
  227. /package/dist/{github-ESK45CEZ.js.map → config-JJW75SBX.js.map} +0 -0
  228. /package/dist/{github-WER7JUTN.js.map → github-6VQKSB67.js.map} +0 -0
  229. /package/dist/{host-6GURH5HE.js.map → github-RBSEM7ZK.js.map} +0 -0
  230. /package/dist/{json-QR4G35KA.js.map → host-YSTYO5DX.js.map} +0 -0
  231. /package/dist/{lint-QTI7XK2A.js.map → json-PU2HLHDQ.js.map} +0 -0
  232. /package/dist/{list-JO4G3TS3.js.map → lint-KIVTHLGU.js.map} +0 -0
  233. /package/dist/{list-O2MJUP5V.js.map → list-RDEJDDJF.js.map} +0 -0
  234. /package/dist/{page-FSXDXCDD.js.map → list-SUTDWL2J.js.map} +0 -0
  235. /package/dist/{pretty-4IONWSEP.js.map → page-UMAA3NCM.js.map} +0 -0
  236. /package/dist/{pretty-R4BQD2VH.js.map → pretty-ANLRHU4O.js.map} +0 -0
  237. /package/dist/{provider-527CO4DM.js.map → pretty-Q3ZFKOR7.js.map} +0 -0
  238. /package/dist/{reporters-DHO2BXAD.js.map → provider-LBX4IXGX.js.map} +0 -0
  239. /package/dist/{release-3D5PK6M7.js.map → release-VV3UTKE5.js.map} +0 -0
  240. /package/dist/{reporters-FPP6JNDP.js.map → reporters-26H3N2KW.js.map} +0 -0
  241. /package/dist/{reporters-M6LJ2IYU.js.map → reporters-ILT36CIH.js.map} +0 -0
  242. /package/dist/{run-YH5Z7RJ7.js.map → reporters-PNDLWT6K.js.map} +0 -0
  243. /package/dist/{validate-7JI3H57P.js.map → run-QXCK33Z4.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/graph/types.ts","../src/graph/core/iri.ts","../src/graph/core/config.ts","../src/graph/core/config-schema.json","../src/graph/core/vocab.ts","../src/graph/core/iirds.ts","../src/graph/core/coverage.ts","../src/graph/embed/types.ts","../src/graph/core/sort.ts"],"sourcesContent":["/** Shared types for manni graph. */\nimport { ToolError } from \"../shared/errors.js\";\nimport type { DocFormat } from \"./core/analyze.js\";\n\n/** Operational error: expected failure reported to the user, exit code 2. */\nexport class GraphError extends ToolError {\n constructor(message: string) {\n super(message);\n this.name = \"GraphError\";\n }\n}\n\n/** A heading-derived section within a document. */\nexport interface Section {\n /** GitHub-style slug, disambiguated (`install`, `install-1`, ...). */\n slug: string;\n /** Heading text. */\n title: string;\n /** Heading level, 1-6. */\n level: number;\n /** 1-based position among siblings under the same parent. */\n order: number;\n /** Slug of the enclosing section, or null when the parent is the document. */\n parentSlug: string | null;\n}\n\n/** A link found in a document body. */\nexport interface DocLink {\n /** The raw target as written in the source. */\n raw: string;\n /**\n * internal: resolves to a discovered doc (repo-relative path in `resolvedPath`,\n * optional `anchor`);\n * external: absolute URL;\n * broken: relative target that does not match a discovered doc.\n */\n kind: \"internal\" | \"external\" | \"broken\";\n /** Repo-relative path of the target doc (internal links only). */\n resolvedPath?: string;\n /** Fragment identifier without `#`, when present. */\n anchor?: string;\n /** Normalized absolute URL (external links only). */\n url?: string;\n}\n\n/** An image reference found in a document body. */\nexport interface DocImage {\n raw: string;\n /** Absolute URL or repo-relative path resolved from the doc's location. */\n target: string;\n external: boolean;\n}\n\n/** Everything dockg derives from one source file. */\nexport interface DocModel {\n /** Repo-relative path with forward slashes, e.g. `docs/guide.md`. */\n path: string;\n /** Parsed frontmatter data ({} when absent). */\n frontmatter: Record<string, unknown>;\n /** Whether a frontmatter block was present. */\n frontmatterPresent: boolean;\n /** The format the page was parsed as: `--as`, else its extension. */\n format: DocFormat;\n /** First H1 text, if any (used as title fallback). */\n firstH1?: string;\n sections: Section[];\n links: DocLink[];\n images: DocImage[];\n /** Distinct fenced code block languages, sorted. */\n codeLanguages: string[];\n /**\n * BCP-47 tag from the nearest enclosing route mapping that declares one\n * (ADR 01037), or undefined when no route covers this path or none in the\n * chain declares a language. The page's own `lang`/`language` frontmatter\n * outranks it.\n */\n routeLanguage?: string;\n /**\n * Lowercase sha256 hex digest of the document's UTF-8 content, as read —\n * line endings included, so it matches `sha256sum <file>` (ADR 01036).\n */\n contentHash: string;\n}\n","/**\n * Deterministic IRI minting. Every node in the graph gets a stable IRI derived\n * from the base IRI plus repo-relative paths, heading slugs, or concept labels —\n * never blank nodes. Identical inputs mint identical IRIs on every OS.\n */\nimport { slug as githubSlug } from \"github-slugger\";\n\n/** Default base when the config sets none: valid, deterministic, obviously placeholder. */\nexport const DEFAULT_BASE_IRI = \"urn:manni:graph:\";\n\n/** Normalize a config base IRI; http(s) bases get a trailing slash. */\nexport function resolveBaseIri(base: string | undefined): string {\n if (!base) return DEFAULT_BASE_IRI;\n if (base.endsWith(\"/\") || base.endsWith(\":\")) return base;\n return `${base}/`;\n}\n\n/** Repo-relative path with forward slashes and no leading `./`. */\nexport function normalizeDocPath(p: string): string {\n let out = p.replace(/\\\\/g, \"/\");\n while (out.startsWith(\"./\")) out = out.slice(2);\n return out;\n}\n\n/** RFC 3986 strict percent-encoding of one path segment (UTF-8 for non-ASCII). */\nexport function encodeSegment(segment: string): string {\n return encodeURIComponent(segment).replace(\n /[!'()*]/g,\n (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`,\n );\n}\n\n/**\n * The display path of a document read from stdin (`-`). It has no file name,\n * so its node is `{base}stdin` rather than a `doc/` path, and its links\n * resolve from the working directory.\n */\nexport const STDIN_PATH = \"<stdin>\";\n\n/**\n * `{base}doc/{repo-relative-path}`, segment-wise percent-encoded. A document\n * read from stdin is `{base}stdin`.\n */\nexport function mintDocIri(base: string, relPath: string): string {\n if (relPath === STDIN_PATH) return `${base}stdin`;\n const path = normalizeDocPath(relPath)\n .split(\"/\")\n .map(encodeSegment)\n .join(\"/\");\n return `${base}doc/${path}`;\n}\n\n/** `{docIri}#{slug}` — the slug comes pre-disambiguated from analysis. */\nexport function mintSectionIri(docIri: string, slugValue: string): string {\n return `${docIri}#${slugValue}`;\n}\n\n/** Stateless GitHub-style slug; identical labels always converge. */\nexport function conceptSlug(label: string): string {\n return githubSlug(label);\n}\n\n/** `{base}concept/{slug(label)}` — one shared namespace for all concepts. */\nexport function mintConceptIri(base: string, label: string): string {\n return `${base}concept/${encodeSegment(conceptSlug(label))}`;\n}\n\n/**\n * `{base}product/{slug(label)}` — iiRDS ProductVariant nodes (graph.applies-to).\n * Separate `product/` segment so a product and a concept sharing a label\n * cannot converge on one IRI.\n */\nexport function mintProductIri(base: string, label: string): string {\n return `${base}product/${encodeSegment(conceptSlug(label))}`;\n}\n\n/** The single skos:ConceptScheme node for the graph. */\nexport function mintSchemeIri(base: string): string {\n return `${base}scheme`;\n}\n\n/**\n * The kind of actor an agent IRI names, mirroring PROV-O's three\n * `prov:Agent` subclasses. Segmenting by kind keeps a person and a model\n * whose names slug alike (\"GPT 4\" / \"gpt-4\") from merging into one node.\n */\nexport type AgentKind = \"person\" | \"org\" | \"software\";\n\n/** `{base}agent/{kind}/{slug(name)}`. */\nexport function mintAgentIri(\n base: string,\n kind: AgentKind,\n name: string,\n): string {\n return `${base}agent/${kind}/${encodeSegment(conceptSlug(name))}`;\n}\n\n/** The graph itself as a prov:Entity. */\nexport function mintGraphIri(base: string): string {\n return `${base}graph`;\n}\n\n/** The build run as a prov:Activity. */\nexport function mintBuildActivityIri(base: string): string {\n return `${base}activity/build`;\n}\n","/**\n * Loads and validates the `graph:` section of `manni.config.yaml`. Discovery is\n * the family's (`src/shared/config-file.ts`); validation is JSON Schema\n * (2020-12) via Ajv; defaults are applied in code afterward so the resolved\n * shape is fully typed. Mirrors the docevals config pattern.\n */\nimport { dirname, resolve } from \"node:path\";\nimport { parse as parseYaml } from \"yaml\";\nimport { Ajv2020 } from \"ajv/dist/2020.js\";\nimport configSchema from \"./config-schema.json\" with { type: \"json\" };\nimport {\n findConfigFileSync,\n readConfigFileSync,\n type ConfigFileOptions,\n} from \"../../shared/config-file.js\";\nimport type { CollectionConfig } from \"../../shared/collections.js\";\nimport { parseCollections } from \"../../shared/collections.js\";\nimport {\n PROVIDERS_KEY,\n assertKnownProvider,\n parseProviders,\n type ProvidersConfig,\n} from \"../../shared/providers.js\";\nimport { errorMessage } from \"../../shared/errors.js\";\nimport { GraphError } from \"../types.js\";\nimport { resolveBaseIri } from \"./iri.js\";\nimport { COVERAGE_FIELD_NAMES } from \"./coverage.js\";\n// Pure data module (no transformers import), so config stays Node-light.\nimport { DEFAULT_MODEL as DEFAULT_EMBED_MODEL } from \"../embed/types.js\";\n\nexport type DeriveSource =\n | \"frontmatter\"\n | \"sections\"\n | \"links\"\n | \"tags\"\n | \"images\"\n | \"code\"\n | \"provenance\";\n\nexport type FillField =\n // SKOS concept fields\n | \"label\"\n | \"alt-labels\"\n | \"broader\"\n | \"narrower\"\n | \"related-concepts\"\n | \"concepts\"\n // iiRDS typing + negative scope (ADR 01015)\n | \"type\"\n | \"applies-to\"\n | \"about-product-lifecycle\"\n | \"about-product-aspect\"\n | \"not-applicable-to\"\n | \"not-about-product-aspect\";\n\n/** Every fillable field, in a stable order — the default `fill.fields`. */\nexport const ALL_FILL_FIELDS: FillField[] = [\n \"label\",\n \"alt-labels\",\n \"broader\",\n \"narrower\",\n \"related-concepts\",\n \"concepts\",\n \"type\",\n \"applies-to\",\n \"about-product-lifecycle\",\n \"about-product-aspect\",\n \"not-applicable-to\",\n \"not-about-product-aspect\",\n];\n\n/** Maps published-site routes back to source files. */\nexport interface RouteMapping {\n /** Site prefix, normalized: leading `/`, no trailing `/`; `\"\"` = site root. */\n basePath: string;\n /** Repo-relative directory routes resolve into (no trailing slash). */\n root: string;\n /** Extensions to try when the route names a page without one. */\n extensions: string[];\n /** Basenames to try for directory routes (`/docs/actions/`). */\n indexFiles: string[];\n /**\n * BCP-47 tag labelling every document under `root` (ADR 01037). A page's own\n * `lang`/`language` frontmatter wins; absent that, the nearest enclosing\n * route that declares one applies. Omitted, the route says nothing about\n * language.\n */\n language?: string;\n}\n\nexport interface GraphConfig {\n /**\n * The family's document sets, from the file's top-level `collections:`\n * (proposal 0041). `[]` when the key is absent or no file governs the run.\n */\n collections: CollectionConfig[];\n /**\n * The config file as the user would name it, for messages; `null` when no\n * file governs the run and every value is a built-in default.\n */\n configSource: string | null;\n /**\n * `graph.provider`, or `null` when unset: the family's `providers.provider`\n * decides then, and `auto` (detect) after it. `--provider` wins over it and\n * `--local` overrides both (proposal 0051 §3).\n */\n provider: string | null;\n /**\n * The model within the provider, or `null` for the provider's own default.\n * manni pins no model: the inference library chooses, and the model it\n * resolves to is what every cache key names. Not `embed.model`, which is a\n * local embedding model id and has nothing to do with a provider.\n */\n model: string | null;\n /**\n * The family's top-level `providers:`: the provider and model every tool\n * falls back to, and the connection settings for each provider. `{}` when\n * the file declares none, or no file governs the run.\n */\n providers: ProvidersConfig;\n /** Normalized base IRI (trailing slash for http(s); `urn:manni:graph:` default). */\n baseIri: string;\n /** Output path of the built Turtle file, relative to configDir. */\n out: string;\n routes: RouteMapping[];\n build: { derive: DeriveSource[] };\n /** Graph-level SHACL validation (`manni graph check`). */\n check: {\n /** Shapes .ttl paths; empty = the shapes bundled with manni. */\n shapes: string[];\n };\n provenance: {\n /**\n * Emit qualified attribution/association nodes with roles.\n *\n * The one provenance setting left. `git` was tri-state until proposal\n * 0051 §6: git history is *detected* now, used wherever git can run over a\n * repository and degraded to a warning where it cannot (graph ADR 01010's\n * `\"auto\"`, minus the switch). `qualified` stays because it switches what\n * is written, not what is discovered.\n */\n qualified: boolean;\n };\n fill: {\n temperature: number;\n /**\n * Stop after this many inference calls; `null` (the default) is\n * unbounded. One page is one turn, and a cached proposal spends none.\n * Replaces the dollar cap graph ADR 01027 found unenforceable, as docevals\n * ADR 01019 replaced its own (proposal 0051 §3).\n */\n maxTurns: number | null;\n cacheDir: string;\n fields: FillField[];\n /**\n * Minimum model self-confidence (0..1) to write a proposed field; below\n * this it is reported but not written (ADR 01015). Default 0.7. Named as\n * meta, docevals and tracevals name it (proposal 0051 §3).\n */\n confidenceThreshold: number;\n /** Record the page-level meta-provenance on filled docs (proposal 0046). */\n writeProvenance: boolean;\n /** Reject proposals that would violate the SHACL shapes contract. */\n validateGraph: boolean;\n /** Also propose per-section metadata (ADR 01032). Opt-in: more output. */\n sections: boolean;\n };\n stats: {\n /**\n * Per-field minimum coverage percentages (0–100) enforced under\n * `stats --check`. Resolved shape is always a map; a uniform number in the\n * config expands across every measured field. Default `{}` gates nothing.\n * See ADR 01011.\n */\n coverageThreshold: Record<string, number>;\n };\n embed: {\n /**\n * Embedding model id (ADR 01020). An open string, not an enum: the\n * documented table is the *tested* set, not the permitted set, so a newer\n * model works without a manni release.\n */\n model: string;\n /** Weight quantization. `q8` keeps int32 accumulation, which is associative. */\n dtype: string;\n /**\n * Directory the sidecars are written into (ADR 01038). One file per\n * language, named by `vectorIndexFilename`, so this is a directory rather\n * than the single path it was before the fan-out. Resolved from the\n * working directory, as `out` is. Undefined means the index directory,\n * which is why it has no default here.\n */\n out: string | undefined;\n /**\n * Per-language model overrides, keyed by BCP-47 tag (ADR 01038). A German\n * corpus embedded with an English-only model returns confident, meaningless\n * vectors and fails nothing, so this is the knob that makes the fan-out\n * worth having. Unset languages use `model`/`dtype`.\n */\n byLanguage: Record<string, { model?: string; dtype?: string }>;\n /** Per-text vector cache, keyed on text+model+dtype. */\n cacheDir: string;\n };\n export: {\n /** iiRDS package export metadata (ADR 01017); all fields optional. */\n iirds: {\n /** Package title; when absent the exporter uses a default. */\n title?: string;\n /** Creator organization name → a Creator iirds:Party + vcard:Organization. */\n creator?: string;\n /** iiRDS version literal written to the package. Default \"1.3\". */\n version: \"1.2\" | \"1.3\";\n };\n };\n /** Absolute path of the loaded config file. */\n configPath: string;\n /** Directory containing the config file; relative paths resolve against it. */\n configDir: string;\n}\n\n/** The family config file; this tool reads its `graph:` key. */\nexport const DEFAULT_CONFIG_FILENAME = \"manni.config.yaml\";\n/** The tool's key in the family file. */\nexport const CONFIG_SECTION = \"graph\";\n/** The family's top-level key for document sets (proposal 0041). */\nconst COLLECTIONS_KEY = \"collections\";\n\n/**\n * Where the metadata tool's configuration reference documents `collections:`.\n * The literal docevals', cite's and meta's config modules carry, repeated\n * because those modules are theirs.\n */\nconst CONFIG_REF =\n \"https://hawkeyexl.github.io/manni/meta/reference/configuration/\";\n\n/**\n * The keys proposal 0041 moved out of `graph:` and up to the family level.\n * Refused rather than aliased, as meta, cite and docevals refuse theirs: an\n * alias would be a second place to declare a document set that is meant to be\n * declared once. Checked before Ajv, which would call them unknown keys.\n */\nconst MOVED_KEYS = [\"inputs\", \"exclude\"] as const;\n\nexport const ALL_DERIVE_SOURCES: DeriveSource[] = [\n \"frontmatter\",\n \"sections\",\n \"links\",\n \"tags\",\n \"images\",\n \"code\",\n \"provenance\",\n];\n\n/**\n * Default candidates for extensionless link targets (routes AND relative\n * links), and the extensions that name a document rather than an asset.\n * Markdown first, so a tree holding `install.md` and a built `install.html`\n * resolves a pretty URL to the source. No `.xml`: a link to `pom.xml` is an\n * asset, as a walk never collects one (proposal 0077 §3).\n */\nexport const DEFAULT_LINK_EXTENSIONS = [\n \".md\",\n \".mdx\",\n \".markdown\",\n \".html\",\n \".htm\",\n \".adoc\",\n \".asciidoc\",\n \".rst\",\n \".dita\",\n \".ditamap\",\n];\nexport const DEFAULT_INDEX_FILES = [\"index\", \"README\"];\n\n/** `/docs/` -> `/docs`; `/` or `` -> `` (site root). */\nfunction normalizeBasePath(basePath: string): string {\n let out = basePath.trim();\n if (!out.startsWith(\"/\")) out = `/${out}`;\n out = out.replace(/\\/+$/, \"\");\n return out;\n}\n\nconst ajv = new Ajv2020({ allErrors: true, allowUnionTypes: true });\nconst validateConfig = ajv.compile(configSchema);\n\n/** One `routes:` entry as the file spells it; only `root` is required. */\ninterface RawRouteMapping {\n basePath?: string;\n root: string;\n extensions?: string[];\n indexFiles?: string[];\n language?: string;\n}\n\n/**\n * The config file's own shape, in its own spelling.\n *\n * Ajv has already validated `raw` against `config-schema.json` by the time this\n * is used, so the optionality here is the schema's, not a guess. Declaring it is\n * what lets `parseConfigSection` read the file without an `any` — and an `any`\n * here would be the worst place for one, since every default in the tool flows\n * through this function. `RawDocevalsConfig` is the same declaration in the\n * evals tool.\n */\ninterface RawGraphConfig {\n provider?: string;\n model?: string;\n baseIri?: string;\n out?: string;\n routes?: RawRouteMapping[];\n build?: { derive?: DeriveSource[] };\n check?: { shapes?: string[] };\n provenance?: { qualified?: boolean };\n stats?: { coverageThreshold?: number | Record<string, number> };\n fill?: {\n temperature?: number;\n maxTurns?: number | null;\n cacheDir?: string;\n confidenceThreshold?: number;\n writeProvenance?: boolean;\n validateGraph?: boolean;\n fields?: FillField[];\n sections?: boolean;\n };\n embed?: {\n model?: string;\n dtype?: string;\n out?: string;\n cacheDir?: string;\n byLanguage?: Record<string, { model?: string; dtype?: string }>;\n };\n export?: {\n iirds?: { title?: string; creator?: string; version?: \"1.2\" | \"1.3\" };\n };\n}\n\n/**\n * One Ajv error, as a line a reader can act on.\n *\n * Ajv reports an unknown key against the *parent* object, so the bare message\n * (\"must NOT have additional properties\") leaves the reader to diff their file\n * against the schema to find which key it meant. Name it, as docevals does\n * (PR #10): the common case here is a key that was removed — `version:`,\n * `provenance.git:` and `fill.provider:` after proposal 0051 — and a message\n * that makes you guess is one people work around.\n *\n * The path is the one the user writes. Ajv validates the `graph:` section on its\n * own, so its `instancePath` starts inside it; `/graph` goes back on the front,\n * so a reader can find `/graph/fill` in `manni.config.yaml` without translating.\n */\nfunction configErrorLine(e: {\n instancePath: string;\n keyword: string;\n params: unknown;\n message?: string | undefined;\n}): string {\n const extra =\n e.keyword === \"additionalProperties\"\n ? (e.params as { additionalProperty?: string }).additionalProperty\n : undefined;\n const where = `/${CONFIG_SECTION}${e.instancePath}`;\n return extra === undefined\n ? ` ${where}: ${e.message ?? \"is invalid\"}`\n : ` ${where}: unknown key \"${extra}\"`;\n}\n\n/**\n * Normalize `stats.coverageThreshold` to a per-field map. Ajv has already\n * validated the input as a number, an object of known fields, or absent; a\n * uniform number expands across every measured field so the resolved shape is\n * always a map (default `{}`).\n */\nfunction resolveCoverageThreshold(\n raw: number | Record<string, number> | undefined,\n): Record<string, number> {\n if (raw == null) return {};\n if (typeof raw === \"number\")\n return Object.fromEntries(COVERAGE_FIELD_NAMES.map((f) => [f, raw]));\n return { ...raw };\n}\n\n/** What the file the section came from carries beside it. */\nexport interface ConfigFileContext {\n /** The file as the user would name it, for messages. */\n source: string;\n /** The file's top-level `collections:`. */\n collections: CollectionConfig[];\n /** The file's top-level `providers:`; `{}` when it declares none. */\n providers?: ProvidersConfig;\n}\n\n/**\n * Parse and validate config YAML text. A document with a `graph:` key is a family\n * file, so its top-level `collections:` is read too; anything else is the\n * tool's section on its own.\n */\nexport function parseConfig(text: string, configPath: string): GraphConfig {\n let raw: unknown;\n try {\n raw = parseYaml(text);\n } catch (e) {\n throw new GraphError(\n `Invalid YAML in ${configPath}: ${errorMessage(e)}`,\n );\n }\n if (raw == null) return parseConfigSection(null, configPath);\n if (typeof raw !== \"object\" || Array.isArray(raw)) {\n throw new GraphError(`Invalid config in ${configPath}: root must be an object`);\n }\n const doc = raw as Record<string, unknown>;\n const wrapped = Object.hasOwn(doc, CONFIG_SECTION);\n const toError = (message: string): Error => new GraphError(message);\n // The family keys, parsed as the shared loader parses them, so a config\n // built from text selects from the same collections, and the same\n // providers, a discovered file would.\n const collections = Object.hasOwn(doc, COLLECTIONS_KEY)\n ? parseCollections(doc[COLLECTIONS_KEY], configPath, toError)\n : [];\n const providers = Object.hasOwn(doc, PROVIDERS_KEY)\n ? parseProviders(\n doc[PROVIDERS_KEY],\n configPath,\n dirname(resolve(configPath)),\n toError,\n )\n : {};\n return parseConfigSection(wrapped ? doc[CONFIG_SECTION] : doc, configPath, {\n source: configPath,\n collections,\n providers,\n });\n}\n\n/**\n * Validate the tool's section. `raw` is what sat under `graph:` in a family\n * file, or the whole document of an explicit path with no wrapper key.\n * Messages name `configPath`; relative paths in the config resolve against its\n * directory. `file` carries the family keys; absent, the section is its own\n * source and declares no collections.\n *\n * `null` is an empty section, which is every default: a `graph:` key somebody\n * added while migrating and has not filled in yet is a config, not an error.\n */\nexport function parseConfigSection(\n raw: unknown,\n configPath: string,\n file: ConfigFileContext = { source: configPath, collections: [] },\n): GraphConfig {\n if (raw == null) raw = {};\n if (typeof raw !== \"object\" || Array.isArray(raw)) {\n throw new GraphError(\n `Invalid config in ${configPath}: root must be an object`,\n );\n }\n for (const key of MOVED_KEYS) {\n if (Object.hasOwn(raw as Record<string, unknown>, key)) {\n throw new GraphError(\n `${file.source}: \"${key}\" is no longer a graph key. Document sets are declared once for every tool, under a top-level collections: list. See ${CONFIG_REF}#${COLLECTIONS_KEY}`,\n );\n }\n }\n if (!validateConfig(raw)) {\n const details = (validateConfig.errors ?? [])\n .map((e) => configErrorLine(e))\n .join(\"\\n\");\n throw new GraphError(`Invalid config in ${configPath}:\\n${details}`);\n }\n\n // Past this point Ajv has validated `raw` against config-schema.json, so the\n // shape is known-good and reading fields off it is safe. The cast is to that\n // shape, spelled out once in `RawGraphConfig`, rather than to `any`: the file's\n // optionality is then the schema's and every default below is checked.\n const r = raw as RawGraphConfig;\n const abs = resolve(configPath);\n const dir = dirname(abs);\n\n // The name is checked here, with the message `manni meta fill` gives, so a\n // typo is caught by every verb and not only the one that reaches a model.\n // Whether a model has a provider to own it waits for the flags: a\n // `--provider`, or the family's `providers.provider`, can supply the\n // provider a configured model needs.\n const provider: string | null = r.provider ?? null;\n if (provider !== null) {\n assertKnownProvider(provider, (message) => new GraphError(message));\n }\n\n return {\n collections: file.collections,\n configSource: file.source,\n provider,\n model: r.model ?? null,\n providers: file.providers ?? {},\n baseIri: resolveBaseIri(r.baseIri),\n out: r.out ?? \"graph/graph.ttl\",\n routes: (r.routes ?? []).map((m) => ({\n basePath: normalizeBasePath(m.basePath ?? \"/\"),\n root: m.root\n .replace(/\\\\/g, \"/\")\n .replace(/^\\.\\//, \"\")\n .replace(/\\/+$/, \"\"),\n extensions: m.extensions ?? [...DEFAULT_LINK_EXTENSIONS],\n indexFiles: m.indexFiles ?? [...DEFAULT_INDEX_FILES],\n ...(m.language === undefined ? {} : { language: m.language }),\n })),\n build: {\n derive: r.build?.derive ?? [...ALL_DERIVE_SOURCES],\n },\n check: {\n // Empty means: use the shapes bundled with manni (see bundledShapesPath).\n shapes: r.check?.shapes ?? [],\n },\n provenance: {\n qualified: r.provenance?.qualified ?? true,\n },\n stats: {\n coverageThreshold: resolveCoverageThreshold(r.stats?.coverageThreshold),\n },\n fill: {\n temperature: r.fill?.temperature ?? 0,\n maxTurns: r.fill?.maxTurns ?? null,\n cacheDir: r.fill?.cacheDir ?? \".manni/graph/cache\",\n fields: r.fill?.fields ?? [...ALL_FILL_FIELDS],\n confidenceThreshold: r.fill?.confidenceThreshold ?? 0.7,\n writeProvenance: r.fill?.writeProvenance ?? true,\n validateGraph: r.fill?.validateGraph ?? true,\n sections: r.fill?.sections ?? false,\n },\n embed: {\n model: r.embed?.model ?? DEFAULT_EMBED_MODEL,\n dtype: r.embed?.dtype ?? \"q8\",\n out: r.embed?.out,\n cacheDir: r.embed?.cacheDir ?? \".manni/graph/embed-cache\",\n byLanguage: r.embed?.byLanguage ?? {},\n },\n export: {\n iirds: {\n title: r.export?.iirds?.title,\n creator: r.export?.iirds?.creator,\n version: r.export?.iirds?.version ?? \"1.3\",\n },\n },\n configPath: abs,\n configDir: dir,\n };\n}\n\nconst CONFIG_FILE: ConfigFileOptions = {\n section: CONFIG_SECTION,\n // The tool was `dockg` before it joined the family (proposal 0051 §7), but\n // it published no config file under that old name, so — like cite, a11y and\n // docevals — there is no pre-family filename to read (proposal 0051 §2).\n legacyNames: [],\n toError: (message) => new GraphError(message),\n};\n\n/**\n * Load config from an explicit path, or discover the family file from the\n * working directory upward (`src/shared/config-file.ts`: `manni.config.yaml`\n * read at its `graph:` key). With no config file present, built-in defaults\n * apply.\n */\nexport function loadConfig(path?: string, cwd = process.cwd()): GraphConfig {\n const file = path\n ? readConfigFileSync(path, cwd, CONFIG_FILE)\n : findConfigFileSync(cwd, CONFIG_FILE);\n if (file === null) return defaultConfig(cwd);\n return parseConfigSection(file.value, file.path, {\n source: file.source,\n collections: file.collections,\n ...(file.providers === undefined ? {} : { providers: file.providers }),\n });\n}\n\n/**\n * Every built-in default, with no file behind it: what a run gets when\n * discovery finds nothing, or under `--no-config`. It declares no collections,\n * so such a run reads only the paths it was given.\n */\nexport function defaultConfig(cwd = process.cwd()): GraphConfig {\n return {\n ...parseConfigSection(null, resolve(cwd, DEFAULT_CONFIG_FILENAME)),\n configSource: null,\n };\n}\n\nexport interface RunConfigOptions {\n /** `-c/--config`. */\n configPath?: string;\n /** `--no-config`: skip discovery and run on the built-in defaults. */\n noConfig?: boolean;\n /** Positional paths; checked here only for how they combine with `collection`. */\n paths?: string[];\n /** `--collection <name>`, repeatable. */\n collection?: string[];\n}\n\n/**\n * The config a command runs under. `--collection` names something only a\n * config can define and selects a set the operator did not type, so pairing it\n * with paths is refused before discovery, and the message is about the flags\n * rather than about whatever the walk found.\n */\nexport function loadRunConfig(\n opts: RunConfigOptions,\n cwd = process.cwd(),\n): GraphConfig {\n assertCollectionWithoutPaths(opts.collection, opts.paths);\n return opts.noConfig ? defaultConfig(cwd) : loadConfig(opts.configPath, cwd);\n}\n\n/** The message meta, cite and docevals give, in graph's error class. */\nexport function assertCollectionWithoutPaths(\n collection: readonly string[] | undefined,\n paths: readonly string[] | undefined,\n): void {\n if ((collection ?? []).length > 0 && (paths ?? []).length > 0) {\n throw new GraphError(\n \"--collection selects a configured collection; it cannot be combined with paths.\",\n );\n }\n}\n","{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"manni:graph:config\",\n \"title\": \"manni graph configuration\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"provider\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"description\": \"Which provider `manni graph fill` sends pages to: auto | anthropic | openai | claude-cli | llama-cpp. Unset, the family's top-level providers.provider decides, then auto, detected exactly as manni meta fill detects: an Anthropic key, then an OpenAI key, then the Claude CLI, then a local model. --provider wins over it, and --local overrides both. Connection settings live in the family's top-level providers: map.\"\n },\n \"model\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"description\": \"The model, within the provider named beside it. A model is carried only to the provider its own level names: a differing --provider or providers.provider takes its own default instead. With no provider here, it goes to whichever provider is in force, which must not be auto, because a model name does not say which provider owns it. Unset (the default) takes the provider's default model from the inference library; manni pins none. --model wins over it. This is not `embed.model`, which is a local embedding model id.\"\n },\n \"baseIri\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"out\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"routes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\"root\"],\n \"properties\": {\n \"basePath\": {\n \"type\": \"string\"\n },\n \"root\": {\n \"type\": \"string\"\n },\n \"extensions\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"pattern\": \"^\\\\.\"\n }\n },\n \"language\": {\n \"type\": \"string\",\n \"pattern\": \"^[A-Za-z]{2,3}(-[A-Za-z]{4})?(-([A-Za-z]{2}|[0-9]{3}))?(-([A-Za-z0-9]{5,8}|[0-9][A-Za-z0-9]{3}))*$\"\n },\n \"indexFiles\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"minLength\": 1\n }\n }\n }\n }\n },\n \"build\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"derive\": {\n \"type\": \"array\",\n \"uniqueItems\": true,\n \"items\": {\n \"enum\": [\n \"frontmatter\",\n \"sections\",\n \"links\",\n \"tags\",\n \"images\",\n \"code\",\n \"provenance\"\n ]\n }\n }\n }\n },\n \"check\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"shapes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"minLength\": 1\n }\n }\n }\n },\n \"provenance\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"qualified\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"stats\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"coverageThreshold\": {\n \"anyOf\": [\n {\n \"type\": \"number\",\n \"minimum\": 0,\n \"maximum\": 100\n },\n {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"title\": {\n \"type\": \"number\",\n \"minimum\": 0,\n \"maximum\": 100\n },\n \"description\": {\n \"type\": \"number\",\n \"minimum\": 0,\n \"maximum\": 100\n },\n \"creator\": {\n \"type\": \"number\",\n \"minimum\": 0,\n \"maximum\": 100\n },\n \"created\": {\n \"type\": \"number\",\n \"minimum\": 0,\n \"maximum\": 100\n },\n \"modified\": {\n \"type\": \"number\",\n \"minimum\": 0,\n \"maximum\": 100\n },\n \"subject\": {\n \"type\": \"number\",\n \"minimum\": 0,\n \"maximum\": 100\n },\n \"label\": {\n \"type\": \"number\",\n \"minimum\": 0,\n \"maximum\": 100\n },\n \"language\": {\n \"type\": \"number\",\n \"minimum\": 0,\n \"maximum\": 100\n },\n \"type\": {\n \"type\": \"number\",\n \"minimum\": 0,\n \"maximum\": 100\n },\n \"applies-to\": {\n \"type\": \"number\",\n \"minimum\": 0,\n \"maximum\": 100\n },\n \"about-product-lifecycle\": {\n \"type\": \"number\",\n \"minimum\": 0,\n \"maximum\": 100\n },\n \"about-product-aspect\": {\n \"type\": \"number\",\n \"minimum\": 0,\n \"maximum\": 100\n }\n }\n }\n ]\n }\n }\n },\n \"fill\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"temperature\": {\n \"type\": \"number\",\n \"minimum\": 0,\n \"maximum\": 2\n },\n \"maxTurns\": {\n \"type\": [\"integer\", \"null\"],\n \"minimum\": 1,\n \"description\": \"Stop after this many inference calls. One page is one turn, and a cached proposal spends none. Null (the default) is unbounded. Replaces the maxCostUsd ceiling, which read as zero for every model outside the library's price table — see graph ADR 01027 and docevals ADR 01019.\"\n },\n \"cacheDir\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"confidenceThreshold\": {\n \"type\": \"number\",\n \"minimum\": 0,\n \"maximum\": 1,\n \"description\": \"Minimum model self-confidence (0..1) to write a proposed field; below it the field is reported and not written. Default 0.7. `--confidence` wins over it.\"\n },\n \"writeProvenance\": {\n \"type\": \"boolean\"\n },\n \"validateGraph\": {\n \"type\": \"boolean\"\n },\n \"fields\": {\n \"type\": \"array\",\n \"uniqueItems\": true,\n \"items\": {\n \"enum\": [\n \"label\",\n \"alt-labels\",\n \"broader\",\n \"narrower\",\n \"related-concepts\",\n \"concepts\",\n \"type\",\n \"applies-to\",\n \"about-product-lifecycle\",\n \"about-product-aspect\",\n \"not-applicable-to\",\n \"not-about-product-aspect\"\n ]\n }\n },\n \"sections\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"embed\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"model\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"dtype\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"out\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"cacheDir\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"byLanguage\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"patternProperties\": {\n \"^[A-Za-z]{2,3}(-[A-Za-z]{4})?(-([A-Za-z]{2}|[0-9]{3}))?(-([A-Za-z0-9]{5,8}|[0-9][A-Za-z0-9]{3}))*$\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"model\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"dtype\": {\n \"type\": \"string\",\n \"minLength\": 1\n }\n }\n }\n }\n }\n }\n },\n \"export\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"iirds\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"title\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"creator\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"version\": {\n \"enum\": [\"1.2\", \"1.3\"]\n }\n }\n }\n }\n }\n }\n}\n","/**\n * Namespace table. Standard vocabularies wherever a term exists; the custom\n * `graph:` namespace stays minimal, and the newest vocabulary document under\n * `ns/` defines every term it holds — a bidirectional drift guard in\n * test/graph/unit/vocabulary.test.ts enforces both directions. Neither the term\n * count nor the version is written here: both went stale the first time a term\n * was added, and the guard resolves the file rather than naming it. The prefix\n * set is fixed — every emitted graph carries the same header.\n *\n * The custom prefix is `graph:` and its namespace is the manni site's, which is\n * where it dereferences (proposal 0051 §7). Both were `dockg` until the tool\n * joined the family, and graph ADR 01030's rule — the namespace IRI must resolve\n * — is why they moved rather than staying: `hawkeyexl.github.io/dockg` never\n * served anything and never will.\n *\n * The block an author writes on a page is `graph:`, and the prefix is `graph:`\n * too. The spelling is shared but the things differ: the key names frontmatter,\n * the prefix abbreviates an IRI in emitted RDF, and the prefix carries the\n * tool's name because `…/manni/graph/ns#` is the tool's namespace. Nothing\n * collides: no other prefix in this table is `graph`, and a `graph:` CURIE typed\n * at `--predicates` or `--subject` expanded to nothing before.\n */\nexport const NS = {\n dcterms: \"http://purl.org/dc/terms/\",\n foaf: \"http://xmlns.com/foaf/0.1/\",\n graph: \"https://hawkeyexl.github.io/manni/graph/ns#\",\n iirds: \"http://iirds.tekom.de/iirds#\",\n iirdsSft: \"http://iirds.tekom.de/iirds/domain/software#\",\n prov: \"http://www.w3.org/ns/prov#\",\n rdf: \"http://www.w3.org/1999/02/22-rdf-syntax-ns#\",\n schema: \"https://schema.org/\",\n skos: \"http://www.w3.org/2004/02/skos/core#\",\n xsd: \"http://www.w3.org/2001/XMLSchema#\",\n} as const;\n\nexport type Prefix = keyof typeof NS;\n\n/** Prefixes in emission order (sorted by prefix name). */\nexport const PREFIXES: ReadonlyArray<[Prefix, string]> = (\n Object.entries(NS) as Array<[Prefix, string]>\n).sort(([a], [b]) => (a < b ? -1 : 1));\n\nexport const RDF_TYPE = `${NS.rdf}type`;\n\n/**\n * Role individuals for qualified provenance (prov:hadRole objects). Part of\n * the deliberately small graph vocabulary.\n */\nexport const ROLE = {\n author: `${NS.graph}authorRole`,\n generator: `${NS.graph}generatorRole`,\n tool: `${NS.graph}toolRole`,\n} as const;\n","/**\n * iiRDS Core + Software-domain term IRIs and the frontmatter-value → IRI maps\n * (ADR 01012). Every IRI here is byte-verified against the published\n * `iirds-core.rdf` / `iirds-software.rdf` in iirds-consortium/models. dockg\n * references these IRIs; it never redefines or re-types them (iiRDS is\n * CC BY-ND). This is the single source of truth shared by the schema\n * (via the schema-sync drift guard), derive, and shapes.\n */\nimport { NS } from \"./vocab.js\";\n\n/** Predicates (Core). */\nexport const IIRDS_HAS_TOPIC_TYPE = `${NS.iirds}has-topic-type`;\nexport const IIRDS_RELATES_TO_PRODUCT_VARIANT = `${NS.iirds}relates-to-product-variant`;\nexport const IIRDS_RELATES_TO_LIFECYCLE_PHASE = `${NS.iirds}relates-to-product-lifecycle-phase`;\nexport const IIRDS_HAS_SUBJECT = `${NS.iirds}has-subject`;\n\n/** Class minted for `graph.applies-to` nodes. */\nexport const IIRDS_PRODUCT_VARIANT = `${NS.iirds}ProductVariant`;\n\n/**\n * Package-serialization terms (iiRDS package export, ADR 01017). Local names\n * byte-verified against the canonical RDF/XML example in the published spec\n * (`sections/structure/serialization.md`). Used only by the package projection —\n * never emitted into the built graph. IUs are typed `iirds:Topic` (the subclass\n * that carries `has-topic-type`/`has-subject`), one of the valid IU subclasses.\n */\nexport const IIRDS_PACKAGE = `${NS.iirds}Package`;\nexport const IIRDS_IIRDS_VERSION = `${NS.iirds}iiRDSVersion`;\nexport const IIRDS_TOPIC = `${NS.iirds}Topic`;\nexport const IIRDS_IS_PART_OF_PACKAGE = `${NS.iirds}is-part-of-package`;\nexport const IIRDS_HAS_RENDITION = `${NS.iirds}has-rendition`;\nexport const IIRDS_RENDITION = `${NS.iirds}Rendition`;\nexport const IIRDS_SOURCE = `${NS.iirds}source`;\nexport const IIRDS_FORMAT = `${NS.iirds}format`;\nexport const IIRDS_TITLE = `${NS.iirds}title`;\nexport const IIRDS_LANGUAGE = `${NS.iirds}language`;\nexport const IIRDS_PARTY = `${NS.iirds}Party`;\nexport const IIRDS_HAS_PARTY_ROLE = `${NS.iirds}has-party-role`;\nexport const IIRDS_CREATOR = `${NS.iirds}Creator`;\nexport const IIRDS_RELATES_TO_PARTY = `${NS.iirds}relates-to-party`;\nexport const IIRDS_RELATES_TO_VCARD = `${NS.iirds}relates-to-vcard`;\n\n/** vcard namespace — package-local (not in the global NS/PREFIXES table). */\nexport const VCARD_NS = \"http://www.w3.org/2006/vcard/ns#\";\nexport const VCARD_ORGANIZATION = `${VCARD_NS}Organization`;\nexport const VCARD_ORGANIZATION_NAME = `${VCARD_NS}organization-name`;\n\n/**\n * Negative-scope predicates (ADR 01014). Minted into `graph:` — no standard\n * term exists, and OWL negative property assertions require blank nodes. Each\n * mirrors, and is SHACL-disjoint from, its positive counterpart above.\n */\nexport const GRAPH_NOT_APPLICABLE_TO_VARIANT = `${NS.graph}notApplicableToVariant`;\nexport const GRAPH_NOT_SOFTWARE_SUBJECT = `${NS.graph}notSoftwareSubject`;\n\n/**\n * Page-level `type` → `graph.type` (ADR 01024). The page's `type` is an open\n * vocabulary (docmeta:core); `graph.type` is the closed iiRDS enum. When the block\n * is silent, the page's value derives one through this map — an unmapped page\n * type derives nothing rather than inventing a topic type. An explicit\n * `graph.type` always wins: deeper wins, the page level is the fallback.\n */\nexport const PAGE_TYPE_TO_TOPIC_TYPE: Readonly<Record<string, string>> = {\n \"how-to\": \"task\",\n tutorial: \"learning\",\n explanation: \"concept\",\n reference: \"reference\",\n troubleshooting: \"troubleshooting\",\n};\n\n/** `graph.type` value → `iirds:has-topic-type` object IRI. */\nexport const TOPIC_TYPE_IRIS: Readonly<Record<string, string>> = {\n task: `${NS.iirds}GenericTask`,\n concept: `${NS.iirds}GenericConcept`,\n reference: `${NS.iirds}GenericReference`,\n learning: `${NS.iirds}GenericLearning`,\n troubleshooting: `${NS.iirds}GenericTroubleshooting`,\n form: `${NS.iirds}GenericForm`,\n};\n\n/**\n * `graph.about-product-lifecycle` value → `iirds:relates-to-product-lifecycle-phase`\n * object IRI (Software domain: iirds:Use/PuttingToUse/AfterUse instances).\n */\nexport const SOFTWARE_LIFECYCLE_IRIS: Readonly<Record<string, string>> = {\n administration: `${NS.iirdsSft}Administration`,\n customization: `${NS.iirdsSft}Customization`,\n update: `${NS.iirdsSft}Update`,\n deployment: `${NS.iirdsSft}Deployment`,\n integration: `${NS.iirdsSft}Integration`,\n deinstallation: `${NS.iirdsSft}Deinstallation`,\n};\n\n/**\n * `graph.about-product-aspect` value → `iirds:has-subject` object IRI (Software domain:\n * iirds:TechnicalOverview/TechnicalData instances).\n */\nexport const SOFTWARE_SUBJECT_IRIS: Readonly<Record<string, string>> = {\n architecture: `${NS.iirdsSft}Architecture`,\n interface: `${NS.iirdsSft}Interface`,\n \"system-requirement\": `${NS.iirdsSft}SystemRequirement`,\n};\n","/**\n * Metadata coverage fields (ADR 01011). Coverage answers the ADR 01008\n * question — what can a graph-side consumer see — by counting `graph:Document`\n * nodes that carry each predicate. The list is fixed and deliberate: a\n * predicate absent from every document still shows as 0%, which a dynamic\n * census could not surface. It is shared between the config parser (which\n * expands a uniform threshold across every field) and `manni graph stats` (which\n * reports and gates), and pinned by test/unit/schema-sync.ts against the\n * config schema so it cannot silently drift.\n */\nimport { NS } from \"./vocab.js\";\nimport {\n IIRDS_HAS_SUBJECT,\n IIRDS_HAS_TOPIC_TYPE,\n IIRDS_RELATES_TO_LIFECYCLE_PHASE,\n IIRDS_RELATES_TO_PRODUCT_VARIANT,\n} from \"./iirds.js\";\n\nexport interface CoverageField {\n /** Config/report key. */\n field: string;\n /** Full predicate IRI counted against `graph:Document` subjects. */\n iri: string;\n}\n\n/**\n * Report order is this array's order. Only the IRI is stored; the compact form\n * shown in the report is derived from it with `compactIri`, so there is one\n * source of truth for the namespace.\n */\nexport const COVERAGE_FIELDS: readonly CoverageField[] = [\n { field: \"title\", iri: `${NS.dcterms}title` },\n { field: \"description\", iri: `${NS.dcterms}description` },\n { field: \"creator\", iri: `${NS.dcterms}creator` },\n { field: \"created\", iri: `${NS.dcterms}created` },\n { field: \"modified\", iri: `${NS.dcterms}modified` },\n { field: \"subject\", iri: `${NS.dcterms}subject` },\n { field: \"label\", iri: `${NS.foaf}primaryTopic` },\n // Dropped by ADR 01011 as \"near-universally 0% noise\", which was true on the\n // monolingual corpora it was measured against and false the moment language\n // means something. Restored by ADR 01037, which made it a scope dimension:\n // an unlabelled document in a translated corpus cannot be filtered, indexed\n // per locale, or counted against the right audience.\n { field: \"language\", iri: `${NS.dcterms}language` },\n // The iiRDS typing added in Phases 2–4. Coverage predates all of it, so the\n // measure of \"what a graph-side consumer can see\" was silent about the\n // vocabulary the project spent four phases adding (ADR 01029).\n { field: \"type\", iri: IIRDS_HAS_TOPIC_TYPE },\n { field: \"applies-to\", iri: IIRDS_RELATES_TO_PRODUCT_VARIANT },\n {\n field: \"about-product-lifecycle\",\n iri: IIRDS_RELATES_TO_LIFECYCLE_PHASE,\n },\n { field: \"about-product-aspect\", iri: IIRDS_HAS_SUBJECT },\n];\n\n/**\n * Section-level coverage: the fields a `graph.sections` block can attach\n * (ADR 01013), measured over `graph:Section` nodes.\n *\n * Sections are explicit-only — a section gets exactly what its own block\n * declares and nothing from its document — so these numbers are low by\n * construction on most corpora. That is the point: the granularity golden rule\n * says content granularity must match node granularity, and this is the number\n * that says whether it does.\n *\n * `label` is absent deliberately: ADR 01013 rejected `prefLabel` at section\n * level as meaningless, so it cannot be missing.\n */\n/** Section-attachable field NAMES; the IRIs come from COVERAGE_FIELDS, so a\n * namespace revision cannot move one table and not the other. */\nconst SECTION_FIELD_NAMES: readonly string[] = [\n \"type\",\n \"applies-to\",\n \"about-product-lifecycle\",\n \"about-product-aspect\",\n \"subject\",\n];\n\nexport const SECTION_COVERAGE_FIELDS: readonly CoverageField[] =\n SECTION_FIELD_NAMES.map((name) => {\n const field = COVERAGE_FIELDS.find((f) => f.field === name);\n /* c8 ignore next 3 -- unreachable while the two lists agree, which the\n drift guard in test/unit/schema-sync.test.ts keeps true. */\n if (field === undefined) {\n throw new Error(\n `SECTION_FIELD_NAMES names ${name}, which COVERAGE_FIELDS does not define`,\n );\n }\n return field;\n });\n\n/** The measured field names, in report order. */\nexport const COVERAGE_FIELD_NAMES: readonly string[] = COVERAGE_FIELDS.map(\n (f) => f.field,\n);\n\n/**\n * The two negative predicates (ADR 01014) are deliberately not measured.\n *\n * Coverage answers \"what can a consumer see that the author lifted\". A document\n * with no `not-applicable-to` is not under-annotated — under open-world\n * semantics its absence means *unknown*, which is the normal and correct state\n * for almost every document. Counting it as a gap would put every healthy\n * corpus permanently near zero on two rows and teach readers to ignore the\n * table.\n */\nexport const UNMEASURED_BY_DESIGN: readonly string[] = [\n \"not-applicable-to\",\n \"not-about-product-aspect\",\n];\n","/**\n * The embedder seam (ADR 01020). Platform-neutral and dependency-free, so the\n * runtime and the CLI can both speak it without either pulling in a model.\n *\n * Everything that computes embeddings — the local transformers.js embedder, the\n * deterministic mock, or a host's own — implements `Embedder`.\n */\n\nexport interface Embedder {\n /** Stable identity of the model; recorded in the sidecar header. */\n readonly model: string;\n /** Weight quantization the vectors were produced under. */\n readonly dtype: string;\n /** Output dimensions. Never assumed by callers — always read from here. */\n readonly dims: number;\n /**\n * Embed one text. Single-text rather than batched **on purpose**: float\n * addition is not associative, so a batched vector depends on what it was\n * batched with, and adding one document would perturb its neighbours' vectors\n * (ADR 01020). Determinism is worth more here than throughput.\n */\n embed(text: string): Promise<Float32Array>;\n}\n\n/**\n * A model's quirks, applied on both the build and query sides so a user cannot\n * get them wrong. Some models require a prefix on queries and/or passages and\n * degrade *silently* without it.\n */\nexport interface ModelProfile {\n /** Hugging Face repo id. */\n id: string;\n /** Prepended when embedding a search query. */\n queryPrefix?: string;\n /** Prepended when embedding indexed content. */\n passagePrefix?: string;\n /** Human note surfaced in docs and `--help`. */\n note?: string;\n}\n\n/** What a text is being embedded *for* — decides which prefix applies. */\nexport type EmbedRole = \"query\" | \"passage\";\n\n/**\n * Models dockg has been tested against. This is the *tested* set, not the\n * permitted set: `embed.model` accepts any id, and an unknown one is used\n * as-is with no prefixes.\n */\n/**\n * The default, named rather than found at index 0: `DEFAULT_MODEL` below then\n * reads it directly instead of asserting that the list has a first element.\n */\nconst DEFAULT_PROFILE: ModelProfile = {\n id: \"onnx-community/granite-embedding-small-english-r2-ONNX\",\n note: \"Default. 384-d, 8192-token context so sections are never truncated; no prefixes.\",\n};\n\nexport const MODEL_PROFILES: readonly ModelProfile[] = [\n DEFAULT_PROFILE,\n {\n id: \"Xenova/gte-small\",\n note: \"Lighter (~34 MB). 384-d, 512-token context; no prefixes.\",\n },\n {\n id: \"Xenova/bge-small-en-v1.5\",\n queryPrefix: \"Represent this sentence for searching relevant passages: \",\n note: \"384-d. Needs a query prefix — applied automatically here, since omitting it degrades retrieval silently.\",\n },\n {\n id: \"Xenova/all-MiniLM-L6-v2\",\n note: \"Smallest (~23 MB) but truncates at 256 wordpieces (~190 words), so long sections lose their tail.\",\n },\n];\n\nexport const DEFAULT_MODEL = DEFAULT_PROFILE.id;\n\n/** The profile for a model id, or a bare profile when it is not a tested one. */\nexport function profileFor(id: string): ModelProfile {\n return MODEL_PROFILES.find((p) => p.id === id) ?? { id };\n}\n\n/** Apply the model's prefix convention for the role, if it has one. */\nexport function withPrefix(\n profile: ModelProfile,\n role: EmbedRole,\n text: string,\n): string {\n const prefix = role === \"query\" ? profile.queryPrefix : profile.passagePrefix;\n return prefix ? `${prefix}${text}` : text;\n}\n","/**\n * The ordering primitive behind the determinism contract. Every sort that\n * reaches output — the file list, emitted subjects/predicates/objects, query\n * results — must go through this comparator so ordering never depends on\n * locale, ICU version, or platform, the way `String.prototype.localeCompare`\n * and `Array.prototype.sort`'s default string coercion do.\n */\n\n/** Locale-independent code-unit comparison for stable sorting. */\nexport function byCodeUnit(a: string, b: string): number {\n return a < b ? -1 : a > b ? 1 : 0;\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/shared/exec.ts","../src/docevals/judge/budget.ts"],"sourcesContent":["/**\n * Process execution for every grader in the family that runs a program. The\n * implementation lives in `@hawkeyexl/inference`: the judge's subprocess\n * provider and the command graders were running copies of the same\n * cross-spawn wrapper, and the Windows-specific parts (npm `.cmd` shim\n * resolution without `shell: true`, stdin piping past the ~32K command-line\n * limit, and StringDecoder-backed output so multi-byte UTF-8 survives chunk\n * boundaries) are exactly the parts worth having in one place.\n *\n * Shared rather than per domain: `manni docevals` and `manni tracevals` both\n * run `command` evals, and both reach the OS through this one wrapper.\n */\nimport type { ExecResult } from \"@hawkeyexl/inference\";\n\nexport { realExec } from \"@hawkeyexl/inference\";\n\n/** Truncate command output for finding messages. */\nexport function outputTail(result: ExecResult, maxChars = 400): string {\n const text = (result.stderr.trim() || result.stdout.trim()).trim();\n if (text.length <= maxChars) return text;\n return `…${text.slice(-maxChars)}`;\n}\n\n/**\n * How a finished process is described in a finding: \"exited 2\", or the truth\n * when there was no exit code.\n *\n * `code` is null when the process was killed by a signal rather than exiting.\n * \"exited null\" describes nothing a reader can act on, and it is the case a\n * timeout produces — so it is the one worth naming.\n */\nexport function exited(code: number | null): string {\n return code === null ? \"was killed before exiting\" : `exited ${code}`;\n}\n","/**\n * The turn-budget skip marker (ADR 01019), in one place.\n *\n * `judge.ts` produces the skip reason; `core/engine.ts` and `commands/\n * calibrate.ts` both have to tell a budget truncation apart from every other\n * reason an eval went unjudged, because that distinction is what stops a\n * partial run from reporting as a complete one. They did it by matching the\n * bare substring `\"turn budget\"` against a message written in a third file,\n * so a reword in the producer would have left both detectors matching nothing\n * — silently, since the tests that exercise truncation supply the skip reason\n * themselves rather than getting it from the judge.\n *\n * Kept in its own module rather than exported from `judge.ts`: the detectors\n * need the marker, not the judge, and `engine.ts` deliberately takes the judge\n * by injection.\n */\n\n/** The substring every budget-truncation skip reason carries. */\nexport const TURN_BUDGET_SKIP = \"turn budget\";\n\n/** The skip reason recorded for an eval the budget stopped before dispatch. */\nexport function turnBudgetSkipReason(maxTurns: number): string {\n return `judge ${TURN_BUDGET_SKIP} exhausted (${maxTurns})`;\n}\n\n/**\n * Whether a skip reason is the budget's doing rather than the judge's.\n *\n * A type predicate, not a plain boolean: a budget skip always carries a\n * reason, and callers interpolate it into the message they report.\n */\nexport function isTurnBudgetSkip(reason: string | undefined): reason is string {\n return reason !== undefined && reason.includes(TURN_BUDGET_SKIP);\n}\n"],"mappings":";;;AAcA,SAAS,gBAAgB;AAGlB,SAAS,WAAW,QAAoB,WAAW,KAAa;AACrE,QAAM,QAAQ,OAAO,OAAO,KAAK,KAAK,OAAO,OAAO,KAAK,GAAG,KAAK;AACjE,MAAI,KAAK,UAAU,SAAU,QAAO;AACpC,SAAO,SAAI,KAAK,MAAM,CAAC,QAAQ,CAAC;AAClC;;;ACHO,IAAM,mBAAmB;AAGzB,SAAS,qBAAqB,UAA0B;AAC7D,SAAO,SAAS,gBAAgB,eAAe,QAAQ;AACzD;AAQO,SAAS,iBAAiB,QAA8C;AAC7E,SAAO,WAAW,UAAa,OAAO,SAAS,gBAAgB;AACjE;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/family/cli.ts","../src/family/core/envelope.ts","../src/family/core/in-play.ts","../src/family/commands/check.ts","../src/family/core/changed.ts","../src/family/core/said-once.ts","../src/family/commands/status.ts"],"sourcesContent":["/**\n * The two family verbs, `manni check` and `manni status`, mounted on the\n * umbrella with `addCommand`. They are the only verbs it carries: each\n * orchestrates other domains' command cores and owns no checks of its own.\n *\n * Run by hand or in CI they follow the family contract: 0 clean, 1 errors, 2\n * operational, the report on stdout and notices on stderr. Under a Claude\n * Code hook envelope on stdin they speak the hook protocol instead, which\n * changes where output goes and what the exit code means, never what is\n * checked beyond the scope.\n */\nimport { resolve } from \"node:path\";\nimport { Command, Option } from \"commander\";\nimport { shouldColor } from \"../shared/color.js\";\nimport { errorMessage } from \"../shared/errors.js\";\nimport { programName } from \"../shared/program-name.js\";\nimport { fail } from \"../shared/run.js\";\nimport { notice } from \"../shared/warn.js\";\nimport { readEnvelope, type Envelope } from \"./core/envelope.js\";\nimport { FamilyError, labelFrom } from \"./core/in-play.js\";\nimport {\n CHECK_FORMATS,\n EDIT_TOOLS,\n exitCodeFor,\n hookFailure,\n hookReply,\n render,\n runFamilyCheck,\n runTurnCheck,\n turnReply,\n type CheckFormat,\n type FamilyCheckRun,\n type HookReply,\n type Scope,\n} from \"./commands/check.js\";\nimport {\n STATUS_FORMATS,\n agentLines,\n exportGeneratedBy,\n renderStatus,\n runStatus,\n type StatusFormat,\n} from \"./commands/status.js\";\n\ninterface CheckCliOptions {\n config?: string;\n format: CheckFormat;\n /** `--no-color`: `false` when given. */\n color: boolean;\n}\n\ninterface StatusCliOptions {\n config?: string;\n format: StatusFormat;\n}\n\nfunction send(reply: HookReply): void {\n if (reply.stdout !== undefined) process.stdout.write(reply.stdout);\n if (reply.stderr !== undefined) process.stderr.write(reply.stderr);\n process.exitCode = reply.exitCode;\n}\n\n/**\n * The file checks a hook asks for, or `undefined` when this event runs none.\n * A SubagentStop runs none: its subagent's turn is judged alone.\n */\nexport function hookScope(envelope: Envelope, cwd: string): { scope: Scope; file?: string } | undefined {\n if (envelope.event === \"Stop\") return { scope: { kind: \"changed\" } };\n if (envelope.event !== \"PostToolUse\") return undefined;\n if (envelope.toolName === undefined || !EDIT_TOOLS.includes(envelope.toolName)) return undefined;\n if (envelope.filePath === undefined) return undefined;\n const file = labelFrom(cwd, resolve(cwd, envelope.filePath));\n return { scope: { kind: \"paths\", paths: [file] }, file };\n}\n\n/** The events that end a turn, which tracevals judges (proposal 0079). */\nconst TURN_EVENTS: readonly string[] = [\"Stop\", \"SubagentStop\"];\n\nasync function checkUnderHook(paths: string[], options: CheckCliOptions, envelope: Envelope): Promise<void> {\n const cwd = resolve(envelope.cwd ?? process.cwd());\n // Positional paths win over the envelope's own scope.\n const asked: { scope: Scope; file?: string } | undefined =\n paths.length > 0 ? { scope: { kind: \"paths\", paths }, file: paths.join(\", \") } : hookScope(envelope, cwd);\n const turnEvent = TURN_EVENTS.includes(envelope.event);\n if (asked === undefined && !turnEvent) return;\n let run: FamilyCheckRun | undefined;\n if (asked !== undefined) {\n try {\n run = await runFamilyCheck({\n cwd,\n scope: asked.scope,\n allowMissing: true,\n ...(options.config === undefined ? {} : { configPath: options.config }),\n // stdout and stderr are the hook's channels; a notice is not for the agent.\n onNotice: () => undefined,\n });\n } catch (err) {\n // Nothing set up for the file checks is not the end of a turn's judgement.\n if (!(err instanceof FamilyError && err.quiet) && !turnEvent) {\n send(hookFailure(errorMessage(err), envelope, asked.file));\n return;\n }\n }\n }\n if (!turnEvent) {\n if (run !== undefined) send(hookReply(run, envelope));\n return;\n }\n send(turnReply(run, await runTurnCheck(envelope, cwd), envelope));\n}\n\nexport function buildCheck(): Command {\n return new Command(\"check\")\n .description(\"Run every check this repository has set up, and nothing else\")\n .argument(\"[paths...]\", \"files, directories, or globs; the per-file checks run on the collection members among them\")\n .option(\"-c, --config <path>\", \"path to a manni config file\")\n .addOption(\n new Option(\"-f, --format <format>\", \"output (not read under a hook)\")\n .choices(CHECK_FORMATS)\n .default(\"pretty\"),\n )\n .option(\"--no-color\", \"disable colored output\")\n .showHelpAfterError(\"(add --help for usage)\")\n .exitOverride()\n .addHelpText(\n \"after\",\n [\n \"\",\n \"Examples:\",\n \" manni check # every in-play check, the CI gate\",\n \" manni check docs/limits.md # per-file checks on one page\",\n \" manni check -f github # in a GitHub workflow\",\n \" manni check docs/ -f json # scripting form\",\n ].join(\"\\n\"),\n )\n .action(async (paths: string[], options: CheckCliOptions) => {\n const envelope = await readEnvelope();\n if (envelope !== undefined) {\n await checkUnderHook(paths, options, envelope);\n return;\n }\n try {\n const run = await runFamilyCheck({\n scope: paths.length > 0 ? { kind: \"paths\", paths } : { kind: \"all\" },\n ...(options.config === undefined ? {} : { configPath: options.config }),\n onNotice: notice,\n });\n for (const check of run.checks) {\n if (check.status === \"error\") {\n process.stderr.write(`${programName()} ${check.command} could not run: ${check.message}\\n`);\n }\n }\n const color = shouldColor({ noColor: !options.color, isTTY: process.stdout.isTTY });\n const text = render(run, options.format, color);\n if (text.length > 0) process.stdout.write(`${text}\\n`);\n process.exitCode = exitCodeFor(run);\n } catch (err) {\n fail(err);\n }\n });\n}\n\nexport function buildStatus(): Command {\n return new Command(\"status\")\n .description(\"Say what is set up here, and so what manni check runs\")\n .option(\"-c, --config <path>\", \"path to a manni config file\")\n .addOption(\n new Option(\"-f, --format <format>\", \"output\").choices(STATUS_FORMATS).default(\"pretty\"),\n )\n .showHelpAfterError(\"(add --help for usage)\")\n .exitOverride()\n .action(async (options: StatusCliOptions) => {\n const envelope = await readEnvelope();\n const configOption = options.config === undefined ? {} : { configPath: options.config };\n if (envelope?.event === \"SessionStart\") {\n try {\n const report = await runStatus({ cwd: resolve(envelope.cwd ?? process.cwd()), ...configOption });\n // The agent lines promise checks, so they need a domain in play to be true.\n const lines = report.domains.some((d) => d.status === \"in-play\") ? `\\n\\n${agentLines(report)}` : \"\";\n process.stdout.write(`${renderStatus(report, \"pretty\")}${lines}\\n`);\n exportGeneratedBy(envelope);\n } catch {\n // No config, or one that cannot be read: the session starts without a word.\n }\n return;\n }\n try {\n const report = await runStatus(configOption);\n process.stdout.write(`${renderStatus(report, options.format)}\\n`);\n } catch (err) {\n fail(err);\n }\n });\n}\n","/**\n * The Claude Code hook envelope, detected rather than switched.\n *\n * A hook command gets one JSON object on stdin, and Claude Code closes the\n * stream after it. When stdin is not a terminal and parses as an object with a\n * string `hook_event_name`, `manni check` and `manni status` speak the hook\n * protocol. Anything else is a run by hand, and stdin is left unread beyond\n * that one look. The look never hangs: `readStdin` gives up on a stream that\n * stays silent, which is what an inherited pipe nobody writes to looks like.\n */\nimport { readStdin } from \"../../tracevals/capture/hook.js\";\n\nexport interface Envelope {\n /** `hook_event_name`: `PostToolUse`, `Stop`, `SessionStart`, … */\n event: string;\n /** The directory the hook fired in; relative paths resolve from it. */\n cwd?: string;\n /** `tool_name`, on a tool event. */\n toolName?: string;\n /** `tool_input.file_path`, or `tool_input.notebook_path` for a notebook. */\n filePath?: string;\n /** `stop_hook_active`: this stop already follows one repair pass. */\n stopHookActive: boolean;\n /** `model`, on `SessionStart`: a string, or an object carrying `id`. */\n model?: string;\n /** `session_id`. */\n sessionId?: string;\n /** `transcript_path`: the session's own transcript. */\n transcriptPath?: string;\n /** `agent_transcript_path`, on `SubagentStop`: the subagent's own transcript. */\n agentTranscriptPath?: string;\n /** `agent_id`, on `SubagentStop`. */\n agentId?: string;\n /** `agent_type`, on `SubagentStop`. */\n agentType?: string;\n /** `last_assistant_message`, on `Stop` and `SubagentStop`. */\n lastAssistantMessage?: string;\n}\n\nfunction str(value: unknown): string | undefined {\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction record(value: unknown): Record<string, unknown> | undefined {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\n/** The envelope in `text`, or `undefined` when `text` is not one. */\nexport function parseEnvelope(text: string): Envelope | undefined {\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch {\n return undefined;\n }\n const doc = record(parsed);\n const event = str(doc?.hook_event_name);\n if (doc === undefined || event === undefined) return undefined;\n const input = record(doc.tool_input);\n const filePath = str(input?.file_path) ?? str(input?.notebook_path);\n const cwd = str(doc.cwd);\n const toolName = str(doc.tool_name);\n const model = str(doc.model) ?? str(record(doc.model)?.id);\n const strings = {\n sessionId: str(doc.session_id),\n transcriptPath: str(doc.transcript_path),\n agentTranscriptPath: str(doc.agent_transcript_path),\n agentId: str(doc.agent_id),\n agentType: str(doc.agent_type),\n lastAssistantMessage: str(doc.last_assistant_message),\n };\n const given = Object.fromEntries(Object.entries(strings).filter(([, v]) => v !== undefined)) as Partial<\n Record<keyof typeof strings, string>\n >;\n return {\n event,\n stopHookActive: doc.stop_hook_active === true,\n ...(cwd === undefined ? {} : { cwd }),\n ...(toolName === undefined ? {} : { toolName }),\n ...(filePath === undefined ? {} : { filePath }),\n ...(model === undefined ? {} : { model }),\n ...given,\n };\n}\n\n/** The envelope on stdin, or `undefined` for a run by hand. */\nexport async function readEnvelope(\n stream: NodeJS.ReadStream = process.stdin,\n): Promise<Envelope | undefined> {\n if (stream.isTTY) return undefined;\n try {\n return parseEnvelope(await readStdin(stream));\n } catch {\n // Too large to be an envelope: a run by hand with something piped in.\n return undefined;\n }\n}\n","/**\n * What is set up, and so what `manni check` runs.\n *\n * There are no keys of the family's own. A domain is in play when its own\n * section of `manni.config.yaml` exists, or when the content carries its\n * declarations. Nothing manni would apply by default counts as set up:\n *\n * | Domain | In play when |\n * |---|---|\n * | meta | a file's schema set is more than the built-in defaults: `meta:` covers it, or it names its own `$schema` |\n * | cite | a page carries citations |\n * | lint | `lint:` exists |\n * | docevals | a page resolves evals, from `docevals:` or its own declarations |\n * | term | the collections hold a term |\n * | graph | `graph:` exists |\n * | tracevals | `tracevals.runtime` exists; it judges the turn a Stop or SubagentStop hook ends |\n * | a11y | never run by `check`: it needs a running site |\n *\n * Only members of a declared collection are file-checked. tracevals judges a\n * turn, not files, so it needs no collection.\n */\nimport { relative, resolve, sep } from \"node:path\";\nimport { parse as parseYaml } from \"yaml\";\nimport type { CollectionConfig } from \"../../shared/collections.js\";\nimport {\n findFamilyConfigFile,\n readFamilyConfigFile,\n type ConfigFile,\n} from \"../../shared/config-file.js\";\nimport { ToolError } from \"../../shared/errors.js\";\nimport { memberOf, retainMembers } from \"../../meta/core/collections.js\";\nimport { resolveTargetSet } from \"../../meta/internal.js\";\n\n/** An operational error of `manni check` or `manni status`: exit 2. */\nexport class FamilyError extends ToolError {\n constructor(\n message: string,\n /** Set for the two conditions a hook answers with silence. */\n readonly quiet = false,\n ) {\n super(message);\n this.name = \"FamilyError\";\n }\n}\n\nexport function noConfigError(cwd: string): FamilyError {\n return new FamilyError(\n `No manni.config.yaml found from ${cwd} up to the repository root. manni check runs the checks it sets up.`,\n true,\n );\n}\n\nexport function nothingSetUpError(): FamilyError {\n return new FamilyError(\n \"Nothing is set up to check in manni.config.yaml. manni status says what each domain needs.\",\n true,\n );\n}\n\n/** The domains `check` can run, in the order it runs and reports them. */\nexport const DOMAINS = [\"meta\", \"cite\", \"lint\", \"docevals\", \"term\", \"graph\"] as const;\nexport type Domain = (typeof DOMAINS)[number];\n\n/** Each domain's check, as `check` names it. */\nexport const COMMANDS: Readonly<Record<Domain, string>> = {\n meta: \"meta validate\",\n cite: \"cite check\",\n lint: \"lint check\",\n docevals: \"docevals run\",\n term: \"term check\",\n graph: \"graph check\",\n};\n\n/** Why a domain is not in play, as both `check` and `status` say it. */\nexport const NOT_SET_UP: Readonly<Record<Domain, string>> = {\n meta: \"no meta: section\",\n cite: \"no page carries citations\",\n lint: \"no lint: section\",\n docevals: \"no page resolves any evals\",\n term: \"no terms in any collection\",\n graph: \"no graph: section\",\n};\n\n/** Why `meta` skips files when `meta:` exists but covers none of them. */\nexport const META_DEFAULTS_ONLY = \"only the built-in default schemas cover these files\";\n\n/**\n * The domains `check` does not run here, and what to run instead. tracevals\n * leaves this list when `tracevals.runtime` exists (`Family.runtime`).\n */\nexport const NOT_CHECKED: ReadonlyArray<readonly [string, string]> = [\n [\"a11y\", \"run manni site preview, then manni a11y check\"],\n [\"tracevals\", \"run manni tracevals run over sessions\"],\n];\n\n/** `1 page`, `2 pages`. */\nexport function plural(n: number, one: string, many = `${one}s`): string {\n return `${String(n)} ${n === 1 ? one : many}`;\n}\n\nexport interface Family {\n file: ConfigFile;\n /**\n * The config each domain core is handed, so every one reads this file\n * rather than discovering its own: as typed, or as discovery found it,\n * relative to `cwd`.\n */\n configPath: string;\n /** The top-level keys of the file: `meta`, `lint`, `graph`, … */\n sections: ReadonlySet<string>;\n /** `tracevals.runtime` exists: tracevals judges each turn under the hooks. */\n runtime: boolean;\n collections: readonly CollectionConfig[];\n}\n\nfunction toError(message: string): FamilyError {\n return new FamilyError(message);\n}\n\nexport async function loadFamily(cwd: string, configPath?: string): Promise<Family> {\n const file =\n configPath === undefined\n ? await findFamilyConfigFile(cwd, toError)\n : await readFamilyConfigFile(configPath, cwd, toError);\n if (file === null) throw noConfigError(cwd);\n // Already parsed once by the loader, which would have thrown on bad YAML.\n const doc = parseYaml(file.text) as unknown;\n const top = record(doc);\n const sections = new Set(top === undefined ? [] : Object.keys(top));\n const tracevals = record(top?.tracevals);\n // The old `conformance` key counts too. tracevals' loader refuses it and\n // names `runtime`, and only a tracevals in play loads that config, so a\n // config not yet migrated reaches `status` as an error, not as a silent skip.\n const runtime = tracevals?.runtime !== undefined || tracevals?.conformance !== undefined;\n return { file, configPath: configPath ?? file.source, sections, runtime, collections: file.collections };\n}\n\nfunction record(value: unknown): Record<string, unknown> | undefined {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\n/** A path as a label relative to `cwd`, posix, the way the domains print one. */\nexport function labelFrom(cwd: string, path: string): string {\n return relative(cwd, path).split(sep).join(\"/\");\n}\n\n/** The collections a file at `label` (relative to `cwd`) belongs to. */\nexport function collectionsOf(family: Family, cwd: string, label: string): string[] {\n return memberOf(family.collections, family.file.dir, cwd, label);\n}\n\n/** Every member of every collection, labelled from `cwd`. */\nexport async function listMembers(family: Family, cwd: string): Promise<string[]> {\n const dir = family.file.dir;\n const { files } = await resolveTargetSet({\n inputs: family.collections.flatMap((c) => c.paths),\n cwd: dir,\n allowEmpty: true,\n });\n return retainMembers(files, (label) => memberOf(family.collections, dir, dir, label)).map(\n (label) => labelFrom(cwd, resolve(dir, label)),\n );\n}\n","/**\n * `manni check`: every check the repository has set up, and nothing else.\n *\n * It owns no checks. Each one is a domain's own command core, run in process\n * with the family config handed to it, and each report is that domain's own\n * reporter's output. What this adds is the choice of what runs (`in-play.ts`),\n * the scope, and one verdict over all of it.\n *\n * Scope:\n *\n * - `all`: every in-play check over every collection, per-file and set-wide.\n * Each domain runs bare, exactly as its own CI step would.\n * - `paths`: the per-file checks on the collection members among the paths.\n * - `changed`: the per-file checks on the git working tree's changes, plus\n * `cite` set-wide. `term` runs set-wide too when a collection document\n * changed or was removed. `graph` never runs here; only `all` checks it.\n * A clean tree runs nothing.\n *\n * `cite` is per-file on paths and set-wide otherwise: a source edit can drift\n * any page's citation, so after a session the whole set is what is checked.\n */\nimport { basename, extname, resolve } from \"node:path\";\nimport pkg from \"../../../package.json\" with { type: \"json\" };\nimport { ToolError, errorMessage } from \"../../shared/errors.js\";\nimport { warn } from \"../../shared/warn.js\";\nimport { resolveTargetSet } from \"../../meta/internal.js\";\nimport { supportedExtensions } from \"../../meta/extractors/index.js\";\nimport type { TurnCheckInput, TurnCheckResult } from \"../../tracevals/commands/check.js\";\nimport { changedFiles } from \"../core/changed.js\";\nimport { sayOnce } from \"../core/said-once.js\";\nimport type { Envelope } from \"../core/envelope.js\";\nimport {\n COMMANDS,\n DOMAINS,\n META_DEFAULTS_ONLY,\n NOT_SET_UP,\n collectionsOf,\n labelFrom,\n listMembers,\n loadFamily,\n nothingSetUpError,\n plural,\n type Domain,\n type Family,\n} from \"../core/in-play.js\";\nimport { withSharedWalks } from \"../../meta/core/load-files.js\";\n\nexport const CHECK_FORMATS = [\"pretty\", \"json\", \"github\"] as const;\nexport type CheckFormat = (typeof CHECK_FORMATS)[number];\n\nexport type Scope =\n | { kind: \"all\" }\n | { kind: \"paths\"; paths: string[] }\n | { kind: \"changed\" };\n\nexport interface FamilyCheckOptions {\n /** Where paths resolve and the domains run. Default `process.cwd()`. */\n cwd?: string;\n /** `-c, --config`. */\n configPath?: string;\n scope: Scope;\n /**\n * Leave out a named path that does not exist, rather than failing on it. A\n * hook names a file the edit may have just removed.\n */\n allowMissing?: boolean;\n /** Diagnostics: the outside-every-collection notice, and the domains' own. */\n onNotice?: (message: string) => void;\n}\n\n/** A check that ran. `render` is the domain's own reporter. */\nexport interface RanCheck {\n command: string;\n status: \"pass\" | \"fail\";\n render: (format: CheckFormat, color: boolean) => string;\n}\n\n/** A check that did not run: not in play, or it could not. */\nexport interface NotRunCheck {\n command: string;\n status: \"skipped\" | \"error\";\n message: string;\n}\n\nexport type CheckOutcome = RanCheck | NotRunCheck;\n\nexport interface FamilyCheckRun {\n status: \"pass\" | \"fail\";\n /** The collection members the per-file checks covered, labelled from `cwd`. */\n files: string[];\n checks: CheckOutcome[];\n}\n\ntype Outcome =\n | { skipped: string }\n | { failed: boolean; render: (format: CheckFormat, color: boolean) => string };\n\ninterface Context {\n family: Family;\n cwd: string;\n /** The per-file inputs, or `[]` for a bare run over the collections. */\n inputs: string[];\n onNotice: (message: string) => void;\n}\n\n/**\n * Each domain's command core and reporter are imported where it runs: a hook\n * checks one page with four domains, and the other two (the RDF stack among\n * them) are worth not loading.\n */\nasync function runDomain(domain: Domain, ctx: Context): Promise<Outcome> {\n const { family, cwd, inputs, onNotice } = ctx;\n const configPath = family.configPath;\n switch (domain) {\n case \"meta\": {\n const [{ runValidate }, { render: renderMeta }] = await Promise.all([\n import(\"../../meta/commands/validate.js\"),\n import(\"../../meta/reporters/index.js\"),\n ]);\n const run = await runValidate({ inputs, configPath, cwd, skipDefaultOnly: true, onNotice });\n if (run.results.length === 0) {\n return { skipped: family.sections.has(\"meta\") ? META_DEFAULTS_ONLY : NOT_SET_UP.meta };\n }\n return {\n failed: run.summary.failed > 0,\n render: (format, color) =>\n renderMeta(format, run.results, run.summary, { color, quiet: true, frame: run.frame, onNotice }),\n };\n }\n case \"cite\": {\n const [{ runCheck: runCite }, { renderCheckPretty: citePretty }, { renderCheckJson: citeJson }, { renderCheckGithub: citeGithub }] =\n await Promise.all([\n import(\"../../cite/commands/check.js\"),\n import(\"../../cite/reporters/pretty.js\"),\n import(\"../../cite/reporters/json.js\"),\n import(\"../../cite/reporters/github.js\"),\n ]);\n const run = await runCite({ inputs, configPath, cwd, onNotice });\n if (!run.pages.some((p) => p.citations.length > 0 || p.findings.length > 0)) {\n return { skipped: NOT_SET_UP.cite };\n }\n return {\n failed: run.summary.failed > 0,\n render: (format, color) =>\n format === \"json\"\n ? citeJson(run)\n : format === \"github\"\n ? citeGithub(run)\n : citePretty(run, { color, quiet: true }),\n };\n }\n case \"lint\": {\n if (!family.sections.has(\"lint\")) return { skipped: NOT_SET_UP.lint };\n const [{ runLint }, { render: renderLint }] = await Promise.all([\n import(\"../../lint/commands/lint.js\"),\n import(\"../../lint/reporters/index.js\"),\n ]);\n const run = await runLint({ inputs, configPath, cwd, onNotice });\n return {\n failed: run.summary.failed > 0,\n render: (format, color) => renderLint(run, format, { color }),\n };\n }\n case \"docevals\": {\n const [{ runRun: runDocevals }, { render: renderDocevals }, { DocevalsError }] = await Promise.all([\n import(\"../../docevals/commands/run.js\"),\n import(\"../../docevals/reporters/index.js\"),\n import(\"../../docevals/types.js\"),\n ]);\n let report;\n try {\n report = await runDocevals(inputs, {\n config: configPath,\n cwd,\n deterministicOnly: true,\n generate: false,\n execution: false,\n toolVersion: pkg.version,\n });\n } catch (err) {\n if (err instanceof DocevalsError && err.code === \"nothing-resolved\") {\n return { skipped: NOT_SET_UP.docevals };\n }\n throw err;\n }\n return {\n failed: report.exitCode !== 0,\n render: (format, color) => renderDocevals(report, format, { color }),\n };\n }\n case \"term\": {\n const [{ runCheck: runTerm }, { renderFindingsPretty: termPretty }, { renderFindingsJson: termJson }, { renderFindingsGithub: termGithub }] =\n await Promise.all([\n import(\"../../term/commands/check.js\"),\n import(\"../../term/reporters/pretty.js\"),\n import(\"../../term/reporters/json.js\"),\n import(\"../../term/reporters/github.js\"),\n ]);\n const report = await runTerm({ inputs, configPath, cwd, allowEmpty: true, onNotice });\n if (report.terms === 0) return { skipped: NOT_SET_UP.term };\n return {\n failed: report.summary.failed > 0,\n render: (format, color) =>\n format === \"json\"\n ? termJson(report)\n : format === \"github\"\n ? termGithub(report)\n : termPretty(report, { color, references: true }),\n };\n }\n case \"graph\": {\n if (!family.sections.has(\"graph\")) return { skipped: NOT_SET_UP.graph };\n const [{ buildGraph }, { runCheck: runGraph, renderCheck: renderGraph }] = await Promise.all([\n import(\"../../graph/commands/build.js\"),\n import(\"../../graph/commands/check.js\"),\n ]);\n const built = await buildGraph({ config: configPath, cwd });\n for (const warning of built.warnings) onNotice(warning);\n const report = await runGraph({ config: configPath, cwd, turtle: built.turtle });\n return {\n failed: report.exitCode !== 0,\n render: (format) => renderGraph(report, format),\n };\n }\n }\n}\n\nasync function outcome(domain: Domain, ctx: Context): Promise<CheckOutcome> {\n const command = COMMANDS[domain];\n try {\n const result = await runDomain(domain, ctx);\n if (\"skipped\" in result) return { command, status: \"skipped\", message: result.skipped };\n return { command, status: result.failed ? \"fail\" : \"pass\", render: result.render };\n } catch (err) {\n return { command, status: \"error\", message: errorMessage(err) };\n }\n}\n\n/** A hook or a git status names files by any extension; a walk keeps the documents. */\nfunction isDocument(label: string): boolean {\n return supportedExtensions().includes(extname(label).toLowerCase());\n}\n\n/** Every domain walks the same collections, so the run shares one walk per target set. */\nexport function runFamilyCheck(opts: FamilyCheckOptions): Promise<FamilyCheckRun> {\n return withSharedWalks(() => checkUnshared(opts));\n}\n\nasync function checkUnshared(opts: FamilyCheckOptions): Promise<FamilyCheckRun> {\n const cwd = resolve(opts.cwd ?? process.cwd());\n const onNotice = opts.onNotice ?? ((): void => undefined);\n const family = await loadFamily(cwd, opts.configPath);\n if (family.collections.length === 0) throw nothingSetUpError();\n const isMember = (label: string): boolean => collectionsOf(family, cwd, label).length > 0;\n\n let files: string[];\n let domains: Domain[];\n let inputs: string[];\n switch (opts.scope.kind) {\n case \"all\":\n files = await listMembers(family, cwd);\n inputs = [];\n domains = [...DOMAINS];\n break;\n case \"paths\": {\n const { files: named } = await resolveTargetSet({\n inputs: opts.scope.paths,\n cwd,\n ...(opts.allowMissing === true ? { allowEmpty: true } : {}),\n });\n const outside = named.filter((label) => !isMember(label));\n if (outside.length > 0) {\n onNotice(`Skipped ${plural(outside.length, \"file\")} outside every collection: ${outside.join(\", \")}`);\n }\n // A collection globbed wide holds assets too; only documents are checked.\n files = named.filter((label) => isMember(label) && isDocument(label));\n inputs = files;\n domains = files.length > 0 ? [\"meta\", \"cite\", \"lint\", \"docevals\"] : [];\n break;\n }\n case \"changed\": {\n const changed = await changedFiles(cwd);\n if (!changed.dirty) return { status: \"pass\", files: [], checks: [] };\n const memberDocuments = (paths: string[]): string[] =>\n paths.map((path) => labelFrom(cwd, path)).filter((l) => isDocument(l) && isMember(l));\n files = memberDocuments(changed.files);\n inputs = files;\n // term reads only collection documents, so a session that changed or\n // removed none of them leaves the glossary as it was. graph never runs\n // here: it is the slowest set-wide check, and its findings span pages\n // rather than the one an agent just wrote, so a bare run (CI) owns it.\n const pageChanged = files.length > 0 || memberDocuments(changed.removed).length > 0;\n domains = [\n ...(files.length > 0 ? ([\"meta\", \"lint\", \"docevals\"] as const) : []),\n \"cite\",\n ...(pageChanged ? ([\"term\"] as const) : []),\n ];\n break;\n }\n }\n\n const checks: CheckOutcome[] = [];\n for (const domain of domains) {\n // The set-wide checks run bare, over every collection, whatever the scope.\n const setWide = domain === \"term\" || domain === \"graph\" || (domain === \"cite\" && opts.scope.kind !== \"paths\");\n checks.push(await outcome(domain, { family, cwd, inputs: setWide ? [] : inputs, onNotice }));\n }\n if (opts.scope.kind === \"all\" && checks.every((c) => c.status === \"skipped\")) {\n throw nothingSetUpError();\n }\n return { status: checks.some((c) => c.status === \"fail\") ? \"fail\" : \"pass\", files, checks };\n}\n\n/** The exit code a run by hand ends with: 2 when a check could not run. */\nexport function exitCodeFor(run: FamilyCheckRun): 0 | 1 | 2 {\n if (run.checks.some((c) => c.status === \"error\")) return 2;\n return run.status === \"fail\" ? 1 : 0;\n}\n\nfunction isRan(check: CheckOutcome): check is RanCheck {\n return check.status === \"pass\" || check.status === \"fail\";\n}\n\n/** The first line of a message, for a one-line context. */\nfunction firstLine(message: string): string {\n return message.split(\"\\n\", 1)[0] ?? \"\";\n}\n\n/** What an agent is handed when a hook blocks: the failing checks' reports, nothing else. */\nfunction renderFailures(run: FamilyCheckRun): string {\n return run.checks\n .filter((c): c is RanCheck => c.status === \"fail\")\n .map((c) => `${c.command}\\n${c.render(\"pretty\", false)}`)\n .join(\"\\n\\n\");\n}\n\nexport function renderPretty(run: FamilyCheckRun, color: boolean): string {\n const blocks: string[] = [];\n for (const check of run.checks) {\n if (isRan(check)) blocks.push(`${check.command}\\n${check.render(\"pretty\", color)}`);\n }\n const notRun = run.checks.filter((c): c is NotRunCheck => !isRan(c));\n if (notRun.length > 0) {\n const width = Math.max(...notRun.map((c) => c.command.length)) + 3;\n blocks.push(\n notRun\n .map((c) => `${c.status.padEnd(9)}${c.command.padEnd(width)}${firstLine(c.message)}`)\n .join(\"\\n\"),\n );\n }\n const count = (status: CheckOutcome[\"status\"]): number =>\n run.checks.filter((c) => c.status === status).length;\n const errors = count(\"error\");\n blocks.push(\n `${plural(run.checks.length, \"check\")} over ${plural(run.files.length, \"file\")}: ` +\n `${String(count(\"fail\"))} failed, ${String(count(\"skipped\"))} skipped` +\n (errors > 0 ? `, ${String(errors)} could not run` : \"\"),\n );\n return blocks.join(\"\\n\\n\");\n}\n\n/** A check's JSON entry: its own report, or why there is none. */\nfunction jsonEntry(c: CheckOutcome): object {\n if (!isRan(c)) return { command: c.command, status: c.status, message: c.message };\n try {\n return { command: c.command, status: c.status, report: JSON.parse(c.render(\"json\", false)) as unknown };\n } catch {\n // One reporter's bad output must not take the other checks' reports with it.\n // `error` on purpose, whatever the run's own status: with no report to\n // embed, a `pass` or `fail` here would be a verdict nobody can inspect.\n // The reference documents `error` for this case too.\n return { command: c.command, status: \"error\", message: `${c.command} -f json printed output that is not JSON` };\n }\n}\n\nexport function renderJson(run: FamilyCheckRun): string {\n return JSON.stringify(\n {\n status: run.status,\n files: run.files,\n checks: run.checks.map(jsonEntry),\n },\n null,\n 2,\n );\n}\n\nexport function renderGithub(run: FamilyCheckRun): string {\n return run.checks\n .filter(isRan)\n .map((c) => c.render(\"github\", false))\n .filter((text) => text.length > 0)\n .join(\"\\n\");\n}\n\nexport function render(run: FamilyCheckRun, format: CheckFormat, color: boolean): string {\n return format === \"json\" ? renderJson(run) : format === \"github\" ? renderGithub(run) : renderPretty(run, color);\n}\n\n/** What a hook command ends with: its exit code, and what it prints where. */\nexport interface HookReply {\n exitCode: 0 | 2;\n stdout?: string;\n stderr?: string;\n}\n\n/** The PostToolUse tools whose edit `check` answers. */\nexport const EDIT_TOOLS: readonly string[] = [\"Edit\", \"Write\", \"MultiEdit\", \"NotebookEdit\"];\n\n/**\n * The hook protocol's answer to a run. Never exit 2 for a check that could\n * not run: 2 means \"block\" to Claude Code, and an operational error is not\n * the agent's to fix.\n */\nexport function hookReply(run: FamilyCheckRun, envelope: Envelope): HookReply {\n const failed = run.status === \"fail\";\n if (envelope.event === \"PostToolUse\") {\n const files = run.files.join(\", \");\n if (failed) {\n return {\n exitCode: 2,\n stderr: `manni found errors in ${files}. Fix them before you continue.\\n\\n${renderFailures(run)}\\n`,\n };\n }\n const errors = run.checks.filter((c): c is NotRunCheck => c.status === \"error\");\n if (errors.length === 0) return { exitCode: 0 };\n const additionalContext = errors\n .map((c) => `manni ${c.command} could not check ${files}: ${firstLine(c.message)}`)\n .join(\"\\n\");\n return {\n exitCode: 0,\n stdout: `${JSON.stringify({ hookSpecificOutput: { hookEventName: \"PostToolUse\", additionalContext } })}\\n`,\n };\n }\n if (envelope.event === \"Stop\") return turnReply(run, undefined, envelope);\n return { exitCode: 0 };\n}\n\n/** What tracevals found in the turn a Stop or SubagentStop ended, for the reply. */\nexport interface TurnVerdict {\n /** Rules broken with a confident verdict: how many, the report, the trace judged. */\n broken?: { rules: number; report: string; trace: string };\n /** A skip not yet said this session. */\n skipMessage?: string;\n}\n\n/**\n * The reply to a Stop or a SubagentStop: 0078's file checks first, then the\n * turn. One block carries both reasons; after the repair pass, one message\n * carries both sentences. Always exit 0, as 0078's Stop is.\n */\nexport function turnReply(\n run: FamilyCheckRun | undefined,\n turn: TurnVerdict | undefined,\n envelope: Envelope,\n): HookReply {\n const reasons: string[] = [];\n const messages: string[] = [];\n if (run?.status === \"fail\") {\n if (envelope.stopHookActive) {\n messages.push(\"manni still reports errors after one repair pass. Run manni check to see them.\");\n } else {\n reasons.push(`manni found errors in the files you changed. Fix them, then finish.\\n\\n${renderFailures(run)}`);\n }\n }\n if (turn?.broken !== undefined) {\n const { rules, report, trace } = turn.broken;\n if (envelope.stopHookActive) {\n messages.push(\n `tracevals still finds broken rules after one repair pass. Run manni tracevals check ${trace} to see them.`,\n );\n } else {\n reasons.push(\n `This turn broke ${plural(rules, \"rule\")} from the files and requests that governed it. ` +\n `Fix the work, or say why the rule does not apply here, then finish.\\n\\n${report}`,\n );\n }\n }\n if (turn?.skipMessage !== undefined) messages.push(turn.skipMessage);\n if (reasons.length === 0 && messages.length === 0) return { exitCode: 0 };\n const reply = {\n ...(reasons.length > 0 ? { decision: \"block\", reason: reasons.join(\"\\n\\n\") } : {}),\n ...(messages.length > 0 ? { systemMessage: messages.join(\" \") } : {}),\n };\n return { exitCode: 0, stdout: `${JSON.stringify(reply)}\\n` };\n}\n\n/** Test seams `checkTurn` takes; production builds each from config. */\nexport type TurnSeams = Partial<Pick<TurnCheckInput, \"judge\" | \"extractor\" | \"localModels\" | \"env\">>;\n\n/**\n * Judge the turn a Stop or SubagentStop ended, with every gate of proposal\n * 0079. Silent (`undefined`) when tracevals is not in play, the turn is clean\n * or only needs review, a skip was already said this session, or the run\n * could not happen: an operational failure is not the agent's to fix.\n */\nexport async function runTurnCheck(\n envelope: Envelope,\n cwd: string,\n seams: TurnSeams = {},\n): Promise<TurnVerdict | undefined> {\n const subagent = envelope.event === \"SubagentStop\";\n const judged = subagent ? envelope.agentTranscriptPath : envelope.transcriptPath;\n if (judged === undefined) return undefined;\n const trace = resolve(cwd, judged);\n const sessionId = envelope.sessionId ?? basename(trace, \".jsonl\");\n let result: TurnCheckResult;\n let renderTurn: (typeof import(\"../../tracevals/reporters/runtime.js\"))[\"renderCheck\"];\n try {\n // Loaded here, as every domain is, so a run that never judges a turn never\n // loads tracevals.\n const [{ checkTurn }, reporters] = await Promise.all([\n import(\"../../tracevals/commands/check.js\"),\n import(\"../../tracevals/reporters/runtime.js\"),\n ]);\n renderTurn = reporters.renderCheck;\n result = await checkTurn({\n transcriptPath: resolve(cwd, envelope.transcriptPath ?? judged),\n ...(subagent ? { agentTranscriptPath: trace } : {}),\n ...(subagent && envelope.agentId !== undefined ? { agentId: envelope.agentId } : {}),\n ...(subagent && envelope.agentType !== undefined ? { agentType: envelope.agentType } : {}),\n ...(envelope.lastAssistantMessage !== undefined\n ? { lastAssistantMessage: envelope.lastAssistantMessage }\n : {}),\n sessionId,\n cwd,\n inLoop: true,\n ...seams,\n });\n } catch (err) {\n // An operational failure is not the agent's to fix, so it stays silent, as\n // 0078's Stop failures do. Anything else is a bug: say so on stderr, which\n // a hook that exits 0 sends to the debug log, and still never block.\n if (!(err instanceof ToolError)) warn(`the turn check failed unexpectedly: ${errorMessage(err)}`);\n return undefined;\n }\n const { skipped } = result;\n if (skipped?.message !== undefined) {\n return sayOnce(cwd, sessionId, skipped.gate) ? { skipMessage: skipped.message } : undefined;\n }\n if (result.exitCode !== 1 || result.report === undefined) return undefined;\n return {\n broken: {\n rules: result.report.summary.fail,\n report: renderTurn(result.report, { color: false }),\n trace: judged,\n },\n };\n}\n\n/** The reply when the run itself could not happen, under a hook. */\nexport function hookFailure(message: string, envelope: Envelope, file: string | undefined): HookReply {\n if (envelope.event !== \"PostToolUse\" || file === undefined) return { exitCode: 0 };\n const additionalContext = `manni check could not check ${file}: ${firstLine(message)}`;\n return {\n exitCode: 0,\n stdout: `${JSON.stringify({ hookSpecificOutput: { hookEventName: \"PostToolUse\", additionalContext } })}\\n`,\n };\n}\n","/**\n * The files a session changed: the git working tree against `HEAD`.\n *\n * Modified, added, renamed (by the new name) and untracked files, staged or\n * not. A deleted file, or a renamed one's old name, is named apart, since\n * there is nothing left to check. Paths come back absolute, resolved from\n * `cwd`: porcelain status names them from the repository root whatever\n * directory git ran in.\n */\nimport { execFile } from \"node:child_process\";\nimport { posix, resolve } from \"node:path\";\nimport { promisify } from \"node:util\";\n\nconst run = promisify(execFile);\n\nasync function git(args: string[], cwd: string): Promise<string> {\n // shell:false: nothing here is ever parsed as shell syntax.\n const { stdout } = await run(\"git\", args, {\n cwd,\n shell: false,\n windowsHide: true,\n maxBuffer: 64 * 1024 * 1024,\n });\n return stdout;\n}\n\n/** Parse `git status --porcelain=v1 -z` into repository-relative paths. */\nexport function parsePorcelain(output: string): { files: string[]; removed: string[] } {\n const fields = output.split(\"\\0\");\n const files: string[] = [];\n const removed: string[] = [];\n for (let i = 0; i < fields.length; i++) {\n const entry = fields[i] ?? \"\";\n if (entry.length < 4) continue;\n const xy = entry.slice(0, 2);\n const path = entry.slice(3);\n // A rename or copy is followed by its old name, which is not a change to\n // check. A rename's old name is gone; a copy's is still there.\n if (xy.includes(\"R\") || xy.includes(\"C\")) {\n i++;\n if (xy.includes(\"R\")) removed.push(fields[i] ?? \"\");\n }\n // `RD`, a staged rename then deleted in the tree, removes both names:\n // the old one above and the new one here. Two files, not one twice.\n if (xy.includes(\"D\")) removed.push(path);\n else files.push(path);\n }\n return { files, removed };\n}\n\nexport interface ChangedTree {\n /** The changed files left to check, absolute. */\n files: string[];\n /** The files the tree no longer has: deleted, or renamed away. Absolute. */\n removed: string[];\n /**\n * Whether the tree differs from `HEAD` at all. A deletion alone leaves no\n * file to check, but it can still break a citation to what it removed.\n */\n dirty: boolean;\n}\n\nexport async function changedFiles(cwd: string): Promise<ChangedTree> {\n // Rebased through `cwd`'s own prefix rather than resolved from the\n // top-level git prints: on Windows that is the long spelling of a path the\n // caller may hold in its 8.3 short form, and the two would never compare.\n const prefix = (await git([\"rev-parse\", \"--show-prefix\"], cwd)).trim();\n const status = await git(\n [\"status\", \"--porcelain=v1\", \"-z\", \"--untracked-files=all\"],\n cwd,\n );\n const { files, removed } = parsePorcelain(status);\n const absolute = (path: string): string => resolve(cwd, posix.relative(prefix, path));\n return { files: files.map(absolute), removed: removed.map(absolute), dirty: status.length > 0 };\n}\n","/**\n * What a hook has already told the user this session (proposal 0079: \"A skip\n * message is said once per session\").\n *\n * Each hook is a process of its own, and parallel subagents end in parallel\n * SubagentStop hooks, so the memory is one marker file per message, created\n * exclusively. The process whose create succeeds is the one that says it, so\n * no two hooks can both read \"not said yet\".\n */\nimport { mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { DEFAULT_CAPTURE_DIR } from \"../../tracevals/capture/types.js\";\nimport { idHash } from \"../../tracevals/rules/ledger.js\";\n\n/**\n * `<project>/.manni/tracevals/sessions/<session hash>.<key>.said`. The session\n * id is hashed, so nothing in it can climb out of the directory and two ids\n * never share a marker. The key is a gate name, which is already safe.\n */\nexport function saidPath(projectDir: string, sessionId: string, key: string): string {\n return join(projectDir, DEFAULT_CAPTURE_DIR, `${idHash(sessionId)}.${key}.said`);\n}\n\n/**\n * True the first time `key` comes up in a session, and records it. A marker\n * that cannot be written says the message rather than lose it.\n */\nexport function sayOnce(projectDir: string, sessionId: string, key: string): boolean {\n const path = saidPath(projectDir, sessionId, key);\n try {\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, \"\", { flag: \"wx\" });\n return true;\n } catch (err) {\n // EEXIST: another hook said it first. Anything else is an unwritable\n // project, which repeats the message each stop rather than lose it.\n return (err as NodeJS.ErrnoException).code !== \"EEXIST\";\n }\n}\n","/**\n * `manni status`: what is set up here, and so what `manni check` runs.\n *\n * It reads the same table `check` does (`in-play.ts`), counting what the\n * content declares where a domain is in play by declaration: the pages that\n * name their own `$schema`, carry citations or resolve evals, and the terms.\n * It checks nothing, so it exits 0 whatever it finds.\n */\nimport { appendFileSync, existsSync, readFileSync } from \"node:fs\";\nimport { extname, resolve } from \"node:path\";\nimport pkg from \"../../../package.json\" with { type: \"json\" };\nimport { errorMessage } from \"../../shared/errors.js\";\nimport { extractorForExtension } from \"../../meta/extractors/index.js\";\nimport type { HostStatus } from \"../../tracevals/rules/host.js\";\nimport type { Envelope } from \"../core/envelope.js\";\nimport {\n COMMANDS,\n DOMAINS,\n NOT_CHECKED,\n NOT_SET_UP,\n collectionsOf,\n listMembers,\n loadFamily,\n plural,\n type Domain,\n type Family,\n} from \"../core/in-play.js\";\nimport { withSharedWalks } from \"../../meta/core/load-files.js\";\n\nexport const STATUS_FORMATS = [\"pretty\", \"json\"] as const;\nexport type StatusFormat = (typeof STATUS_FORMATS)[number];\n\nexport type DomainState = \"in-play\" | \"not-set-up\" | \"not-checked\" | \"unknown\";\n\nexport interface ModelRole {\n provider: string;\n model: string;\n}\n\nexport interface DomainRow {\n name: string;\n status: DomainState;\n reason: string;\n /** tracevals in play: the model judging inside a hook, and the one extracting rules. */\n models?: { hook: ModelRole; extraction: ModelRole };\n /** tracevals in play with a model host running: each model it holds. */\n host?: HostStatus[\"models\"];\n}\n\nexport interface StatusReport {\n version: string;\n /** The config file, as discovery found it or as it was typed. */\n config: string;\n collections: { name: string; files: number }[];\n domains: DomainRow[];\n}\n\nexport interface StatusOptions {\n cwd?: string;\n configPath?: string;\n /** Test seam: the running model host. Default: ask the inference library. */\n hostStatus?: () => Promise<HostStatus | null>;\n}\n\n/**\n * tracevals' row when `tracevals.runtime` exists: both models, resolved\n * the way `check` and `prepare` resolve them, and the host when one runs.\n */\nasync function tracevalsRow(cwd: string, opts: StatusOptions): Promise<DomainRow> {\n try {\n const [\n { discoverConfig },\n { assertProviderSelection, resolveSelectionIdentity, selectHookProvider, selectProvider },\n { hostStatus },\n ] = await Promise.all([\n import(\"../../tracevals/core/config.js\"),\n import(\"../../tracevals/judge/provider.js\"),\n import(\"../../tracevals/rules/host.js\"),\n ]);\n const { config } = await discoverConfig(cwd, opts.configPath === undefined ? {} : { configPath: opts.configPath });\n const hook = await resolveSelectionIdentity(config, selectHookProvider(config));\n const selection = selectProvider(config);\n assertProviderSelection(selection);\n const extraction = await resolveSelectionIdentity(config, selection);\n const host = await (opts.hostStatus ?? hostStatus)().catch(() => null);\n return {\n name: \"tracevals\",\n status: \"in-play\",\n reason: `hook: ${hook.provider} ${hook.model} · extraction: ${extraction.provider} ${extraction.model}`,\n models: {\n hook: { provider: hook.provider, model: hook.model },\n extraction: { provider: extraction.provider, model: extraction.model },\n },\n ...(host === null || host.models.length === 0 ? {} : { host: host.models }),\n };\n } catch (err) {\n const message = errorMessage(err).split(\"\\n\", 1)[0] ?? \"\";\n return { name: \"tracevals\", status: \"unknown\", reason: `manni tracevals check could not run: ${message}` };\n }\n}\n\n/** `1 page names`, `3 pages name`: a count and the verb that agrees with it. */\nfunction pages(n: number, one: string, many: string): string {\n return n === 1 ? `1 page ${one}` : `${String(n)} pages ${many}`;\n}\n\n/** The pages naming their own `$schema`, read the way `meta validate` extracts them. */\nfunction ownSchemaCount(cwd: string, members: readonly string[]): number {\n let n = 0;\n for (const label of members) {\n const extractor = extractorForExtension(extname(label));\n if (extractor === undefined) continue;\n try {\n const { data } = extractor.extract(readFileSync(resolve(cwd, label), \"utf8\"), label);\n if (data.$schema !== undefined) n++;\n } catch {\n // A page that does not parse names nothing; `meta validate` reports it.\n }\n }\n return n;\n}\n\n/**\n * The pages carrying citations, read the way `cite check` reads them: its\n * targets, its manifests, its entry rules. Nothing is classified, so no claim\n * or source is looked at and no git history is read.\n */\nasync function citedPages(cwd: string, configPath: string): Promise<number> {\n // Imported where they run, so `manni check` never loads them.\n const { prepareRun, readTarget } = await import(\"../../cite/commands/check.js\");\n const { readPage } = await import(\"../../cite/core/page.js\");\n const prepared = await prepareRun({ inputs: [], configPath, cwd, checkSources: false }, \"checked\", \"check\");\n let n = 0;\n for (const file of prepared.files) {\n const content = await readTarget(prepared.run, file);\n const { citations } = (await prepared.setupFor(file, content)).options;\n const read = readPage(file, content, { markers: false, ...(citations === undefined ? {} : { citations }) });\n if (read.citations.length > 0) n++;\n }\n return n;\n}\n\nasync function row(domain: Domain, family: Family, cwd: string, members: readonly string[]): Promise<DomainRow> {\n const configPath = family.configPath;\n const inPlay = (reason: string): DomainRow => ({ name: domain, status: \"in-play\", reason });\n const notSetUp: DomainRow = { name: domain, status: \"not-set-up\", reason: NOT_SET_UP[domain] };\n const section = family.sections.has(domain);\n switch (domain) {\n case \"meta\": {\n if (section) return inPlay(\"meta: section\");\n const n = ownSchemaCount(cwd, members);\n return n > 0 ? inPlay(pages(n, \"names its own $schema\", \"name their own $schema\")) : notSetUp;\n }\n case \"cite\": {\n const n = await citedPages(cwd, configPath);\n return n > 0 ? inPlay(pages(n, \"carries citations\", \"carry citations\")) : notSetUp;\n }\n case \"docevals\": {\n const { runList: listEvals } = await import(\"../../docevals/commands/list.js\");\n const { plans } = await listEvals([], { config: configPath, cwd });\n const n = plans.filter((p) => !p.skip && p.evals.length > 0).length;\n if (n === 0) return notSetUp;\n return inPlay(section ? \"docevals: section\" : pages(n, \"declares evals\", \"declare evals\"));\n }\n case \"term\": {\n const { runList: listTerms } = await import(\"../../term/commands/list.js\");\n const { terms } = await listTerms({ inputs: [], configPath, cwd, allowEmpty: true });\n return terms.length > 0 ? inPlay(plural(terms.length, \"term\")) : notSetUp;\n }\n case \"lint\":\n case \"graph\":\n return section ? inPlay(`${domain}: section`) : notSetUp;\n }\n}\n\n/** Every domain walks the same collections, so the run shares one walk per target set. */\nexport function runStatus(opts: StatusOptions = {}): Promise<StatusReport> {\n return withSharedWalks(() => statusUnshared(opts));\n}\n\nasync function statusUnshared(opts: StatusOptions): Promise<StatusReport> {\n const cwd = resolve(opts.cwd ?? process.cwd());\n const family = await loadFamily(cwd, opts.configPath);\n const members = family.collections.length === 0 ? [] : await listMembers(family, cwd);\n const domains: DomainRow[] = [];\n for (const domain of DOMAINS) {\n // `check` only reads collection members, so with no collections every\n // domain has nothing to check, whatever sections the config carries.\n if (family.collections.length === 0) {\n domains.push({ name: domain, status: \"not-set-up\", reason: \"no collections: in manni.config.yaml\" });\n continue;\n }\n try {\n domains.push(await row(domain, family, cwd, members));\n } catch (err) {\n // Status checks nothing, so a domain that cannot read its own setup is\n // reported in its row rather than ending the run, as unknown: whether it is\n // set up is the thing it could not read.\n const message = errorMessage(err).split(\"\\n\", 1)[0] ?? \"\";\n domains.push({ name: domain, status: \"unknown\", reason: `manni ${COMMANDS[domain]} could not run: ${message}` });\n }\n }\n for (const [name, reason] of NOT_CHECKED) {\n domains.push(\n name === \"tracevals\" && family.runtime\n ? await tracevalsRow(cwd, opts)\n : { name, status: \"not-checked\", reason },\n );\n }\n return {\n version: pkg.version,\n config: family.file.source,\n collections: family.collections.map((c) => ({\n name: c.name,\n files: members.filter((label) => collectionsOf(family, cwd, label).includes(c.name)).length,\n })),\n domains,\n };\n}\n\nconst STATE_LABEL: Readonly<Record<DomainState, string>> = {\n \"in-play\": \"in play\",\n \"not-set-up\": \"not set up\",\n \"not-checked\": \"not checked\",\n unknown: \"unknown\",\n};\n\nexport function renderStatus(report: StatusReport, format: StatusFormat): string {\n if (format === \"json\") return JSON.stringify(report, null, 2);\n const head = [\n `manni ${report.version}`,\n `config ${report.config}`,\n ...report.collections.map((c) => `collection ${c.name} (${plural(c.files, \"file\")})`),\n ].join(\" \");\n // tracevals in play judges each turn, which is what its row says.\n const label = (d: DomainRow): string => (d.models !== undefined ? \"judges each turn\" : STATE_LABEL[d.status]);\n const width = Math.max(14, ...report.domains.map((d) => label(d).length + 3));\n const rows = report.domains.flatMap((d) => [\n `${d.name.padEnd(11)}${label(d).padEnd(width)}${d.reason}`,\n ...(d.host ?? []).map(\n (m) =>\n `${\"\".padEnd(11)}${\"model host\".padEnd(width)}${m.model} loaded, ${plural(m.sessions, \"session\")}, ` +\n `idle ${String(Math.floor(m.idleMs / 60_000))}m`,\n ),\n ]);\n return [head, \"\", ...rows].join(\"\\n\");\n}\n\n/**\n * The plugin skill the briefing points an agent at, as `<plugin>:<skill>`.\n * `test/plugin.test.ts` checks both halves against `plugin/manni`.\n */\nexport const FIX_SKILL = \"manni:fix\";\n\n/** The set-wide checks a stop runs when a collection document changed, as the briefing names them. */\nconst PAGE_WIDE: ReadonlyArray<readonly [Domain, string]> = [[\"term\", \"the glossary\"]];\n\n/** `a`, `a or b`, `a, b or c`: a list in prose, joined by `conjunction`. */\nfunction prose(items: readonly string[], conjunction: string): string {\n return items.length <= 1\n ? (items[0] ?? \"\")\n : `${items.slice(0, -1).join(\", \")} ${conjunction} ${items.at(-1) ?? \"\"}`;\n}\n\n/** What an agent is told at the start of a session, after the table. */\nexport function agentLines(report: StatusReport): string {\n const names = prose(report.collections.map((c) => c.name), \"or\");\n const inPlay = new Set(report.domains.filter((d) => d.status === \"in-play\").map((d) => d.name));\n // A stop checks every citation whenever the tree changed: a source edit can drift any of them.\n const plus = inPlay.has(\"cite\") ? \", plus every citation\" : \"\";\n const pageWide = PAGE_WIDE.filter(([domain]) => inPlay.has(domain)).map(([, what]) => what);\n const also = pageWide.length === 0 ? \"\" : ` It checks ${prose(pageWide, \"and\")} too when you changed a page.`;\n return [\n `After you edit a file in ${names}, manni check runs on it, and errors come back to you at once.`,\n `Before you finish, manni check runs on every file you changed${plus}.${also} You get one repair pass.`,\n `The ${FIX_SKILL} skill says how to repair each finding.`,\n ].join(\"\\n\");\n}\n\n/** A model id as Claude Code spells one, and nothing a shell would read as more. */\nconst MODEL_ID = /^[A-Za-z0-9._:/@-]+$/;\n\n/**\n * Append `export MANNI_GENERATED_BY=<model>` to `$CLAUDE_ENV_FILE`, so every\n * command the session runs records which model wrote what. Only when the\n * envelope names the model, the file is offered, and nobody set the variable.\n */\nexport function exportGeneratedBy(envelope: Envelope, env: NodeJS.ProcessEnv = process.env): boolean {\n const file = env.CLAUDE_ENV_FILE;\n // A context-window suffix such as `[1m]` is a session setting, not the model.\n const model = envelope.model?.replace(/\\[[^\\]]*\\]$/, \"\");\n if (model === undefined || !MODEL_ID.test(model)) return false;\n if (file === undefined || file === \"\" || env.MANNI_GENERATED_BY !== undefined) return false;\n const existing = existsSync(file) ? readFileSync(file, \"utf8\") : \"\";\n const lead = existing === \"\" || existing.endsWith(\"\\n\") ? \"\" : \"\\n\";\n appendFileSync(file, `${lead}export MANNI_GENERATED_BY=${model}\\n`, \"utf8\");\n return true;\n}\n"],"mappings":"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","names":["resolve","record","resolve","resolve","run","resolve","extname","resolve","extname","resolve","resolve","run"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/graph/cli.ts","../src/graph/reporters/index.ts","../src/graph/commands/init.ts"],"sourcesContent":["/**\n * The graph program. Named `graph` because that is where it is mounted\n * (`manni graph …`); `src/cli.ts` adds it to the umbrella and runs it.\n *\n * Grammar per proposals 0034 and 0051 §2: the domain owns verbs and has no\n * default subcommand, `-f` means the output format everywhere and is checked\n * against the verb's list, and a list reaches a flag by exactly one\n * separator. The plumbing is the family's: `fail()` from `src/shared/run.ts`,\n * `warn()` from `src/shared/warn.ts`, and `--no-color` from\n * `src/shared/color.ts`.\n */\nimport { Command } from \"commander\";\nimport pkg from \"../../package.json\" with { type: \"json\" };\nimport {\n collect,\n configOption,\n readStdin,\n splitList,\n} from \"../shared/cli-options.js\";\nimport { shouldColor } from \"../shared/color.js\";\nimport { fail } from \"../shared/run.js\";\nimport { warn } from \"../shared/warn.js\";\nimport { GraphError } from \"./types.js\";\nimport { LOCAL_FLAG_HELP } from \"../shared/providers.js\";\nimport { ALL_FILL_FIELDS, type FillField } from \"./core/config.js\";\nimport {\n assertInputFormat,\n DEFAULT_EXTENSIONS,\n STDIN,\n} from \"./core/discover.js\";\nimport {\n CHECK_FORMATS,\n CHECK_FORMAT_LIST,\n GRAPH_FORMATS,\n GRAPH_FORMAT_LIST,\n type CheckFormat,\n type GraphFormat,\n} from \"./reporters/index.js\";\nimport { runBuild } from \"./commands/build.js\";\nimport { renderCheck, runCheck } from \"./commands/check.js\";\nimport {\n EXPORT_TARGETS,\n runExport,\n type ExportFormat,\n} from \"./commands/export.js\";\nimport { renderQuery, runQuery } from \"./commands/query.js\";\nimport { renderFill, runFill } from \"./commands/fill.js\";\nimport { runInit } from \"./commands/init.js\";\nimport { renderEmbed, runEmbed } from \"./commands/embed.js\";\nimport {\n renderSearch,\n runSearch,\n SEARCH_MODES,\n type SearchMode,\n} from \"./commands/search.js\";\nimport { renderStats, runStats } from \"./commands/stats.js\";\nimport { renderTraverse, runTraverse } from \"./commands/traverse.js\";\n\n/**\n * Whether `command`'s output gets colour: this domain's `--no-color` and\n * `NO_COLOR` turn it off, and otherwise only a TTY turns it on\n * (`shouldColor`). `isTTY` is passed uncoerced: Node leaves it undefined off\n * a terminal, never false, and `shouldColor` reads a missing one as \"not a\n * terminal\".\n *\n * Exported because this is where the decision is testable — a spawned bin is\n * never a TTY. graph's reporters print no colour yet; when one does, it takes\n * the boolean from here rather than consulting the environment itself.\n */\nexport function colorFor(\n command: Command,\n isTTY: boolean | undefined,\n env?: NodeJS.ProcessEnv,\n): boolean {\n // commander maps --no-color to opts.color === false, on the command that\n // declares it.\n const noColor = colorOwner(command).opts().color === false;\n return shouldColor({ noColor, isTTY, env });\n}\n\n/**\n * The nearest command, this one or an ancestor, that declares `--no-color`:\n * the `graph` program, wherever it is mounted. Not the root: under the umbrella\n * that is `manni`, which has no `--no-color` of its own.\n */\nfunction colorOwner(command: Command): Command {\n for (let c: Command | null = command; c !== null; c = c.parent) {\n if (c.options.some((o) => o.long === \"--no-color\")) return c;\n }\n return command;\n}\n\nexport function buildProgram(): Command {\nconst program = new Command();\n\nprogram\n .name(\"graph\")\n .description(\n \"Deterministic knowledge graphs derived from documentation frontmatter and formatting.\",\n )\n .version(pkg.version)\n .option(\"--no-color\", \"disable colored output\")\n // A pointer, not the whole help screen: the message that precedes it\n // already names the offending flag.\n .showHelpAfterError(\"(add --help for usage)\")\n // MUST come before the `.command()` calls below. `copyInheritedSettings`\n // copies `_exitCallback` by value at subcommand-creation time, so an\n // `exitOverride()` installed afterwards leaves every subcommand still\n // calling `process.exit(1)` — which reports a usage error as a finding.\n .exitOverride();\n\n/**\n * Parse a numeric CLI option, refusing what the config schema refuses.\n *\n * `Number.parseFloat`/`parseInt` return NaN for `abc` and silently accept\n * out-of-range values, and NaN then disables whatever gate it feeds — a cost\n * cap that never fires, a confidence gate that writes everything, a `--top`\n * that asks for a negative number of rows. The documented precedence is\n * config → Ajv → CLI override, so the override has to be held to the same range.\n */\nfunction numericOption(\n flag: string,\n { min, max, integer }: { min: number; max?: number; integer?: boolean },\n) {\n return (raw: string): number => {\n const value = Number.parseFloat(raw);\n if (!Number.isFinite(value)) {\n throw new GraphError(`${flag} expects a number, got \"${raw}\".`);\n }\n if (integer && !Number.isInteger(value)) {\n throw new GraphError(`${flag} expects a whole number, got ${value}.`);\n }\n if (value < min || (max !== undefined && value > max)) {\n const range = max === undefined ? `>= ${min}` : `${min}..${max}`;\n throw new GraphError(`${flag} must be ${range}, got ${value}.`);\n }\n return value;\n };\n}\n\n/** A count: a whole number, at least `min` (1 unless the flag allows zero). */\nfunction countOption(flag: string, min = 1) {\n return numericOption(flag, { min, integer: true });\n}\n\n/**\n * Hold a CLI override to the same list its config key is held to.\n *\n * `fill.provider` is Ajv-validated against the schema enum; the `--provider`\n * override was an arbitrary string cast straight to `ProviderName`, so the\n * documented config → Ajv → CLI precedence had a hole at the last step.\n */\nfunction enumOption<T extends string>(flag: string, allowed: readonly T[]) {\n return (raw: string): T => {\n if (!(allowed as readonly string[]).includes(raw)) {\n throw new GraphError(\n `${flag} must be one of ${allowed.join(\" | \")}, got \"${raw}\".`,\n );\n }\n return raw as T;\n };\n}\n\n/**\n * A flag whose value is one of a named set, refused in the family's words:\n * `Unknown --format \"xml\". Use pretty | json.` The check runs while the\n * options are parsed, so a typo costs a message rather than a graph load.\n */\nfunction choiceOption<T extends string>(flag: string, allowed: readonly T[]) {\n return (raw: string): T => {\n if (!(allowed as readonly string[]).includes(raw)) {\n throw new GraphError(`Unknown ${flag} \"${raw}\". Use ${allowed.join(\" | \")}.`);\n }\n return raw as T;\n };\n}\n\n/** `-f, --format`: every verb's list is `pretty | json` (0051 §2). */\nconst formatOption = choiceOption(\"--format\", GRAPH_FORMATS);\n\n/** `check`'s own, which adds `github` — the CI gate's annotation format. */\nconst checkFormatOption = choiceOption(\"--format\", CHECK_FORMATS);\n\n/**\n * `--fields <list>`: comma-separated and given once, never repeatable — one\n * separator per list (proposal 0034), and the spelling `meta fill --fields`\n * already uses. Each value is held to the same list `fill.fields` is.\n */\nconst fieldsOption = (raw: string): FillField[] =>\n splitList(raw).map((value) => enumOption(\"--fields\", ALL_FILL_FIELDS)(value));\n\n/**\n * The document-set surface the verbs that read documents share (proposals\n * 0041 and 0051 §1): positional `[paths...]` with `-` for stdin,\n * `--collection` and `--exclude` (each one value per occurrence), `--as`,\n * `--ext` (comma-separated, given once), `--allow-empty`, and\n * `-c`/`--no-config`. Declared once so the verbs cannot drift apart on a name\n * or a description, and worded as `meta` and `lint` word them.\n */\nfunction documentInputs(command: Command, verb: string): Command {\n return command\n .argument(\n \"[paths...]\",\n `files, directories, or globs to ${verb} (use - for stdin)`,\n )\n .option(\n \"--collection <name>\",\n \"Configured collection to read (repeatable)\",\n collect,\n [],\n )\n .option(\"--exclude <glob>\", \"Glob to exclude (repeatable)\", collect, [])\n .option(\n \"--as <format>\",\n \"Parse every input as asciidoc, html, markdown, mdx, rst or xml, whatever its extension. Required with -.\",\n )\n .option(\n \"--ext <list>\",\n \"comma-separated extensions for directory walks\",\n DEFAULT_EXTENSIONS.join(\",\"),\n )\n .option(\"--allow-empty\", \"treat zero matched files as success\")\n .option(\"-c, --config <path>\", \"Path to manni.config.yaml\")\n .option(\"--no-config\", \"Ignore any discovered config file\");\n}\n\n/** The input flags as commander hands them over. */\ninterface InputFlags {\n as?: string;\n ext: string;\n allowEmpty?: boolean;\n}\n\n/**\n * The input flags for a core, and stdin when `paths` holds `-`. `--as` is\n * checked first, so `-` without it is refused before anything waits on stdin.\n */\nasync function inputOptions(\n paths: string[],\n opts: InputFlags,\n): Promise<{\n as?: string;\n ext: string[];\n allowEmpty?: boolean;\n stdinContent?: string;\n}> {\n assertInputFormat(paths, opts.as);\n return {\n ...(opts.as === undefined ? {} : { as: opts.as }),\n ext: splitList(opts.ext),\n ...(opts.allowEmpty === true ? { allowEmpty: true } : {}),\n ...(paths.includes(STDIN) ? { stdinContent: await readStdin() } : {}),\n };\n}\n\n/**\n * `-c`/`--no-config` for a verb that reads a built graph rather than a\n * document set. They share one commander attribute, which `configOption`\n * splits.\n */\nfunction configInputs(command: Command): Command {\n return command\n .option(\"-c, --config <path>\", \"Path to manni.config.yaml\")\n .option(\"--no-config\", \"Ignore any discovered config file\");\n}\n\n/**\n * `opts` minus the one attribute `-c` and `--no-config` share. `documentOptions`\n * restates it as the two fields a core reads, and spreading the raw value over\n * them would put commander's `false` back where a path belongs.\n */\nfunction rest<T extends { config?: string | boolean }>(\n opts: T,\n): Omit<T, \"config\"> {\n const { config, ...others } = opts;\n return others;\n}\n\n/** The shared options as the command cores take them. */\nfunction documentOptions(opts: {\n collection?: string[];\n exclude?: string[];\n config?: string | boolean;\n}): {\n config?: string;\n noConfig?: boolean;\n collection?: string[];\n exclude?: string[];\n} {\n const { configPath, noConfig } = configOption(opts.config);\n return {\n ...(configPath === undefined ? {} : { config: configPath }),\n ...(noConfig === true ? { noConfig } : {}),\n ...(opts.collection === undefined ? {} : { collection: opts.collection }),\n ...(opts.exclude === undefined ? {} : { exclude: opts.exclude }),\n };\n}\n\nprogram\n .command(\"init\")\n .description(\"Add a starter `graph:` section to manni.config.yaml in the current directory\")\n .action(async () => {\n try {\n console.log(`Created ${await runInit()}`);\n } catch (e) {\n fail(e);\n }\n });\n\ndocumentInputs(\n program\n .command(\"build\")\n .description(\"Derive the knowledge graph and write deterministic Turtle\"),\n \"build\",\n)\n .option(\"-o, --out <path>\", \"Output .ttl path (default: config out)\")\n .action(async (paths: string[], opts: InputFlags & {\n config?: string | boolean;\n collection?: string[];\n exclude?: string[];\n out?: string;\n }) => {\n try {\n const result = await runBuild({\n paths,\n ...documentOptions(opts),\n ...(await inputOptions(paths, opts)),\n out: opts.out,\n });\n // Warnings go to stderr so stdout stays the machine-readable summary;\n // a degraded build is still a successful one, so the exit code is 0.\n for (const warning of result.warnings) warn(warning);\n console.log(\n `Wrote ${result.outPath} (${result.docs} docs, ${result.quads} triples)`,\n );\n } catch (e) {\n fail(e);\n }\n });\n\nconfigInputs(\n program\n .command(\"check\")\n .description(\n \"Validate the built graph against the bundled SHACL shapes (errors exit 1)\",\n ),\n)\n .option(\"-g, --graph <path>\", \"Graph .ttl path (default: config out)\")\n // One path per occurrence, never split on commas: a path may hold one.\n .option(\n \"--shapes <path>\",\n \"Shapes .ttl file; repeatable (default: config check.shapes, then bundled)\",\n collect,\n [],\n )\n .option(\n \"-f, --format <format>\",\n `Output: ${CHECK_FORMAT_LIST}`,\n checkFormatOption,\n \"pretty\",\n )\n .action(\n async (opts: {\n config?: string | boolean;\n graph?: string;\n shapes: string[];\n format: CheckFormat;\n }) => {\n try {\n const report = await runCheck({ ...rest(opts), ...documentOptions(opts) });\n console.log(renderCheck(report, opts.format));\n process.exitCode = report.exitCode;\n } catch (e) {\n fail(e);\n }\n },\n );\n\ndocumentInputs(\n program\n .command(\"fill\")\n .description(\n \"Propose `graph:` frontmatter fields with an LLM, gated by confidence, and write them back\",\n ),\n \"fill\",\n)\n .option(\n \"-f, --format <format>\",\n `Output: ${GRAPH_FORMAT_LIST}`,\n formatOption,\n \"pretty\",\n )\n .option(\"--dry-run\", \"Report proposals without writing files\")\n .option(\"--force\", \"Overwrite human-set graph fields\")\n .option(\"--no-cache\", \"Bypass the proposal cache\")\n .option(\"--no-validate-graph\", \"Skip the SHACL graph guardrail on proposals\")\n .option(\"--sections\", \"Also propose per-section metadata\")\n .option(\n \"--max-turns <n>\",\n \"Stop after this many inference calls (a cached page costs none)\",\n countOption(\"--max-turns\"),\n )\n .option(\n \"--confidence <n>\",\n \"Minimum model confidence (0..1) to write a field (default: config, 0.7)\",\n numericOption(\"--confidence\", { min: 0, max: 1 }),\n )\n .option(\n // Comma-separated and given once: one separator per list (proposal 0034).\n \"--fields <list>\",\n `Fields to propose (comma-separated; default: config, then every field)`,\n fieldsOption,\n )\n // The nameable providers, and `auto`. `mock` is the library's test double:\n // accepted when asked for by name, never offered.\n .option(\n \"--provider <name>\",\n \"Provider: auto (default) | anthropic | openai | claude-cli | llama-cpp\",\n )\n .option(\"--model <model>\", \"Model override; needs a named provider, from here or config\")\n .option(\"--local\", LOCAL_FLAG_HELP)\n // Typed inline, as every other action in this file is. The option parsers\n // above (`numericOption`, `choiceOption`, `fieldsOption`) have already thrown\n // on anything malformed by the time this runs, so a cast per field would be\n // safe — but it would also be the one command with the most options and the\n // least help from the compiler.\n .action(async (paths: string[], opts: InputFlags & {\n config?: string | boolean;\n collection?: string[];\n exclude?: string[];\n dryRun?: boolean;\n force?: boolean;\n cache?: boolean;\n validateGraph?: boolean;\n sections?: boolean;\n maxTurns?: number;\n confidence?: number;\n fields?: FillField[];\n provider?: string;\n model?: string;\n local?: boolean;\n format: GraphFormat;\n }) => {\n try {\n const report = await runFill({\n paths,\n ...documentOptions(opts),\n ...(await inputOptions(paths, opts)),\n dryRun: opts.dryRun,\n force: opts.force,\n noCache: opts.cache === false,\n noValidateGraph: opts.validateGraph === false,\n sections: opts.sections,\n maxTurns: opts.maxTurns,\n confidence: opts.confidence,\n fields: opts.fields,\n provider: opts.provider,\n model: opts.model,\n local: opts.local,\n });\n // Same channel discipline as build: warnings on stderr, so stdout stays\n // the report, and a warning never changes the exit code.\n for (const warning of report.warnings) warn(warning);\n const rendered = renderFill(report, opts.format);\n if (paths.includes(STDIN)) {\n // With `-` the filled document owns stdout, as under `meta fill -`,\n // and the report in either format is a diagnostic on stderr.\n if (report.stdinDocument !== undefined) {\n process.stdout.write(report.stdinDocument);\n }\n if (rendered.length > 0) process.stderr.write(`${rendered}\\n`);\n } else {\n console.log(rendered);\n }\n process.exitCode = report.exitCode;\n } catch (e) {\n fail(e);\n }\n });\n\nprogram\n .command(\"query\")\n .description(\n \"Match triple patterns against the built graph (omit a term for wildcard)\",\n )\n // Long-only, and named for the triple position each one fills. `-o` is\n // `--out` on every other graph verb and `-s` is meta's schema flag; a\n // one-letter spelling that means two things in one family costs more than\n // the letters it saves.\n .option(\"--subject <term>\", \"Subject IRI or prefixed name\")\n .option(\"--predicate <term>\", \"Predicate IRI or prefixed name\")\n .option(\"--object <term>\", \"Object IRI, prefixed name, or literal value\")\n .option(\"-c, --config <path>\", \"Path to manni.config.yaml\")\n .option(\"--no-config\", \"Ignore any discovered config file\")\n .option(\"-g, --graph <path>\", \"Graph .ttl path (default: config out)\")\n .option(\n \"-f, --format <format>\",\n `Output: ${GRAPH_FORMAT_LIST}`,\n formatOption,\n \"pretty\",\n )\n .action(\n (opts: {\n subject?: string;\n predicate?: string;\n object?: string;\n config?: string | boolean;\n graph?: string;\n format: GraphFormat;\n }) => {\n try {\n const { subject, predicate, object, ...others } = rest(opts);\n const result = runQuery({\n ...others,\n ...documentOptions(opts),\n ...(subject === undefined ? {} : { s: subject }),\n ...(predicate === undefined ? {} : { p: predicate }),\n ...(object === undefined ? {} : { o: object }),\n });\n console.log(renderQuery(result, opts.format));\n } catch (e) {\n fail(e);\n }\n },\n );\n\nprogram\n .command(\"stats\")\n .description(\n \"Summarize the built graph: counts, orphans, broken links, hubs, metadata coverage\",\n )\n .option(\"-c, --config <path>\", \"Path to manni.config.yaml\")\n .option(\"--no-config\", \"Ignore any discovered config file\")\n .option(\"-g, --graph <path>\", \"Graph .ttl path (default: config out)\")\n .option(\n \"-f, --format <format>\",\n `Output: ${GRAPH_FORMAT_LIST}`,\n formatOption,\n \"pretty\",\n )\n .option(\n \"--check\",\n \"Exit 1 when broken internal links exist or coverage is below threshold\",\n )\n .option(\n \"--top <n>\",\n \"How many most-connected docs to list\",\n countOption(\"--top\"),\n )\n .option(\n \"--coverage-threshold <pct>\",\n \"Minimum metadata coverage % (all fields); overrides config for this run\",\n // A percentage, so 0..100 rather than the 0..1 of a confidence. NaN here is\n // worse than a wrong number: `pct < NaN` is false for every field, so the\n // gate this flag exists to tighten would silently pass instead.\n numericOption(\"--coverage-threshold\", { min: 0, max: 100 }),\n )\n .action(\n (opts: {\n config?: string | boolean;\n graph?: string;\n format: GraphFormat;\n check?: boolean;\n top?: number;\n coverageThreshold?: number;\n }) => {\n try {\n const report = runStats({ ...rest(opts), ...documentOptions(opts) });\n console.log(renderStats(report, opts.format));\n process.exitCode = report.exitCode;\n } catch (e) {\n fail(e);\n }\n },\n );\n\nprogram\n .command(\"search\")\n .description(\"Rank graph nodes for a text query (needs `export search`)\")\n .argument(\"<query>\", \"Text query\")\n .option(\"-c, --config <path>\", \"Path to manni.config.yaml\")\n .option(\"--no-config\", \"Ignore any discovered config file\")\n .option(\"-g, --graph <path>\", \"Graph .ttl path (default: config out)\")\n .option(\n \"-i, --index <dir>\",\n \"Directory holding the indexes and manifest (default: beside the graph)\",\n )\n .option(\n \"--lang <tag>\",\n \"Which localization to search (required when the corpus has more than one)\",\n )\n .option(\"--limit <n>\", \"Maximum results (default 10)\", countOption(\"--limit\"))\n .option(\n \"--vectors <path>\",\n \"Vector sidecar path (default: from the manifest)\",\n )\n .option(\n \"--mode <mode>\",\n `Which legs to run: ${SEARCH_MODES.join(\" | \")} (default: hybrid when vectors exist)`,\n choiceOption(\"--mode\", SEARCH_MODES),\n )\n .option(\n \"-f, --format <format>\",\n `Output: ${GRAPH_FORMAT_LIST}`,\n formatOption,\n \"pretty\",\n )\n .action(\n async (\n query: string,\n opts: {\n config?: string | boolean;\n graph?: string;\n index?: string;\n lang?: string;\n limit?: number;\n vectors?: string;\n mode?: SearchMode;\n format: GraphFormat;\n },\n ) => {\n try {\n const report = await runSearch({\n ...rest(opts),\n ...documentOptions(opts),\n query,\n });\n console.log(renderSearch(report, opts.format));\n } catch (e) {\n fail(e);\n }\n },\n );\n\nprogram\n .command(\"traverse\")\n .description(\n \"Walk the graph from a node, honoring scope rules, with the full trace\",\n )\n .argument(\"<node>\", \"Starting node: a full IRI or a prefix:local CURIE\")\n .option(\"-c, --config <path>\", \"Path to manni.config.yaml\")\n .option(\"--no-config\", \"Ignore any discovered config file\")\n .option(\"-g, --graph <path>\", \"Graph .ttl path (default: config out)\")\n .option(\n \"-d, --depth <n>\",\n \"Maximum hops from the node (default 1; 3 under --impact)\",\n // Zero is allowed: it means the node itself, which is a real answer.\n countOption(\"--depth\", 0),\n )\n // Comma-separated and given once: a CURIE holds no comma, so one separator\n // is enough, and a second spelling would be a second thing to document.\n .option(\n \"--predicates <list>\",\n \"Only follow these predicates (comma-separated)\",\n )\n .option(\"--reverse\", \"Follow inbound edges (who points at this node)\")\n .option(\"--impact\", \"Transitive inbound reach: what a change here affects\")\n .option(\n \"--variant <variant>\",\n \"Scope filter: product variant IRI, title, or slug\",\n )\n // Not `--subject`: on `query` that is a triple's subject, and one flag name\n // means one thing across the domain.\n .option(\"--software-subject <subject>\", \"Scope filter: software subject\")\n .option(\"--lang <tag>\", \"Scope filter: BCP-47 language tag, matched in any case\")\n .option(\"--limit <n>\", \"Stop after this many nodes\", countOption(\"--limit\"))\n .option(\n \"-f, --format <format>\",\n `Output: ${GRAPH_FORMAT_LIST}`,\n formatOption,\n \"pretty\",\n )\n .action(\n (\n node: string,\n opts: {\n config?: string | boolean;\n graph?: string;\n depth?: number;\n predicates?: string;\n reverse?: boolean;\n impact?: boolean;\n variant?: string;\n softwareSubject?: string;\n lang?: string;\n limit?: number;\n format: GraphFormat;\n },\n ) => {\n try {\n const { softwareSubject, ...others } = rest(opts);\n const report = runTraverse({\n ...others,\n ...documentOptions(opts),\n ...(softwareSubject === undefined ? {} : { subject: softwareSubject }),\n node,\n predicates:\n opts.predicates === undefined\n ? undefined\n : splitList(opts.predicates),\n });\n console.log(renderTraverse(report, opts.format));\n } catch (e) {\n fail(e);\n }\n },\n );\n\nprogram\n .command(\"embed\")\n .description(\n \"Compute local embeddings for the search index (needs @huggingface/transformers)\",\n )\n .option(\"-c, --config <path>\", \"Path to manni.config.yaml\")\n .option(\"--no-config\", \"Ignore any discovered config file\")\n .option(\"-g, --graph <path>\", \"Graph .ttl path (default: config out)\")\n .option(\n \"-i, --index <dir>\",\n \"Directory holding the indexes and manifest (default: beside the graph)\",\n )\n .option(\n \"-o, --out <dir>\",\n \"Directory for the sidecars (default: the index directory)\",\n )\n // Not `--model`: on `fill` that is the inference model, a different thing.\n .option(\n \"--embedding-model <id>\",\n \"Embedding model id (any id; `mock` for offline runs)\",\n )\n .option(\"--dtype <dtype>\", \"Weight quantization (default q8)\")\n .option(\"--no-cache\", \"Ignore the vector cache\")\n .option(\n \"-f, --format <format>\",\n `Output: ${GRAPH_FORMAT_LIST}`,\n formatOption,\n \"pretty\",\n )\n .action(\n async (opts: {\n config?: string | boolean;\n graph?: string;\n index?: string;\n out?: string;\n embeddingModel?: string;\n dtype?: string;\n cache?: boolean;\n format: GraphFormat;\n }) => {\n try {\n const { embeddingModel, ...others } = rest(opts);\n const report = await runEmbed({\n ...others,\n ...documentOptions(opts),\n ...(embeddingModel === undefined ? {} : { model: embeddingModel }),\n noCache: opts.cache === false,\n });\n console.log(renderEmbed(report, opts.format));\n } catch (e) {\n fail(e);\n }\n },\n );\n\nprogram\n .command(\"export\")\n .description(\n \"Reserialize the built graph into a consumer format (jsonld file, iirds package, or search index)\",\n )\n // The target is a positional, not `-f`: `-f` is the output format in every\n // other verb of the family (0051 §2), and one flag cannot mean two things.\n .argument(\"<target>\", `What to write: ${EXPORT_TARGETS.join(\" | \")}`)\n .option(\"-c, --config <path>\", \"Path to manni.config.yaml\")\n .option(\"--no-config\", \"Ignore any discovered config file\")\n .option(\"-g, --graph <path>\", \"Graph .ttl path (default: config out)\")\n .option(\n \"-o, --out <path>\",\n \"Output path (default: the graph path with the target's extension)\",\n )\n .action(\n async (\n target: string,\n opts: { config?: string | boolean; graph?: string; out?: string },\n ) => {\n try {\n if (!(EXPORT_TARGETS as readonly string[]).includes(target)) {\n throw new GraphError(\n `Unknown export target \"${target}\". Use ${EXPORT_TARGETS.join(\" | \")}.`,\n );\n }\n const result = await runExport({\n ...documentOptions(opts),\n graph: opts.graph,\n format: target as ExportFormat,\n out: opts.out,\n });\n for (const warning of result.warnings) warn(warning);\n console.log(\n `Wrote ${result.nodes} node${result.nodes === 1 ? \"\" : \"s\"} to ${result.outPath}`,\n );\n } catch (e) {\n fail(e);\n }\n },\n );\n\nreturn program;\n}\n","/**\n * What `-f` accepts, per verb.\n *\n * Each verb's renderer lives beside its command core (`renderCheck`,\n * `renderStats`, …); what belongs here is the *list*, stated once so the\n * union, the guard, the help text and the refusal sentence cannot drift\n * apart. It is the same shape a11y and cite keep (`A11Y_FORMATS`,\n * `REPORT_FORMATS`), which is why the sentence a user reads is the family's.\n *\n * Every verb takes `pretty | json`. `check` also takes `github`, because it is\n * the CI gate: it is the one graph verb whose output changes what a reviewer sees\n * on a pull request (proposal 0051 §2). It names its own list here rather than\n * widening the shared one, so no other verb advertises a format it cannot\n * render.\n */\n\n/** The list every graph verb's `-f` accepts, in the order messages list them. */\nexport const GRAPH_FORMATS = [\"pretty\", \"json\"] as const;\nexport type GraphFormat = (typeof GRAPH_FORMATS)[number];\n\n/** `\"pretty | json\"`, for help text and the refusal sentence. */\nexport const GRAPH_FORMAT_LIST: string = GRAPH_FORMATS.join(\" | \");\n\n/** `check`'s list: the shared two plus the CI annotation format. */\nexport const CHECK_FORMATS = [...GRAPH_FORMATS, \"github\"] as const;\nexport type CheckFormat = (typeof CHECK_FORMATS)[number];\n\n/** `\"pretty | json | github\"`, for help text and the refusal sentence. */\nexport const CHECK_FORMAT_LIST: string = CHECK_FORMATS.join(\" | \");\n","/**\n * `manni graph init` — scaffold a starter `graph:` section in manni.config.yaml.\n *\n * The family file is shared with the other tools, so a file that already\n * exists is not overwritten: the section is appended to it, leaving the\n * siblings' keys and comments exactly as they were. A file that already has a\n * `graph:` key is refused.\n */\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { parse as parseYaml } from \"yaml\";\nimport { errorMessage } from \"../../shared/errors.js\";\nimport { writeTextAtomic } from \"../../shared/write-file.js\";\nimport { GraphError } from \"../types.js\";\nimport { CONFIG_SECTION, DEFAULT_CONFIG_FILENAME } from \"../core/config.js\";\n\nconst HEADER = `# manni.config.yaml — shared configuration for the manni family of tools.\n# Each tool reads its own top-level key; manni graph reads \"graph:\".\n`;\n\nconst STARTER = `# Base IRI for every minted node. Set this to a namespace you control;\n# without it, IRIs fall back to the urn:manni:graph: placeholder.\n# baseIri: https://example.com/graph/\n\n# There is no document set here. \\`manni graph build\\` and \\`manni graph fill\\` read the\n# paths you name, or the collections declared once for every tool at the TOP\n# level of this file, beside \\`graph:\\` rather than inside it:\n#\n# collections:\n# - name: site\n# paths: [\"docs/**/*.md\"]\n#\n# Output of \\`manni graph build\\`.\nout: graph/graph.ttl\n\n# Map published-site routes back to source files so route-style links\n# (/docs/actions/find) become graph edges. A route may also carry the BCP-47\n# \\`language\\` labelling every document under its root; a page's own \\`lang\\`\n# frontmatter wins. Uncomment and adjust:\n# routes:\n# - basePath: /docs\n# root: docs\n# extensions: [.md, .mdx, .markdown]\n# indexFiles: [index, README]\n# - basePath: /docs/de\n# root: docs/de\n# language: de\n\n# What to derive triples from. Remove entries to opt out.\nbuild:\n derive: [frontmatter, sections, links, tags, images, code, provenance]\n\n# PROV-O settings. Git history is detected, not switched: per-file dates and\n# author agents, rename -> prov:wasRevisionOf, and the build activity's HEAD\n# committer date are derived wherever git can run over a repository, and a run\n# that cannot says so once and builds the rest. Deterministic per commit;\n# wall-clock time never enters the graph.\n# qualified: emit prov:qualifiedAttribution/qualifiedAssociation nodes\n# with roles alongside the direct properties.\nprovenance:\n qualified: true\n\n# Which fields a published graph may carry is read from x-manni-graph-output in\n# the schema set \\`manni meta validate\\` resolves for each page. Set that under\n# meta: (schemas, strict, register), not here. The default set keeps the\n# stewardship people fields (owner, stakeholders, reviewed-by) out.\n\n# SHACL shapes \\`manni graph check\\` validates the built graph against. Default:\n# the shapes contract bundled with manni (shapes/graph/shapes-1.0.0.ttl).\n# check:\n# shapes: [\"./my-shapes.ttl\"]\n\n# Metadata coverage gate for \\`manni graph stats --check\\`. A number applies to\n# every measured field; a map gates named fields only. Unset gates nothing.\n# stats:\n# coverageThreshold:\n# title: 100\n# description: 50\n\n# Which provider \\`manni graph fill\\` sends pages to. Unset, the family's\n# top-level providers: map decides, and then \\`auto\\`, which detects one: an\n# Anthropic key, then an OpenAI key, then the Claude CLI, then a local model.\n# Connection settings (apiKeyEnv, baseUrl, command) live in that map, declared\n# once for every manni tool. \\`--provider\\` wins over this, \\`--local\\` over both.\n# provider: anthropic # auto | anthropic | openai | claude-cli | llama-cpp\n# model: claude-sonnet-4-5 # the provider's default when omitted\n\n# LLM settings for \\`manni graph fill\\` (SKOS frontmatter proposals).\nfill:\n temperature: 0\n # Stop after this many inference calls. One page is one turn, and a cached\n # page spends none. Unset is unbounded.\n # maxTurns: 50\n cacheDir: .manni/graph/cache\n # fill proposes every field; confidence (0..1 per field) gates what is\n # written. Fields scored below the threshold are reported, not written.\n confidenceThreshold: 0.7\n # fields: defaults to every fillable field — uncomment to restrict.\n # Record meta-provenance (model + /graph/ pointers + confidence) on filled docs.\n writeProvenance: true\n # Reject proposals that would violate the SHACL shapes contract\n # (broader/narrower cycles, conflicting labels).\n validateGraph: true\n # Also propose per-section metadata. Off by default: it costs more output per\n # call, and section metadata is explicit-only, so review it as carefully.\n sections: false\n\n# Local embeddings for semantic search (\\`manni graph embed\\`). Needs the optional\n# peer: npm install @huggingface/transformers\n# embed:\n# model: onnx-community/granite-embedding-small-english-r2-ONNX\n# dtype: q8 # q8 keeps embedding reproducible across platforms\n# out: graph # directory for the per-language vector sidecars\n# cacheDir: .manni/graph/embed-cache\n\n# Optional enrichment for \\`manni graph export iirds\\` (the iiRDS package).\n# Absent, a minimal valid package is still produced.\n# export:\n# iirds:\n# title: My Docs # package title (default: \"manni graph export\")\n# creator: Acme Corp # Creator iirds:Party + vcard:Organization\n# version: \"1.3\" # iiRDS version literal: \"1.2\" | \"1.3\"\n`;\n\n/** The starter as a `graph:` section: every line nested one level. */\nfunction starterSection(): string {\n const body = STARTER.split(\"\\n\")\n .map((line) => (line === \"\" ? \"\" : ` ${line}`))\n .join(\"\\n\");\n return `${CONFIG_SECTION}:\\n${body}`;\n}\n\nexport async function runInit(cwd = process.cwd()): Promise<string> {\n const path = resolve(cwd, DEFAULT_CONFIG_FILENAME);\n if (!existsSync(path)) {\n await writeTextAtomic(path, `${HEADER}${starterSection()}`);\n return path;\n }\n\n // A family file is already here. Parse it to make sure a `graph:` key can be\n // appended: the document must be a mapping (or empty) without one.\n const text = readFileSync(path, \"utf8\");\n let doc: unknown;\n try {\n doc = parseYaml(text);\n } catch (e) {\n throw new GraphError(\n `Invalid YAML in ${DEFAULT_CONFIG_FILENAME}: ${errorMessage(e)}`,\n );\n }\n if (doc != null && (typeof doc !== \"object\" || Array.isArray(doc))) {\n throw new GraphError(\n `${DEFAULT_CONFIG_FILENAME}: top level must be a mapping — not adding a \\`${CONFIG_SECTION}:\\` section to it.`,\n );\n }\n if (doc != null && Object.hasOwn(doc, CONFIG_SECTION)) {\n throw new GraphError(\n `${DEFAULT_CONFIG_FILENAME} already has a \\`${CONFIG_SECTION}:\\` section — not overwriting.`,\n );\n }\n // Append as text rather than re-serialising the document, so the siblings'\n // keys and comments come out byte-for-byte as they went in.\n const separator = text === \"\" || text.endsWith(\"\\n\") ? \"\" : \"\\n\";\n const blank = text === \"\" ? \"\" : \"\\n\";\n await writeTextAtomic(\n path,\n `${text}${separator}${blank}${starterSection()}`,\n );\n return path;\n}\n"],"mappings":"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","names":[]}
@@ -1,26 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- renderFindingsGithub
4
- } from "./chunk-55GMOVKW.js";
5
- import "./chunk-ABHG6I3G.js";
6
- import "./chunk-77AINBYM.js";
7
- import "./chunk-IKEWBMCN.js";
8
- import "./chunk-G6FNWRAI.js";
9
- import "./chunk-2W34HX2U.js";
10
- import "./chunk-KBG463UK.js";
11
- import "./chunk-QBVP3SQP.js";
12
- import "./chunk-G7XD4QH5.js";
13
- import "./chunk-YEUYKR62.js";
14
- import "./chunk-RNVYGWIC.js";
15
- import "./chunk-MNH7QO4Z.js";
16
- import "./chunk-6M5VJOC2.js";
17
- import "./chunk-HX44GB4Z.js";
18
- import "./chunk-QCHVR4ZM.js";
19
- import "./chunk-2BV4FBC7.js";
20
- import "./chunk-OWBRDNRZ.js";
21
- import "./chunk-G3T47CFV.js";
22
- import "./chunk-2H7UOFLK.js";
23
- export {
24
- renderFindingsGithub
25
- };
26
- //# sourceMappingURL=github-ESK45CEZ.js.map
@@ -1,31 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- NAMES_ITS_SUBJECT,
4
- findingMessage,
5
- renderCheckGithub
6
- } from "./chunk-SUTMSDQ2.js";
7
- import "./chunk-7Y3N4Y72.js";
8
- import "./chunk-RZVCWX5R.js";
9
- import "./chunk-PK7EKJ5T.js";
10
- import "./chunk-IKEWBMCN.js";
11
- import "./chunk-G6FNWRAI.js";
12
- import "./chunk-2W34HX2U.js";
13
- import "./chunk-KBG463UK.js";
14
- import "./chunk-QBVP3SQP.js";
15
- import "./chunk-G7XD4QH5.js";
16
- import "./chunk-YEUYKR62.js";
17
- import "./chunk-RNVYGWIC.js";
18
- import "./chunk-MNH7QO4Z.js";
19
- import "./chunk-6M5VJOC2.js";
20
- import "./chunk-HX44GB4Z.js";
21
- import "./chunk-QCHVR4ZM.js";
22
- import "./chunk-2BV4FBC7.js";
23
- import "./chunk-OWBRDNRZ.js";
24
- import "./chunk-G3T47CFV.js";
25
- import "./chunk-2H7UOFLK.js";
26
- export {
27
- NAMES_ITS_SUBJECT,
28
- findingMessage,
29
- renderCheckGithub
30
- };
31
- //# sourceMappingURL=github-WER7JUTN.js.map