@hawkeyexl/manni 4.4.1 → 4.6.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 (226) hide show
  1. package/README.md +1 -1
  2. package/dist/batch-OZOACN4G.js +41 -0
  3. package/dist/build-Z5VOVADH.js +32 -0
  4. package/dist/calibrate-TZYT42DR.js +36 -0
  5. package/dist/capture-SL4MNDDP.js +34 -0
  6. package/dist/check-5OMA42Y6.js +26 -0
  7. package/dist/{check-HYNGXYJV.js → check-OAJWC3WD.js} +7 -5
  8. package/dist/{check-ASPIHA6B.js → check-PKY7KTQE.js} +13 -14
  9. package/dist/check-WB2QDHJQ.js +880 -0
  10. package/dist/check-WB2QDHJQ.js.map +1 -0
  11. package/dist/{chunk-MWJLZMBL.js → chunk-2JFPBZJK.js} +11 -11
  12. package/dist/{chunk-QQUKGCAJ.js → chunk-2KRB3EG7.js} +2 -2
  13. package/dist/{chunk-DXNZS72W.js → chunk-2M6DVNI5.js} +10 -6
  14. package/dist/{chunk-DXNZS72W.js.map → chunk-2M6DVNI5.js.map} +1 -1
  15. package/dist/{chunk-QZ6LRSNV.js → chunk-3NWX34ZI.js} +19 -19
  16. package/dist/{chunk-IDV6HJCB.js → chunk-5G53XATW.js} +4 -4
  17. package/dist/{chunk-M2JCK5F6.js → chunk-6KKZXB2O.js} +19 -6
  18. package/dist/chunk-6KKZXB2O.js.map +1 -0
  19. package/dist/{chunk-PNPQTHBT.js → chunk-733Y2STG.js} +2 -2
  20. package/dist/{chunk-WB3QM6PP.js → chunk-73TC4DYH.js} +332 -2522
  21. package/dist/chunk-73TC4DYH.js.map +1 -0
  22. package/dist/{chunk-EPH54CAY.js → chunk-7WRP5FFP.js} +4 -4
  23. package/dist/{chunk-NXV7WE2D.js → chunk-APKH2T6E.js} +29 -591
  24. package/dist/chunk-APKH2T6E.js.map +1 -0
  25. package/dist/{chunk-I2AH3CJJ.js → chunk-B3TS4WRM.js} +17 -15
  26. package/dist/{chunk-I2AH3CJJ.js.map → chunk-B3TS4WRM.js.map} +1 -1
  27. package/dist/chunk-BWCWTHYS.js +146 -0
  28. package/dist/chunk-BWCWTHYS.js.map +1 -0
  29. package/dist/{chunk-MMTSSTG7.js → chunk-C3B2VJNC.js} +2 -2
  30. package/dist/{chunk-PU6DFJMY.js → chunk-C73RSUIC.js} +4 -4
  31. package/dist/chunk-CU57HT2E.js +116 -0
  32. package/dist/chunk-CU57HT2E.js.map +1 -0
  33. package/dist/chunk-CWXZ2MRT.js +222 -0
  34. package/dist/chunk-CWXZ2MRT.js.map +1 -0
  35. package/dist/{chunk-GCQRPUSB.js → chunk-DC5DDJVE.js} +6 -6
  36. package/dist/{chunk-6OYEI2VV.js → chunk-ECVQNGTH.js} +3 -3
  37. package/dist/chunk-FLAO4ZS3.js +502 -0
  38. package/dist/chunk-FLAO4ZS3.js.map +1 -0
  39. package/dist/chunk-FQGLRJGX.js +174 -0
  40. package/dist/chunk-FQGLRJGX.js.map +1 -0
  41. package/dist/{chunk-7UKO3ASZ.js → chunk-GAJIJKET.js} +3 -3
  42. package/dist/{chunk-6JSSEWBG.js → chunk-GREQKO6M.js} +202 -54
  43. package/dist/chunk-GREQKO6M.js.map +1 -0
  44. package/dist/chunk-HX44GB4Z.js +30 -0
  45. package/dist/chunk-HX44GB4Z.js.map +1 -0
  46. package/dist/{chunk-4IUC2MNL.js → chunk-IY7NYNPZ.js} +9 -11
  47. package/dist/{chunk-4IUC2MNL.js.map → chunk-IY7NYNPZ.js.map} +1 -1
  48. package/dist/{chunk-57NEQRVO.js → chunk-KCOFEWV5.js} +8 -6
  49. package/dist/{chunk-57NEQRVO.js.map → chunk-KCOFEWV5.js.map} +1 -1
  50. package/dist/chunk-M2RLHZ4J.js +849 -0
  51. package/dist/chunk-M2RLHZ4J.js.map +1 -0
  52. package/dist/{chunk-NLXTXE5Y.js → chunk-M6GSS72T.js} +185 -33
  53. package/dist/chunk-M6GSS72T.js.map +1 -0
  54. package/dist/{chunk-YTURO7SI.js → chunk-MHM4QEBV.js} +4 -4
  55. package/dist/{chunk-RL5XWQOL.js → chunk-MOWMCEOJ.js} +143 -54
  56. package/dist/chunk-MOWMCEOJ.js.map +1 -0
  57. package/dist/{chunk-C4SQM22E.js → chunk-MWBJ3KTF.js} +13 -11
  58. package/dist/chunk-MWBJ3KTF.js.map +1 -0
  59. package/dist/chunk-N7JSEDSC.js +233 -0
  60. package/dist/chunk-N7JSEDSC.js.map +1 -0
  61. package/dist/{chunk-JCDXE76J.js → chunk-NBMPHD4I.js} +2 -2
  62. package/dist/{chunk-37LP5HMZ.js → chunk-NHHOPZRA.js} +12 -10
  63. package/dist/{chunk-37LP5HMZ.js.map → chunk-NHHOPZRA.js.map} +1 -1
  64. package/dist/{chunk-YB4IBW3M.js → chunk-NTWW7J76.js} +2 -2
  65. package/dist/{chunk-UJCVAWP7.js → chunk-PCFG7E6B.js} +3 -3
  66. package/dist/{chunk-UJCVAWP7.js.map → chunk-PCFG7E6B.js.map} +1 -1
  67. package/dist/{chunk-FBEQCK47.js → chunk-PL4UAF4S.js} +73 -1304
  68. package/dist/chunk-PL4UAF4S.js.map +1 -0
  69. package/dist/chunk-QCHVR4ZM.js +286 -0
  70. package/dist/chunk-QCHVR4ZM.js.map +1 -0
  71. package/dist/{chunk-PIKOVN6W.js → chunk-QW77LCOU.js} +10 -10
  72. package/dist/{chunk-2B7ZNTPV.js → chunk-SM6NOMJS.js} +2 -2
  73. package/dist/chunk-SWSTHZBI.js +2464 -0
  74. package/dist/chunk-SWSTHZBI.js.map +1 -0
  75. package/dist/{chunk-JXLTXMJ7.js → chunk-T6SYGLWR.js} +3 -3
  76. package/dist/{chunk-CK7SKVHR.js → chunk-TBAMBLF3.js} +3 -12
  77. package/dist/chunk-TBAMBLF3.js.map +1 -0
  78. package/dist/chunk-TH4JVQPF.js +133 -0
  79. package/dist/chunk-TH4JVQPF.js.map +1 -0
  80. package/dist/{chunk-QRWGPQKO.js → chunk-TLXE7LYK.js} +4 -4
  81. package/dist/{chunk-M3W7J6MU.js → chunk-TUAAR3MM.js} +3280 -283
  82. package/dist/chunk-TUAAR3MM.js.map +1 -0
  83. package/dist/{chunk-SKSDRUUK.js → chunk-UAKNZVCD.js} +4 -4
  84. package/dist/{chunk-YJOGUXGP.js → chunk-UJSGS2Y5.js} +8 -6
  85. package/dist/{chunk-YJOGUXGP.js.map → chunk-UJSGS2Y5.js.map} +1 -1
  86. package/dist/{chunk-UQISLDAV.js → chunk-UWQ2UVHE.js} +8 -6
  87. package/dist/{chunk-UQISLDAV.js.map → chunk-UWQ2UVHE.js.map} +1 -1
  88. package/dist/chunk-WQWKYAAK.js +86 -0
  89. package/dist/chunk-WQWKYAAK.js.map +1 -0
  90. package/dist/{chunk-LJ2RDH3F.js → chunk-XG6PVB5S.js} +1 -23
  91. package/dist/chunk-XG6PVB5S.js.map +1 -0
  92. package/dist/{chunk-Q35YIDBV.js → chunk-XKBEHKWO.js} +29 -264
  93. package/dist/chunk-XKBEHKWO.js.map +1 -0
  94. package/dist/chunk-XPEWUK7J.js +532 -0
  95. package/dist/chunk-XPEWUK7J.js.map +1 -0
  96. package/dist/{chunk-MYMBCTDE.js → chunk-XXDXIIQ4.js} +2 -2
  97. package/dist/chunk-YGFIQ6Y5.js +17 -0
  98. package/dist/chunk-YGFIQ6Y5.js.map +1 -0
  99. package/dist/chunk-YLK2J5YK.js +610 -0
  100. package/dist/chunk-YLK2J5YK.js.map +1 -0
  101. package/dist/{chunk-3VK37OR2.js → chunk-Z4IZGEM3.js} +16 -12
  102. package/dist/{chunk-3VK37OR2.js.map → chunk-Z4IZGEM3.js.map} +1 -1
  103. package/dist/{cli-6HIDIFVT.js → cli-6EWVMEN6.js} +5 -3
  104. package/dist/{cli-6HIDIFVT.js.map → cli-6EWVMEN6.js.map} +1 -1
  105. package/dist/{cli-VI7VHWNZ.js → cli-6H7HVDMQ.js} +113 -20
  106. package/dist/{cli-VI7VHWNZ.js.map → cli-6H7HVDMQ.js.map} +1 -1
  107. package/dist/{cli-RPM5PELX.js → cli-EPVZHAZS.js} +24 -20
  108. package/dist/cli-EPVZHAZS.js.map +1 -0
  109. package/dist/{cli-MN7PYMBI.js → cli-LUCSGTVI.js} +17 -19
  110. package/dist/{cli-MN7PYMBI.js.map → cli-LUCSGTVI.js.map} +1 -1
  111. package/dist/{cli-LFP5ZGYS.js → cli-NIG4N3XM.js} +16 -15
  112. package/dist/{cli-LFP5ZGYS.js.map → cli-NIG4N3XM.js.map} +1 -1
  113. package/dist/{cli-PYPX6O6E.js → cli-PSKNB66T.js} +225 -58
  114. package/dist/cli-PSKNB66T.js.map +1 -0
  115. package/dist/{cli-3BIBYHFK.js → cli-UO4NHIB3.js} +17 -17
  116. package/dist/{cli-6UB5N6CU.js → cli-UQ7A3YA2.js} +17 -18
  117. package/dist/{cli-6UB5N6CU.js.map → cli-UQ7A3YA2.js.map} +1 -1
  118. package/dist/{cli-673OTRGE.js → cli-YHYDLQAF.js} +10 -10
  119. package/dist/cli.js +11 -11
  120. package/dist/config-P4HDNTYD.js +26 -0
  121. package/dist/conformance-ZFCMKM6M.js +18 -0
  122. package/dist/docmeta.js +9 -9
  123. package/dist/github-7ZCH5PSO.js +26 -0
  124. package/dist/github-POT6724K.js +31 -0
  125. package/dist/host-6GURH5HE.js +23 -0
  126. package/dist/index.d.ts +102 -12
  127. package/dist/index.js +185 -171
  128. package/dist/index.js.map +1 -1
  129. package/dist/{json-SY7KLNC7.js → json-KT2K62L5.js} +12 -13
  130. package/dist/lint-5AQ5C2BV.js +29 -0
  131. package/dist/list-5JZKX2NK.js +28 -0
  132. package/dist/list-SWPFXQMU.js +30 -0
  133. package/dist/{page-KSGV5RD4.js → page-UPSXRP75.js} +11 -12
  134. package/dist/prepare-6GNEWCNH.js +155 -0
  135. package/dist/prepare-6GNEWCNH.js.map +1 -0
  136. package/dist/{pretty-CXSDXNAS.js → pretty-Q6FQAOK4.js} +13 -14
  137. package/dist/{pretty-A5EGTN35.js → pretty-SQRPFPSQ.js} +12 -13
  138. package/dist/provider-AMGRDY6V.js +34 -0
  139. package/dist/release-IECYCLTD.js +36 -0
  140. package/dist/release-IECYCLTD.js.map +1 -0
  141. package/dist/{reporters-HUY7UXFS.js → reporters-45MMC2ID.js} +13 -13
  142. package/dist/{reporters-K2VUKSAK.js → reporters-XUV4MM64.js} +7 -5
  143. package/dist/reporters-XUV4MM64.js.map +1 -0
  144. package/dist/run-KMWY2IAN.js +32 -0
  145. package/dist/run-KMWY2IAN.js.map +1 -0
  146. package/dist/{term-BIQUPMOR.js → term-PCJUCWNF.js} +16 -17
  147. package/dist/{term-BIQUPMOR.js.map → term-PCJUCWNF.js.map} +1 -1
  148. package/dist/validate-IMNCZNWG.js +17 -0
  149. package/dist/validate-IMNCZNWG.js.map +1 -0
  150. package/package.json +2 -2
  151. package/plugin/manni/.claude-plugin/plugin.json +1 -1
  152. package/plugin/manni/hooks/hooks.json +47 -0
  153. package/dist/batch-GFNLTGOH.js +0 -36
  154. package/dist/build-COYIQ25L.js +0 -31
  155. package/dist/calibrate-MDBLJKEE.js +0 -31
  156. package/dist/capture-LRML2PKV.js +0 -32
  157. package/dist/check-EDLBYL5N.js +0 -27
  158. package/dist/chunk-6JSSEWBG.js.map +0 -1
  159. package/dist/chunk-A5ULMVHQ.js +0 -164
  160. package/dist/chunk-A5ULMVHQ.js.map +0 -1
  161. package/dist/chunk-C4SQM22E.js.map +0 -1
  162. package/dist/chunk-CK7SKVHR.js.map +0 -1
  163. package/dist/chunk-FBEQCK47.js.map +0 -1
  164. package/dist/chunk-LJ2RDH3F.js.map +0 -1
  165. package/dist/chunk-M2JCK5F6.js.map +0 -1
  166. package/dist/chunk-M3W7J6MU.js.map +0 -1
  167. package/dist/chunk-NLXTXE5Y.js.map +0 -1
  168. package/dist/chunk-NXV7WE2D.js.map +0 -1
  169. package/dist/chunk-Q35YIDBV.js.map +0 -1
  170. package/dist/chunk-RL5XWQOL.js.map +0 -1
  171. package/dist/chunk-TK3FC4RF.js +0 -3090
  172. package/dist/chunk-TK3FC4RF.js.map +0 -1
  173. package/dist/chunk-TU2WUBVZ.js +0 -2
  174. package/dist/chunk-WB3QM6PP.js.map +0 -1
  175. package/dist/cli-PYPX6O6E.js.map +0 -1
  176. package/dist/cli-RPM5PELX.js.map +0 -1
  177. package/dist/github-6QMYOHC3.js +0 -27
  178. package/dist/github-SXPGP5DB.js +0 -32
  179. package/dist/lint-ASMJLLPA.js +0 -28
  180. package/dist/list-KZNVTNVC.js +0 -31
  181. package/dist/list-Q57YTFUQ.js +0 -29
  182. package/dist/run-3DYJNRIG.js +0 -33
  183. package/dist/validate-53RKM2XG.js +0 -16
  184. /package/dist/{batch-GFNLTGOH.js.map → batch-OZOACN4G.js.map} +0 -0
  185. /package/dist/{build-COYIQ25L.js.map → build-Z5VOVADH.js.map} +0 -0
  186. /package/dist/{calibrate-MDBLJKEE.js.map → calibrate-TZYT42DR.js.map} +0 -0
  187. /package/dist/{capture-LRML2PKV.js.map → capture-SL4MNDDP.js.map} +0 -0
  188. /package/dist/{check-ASPIHA6B.js.map → check-5OMA42Y6.js.map} +0 -0
  189. /package/dist/{check-EDLBYL5N.js.map → check-OAJWC3WD.js.map} +0 -0
  190. /package/dist/{check-HYNGXYJV.js.map → check-PKY7KTQE.js.map} +0 -0
  191. /package/dist/{chunk-MWJLZMBL.js.map → chunk-2JFPBZJK.js.map} +0 -0
  192. /package/dist/{chunk-QQUKGCAJ.js.map → chunk-2KRB3EG7.js.map} +0 -0
  193. /package/dist/{chunk-QZ6LRSNV.js.map → chunk-3NWX34ZI.js.map} +0 -0
  194. /package/dist/{chunk-IDV6HJCB.js.map → chunk-5G53XATW.js.map} +0 -0
  195. /package/dist/{chunk-PNPQTHBT.js.map → chunk-733Y2STG.js.map} +0 -0
  196. /package/dist/{chunk-EPH54CAY.js.map → chunk-7WRP5FFP.js.map} +0 -0
  197. /package/dist/{chunk-MMTSSTG7.js.map → chunk-C3B2VJNC.js.map} +0 -0
  198. /package/dist/{chunk-PU6DFJMY.js.map → chunk-C73RSUIC.js.map} +0 -0
  199. /package/dist/{chunk-GCQRPUSB.js.map → chunk-DC5DDJVE.js.map} +0 -0
  200. /package/dist/{chunk-6OYEI2VV.js.map → chunk-ECVQNGTH.js.map} +0 -0
  201. /package/dist/{chunk-7UKO3ASZ.js.map → chunk-GAJIJKET.js.map} +0 -0
  202. /package/dist/{chunk-YTURO7SI.js.map → chunk-MHM4QEBV.js.map} +0 -0
  203. /package/dist/{chunk-JCDXE76J.js.map → chunk-NBMPHD4I.js.map} +0 -0
  204. /package/dist/{chunk-YB4IBW3M.js.map → chunk-NTWW7J76.js.map} +0 -0
  205. /package/dist/{chunk-PIKOVN6W.js.map → chunk-QW77LCOU.js.map} +0 -0
  206. /package/dist/{chunk-2B7ZNTPV.js.map → chunk-SM6NOMJS.js.map} +0 -0
  207. /package/dist/{chunk-JXLTXMJ7.js.map → chunk-T6SYGLWR.js.map} +0 -0
  208. /package/dist/{chunk-QRWGPQKO.js.map → chunk-TLXE7LYK.js.map} +0 -0
  209. /package/dist/{chunk-SKSDRUUK.js.map → chunk-UAKNZVCD.js.map} +0 -0
  210. /package/dist/{chunk-MYMBCTDE.js.map → chunk-XXDXIIQ4.js.map} +0 -0
  211. /package/dist/{cli-3BIBYHFK.js.map → cli-UO4NHIB3.js.map} +0 -0
  212. /package/dist/{chunk-TU2WUBVZ.js.map → cli-YHYDLQAF.js.map} +0 -0
  213. /package/dist/{cli-673OTRGE.js.map → config-P4HDNTYD.js.map} +0 -0
  214. /package/dist/{github-6QMYOHC3.js.map → conformance-ZFCMKM6M.js.map} +0 -0
  215. /package/dist/{github-SXPGP5DB.js.map → github-7ZCH5PSO.js.map} +0 -0
  216. /package/dist/{json-SY7KLNC7.js.map → github-POT6724K.js.map} +0 -0
  217. /package/dist/{lint-ASMJLLPA.js.map → host-6GURH5HE.js.map} +0 -0
  218. /package/dist/{list-KZNVTNVC.js.map → json-KT2K62L5.js.map} +0 -0
  219. /package/dist/{list-Q57YTFUQ.js.map → lint-5AQ5C2BV.js.map} +0 -0
  220. /package/dist/{page-KSGV5RD4.js.map → list-5JZKX2NK.js.map} +0 -0
  221. /package/dist/{pretty-A5EGTN35.js.map → list-SWPFXQMU.js.map} +0 -0
  222. /package/dist/{pretty-CXSDXNAS.js.map → page-UPSXRP75.js.map} +0 -0
  223. /package/dist/{reporters-HUY7UXFS.js.map → pretty-Q6FQAOK4.js.map} +0 -0
  224. /package/dist/{reporters-K2VUKSAK.js.map → pretty-SQRPFPSQ.js.map} +0 -0
  225. /package/dist/{run-3DYJNRIG.js.map → provider-AMGRDY6V.js.map} +0 -0
  226. /package/dist/{validate-53RKM2XG.js.map → reporters-45MMC2ID.js.map} +0 -0
