@hawkeyexl/manni 4.8.1 → 4.10.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 (173) hide show
  1. package/README.md +1 -1
  2. package/dist/{batch-QMHYWGUA.js → batch-6NICDKRE.js} +12 -12
  3. package/dist/{build-ZGA3O3P4.js → build-3KP2K3XN.js} +11 -11
  4. package/dist/{calibrate-KBMFGKP3.js → calibrate-LUA3DWKD.js} +13 -13
  5. package/dist/{capture-C46UXFRK.js → capture-NETOHCB4.js} +12 -12
  6. package/dist/{check-UMI5ACCE.js → check-7B77ZD2N.js} +11 -11
  7. package/dist/{check-OAJWC3WD.js → check-E4QCB7LS.js} +5 -5
  8. package/dist/{check-CORYIW76.js → check-NLL4NRYA.js} +13 -13
  9. package/dist/{check-LLQ6PJV3.js → check-PTECPIIB.js} +10 -10
  10. package/dist/{chunk-N7J5C35C.js → chunk-2BV4FBC7.js} +2 -2
  11. package/dist/chunk-2BV4FBC7.js.map +1 -0
  12. package/dist/{chunk-PO5W6JAP.js → chunk-2JV7C4YV.js} +7 -7
  13. package/dist/{chunk-Z27GYQOY.js → chunk-2UCC26MO.js} +8 -8
  14. package/dist/{chunk-WBETAXO2.js → chunk-2W34HX2U.js} +5 -5
  15. package/dist/{chunk-ZIGIJBXG.js → chunk-2YJ5H5E6.js} +9 -9
  16. package/dist/{chunk-HWNSIEZK.js → chunk-3E2X2RBU.js} +6 -6
  17. package/dist/{chunk-Q3GFZJTY.js → chunk-4DLF5SA4.js} +35 -17
  18. package/dist/chunk-4DLF5SA4.js.map +1 -0
  19. package/dist/{chunk-BYVH727K.js → chunk-55GMOVKW.js} +2 -2
  20. package/dist/{chunk-C2JPBQCJ.js → chunk-5REEVKGH.js} +2 -2
  21. package/dist/{chunk-XXDXIIQ4.js → chunk-6AGESHHM.js} +2 -2
  22. package/dist/{chunk-GQBVZS5G.js → chunk-6LR73NMO.js} +6 -6
  23. package/dist/{chunk-XKBEHKWO.js → chunk-6M5VJOC2.js} +2 -1
  24. package/dist/{chunk-F734HIHT.js → chunk-7Y3N4Y72.js} +3 -3
  25. package/dist/{chunk-WUFP4V7B.js → chunk-ABHG6I3G.js} +1292 -126
  26. package/dist/chunk-ABHG6I3G.js.map +1 -0
  27. package/dist/{chunk-FEALEYSE.js → chunk-AO5TSDKT.js} +4 -4
  28. package/dist/{chunk-LF6FOF6U.js → chunk-BD7IXBWE.js} +15 -26
  29. package/dist/{chunk-LF6FOF6U.js.map → chunk-BD7IXBWE.js.map} +1 -1
  30. package/dist/{chunk-NB4ILZMQ.js → chunk-CCWMACJL.js} +8 -8
  31. package/dist/{chunk-K43X5VDR.js → chunk-D2UW3ZCK.js} +6 -6
  32. package/dist/{chunk-SV6UEQCU.js → chunk-DFCQ6BMI.js} +4 -4
  33. package/dist/{chunk-ECVQNGTH.js → chunk-DNZUBCGZ.js} +3 -3
  34. package/dist/{chunk-POGYWOJ2.js → chunk-EAUIQADY.js} +3 -3
  35. package/dist/{chunk-XDS3KQCK.js → chunk-G6FNWRAI.js} +4 -4
  36. package/dist/{chunk-6HMLYFEU.js → chunk-G7XD4QH5.js} +810 -5
  37. package/dist/chunk-G7XD4QH5.js.map +1 -0
  38. package/dist/{chunk-WUXD6VBD.js → chunk-GB2XPITA.js} +2 -2
  39. package/dist/{chunk-KPXOJMQ6.js → chunk-GCKHSBEN.js} +2 -2
  40. package/dist/{chunk-6QBJHRFC.js → chunk-GDLHTI5R.js} +129 -26
  41. package/dist/chunk-GDLHTI5R.js.map +1 -0
  42. package/dist/{chunk-NNFSIRVE.js → chunk-GXN7RRHR.js} +3 -3
  43. package/dist/{chunk-RCS5YFY2.js → chunk-H26VDFDS.js} +2 -2
  44. package/dist/{chunk-4VQBHTGA.js → chunk-IJ62BB2T.js} +5 -5
  45. package/dist/{chunk-WT6HMEEF.js → chunk-KBG463UK.js} +35 -8
  46. package/dist/{chunk-WT6HMEEF.js.map → chunk-KBG463UK.js.map} +1 -1
  47. package/dist/{chunk-UWY4B2PM.js → chunk-LQZQ5KGG.js} +4 -4
  48. package/dist/{chunk-VSOYZ7QH.js → chunk-PK7EKJ5T.js} +4 -4
  49. package/dist/{chunk-YVVMC4SZ.js → chunk-QBVP3SQP.js} +4 -4
  50. package/dist/{chunk-6MNOMHFI.js → chunk-QJRQ4BRC.js} +11 -11
  51. package/dist/{chunk-7LC4YJJ3.js → chunk-RODZ7MB7.js} +3 -3
  52. package/dist/{chunk-SXODK43S.js → chunk-RZVCWX5R.js} +4 -4
  53. package/dist/{chunk-5LAKRYXU.js → chunk-SUTMSDQ2.js} +3 -3
  54. package/dist/{chunk-6KKZXB2O.js → chunk-VVVKBUBO.js} +2 -2
  55. package/dist/{chunk-6ZR24A4S.js → chunk-VZVEP2OZ.js} +2 -2
  56. package/dist/{chunk-3FG2UU3H.js → chunk-WN47MNSK.js} +4 -4
  57. package/dist/{chunk-LAU6SVTJ.js → chunk-XU73V5XT.js} +7 -7
  58. package/dist/{chunk-77L5GNVO.js → chunk-Z5YHMRLF.js} +2 -2
  59. package/dist/{chunk-AO66Q66S.js → chunk-ZHRPH52H.js} +2 -2
  60. package/dist/chunk-ZMECS2IJ.js +27 -0
  61. package/dist/chunk-ZMECS2IJ.js.map +1 -0
  62. package/dist/{chunk-VD3EQSBI.js → chunk-ZXXFP2LA.js} +2 -2
  63. package/dist/{cli-SBJY2NQH.js → cli-4YYC6LCY.js} +15 -15
  64. package/dist/{cli-4B5RWL7P.js → cli-BIIUKPTE.js} +13 -12
  65. package/dist/{cli-4B5RWL7P.js.map → cli-BIIUKPTE.js.map} +1 -1
  66. package/dist/{cli-XIQKPNA7.js → cli-EH3I4IUX.js} +32 -32
  67. package/dist/cli-EH3I4IUX.js.map +1 -0
  68. package/dist/{cli-MNNOXWYU.js → cli-HO62TOM2.js} +8 -8
  69. package/dist/cli-LWST5FQH.js +839 -0
  70. package/dist/cli-LWST5FQH.js.map +1 -0
  71. package/dist/{cli-UB5W75GJ.js → cli-P2X7PNY6.js} +12 -12
  72. package/dist/{cli-QR3ZQZA4.js → cli-SGVFZOAW.js} +19 -19
  73. package/dist/{cli-5AML7QR2.js → cli-TELPAMJO.js} +14 -14
  74. package/dist/{cli-I4GBPLRM.js → cli-UETKXHJN.js} +3 -3
  75. package/dist/{cli-WWDARAWS.js → cli-V2DI3K2R.js} +14 -14
  76. package/dist/cli.js +18 -11
  77. package/dist/cli.js.map +1 -1
  78. package/dist/{config-YWSNBFEE.js → config-TYXYQK3I.js} +3 -3
  79. package/dist/docmeta.js +7 -7
  80. package/dist/{github-TIZ3ZR3D.js → github-ESK45CEZ.js} +10 -10
  81. package/dist/{github-WKOJRW7P.js → github-WER7JUTN.js} +12 -12
  82. package/dist/index.js +35 -34
  83. package/dist/index.js.map +1 -1
  84. package/dist/{json-4FUOZ3XX.js → json-QR4G35KA.js} +10 -10
  85. package/dist/{lint-7VQFESHK.js → lint-QTI7XK2A.js} +11 -10
  86. package/dist/{list-7U2MBDIM.js → list-JO4G3TS3.js} +10 -10
  87. package/dist/{list-W6EUAOBV.js → list-O2MJUP5V.js} +10 -10
  88. package/dist/{page-WZLBKSCD.js → page-FSXDXCDD.js} +9 -9
  89. package/dist/{prepare-FPEWAHJH.js → prepare-UPIBTFNS.js} +11 -11
  90. package/dist/{pretty-7M4X4TCY.js → pretty-4IONWSEP.js} +10 -10
  91. package/dist/{pretty-CUCMQU5R.js → pretty-R4BQD2VH.js} +11 -11
  92. package/dist/{reporters-DQVSDXV6.js → reporters-DHO2BXAD.js} +5 -5
  93. package/dist/{reporters-KYJE54JS.js → reporters-FPP6JNDP.js} +9 -9
  94. package/dist/{run-ABGXGOGQ.js → run-YH5Z7RJ7.js} +10 -10
  95. package/dist/{term-HTIG3YDC.js → term-ASM4LVYC.js} +279 -150
  96. package/dist/term-ASM4LVYC.js.map +1 -0
  97. package/dist/{validate-HWNU3MDY.js → validate-7JI3H57P.js} +5 -5
  98. package/package.json +1 -1
  99. package/plugin/manni/.claude-plugin/plugin.json +1 -1
  100. package/dist/chunk-6HMLYFEU.js.map +0 -1
  101. package/dist/chunk-6QBJHRFC.js.map +0 -1
  102. package/dist/chunk-N7J5C35C.js.map +0 -1
  103. package/dist/chunk-Q3GFZJTY.js.map +0 -1
  104. package/dist/chunk-WUFP4V7B.js.map +0 -1
  105. package/dist/cli-XIQKPNA7.js.map +0 -1
  106. package/dist/term-HTIG3YDC.js.map +0 -1
  107. /package/dist/{batch-QMHYWGUA.js.map → batch-6NICDKRE.js.map} +0 -0
  108. /package/dist/{build-ZGA3O3P4.js.map → build-3KP2K3XN.js.map} +0 -0
  109. /package/dist/{calibrate-KBMFGKP3.js.map → calibrate-LUA3DWKD.js.map} +0 -0
  110. /package/dist/{capture-C46UXFRK.js.map → capture-NETOHCB4.js.map} +0 -0
  111. /package/dist/{check-LLQ6PJV3.js.map → check-7B77ZD2N.js.map} +0 -0
  112. /package/dist/{check-OAJWC3WD.js.map → check-E4QCB7LS.js.map} +0 -0
  113. /package/dist/{check-CORYIW76.js.map → check-NLL4NRYA.js.map} +0 -0
  114. /package/dist/{check-UMI5ACCE.js.map → check-PTECPIIB.js.map} +0 -0
  115. /package/dist/{chunk-PO5W6JAP.js.map → chunk-2JV7C4YV.js.map} +0 -0
  116. /package/dist/{chunk-Z27GYQOY.js.map → chunk-2UCC26MO.js.map} +0 -0
  117. /package/dist/{chunk-WBETAXO2.js.map → chunk-2W34HX2U.js.map} +0 -0
  118. /package/dist/{chunk-ZIGIJBXG.js.map → chunk-2YJ5H5E6.js.map} +0 -0
  119. /package/dist/{chunk-HWNSIEZK.js.map → chunk-3E2X2RBU.js.map} +0 -0
  120. /package/dist/{chunk-BYVH727K.js.map → chunk-55GMOVKW.js.map} +0 -0
  121. /package/dist/{chunk-C2JPBQCJ.js.map → chunk-5REEVKGH.js.map} +0 -0
  122. /package/dist/{chunk-XXDXIIQ4.js.map → chunk-6AGESHHM.js.map} +0 -0
  123. /package/dist/{chunk-GQBVZS5G.js.map → chunk-6LR73NMO.js.map} +0 -0
  124. /package/dist/{chunk-XKBEHKWO.js.map → chunk-6M5VJOC2.js.map} +0 -0
  125. /package/dist/{chunk-F734HIHT.js.map → chunk-7Y3N4Y72.js.map} +0 -0
  126. /package/dist/{chunk-FEALEYSE.js.map → chunk-AO5TSDKT.js.map} +0 -0
  127. /package/dist/{chunk-NB4ILZMQ.js.map → chunk-CCWMACJL.js.map} +0 -0
  128. /package/dist/{chunk-K43X5VDR.js.map → chunk-D2UW3ZCK.js.map} +0 -0
  129. /package/dist/{chunk-SV6UEQCU.js.map → chunk-DFCQ6BMI.js.map} +0 -0
  130. /package/dist/{chunk-ECVQNGTH.js.map → chunk-DNZUBCGZ.js.map} +0 -0
  131. /package/dist/{chunk-POGYWOJ2.js.map → chunk-EAUIQADY.js.map} +0 -0
  132. /package/dist/{chunk-XDS3KQCK.js.map → chunk-G6FNWRAI.js.map} +0 -0
  133. /package/dist/{chunk-WUXD6VBD.js.map → chunk-GB2XPITA.js.map} +0 -0
  134. /package/dist/{chunk-KPXOJMQ6.js.map → chunk-GCKHSBEN.js.map} +0 -0
  135. /package/dist/{chunk-NNFSIRVE.js.map → chunk-GXN7RRHR.js.map} +0 -0
  136. /package/dist/{chunk-RCS5YFY2.js.map → chunk-H26VDFDS.js.map} +0 -0
  137. /package/dist/{chunk-4VQBHTGA.js.map → chunk-IJ62BB2T.js.map} +0 -0
  138. /package/dist/{chunk-UWY4B2PM.js.map → chunk-LQZQ5KGG.js.map} +0 -0
  139. /package/dist/{chunk-VSOYZ7QH.js.map → chunk-PK7EKJ5T.js.map} +0 -0
  140. /package/dist/{chunk-YVVMC4SZ.js.map → chunk-QBVP3SQP.js.map} +0 -0
  141. /package/dist/{chunk-6MNOMHFI.js.map → chunk-QJRQ4BRC.js.map} +0 -0
  142. /package/dist/{chunk-7LC4YJJ3.js.map → chunk-RODZ7MB7.js.map} +0 -0
  143. /package/dist/{chunk-SXODK43S.js.map → chunk-RZVCWX5R.js.map} +0 -0
  144. /package/dist/{chunk-5LAKRYXU.js.map → chunk-SUTMSDQ2.js.map} +0 -0
  145. /package/dist/{chunk-6KKZXB2O.js.map → chunk-VVVKBUBO.js.map} +0 -0
  146. /package/dist/{chunk-6ZR24A4S.js.map → chunk-VZVEP2OZ.js.map} +0 -0
  147. /package/dist/{chunk-3FG2UU3H.js.map → chunk-WN47MNSK.js.map} +0 -0
  148. /package/dist/{chunk-LAU6SVTJ.js.map → chunk-XU73V5XT.js.map} +0 -0
  149. /package/dist/{chunk-77L5GNVO.js.map → chunk-Z5YHMRLF.js.map} +0 -0
  150. /package/dist/{chunk-AO66Q66S.js.map → chunk-ZHRPH52H.js.map} +0 -0
  151. /package/dist/{chunk-VD3EQSBI.js.map → chunk-ZXXFP2LA.js.map} +0 -0
  152. /package/dist/{cli-SBJY2NQH.js.map → cli-4YYC6LCY.js.map} +0 -0
  153. /package/dist/{cli-MNNOXWYU.js.map → cli-HO62TOM2.js.map} +0 -0
  154. /package/dist/{cli-UB5W75GJ.js.map → cli-P2X7PNY6.js.map} +0 -0
  155. /package/dist/{cli-QR3ZQZA4.js.map → cli-SGVFZOAW.js.map} +0 -0
  156. /package/dist/{cli-5AML7QR2.js.map → cli-TELPAMJO.js.map} +0 -0
  157. /package/dist/{cli-I4GBPLRM.js.map → cli-UETKXHJN.js.map} +0 -0
  158. /package/dist/{cli-WWDARAWS.js.map → cli-V2DI3K2R.js.map} +0 -0
  159. /package/dist/{config-YWSNBFEE.js.map → config-TYXYQK3I.js.map} +0 -0
  160. /package/dist/{github-TIZ3ZR3D.js.map → github-ESK45CEZ.js.map} +0 -0
  161. /package/dist/{github-WKOJRW7P.js.map → github-WER7JUTN.js.map} +0 -0
  162. /package/dist/{json-4FUOZ3XX.js.map → json-QR4G35KA.js.map} +0 -0
  163. /package/dist/{lint-7VQFESHK.js.map → lint-QTI7XK2A.js.map} +0 -0
  164. /package/dist/{list-7U2MBDIM.js.map → list-JO4G3TS3.js.map} +0 -0
  165. /package/dist/{list-W6EUAOBV.js.map → list-O2MJUP5V.js.map} +0 -0
  166. /package/dist/{page-WZLBKSCD.js.map → page-FSXDXCDD.js.map} +0 -0
  167. /package/dist/{prepare-FPEWAHJH.js.map → prepare-UPIBTFNS.js.map} +0 -0
  168. /package/dist/{pretty-7M4X4TCY.js.map → pretty-4IONWSEP.js.map} +0 -0
  169. /package/dist/{pretty-CUCMQU5R.js.map → pretty-R4BQD2VH.js.map} +0 -0
  170. /package/dist/{reporters-DQVSDXV6.js.map → reporters-DHO2BXAD.js.map} +0 -0
  171. /package/dist/{reporters-KYJE54JS.js.map → reporters-FPP6JNDP.js.map} +0 -0
  172. /package/dist/{run-ABGXGOGQ.js.map → run-YH5Z7RJ7.js.map} +0 -0
  173. /package/dist/{validate-HWNU3MDY.js.map → validate-7JI3H57P.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/core/said-once.ts","../src/family/commands/status.ts"],"sourcesContent":["/**\n * The two family verbs, `manni check` and `manni status`, mounted on the\n * umbrella with `addCommand`. They are the only verbs it carries: each\n * orchestrates other domains' command cores and owns no checks of its own.\n *\n * Run by hand or in CI they follow the family contract: 0 clean, 1 errors, 2\n * operational, the report on stdout and notices on stderr. Under a Claude\n * Code hook envelope on stdin they speak the hook protocol instead, which\n * changes where output goes and what the exit code means, never what is\n * checked beyond the scope.\n */\nimport { resolve } from \"node:path\";\nimport { Command, Option } from \"commander\";\nimport { shouldColor } from \"../shared/color.js\";\nimport { errorMessage } from \"../shared/errors.js\";\nimport { programName } from \"../shared/program-name.js\";\nimport { fail } from \"../shared/run.js\";\nimport { notice } from \"../shared/warn.js\";\nimport { readEnvelope, type Envelope } from \"./core/envelope.js\";\nimport { FamilyError, labelFrom } from \"./core/in-play.js\";\nimport {\n CHECK_FORMATS,\n EDIT_TOOLS,\n exitCodeFor,\n hookFailure,\n hookReply,\n render,\n runFamilyCheck,\n runTurnCheck,\n turnReply,\n type CheckFormat,\n type FamilyCheckRun,\n type HookReply,\n type Scope,\n} from \"./commands/check.js\";\nimport {\n STATUS_FORMATS,\n agentLines,\n exportGeneratedBy,\n renderStatus,\n runStatus,\n type StatusFormat,\n} from \"./commands/status.js\";\n\ninterface CheckCliOptions {\n config?: string;\n format: CheckFormat;\n /** `--no-color`: `false` when given. */\n color: boolean;\n}\n\ninterface StatusCliOptions {\n config?: string;\n format: StatusFormat;\n}\n\nfunction send(reply: HookReply): void {\n if (reply.stdout !== undefined) process.stdout.write(reply.stdout);\n if (reply.stderr !== undefined) process.stderr.write(reply.stderr);\n process.exitCode = reply.exitCode;\n}\n\n/**\n * The file checks a hook asks for, or `undefined` when this event runs none.\n * A SubagentStop runs none: its subagent's turn is judged alone.\n */\nexport function hookScope(envelope: Envelope, cwd: string): { scope: Scope; file?: string } | undefined {\n if (envelope.event === \"Stop\") return { scope: { kind: \"changed\" } };\n if (envelope.event !== \"PostToolUse\") return undefined;\n if (envelope.toolName === undefined || !EDIT_TOOLS.includes(envelope.toolName)) return undefined;\n if (envelope.filePath === undefined) return undefined;\n const file = labelFrom(cwd, resolve(cwd, envelope.filePath));\n return { scope: { kind: \"paths\", paths: [file] }, file };\n}\n\n/** The events that end a turn, which tracevals judges (proposal 0079). */\nconst TURN_EVENTS: readonly string[] = [\"Stop\", \"SubagentStop\"];\n\nasync function checkUnderHook(paths: string[], options: CheckCliOptions, envelope: Envelope): Promise<void> {\n const cwd = resolve(envelope.cwd ?? process.cwd());\n // Positional paths win over the envelope's own scope.\n const asked: { scope: Scope; file?: string } | undefined =\n paths.length > 0 ? { scope: { kind: \"paths\", paths }, file: paths.join(\", \") } : hookScope(envelope, cwd);\n const turnEvent = TURN_EVENTS.includes(envelope.event);\n if (asked === undefined && !turnEvent) return;\n let run: FamilyCheckRun | undefined;\n if (asked !== undefined) {\n try {\n run = await runFamilyCheck({\n cwd,\n scope: asked.scope,\n allowMissing: true,\n ...(options.config === undefined ? {} : { configPath: options.config }),\n // stdout and stderr are the hook's channels; a notice is not for the agent.\n onNotice: () => undefined,\n });\n } catch (err) {\n // Nothing set up for the file checks is not the end of a turn's judgement.\n if (!(err instanceof FamilyError && err.quiet) && !turnEvent) {\n send(hookFailure(errorMessage(err), envelope, asked.file));\n return;\n }\n }\n }\n if (!turnEvent) {\n if (run !== undefined) send(hookReply(run, envelope));\n return;\n }\n send(turnReply(run, await runTurnCheck(envelope, cwd), envelope));\n}\n\nexport function buildCheck(): Command {\n return new Command(\"check\")\n .description(\"Run every check this repository has set up, and nothing else\")\n .argument(\"[paths...]\", \"files, directories, or globs; the per-file checks run on the collection members among them\")\n .option(\"-c, --config <path>\", \"path to a manni config file\")\n .addOption(\n new Option(\"-f, --format <format>\", \"output (not read under a hook)\")\n .choices(CHECK_FORMATS)\n .default(\"pretty\"),\n )\n .option(\"--no-color\", \"disable colored output\")\n .showHelpAfterError(\"(add --help for usage)\")\n .exitOverride()\n .addHelpText(\n \"after\",\n [\n \"\",\n \"Examples:\",\n \" manni check # every in-play check, the CI gate\",\n \" manni check docs/limits.md # per-file checks on one page\",\n \" manni check -f github # in a GitHub workflow\",\n \" manni check docs/ -f json # scripting form\",\n ].join(\"\\n\"),\n )\n .action(async (paths: string[], options: CheckCliOptions) => {\n const envelope = await readEnvelope();\n if (envelope !== undefined) {\n await checkUnderHook(paths, options, envelope);\n return;\n }\n try {\n const run = await runFamilyCheck({\n scope: paths.length > 0 ? { kind: \"paths\", paths } : { kind: \"all\" },\n ...(options.config === undefined ? {} : { configPath: options.config }),\n onNotice: notice,\n });\n for (const check of run.checks) {\n if (check.status === \"error\") {\n process.stderr.write(`${programName()} ${check.command} could not run: ${check.message}\\n`);\n }\n }\n const color = shouldColor({ noColor: !options.color, isTTY: process.stdout.isTTY });\n const text = render(run, options.format, color);\n if (text.length > 0) process.stdout.write(`${text}\\n`);\n process.exitCode = exitCodeFor(run);\n } catch (err) {\n fail(err);\n }\n });\n}\n\nexport function buildStatus(): Command {\n return new Command(\"status\")\n .description(\"Say what is set up here, and so what manni check runs\")\n .option(\"-c, --config <path>\", \"path to a manni config file\")\n .addOption(\n new Option(\"-f, --format <format>\", \"output\").choices(STATUS_FORMATS).default(\"pretty\"),\n )\n .showHelpAfterError(\"(add --help for usage)\")\n .exitOverride()\n .action(async (options: StatusCliOptions) => {\n const envelope = await readEnvelope();\n const configOption = options.config === undefined ? {} : { configPath: options.config };\n if (envelope?.event === \"SessionStart\") {\n try {\n const report = await runStatus({ cwd: resolve(envelope.cwd ?? process.cwd()), ...configOption });\n // The agent lines promise checks, so they need a domain in play to be true.\n const lines = report.domains.some((d) => d.status === \"in-play\") ? `\\n\\n${agentLines(report)}` : \"\";\n process.stdout.write(`${renderStatus(report, \"pretty\")}${lines}\\n`);\n exportGeneratedBy(envelope);\n } catch {\n // No config, or one that cannot be read: the session starts without a word.\n }\n return;\n }\n try {\n const report = await runStatus(configOption);\n process.stdout.write(`${renderStatus(report, options.format)}\\n`);\n } catch (err) {\n fail(err);\n }\n });\n}\n","/**\n * The Claude Code hook envelope, detected rather than switched.\n *\n * A hook command gets one JSON object on stdin, and Claude Code closes the\n * stream after it. When stdin is not a terminal and parses as an object with a\n * string `hook_event_name`, `manni check` and `manni status` speak the hook\n * protocol. Anything else is a run by hand, and stdin is left unread beyond\n * that one look. The look never hangs: `readStdin` gives up on a stream that\n * stays silent, which is what an inherited pipe nobody writes to looks like.\n */\nimport { readStdin } from \"../../tracevals/capture/hook.js\";\n\nexport interface Envelope {\n /** `hook_event_name`: `PostToolUse`, `Stop`, `SessionStart`, … */\n event: string;\n /** The directory the hook fired in; relative paths resolve from it. */\n cwd?: string;\n /** `tool_name`, on a tool event. */\n toolName?: string;\n /** `tool_input.file_path`, or `tool_input.notebook_path` for a notebook. */\n filePath?: string;\n /** `stop_hook_active`: this stop already follows one repair pass. */\n stopHookActive: boolean;\n /** `model`, on `SessionStart`: a string, or an object carrying `id`. */\n model?: string;\n /** `session_id`. */\n sessionId?: string;\n /** `transcript_path`: the session's own transcript. */\n transcriptPath?: string;\n /** `agent_transcript_path`, on `SubagentStop`: the subagent's own transcript. */\n agentTranscriptPath?: string;\n /** `agent_id`, on `SubagentStop`. */\n agentId?: string;\n /** `agent_type`, on `SubagentStop`. */\n agentType?: string;\n /** `last_assistant_message`, on `Stop` and `SubagentStop`. */\n lastAssistantMessage?: string;\n}\n\nfunction str(value: unknown): string | undefined {\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction record(value: unknown): Record<string, unknown> | undefined {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\n/** The envelope in `text`, or `undefined` when `text` is not one. */\nexport function parseEnvelope(text: string): Envelope | undefined {\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch {\n return undefined;\n }\n const doc = record(parsed);\n const event = str(doc?.hook_event_name);\n if (doc === undefined || event === undefined) return undefined;\n const input = record(doc.tool_input);\n const filePath = str(input?.file_path) ?? str(input?.notebook_path);\n const cwd = str(doc.cwd);\n const toolName = str(doc.tool_name);\n const model = str(doc.model) ?? str(record(doc.model)?.id);\n const strings = {\n sessionId: str(doc.session_id),\n transcriptPath: str(doc.transcript_path),\n agentTranscriptPath: str(doc.agent_transcript_path),\n agentId: str(doc.agent_id),\n agentType: str(doc.agent_type),\n lastAssistantMessage: str(doc.last_assistant_message),\n };\n const given = Object.fromEntries(Object.entries(strings).filter(([, v]) => v !== undefined)) as Partial<\n Record<keyof typeof strings, string>\n >;\n return {\n event,\n stopHookActive: doc.stop_hook_active === true,\n ...(cwd === undefined ? {} : { cwd }),\n ...(toolName === undefined ? {} : { toolName }),\n ...(filePath === undefined ? {} : { filePath }),\n ...(model === undefined ? {} : { model }),\n ...given,\n };\n}\n\n/** The envelope on stdin, or `undefined` for a run by hand. */\nexport async function readEnvelope(\n stream: NodeJS.ReadStream = process.stdin,\n): Promise<Envelope | undefined> {\n if (stream.isTTY) return undefined;\n try {\n return parseEnvelope(await readStdin(stream));\n } catch {\n // Too large to be an envelope: a run by hand with something piped in.\n return undefined;\n }\n}\n","/**\n * What is set up, and so what `manni check` runs.\n *\n * There are no keys of the family's own. A domain is in play when its own\n * section of `manni.config.yaml` exists, or when the content carries its\n * declarations. Nothing manni would apply by default counts as set up:\n *\n * | Domain | In play when |\n * |---|---|\n * | meta | a file's schema set is more than the built-in defaults: `meta:` covers it, or it names its own `$schema` |\n * | cite | a page carries citations |\n * | lint | `lint:` exists |\n * | docevals | a page resolves evals, from `docevals:` or its own declarations |\n * | term | the collections hold a term |\n * | graph | `graph:` exists |\n * | tracevals | `tracevals.runtime` exists; it judges the turn a Stop or SubagentStop hook ends |\n * | a11y | never run by `check`: it needs a running site |\n *\n * Only members of a declared collection are file-checked. tracevals judges a\n * turn, not files, so it needs no collection.\n */\nimport { relative, resolve, sep } from \"node:path\";\nimport { parse as parseYaml } from \"yaml\";\nimport type { CollectionConfig } from \"../../shared/collections.js\";\nimport {\n findFamilyConfigFile,\n readFamilyConfigFile,\n type ConfigFile,\n} from \"../../shared/config-file.js\";\nimport { ToolError } from \"../../shared/errors.js\";\nimport { memberOf, retainMembers } from \"../../meta/core/collections.js\";\nimport { resolveTargetSet } from \"../../meta/internal.js\";\n\n/** An operational error of `manni check` or `manni status`: exit 2. */\nexport class FamilyError extends ToolError {\n constructor(\n message: string,\n /** Set for the two conditions a hook answers with silence. */\n readonly quiet = false,\n ) {\n super(message);\n this.name = \"FamilyError\";\n }\n}\n\nexport function noConfigError(cwd: string): FamilyError {\n return new FamilyError(\n `No manni.config.yaml found from ${cwd} up to the repository root. manni check runs the checks it sets up.`,\n true,\n );\n}\n\nexport function nothingSetUpError(): FamilyError {\n return new FamilyError(\n \"Nothing is set up to check in manni.config.yaml. manni status says what each domain needs.\",\n true,\n );\n}\n\n/** The domains `check` can run, in the order it runs and reports them. */\nexport const DOMAINS = [\"meta\", \"cite\", \"lint\", \"docevals\", \"term\", \"graph\"] as const;\nexport type Domain = (typeof DOMAINS)[number];\n\n/** Each domain's check, as `check` names it. */\nexport const COMMANDS: Readonly<Record<Domain, string>> = {\n meta: \"meta validate\",\n cite: \"cite check\",\n lint: \"lint check\",\n docevals: \"docevals run\",\n term: \"term check\",\n graph: \"graph check\",\n};\n\n/** Why a domain is not in play, as both `check` and `status` say it. */\nexport const NOT_SET_UP: Readonly<Record<Domain, string>> = {\n meta: \"no meta: section\",\n cite: \"no page carries citations\",\n lint: \"no lint: section\",\n docevals: \"no page resolves any evals\",\n term: \"no terms in any collection\",\n graph: \"no graph: section\",\n};\n\n/** Why `meta` skips files when `meta:` exists but covers none of them. */\nexport const META_DEFAULTS_ONLY = \"only the built-in default schemas cover these files\";\n\n/**\n * The domains `check` does not run here, and what to run instead. tracevals\n * leaves this list when `tracevals.runtime` exists (`Family.runtime`).\n */\nexport const NOT_CHECKED: ReadonlyArray<readonly [string, string]> = [\n [\"a11y\", \"run manni 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 /** `tracevals.runtime` exists: tracevals judges each turn under the hooks. */\n runtime: boolean;\n collections: readonly CollectionConfig[];\n}\n\nfunction toError(message: string): FamilyError {\n return new FamilyError(message);\n}\n\nexport async function loadFamily(cwd: string, configPath?: string): Promise<Family> {\n const file =\n configPath === undefined\n ? await findFamilyConfigFile(cwd, toError)\n : await readFamilyConfigFile(configPath, cwd, toError);\n if (file === null) throw noConfigError(cwd);\n // Already parsed once by the loader, which would have thrown on bad YAML.\n const doc = parseYaml(file.text) as unknown;\n const top = record(doc);\n const sections = new Set(top === undefined ? [] : Object.keys(top));\n const tracevals = record(top?.tracevals);\n // The old `conformance` key counts too. tracevals' loader refuses it and\n // names `runtime`, and only a tracevals in play loads that config, so a\n // config not yet migrated reaches `status` as an error, not as a silent skip.\n const runtime = tracevals?.runtime !== undefined || tracevals?.conformance !== undefined;\n return { file, configPath: configPath ?? file.source, sections, runtime, collections: file.collections };\n}\n\nfunction record(value: unknown): Record<string, unknown> | undefined {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\n/** A path as a label relative to `cwd`, posix, the way the domains print one. */\nexport function labelFrom(cwd: string, path: string): string {\n return relative(cwd, path).split(sep).join(\"/\");\n}\n\n/** The collections a file at `label` (relative to `cwd`) belongs to. */\nexport function collectionsOf(family: Family, cwd: string, label: string): string[] {\n return memberOf(family.collections, family.file.dir, cwd, label);\n}\n\n/** Every member of every collection, labelled from `cwd`. */\nexport async function listMembers(family: Family, cwd: string): Promise<string[]> {\n const dir = family.file.dir;\n const { files } = await resolveTargetSet({\n inputs: family.collections.flatMap((c) => c.paths),\n cwd: dir,\n allowEmpty: true,\n });\n return retainMembers(files, (label) => memberOf(family.collections, dir, dir, label)).map(\n (label) => labelFrom(cwd, resolve(dir, label)),\n );\n}\n","/**\n * `manni check`: every check the repository has set up, and nothing else.\n *\n * It owns no checks. Each one is a domain's own command core, run in process\n * with the family config handed to it, and each report is that domain's own\n * reporter's output. What this adds is the choice of what runs (`in-play.ts`),\n * the scope, and one verdict over all of it.\n *\n * Scope:\n *\n * - `all`: every in-play check over every collection, per-file and set-wide.\n * Each domain runs bare, exactly as its own CI step would.\n * - `paths`: the per-file checks on the collection members among the paths.\n * - `changed`: the per-file checks on the git working tree's changes, plus\n * `cite` set-wide. `term` runs set-wide too when a collection document\n * changed or was removed. `graph` never runs here; only `all` checks it.\n * A clean tree runs nothing.\n *\n * `cite` is per-file on paths and set-wide otherwise: a source edit can drift\n * any page's citation, so after a session the whole set is what is checked.\n */\nimport { basename, extname, resolve } from \"node:path\";\nimport pkg from \"../../../package.json\" with { type: \"json\" };\nimport { ToolError, errorMessage } from \"../../shared/errors.js\";\nimport { warn } from \"../../shared/warn.js\";\nimport { resolveTargetSet } from \"../../meta/internal.js\";\nimport { supportedExtensions } from \"../../meta/extractors/index.js\";\nimport type { TurnCheckInput, TurnCheckResult } from \"../../tracevals/commands/check.js\";\nimport { changedFiles } from \"../core/changed.js\";\nimport { sayOnce } from \"../core/said-once.js\";\nimport type { Envelope } from \"../core/envelope.js\";\nimport {\n COMMANDS,\n DOMAINS,\n META_DEFAULTS_ONLY,\n NOT_SET_UP,\n collectionsOf,\n labelFrom,\n listMembers,\n loadFamily,\n nothingSetUpError,\n plural,\n type Domain,\n type Family,\n} from \"../core/in-play.js\";\nimport { withSharedWalks } from \"../../meta/core/load-files.js\";\n\nexport const CHECK_FORMATS = [\"pretty\", \"json\", \"github\"] as const;\nexport type CheckFormat = (typeof CHECK_FORMATS)[number];\n\nexport type Scope =\n | { kind: \"all\" }\n | { kind: \"paths\"; paths: string[] }\n | { kind: \"changed\" };\n\nexport interface FamilyCheckOptions {\n /** Where paths resolve and the domains run. Default `process.cwd()`. */\n cwd?: string;\n /** `-c, --config`. */\n configPath?: string;\n scope: Scope;\n /**\n * Leave out a named path that does not exist, rather than failing on it. A\n * hook names a file the edit may have just removed.\n */\n allowMissing?: boolean;\n /** Diagnostics: the outside-every-collection notice, and the domains' own. */\n onNotice?: (message: string) => void;\n}\n\n/** A check that ran. `render` is the domain's own reporter. */\nexport interface RanCheck {\n command: string;\n status: \"pass\" | \"fail\";\n render: (format: CheckFormat, color: boolean) => string;\n}\n\n/** A check that did not run: not in play, or it could not. */\nexport interface NotRunCheck {\n command: string;\n status: \"skipped\" | \"error\";\n message: string;\n}\n\nexport type CheckOutcome = RanCheck | NotRunCheck;\n\nexport interface FamilyCheckRun {\n status: \"pass\" | \"fail\";\n /** The collection members the per-file checks covered, labelled from `cwd`. */\n files: string[];\n checks: CheckOutcome[];\n}\n\ntype Outcome =\n | { skipped: string }\n | { failed: boolean; render: (format: CheckFormat, color: boolean) => string };\n\ninterface Context {\n family: Family;\n cwd: string;\n /** The per-file inputs, or `[]` for a bare run over the collections. */\n inputs: string[];\n onNotice: (message: string) => void;\n}\n\n/**\n * Each domain's command core and reporter are imported where it runs: a hook\n * checks one page with four domains, and the other two (the RDF stack among\n * them) are worth not loading.\n */\nasync function runDomain(domain: Domain, ctx: Context): Promise<Outcome> {\n const { family, cwd, inputs, onNotice } = ctx;\n const configPath = family.configPath;\n switch (domain) {\n case \"meta\": {\n const [{ runValidate }, { render: renderMeta }] = await Promise.all([\n import(\"../../meta/commands/validate.js\"),\n import(\"../../meta/reporters/index.js\"),\n ]);\n const run = await runValidate({ inputs, configPath, cwd, skipDefaultOnly: true, onNotice });\n if (run.results.length === 0) {\n return { skipped: family.sections.has(\"meta\") ? META_DEFAULTS_ONLY : NOT_SET_UP.meta };\n }\n return {\n failed: run.summary.failed > 0,\n render: (format, color) =>\n renderMeta(format, run.results, run.summary, { color, quiet: true, frame: run.frame, onNotice }),\n };\n }\n case \"cite\": {\n const [{ runCheck: runCite }, { renderCheckPretty: citePretty }, { renderCheckJson: citeJson }, { renderCheckGithub: citeGithub }] =\n await Promise.all([\n import(\"../../cite/commands/check.js\"),\n import(\"../../cite/reporters/pretty.js\"),\n import(\"../../cite/reporters/json.js\"),\n import(\"../../cite/reporters/github.js\"),\n ]);\n const run = await runCite({ inputs, configPath, cwd, onNotice });\n if (!run.pages.some((p) => p.citations.length > 0 || p.findings.length > 0)) {\n return { skipped: NOT_SET_UP.cite };\n }\n return {\n failed: run.summary.failed > 0,\n render: (format, color) =>\n format === \"json\"\n ? citeJson(run)\n : format === \"github\"\n ? citeGithub(run)\n : citePretty(run, { color, quiet: true }),\n };\n }\n case \"lint\": {\n if (!family.sections.has(\"lint\")) return { skipped: NOT_SET_UP.lint };\n const [{ runLint }, { render: renderLint }] = await Promise.all([\n import(\"../../lint/commands/lint.js\"),\n import(\"../../lint/reporters/index.js\"),\n ]);\n const run = await runLint({ inputs, configPath, cwd, onNotice });\n return {\n failed: run.summary.failed > 0,\n render: (format, color) => renderLint(run, format, { color }),\n };\n }\n case \"docevals\": {\n const [{ runRun: runDocevals }, { render: renderDocevals }, { DocevalsError }] = await Promise.all([\n import(\"../../docevals/commands/run.js\"),\n import(\"../../docevals/reporters/index.js\"),\n import(\"../../docevals/types.js\"),\n ]);\n let report;\n try {\n report = await runDocevals(inputs, {\n config: configPath,\n cwd,\n deterministicOnly: true,\n generate: false,\n execution: false,\n toolVersion: pkg.version,\n });\n } catch (err) {\n if (err instanceof DocevalsError && err.code === \"nothing-resolved\") {\n return { skipped: NOT_SET_UP.docevals };\n }\n throw err;\n }\n return {\n failed: report.exitCode !== 0,\n render: (format, color) => renderDocevals(report, format, { color }),\n };\n }\n case \"term\": {\n const [{ runCheck: runTerm }, { renderFindingsPretty: termPretty }, { renderFindingsJson: termJson }, { renderFindingsGithub: termGithub }] =\n await Promise.all([\n import(\"../../term/commands/check.js\"),\n import(\"../../term/reporters/pretty.js\"),\n import(\"../../term/reporters/json.js\"),\n import(\"../../term/reporters/github.js\"),\n ]);\n const report = await runTerm({ inputs, configPath, cwd, allowEmpty: true, onNotice });\n if (report.terms === 0) return { skipped: NOT_SET_UP.term };\n return {\n failed: report.summary.failed > 0,\n render: (format, color) =>\n format === \"json\"\n ? termJson(report)\n : format === \"github\"\n ? termGithub(report)\n : termPretty(report, { color, references: true }),\n };\n }\n case \"graph\": {\n if (!family.sections.has(\"graph\")) return { skipped: NOT_SET_UP.graph };\n const [{ buildGraph }, { runCheck: runGraph, renderCheck: renderGraph }] = await Promise.all([\n import(\"../../graph/commands/build.js\"),\n import(\"../../graph/commands/check.js\"),\n ]);\n const built = await buildGraph({ config: configPath, cwd });\n for (const warning of built.warnings) onNotice(warning);\n const report = await runGraph({ config: configPath, cwd, turtle: built.turtle });\n return {\n failed: report.exitCode !== 0,\n render: (format) => renderGraph(report, format),\n };\n }\n }\n}\n\nasync function outcome(domain: Domain, ctx: Context): Promise<CheckOutcome> {\n const command = COMMANDS[domain];\n try {\n const result = await runDomain(domain, ctx);\n if (\"skipped\" in result) return { command, status: \"skipped\", message: result.skipped };\n return { command, status: result.failed ? \"fail\" : \"pass\", render: result.render };\n } catch (err) {\n return { command, status: \"error\", message: errorMessage(err) };\n }\n}\n\n/** A hook or a git status names files by any extension; a walk keeps the documents. */\nfunction isDocument(label: string): boolean {\n return supportedExtensions().includes(extname(label).toLowerCase());\n}\n\n/** Every domain walks the same collections, so the run shares one walk per target set. */\nexport function runFamilyCheck(opts: FamilyCheckOptions): Promise<FamilyCheckRun> {\n return withSharedWalks(() => checkUnshared(opts));\n}\n\nasync function checkUnshared(opts: FamilyCheckOptions): Promise<FamilyCheckRun> {\n const cwd = resolve(opts.cwd ?? process.cwd());\n const onNotice = opts.onNotice ?? ((): void => undefined);\n const family = await loadFamily(cwd, opts.configPath);\n if (family.collections.length === 0) throw nothingSetUpError();\n const isMember = (label: string): boolean => collectionsOf(family, cwd, label).length > 0;\n\n let files: string[];\n let domains: Domain[];\n let inputs: string[];\n switch (opts.scope.kind) {\n case \"all\":\n files = await listMembers(family, cwd);\n inputs = [];\n domains = [...DOMAINS];\n break;\n case \"paths\": {\n const { files: named } = await resolveTargetSet({\n inputs: opts.scope.paths,\n cwd,\n ...(opts.allowMissing === true ? { allowEmpty: true } : {}),\n });\n const outside = named.filter((label) => !isMember(label));\n if (outside.length > 0) {\n onNotice(`Skipped ${plural(outside.length, \"file\")} outside every collection: ${outside.join(\", \")}`);\n }\n // A collection globbed wide holds assets too; only documents are checked.\n files = named.filter((label) => isMember(label) && isDocument(label));\n inputs = files;\n domains = files.length > 0 ? [\"meta\", \"cite\", \"lint\", \"docevals\"] : [];\n break;\n }\n case \"changed\": {\n const changed = await changedFiles(cwd);\n if (!changed.dirty) return { status: \"pass\", files: [], checks: [] };\n const memberDocuments = (paths: string[]): string[] =>\n paths.map((path) => labelFrom(cwd, path)).filter((l) => isDocument(l) && isMember(l));\n files = memberDocuments(changed.files);\n inputs = files;\n // term reads only collection documents, so a session that changed or\n // removed none of them leaves the glossary as it was. graph never runs\n // here: it is the slowest set-wide check, and its findings span pages\n // rather than the one an agent just wrote, so a bare run (CI) owns it.\n const pageChanged = files.length > 0 || memberDocuments(changed.removed).length > 0;\n domains = [\n ...(files.length > 0 ? ([\"meta\", \"lint\", \"docevals\"] as const) : []),\n \"cite\",\n ...(pageChanged ? ([\"term\"] as const) : []),\n ];\n break;\n }\n }\n\n const checks: CheckOutcome[] = [];\n for (const domain of domains) {\n // The set-wide checks run bare, over every collection, whatever the scope.\n const setWide = domain === \"term\" || domain === \"graph\" || (domain === \"cite\" && opts.scope.kind !== \"paths\");\n checks.push(await outcome(domain, { family, cwd, inputs: setWide ? [] : inputs, onNotice }));\n }\n if (opts.scope.kind === \"all\" && checks.every((c) => c.status === \"skipped\")) {\n throw nothingSetUpError();\n }\n return { status: checks.some((c) => c.status === \"fail\") ? \"fail\" : \"pass\", files, checks };\n}\n\n/** The exit code a run by hand ends with: 2 when a check could not run. */\nexport function exitCodeFor(run: FamilyCheckRun): 0 | 1 | 2 {\n if (run.checks.some((c) => c.status === \"error\")) return 2;\n return run.status === \"fail\" ? 1 : 0;\n}\n\nfunction isRan(check: CheckOutcome): check is RanCheck {\n return check.status === \"pass\" || check.status === \"fail\";\n}\n\n/** The first line of a message, for a one-line context. */\nfunction firstLine(message: string): string {\n return message.split(\"\\n\", 1)[0] ?? \"\";\n}\n\n/** What an agent is handed when a hook blocks: the failing checks' reports, nothing else. */\nfunction renderFailures(run: FamilyCheckRun): string {\n return run.checks\n .filter((c): c is RanCheck => c.status === \"fail\")\n .map((c) => `${c.command}\\n${c.render(\"pretty\", false)}`)\n .join(\"\\n\\n\");\n}\n\nexport function renderPretty(run: FamilyCheckRun, color: boolean): string {\n const blocks: string[] = [];\n for (const check of run.checks) {\n if (isRan(check)) blocks.push(`${check.command}\\n${check.render(\"pretty\", color)}`);\n }\n const notRun = run.checks.filter((c): c is NotRunCheck => !isRan(c));\n if (notRun.length > 0) {\n const width = Math.max(...notRun.map((c) => c.command.length)) + 3;\n blocks.push(\n notRun\n .map((c) => `${c.status.padEnd(9)}${c.command.padEnd(width)}${firstLine(c.message)}`)\n .join(\"\\n\"),\n );\n }\n const count = (status: CheckOutcome[\"status\"]): number =>\n run.checks.filter((c) => c.status === status).length;\n const errors = count(\"error\");\n blocks.push(\n `${plural(run.checks.length, \"check\")} over ${plural(run.files.length, \"file\")}: ` +\n `${String(count(\"fail\"))} failed, ${String(count(\"skipped\"))} skipped` +\n (errors > 0 ? `, ${String(errors)} could not run` : \"\"),\n );\n return blocks.join(\"\\n\\n\");\n}\n\n/** A check's JSON entry: its own report, or why there is none. */\nfunction jsonEntry(c: CheckOutcome): object {\n if (!isRan(c)) return { command: c.command, status: c.status, message: c.message };\n try {\n return { command: c.command, status: c.status, report: JSON.parse(c.render(\"json\", false)) as unknown };\n } catch {\n // One reporter's bad output must not take the other checks' reports with it.\n // `error` on purpose, whatever the run's own status: with no report to\n // embed, a `pass` or `fail` here would be a verdict nobody can inspect.\n // The reference documents `error` for this case too.\n return { command: c.command, status: \"error\", message: `${c.command} -f json printed output that is not JSON` };\n }\n}\n\nexport function renderJson(run: FamilyCheckRun): string {\n return JSON.stringify(\n {\n status: run.status,\n files: run.files,\n checks: run.checks.map(jsonEntry),\n },\n null,\n 2,\n );\n}\n\nexport function renderGithub(run: FamilyCheckRun): string {\n return run.checks\n .filter(isRan)\n .map((c) => c.render(\"github\", false))\n .filter((text) => text.length > 0)\n .join(\"\\n\");\n}\n\nexport function render(run: FamilyCheckRun, format: CheckFormat, color: boolean): string {\n return format === \"json\" ? renderJson(run) : format === \"github\" ? renderGithub(run) : renderPretty(run, color);\n}\n\n/** What a hook command ends with: its exit code, and what it prints where. */\nexport interface HookReply {\n exitCode: 0 | 2;\n stdout?: string;\n stderr?: string;\n}\n\n/** The PostToolUse tools whose edit `check` answers. */\nexport const EDIT_TOOLS: readonly string[] = [\"Edit\", \"Write\", \"MultiEdit\", \"NotebookEdit\"];\n\n/**\n * The hook protocol's answer to a run. Never exit 2 for a check that could\n * not run: 2 means \"block\" to Claude Code, and an operational error is not\n * the agent's to fix.\n */\nexport function hookReply(run: FamilyCheckRun, envelope: Envelope): HookReply {\n const failed = run.status === \"fail\";\n if (envelope.event === \"PostToolUse\") {\n const files = run.files.join(\", \");\n if (failed) {\n return {\n exitCode: 2,\n stderr: `manni found errors in ${files}. Fix them before you continue.\\n\\n${renderFailures(run)}\\n`,\n };\n }\n const errors = run.checks.filter((c): c is NotRunCheck => c.status === \"error\");\n if (errors.length === 0) return { exitCode: 0 };\n const additionalContext = errors\n .map((c) => `manni ${c.command} could not check ${files}: ${firstLine(c.message)}`)\n .join(\"\\n\");\n return {\n exitCode: 0,\n stdout: `${JSON.stringify({ hookSpecificOutput: { hookEventName: \"PostToolUse\", additionalContext } })}\\n`,\n };\n }\n if (envelope.event === \"Stop\") return turnReply(run, undefined, envelope);\n return { exitCode: 0 };\n}\n\n/** What tracevals found in the turn a Stop or SubagentStop ended, for the reply. */\nexport interface TurnVerdict {\n /** Rules broken with a confident verdict: how many, the report, the trace judged. */\n broken?: { rules: number; report: string; trace: string };\n /** A skip not yet said this session. */\n skipMessage?: string;\n}\n\n/**\n * The reply to a Stop or a SubagentStop: 0078's file checks first, then the\n * turn. One block carries both reasons; after the repair pass, one message\n * carries both sentences. Always exit 0, as 0078's Stop is.\n */\nexport function turnReply(\n run: FamilyCheckRun | undefined,\n turn: TurnVerdict | undefined,\n envelope: Envelope,\n): HookReply {\n const reasons: string[] = [];\n const messages: string[] = [];\n if (run?.status === \"fail\") {\n if (envelope.stopHookActive) {\n messages.push(\"manni still reports errors after one repair pass. Run manni check to see them.\");\n } else {\n reasons.push(`manni found errors in the files you changed. Fix them, then finish.\\n\\n${renderFailures(run)}`);\n }\n }\n if (turn?.broken !== undefined) {\n const { rules, report, trace } = turn.broken;\n if (envelope.stopHookActive) {\n messages.push(\n `tracevals still finds broken rules after one repair pass. Run manni tracevals check ${trace} to see them.`,\n );\n } else {\n reasons.push(\n `This turn broke ${plural(rules, \"rule\")} from the files and requests that governed it. ` +\n `Fix the work, or say why the rule does not apply here, then finish.\\n\\n${report}`,\n );\n }\n }\n if (turn?.skipMessage !== undefined) messages.push(turn.skipMessage);\n if (reasons.length === 0 && messages.length === 0) return { exitCode: 0 };\n const reply = {\n ...(reasons.length > 0 ? { decision: \"block\", reason: reasons.join(\"\\n\\n\") } : {}),\n ...(messages.length > 0 ? { systemMessage: messages.join(\" \") } : {}),\n };\n return { exitCode: 0, stdout: `${JSON.stringify(reply)}\\n` };\n}\n\n/** Test seams `checkTurn` takes; production builds each from config. */\nexport type TurnSeams = Partial<Pick<TurnCheckInput, \"judge\" | \"extractor\" | \"localModels\" | \"env\">>;\n\n/**\n * Judge the turn a Stop or SubagentStop ended, with every gate of proposal\n * 0079. Silent (`undefined`) when tracevals is not in play, the turn is clean\n * or only needs review, a skip was already said this session, or the run\n * could not happen: an operational failure is not the agent's to fix.\n */\nexport async function runTurnCheck(\n envelope: Envelope,\n cwd: string,\n seams: TurnSeams = {},\n): Promise<TurnVerdict | undefined> {\n const subagent = envelope.event === \"SubagentStop\";\n const judged = subagent ? envelope.agentTranscriptPath : envelope.transcriptPath;\n if (judged === undefined) return undefined;\n const trace = resolve(cwd, judged);\n const sessionId = envelope.sessionId ?? basename(trace, \".jsonl\");\n let result: TurnCheckResult;\n let renderTurn: (typeof import(\"../../tracevals/reporters/runtime.js\"))[\"renderCheck\"];\n try {\n // Loaded here, as every domain is, so a run that never judges a turn never\n // loads tracevals.\n const [{ checkTurn }, reporters] = await Promise.all([\n import(\"../../tracevals/commands/check.js\"),\n import(\"../../tracevals/reporters/runtime.js\"),\n ]);\n renderTurn = reporters.renderCheck;\n result = await checkTurn({\n transcriptPath: resolve(cwd, envelope.transcriptPath ?? judged),\n ...(subagent ? { agentTranscriptPath: trace } : {}),\n ...(subagent && envelope.agentId !== undefined ? { agentId: envelope.agentId } : {}),\n ...(subagent && envelope.agentType !== undefined ? { agentType: envelope.agentType } : {}),\n ...(envelope.lastAssistantMessage !== undefined\n ? { lastAssistantMessage: envelope.lastAssistantMessage }\n : {}),\n sessionId,\n cwd,\n inLoop: true,\n ...seams,\n });\n } catch (err) {\n // An operational failure is not the agent's to fix, so it stays silent, as\n // 0078's Stop failures do. Anything else is a bug: say so on stderr, which\n // a hook that exits 0 sends to the debug log, and still never block.\n if (!(err instanceof ToolError)) warn(`the turn check failed unexpectedly: ${errorMessage(err)}`);\n return undefined;\n }\n const { skipped } = result;\n if (skipped?.message !== undefined) {\n return sayOnce(cwd, sessionId, skipped.gate) ? { skipMessage: skipped.message } : undefined;\n }\n if (result.exitCode !== 1 || result.report === undefined) return undefined;\n return {\n broken: {\n rules: result.report.summary.fail,\n report: renderTurn(result.report, { color: false }),\n trace: judged,\n },\n };\n}\n\n/** The reply when the run itself could not happen, under a hook. */\nexport function hookFailure(message: string, envelope: Envelope, file: string | undefined): HookReply {\n if (envelope.event !== \"PostToolUse\" || file === undefined) return { exitCode: 0 };\n const additionalContext = `manni check could not check ${file}: ${firstLine(message)}`;\n return {\n exitCode: 0,\n stdout: `${JSON.stringify({ hookSpecificOutput: { hookEventName: \"PostToolUse\", additionalContext } })}\\n`,\n };\n}\n","/**\n * The files a session changed: the git working tree against `HEAD`.\n *\n * Modified, added, renamed (by the new name) and untracked files, staged or\n * not. A deleted file, or a renamed one's old name, is named apart, since\n * there is nothing left to check. Paths come back absolute, resolved from\n * `cwd`: porcelain status names them from the repository root whatever\n * directory git ran in.\n */\nimport { execFile } from \"node:child_process\";\nimport { posix, resolve } from \"node:path\";\nimport { promisify } from \"node:util\";\n\nconst run = promisify(execFile);\n\nasync function git(args: string[], cwd: string): Promise<string> {\n // shell:false: nothing here is ever parsed as shell syntax.\n const { stdout } = await run(\"git\", args, {\n cwd,\n shell: false,\n windowsHide: true,\n maxBuffer: 64 * 1024 * 1024,\n });\n return stdout;\n}\n\n/** Parse `git status --porcelain=v1 -z` into repository-relative paths. */\nexport function parsePorcelain(output: string): { files: string[]; removed: string[] } {\n const fields = output.split(\"\\0\");\n const files: string[] = [];\n const removed: string[] = [];\n for (let i = 0; i < fields.length; i++) {\n const entry = fields[i] ?? \"\";\n if (entry.length < 4) continue;\n const xy = entry.slice(0, 2);\n const path = entry.slice(3);\n // A rename or copy is followed by its old name, which is not a change to\n // check. A rename's old name is gone; a copy's is still there.\n if (xy.includes(\"R\") || xy.includes(\"C\")) {\n i++;\n if (xy.includes(\"R\")) removed.push(fields[i] ?? \"\");\n }\n // `RD`, a staged rename then deleted in the tree, removes both names:\n // the old one above and the new one here. Two files, not one twice.\n if (xy.includes(\"D\")) removed.push(path);\n else files.push(path);\n }\n return { files, removed };\n}\n\nexport interface ChangedTree {\n /** The changed files left to check, absolute. */\n files: string[];\n /** The files the tree no longer has: deleted, or renamed away. Absolute. */\n removed: string[];\n /**\n * Whether the tree differs from `HEAD` at all. A deletion alone leaves no\n * file to check, but it can still break a citation to what it removed.\n */\n dirty: boolean;\n}\n\nexport async function changedFiles(cwd: string): Promise<ChangedTree> {\n // Rebased through `cwd`'s own prefix rather than resolved from the\n // top-level git prints: on Windows that is the long spelling of a path the\n // caller may hold in its 8.3 short form, and the two would never compare.\n const prefix = (await git([\"rev-parse\", \"--show-prefix\"], cwd)).trim();\n const status = await git(\n [\"status\", \"--porcelain=v1\", \"-z\", \"--untracked-files=all\"],\n cwd,\n );\n const { files, removed } = parsePorcelain(status);\n const absolute = (path: string): string => resolve(cwd, posix.relative(prefix, path));\n return { files: files.map(absolute), removed: removed.map(absolute), dirty: status.length > 0 };\n}\n","/**\n * What a hook has already told the user this session (proposal 0079: \"A skip\n * message is said once per session\").\n *\n * Each hook is a process of its own, and parallel subagents end in parallel\n * SubagentStop hooks, so the memory is one marker file per message, created\n * exclusively. The process whose create succeeds is the one that says it, so\n * no two hooks can both read \"not said yet\".\n */\nimport { mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { DEFAULT_CAPTURE_DIR } from \"../../tracevals/capture/types.js\";\nimport { idHash } from \"../../tracevals/rules/ledger.js\";\n\n/**\n * `<project>/.manni/tracevals/sessions/<session hash>.<key>.said`. The session\n * id is hashed, so nothing in it can climb out of the directory and two ids\n * never share a marker. The key is a gate name, which is already safe.\n */\nexport function saidPath(projectDir: string, sessionId: string, key: string): string {\n return join(projectDir, DEFAULT_CAPTURE_DIR, `${idHash(sessionId)}.${key}.said`);\n}\n\n/**\n * True the first time `key` comes up in a session, and records it. A marker\n * that cannot be written says the message rather than lose it.\n */\nexport function sayOnce(projectDir: string, sessionId: string, key: string): boolean {\n const path = saidPath(projectDir, sessionId, key);\n try {\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, \"\", { flag: \"wx\" });\n return true;\n } catch (err) {\n // EEXIST: another hook said it first. Anything else is an unwritable\n // project, which repeats the message each stop rather than lose it.\n return (err as NodeJS.ErrnoException).code !== \"EEXIST\";\n }\n}\n","/**\n * `manni status`: what is set up here, and so what `manni check` runs.\n *\n * It reads the same table `check` does (`in-play.ts`), counting what the\n * content declares where a domain is in play by declaration: the pages that\n * name their own `$schema`, carry citations or resolve evals, and the terms.\n * It checks nothing, so it exits 0 whatever it finds.\n */\nimport { appendFileSync, existsSync, readFileSync } from \"node:fs\";\nimport { extname, resolve } from \"node:path\";\nimport pkg from \"../../../package.json\" with { type: \"json\" };\nimport { errorMessage } from \"../../shared/errors.js\";\nimport { extractorForExtension } from \"../../meta/extractors/index.js\";\nimport type { HostStatus } from \"../../tracevals/rules/host.js\";\nimport type { Envelope } from \"../core/envelope.js\";\nimport {\n COMMANDS,\n DOMAINS,\n NOT_CHECKED,\n NOT_SET_UP,\n collectionsOf,\n listMembers,\n loadFamily,\n plural,\n type Domain,\n type Family,\n} from \"../core/in-play.js\";\nimport { withSharedWalks } from \"../../meta/core/load-files.js\";\n\nexport const STATUS_FORMATS = [\"pretty\", \"json\"] as const;\nexport type StatusFormat = (typeof STATUS_FORMATS)[number];\n\nexport type DomainState = \"in-play\" | \"not-set-up\" | \"not-checked\" | \"unknown\";\n\nexport interface ModelRole {\n provider: string;\n model: string;\n}\n\nexport interface DomainRow {\n name: string;\n status: DomainState;\n reason: string;\n /** tracevals in play: the model judging inside a hook, and the one extracting rules. */\n models?: { hook: ModelRole; extraction: ModelRole };\n /** tracevals in play with a model host running: each model it holds. */\n host?: HostStatus[\"models\"];\n}\n\nexport interface StatusReport {\n version: string;\n /** The config file, as discovery found it or as it was typed. */\n config: string;\n collections: { name: string; files: number }[];\n domains: DomainRow[];\n}\n\nexport interface StatusOptions {\n cwd?: string;\n configPath?: string;\n /** Test seam: the running model host. Default: ask the inference library. */\n hostStatus?: () => Promise<HostStatus | null>;\n}\n\n/**\n * tracevals' row when `tracevals.runtime` exists: both models, resolved\n * the way `check` and `prepare` resolve them, and the host when one runs.\n */\nasync function tracevalsRow(cwd: string, opts: StatusOptions): Promise<DomainRow> {\n try {\n const [\n { discoverConfig },\n { assertProviderSelection, resolveSelectionIdentity, selectHookProvider, selectProvider },\n { hostStatus },\n ] = await Promise.all([\n import(\"../../tracevals/core/config.js\"),\n import(\"../../tracevals/judge/provider.js\"),\n import(\"../../tracevals/rules/host.js\"),\n ]);\n const { config } = await discoverConfig(cwd, opts.configPath === undefined ? {} : { configPath: opts.configPath });\n const hook = await resolveSelectionIdentity(config, selectHookProvider(config));\n const selection = selectProvider(config);\n assertProviderSelection(selection);\n const extraction = await resolveSelectionIdentity(config, selection);\n const host = await (opts.hostStatus ?? hostStatus)().catch(() => null);\n return {\n name: \"tracevals\",\n status: \"in-play\",\n reason: `hook: ${hook.provider} ${hook.model} · extraction: ${extraction.provider} ${extraction.model}`,\n models: {\n hook: { provider: hook.provider, model: hook.model },\n extraction: { provider: extraction.provider, model: extraction.model },\n },\n ...(host === null || host.models.length === 0 ? {} : { host: host.models }),\n };\n } catch (err) {\n const message = errorMessage(err).split(\"\\n\", 1)[0] ?? \"\";\n return { name: \"tracevals\", status: \"unknown\", reason: `manni tracevals check could not run: ${message}` };\n }\n}\n\n/** `1 page names`, `3 pages name`: a count and the verb that agrees with it. */\nfunction pages(n: number, one: string, many: string): string {\n return n === 1 ? `1 page ${one}` : `${String(n)} pages ${many}`;\n}\n\n/** The pages naming their own `$schema`, read the way `meta validate` extracts them. */\nfunction ownSchemaCount(cwd: string, members: readonly string[]): number {\n let n = 0;\n for (const label of members) {\n const extractor = extractorForExtension(extname(label));\n if (extractor === undefined) continue;\n try {\n const { data } = extractor.extract(readFileSync(resolve(cwd, label), \"utf8\"), label);\n if (data.$schema !== undefined) n++;\n } catch {\n // A page that does not parse names nothing; `meta validate` reports it.\n }\n }\n return n;\n}\n\n/**\n * The pages carrying citations, read the way `cite check` reads them: its\n * targets, its manifests, its entry rules. Nothing is classified, so no claim\n * or source is looked at and no git history is read.\n */\nasync function citedPages(cwd: string, configPath: string): Promise<number> {\n // Imported where they run, so `manni check` never loads them.\n const { prepareRun, readTarget } = await import(\"../../cite/commands/check.js\");\n const { readPage } = await import(\"../../cite/core/page.js\");\n const prepared = await prepareRun({ inputs: [], configPath, cwd, checkSources: false }, \"checked\", \"check\");\n let n = 0;\n for (const file of prepared.files) {\n const content = await readTarget(prepared.run, file);\n const { citations } = (await prepared.setupFor(file, content)).options;\n const read = readPage(file, content, { markers: false, ...(citations === undefined ? {} : { citations }) });\n if (read.citations.length > 0) n++;\n }\n return n;\n}\n\nasync function row(domain: Domain, family: Family, cwd: string, members: readonly string[]): Promise<DomainRow> {\n const configPath = family.configPath;\n const inPlay = (reason: string): DomainRow => ({ name: domain, status: \"in-play\", reason });\n const notSetUp: DomainRow = { name: domain, status: \"not-set-up\", reason: NOT_SET_UP[domain] };\n const section = family.sections.has(domain);\n switch (domain) {\n case \"meta\": {\n if (section) return inPlay(\"meta: section\");\n const n = ownSchemaCount(cwd, members);\n return n > 0 ? inPlay(pages(n, \"names its own $schema\", \"name their own $schema\")) : notSetUp;\n }\n case \"cite\": {\n const n = await citedPages(cwd, configPath);\n return n > 0 ? inPlay(pages(n, \"carries citations\", \"carry citations\")) : notSetUp;\n }\n case \"docevals\": {\n const { runList: listEvals } = await import(\"../../docevals/commands/list.js\");\n const { plans } = await listEvals([], { config: configPath, cwd });\n const n = plans.filter((p) => !p.skip && p.evals.length > 0).length;\n if (n === 0) return notSetUp;\n return inPlay(section ? \"docevals: section\" : pages(n, \"declares evals\", \"declare evals\"));\n }\n case \"term\": {\n const { runList: listTerms } = await import(\"../../term/commands/list.js\");\n const { terms } = await listTerms({ inputs: [], configPath, cwd, allowEmpty: true });\n return terms.length > 0 ? inPlay(plural(terms.length, \"term\")) : notSetUp;\n }\n case \"lint\":\n case \"graph\":\n return section ? inPlay(`${domain}: section`) : notSetUp;\n }\n}\n\n/** Every domain walks the same collections, so the run shares one walk per target set. */\nexport function runStatus(opts: StatusOptions = {}): Promise<StatusReport> {\n return withSharedWalks(() => statusUnshared(opts));\n}\n\nasync function statusUnshared(opts: StatusOptions): Promise<StatusReport> {\n const cwd = resolve(opts.cwd ?? process.cwd());\n const family = await loadFamily(cwd, opts.configPath);\n const members = family.collections.length === 0 ? [] : await listMembers(family, cwd);\n const domains: DomainRow[] = [];\n for (const domain of DOMAINS) {\n // `check` only reads collection members, so with no collections every\n // domain has nothing to check, whatever sections the config carries.\n if (family.collections.length === 0) {\n domains.push({ name: domain, status: \"not-set-up\", reason: \"no collections: in manni.config.yaml\" });\n continue;\n }\n try {\n domains.push(await row(domain, family, cwd, members));\n } catch (err) {\n // Status checks nothing, so a domain that cannot read its own setup is\n // reported in its row rather than ending the run, as unknown: whether it is\n // set up is the thing it could not read.\n const message = errorMessage(err).split(\"\\n\", 1)[0] ?? \"\";\n domains.push({ name: domain, status: \"unknown\", reason: `manni ${COMMANDS[domain]} could not run: ${message}` });\n }\n }\n for (const [name, reason] of NOT_CHECKED) {\n domains.push(\n name === \"tracevals\" && family.runtime\n ? await tracevalsRow(cwd, opts)\n : { name, status: \"not-checked\", reason },\n );\n }\n return {\n version: pkg.version,\n config: family.file.source,\n collections: family.collections.map((c) => ({\n name: c.name,\n files: members.filter((label) => collectionsOf(family, cwd, label).includes(c.name)).length,\n })),\n domains,\n };\n}\n\nconst STATE_LABEL: Readonly<Record<DomainState, string>> = {\n \"in-play\": \"in play\",\n \"not-set-up\": \"not set up\",\n \"not-checked\": \"not checked\",\n unknown: \"unknown\",\n};\n\nexport function renderStatus(report: StatusReport, format: StatusFormat): string {\n if (format === \"json\") return JSON.stringify(report, null, 2);\n const head = [\n `manni ${report.version}`,\n `config ${report.config}`,\n ...report.collections.map((c) => `collection ${c.name} (${plural(c.files, \"file\")})`),\n ].join(\" \");\n // tracevals in play judges each turn, which is what its row says.\n const label = (d: DomainRow): string => (d.models !== undefined ? \"judges each turn\" : STATE_LABEL[d.status]);\n const width = Math.max(14, ...report.domains.map((d) => label(d).length + 3));\n const rows = report.domains.flatMap((d) => [\n `${d.name.padEnd(11)}${label(d).padEnd(width)}${d.reason}`,\n ...(d.host ?? []).map(\n (m) =>\n `${\"\".padEnd(11)}${\"model host\".padEnd(width)}${m.model} loaded, ${plural(m.sessions, \"session\")}, ` +\n `idle ${String(Math.floor(m.idleMs / 60_000))}m`,\n ),\n ]);\n return [head, \"\", ...rows].join(\"\\n\");\n}\n\n/**\n * The plugin skill the briefing points an agent at, as `<plugin>:<skill>`.\n * `test/plugin.test.ts` checks both halves against `plugin/manni`.\n */\nexport const FIX_SKILL = \"manni:fix\";\n\n/** The set-wide checks a stop runs when a collection document changed, as the briefing names them. */\nconst PAGE_WIDE: ReadonlyArray<readonly [Domain, string]> = [[\"term\", \"the glossary\"]];\n\n/** `a`, `a or b`, `a, b or c`: a list in prose, joined by `conjunction`. */\nfunction prose(items: readonly string[], conjunction: string): string {\n return items.length <= 1\n ? (items[0] ?? \"\")\n : `${items.slice(0, -1).join(\", \")} ${conjunction} ${items.at(-1) ?? \"\"}`;\n}\n\n/** What an agent is told at the start of a session, after the table. */\nexport function agentLines(report: StatusReport): string {\n const names = prose(report.collections.map((c) => c.name), \"or\");\n const inPlay = new Set(report.domains.filter((d) => d.status === \"in-play\").map((d) => d.name));\n // A stop checks every citation whenever the tree changed: a source edit can drift any of them.\n const plus = inPlay.has(\"cite\") ? \", plus every citation\" : \"\";\n const pageWide = PAGE_WIDE.filter(([domain]) => inPlay.has(domain)).map(([, what]) => what);\n const also = pageWide.length === 0 ? \"\" : ` It checks ${prose(pageWide, \"and\")} too when you changed a page.`;\n return [\n `After you edit a file in ${names}, manni check runs on it, and errors come back to you at once.`,\n `Before you finish, manni check runs on every file you changed${plus}.${also} You get one repair pass.`,\n `The ${FIX_SKILL} skill says how to repair each finding.`,\n ].join(\"\\n\");\n}\n\n/** A model id as Claude Code spells one, and nothing a shell would read as more. */\nconst MODEL_ID = /^[A-Za-z0-9._:/@-]+$/;\n\n/**\n * Append `export MANNI_GENERATED_BY=<model>` to `$CLAUDE_ENV_FILE`, so every\n * command the session runs records which model wrote what. Only when the\n * envelope names the model, the file is offered, and nobody set the variable.\n */\nexport function exportGeneratedBy(envelope: Envelope, env: NodeJS.ProcessEnv = process.env): boolean {\n const file = env.CLAUDE_ENV_FILE;\n // A context-window suffix such as `[1m]` is a session setting, not the model.\n const model = envelope.model?.replace(/\\[[^\\]]*\\]$/, \"\");\n if (model === undefined || !MODEL_ID.test(model)) return false;\n if (file === undefined || file === \"\" || env.MANNI_GENERATED_BY !== undefined) return false;\n const existing = existsSync(file) ? readFileSync(file, \"utf8\") : \"\";\n const lead = existing === \"\" || existing.endsWith(\"\\n\") ? \"\" : \"\\n\";\n appendFileSync(file, `${lead}export MANNI_GENERATED_BY=${model}\\n`, \"utf8\");\n return true;\n}\n"],"mappings":"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","names":["resolve","record","resolve","resolve","run","resolve","extname","resolve","extname","resolve","resolve","run"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/term/cli.ts","../src/term/core/writers/documents.ts","../src/term/core/writers/page.ts","../src/term/core/writers/render-util.ts","../src/term/core/writers/csv.ts","../src/term/core/writers/json.ts","../src/term/core/writers/skos.ts","../src/term/core/writers/tbx.ts","../src/term/core/writers/vale.ts","../src/term/core/writers/interchange.ts","../src/term/core/writers/index.ts","../src/term/commands/formats.ts","../src/term/commands/get.ts","../src/term/core/lint.ts","../src/term/core/vale.ts","../src/term/commands/lint.ts","../src/term/commands/write.ts","../src/term/reporters/csv.ts","../src/term/reporters/sarif.ts","../src/term/reporters/junit.ts","../src/term/commands/labels.ts"],"sourcesContent":["/**\n * The `term` domain's commander program. Mounted by `src/cli.ts` under\n * `manni term`; no entry point of its own. Grammar per proposal 0034: the verbs\n * are `list`, `get`, `check`, `lint`, `write` and `formats`, and there is no\n * default subcommand.\n *\n * Follows clig.dev as the family does: primary output to stdout, diagnostics\n * and notices to stderr, colour only on a TTY and never under\n * `NO_COLOR`/`--no-color`, exit `0` clean, `1` an error-severity finding or a\n * `--check` that found drift, `2` operational/usage.\n */\nimport { Command } from \"commander\";\nimport pkg from \"../../package.json\" with { type: \"json\" };\nimport { collect, readStdin, splitList } from \"../shared/cli-options.js\";\nimport { shouldColor } from \"../shared/color.js\";\nimport { fail } from \"../shared/run.js\";\nimport { notice } from \"../shared/warn.js\";\nimport { OMITTED_WHEN_CLEAN, STDIN_TOKEN } from \"../meta/internal.js\";\nimport { runCheck } from \"./commands/check.js\";\nimport { FINDING_FORMATS, type FindingFormat, type TermReport } from \"./commands/findings.js\";\nimport { FORMATS_FORMATS, listFormats } from \"./commands/formats.js\";\nimport { GET_FORMATS, runGet } from \"./commands/get.js\";\nimport { runLint } from \"./commands/lint.js\";\nimport { LIST_FORMATS, runList } from \"./commands/list.js\";\nimport { formatChoice, type TermCommandOptions } from \"./commands/run.js\";\nimport { runWrite, writeFormats } from \"./commands/write.js\";\nimport { renderListCsv } from \"./reporters/csv.js\";\nimport { renderFindingsGithub } from \"./reporters/github.js\";\nimport { renderFindingsJson, renderFormatsJson, renderGetJson, renderListJson } from \"./reporters/json.js\";\nimport { renderFindingsJunit } from \"./reporters/junit.js\";\nimport {\n renderFindingsPretty,\n renderFormatsPretty,\n renderGetPretty,\n renderListPretty,\n renderValeWiring,\n renderWritePretty,\n} from \"./reporters/pretty.js\";\nimport { renderFindingsSarif } from \"./reporters/sarif.js\";\nimport { registerTermLabelSource } from \"../shared/term-labels.js\";\nimport { termLabels } from \"./commands/labels.js\";\n\n// The umbrella loads this module, so under the `manni` bin `meta fill` offers\n// the termbase's labels. The `docmeta` bin never loads it, and offers none.\nregisterTermLabelSource(termLabels);\n\n/** What commander hands every verb that reads terms. */\ninterface InputCliOptions {\n as?: string;\n /** `--ext <list>`, comma-separated and given once. */\n ext?: string;\n /** `--exclude <glob>`, repeatable; commander's default value is `[]`. */\n exclude: string[];\n /** `--allow-empty`. */\n allowEmpty?: boolean;\n /** `--no-gitignore`: `false` when given. */\n gitignore: boolean;\n /** `--collection <name>`, repeatable; commander's default value is `[]`. */\n collection: string[];\n config?: string;\n /** `--no-color`: `false` when given. */\n color: boolean;\n}\n\ninterface FormatCliOptions extends InputCliOptions {\n format: string;\n}\n\ninterface CheckCliOptions extends FormatCliOptions {\n baseline?: boolean;\n}\n\ninterface WriteCliOptions extends InputCliOptions {\n format?: string;\n out?: string;\n check?: boolean;\n dryRun?: boolean;\n}\n\n/** Colour for a verb's pretty output: off under `--no-color` or `NO_COLOR`, on only for a TTY. */\nfunction colorFor(options: InputCliOptions): boolean {\n return shouldColor({ noColor: !options.color, isTTY: process.stdout.isTTY });\n}\n\n/** The core's shared options from commander's, with stdin read once when `-` is among the paths. */\nasync function coreOptions(paths: string[], options: InputCliOptions): Promise<TermCommandOptions> {\n return {\n inputs: paths,\n ...(paths.includes(STDIN_TOKEN) ? { stdin: await readStdin() } : {}),\n ...(options.as === undefined ? {} : { as: options.as }),\n ...(options.ext === undefined ? {} : { exts: splitList(options.ext) }),\n exclude: options.exclude,\n collection: options.collection,\n ...(options.allowEmpty === true ? { allowEmpty: true } : {}),\n ...(options.gitignore ? {} : { noGitignore: true }),\n ...(options.config === undefined ? {} : { configPath: options.config }),\n onNotice: notice,\n };\n}\n\n/** The shared input flags, declared once so every verb spells them alike. */\nfunction withInputs(command: Command): Command {\n return command\n .option(\"--as <format>\", \"input format for stdin (-)\")\n .option(\"--ext <list>\", \"comma-separated extensions for directory walks\")\n .option(\"--exclude <glob>\", \"glob to exclude; repeatable\", collect, [])\n .option(\"--collection <name>\", \"configured collection to read; repeatable\", collect, [])\n .option(\"--allow-empty\", \"treat a missing path, no matched files or no terms as success\")\n .option(\"--no-gitignore\", \"read files .gitignore covers\")\n .option(\"-c, --config <path>\", \"path to a manni config file\")\n .option(\"--no-color\", \"disable colored output\");\n}\n\nfunction print(text: string): void {\n process.stdout.write(`${text}\\n`);\n}\n\nfunction renderFindings(report: TermReport, format: FindingFormat, options: InputCliOptions, references: boolean): void {\n let text: string;\n switch (format) {\n case \"pretty\":\n text = renderFindingsPretty(report, { color: colorFor(options), references });\n break;\n case \"json\":\n text = renderFindingsJson(report);\n break;\n case \"github\":\n text = renderFindingsGithub(report);\n break;\n case \"sarif\":\n text = renderFindingsSarif(report, { onNotice: notice });\n break;\n case \"junit\":\n text = renderFindingsJunit(report);\n break;\n }\n if (text.length > 0 || !OMITTED_WHEN_CLEAN.has(format)) print(text);\n process.exitCode = report.summary.failed > 0 ? 1 : 0;\n}\n\nexport function buildProgram(): Command {\n const program = new Command();\n program\n .name(\"term\")\n .description(\"Check, lint and render a docset's terms and the references into them.\")\n .version(pkg.version, \"-V, --version\")\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: commander copies the exit\n // callback into each subcommand by value when the subcommand is created.\n .exitOverride();\n\n withInputs(\n program\n .command(\"list\")\n .description(\"List the resolved entries\")\n .argument(\"[paths...]\", \"files, directories, or globs to read (use - for stdin)\"),\n )\n .option(\"-f, --format <format>\", `output: ${LIST_FORMATS.join(\" | \")}`, \"pretty\")\n .addHelpText(\n \"after\",\n [\n \"\",\n \"Examples:\",\n \" manni term list # every collection\",\n \" manni term list docs/terms/ # one directory\",\n \" manni term list -f csv | head -2 # for a script\",\n ].join(\"\\n\"),\n )\n .action(async (paths: string[], options: FormatCliOptions) => {\n try {\n const format = formatChoice(options.format, LIST_FORMATS);\n const { terms } = await runList(await coreOptions(paths, options));\n print(format === \"json\" ? renderListJson(terms) : format === \"csv\" ? renderListCsv(terms) : renderListPretty(terms));\n process.exitCode = 0;\n } catch (err) {\n fail(err);\n }\n });\n\n withInputs(\n program\n .command(\"get\")\n .description(\"Show one entry\")\n .argument(\"<term>\", \"the entry's id, or its label or an alt-label in any case\")\n .argument(\"[paths...]\", \"files, directories, or globs to read (use - for stdin)\"),\n )\n .option(\"-f, --format <format>\", `output: ${GET_FORMATS.join(\" | \")}`, \"pretty\")\n .addHelpText(\n \"after\",\n [\"\", \"Examples:\", \" manni term get progressive-lens\", ' manni term get \"progressive lens\" -f json'].join(\"\\n\"),\n )\n .action(async (term: string, paths: string[], options: FormatCliOptions) => {\n try {\n const format = formatChoice(options.format, GET_FORMATS);\n const found = await runGet({ ...(await coreOptions(paths, options)), term });\n print(format === \"json\" ? renderGetJson(found) : renderGetPretty(found, { color: colorFor(options) }));\n process.exitCode = 0;\n } catch (err) {\n fail(err);\n }\n });\n\n withInputs(\n program\n .command(\"check\")\n .description(\"Check the set and every reference into it\")\n .argument(\"[paths...]\", \"files, directories, or globs to read (use - for stdin)\"),\n )\n .option(\"-f, --format <format>\", `output: ${FINDING_FORMATS.join(\" | \")}`, \"pretty\")\n .option(\"--baseline\", \"record the findings on the first run; after that, fail only on new ones\")\n .addHelpText(\n \"after\",\n [\n \"\",\n \"Examples:\",\n \" manni term check # every collection\",\n \" manni term check -f github # CI annotations\",\n \" manni term check --baseline # ramp in on an existing docset\",\n ].join(\"\\n\"),\n )\n .action(async (paths: string[], options: CheckCliOptions) => {\n try {\n const format = formatChoice(options.format, FINDING_FORMATS);\n const report = await runCheck({\n ...(await coreOptions(paths, options)),\n ...(options.baseline === true ? { baseline: true } : {}),\n });\n renderFindings(report, format, options, true);\n } catch (err) {\n fail(err);\n }\n });\n\n withInputs(\n program\n .command(\"lint\")\n .description(\"Run Vale over the definitions\")\n .argument(\"[paths...]\", \"files, directories, or globs to read (use - for stdin)\"),\n )\n .option(\"-f, --format <format>\", `output: ${FINDING_FORMATS.join(\" | \")}`, \"pretty\")\n .addHelpText(\n \"after\",\n [\"\", \"Examples:\", \" manni term lint\", \" manni term lint -f github\"].join(\"\\n\"),\n )\n .action(async (paths: string[], options: FormatCliOptions) => {\n try {\n const format = formatChoice(options.format, FINDING_FORMATS);\n const report = await runLint(await coreOptions(paths, options));\n renderFindings(report, format, options, false);\n } catch (err) {\n fail(err);\n }\n });\n\n withInputs(\n program\n .command(\"write\")\n .description(\"Write the set back, or render it elsewhere\")\n .argument(\"[paths...]\", \"files, directories, or globs to read (use - for stdin)\"),\n )\n .option(\"-f, --format <format>\", `render as: ${writeFormats().join(\" | \")} (default: each entry's own, in place)`)\n .option(\"-o, --out <path>\", \"file or directory to render into; a trailing / means a directory\")\n .option(\"--check\", \"write nothing; exit 1 when the target differs from the render\")\n .option(\"--dry-run\", \"write nothing; print what would change\")\n .addHelpText(\n \"after\",\n [\n \"\",\n \"Examples:\",\n \" manni term write # each entry back to its source\",\n \" manni term write -f json -o build/terms.json\",\n \" manni term write -f vale # into Vale's styles directory\",\n \" manni term write -f vale --check # keep the style in step\",\n ].join(\"\\n\"),\n )\n .action(async (paths: string[], options: WriteCliOptions) => {\n try {\n const report = await runWrite({\n ...(await coreOptions(paths, options)),\n ...(options.format === undefined ? {} : { format: options.format }),\n ...(options.out === undefined ? {} : { out: options.out }),\n ...(options.check === true ? { check: true } : {}),\n ...(options.dryRun === true ? { dryRun: true } : {}),\n });\n print(renderWritePretty(report));\n if (report.wiring !== undefined) process.stderr.write(`${renderValeWiring(report.wiring)}\\n`);\n process.exitCode = report.check && report.changes.length > 0 ? 1 : 0;\n } catch (err) {\n fail(err);\n }\n });\n\n program\n .command(\"formats\")\n .description(\"List the constructs read and written, per format\")\n .option(\"-f, --format <format>\", `output: ${FORMATS_FORMATS.join(\" | \")}`, \"pretty\")\n .action((options: { format: string }) => {\n try {\n const format = formatChoice(options.format, FORMATS_FORMATS);\n const rows = listFormats();\n print(format === \"json\" ? renderFormatsJson(rows) : renderFormatsPretty(rows));\n process.exitCode = 0;\n } catch (err) {\n fail(err);\n }\n });\n\n return program;\n}\n","/**\n * Writers for the seven document formats. The target's shape decides the\n * construct: a directory gets one term page per term (a DITA glossentry topic\n * for DITA), a file gets every term in the format's list construct. DocBook\n * has no one-term construct, so it is written as a file only.\n */\nimport { join } from \"node:path\";\nimport { TermError } from \"../../errors.js\";\nimport {\n TERM_FIELDS,\n type Term,\n type TermField,\n type TermRender,\n type TermShape,\n type TermTarget,\n type TermWriteFormat,\n type TermWriter,\n} from \"../../types.js\";\nimport {\n DITA_HOLDS,\n DOCBOOK_HOLDS,\n LIST_HOLDS,\n asciidocEntry,\n ditaEntry,\n docbookEntry,\n htmlDlEntry,\n markdownEntry,\n rstEntry,\n} from \"./entries.js\";\nimport { fileOf, reindent, sharedLanguage, xmlAttribute } from \"./markup.js\";\nimport { htmlPage, metadataPage, yamlFrontmatter } from \"./page.js\";\nimport { droppedFields, requireShape } from \"./render-util.js\";\n\n/** Characters no file name may hold on any platform manni runs on. */\nconst UNSAFE_NAME = /[/\\\\:*?\"<>|]/;\n\ninterface DocumentSpec {\n format: TermWriteFormat;\n extension: string;\n file: {\n holds: readonly TermField[];\n render: (terms: readonly Term[]) => string;\n /**\n * Whether the file's construct reads an entry only when it has a\n * definition. A Markdown or AsciiDoc list and a `.. glossary::` skip one\n * with none, and a `<dl>` folds its `<dt>`s into the next entry's, so a\n * term with no definition is left out rather than written unreadable.\n */\n needsDefinition: boolean;\n };\n directory?: { holds: readonly TermField[]; render: (term: Term) => string };\n}\n\nfunction pagePaths(terms: readonly Term[], target: TermTarget, extension: string): string[] {\n const seen = new Set<string>();\n return terms.map((term) => {\n if (UNSAFE_NAME.test(term.id) || term.id === \".\" || term.id === \"..\") {\n throw new TermError(`the id \"${term.id}\" cannot name a file. Give the term an id without path characters.`);\n }\n if (seen.has(term.id)) {\n throw new TermError(`two terms have the id \"${term.id}\", and a directory holds one file per id.`);\n }\n seen.add(term.id);\n return join(target.path, `${term.id}${extension}`);\n });\n}\n\nfunction documentWriter(spec: DocumentSpec): TermWriter {\n const { directory } = spec;\n return {\n format: spec.format,\n shapes: directory === undefined ? [\"file\"] : [\"file\", \"directory\"],\n holds: (shape: TermShape) => (shape === \"directory\" && directory !== undefined ? directory.holds : spec.file.holds),\n render(terms, target): TermRender {\n if (target.shape === \"directory\" && directory !== undefined) {\n const paths = pagePaths(terms, target, spec.extension);\n return {\n files: terms.map((term, i) => ({ path: paths[i] ?? \"\", content: directory.render(term) })),\n removals: [],\n dropped: droppedFields(terms, directory.holds),\n skipped: [],\n };\n }\n requireShape(spec.format, target, \"file\");\n const written = spec.file.needsDefinition ? terms.filter((t) => t.record.definition !== undefined) : terms;\n return {\n files: [{ path: target.path, content: spec.file.render(written) }],\n removals: [],\n dropped: droppedFields(written, spec.file.holds),\n skipped: terms.filter((t) => !written.includes(t)).map((t) => t.id),\n };\n },\n };\n}\n\n/** Entries at indentation zero, a blank line between them, each indented to `indent`. */\nfunction entriesBlock(entries: readonly string[], indent = \"\"): string[] {\n return entries.flatMap((entry, i) => [\n ...(i === 0 ? [] : [\"\"]),\n `${indent}${reindent(entry, indent, \"\\n\")}`,\n ]);\n}\n\n/** Every line of each entry indented, no blank line between: markup keeps its entries adjacent. */\nfunction markupBlock(entries: readonly string[], indent: string): string[] {\n return entries.map((entry) => `${indent}${reindent(entry, indent, \"\\n\")}`);\n}\n\nfunction textPage(format: string): (term: Term) => string {\n return (term) => metadataPage(format, term);\n}\n\n/** The frontmatter a many-per-file text document opens with, or none when it would be empty. */\nfunction listFrontmatter(terms: readonly Term[], type: boolean): string[] {\n const metadata: Record<string, unknown> = {};\n if (type) metadata[\"type\"] = \"term-set\";\n const language = sharedLanguage(terms);\n if (language !== undefined) metadata[\"language\"] = language;\n if (Object.keys(metadata).length === 0) return [];\n return [yamlFrontmatter(metadata).replace(/\\n$/, \"\"), \"\"];\n}\n\nfunction markdownList(terms: readonly Term[]): string {\n return fileOf([...listFrontmatter(terms, true), ...entriesBlock(terms.map((t) => markdownEntry(t.record)))]);\n}\n\nconst XML_DECLARATION = '<?xml version=\"1.0\" encoding=\"UTF-8\"?>';\n\nfunction langAttribute(language: string | undefined): string {\n return language === undefined ? \"\" : ` xml:lang=\"${xmlAttribute(language)}\"`;\n}\n\nexport const markdownWriter = documentWriter({\n format: \"markdown\",\n extension: \".md\",\n file: { holds: LIST_HOLDS, render: markdownList, needsDefinition: true },\n directory: { holds: TERM_FIELDS, render: textPage(\"markdown\") },\n});\n\nexport const mdxWriter = documentWriter({\n format: \"mdx\",\n extension: \".mdx\",\n file: { holds: LIST_HOLDS, render: markdownList, needsDefinition: true },\n directory: { holds: TERM_FIELDS, render: textPage(\"mdx\") },\n});\n\nexport const asciidocWriter = documentWriter({\n format: \"asciidoc\",\n extension: \".adoc\",\n file: {\n holds: LIST_HOLDS,\n needsDefinition: true,\n render: (terms) =>\n fileOf([...listFrontmatter(terms, false), \"[glossary]\", ...entriesBlock(terms.map((t) => asciidocEntry(t.record)))]),\n },\n directory: { holds: TERM_FIELDS, render: textPage(\"asciidoc\") },\n});\n\nexport const rstWriter = documentWriter({\n format: \"rst\",\n extension: \".rst\",\n file: {\n holds: LIST_HOLDS,\n needsDefinition: true,\n render: (terms) =>\n fileOf([\n ...listFrontmatter(terms, false),\n \".. glossary::\",\n \"\",\n ...entriesBlock(\n terms.map((t) => rstEntry(t.record)),\n \" \",\n ),\n ]),\n },\n directory: { holds: TERM_FIELDS, render: textPage(\"rst\") },\n});\n\nexport const htmlWriter = documentWriter({\n format: \"html\",\n extension: \".html\",\n file: {\n holds: LIST_HOLDS,\n needsDefinition: true,\n render: (terms) => {\n const language = sharedLanguage(terms);\n return fileOf([\n \"<!DOCTYPE html>\",\n \"<html>\",\n \" <head>\",\n \" <title>Glossary</title>\",\n ' <meta name=\"type\" content=\"term-set\">',\n ...(language === undefined ? [] : [` <meta name=\"language\" content=\"${xmlAttribute(language)}\">`]),\n \" </head>\",\n \" <body>\",\n \" <dl>\",\n ...markupBlock(terms.map(htmlDlEntry), \" \"),\n \" </dl>\",\n \" </body>\",\n \"</html>\",\n ]);\n },\n },\n directory: { holds: TERM_FIELDS, render: htmlPage },\n});\n\nexport const ditaWriter = documentWriter({\n format: \"dita\",\n extension: \".dita\",\n file: {\n holds: DITA_HOLDS,\n needsDefinition: false,\n render: (terms) =>\n fileOf([\n XML_DECLARATION,\n '<!DOCTYPE glossgroup PUBLIC \"-//OASIS//DTD DITA 2.0 Glossary Group//EN\" \"glossgroup.dtd\">',\n `<glossgroup id=\"glossary\"${langAttribute(sharedLanguage(terms))}>`,\n \" <title>Glossary</title>\",\n ...markupBlock(terms.map((t) => ditaEntry(t)), \" \"),\n \"</glossgroup>\",\n ]),\n },\n directory: {\n holds: DITA_HOLDS,\n render: (term) =>\n fileOf([\n XML_DECLARATION,\n '<!DOCTYPE glossentry PUBLIC \"-//OASIS//DTD DITA 2.0 Glossary Entry//EN\" \"glossentry.dtd\">',\n ditaEntry(term, term.language),\n ]),\n },\n});\n\nexport const docbookWriter = documentWriter({\n format: \"docbook\",\n extension: \".xml\",\n file: {\n holds: DOCBOOK_HOLDS,\n needsDefinition: false,\n render: (terms) =>\n fileOf([\n XML_DECLARATION,\n `<glossary xmlns=\"http://docbook.org/ns/docbook\" version=\"5.0\"${langAttribute(sharedLanguage(terms))}>`,\n \" <title>Glossary</title>\",\n ...markupBlock(terms.map(docbookEntry), \" \"),\n \"</glossary>\",\n ]),\n },\n});\n\nexport const DOCUMENT_WRITERS: readonly TermWriter[] = [\n markdownWriter,\n mdxWriter,\n asciidocWriter,\n rstWriter,\n htmlWriter,\n ditaWriter,\n docbookWriter,\n];\n","/**\n * A term page: one term per file, its record in the file's metadata channel\n * and an empty body. The metadata reads `title` (the label), `description`\n * (the abstract, when there is one), `type: term`, `id`, `language` (when the\n * term has one), then the ten fields in the vocabulary's order.\n */\nimport { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport { extractorByName } from \"../../../meta/internal.js\";\nimport { TermError } from \"../../errors.js\";\nimport { TERM_FIELDS, type Term } from \"../../types.js\";\nimport { fileOf, xmlAttribute, xmlText } from \"./markup.js\";\n\nexport function pageMetadata(term: Term): Record<string, unknown> {\n const { record } = term;\n const metadata: Record<string, unknown> = { title: record.label };\n if (record.abstract !== undefined) metadata[\"description\"] = record.abstract;\n metadata[\"type\"] = \"term\";\n metadata[\"id\"] = term.id;\n if (term.language !== undefined) metadata[\"language\"] = term.language;\n for (const field of TERM_FIELDS) {\n const value = record[field];\n if (value !== undefined) metadata[field] = value;\n }\n return metadata;\n}\n\n/**\n * A Markdown, MDX, AsciiDoc or reStructuredText term page: a fenced YAML block\n * and no body. The block is written by the format's own extractor, the one an\n * in-place write goes through, so a render and a write-back agree on how a\n * value is spelled.\n */\nexport function metadataPage(format: string, term: Term): string {\n const apply = extractorByName(format)?.apply;\n if (apply === undefined) throw new TermError(`manni cannot write ${format} metadata.`);\n return apply(\"---\\n---\\n\", pageMetadata(term));\n}\n\n/** A fenced YAML block, which Markdown, MDX, AsciiDoc and reStructuredText all read. */\nexport function yamlFrontmatter(metadata: Record<string, unknown>): string {\n return `---\\n${stringifyYaml(metadata, { lineWidth: 0 })}---\\n`;\n}\n\n/**\n * A `<meta content>` value as the HTML extractor reads it back: the value is\n * parsed as a YAML scalar, so a string that would parse as anything else, and\n * every list, is written as JSON, which is YAML and stays on one line.\n */\nfunction metaContent(value: unknown): string {\n if (typeof value === \"string\" && !value.includes(\"\\n\")) {\n try {\n if (parseYaml(value) === value) return value;\n } catch {\n // Not plain YAML: JSON below.\n }\n }\n return JSON.stringify(value);\n}\n\nexport function htmlPage(term: Term): string {\n const metadata = pageMetadata(term);\n const metas = Object.entries(metadata)\n .filter(([key]) => key !== \"title\")\n .map(([key, value]) => ` <meta name=\"${xmlAttribute(key)}\" content=\"${xmlAttribute(metaContent(value))}\">`);\n return fileOf([\n \"<!DOCTYPE html>\",\n \"<html>\",\n \" <head>\",\n ` <title>${xmlText(term.record.label)}</title>`,\n ...metas,\n \" </head>\",\n \" <body></body>\",\n \"</html>\",\n ]);\n}\n","/** What every interchange writer shares: the dropped-field report and the shape guard. */\nimport { TermError } from \"../../errors.js\";\nimport {\n TERM_FIELDS,\n type DroppedField,\n type Term,\n type TermField,\n type TermShape,\n type TermTarget,\n type TermWriteFormat,\n} from \"../../types.js\";\n\n/** The language a term without one is written as. */\nexport const DEFAULT_LANGUAGE = \"en\";\n\n/** One entry per term per field the term carries and `held` does not include, in term then field order. */\nexport function droppedFields(terms: readonly Term[], held: readonly TermField[]): DroppedField[] {\n const dropped: DroppedField[] = [];\n for (const term of terms) {\n for (const field of TERM_FIELDS) {\n if (term.record[field] !== undefined && !held.includes(field)) dropped.push({ id: term.id, field });\n }\n }\n return dropped;\n}\n\n/** Throws when a writer is asked for a shape it does not render. The command checks `shapes` first; this is the backstop. */\nexport function requireShape(format: TermWriteFormat, target: TermTarget, shape: TermShape): void {\n if (target.shape === shape) return;\n throw new TermError(\n shape === \"file\"\n ? `-f ${format} writes one file, not a directory. Pass -o <file>.`\n : `-f ${format} writes a styles directory, not a file. Pass -o <styles directory>.`,\n );\n}\n","/**\n * `term write -f csv`: one row per term, for a translation or terminology\n * system to import. The headers describe themselves, so a system maps columns\n * by name: `ID`, then six columns per language the set holds, then the four\n * language-neutral relation columns.\n */\nimport { TERM_FIELDS, type Term, type TermField, type TermShape, type TermWriter } from \"../../types.js\";\nimport { DEFAULT_LANGUAGE, droppedFields, requireShape } from \"./render-util.js\";\n\n/** The per-language columns, in order, with their header names. */\nconst LANGUAGE_COLUMNS: readonly (readonly [TermField, string])[] = [\n [\"label\", \"Term\"],\n [\"definition\", \"Definition\"],\n [\"abstract\", \"Abstract\"],\n [\"alt-labels\", \"Alt labels\"],\n [\"hidden-labels\", \"Hidden labels\"],\n [\"scope-note\", \"Scope note\"],\n];\n\n/** The columns every language shares: they name other terms, not words in a language. */\nconst NEUTRAL_COLUMNS: readonly (readonly [TermField, string])[] = [\n [\"broader\", \"Broader\"],\n [\"narrower\", \"Narrower\"],\n [\"related-terms\", \"Related terms\"],\n [\"see\", \"See\"],\n];\n\n/**\n * The one separator a list field is joined with inside its cell. A value that\n * itself contains ` | ` cannot be split back apart; that is the price of one\n * cell per field, which is what a translation system imports.\n */\nconst LIST_SEPARATOR = \" | \";\n\n/** RFC 4180 quoting: a cell holding a quote, comma or line break is quoted, with quotes doubled. */\nfunction cell(value: string): string {\n return /[\",\\r\\n]/.test(value) ? `\"${value.replaceAll('\"', '\"\"')}\"` : value;\n}\n\nfunction fieldText(term: Term, field: TermField): string {\n const value = term.record[field];\n if (value === undefined) return \"\";\n return typeof value === \"string\" ? value : value.join(LIST_SEPARATOR);\n}\n\nexport const csvWriter: TermWriter = {\n format: \"csv\",\n shapes: [\"file\"],\n holds: (_shape: TermShape) => TERM_FIELDS,\n render(terms, target) {\n requireShape(\"csv\", target, \"file\");\n // Languages in order of first appearance, so the columns follow the set.\n const languages: string[] = [];\n for (const term of terms) {\n const language = term.language ?? DEFAULT_LANGUAGE;\n if (!languages.includes(language)) languages.push(language);\n }\n\n const header = [\n \"ID\",\n ...languages.flatMap((language) => LANGUAGE_COLUMNS.map(([, name]) => `${name} [${language}]`)),\n ...NEUTRAL_COLUMNS.map(([, name]) => name),\n ];\n const rows = terms.map((term) => {\n const own = term.language ?? DEFAULT_LANGUAGE;\n return [\n term.id,\n ...languages.flatMap((language) =>\n LANGUAGE_COLUMNS.map(([field]) => (language === own ? fieldText(term, field) : \"\")),\n ),\n ...NEUTRAL_COLUMNS.map(([field]) => fieldText(term, field)),\n ];\n });\n\n const content = [header, ...rows].map((row) => `${row.map(cell).join(\",\")}\\n`).join(\"\");\n return {\n files: [{ path: target.path, content }],\n removals: [],\n dropped: droppedFields(terms, TERM_FIELDS),\n skipped: [],\n };\n },\n};\n","/**\n * `term write -f json`: the set as `{ \"terms\": [...] }`, one object per term\n * holding its id, its language when it has one, and every record field in the\n * vocabulary's order. It is the shape `term list -f json` prints, so it holds\n * every field.\n */\nimport { TERM_FIELDS, type TermShape, type TermWriter } from \"../../types.js\";\nimport { droppedFields, requireShape } from \"./render-util.js\";\n\nexport const jsonWriter: TermWriter = {\n format: \"json\",\n shapes: [\"file\"],\n holds: (_shape: TermShape) => TERM_FIELDS,\n render(terms, target) {\n requireShape(\"json\", target, \"file\");\n const entries = terms.map((term) => {\n const entry: Record<string, unknown> = { id: term.id };\n if (term.language !== undefined) entry[\"language\"] = term.language;\n for (const field of TERM_FIELDS) {\n const value = term.record[field];\n if (value !== undefined) entry[field] = value;\n }\n return entry;\n });\n const content = `${JSON.stringify({ terms: entries }, null, 2)}\\n`;\n return {\n files: [{ path: target.path, content }],\n removals: [],\n dropped: droppedFields(terms, TERM_FIELDS),\n skipped: [],\n };\n },\n};\n","/**\n * `term write -f skos`: the set as a SKOS concept scheme in JSON-LD. The\n * document is the scheme, and each term is a concept at `#<id>` within it.\n *\n * A relation (`broader`, `narrower`, `related-terms`) names another term by\n * label or id, and becomes a reference to that concept. A value naming no term\n * is left out: a dangling reference is `check`'s finding, not a field this\n * format cannot hold.\n */\nimport type { Term, TermField, TermShape, TermWriter } from \"../../types.js\";\nimport { droppedFields, requireShape } from \"./render-util.js\";\n\nconst HOLDS: readonly TermField[] = [\n \"label\",\n \"definition\",\n \"alt-labels\",\n \"hidden-labels\",\n \"broader\",\n \"narrower\",\n \"related-terms\",\n \"scope-note\",\n];\n\nconst CONTEXT = {\n skos: \"http://www.w3.org/2004/02/skos/core#\",\n dcterms: \"http://purl.org/dc/terms/\",\n};\n\n/** The scheme's `@id`: the document itself, which the concepts' `#<id>` fragments sit in. */\nconst SCHEME_ID = \"\";\n\ntype Literal = string | { \"@value\": string; \"@language\": string };\n\nfunction literal(term: Term, value: string): Literal {\n return term.language === undefined ? value : { \"@value\": value, \"@language\": term.language };\n}\n\n/** The term a relation value names: a label first, then an id, compared case-insensitively. Never `self`. */\nfunction resolve(terms: readonly Term[], self: Term, value: string): Term | undefined {\n const wanted = value.toLowerCase();\n const others = terms.filter((t) => t !== self);\n return (\n others.find((t) => t.record.label.toLowerCase() === wanted) ?? others.find((t) => t.id.toLowerCase() === wanted)\n );\n}\n\nfunction references(terms: readonly Term[], self: Term, values: readonly string[] | undefined): { \"@id\": string }[] {\n const ids: string[] = [];\n for (const value of values ?? []) {\n const target = resolve(terms, self, value);\n if (target !== undefined && !ids.includes(target.id)) ids.push(target.id);\n }\n return ids.map((id) => ({ \"@id\": `#${id}` }));\n}\n\nfunction concept(terms: readonly Term[], term: Term): Record<string, unknown> {\n const { record } = term;\n const node: Record<string, unknown> = {\n \"@id\": `#${term.id}`,\n \"@type\": \"skos:Concept\",\n \"skos:inScheme\": { \"@id\": SCHEME_ID },\n \"skos:prefLabel\": literal(term, record.label),\n };\n if (record[\"alt-labels\"] !== undefined) node[\"skos:altLabel\"] = record[\"alt-labels\"].map((v) => literal(term, v));\n if (record[\"hidden-labels\"] !== undefined) {\n node[\"skos:hiddenLabel\"] = record[\"hidden-labels\"].map((v) => literal(term, v));\n }\n if (record.definition !== undefined) node[\"skos:definition\"] = literal(term, record.definition);\n if (record[\"scope-note\"] !== undefined) node[\"skos:scopeNote\"] = literal(term, record[\"scope-note\"]);\n const relations = [\n [\"skos:broader\", record.broader],\n [\"skos:narrower\", record.narrower],\n [\"skos:related\", record[\"related-terms\"]],\n ] as const;\n for (const [key, values] of relations) {\n const refs = references(terms, term, values);\n if (refs.length > 0) node[key] = refs;\n }\n return node;\n}\n\nexport const skosWriter: TermWriter = {\n format: \"skos\",\n shapes: [\"file\"],\n holds: (_shape: TermShape) => HOLDS,\n render(terms, target) {\n requireShape(\"skos\", target, \"file\");\n const document = {\n \"@context\": CONTEXT,\n \"@graph\": [\n {\n \"@id\": SCHEME_ID,\n \"@type\": \"skos:ConceptScheme\",\n \"dcterms:description\": \"Generated by manni term write.\",\n },\n ...terms.map((term) => concept(terms, term)),\n ],\n };\n const content = `${JSON.stringify(document, null, 2)}\\n`;\n return {\n files: [{ path: target.path, content }],\n removals: [],\n dropped: droppedFields(terms, HOLDS),\n skipped: [],\n };\n },\n};\n","/**\n * `term write -f tbx`: the set as a TBX v2 (2008) termbase, the exchange format\n * translation memory and terminology systems import. One `<termEntry>` per\n * term, one `<langSet>` in the term's language, and one `<tig>` per\n * designation, with its administrative status: the label is preferred, an\n * alt-label admitted, a hidden-label deprecated.\n */\nimport type { Term, TermField, TermShape, TermWriter } from \"../../types.js\";\nimport { DEFAULT_LANGUAGE, droppedFields, requireShape } from \"./render-util.js\";\n\nconst HOLDS: readonly TermField[] = [\"label\", \"definition\", \"alt-labels\", \"hidden-labels\"];\n\nfunction text(value: string): string {\n return value.replaceAll(\"&\", \"&amp;\").replaceAll(\"<\", \"&lt;\").replaceAll(\">\", \"&gt;\");\n}\n\nfunction attribute(value: string): string {\n return text(value).replaceAll('\"', \"&quot;\");\n}\n\nfunction tig(designation: string, status: string): string[] {\n return [\n \" <tig>\",\n ` <term>${text(designation)}</term>`,\n ` <termNote type=\"administrativeStatus\">${status}</termNote>`,\n \" </tig>\",\n ];\n}\n\nfunction termEntry(term: Term): string[] {\n const { record } = term;\n return [\n ` <termEntry id=\"${attribute(term.id)}\">`,\n ...(record.definition === undefined\n ? []\n : [` <descrip type=\"definition\">${text(record.definition)}</descrip>`]),\n ` <langSet xml:lang=\"${attribute(term.language ?? DEFAULT_LANGUAGE)}\">`,\n ...tig(record.label, \"preferredTerm-admn-sts\"),\n ...(record[\"alt-labels\"] ?? []).flatMap((label) => tig(label, \"admittedTerm-admn-sts\")),\n ...(record[\"hidden-labels\"] ?? []).flatMap((label) => tig(label, \"deprecatedTerm-admn-sts\")),\n \" </langSet>\",\n \" </termEntry>\",\n ];\n}\n\nexport const tbxWriter: TermWriter = {\n format: \"tbx\",\n shapes: [\"file\"],\n holds: (_shape: TermShape) => HOLDS,\n render(terms, target) {\n requireShape(\"tbx\", target, \"file\");\n // The file's default language is the first term's; each langSet states its own anyway.\n const language = terms[0]?.language ?? DEFAULT_LANGUAGE;\n const lines = [\n '<?xml version=\"1.0\" encoding=\"UTF-8\"?>',\n `<martif type=\"TBX\" xml:lang=\"${attribute(language)}\">`,\n \" <martifHeader>\",\n \" <fileDesc>\",\n \" <sourceDesc>\",\n \" <p>manni term write</p>\",\n \" </sourceDesc>\",\n \" </fileDesc>\",\n \" </martifHeader>\",\n \" <text>\",\n \" <body>\",\n ...terms.flatMap(termEntry),\n \" </body>\",\n \" </text>\",\n \"</martif>\",\n ];\n const content = lines.map((line) => `${line}\\n`).join(\"\");\n return {\n files: [{ path: target.path, content }],\n removals: [],\n dropped: droppedFields(terms, HOLDS),\n skipped: [],\n };\n },\n};\n","/**\n * `term write -f vale`: a Vale style named `Terms`, written into a styles\n * directory (proposal 0052 § 6). Every rule shape here was chosen against a\n * real Vale 3.20.0 run.\n *\n * - `Terms/Casing.yml` enforces the exact form of a designation that starts\n * with a capital or a non-letter: `Kubernetes`, `K8s`, `.Net`.\n * - `Terms/Lowercase.yml` enforces an all-lowercase designation, allowing a\n * capital first letter so a sentence can start with it.\n * - `Terms/SentenceStart.yml` enforces a designation that starts lowercase and\n * holds a capital later (`iPhone`, `meta-schema URI`), allowing a capital\n * first letter the same way.\n * - `Terms/Deprecated.yml` swaps each hidden-label for its term's label.\n * - `Terms/<ACRONYM>.yml` asks for an all-caps alt-label to be spelled out on\n * first use, as `<label> (<ACRONYM>)`.\n *\n * An all-caps designation gets no casing rule: enforcing the case of `IT` fires\n * on nearly every paragraph. manni owns `Terms/`: every file opens with the\n * marker line, a file without it is someone else's and stops the write, and a\n * marked file the set no longer produces is removed.\n */\nimport { isAbsolute, join, relative, sep } from \"node:path\";\nimport { stringify } from \"yaml\";\nimport { TermError } from \"../../errors.js\";\nimport type { RenderedFile, TermField, TermShape, TermWriter } from \"../../types.js\";\nimport { droppedFields, requireShape } from \"./render-util.js\";\n\nexport const VALE_MARKER = \"# Generated by manni term write. Edit the terms, not this file.\";\nconst STYLE = \"Terms\";\nconst HOLDS: readonly TermField[] = [\"label\", \"alt-labels\", \"hidden-labels\"];\n/** The style's own files, which an acronym file may not replace. */\nconst OWN_FILES = [\"Casing\", \"Lowercase\", \"SentenceStart\", \"Deprecated\"] as const;\n\nconst REGEX_METACHARACTERS = /[\\\\^$.|?*+()[\\]{}]/g;\n\nfunction escapeRegex(value: string): string {\n return value.replace(REGEX_METACHARACTERS, \"\\\\$&\");\n}\n\n/**\n * A swap value as Vale reads it. Vale matches the value as a pattern against\n * the text it found, so a value holding a metacharacter is escaped, and only\n * then: the `%s` in the message prints the value, so the escape shows in that\n * message (`Use 'C\\+\\+' instead of 'c++'`). An exact message is worth more for\n * the common case than for the rare one.\n */\nfunction swapValue(value: string): string {\n return value.search(REGEX_METACHARACTERS) === -1 ? value : escapeRegex(value);\n}\n\n/**\n * A YAML scalar Vale's parser reads back as the same string. YAML 1.1 rules\n * quote `yes`, `on` and friends, which a 1.1 parser would read as booleans.\n * A line break cannot sit in a one-line key, so such a string is written as a\n * JSON string, which is valid double-quoted YAML.\n */\nfunction scalar(value: string): string {\n if (/[\\r\\n]/.test(value)) return JSON.stringify(value);\n const out = stringify(value, { version: \"1.1\", lineWidth: 0 });\n return out.endsWith(\"\\n\") ? out.slice(0, -1) : out;\n}\n\n/** A YAML double-quoted scalar on one line: a raw line break would fold to a space. */\nfunction doubleQuoted(value: string): string {\n const escaped = value\n .replaceAll(\"\\\\\", \"\\\\\\\\\")\n .replaceAll('\"', '\\\\\"')\n .replaceAll(\"\\n\", \"\\\\n\")\n .replaceAll(\"\\r\", \"\\\\r\");\n return `\"${escaped}\"`;\n}\n\n/** A YAML single-quoted scalar, which keeps backslashes literal for a regex. */\nfunction singleQuoted(value: string): string {\n return `'${value.replaceAll(\"'\", \"''\").replaceAll(/[\\r\\n]+/g, \" \")}'`;\n}\n\n/** Vale formats a message with Go's `fmt`, so a literal `%` is doubled. */\nfunction messageText(value: string): string {\n return value.replaceAll(\"%\", \"%%\");\n}\n\ntype Casing = \"none\" | \"all-caps\" | \"lowercase\" | \"lowercase-initial\" | \"mixed\";\n\nfunction casingOf(value: string): Casing {\n if (!/[\\p{Lu}\\p{Ll}\\p{Lt}]/u.test(value)) return \"none\";\n const letters = value.match(/\\p{L}/gu)?.length ?? 0;\n if (letters >= 2 && !/[\\p{Ll}\\p{Lt}]/u.test(value)) return \"all-caps\";\n if (!/[\\p{Lu}\\p{Lt}]/u.test(value)) return \"lowercase\";\n // `iPhone`: a mixed designation whose first character is a lowercase letter.\n if (/^\\p{Ll}/u.test(value)) return \"lowercase-initial\";\n return \"mixed\";\n}\n\n/** `progressive lens` → `[Pp]rogressive lens`: the first letter may be a capital, to start a sentence. */\nfunction sentenceStartPattern(value: string): string {\n const [first = \"\", ...rest] = Array.from(value);\n const upper = first.toUpperCase();\n const head = upper !== first && Array.from(upper).length === 1 ? `[${upper}${first}]` : escapeRegex(first);\n return `${head}${escapeRegex(rest.join(\"\"))}`;\n}\n\n/** A swap list in insertion order. A key already present keeps its first value, as YAML allows one. */\nclass Swaps {\n private readonly entries = new Map<string, string>();\n add(key: string, value: string): void {\n if (!this.entries.has(key)) this.entries.set(key, value);\n }\n get size(): number {\n return this.entries.size;\n }\n lines(): string[] {\n return [...this.entries].map(([key, value]) => ` ${scalar(key)}: ${scalar(value)}`);\n }\n}\n\n/**\n * A swap key with its own word boundaries. Vale wraps every key in `\\b…\\b`\n * unless a rule sets `nonword`, and Go regular expressions give `\\b` ASCII\n * word semantics. So a term whose first or last character is not an ASCII word\n * character never matched: `c++` before a space, `Café` before a full stop. A\n * real Vale 3.20.0 run confirmed `c++` went unflagged. Each edge is `\\b` beside\n * an ASCII word character and `\\B` beside anything else, which is exactly\n * Vale's default for an ordinary word and the right boundary for the rest.\n */\nconst ASCII_WORD = /^[A-Za-z0-9_]$/;\n\nfunction bounded(pattern: string, text: string): string {\n const chars = Array.from(text);\n const edge = (char: string | undefined): string =>\n char !== undefined && ASCII_WORD.test(char) ? \"\\\\b\" : \"\\\\B\";\n return `${edge(chars[0])}${pattern}${edge(chars.at(-1))}`;\n}\n\nfunction substitution(message: string, level: string, options: string[], swaps: Swaps): string {\n return [\n VALE_MARKER,\n \"extends: substitution\",\n `message: ${doubleQuoted(message)}`,\n `level: ${level}`,\n \"ignorecase: true\",\n \"nonword: true\",\n ...options,\n \"swap:\",\n ...swaps.lines(),\n ]\n .map((line) => `${line}\\n`)\n .join(\"\");\n}\n\nfunction acronymRule(acronym: string, label: string): string {\n const expansion = escapeRegex(label).replaceAll(/[\\r\\n]+/g, \" \");\n return [\n VALE_MARKER,\n \"extends: conditional\",\n `message: ${doubleQuoted(messageText(`Spell out '${acronym}' on first use, as '${label} (${acronym})'.`))}`,\n \"level: warning\",\n \"ignorecase: false\",\n `first: ${singleQuoted(`\\\\b(${escapeRegex(acronym)})\\\\b`)}`,\n `second: ${singleQuoted(`(?i)${expansion} \\\\((${escapeRegex(acronym)})\\\\)`)}`,\n ]\n .map((line) => `${line}\\n`)\n .join(\"\");\n}\n\n/** An acronym as a file name: anything a path or a Vale rule name cannot carry becomes `-`. */\nfunction acronymFileName(acronym: string): string {\n return acronym.replaceAll(/[^\\p{L}\\p{N}_-]/gu, \"-\");\n}\n\nfunction firstLine(content: string): string {\n const end = content.search(/\\r?\\n/);\n return end === -1 ? content : content.slice(0, end);\n}\n\nexport const valeWriter: TermWriter = {\n format: \"vale\",\n shapes: [\"directory\"],\n holds: (_shape: TermShape) => HOLDS,\n render(terms, target, context) {\n requireShape(\"vale\", target, \"directory\");\n const termsDir = join(target.path, STYLE);\n\n // Someone else's file in Terms/ stops the write before anything is computed.\n const marked: string[] = [];\n for (const [path, content] of context.existing) {\n const rel = relative(termsDir, path);\n if (rel === \"\" || rel === \"..\" || rel.startsWith(`..${sep}`) || isAbsolute(rel)) continue;\n if (firstLine(content) !== VALE_MARKER) {\n throw new TermError(`${path} was not written by manni. Move it, or pass -o <styles directory>.`);\n }\n if (!rel.includes(sep) && !rel.includes(\"/\")) marked.push(path);\n }\n\n const casing = new Swaps();\n const lowercase = new Swaps();\n const sentenceStart = new Swaps();\n const deprecated = new Swaps();\n const acronyms: { acronym: string; name: string; content: string }[] = [];\n const labels = new Set(terms.map((t) => t.record.label));\n\n for (const term of terms) {\n const { label } = term.record;\n const labelIsAllCaps = casingOf(label) === \"all-caps\";\n for (const designation of [label, ...(term.record[\"alt-labels\"] ?? [])]) {\n const kind = casingOf(designation);\n if (kind === \"lowercase\") lowercase.add(bounded(escapeRegex(designation), designation), sentenceStartPattern(designation));\n if (kind === \"lowercase-initial\") {\n sentenceStart.add(bounded(escapeRegex(designation.toLowerCase()), designation), sentenceStartPattern(designation));\n }\n if (kind === \"mixed\") casing.add(bounded(escapeRegex(designation.toLowerCase()), designation), swapValue(designation));\n if (kind !== \"all-caps\" || designation === label || labelIsAllCaps || labels.has(designation)) continue;\n const name = acronymFileName(designation);\n const own = OWN_FILES.find((file) => file.toLowerCase() === name.toLowerCase());\n if (own !== undefined) {\n throw new TermError(`the acronym \"${designation}\" would replace Terms/${own}.yml. Rename the alt-label.`);\n }\n const taken = acronyms.find((a) => a.name.toLowerCase() === name.toLowerCase());\n // The same acronym on a second term keeps the first term's rule.\n if (taken?.acronym === designation) continue;\n if (taken !== undefined) {\n throw new TermError(\n `the acronyms \"${taken.acronym}\" and \"${designation}\" would both write Terms/${taken.name}.yml. Rename one.`,\n );\n }\n acronyms.push({ acronym: designation, name, content: acronymRule(designation, label) });\n }\n for (const hidden of term.record[\"hidden-labels\"] ?? []) {\n deprecated.add(bounded(escapeRegex(hidden), hidden), swapValue(label));\n }\n }\n\n const files: RenderedFile[] = [];\n const add = (name: string, content: string): void => {\n files.push({ path: join(termsDir, `${name}.yml`), content });\n };\n if (casing.size > 0) {\n add(\"Casing\", substitution(\"Use '%s' instead of '%s'.\", \"error\", [\"vocab: false\"], casing));\n }\n if (lowercase.size > 0) {\n add(\n \"Lowercase\",\n substitution(\"Write '%[2]s' in lowercase, except to start a sentence.\", \"error\", [\"vocab: false\"], lowercase),\n );\n }\n if (sentenceStart.size > 0) {\n // Not Casing.yml: its message prints the value, which here is a pattern.\n add(\n \"SentenceStart\",\n substitution(\n \"Write '%[2]s' as the term list spells it, with a capital only to start a sentence.\",\n \"error\",\n [\"vocab: false\"],\n sentenceStart,\n ),\n );\n }\n if (deprecated.size > 0) {\n add(\"Deprecated\", substitution(\"Use '%s' instead of '%s'.\", \"warning\", [\"matchcase: true\"], deprecated));\n }\n for (const acronym of acronyms) add(acronym.name, acronym.content);\n\n // Compared without case: on a case-insensitive disk `pal.yml` and `PAL.yml`\n // are one file, and removing the old name would delete the new one.\n const produced = new Set(files.map((f) => relative(termsDir, f.path).toLowerCase()));\n const removals = marked.filter((path) => !produced.has(relative(termsDir, path).toLowerCase())).sort();\n\n return { files, removals, dropped: droppedFields(terms, HOLDS), skipped: [] };\n },\n};\n","/**\n * Writers for the formats a termbase leaves the docs in: TBX, SKOS, CSV, JSON,\n * and a Vale style.\n */\nimport type { TermWriter } from \"../../types.js\";\nimport { csvWriter } from \"./csv.js\";\nimport { jsonWriter } from \"./json.js\";\nimport { skosWriter } from \"./skos.js\";\nimport { tbxWriter } from \"./tbx.js\";\nimport { valeWriter } from \"./vale.js\";\n\nexport const INTERCHANGE_WRITERS: readonly TermWriter[] = [tbxWriter, skosWriter, csvWriter, jsonWriter, valeWriter];\n","/** Every term writer, one per `term write -f` value. */\nimport type { TermWriteFormat, TermWriter } from \"../../types.js\";\nimport { DOCUMENT_WRITERS } from \"./documents.js\";\nimport { INTERCHANGE_WRITERS } from \"./interchange.js\";\n\nexport const TERM_WRITERS: readonly TermWriter[] = [...DOCUMENT_WRITERS, ...INTERCHANGE_WRITERS];\n\nexport function writerFor(\n format: TermWriteFormat,\n writers: readonly TermWriter[] = TERM_WRITERS,\n): TermWriter | undefined {\n return writers.find((writer) => writer.format === format);\n}\n","/**\n * `manni term formats`: what is read and written, from the registries alone. A\n * construct a reader does not exist for is not listed, and `write` appears\n * only where a reader has `apply` or a registered document writer renders the\n * construct, so the listing never promises more than the build does.\n */\nimport { TERM_READERS } from \"../core/readers/index.js\";\nimport { TERM_WRITERS } from \"../core/writers/index.js\";\nimport type { TermConstruct, TermReader, TermShape, TermWriteFormat, TermWriter } from \"../types.js\";\n\nexport const FORMATS_FORMATS = [\"pretty\", \"json\"] as const;\nexport type FormatsFormat = (typeof FORMATS_FORMATS)[number];\n\nexport interface FormatRow {\n /** The input format a reader reads (`markdown`, `xml`), or a `write -f` value. */\n format: string;\n /** The construct, for a reader's row. */\n construct?: TermConstruct;\n /** What the construct or the render is called: `definition list`, `TBX v2 Core`; empty for none. */\n label: string;\n read: boolean;\n write: boolean;\n}\n\n/**\n * The construct each document `-f` value renders, per shape, and the input\n * format that construct is read back from. A directory holds one entry per\n * file, which is a page; a file holds them all, in the format's list construct.\n */\nexport const DOCUMENT_RENDERS: Partial<\n Record<TermWriteFormat, { input: string; shapes: Partial<Record<TermShape, TermConstruct>> }>\n> = {\n markdown: { input: \"markdown\", shapes: { directory: \"page\", file: \"markdown-deflist\" } },\n mdx: { input: \"mdx\", shapes: { directory: \"page\", file: \"markdown-deflist\" } },\n asciidoc: { input: \"asciidoc\", shapes: { directory: \"page\", file: \"asciidoc-glossary\" } },\n rst: { input: \"rst\", shapes: { directory: \"page\", file: \"rst-glossary\" } },\n html: { input: \"html\", shapes: { directory: \"page\", file: \"html-dl\" } },\n dita: { input: \"xml\", shapes: { directory: \"dita-glossentry\", file: \"dita-glossgroup\" } },\n docbook: { input: \"xml\", shapes: { file: \"docbook-glossary\" } },\n};\n\n/** What `formats` calls an interchange render. */\nconst INTERCHANGE_LABELS: Partial<Record<TermWriteFormat, string>> = {\n tbx: \"TBX v2 Core\",\n skos: \"JSON-LD\",\n vale: \"style\",\n};\n\nfunction rendered(writers: readonly TermWriter[], format: string, construct: TermConstruct): boolean {\n return writers.some((writer) => {\n const render = DOCUMENT_RENDERS[writer.format];\n if (render?.input !== format) return false;\n return writer.shapes.some((shape) => render.shapes[shape] === construct);\n });\n}\n\nexport function listFormats(\n opts: { readers?: readonly TermReader[]; writers?: readonly TermWriter[] } = {},\n): FormatRow[] {\n const readers = opts.readers ?? TERM_READERS;\n const writers = opts.writers ?? TERM_WRITERS;\n\n // Input formats in order of first appearance, then each format's readers in registry order.\n const formats: string[] = [];\n for (const reader of readers) {\n for (const format of reader.formats) if (!formats.includes(format)) formats.push(format);\n }\n const rows: FormatRow[] = [];\n for (const format of formats) {\n for (const reader of readers.filter((r) => r.formats.includes(format))) {\n rows.push({\n format,\n construct: reader.construct,\n label: reader.label,\n read: true,\n write: reader.apply !== undefined || rendered(writers, format, reader.construct),\n });\n }\n }\n for (const writer of writers) {\n if (DOCUMENT_RENDERS[writer.format] !== undefined) continue;\n rows.push({ format: writer.format, label: INTERCHANGE_LABELS[writer.format] ?? \"\", read: false, write: true });\n }\n return rows;\n}\n","/**\n * `manni term get <term>`: one entry, matched by id, else by label without\n * case, else by alt-label without case. A miss is a usage error that says how\n * big the set is and, when some id or label is a few edits away, which one,\n * because a typo is the likely cause.\n */\nimport { TermError } from \"../errors.js\";\nimport type { Term } from \"../types.js\";\nimport { loadTerms, plural, type TermCommandOptions } from \"./run.js\";\n\nexport const GET_FORMATS = [\"pretty\", \"json\"] as const;\nexport type GetFormat = (typeof GET_FORMATS)[number];\n\nexport interface GetOptions extends TermCommandOptions {\n /** The `<term>` argument: an id, a label or an alt-label. */\n term: string;\n}\n\n/**\n * The entry `query` names: an exact id first, then a label compared without\n * case, then an alt-label compared without case. Each pass takes the first\n * entry in set order.\n */\nexport function findTerm(terms: readonly Term[], query: string): Term | undefined {\n const folded = query.toLowerCase();\n return (\n terms.find((t) => t.id === query) ??\n terms.find((t) => t.record.label.toLowerCase() === folded) ??\n terms.find((t) => (t.record[\"alt-labels\"] ?? []).some((alt) => alt.toLowerCase() === folded))\n );\n}\n\n/** Levenshtein distance. */\nfunction editDistance(a: string, b: string): number {\n let prev = Array.from({ length: b.length + 1 }, (_, i) => i);\n for (let i = 1; i <= a.length; i++) {\n const row = [i];\n for (let j = 1; j <= b.length; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n row.push(Math.min((row[j - 1] ?? 0) + 1, (prev[j] ?? 0) + 1, (prev[j - 1] ?? 0) + cost));\n }\n prev = row;\n }\n return prev[b.length] ?? 0;\n}\n\n/**\n * The name nearest `query` by edit distance, the first on a tie, when it is\n * within `max(2, floor(query.length / 3))` edits; `undefined` otherwise. A\n * name further off than that is not a typo of `query`, and suggesting it\n * points at an unrelated entry.\n */\nexport function closestName(query: string, names: readonly string[]): string | undefined {\n const limit = Math.max(2, Math.floor(query.length / 3));\n let best: string | undefined;\n let bestDistance = Number.POSITIVE_INFINITY;\n for (const name of names) {\n const distance = editDistance(query, name);\n if (distance < bestDistance) {\n best = name;\n bestDistance = distance;\n }\n }\n return bestDistance <= limit ? best : undefined;\n}\n\nexport async function runGet(opts: GetOptions): Promise<Term> {\n const { set } = await loadTerms(opts);\n const found = findTerm(set.terms, opts.term);\n if (found !== undefined) return found;\n const nearest = closestName(\n opts.term,\n set.terms.flatMap((t) => [t.id, t.record.label]),\n );\n const hint = nearest === undefined ? \".\" : `; did you mean \"${nearest}\"?`;\n throw new TermError(`no term \"${opts.term}\". ${plural(set.terms.length, \"term\")}${hint}`);\n}\n","/**\n * `term lint`: the definitions against the house voice (proposal 0052 § 6).\n *\n * Each entry's `definition`, `abstract` and `scope-note` is written to a\n * temporary `<id>.<field>.md`, and Vale runs once over the directory holding\n * them. The file name is the voice switch: a `[*.definition.md]` section in the\n * user's own `.vale.ini` applies to definitions alone. One file per field keeps\n * a document-wide rule from reaching across unrelated entries.\n *\n * Vale is given the directory rather than the file list so a large set does not\n * run into the platform's command-line length limit; the directory holds only\n * the files written here.\n */\nimport { mkdtemp, rm, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { Term, TermField, TermFinding, TermSet } from \"../types.js\";\nimport { foldValeSeverity, proseRuleId } from \"./severity.js\";\nimport { runValeJson } from \"./vale.js\";\n\nexport interface LintTermSetOptions {\n /** Absolute; from `valeConfigPath(run.tools, run.configDir)`. */\n valeConfig?: string;\n /** Where Vale runs, and so where it looks for its own config. */\n cwd?: string;\n runVale?: typeof runValeJson;\n}\n\n/** The prose fields `lint` reads, in the order it writes them. */\nexport const PROSE_FIELDS = [\"definition\", \"abstract\", \"scope-note\"] as const satisfies readonly TermField[];\ntype ProseField = (typeof PROSE_FIELDS)[number];\n\ninterface Written {\n term: Term;\n field: ProseField;\n value: string;\n}\n\n/** A term id made safe as a file name component. */\nfunction fileStem(id: string): string {\n const safe = id.replace(/[^A-Za-z0-9._-]/g, \"_\");\n return safe === \"\" ? \"_\" : safe;\n}\n\n/** The last component of a path printed by Vale, whichever separator it used. */\nfunction baseName(path: string): string {\n const parts = path.split(/[\\\\/]/);\n return parts[parts.length - 1] ?? path;\n}\n\n/** The source line a line of a field's prose sits on. */\nfunction sourceLine(written: Written, proseLine: number): number {\n const { term, field, value } = written;\n const fieldLine = term.location.fieldLines[field] ?? term.location.line;\n if (!value.includes(\"\\n\")) return fieldLine;\n const { construct } = term.location;\n return construct === \"page\" || construct === \"manifest\" ? fieldLine + proseLine : fieldLine + proseLine - 1;\n}\n\nfunction compareFindings(a: TermFinding, b: TermFinding): number {\n if (a.file !== b.file) return a.file < b.file ? -1 : 1;\n const lineA = a.line ?? 0;\n const lineB = b.line ?? 0;\n if (lineA !== lineB) return lineA - lineB;\n if (a.ruleId !== b.ruleId) return a.ruleId < b.ruleId ? -1 : 1;\n if (a.message !== b.message) return a.message < b.message ? -1 : 1;\n return 0;\n}\n\nexport async function lintTermSet(set: TermSet, opts: LintTermSetOptions = {}): Promise<TermFinding[]> {\n // Keyed by lowercased file name: Vale may print the path in another case, and\n // a case-insensitive file system would fold `API` and `api` onto one file.\n const byName = new Map<string, Written>();\n const files: { name: string; content: string }[] = [];\n const stemCount = new Map<string, number>();\n\n for (const term of set.terms) {\n const fields = PROSE_FIELDS.filter((field) => term.record[field] !== undefined);\n if (fields.length === 0) continue;\n const stem = fileStem(term.id);\n const seen = (stemCount.get(stem.toLowerCase()) ?? 0) + 1;\n stemCount.set(stem.toLowerCase(), seen);\n // A repeated id is suffixed before the field, so `*.definition.md` still matches it.\n const prefix = seen === 1 ? stem : `${stem}.${String(seen)}`;\n for (const field of fields) {\n const value = term.record[field];\n if (value === undefined) continue;\n const name = `${prefix}.${field}.md`;\n byName.set(name.toLowerCase(), { term, field, value });\n files.push({ name, content: `${value}\\n` });\n }\n }\n\n if (files.length === 0) return [];\n\n const runVale = opts.runVale ?? runValeJson;\n const dir = await mkdtemp(join(tmpdir(), \"manni-term-lint-\"));\n try {\n for (const file of files) await writeFile(join(dir, file.name), file.content, \"utf8\");\n const alerts = await runVale([dir], { config: opts.valeConfig, cwd: opts.cwd });\n\n const findings: TermFinding[] = [];\n for (const [path, list] of Object.entries(alerts)) {\n const written = byName.get(baseName(path).toLowerCase());\n if (written === undefined) continue;\n for (const alert of list) {\n findings.push({\n ruleId: proseRuleId(alert.Check),\n severity: foldValeSeverity(alert.Severity),\n message: alert.Message,\n file: written.term.location.file,\n line: sourceLine(written, alert.Line),\n id: written.term.id,\n tool: \"vale\",\n check: alert.Check,\n toolSeverity: alert.Severity,\n field: written.field,\n });\n }\n }\n return findings.sort(compareFindings);\n } finally {\n await rm(dir, { recursive: true, force: true });\n }\n}\n","/**\n * The Vale process seam (proposal 0052 § 6). The only module that starts Vale.\n *\n * manni asks Vale rather than reading its files: `vale --output=JSON` for the\n * alerts, `vale ls-config` for the resolved configuration. Vale is started with\n * an argv, never a shell string, and what it prints is validated here, because\n * it crosses a process boundary.\n */\nimport { execFile } from \"node:child_process\";\nimport type { ValeSeverity } from \"../types.js\";\nimport { TermError } from \"../errors.js\";\n\n/** One alert, as `vale --output=JSON` prints it, trimmed to the fields manni reads. */\nexport interface ValeAlert {\n Check: string;\n Message: string;\n Line: number;\n Span: [number, number];\n Severity: ValeSeverity;\n}\n\n/** `vale --output=JSON`: the path Vale printed for each file, to its alerts. */\nexport type ValeAlerts = Record<string, ValeAlert[]>;\n\n/** What `vale ls-config` resolved. */\nexport interface ValeResolvedConfig {\n /** The project's styles directory: the last entry of Vale's `Paths`. */\n stylesPath: string;\n /** The config file Vale resolved. */\n rootIni: string;\n /** Each section glob to its `BasedOnStyles`. */\n baseStyles: Record<string, string[]>;\n}\n\nexport interface ValeProcessResult {\n /** Vale's exit code; `null` when a signal ended it. */\n code: number | null;\n /**\n * The signal that ended it, when one did, and `code` is then null. Optional\n * because absent means what it says: the run was not killed.\n */\n signal?: string | null;\n stdout: string;\n stderr: string;\n}\n\n/**\n * Start `vale` with `args` and wait for it. Resolves for any exit; rejects when\n * the process could not start, with an error whose `code` is `ENOENT` when\n * there is no `vale` on PATH. Tests inject a stub.\n */\nexport type ValeSpawn = (args: string[], opts: { cwd?: string }) => Promise<ValeProcessResult>;\n\nconst MAX_BUFFER = 64 * 1024 * 1024;\n\nconst SEVERITIES: readonly ValeSeverity[] = [\"error\", \"warning\", \"suggestion\"];\n\nexport const spawnVale: ValeSpawn = (args, opts) =>\n new Promise((settle, reject) => {\n execFile(\n \"vale\",\n args,\n { cwd: opts.cwd, windowsHide: true, maxBuffer: MAX_BUFFER, encoding: \"utf8\" },\n (error, stdout, stderr) => {\n if (!error) {\n settle({ code: 0, stdout, stderr });\n return;\n }\n if (typeof error.code === \"number\") {\n settle({ code: error.code, stdout, stderr });\n return;\n }\n // Killed by a signal. Node reports the exit code as **null** here,\n // not as undefined, so testing for undefined never matched: a killed\n // run fell through to `reject` and surfaced as though Vale could not\n // start. Settling instead keeps whatever Vale managed to write, which\n // is the part a reader can act on.\n if (error.code == null && typeof error.signal === \"string\") {\n settle({ code: null, signal: error.signal, stdout, stderr });\n return;\n }\n // A start failure (ENOENT) or an output over the buffer.\n const failure: Error = error;\n reject(failure);\n },\n );\n });\n\nfunction isEnoent(err: unknown): boolean {\n return typeof err === \"object\" && err !== null && \"code\" in err && err.code === \"ENOENT\";\n}\n\nasync function start(\n spawn: ValeSpawn,\n args: string[],\n cwd: string | undefined,\n missing: string,\n): Promise<ValeProcessResult> {\n try {\n return await spawn(args, { cwd });\n } catch (err) {\n if (isEnoent(err)) throw new TermError(missing);\n throw err;\n }\n}\n\nfunction isMapping(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/**\n * Vale's own account of a failure. Under `--output=JSON` it prints its error\n * as a JSON object whose `Text` is the message; otherwise the stderr is the\n * message.\n */\nfunction failureText(result: ValeProcessResult): string {\n const stderr = result.stderr.trim();\n try {\n const parsed: unknown = JSON.parse(stderr);\n if (isMapping(parsed) && typeof parsed[\"Text\"] === \"string\") return parsed[\"Text\"].trim();\n } catch {\n // Not JSON: the stderr is the message.\n }\n if (stderr !== \"\") return stderr;\n // Vale said nothing, so the ending is the only account there is. A signal\n // leaves no message behind, and \"exit code null\" names nothing a reader can\n // act on.\n if (result.signal != null) return `killed by ${result.signal}`;\n return `exit code ${String(result.code)}`;\n}\n\nfunction parseJson(stdout: string, what: string): unknown {\n try {\n return JSON.parse(stdout) as unknown;\n } catch {\n throw new TermError(`vale printed ${what} that is not JSON: ${stdout.trim().slice(0, 200)}`);\n }\n}\n\nfunction parseAlert(raw: unknown, path: string): ValeAlert {\n const unreadable = (): TermError =>\n new TermError(`vale printed an alert for ${path} that manni cannot read: ${JSON.stringify(raw)}`);\n if (!isMapping(raw)) throw unreadable();\n const { Check, Message, Line, Span, Severity } = raw;\n if (typeof Check !== \"string\" || typeof Message !== \"string\" || typeof Line !== \"number\") throw unreadable();\n if (!Array.isArray(Span) || Span.length !== 2) throw unreadable();\n const span: unknown[] = Span;\n const [from, to] = span;\n if (typeof from !== \"number\" || typeof to !== \"number\") throw unreadable();\n const severity = SEVERITIES.find((s) => s === Severity);\n if (severity === undefined) throw unreadable();\n return { Check, Message, Line, Span: [from, to], Severity: severity };\n}\n\nfunction parseAlerts(stdout: string): ValeAlerts {\n const parsed = parseJson(stdout, \"alerts\");\n if (!isMapping(parsed)) throw new TermError(\"vale printed alerts that are not a JSON object.\");\n const alerts: ValeAlerts = {};\n for (const [path, list] of Object.entries(parsed)) {\n if (!Array.isArray(list)) throw new TermError(`vale printed alerts for ${path} that are not a list.`);\n alerts[path] = list.map((raw: unknown) => parseAlert(raw, path));\n }\n return alerts;\n}\n\n/**\n * `vale --output=JSON [--config <config>] <files...>`. Exit 0 (no error-level\n * alert) and exit 1 (at least one) both carry alerts; any other exit means\n * Vale could not run.\n */\nexport async function runValeJson(\n files: string[],\n opts: { config?: string; cwd?: string },\n spawn: ValeSpawn = spawnVale,\n): Promise<ValeAlerts> {\n const args = [\"--output=JSON\", ...(opts.config === undefined ? [] : [\"--config\", opts.config]), ...files];\n const result = await start(spawn, args, opts.cwd, \"vale is not on PATH. Install Vale to lint definitions.\");\n if (result.code !== 0 && result.code !== 1) {\n throw new TermError(`vale could not lint definitions: ${failureText(result)}`);\n }\n return parseAlerts(result.stdout);\n}\n\nconst NO_CONFIG = /no config file found|\\.vale\\.ini not found/i;\n\nfunction stringList(value: unknown): string[] | undefined {\n if (!Array.isArray(value)) return undefined;\n const list: string[] = [];\n for (const item of value as unknown[]) {\n if (typeof item !== \"string\") return undefined;\n list.push(item);\n }\n return list;\n}\n\n/**\n * `vale [--config <config>] ls-config`, run in `cwd`. `null` when Vale finds no\n * config file, which is a state the caller reports, not a failure to run.\n */\nexport async function valeLsConfig(\n opts: { config?: string; cwd: string },\n spawn: ValeSpawn = spawnVale,\n): Promise<ValeResolvedConfig | null> {\n const args = [...(opts.config === undefined ? [] : [\"--config\", opts.config]), \"ls-config\"];\n const result = await start(\n spawn,\n args,\n opts.cwd,\n \"vale is not on PATH. Install Vale, or pass -o <styles directory>.\",\n );\n if (result.code !== 0) {\n const text = failureText(result);\n if (NO_CONFIG.test(text)) return null;\n throw new TermError(`vale could not resolve its configuration: ${text}`);\n }\n\n const parsed = parseJson(result.stdout, \"a configuration\");\n if (!isMapping(parsed)) throw new TermError(\"vale printed a configuration that is not a JSON object.\");\n\n const paths = stringList(parsed[\"Paths\"]);\n const stylesPath = paths?.[paths.length - 1];\n if (stylesPath === undefined || stylesPath === \"\") {\n throw new TermError(\n \"vale's configuration names no styles directory. Set StylesPath in it, or pass -o <styles directory>.\",\n );\n }\n\n // Under --config, Vale 3.20.0 leaves RootINI empty and names the file in ConfigFiles.\n const root = parsed[\"RootINI\"];\n const configFiles = stringList(parsed[\"ConfigFiles\"]);\n const rootIni =\n typeof root === \"string\" && root !== \"\" ? root : (configFiles?.[configFiles.length - 1] ?? opts.config ?? \"\");\n\n const baseStyles: Record<string, string[]> = {};\n const sections = parsed[\"SBaseStyles\"];\n if (sections !== null && sections !== undefined) {\n if (!isMapping(sections)) throw new TermError(\"vale printed SBaseStyles that is not a JSON object.\");\n for (const [glob, styles] of Object.entries(sections)) {\n const list = stringList(styles);\n if (list === undefined) throw new TermError(`vale printed styles for ${glob} that are not a list of names.`);\n baseStyles[glob] = list;\n }\n }\n\n return { stylesPath, rootIni, baseStyles };\n}\n","/**\n * `manni term lint`: each entry's prose through Vale (proposal 0052 § 6). The\n * process seam is `lintTermSet`'s; this core resolves Vale's config from the\n * family `tools:` and shapes the report `check` shares.\n */\nimport { lintTermSet, type LintTermSetOptions } from \"../core/lint.js\";\nimport { summarize, toResults, reportedFindings, type TermReport } from \"./findings.js\";\nimport { loadTerms, valeConfigFor, type TermCommandOptions } from \"./run.js\";\n\nexport interface LintOptions extends TermCommandOptions {\n /** The Vale seam. Tests hand in a stub. */\n runVale?: LintTermSetOptions[\"runVale\"];\n}\n\nexport async function runLint(opts: LintOptions): Promise<TermReport> {\n const { cwd, run, set } = await loadTerms(opts);\n const valeConfig = valeConfigFor(run);\n const findings = await lintTermSet(set, {\n cwd,\n ...(valeConfig === undefined ? {} : { valeConfig }),\n ...(opts.runVale === undefined ? {} : { runVale: opts.runVale }),\n });\n const { results, origin } = toResults(set, findings);\n return {\n findings: reportedFindings(results, origin),\n results,\n summary: summarize(results),\n frame: { cwd, base: run.configDir ?? cwd, runBase: run.base },\n terms: set.terms.length,\n references: set.references.length,\n found: findings.length,\n cwd,\n };\n}\n","/**\n * `manni term write` (proposal 0052 § 5): the set written back to its sources,\n * or rendered somewhere new.\n *\n * With no `-f`, each file's entries go back through the reader that read them,\n * construct by construct. With `-f`, the registered writer renders the whole\n * set into `-o`, whose spelling decides the shape: a trailing separator, an\n * existing directory, or the Vale style make it a directory; anything else is\n * a file. `-f vale` without `-o` asks Vale where its styles live.\n *\n * Writers are pure, so `--check` and `--dry-run` run the same render a write\n * does and differ only in what happens to the result.\n */\nimport { existsSync, statSync } from \"node:fs\";\nimport { lstat, mkdir, readdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, extname, join, resolve } from \"node:path\";\nimport { extractorForExtension } from \"../../meta/internal.js\";\nimport { errorMessage } from \"../../shared/errors.js\";\nimport { MANIFEST_FORMAT, extractInput } from \"../core/load-set.js\";\nimport { TERM_READERS, readerForConstruct } from \"../core/readers/index.js\";\nimport { valeLsConfig, type ValeResolvedConfig } from \"../core/vale.js\";\nimport { TERM_WRITERS } from \"../core/writers/index.js\";\nimport { TermError } from \"../errors.js\";\nimport {\n TERM_WRITE_FORMATS,\n type DroppedField,\n type RenderedFile,\n type Term,\n type TermConstruct,\n type TermInput,\n type TermReader,\n type TermShape,\n type TermTarget,\n type TermWriteFormat,\n type TermWriter,\n} from \"../types.js\";\nimport { DOCUMENT_RENDERS } from \"./formats.js\";\nimport { displayPath, formatChoice, loadTerms, valeConfigFor, type TermCommandOptions } from \"./run.js\";\n\nexport interface WriteOptions extends TermCommandOptions {\n /** `-f, --format`. Absent writes in place. */\n format?: string;\n /** `-o, --out <path>`. */\n out?: string;\n /** `--check`. */\n check?: boolean;\n /** `--dry-run`. */\n dryRun?: boolean;\n /** The writers to render with. Tests hand in their own. */\n writers?: readonly TermWriter[];\n /** `vale ls-config`. Tests hand in a stub. */\n lsConfig?: (opts: { config?: string; cwd: string }) => Promise<ValeResolvedConfig | null>;\n}\n\n/** One file the write would change, as a person in `cwd` would name it. */\nexport interface WriteChange {\n path: string;\n action: \"create\" | \"change\" | \"remove\";\n}\n\n/** The `BasedOnStyles` line the notice suggests, when no section uses `Terms`. */\nexport interface ValeWiring {\n /** The config file Vale resolved, relative to cwd. */\n rootIni: string;\n /** The section glob to add the style to: the first Vale reports, or `*.md` when it reports none. */\n section: string;\n /** The section's styles with `Terms` appended. `[\"Terms\"]` when Vale reports no section. */\n styles: string[];\n /** True when Vale reports no section with `BasedOnStyles`, so the notice says to add `section`. */\n addSection: boolean;\n}\n\n/** The section glob the notice suggests when Vale's config has none. */\nconst SUGGESTED_SECTION = \"*.md\";\n\nexport interface WriteReport {\n mode: \"in-place\" | \"render\";\n format?: TermWriteFormat;\n shape?: TermShape;\n /** `-o` as typed, or the Vale style directory; relative to cwd. */\n target?: string;\n terms: number;\n /** Files that differ from disk. Under `--check` and `--dry-run` nothing was written. */\n changes: WriteChange[];\n /** The rendered files, relative to cwd, with their content. */\n files: RenderedFile[];\n dropped: DroppedField[];\n /** What a dropped field was dropped from, and a skipped term left out of: `a definition list`, `tbx`. */\n droppedFrom?: string;\n /** Ids of the terms left out because the target construct cannot read them back, in set order. */\n skipped: string[];\n check: boolean;\n dryRun: boolean;\n wiring?: ValeWiring;\n}\n\nconst STYLE = \"Terms\";\n\n/** The registered `-f` values, in the order the reference lists them. */\nexport function writeFormats(writers: readonly TermWriter[] = TERM_WRITERS): TermWriteFormat[] {\n return TERM_WRITE_FORMATS.filter((format) => writers.some((writer) => writer.format === format));\n}\n\nfunction isDirectory(path: string): boolean {\n try {\n return statSync(path).isDirectory();\n } catch {\n return false;\n }\n}\n\n/**\n * The largest file under a render target a write reads into the render context.\n * A larger one is there as an empty string: a render never produces an empty\n * file, so it still differs, and the Vale writer refuses it as not its own.\n */\nexport const MAX_EXISTING_FILE_BYTES = 1024 * 1024;\n\n/** Every regular file under `dir`. A symlink is skipped, never followed. */\nasync function filesUnder(dir: string, into: Map<string, string>): Promise<void> {\n let entries;\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n const path = join(dir, entry.name);\n // A Dirent describes the entry itself, so a symlink is neither of these.\n if (entry.isDirectory()) await filesUnder(path, into);\n else if (entry.isFile()) {\n const { size } = await lstat(path);\n into.set(path, size > MAX_EXISTING_FILE_BYTES ? \"\" : await readFile(path, \"utf8\"));\n }\n }\n}\n\nasync function existingFor(target: TermTarget): Promise<Map<string, string>> {\n const existing = new Map<string, string>();\n if (target.shape === \"directory\") {\n await filesUnder(target.path, existing);\n } else if (existsSync(target.path) && !isDirectory(target.path)) {\n existing.set(target.path, await readFile(target.path, \"utf8\"));\n }\n return existing;\n}\n\n/** A writer's refusal, with every absolute path it names spelled from cwd. */\nfunction relativized(error: TermError, paths: readonly string[], cwd: string): TermError {\n let message = error.message;\n for (const path of [...paths].sort((a, b) => b.length - a.length)) {\n if (message.includes(path)) message = message.replaceAll(path, displayPath(path, cwd));\n }\n return message === error.message ? error : new TermError(message);\n}\n\n/** The noun a dropped field was dropped from. */\nfunction droppedFrom(format: TermWriteFormat, shape: TermShape, readers: readonly TermReader[]): string {\n const construct = DOCUMENT_RENDERS[format]?.shapes[shape];\n const reader = construct === undefined ? undefined : readerForConstruct(construct, readers);\n return reader === undefined ? format : `a ${reader.label}`;\n}\n\nasync function applyChanges(\n files: readonly RenderedFile[],\n removals: readonly string[],\n existing: ReadonlyMap<string, string>,\n cwd: string,\n write: boolean,\n): Promise<WriteChange[]> {\n const changes: WriteChange[] = [];\n for (const file of files) {\n const before = existing.get(file.path) ?? (existsSync(file.path) ? await readFile(file.path, \"utf8\") : undefined);\n if (before === file.content) continue;\n changes.push({ path: displayPath(file.path, cwd), action: before === undefined ? \"create\" : \"change\" });\n if (write) {\n await mkdir(dirname(file.path), { recursive: true });\n await writeFile(file.path, file.content, \"utf8\");\n }\n }\n for (const path of removals) {\n if (!existsSync(path)) continue;\n changes.push({ path: displayPath(path, cwd), action: \"remove\" });\n if (write) await rm(path, { force: true });\n }\n return changes;\n}\n\nexport async function runWrite(opts: WriteOptions): Promise<WriteReport> {\n const cwd = resolve(opts.cwd ?? process.cwd());\n const writers = opts.writers ?? TERM_WRITERS;\n const readers = opts.readers ?? TERM_READERS;\n const check = opts.check === true;\n const dryRun = opts.dryRun === true;\n if (check && dryRun) throw new TermError(\"--check and --dry-run cannot be combined.\");\n\n if (opts.format === undefined) {\n if (opts.out !== undefined) throw new TermError(\"-o needs -f <format>.\");\n return writeInPlace({ ...opts, cwd, readers }, check, dryRun);\n }\n\n const format = formatChoice(opts.format, writeFormats(writers));\n const writer = writers.find((w) => w.format === format);\n if (writer === undefined) throw new TermError(`unknown format \"${format}\".`);\n if (opts.out === undefined && format !== \"vale\") {\n throw new TermError(`-f ${format} needs -o <path>.`);\n }\n\n const { run, set } = await loadTerms({ ...opts, cwd, readers });\n\n // Where the render goes, and in which shape.\n let targetPath: string;\n let wiring: ValeWiring | undefined;\n if (opts.out === undefined) {\n const lsConfig = opts.lsConfig ?? ((o) => valeLsConfig(o));\n const config = valeConfigFor(run);\n const resolved = await lsConfig({ cwd, ...(config === undefined ? {} : { config }) });\n if (resolved === null) {\n throw new TermError(\n \"Vale found no config file. Set tools.vale.config in manni.config.yaml, or pass -o <styles directory>.\",\n );\n }\n targetPath = resolve(cwd, resolved.stylesPath);\n if (!Object.values(resolved.baseStyles).some((styles) => styles.includes(STYLE))) {\n const first = Object.entries(resolved.baseStyles)[0];\n const [section, styles] = first ?? [SUGGESTED_SECTION, []];\n wiring = {\n rootIni: displayPath(resolve(cwd, resolved.rootIni), cwd),\n section,\n styles: [...styles, STYLE],\n addSection: first === undefined,\n };\n }\n } else {\n targetPath = resolve(cwd, opts.out);\n }\n const shape: TermShape =\n format === \"vale\" || /[\\\\/]$/.test(opts.out ?? \"\") || isDirectory(targetPath) ? \"directory\" : \"file\";\n const target: TermTarget = { path: targetPath, shape };\n const existing = await existingFor(target);\n\n let render;\n try {\n render = writer.render(set.terms, target, { existing });\n } catch (error) {\n if (error instanceof TermError) throw relativized(error, [...existing.keys(), targetPath], cwd);\n throw error;\n }\n\n const changes = await applyChanges(render.files, render.removals, existing, cwd, !check && !dryRun);\n const shown =\n format === \"vale\" ? displayPath(join(targetPath, STYLE), cwd) : (opts.out ?? displayPath(targetPath, cwd));\n return {\n mode: \"render\",\n format,\n shape,\n target: shown,\n terms: set.terms.length,\n changes,\n files: render.files.map((file) => ({ path: displayPath(file.path, cwd), content: file.content })),\n // A Vale style holds designations only, by design; its dropped definitions are not news.\n dropped: format === \"vale\" ? [] : render.dropped,\n droppedFrom: droppedFrom(format, shape, readers),\n skipped: render.skipped,\n check,\n dryRun,\n ...(wiring === undefined ? {} : { wiring }),\n };\n}\n\n/** The `TermInput` a construct's reader reads from `content`, rebuilt as the loader built it. */\nfunction inputFor(content: string, path: string, construct: TermConstruct, file: string): TermInput {\n if (construct === \"manifest\") {\n return { content, file, path, format: MANIFEST_FORMAT, metadata: {}, lineFor: () => undefined };\n }\n const extractor = extractorForExtension(extname(path));\n if (extractor === undefined) throw new TermError(`${file}: no reader for its extension.`);\n return extractInput(content, file, path, extractor.name);\n}\n\n/**\n * The caller's records carried onto `current`, the entries a construct's reader\n * read from content an earlier construct rewrote. An entry is matched by `id`;\n * where the id repeats in either list, by its position within the construct.\n * An entry the caller left out keeps the record it was read with.\n */\nfunction carryRecords(current: readonly Term[], edited: readonly Term[]): Term[] {\n const count = (terms: readonly Term[], id: string): number => terms.filter((t) => t.id === id).length;\n return current.map((entry, index) => {\n const unique = count(current, entry.id) === 1 && count(edited, entry.id) === 1;\n const match = unique ? edited.find((t) => t.id === entry.id) : edited[index];\n return match?.id === entry.id ? { ...entry, record: match.record } : entry;\n });\n}\n\n/** One file's content with each construct's entries written back through its reader, in order. */\nexport function applyInPlace(\n original: string,\n path: string,\n file: string,\n constructs: ReadonlyMap<TermConstruct, readonly Term[]>,\n readers: readonly TermReader[],\n): string {\n let content = original;\n let first = true;\n for (const [construct, terms] of constructs) {\n const reader = readerForConstruct(construct, readers);\n if (reader?.apply === undefined) continue;\n const input = inputFor(content, path, construct, file);\n // The loaded terms carry offsets into the file as it was read. Once an\n // earlier construct has rewritten it, this one's entries are read again for\n // offsets that are the content's own, and the caller's records carried over.\n content = reader.apply(input, first ? terms : carryRecords(reader.read(input).terms, terms));\n first = false;\n }\n return content;\n}\n\nasync function writeInPlace(\n opts: WriteOptions & { cwd: string; readers: readonly TermReader[] },\n check: boolean,\n dryRun: boolean,\n): Promise<WriteReport> {\n const { cwd, readers } = opts;\n const { set } = await loadTerms(opts);\n\n // Every file's terms, per construct, in load order.\n const byPath = new Map<string, { file: string; constructs: Map<TermConstruct, Term[]> }>();\n for (const term of set.terms) {\n const { path, construct } = term.location;\n if (path === undefined) {\n throw new TermError(`${term.location.file} has nowhere to write back to. Pass -f <format> -o <path>.`);\n }\n const reader = readerForConstruct(construct, readers);\n if (reader?.apply === undefined) {\n const name = reader?.label ?? construct;\n throw new TermError(\n `${displayPath(term.location.file, cwd)}: a ${name} cannot be written in place. Pass -f <format> -o <path>.`,\n );\n }\n const entry = byPath.get(path) ?? { file: term.location.file, constructs: new Map<TermConstruct, Term[]>() };\n entry.constructs.set(construct, [...(entry.constructs.get(construct) ?? []), term]);\n byPath.set(path, entry);\n }\n\n const files: RenderedFile[] = [];\n const existing = new Map<string, string>();\n for (const [path, { file, constructs }] of byPath) {\n let original: string;\n try {\n original = await readFile(path, \"utf8\");\n } catch (error) {\n throw new TermError(`${file}: could not be read: ${errorMessage(error)}`);\n }\n existing.set(path, original);\n files.push({ path, content: applyInPlace(original, path, file, constructs, readers) });\n }\n\n const changes = await applyChanges(files, [], existing, cwd, !check && !dryRun);\n return {\n mode: \"in-place\",\n terms: set.terms.length,\n changes,\n files: files.map((f) => ({ path: displayPath(f.path, cwd), content: f.content })),\n dropped: [],\n skipped: [],\n check,\n dryRun,\n };\n}\n","/**\n * `term list -f csv`: one row per term for a script, `id,label,alt-labels,abstract`.\n * A list is joined with `|`, and a cell is quoted as RFC 4180 says.\n */\nimport type { Term } from \"../types.js\";\n\nconst LIST_SEPARATOR = \"|\";\n\nfunction cell(value: string): string {\n return /[\",\\r\\n]/.test(value) ? `\"${value.replaceAll('\"', '\"\"')}\"` : value;\n}\n\nexport function renderListCsv(terms: readonly Term[]): string {\n const rows = [\n [\"id\", \"label\", \"alt-labels\", \"abstract\"],\n ...terms.map((t) => [\n t.id,\n t.record.label,\n (t.record[\"alt-labels\"] ?? []).join(LIST_SEPARATOR),\n t.record.abstract ?? \"\",\n ]),\n ];\n return rows.map((row) => row.map(cell).join(\",\")).join(\"\\n\");\n}\n","/**\n * SARIF for `check` and `lint`. Meta's renderer builds the envelope, the\n * repository-relative uris and the fingerprints the baseline shares, from the\n * adapted results. What it cannot know is what a term rule is: it describes\n * every rule as a schema keyword, links meta's fix page, and prefixes each\n * message with the JSON Pointer of the field, `(root)` for a finding about a\n * whole entry. This renderer replaces those three with the term rule's own\n * description, a link to its section of the rules page, and the finding's own\n * message.\n */\nimport { renderSarif } from \"../../meta/index.js\";\nimport { RULE_ID_PREFIX, isTermRule } from \"../core/severity.js\";\nimport type { TermReport } from \"../commands/findings.js\";\nimport { TERM_FIELDS, type TermRule } from \"../types.js\";\n\nconst INFORMATION_URI = \"https://hawkeyexl.github.io/manni/term/\";\n\n/** The rules reference, whose sections are anchored by rule name. */\nconst RULES_URI = \"https://hawkeyexl.github.io/manni/term/reference/rules/\";\n\n/** What each `check` rule is, as the rules reference's table says it. */\nconst RULE_DESCRIPTIONS: Readonly<Record<TermRule, string>> = {\n \"undefined-term\": \"A page's concepts: names a label no entry claims as its preferred label.\",\n \"duplicate-id\": \"Two entries share an id.\",\n \"label-collision\": \"Two entries claim the same preferred label, ignoring case.\",\n \"alt-label-collision\": \"An entry's alt-label is another entry's preferred label, ignoring case.\",\n \"dangling-reference\": \"A value of broader, narrower, related-terms or see names no entry, by label or by id.\",\n \"broader-cycle\": \"A chain of broader returns to where it started.\",\n \"see-not-empty\": \"An entry with see also carries a definition.\",\n \"asymmetric-hierarchy\": \"A names B as broader, and B omits A from narrower, or the reverse.\",\n \"abstract-too-long\": \"An abstract is longer than term.abstractMaxLength.\",\n \"unused-term\": \"No page's concepts: names the entry's preferred label.\",\n};\n\nconst PROSE_PREFIX = `${RULE_ID_PREFIX}/prose/`;\n\n/**\n * The label meta's reporters put before a message: `(root) ` for a finding\n * about the whole entry, `/<field> ` for one about a field. Nothing else ever\n * opens a term finding's adapted message.\n */\nexport const FIELD_LABEL = new RegExp(`^(?:\\\\(root\\\\)|/(?:${TERM_FIELDS.join(\"|\")})) `);\n\ninterface SarifRule {\n id: string;\n shortDescription: { text: string };\n helpUri?: string;\n}\n\ninterface SarifLog {\n runs: {\n tool: { driver: { informationUri: string; rules: SarifRule[] } };\n results: { message: { text: string } }[];\n }[];\n}\n\n/** A rule as the term tool describes it: a check rule links its section, a Vale rule links nothing manni documents. */\nfunction describe(rule: SarifRule): SarifRule {\n if (rule.id.startsWith(PROSE_PREFIX)) {\n const check = rule.id.slice(PROSE_PREFIX.length);\n return { id: rule.id, shortDescription: { text: `Vale's ${check} rule flagged the prose of an entry's field.` } };\n }\n const name = rule.id.slice(RULE_ID_PREFIX.length + 1);\n if (!isTermRule(name)) return rule;\n return { id: rule.id, shortDescription: { text: RULE_DESCRIPTIONS[name] }, helpUri: `${RULES_URI}#${name}` };\n}\n\nexport function renderFindingsSarif(report: TermReport, opts: { onNotice?: (message: string) => void } = {}): string {\n const log = JSON.parse(\n renderSarif(report.results, {\n frame: report.frame,\n ...(opts.onNotice === undefined ? {} : { onNotice: opts.onNotice }),\n }),\n ) as SarifLog;\n for (const run of log.runs) {\n run.tool.driver.informationUri = INFORMATION_URI;\n run.tool.driver.rules = run.tool.driver.rules.map(describe);\n for (const result of run.results) result.message.text = result.message.text.replace(FIELD_LABEL, \"\");\n }\n return JSON.stringify(log, null, 2);\n}\n","/**\n * JUnit for `check` and `lint`: meta's renderer over the adapted results,\n * under the `manni.term` classname, with each failure's message the finding's\n * own. Meta's renderer opens every message with the field's JSON Pointer,\n * `(root)` for a finding about a whole entry, which says nothing about a term.\n * The failure's `type` is already the rule id.\n */\nimport { renderJunit } from \"../../meta/index.js\";\nimport { JUNIT_CLASSNAME, type TermReport } from \"../commands/findings.js\";\nimport { FIELD_LABEL } from \"./sarif.js\";\n\n/** A `message=\"` attribute's opening label. The value is escaped, so `message=\"` opens nothing else. */\nconst MESSAGE_LABEL = new RegExp(`message=\"${FIELD_LABEL.source.slice(1)}`, \"g\");\n\nexport function renderFindingsJunit(report: TermReport): string {\n return renderJunit(report.results, { frame: report.frame, classname: JUNIT_CLASSNAME }).replace(\n MESSAGE_LABEL,\n 'message=\"',\n );\n}\n","/**\n * The termbase as `meta fill` reads it: each term's label and id, from the\n * same config and the same files `manni term check` reads. Registered as the\n * family's term label source by this domain's CLI module (see\n * `src/shared/term-labels.ts`).\n */\nimport type { TermLabel, TermLabelRequest } from \"../../shared/term-labels.js\";\nimport { resolveTermRun } from \"../core/config.js\";\nimport { loadSet } from \"./run.js\";\n\nexport async function termLabels(request: TermLabelRequest): Promise<TermLabel[]> {\n const run = await resolveTermRun({\n cwd: request.cwd,\n inputs: [],\n ...(request.configPath === undefined ? {} : { configPath: request.configPath }),\n ...(request.noConfig === true ? { noConfig: true } : {}),\n });\n // No collection and no manifest names a file, so there is no termbase.\n if (run.inputs.length === 0 && run.manifests.length === 0) return [];\n const set = await loadSet(run, { inputs: [], allowEmpty: true });\n return set.terms.map((term) => ({ label: term.record.label, id: term.id }));\n}\n"],"mappings":"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","names":["HOLDS","join","HOLDS","text","join","join","text","join","rm","writeFile","join","resolve","STYLE","join","writeFile","rm","resolve","LIST_SEPARATOR","cell","text","references"]}