@@ -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/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 type CheckFormat,\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/** The check a hook asks for, or `undefined` when this event is not one `check` answers. */\nfunction 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\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 if (asked === undefined) return;\n try {\n const 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 send(hookReply(run, envelope));\n } catch (err) {\n if (err instanceof FamilyError && err.quiet) return;\n send(hookFailure(errorMessage(err), envelope, asked.file));\n }\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}\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 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 };\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 * | a11y, tracevals | never run by `check`: they need a running site, sessions or a model |\n *\n * Only members of a declared collection are checked.\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/** The two domains `check` never runs, and what to run instead. */\nexport const NOT_CHECKED: ReadonlyArray<readonly [string, string]> = [\n [\"a11y\", \"run manni a11y check against a running site\"],\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 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 sections =\n doc !== null && typeof doc === \"object\" && !Array.isArray(doc)\n ? new Set(Object.keys(doc))\n : new Set<string>();\n return { file, configPath: configPath ?? file.source, sections, collections: file.collections };\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 { extname, resolve } from \"node:path\";\nimport pkg from \"../../../package.json\" with { type: \"json\" };\nimport { errorMessage } from \"../../shared/errors.js\";\nimport { resolveTargetSet } from \"../../meta/internal.js\";\nimport { supportedExtensions } from \"../../meta/extractors/index.js\";\nimport { changedFiles } from \"../core/changed.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\" && failed) {\n const reply = envelope.stopHookActive\n ? { systemMessage: \"manni still reports errors after one repair pass. Run manni check to see them.\" }\n : {\n decision: \"block\",\n reason: `manni found errors in the files you changed. Fix them, then finish.\\n\\n${renderFailures(run)}`,\n };\n return { exitCode: 0, stdout: `${JSON.stringify(reply)}\\n` };\n }\n return { exitCode: 0 };\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 * `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 { 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 DomainRow {\n name: string;\n status: DomainState;\n reason: string;\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}\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) domains.push({ name, status: \"not-checked\", reason });\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 const rows = report.domains.map(\n (d) => `${d.name.padEnd(11)}${STATE_LABEL[d.status].padEnd(14)}${d.reason}`,\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAWA,SAAS,WAAAA,gBAAe;AACxB,SAAS,SAAS,cAAc;;;ACehC,SAAS,IAAI,OAAoC;AAC/C,SAAO,OAAO,UAAU,YAAY,MAAM,SAAS,IAAI,QAAQ;AACjE;AAEA,SAAS,OAAO,OAAqD;AACnE,SAAO,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,IACrE,QACD;AACN;AAGO,SAAS,cAAc,MAAoC;AAChE,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,IAAI;AAAA,EAC1B,QAAQ;AACN,WAAO;AAAA,EACT;AACA,QAAM,MAAM,OAAO,MAAM;AACzB,QAAM,QAAQ,IAAI,KAAK,eAAe;AACtC,MAAI,QAAQ,UAAa,UAAU,OAAW,QAAO;AACrD,QAAM,QAAQ,OAAO,IAAI,UAAU;AACnC,QAAM,WAAW,IAAI,OAAO,SAAS,KAAK,IAAI,OAAO,aAAa;AAClE,QAAM,MAAM,IAAI,IAAI,GAAG;AACvB,QAAM,WAAW,IAAI,IAAI,SAAS;AAClC,QAAM,QAAQ,IAAI,IAAI,KAAK,KAAK,IAAI,OAAO,IAAI,KAAK,GAAG,EAAE;AACzD,SAAO;AAAA,IACL;AAAA,IACA,gBAAgB,IAAI,qBAAqB;AAAA,IACzC,GAAI,QAAQ,SAAY,CAAC,IAAI,EAAE,IAAI;AAAA,IACnC,GAAI,aAAa,SAAY,CAAC,IAAI,EAAE,SAAS;AAAA,IAC7C,GAAI,aAAa,SAAY,CAAC,IAAI,EAAE,SAAS;AAAA,IAC7C,GAAI,UAAU,SAAY,CAAC,IAAI,EAAE,MAAM;AAAA,EACzC;AACF;AAGA,eAAsB,aACpB,SAA4B,QAAQ,OACL;AAC/B,MAAI,OAAO,MAAO,QAAO;AACzB,MAAI;AACF,WAAO,cAAc,MAAM,UAAU,MAAM,CAAC;AAAA,EAC9C,QAAQ;AAEN,WAAO;AAAA,EACT;AACF;;;ACvDA,SAAS,UAAU,SAAS,WAAW;AACvC,SAAS,SAAS,iBAAiB;AAY5B,IAAM,cAAN,cAA0B,UAAU;AAAA,EACzC,YACE,SAES,QAAQ,OACjB;AACA,UAAM,OAAO;AAFJ;AAGT,SAAK,OAAO;AAAA,EACd;AAAA,EAJW;AAKb;AAEO,SAAS,cAAc,KAA0B;AACtD,SAAO,IAAI;AAAA,IACT,mCAAmC,GAAG;AAAA,IACtC;AAAA,EACF;AACF;AAEO,SAAS,oBAAiC;AAC/C,SAAO,IAAI;AAAA,IACT;AAAA,IACA;AAAA,EACF;AACF;AAGO,IAAM,UAAU,CAAC,QAAQ,QAAQ,QAAQ,YAAY,QAAQ,OAAO;AAIpE,IAAM,WAA6C;AAAA,EACxD,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,OAAO;AACT;AAGO,IAAM,aAA+C;AAAA,EAC1D,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,OAAO;AACT;AAGO,IAAM,qBAAqB;AAG3B,IAAM,cAAwD;AAAA,EACnE,CAAC,QAAQ,6CAA6C;AAAA,EACtD,CAAC,aAAa,uCAAuC;AACvD;AAGO,SAAS,OAAO,GAAW,KAAa,OAAO,GAAG,GAAG,KAAa;AACvE,SAAO,GAAG,OAAO,CAAC,CAAC,IAAI,MAAM,IAAI,MAAM,IAAI;AAC7C;AAeA,SAAS,QAAQ,SAA8B;AAC7C,SAAO,IAAI,YAAY,OAAO;AAChC;AAEA,eAAsB,WAAW,KAAa,YAAsC;AAClF,QAAM,OACJ,eAAe,SACX,MAAM,qBAAqB,KAAK,OAAO,IACvC,MAAM,qBAAqB,YAAY,KAAK,OAAO;AACzD,MAAI,SAAS,KAAM,OAAM,cAAc,GAAG;AAE1C,QAAM,MAAM,UAAU,KAAK,IAAI;AAC/B,QAAM,WACJ,QAAQ,QAAQ,OAAO,QAAQ,YAAY,CAAC,MAAM,QAAQ,GAAG,IACzD,IAAI,IAAI,OAAO,KAAK,GAAG,CAAC,IACxB,oBAAI,IAAY;AACtB,SAAO,EAAE,MAAM,YAAY,cAAc,KAAK,QAAQ,UAAU,aAAa,KAAK,YAAY;AAChG;AAGO,SAAS,UAAU,KAAa,MAAsB;AAC3D,SAAO,SAAS,KAAK,IAAI,EAAE,MAAM,GAAG,EAAE,KAAK,GAAG;AAChD;AAGO,SAAS,cAAc,QAAgB,KAAa,OAAyB;AAClF,SAAO,SAAS,OAAO,aAAa,OAAO,KAAK,KAAK,KAAK,KAAK;AACjE;AAGA,eAAsB,YAAY,QAAgB,KAAgC;AAChF,QAAM,MAAM,OAAO,KAAK;AACxB,QAAM,EAAE,MAAM,IAAI,MAAM,iBAAiB;AAAA,IACvC,QAAQ,OAAO,YAAY,QAAQ,CAAC,MAAM,EAAE,KAAK;AAAA,IACjD,KAAK;AAAA,IACL,YAAY;AAAA,EACd,CAAC;AACD,SAAO,cAAc,OAAO,CAAC,UAAU,SAAS,OAAO,aAAa,KAAK,KAAK,KAAK,CAAC,EAAE;AAAA,IACpF,CAAC,UAAU,UAAU,KAAK,QAAQ,KAAK,KAAK,CAAC;AAAA,EAC/C;AACF;;;AC/HA,SAAS,SAAS,WAAAC,gBAAe;;;ACZjC,SAAS,gBAAgB;AACzB,SAAS,OAAO,WAAAC,gBAAe;AAC/B,SAAS,iBAAiB;AAE1B,IAAM,MAAM,UAAU,QAAQ;AAE9B,eAAe,IAAI,MAAgB,KAA8B;AAE/D,QAAM,EAAE,OAAO,IAAI,MAAM,IAAI,OAAO,MAAM;AAAA,IACxC;AAAA,IACA,OAAO;AAAA,IACP,aAAa;AAAA,IACb,WAAW,KAAK,OAAO;AAAA,EACzB,CAAC;AACD,SAAO;AACT;AAGO,SAAS,eAAe,QAAwD;AACrF,QAAM,SAAS,OAAO,MAAM,IAAI;AAChC,QAAM,QAAkB,CAAC;AACzB,QAAM,UAAoB,CAAC;AAC3B,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAM,QAAQ,OAAO,CAAC,KAAK;AAC3B,QAAI,MAAM,SAAS,EAAG;AACtB,UAAM,KAAK,MAAM,MAAM,GAAG,CAAC;AAC3B,UAAM,OAAO,MAAM,MAAM,CAAC;AAG1B,QAAI,GAAG,SAAS,GAAG,KAAK,GAAG,SAAS,GAAG,GAAG;AACxC;AACA,UAAI,GAAG,SAAS,GAAG,EAAG,SAAQ,KAAK,OAAO,CAAC,KAAK,EAAE;AAAA,IACpD;AAGA,QAAI,GAAG,SAAS,GAAG,EAAG,SAAQ,KAAK,IAAI;AAAA,QAClC,OAAM,KAAK,IAAI;AAAA,EACtB;AACA,SAAO,EAAE,OAAO,QAAQ;AAC1B;AAcA,eAAsB,aAAa,KAAmC;AAIpE,QAAM,UAAU,MAAM,IAAI,CAAC,aAAa,eAAe,GAAG,GAAG,GAAG,KAAK;AACrE,QAAM,SAAS,MAAM;AAAA,IACnB,CAAC,UAAU,kBAAkB,MAAM,uBAAuB;AAAA,IAC1D;AAAA,EACF;AACA,QAAM,EAAE,OAAO,QAAQ,IAAI,eAAe,MAAM;AAChD,QAAM,WAAW,CAAC,SAAyBA,SAAQ,KAAK,MAAM,SAAS,QAAQ,IAAI,CAAC;AACpF,SAAO,EAAE,OAAO,MAAM,IAAI,QAAQ,GAAG,SAAS,QAAQ,IAAI,QAAQ,GAAG,OAAO,OAAO,SAAS,EAAE;AAChG;;;AD9BO,IAAM,gBAAgB,CAAC,UAAU,QAAQ,QAAQ;AA+DxD,eAAe,UAAU,QAAgB,KAAgC;AACvE,QAAM,EAAE,QAAQ,KAAK,QAAQ,SAAS,IAAI;AAC1C,QAAM,aAAa,OAAO;AAC1B,UAAQ,QAAQ;AAAA,IACd,KAAK,QAAQ;AACX,YAAM,CAAC,EAAE,YAAY,GAAG,EAAE,QAAQ,WAAW,CAAC,IAAI,MAAM,QAAQ,IAAI;AAAA,QAClE,OAAO,wBAAiC;AAAA,QACxC,OAAO,yBAA+B;AAAA,MACxC,CAAC;AACD,YAAMC,OAAM,MAAM,YAAY,EAAE,QAAQ,YAAY,KAAK,iBAAiB,MAAM,SAAS,CAAC;AAC1F,UAAIA,KAAI,QAAQ,WAAW,GAAG;AAC5B,eAAO,EAAE,SAAS,OAAO,SAAS,IAAI,MAAM,IAAI,qBAAqB,WAAW,KAAK;AAAA,MACvF;AACA,aAAO;AAAA,QACL,QAAQA,KAAI,QAAQ,SAAS;AAAA,QAC7B,QAAQ,CAAC,QAAQ,UACf,WAAW,QAAQA,KAAI,SAASA,KAAI,SAAS,EAAE,OAAO,OAAO,MAAM,OAAOA,KAAI,OAAO,SAAS,CAAC;AAAA,MACnG;AAAA,IACF;AAAA,IACA,KAAK,QAAQ;AACX,YAAM,CAAC,EAAE,UAAU,QAAQ,GAAG,EAAE,mBAAmB,WAAW,GAAG,EAAE,iBAAiB,SAAS,GAAG,EAAE,mBAAmB,WAAW,CAAC,IAC/H,MAAM,QAAQ,IAAI;AAAA,QAChB,OAAO,qBAA8B;AAAA,QACrC,OAAO,sBAAgC;AAAA,QACvC,OAAO,oBAA8B;AAAA,QACrC,OAAO,sBAAgC;AAAA,MACzC,CAAC;AACH,YAAMA,OAAM,MAAM,QAAQ,EAAE,QAAQ,YAAY,KAAK,SAAS,CAAC;AAC/D,UAAI,CAACA,KAAI,MAAM,KAAK,CAAC,MAAM,EAAE,UAAU,SAAS,KAAK,EAAE,SAAS,SAAS,CAAC,GAAG;AAC3E,eAAO,EAAE,SAAS,WAAW,KAAK;AAAA,MACpC;AACA,aAAO;AAAA,QACL,QAAQA,KAAI,QAAQ,SAAS;AAAA,QAC7B,QAAQ,CAAC,QAAQ,UACf,WAAW,SACP,SAASA,IAAG,IACZ,WAAW,WACT,WAAWA,IAAG,IACd,WAAWA,MAAK,EAAE,OAAO,OAAO,KAAK,CAAC;AAAA,MAChD;AAAA,IACF;AAAA,IACA,KAAK,QAAQ;AACX,UAAI,CAAC,OAAO,SAAS,IAAI,MAAM,EAAG,QAAO,EAAE,SAAS,WAAW,KAAK;AACpE,YAAM,CAAC,EAAE,QAAQ,GAAG,EAAE,QAAQ,WAAW,CAAC,IAAI,MAAM,QAAQ,IAAI;AAAA,QAC9D,OAAO,oBAA6B;AAAA,QACpC,OAAO,yBAA+B;AAAA,MACxC,CAAC;AACD,YAAMA,OAAM,MAAM,QAAQ,EAAE,QAAQ,YAAY,KAAK,SAAS,CAAC;AAC/D,aAAO;AAAA,QACL,QAAQA,KAAI,QAAQ,SAAS;AAAA,QAC7B,QAAQ,CAAC,QAAQ,UAAU,WAAWA,MAAK,QAAQ,EAAE,MAAM,CAAC;AAAA,MAC9D;AAAA,IACF;AAAA,IACA,KAAK,YAAY;AACf,YAAM,CAAC,EAAE,QAAQ,YAAY,GAAG,EAAE,QAAQ,eAAe,GAAG,EAAE,cAAc,CAAC,IAAI,MAAM,QAAQ,IAAI;AAAA,QACjG,OAAO,mBAAgC;AAAA,QACvC,OAAO,yBAAmC;AAAA,QAC1C,OAAO,qBAAyB;AAAA,MAClC,CAAC;AACD,UAAI;AACJ,UAAI;AACF,iBAAS,MAAM,YAAY,QAAQ;AAAA,UACjC,QAAQ;AAAA,UACR;AAAA,UACA,mBAAmB;AAAA,UACnB,UAAU;AAAA,UACV,WAAW;AAAA,UACX,aAAa,gBAAI;AAAA,QACnB,CAAC;AAAA,MACH,SAAS,KAAK;AACZ,YAAI,eAAe,iBAAiB,IAAI,SAAS,oBAAoB;AACnE,iBAAO,EAAE,SAAS,WAAW,SAAS;AAAA,QACxC;AACA,cAAM;AAAA,MACR;AACA,aAAO;AAAA,QACL,QAAQ,OAAO,aAAa;AAAA,QAC5B,QAAQ,CAAC,QAAQ,UAAU,eAAe,QAAQ,QAAQ,EAAE,MAAM,CAAC;AAAA,MACrE;AAAA,IACF;AAAA,IACA,KAAK,QAAQ;AACX,YAAM,CAAC,EAAE,UAAU,QAAQ,GAAG,EAAE,sBAAsB,WAAW,GAAG,EAAE,oBAAoB,SAAS,GAAG,EAAE,sBAAsB,WAAW,CAAC,IACxI,MAAM,QAAQ,IAAI;AAAA,QAChB,OAAO,qBAA8B;AAAA,QACrC,OAAO,sBAAgC;AAAA,QACvC,OAAO,oBAA8B;AAAA,QACrC,OAAO,sBAAgC;AAAA,MACzC,CAAC;AACH,YAAM,SAAS,MAAM,QAAQ,EAAE,QAAQ,YAAY,KAAK,YAAY,MAAM,SAAS,CAAC;AACpF,UAAI,OAAO,UAAU,EAAG,QAAO,EAAE,SAAS,WAAW,KAAK;AAC1D,aAAO;AAAA,QACL,QAAQ,OAAO,QAAQ,SAAS;AAAA,QAChC,QAAQ,CAAC,QAAQ,UACf,WAAW,SACP,SAAS,MAAM,IACf,WAAW,WACT,WAAW,MAAM,IACjB,WAAW,QAAQ,EAAE,OAAO,YAAY,KAAK,CAAC;AAAA,MACxD;AAAA,IACF;AAAA,IACA,KAAK,SAAS;AACZ,UAAI,CAAC,OAAO,SAAS,IAAI,OAAO,EAAG,QAAO,EAAE,SAAS,WAAW,MAAM;AACtE,YAAM,CAAC,EAAE,WAAW,GAAG,EAAE,UAAU,UAAU,aAAa,YAAY,CAAC,IAAI,MAAM,QAAQ,IAAI;AAAA,QAC3F,OAAO,qBAA+B;AAAA,QACtC,OAAO,qBAA+B;AAAA,MACxC,CAAC;AACD,YAAM,QAAQ,MAAM,WAAW,EAAE,QAAQ,YAAY,IAAI,CAAC;AAC1D,iBAAW,WAAW,MAAM,SAAU,UAAS,OAAO;AACtD,YAAM,SAAS,MAAM,SAAS,EAAE,QAAQ,YAAY,KAAK,QAAQ,MAAM,OAAO,CAAC;AAC/E,aAAO;AAAA,QACL,QAAQ,OAAO,aAAa;AAAA,QAC5B,QAAQ,CAAC,WAAW,YAAY,QAAQ,MAAM;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,QAAQ,QAAgB,KAAqC;AAC1E,QAAM,UAAU,SAAS,MAAM;AAC/B,MAAI;AACF,UAAM,SAAS,MAAM,UAAU,QAAQ,GAAG;AAC1C,QAAI,aAAa,OAAQ,QAAO,EAAE,SAAS,QAAQ,WAAW,SAAS,OAAO,QAAQ;AACtF,WAAO,EAAE,SAAS,QAAQ,OAAO,SAAS,SAAS,QAAQ,QAAQ,OAAO,OAAO;AAAA,EACnF,SAAS,KAAK;AACZ,WAAO,EAAE,SAAS,QAAQ,SAAS,SAAS,aAAa,GAAG,EAAE;AAAA,EAChE;AACF;AAGA,SAAS,WAAW,OAAwB;AAC1C,SAAO,oBAAoB,EAAE,SAAS,QAAQ,KAAK,EAAE,YAAY,CAAC;AACpE;AAGO,SAAS,eAAe,MAAmD;AAChF,SAAO,gBAAgB,MAAM,cAAc,IAAI,CAAC;AAClD;AAEA,eAAe,cAAc,MAAmD;AAC9E,QAAM,MAAMC,SAAQ,KAAK,OAAO,QAAQ,IAAI,CAAC;AAC7C,QAAM,WAAW,KAAK,aAAa,MAAY;AAC/C,QAAM,SAAS,MAAM,WAAW,KAAK,KAAK,UAAU;AACpD,MAAI,OAAO,YAAY,WAAW,EAAG,OAAM,kBAAkB;AAC7D,QAAM,WAAW,CAAC,UAA2B,cAAc,QAAQ,KAAK,KAAK,EAAE,SAAS;AAExF,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,UAAQ,KAAK,MAAM,MAAM;AAAA,IACvB,KAAK;AACH,cAAQ,MAAM,YAAY,QAAQ,GAAG;AACrC,eAAS,CAAC;AACV,gBAAU,CAAC,GAAG,OAAO;AACrB;AAAA,IACF,KAAK,SAAS;AACZ,YAAM,EAAE,OAAO,MAAM,IAAI,MAAM,iBAAiB;AAAA,QAC9C,QAAQ,KAAK,MAAM;AAAA,QACnB;AAAA,QACA,GAAI,KAAK,iBAAiB,OAAO,EAAE,YAAY,KAAK,IAAI,CAAC;AAAA,MAC3D,CAAC;AACD,YAAM,UAAU,MAAM,OAAO,CAAC,UAAU,CAAC,SAAS,KAAK,CAAC;AACxD,UAAI,QAAQ,SAAS,GAAG;AACtB,iBAAS,WAAW,OAAO,QAAQ,QAAQ,MAAM,CAAC,8BAA8B,QAAQ,KAAK,IAAI,CAAC,EAAE;AAAA,MACtG;AAEA,cAAQ,MAAM,OAAO,CAAC,UAAU,SAAS,KAAK,KAAK,WAAW,KAAK,CAAC;AACpE,eAAS;AACT,gBAAU,MAAM,SAAS,IAAI,CAAC,QAAQ,QAAQ,QAAQ,UAAU,IAAI,CAAC;AACrE;AAAA,IACF;AAAA,IACA,KAAK,WAAW;AACd,YAAM,UAAU,MAAM,aAAa,GAAG;AACtC,UAAI,CAAC,QAAQ,MAAO,QAAO,EAAE,QAAQ,QAAQ,OAAO,CAAC,GAAG,QAAQ,CAAC,EAAE;AACnE,YAAM,kBAAkB,CAAC,UACvB,MAAM,IAAI,CAAC,SAAS,UAAU,KAAK,IAAI,CAAC,EAAE,OAAO,CAAC,MAAM,WAAW,CAAC,KAAK,SAAS,CAAC,CAAC;AACtF,cAAQ,gBAAgB,QAAQ,KAAK;AACrC,eAAS;AAKT,YAAM,cAAc,MAAM,SAAS,KAAK,gBAAgB,QAAQ,OAAO,EAAE,SAAS;AAClF,gBAAU;AAAA,QACR,GAAI,MAAM,SAAS,IAAK,CAAC,QAAQ,QAAQ,UAAU,IAAc,CAAC;AAAA,QAClE;AAAA,QACA,GAAI,cAAe,CAAC,MAAM,IAAc,CAAC;AAAA,MAC3C;AACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAyB,CAAC;AAChC,aAAW,UAAU,SAAS;AAE5B,UAAM,UAAU,WAAW,UAAU,WAAW,WAAY,WAAW,UAAU,KAAK,MAAM,SAAS;AACrG,WAAO,KAAK,MAAM,QAAQ,QAAQ,EAAE,QAAQ,KAAK,QAAQ,UAAU,CAAC,IAAI,QAAQ,SAAS,CAAC,CAAC;AAAA,EAC7F;AACA,MAAI,KAAK,MAAM,SAAS,SAAS,OAAO,MAAM,CAAC,MAAM,EAAE,WAAW,SAAS,GAAG;AAC5E,UAAM,kBAAkB;AAAA,EAC1B;AACA,SAAO,EAAE,QAAQ,OAAO,KAAK,CAAC,MAAM,EAAE,WAAW,MAAM,IAAI,SAAS,QAAQ,OAAO,OAAO;AAC5F;AAGO,SAAS,YAAYD,MAAgC;AAC1D,MAAIA,KAAI,OAAO,KAAK,CAAC,MAAM,EAAE,WAAW,OAAO,EAAG,QAAO;AACzD,SAAOA,KAAI,WAAW,SAAS,IAAI;AACrC;AAEA,SAAS,MAAM,OAAwC;AACrD,SAAO,MAAM,WAAW,UAAU,MAAM,WAAW;AACrD;AAGA,SAAS,UAAU,SAAyB;AAC1C,SAAO,QAAQ,MAAM,MAAM,CAAC,EAAE,CAAC,KAAK;AACtC;AAGA,SAAS,eAAeA,MAA6B;AACnD,SAAOA,KAAI,OACR,OAAO,CAAC,MAAqB,EAAE,WAAW,MAAM,EAChD,IAAI,CAAC,MAAM,GAAG,EAAE,OAAO;AAAA,EAAK,EAAE,OAAO,UAAU,KAAK,CAAC,EAAE,EACvD,KAAK,MAAM;AAChB;AAEO,SAAS,aAAaA,MAAqB,OAAwB;AACxE,QAAM,SAAmB,CAAC;AAC1B,aAAW,SAASA,KAAI,QAAQ;AAC9B,QAAI,MAAM,KAAK,EAAG,QAAO,KAAK,GAAG,MAAM,OAAO;AAAA,EAAK,MAAM,OAAO,UAAU,KAAK,CAAC,EAAE;AAAA,EACpF;AACA,QAAM,SAASA,KAAI,OAAO,OAAO,CAAC,MAAwB,CAAC,MAAM,CAAC,CAAC;AACnE,MAAI,OAAO,SAAS,GAAG;AACrB,UAAM,QAAQ,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,MAAM,EAAE,QAAQ,MAAM,CAAC,IAAI;AACjE,WAAO;AAAA,MACL,OACG,IAAI,CAAC,MAAM,GAAG,EAAE,OAAO,OAAO,CAAC,CAAC,GAAG,EAAE,QAAQ,OAAO,KAAK,CAAC,GAAG,UAAU,EAAE,OAAO,CAAC,EAAE,EACnF,KAAK,IAAI;AAAA,IACd;AAAA,EACF;AACA,QAAM,QAAQ,CAAC,WACbA,KAAI,OAAO,OAAO,CAAC,MAAM,EAAE,WAAW,MAAM,EAAE;AAChD,QAAM,SAAS,MAAM,OAAO;AAC5B,SAAO;AAAA,IACL,GAAG,OAAOA,KAAI,OAAO,QAAQ,OAAO,CAAC,SAAS,OAAOA,KAAI,MAAM,QAAQ,MAAM,CAAC,KACzE,OAAO,MAAM,MAAM,CAAC,CAAC,YAAY,OAAO,MAAM,SAAS,CAAC,CAAC,cAC3D,SAAS,IAAI,KAAK,OAAO,MAAM,CAAC,mBAAmB;AAAA,EACxD;AACA,SAAO,OAAO,KAAK,MAAM;AAC3B;AAGA,SAAS,UAAU,GAAyB;AAC1C,MAAI,CAAC,MAAM,CAAC,EAAG,QAAO,EAAE,SAAS,EAAE,SAAS,QAAQ,EAAE,QAAQ,SAAS,EAAE,QAAQ;AACjF,MAAI;AACF,WAAO,EAAE,SAAS,EAAE,SAAS,QAAQ,EAAE,QAAQ,QAAQ,KAAK,MAAM,EAAE,OAAO,QAAQ,KAAK,CAAC,EAAa;AAAA,EACxG,QAAQ;AAKN,WAAO,EAAE,SAAS,EAAE,SAAS,QAAQ,SAAS,SAAS,GAAG,EAAE,OAAO,2CAA2C;AAAA,EAChH;AACF;AAEO,SAAS,WAAWA,MAA6B;AACtD,SAAO,KAAK;AAAA,IACV;AAAA,MACE,QAAQA,KAAI;AAAA,MACZ,OAAOA,KAAI;AAAA,MACX,QAAQA,KAAI,OAAO,IAAI,SAAS;AAAA,IAClC;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,aAAaA,MAA6B;AACxD,SAAOA,KAAI,OACR,OAAO,KAAK,EACZ,IAAI,CAAC,MAAM,EAAE,OAAO,UAAU,KAAK,CAAC,EACpC,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,EAChC,KAAK,IAAI;AACd;AAEO,SAAS,OAAOA,MAAqB,QAAqB,OAAwB;AACvF,SAAO,WAAW,SAAS,WAAWA,IAAG,IAAI,WAAW,WAAW,aAAaA,IAAG,IAAI,aAAaA,MAAK,KAAK;AAChH;AAUO,IAAM,aAAgC,CAAC,QAAQ,SAAS,aAAa,cAAc;AAOnF,SAAS,UAAUA,MAAqB,UAA+B;AAC5E,QAAM,SAASA,KAAI,WAAW;AAC9B,MAAI,SAAS,UAAU,eAAe;AACpC,UAAM,QAAQA,KAAI,MAAM,KAAK,IAAI;AACjC,QAAI,QAAQ;AACV,aAAO;AAAA,QACL,UAAU;AAAA,QACV,QAAQ,yBAAyB,KAAK;AAAA;AAAA,EAAsC,eAAeA,IAAG,CAAC;AAAA;AAAA,MACjG;AAAA,IACF;AACA,UAAM,SAASA,KAAI,OAAO,OAAO,CAAC,MAAwB,EAAE,WAAW,OAAO;AAC9E,QAAI,OAAO,WAAW,EAAG,QAAO,EAAE,UAAU,EAAE;AAC9C,UAAM,oBAAoB,OACvB,IAAI,CAAC,MAAM,SAAS,EAAE,OAAO,oBAAoB,KAAK,KAAK,UAAU,EAAE,OAAO,CAAC,EAAE,EACjF,KAAK,IAAI;AACZ,WAAO;AAAA,MACL,UAAU;AAAA,MACV,QAAQ,GAAG,KAAK,UAAU,EAAE,oBAAoB,EAAE,eAAe,eAAe,kBAAkB,EAAE,CAAC,CAAC;AAAA;AAAA,IACxG;AAAA,EACF;AACA,MAAI,SAAS,UAAU,UAAU,QAAQ;AACvC,UAAM,QAAQ,SAAS,iBACnB,EAAE,eAAe,iFAAiF,IAClG;AAAA,MACE,UAAU;AAAA,MACV,QAAQ;AAAA;AAAA,EAA0E,eAAeA,IAAG,CAAC;AAAA,IACvG;AACJ,WAAO,EAAE,UAAU,GAAG,QAAQ,GAAG,KAAK,UAAU,KAAK,CAAC;AAAA,EAAK;AAAA,EAC7D;AACA,SAAO,EAAE,UAAU,EAAE;AACvB;AAGO,SAAS,YAAY,SAAiB,UAAoB,MAAqC;AACpG,MAAI,SAAS,UAAU,iBAAiB,SAAS,OAAW,QAAO,EAAE,UAAU,EAAE;AACjF,QAAM,oBAAoB,+BAA+B,IAAI,KAAK,UAAU,OAAO,CAAC;AACpF,SAAO;AAAA,IACL,UAAU;AAAA,IACV,QAAQ,GAAG,KAAK,UAAU,EAAE,oBAAoB,EAAE,eAAe,eAAe,kBAAkB,EAAE,CAAC,CAAC;AAAA;AAAA,EACxG;AACF;;;AE3bA,SAAS,gBAAgB,YAAY,oBAAoB;AACzD,SAAS,WAAAE,UAAS,WAAAC,gBAAe;AAmB1B,IAAM,iBAAiB,CAAC,UAAU,MAAM;AAyB/C,SAAS,MAAM,GAAW,KAAa,MAAsB;AAC3D,SAAO,MAAM,IAAI,UAAU,GAAG,KAAK,GAAG,OAAO,CAAC,CAAC,UAAU,IAAI;AAC/D;AAGA,SAAS,eAAe,KAAa,SAAoC;AACvE,MAAI,IAAI;AACR,aAAW,SAAS,SAAS;AAC3B,UAAM,YAAY,sBAAsBC,SAAQ,KAAK,CAAC;AACtD,QAAI,cAAc,OAAW;AAC7B,QAAI;AACF,YAAM,EAAE,KAAK,IAAI,UAAU,QAAQ,aAAaC,SAAQ,KAAK,KAAK,GAAG,MAAM,GAAG,KAAK;AACnF,UAAI,KAAK,YAAY,OAAW;AAAA,IAClC,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;AAOA,eAAe,WAAW,KAAa,YAAqC;AAE1E,QAAM,EAAE,YAAY,WAAW,IAAI,MAAM,OAAO,qBAA8B;AAC9E,QAAM,EAAE,SAAS,IAAI,MAAM,OAAO,oBAAyB;AAC3D,QAAM,WAAW,MAAM,WAAW,EAAE,QAAQ,CAAC,GAAG,YAAY,KAAK,cAAc,MAAM,GAAG,WAAW,OAAO;AAC1G,MAAI,IAAI;AACR,aAAW,QAAQ,SAAS,OAAO;AACjC,UAAM,UAAU,MAAM,WAAW,SAAS,KAAK,IAAI;AACnD,UAAM,EAAE,UAAU,KAAK,MAAM,SAAS,SAAS,MAAM,OAAO,GAAG;AAC/D,UAAM,OAAO,SAAS,MAAM,SAAS,EAAE,SAAS,OAAO,GAAI,cAAc,SAAY,CAAC,IAAI,EAAE,UAAU,EAAG,CAAC;AAC1G,QAAI,KAAK,UAAU,SAAS,EAAG;AAAA,EACjC;AACA,SAAO;AACT;AAEA,eAAe,IAAI,QAAgB,QAAgB,KAAa,SAAgD;AAC9G,QAAM,aAAa,OAAO;AAC1B,QAAM,SAAS,CAAC,YAA+B,EAAE,MAAM,QAAQ,QAAQ,WAAW,OAAO;AACzF,QAAM,WAAsB,EAAE,MAAM,QAAQ,QAAQ,cAAc,QAAQ,WAAW,MAAM,EAAE;AAC7F,QAAM,UAAU,OAAO,SAAS,IAAI,MAAM;AAC1C,UAAQ,QAAQ;AAAA,IACd,KAAK,QAAQ;AACX,UAAI,QAAS,QAAO,OAAO,eAAe;AAC1C,YAAM,IAAI,eAAe,KAAK,OAAO;AACrC,aAAO,IAAI,IAAI,OAAO,MAAM,GAAG,yBAAyB,wBAAwB,CAAC,IAAI;AAAA,IACvF;AAAA,IACA,KAAK,QAAQ;AACX,YAAM,IAAI,MAAM,WAAW,KAAK,UAAU;AAC1C,aAAO,IAAI,IAAI,OAAO,MAAM,GAAG,qBAAqB,iBAAiB,CAAC,IAAI;AAAA,IAC5E;AAAA,IACA,KAAK,YAAY;AACf,YAAM,EAAE,SAAS,UAAU,IAAI,MAAM,OAAO,oBAAiC;AAC7E,YAAM,EAAE,MAAM,IAAI,MAAM,UAAU,CAAC,GAAG,EAAE,QAAQ,YAAY,IAAI,CAAC;AACjE,YAAM,IAAI,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC,EAAE;AAC7D,UAAI,MAAM,EAAG,QAAO;AACpB,aAAO,OAAO,UAAU,sBAAsB,MAAM,GAAG,kBAAkB,eAAe,CAAC;AAAA,IAC3F;AAAA,IACA,KAAK,QAAQ;AACX,YAAM,EAAE,SAAS,UAAU,IAAI,MAAM,OAAO,oBAA6B;AACzE,YAAM,EAAE,MAAM,IAAI,MAAM,UAAU,EAAE,QAAQ,CAAC,GAAG,YAAY,KAAK,YAAY,KAAK,CAAC;AACnF,aAAO,MAAM,SAAS,IAAI,OAAO,OAAO,MAAM,QAAQ,MAAM,CAAC,IAAI;AAAA,IACnE;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AACH,aAAO,UAAU,OAAO,GAAG,MAAM,WAAW,IAAI;AAAA,EACpD;AACF;AAGO,SAAS,UAAU,OAAsB,CAAC,GAA0B;AACzE,SAAO,gBAAgB,MAAM,eAAe,IAAI,CAAC;AACnD;AAEA,eAAe,eAAe,MAA4C;AACxE,QAAM,MAAMA,SAAQ,KAAK,OAAO,QAAQ,IAAI,CAAC;AAC7C,QAAM,SAAS,MAAM,WAAW,KAAK,KAAK,UAAU;AACpD,QAAM,UAAU,OAAO,YAAY,WAAW,IAAI,CAAC,IAAI,MAAM,YAAY,QAAQ,GAAG;AACpF,QAAM,UAAuB,CAAC;AAC9B,aAAW,UAAU,SAAS;AAG5B,QAAI,OAAO,YAAY,WAAW,GAAG;AACnC,cAAQ,KAAK,EAAE,MAAM,QAAQ,QAAQ,cAAc,QAAQ,uCAAuC,CAAC;AACnG;AAAA,IACF;AACA,QAAI;AACF,cAAQ,KAAK,MAAM,IAAI,QAAQ,QAAQ,KAAK,OAAO,CAAC;AAAA,IACtD,SAAS,KAAK;AAIZ,YAAM,UAAU,aAAa,GAAG,EAAE,MAAM,MAAM,CAAC,EAAE,CAAC,KAAK;AACvD,cAAQ,KAAK,EAAE,MAAM,QAAQ,QAAQ,WAAW,QAAQ,SAAS,SAAS,MAAM,CAAC,mBAAmB,OAAO,GAAG,CAAC;AAAA,IACjH;AAAA,EACF;AACA,aAAW,CAAC,MAAM,MAAM,KAAK,YAAa,SAAQ,KAAK,EAAE,MAAM,QAAQ,eAAe,OAAO,CAAC;AAC9F,SAAO;AAAA,IACL,SAAS,gBAAI;AAAA,IACb,QAAQ,OAAO,KAAK;AAAA,IACpB,aAAa,OAAO,YAAY,IAAI,CAAC,OAAO;AAAA,MAC1C,MAAM,EAAE;AAAA,MACR,OAAO,QAAQ,OAAO,CAAC,UAAU,cAAc,QAAQ,KAAK,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE;AAAA,IACvF,EAAE;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,cAAqD;AAAA,EACzD,WAAW;AAAA,EACX,cAAc;AAAA,EACd,eAAe;AAAA,EACf,SAAS;AACX;AAEO,SAAS,aAAa,QAAsB,QAA8B;AAC/E,MAAI,WAAW,OAAQ,QAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AAC5D,QAAM,OAAO;AAAA,IACX,SAAS,OAAO,OAAO;AAAA,IACvB,UAAU,OAAO,MAAM;AAAA,IACvB,GAAG,OAAO,YAAY,IAAI,CAAC,MAAM,cAAc,EAAE,IAAI,KAAK,OAAO,EAAE,OAAO,MAAM,CAAC,GAAG;AAAA,EACtF,EAAE,KAAK,KAAK;AACZ,QAAM,OAAO,OAAO,QAAQ;AAAA,IAC1B,CAAC,MAAM,GAAG,EAAE,KAAK,OAAO,EAAE,CAAC,GAAG,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM;AAAA,EAC3E;AACA,SAAO,CAAC,MAAM,IAAI,GAAG,IAAI,EAAE,KAAK,IAAI;AACtC;AAMO,IAAM,YAAY;AAGzB,IAAM,YAAsD,CAAC,CAAC,QAAQ,cAAc,CAAC;AAGrF,SAAS,MAAM,OAA0B,aAA6B;AACpE,SAAO,MAAM,UAAU,IAClB,MAAM,CAAC,KAAK,KACb,GAAG,MAAM,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI,CAAC,IAAI,WAAW,IAAI,MAAM,GAAG,EAAE,KAAK,EAAE;AAC3E;AAGO,SAAS,WAAW,QAA8B;AACvD,QAAM,QAAQ,MAAM,OAAO,YAAY,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,IAAI;AAC/D,QAAM,SAAS,IAAI,IAAI,OAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,WAAW,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AAE9F,QAAM,OAAO,OAAO,IAAI,MAAM,IAAI,0BAA0B;AAC5D,QAAM,WAAW,UAAU,OAAO,CAAC,CAAC,MAAM,MAAM,OAAO,IAAI,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,MAAM,IAAI;AAC1F,QAAM,OAAO,SAAS,WAAW,IAAI,KAAK,cAAc,MAAM,UAAU,KAAK,CAAC;AAC9E,SAAO;AAAA,IACL,4BAA4B,KAAK;AAAA,IACjC,gEAAgE,IAAI,IAAI,IAAI;AAAA,IAC5E,OAAO,SAAS;AAAA,EAClB,EAAE,KAAK,IAAI;AACb;AAGA,IAAM,WAAW;AAOV,SAAS,kBAAkB,UAAoB,MAAyB,QAAQ,KAAc;AACnG,QAAM,OAAO,IAAI;AAEjB,QAAM,QAAQ,SAAS,OAAO,QAAQ,eAAe,EAAE;AACvD,MAAI,UAAU,UAAa,CAAC,SAAS,KAAK,KAAK,EAAG,QAAO;AACzD,MAAI,SAAS,UAAa,SAAS,MAAM,IAAI,uBAAuB,OAAW,QAAO;AACtF,QAAM,WAAW,WAAW,IAAI,IAAI,aAAa,MAAM,MAAM,IAAI;AACjE,QAAM,OAAO,aAAa,MAAM,SAAS,SAAS,IAAI,IAAI,KAAK;AAC/D,iBAAe,MAAM,GAAG,IAAI,6BAA6B,KAAK;AAAA,GAAM,MAAM;AAC1E,SAAO;AACT;;;ALrLA,SAAS,KAAK,OAAwB;AACpC,MAAI,MAAM,WAAW,OAAW,SAAQ,OAAO,MAAM,MAAM,MAAM;AACjE,MAAI,MAAM,WAAW,OAAW,SAAQ,OAAO,MAAM,MAAM,MAAM;AACjE,UAAQ,WAAW,MAAM;AAC3B;AAGA,SAAS,UAAU,UAAoB,KAA0D;AAC/F,MAAI,SAAS,UAAU,OAAQ,QAAO,EAAE,OAAO,EAAE,MAAM,UAAU,EAAE;AACnE,MAAI,SAAS,UAAU,cAAe,QAAO;AAC7C,MAAI,SAAS,aAAa,UAAa,CAAC,WAAW,SAAS,SAAS,QAAQ,EAAG,QAAO;AACvF,MAAI,SAAS,aAAa,OAAW,QAAO;AAC5C,QAAM,OAAO,UAAU,KAAKC,SAAQ,KAAK,SAAS,QAAQ,CAAC;AAC3D,SAAO,EAAE,OAAO,EAAE,MAAM,SAAS,OAAO,CAAC,IAAI,EAAE,GAAG,KAAK;AACzD;AAEA,eAAe,eAAe,OAAiB,SAA0B,UAAmC;AAC1G,QAAM,MAAMA,SAAQ,SAAS,OAAO,QAAQ,IAAI,CAAC;AAEjD,QAAM,QACJ,MAAM,SAAS,IAAI,EAAE,OAAO,EAAE,MAAM,SAAS,MAAM,GAAG,MAAM,MAAM,KAAK,IAAI,EAAE,IAAI,UAAU,UAAU,GAAG;AAC1G,MAAI,UAAU,OAAW;AACzB,MAAI;AACF,UAAMC,OAAM,MAAM,eAAe;AAAA,MAC/B;AAAA,MACA,OAAO,MAAM;AAAA,MACb,cAAc;AAAA,MACd,GAAI,QAAQ,WAAW,SAAY,CAAC,IAAI,EAAE,YAAY,QAAQ,OAAO;AAAA;AAAA,MAErE,UAAU,MAAM;AAAA,IAClB,CAAC;AACD,SAAK,UAAUA,MAAK,QAAQ,CAAC;AAAA,EAC/B,SAAS,KAAK;AACZ,QAAI,eAAe,eAAe,IAAI,MAAO;AAC7C,SAAK,YAAY,aAAa,GAAG,GAAG,UAAU,MAAM,IAAI,CAAC;AAAA,EAC3D;AACF;AAEO,SAAS,aAAsB;AACpC,SAAO,IAAI,QAAQ,OAAO,EACvB,YAAY,8DAA8D,EAC1E,SAAS,cAAc,4FAA4F,EACnH,OAAO,uBAAuB,6BAA6B,EAC3D;AAAA,IACC,IAAI,OAAO,yBAAyB,gCAAgC,EACjE,QAAQ,aAAa,EACrB,QAAQ,QAAQ;AAAA,EACrB,EACC,OAAO,cAAc,wBAAwB,EAC7C,mBAAmB,wBAAwB,EAC3C,aAAa,EACb;AAAA,IACC;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,KAAK,IAAI;AAAA,EACb,EACC,OAAO,OAAO,OAAiB,YAA6B;AAC3D,UAAM,WAAW,MAAM,aAAa;AACpC,QAAI,aAAa,QAAW;AAC1B,YAAM,eAAe,OAAO,SAAS,QAAQ;AAC7C;AAAA,IACF;AACA,QAAI;AACF,YAAMA,OAAM,MAAM,eAAe;AAAA,QAC/B,OAAO,MAAM,SAAS,IAAI,EAAE,MAAM,SAAS,MAAM,IAAI,EAAE,MAAM,MAAM;AAAA,QACnE,GAAI,QAAQ,WAAW,SAAY,CAAC,IAAI,EAAE,YAAY,QAAQ,OAAO;AAAA,QACrE,UAAU;AAAA,MACZ,CAAC;AACD,iBAAW,SAASA,KAAI,QAAQ;AAC9B,YAAI,MAAM,WAAW,SAAS;AAC5B,kBAAQ,OAAO,MAAM,GAAG,YAAY,CAAC,IAAI,MAAM,OAAO,mBAAmB,MAAM,OAAO;AAAA,CAAI;AAAA,QAC5F;AAAA,MACF;AACA,YAAM,QAAQ,YAAY,EAAE,SAAS,CAAC,QAAQ,OAAO,OAAO,QAAQ,OAAO,MAAM,CAAC;AAClF,YAAM,OAAO,OAAOA,MAAK,QAAQ,QAAQ,KAAK;AAC9C,UAAI,KAAK,SAAS,EAAG,SAAQ,OAAO,MAAM,GAAG,IAAI;AAAA,CAAI;AACrD,cAAQ,WAAW,YAAYA,IAAG;AAAA,IACpC,SAAS,KAAK;AACZ,WAAK,GAAG;AAAA,IACV;AAAA,EACF,CAAC;AACL;AAEO,SAAS,cAAuB;AACrC,SAAO,IAAI,QAAQ,QAAQ,EACxB,YAAY,uDAAuD,EACnE,OAAO,uBAAuB,6BAA6B,EAC3D;AAAA,IACC,IAAI,OAAO,yBAAyB,QAAQ,EAAE,QAAQ,cAAc,EAAE,QAAQ,QAAQ;AAAA,EACxF,EACC,mBAAmB,wBAAwB,EAC3C,aAAa,EACb,OAAO,OAAO,YAA8B;AAC3C,UAAM,WAAW,MAAM,aAAa;AACpC,UAAM,eAAe,QAAQ,WAAW,SAAY,CAAC,IAAI,EAAE,YAAY,QAAQ,OAAO;AACtF,QAAI,UAAU,UAAU,gBAAgB;AACtC,UAAI;AACF,cAAM,SAAS,MAAM,UAAU,EAAE,KAAKD,SAAQ,SAAS,OAAO,QAAQ,IAAI,CAAC,GAAG,GAAG,aAAa,CAAC;AAE/F,cAAM,QAAQ,OAAO,QAAQ,KAAK,CAAC,MAAM,EAAE,WAAW,SAAS,IAAI;AAAA;AAAA,EAAO,WAAW,MAAM,CAAC,KAAK;AACjG,gBAAQ,OAAO,MAAM,GAAG,aAAa,QAAQ,QAAQ,CAAC,GAAG,KAAK;AAAA,CAAI;AAClE,0BAAkB,QAAQ;AAAA,MAC5B,QAAQ;AAAA,MAER;AACA;AAAA,IACF;AACA,QAAI;AACF,YAAM,SAAS,MAAM,UAAU,YAAY;AAC3C,cAAQ,OAAO,MAAM,GAAG,aAAa,QAAQ,QAAQ,MAAM,CAAC;AAAA,CAAI;AAAA,IAClE,SAAS,KAAK;AACZ,WAAK,GAAG;AAAA,IACV;AAAA,EACF,CAAC;AACL;","names":["resolve","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(\"--as <format>\", \"force an input format (markdown, mdx)\")\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,27 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- renderFindingsGithub
4
- } from "./chunk-MMTSSTG7.js";
5
- import "./chunk-PU6DFJMY.js";
6
- import "./chunk-77AINBYM.js";
7
- import "./chunk-IKEWBMCN.js";
8
- import "./chunk-TU2WUBVZ.js";
9
- import "./chunk-QRWGPQKO.js";
10
- import "./chunk-6JSSEWBG.js";
11
- import "./chunk-A5ULMVHQ.js";
12
- import "./chunk-TK3FC4RF.js";
13
- import "./chunk-M3W7J6MU.js";
14
- import "./chunk-IDV6HJCB.js";
15
- import "./chunk-57NEQRVO.js";
16
- import "./chunk-YEUYKR62.js";
17
- import "./chunk-RNVYGWIC.js";
18
- import "./chunk-MNH7QO4Z.js";
19
- import "./chunk-Q35YIDBV.js";
20
- import "./chunk-UJCVAWP7.js";
21
- import "./chunk-OWBRDNRZ.js";
22
- import "./chunk-G3T47CFV.js";
23
- import "./chunk-2H7UOFLK.js";
24
- export {
25
- renderFindingsGithub
26
- };
27
- //# sourceMappingURL=github-6QMYOHC3.js.map
@@ -1,32 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- NAMES_ITS_SUBJECT,
4
- findingMessage,
5
- renderCheckGithub
6
- } from "./chunk-7UKO3ASZ.js";
7
- import "./chunk-JXLTXMJ7.js";
8
- import "./chunk-SKSDRUUK.js";
9
- import "./chunk-YTURO7SI.js";
10
- import "./chunk-IKEWBMCN.js";
11
- import "./chunk-TU2WUBVZ.js";
12
- import "./chunk-QRWGPQKO.js";
13
- import "./chunk-6JSSEWBG.js";
14
- import "./chunk-A5ULMVHQ.js";
15
- import "./chunk-TK3FC4RF.js";
16
- import "./chunk-M3W7J6MU.js";
17
- import "./chunk-IDV6HJCB.js";
18
- import "./chunk-57NEQRVO.js";
19
- import "./chunk-YEUYKR62.js";
20
- import "./chunk-RNVYGWIC.js";
21
- import "./chunk-MNH7QO4Z.js";
22
- import "./chunk-Q35YIDBV.js";
23
- import "./chunk-UJCVAWP7.js";
24
- import "./chunk-OWBRDNRZ.js";
25
- import "./chunk-G3T47CFV.js";
26
- import "./chunk-2H7UOFLK.js";
27
- export {
28
- NAMES_ITS_SUBJECT,
29
- findingMessage,
30
- renderCheckGithub
31
- };
32
- //# sourceMappingURL=github-SXPGP5DB.js.map
@@ -1,28 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- STDIN_LABEL,
4
- runLint
5
- } from "./chunk-WB3QM6PP.js";
6
- import "./chunk-TIUTIOFB.js";
7
- import "./chunk-CK7SKVHR.js";
8
- import "./chunk-TU2WUBVZ.js";
9
- import "./chunk-QRWGPQKO.js";
10
- import "./chunk-6JSSEWBG.js";
11
- import "./chunk-A5ULMVHQ.js";
12
- import "./chunk-TK3FC4RF.js";
13
- import "./chunk-M3W7J6MU.js";
14
- import "./chunk-IDV6HJCB.js";
15
- import "./chunk-57NEQRVO.js";
16
- import "./chunk-YEUYKR62.js";
17
- import "./chunk-RNVYGWIC.js";
18
- import "./chunk-MNH7QO4Z.js";
19
- import "./chunk-Q35YIDBV.js";
20
- import "./chunk-UJCVAWP7.js";
21
- import "./chunk-OWBRDNRZ.js";
22
- import "./chunk-G3T47CFV.js";
23
- import "./chunk-2H7UOFLK.js";
24
- export {
25
- STDIN_LABEL,
26
- runLint
27
- };
28
- //# sourceMappingURL=lint-ASMJLLPA.js.map
@@ -1,31 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- renderList,
4
- runList
5
- } from "./chunk-YB4IBW3M.js";
6
- import "./chunk-3VK37OR2.js";
7
- import "./chunk-LJ2RDH3F.js";
8
- import "./chunk-YNHZHSSM.js";
9
- import "./chunk-ZXRAE55H.js";
10
- import "./chunk-SE4JN5XN.js";
11
- import "./chunk-TU2WUBVZ.js";
12
- import "./chunk-QRWGPQKO.js";
13
- import "./chunk-6JSSEWBG.js";
14
- import "./chunk-A5ULMVHQ.js";
15
- import "./chunk-TK3FC4RF.js";
16
- import "./chunk-M3W7J6MU.js";
17
- import "./chunk-IDV6HJCB.js";
18
- import "./chunk-57NEQRVO.js";
19
- import "./chunk-YEUYKR62.js";
20
- import "./chunk-RNVYGWIC.js";
21
- import "./chunk-MNH7QO4Z.js";
22
- import "./chunk-Q35YIDBV.js";
23
- import "./chunk-UJCVAWP7.js";
24
- import "./chunk-OWBRDNRZ.js";
25
- import "./chunk-G3T47CFV.js";
26
- import "./chunk-2H7UOFLK.js";
27
- export {
28
- renderList,
29
- runList
30
- };
31
- //# sourceMappingURL=list-KZNVTNVC.js.map
@@ -1,29 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- LIST_FORMATS,
4
- runList
5
- } from "./chunk-PNPQTHBT.js";
6
- import "./chunk-PU6DFJMY.js";
7
- import "./chunk-77AINBYM.js";
8
- import "./chunk-IKEWBMCN.js";
9
- import "./chunk-TU2WUBVZ.js";
10
- import "./chunk-QRWGPQKO.js";
11
- import "./chunk-6JSSEWBG.js";
12
- import "./chunk-A5ULMVHQ.js";
13
- import "./chunk-TK3FC4RF.js";
14
- import "./chunk-M3W7J6MU.js";
15
- import "./chunk-IDV6HJCB.js";
16
- import "./chunk-57NEQRVO.js";
17
- import "./chunk-YEUYKR62.js";
18
- import "./chunk-RNVYGWIC.js";
19
- import "./chunk-MNH7QO4Z.js";
20
- import "./chunk-Q35YIDBV.js";
21
- import "./chunk-UJCVAWP7.js";
22
- import "./chunk-OWBRDNRZ.js";
23
- import "./chunk-G3T47CFV.js";
24
- import "./chunk-2H7UOFLK.js";
25
- export {
26
- LIST_FORMATS,
27
- runList
28
- };
29
- //# sourceMappingURL=list-Q57YTFUQ.js.map
@@ -1,33 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- runRun
4
- } from "./chunk-37LP5HMZ.js";
5
- import "./chunk-3VK37OR2.js";
6
- import "./chunk-LJ2RDH3F.js";
7
- import "./chunk-YNHZHSSM.js";
8
- import {
9
- render
10
- } from "./chunk-NCPWXHDO.js";
11
- import "./chunk-ZXRAE55H.js";
12
- import "./chunk-SE4JN5XN.js";
13
- import "./chunk-TU2WUBVZ.js";
14
- import "./chunk-QRWGPQKO.js";
15
- import "./chunk-6JSSEWBG.js";
16
- import "./chunk-A5ULMVHQ.js";
17
- import "./chunk-TK3FC4RF.js";
18
- import "./chunk-M3W7J6MU.js";
19
- import "./chunk-IDV6HJCB.js";
20
- import "./chunk-57NEQRVO.js";
21
- import "./chunk-YEUYKR62.js";
22
- import "./chunk-RNVYGWIC.js";
23
- import "./chunk-MNH7QO4Z.js";
24
- import "./chunk-Q35YIDBV.js";
25
- import "./chunk-UJCVAWP7.js";
26
- import "./chunk-OWBRDNRZ.js";
27
- import "./chunk-G3T47CFV.js";
28
- import "./chunk-2H7UOFLK.js";
29
- export {
30
- render,
31
- runRun
32
- };
33
- //# sourceMappingURL=run-3DYJNRIG.js.map
@@ -1,16 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- runValidate
4
- } from "./chunk-TK3FC4RF.js";
5
- import "./chunk-M3W7J6MU.js";
6
- import "./chunk-57NEQRVO.js";
7
- import "./chunk-YEUYKR62.js";
8
- import "./chunk-Q35YIDBV.js";
9
- import "./chunk-UJCVAWP7.js";
10
- import "./chunk-OWBRDNRZ.js";
11
- import "./chunk-G3T47CFV.js";
12
- import "./chunk-2H7UOFLK.js";
13
- export {
14
- runValidate
15
- };
16
- //# sourceMappingURL=validate-53RKM2XG.js.map