@hawkeyexl/manni 4.9.0 → 4.11.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.
- package/README.md +1 -1
- package/dist/{batch-W5GXL2P4.js → batch-UAULUMGH.js} +18 -14
- package/dist/{build-Q56FEXR6.js → build-QSPNK5AL.js} +14 -11
- package/dist/calibrate-KXN4URPM.js +40 -0
- package/dist/{capture-GMYH4ATL.js → capture-JHTSUPUC.js} +16 -13
- package/dist/{check-OAJWC3WD.js → check-MDGXEUWL.js} +5 -5
- package/dist/{check-KUBELO5G.js → check-VELUQAUW.js} +17 -14
- package/dist/{check-KUBELO5G.js.map → check-VELUQAUW.js.map} +1 -1
- package/dist/check-WOQRKNZK.js +29 -0
- package/dist/{check-ZE5HIDOW.js → check-YEOYBFST.js} +14 -11
- package/dist/{chunk-FGUXMZXO.js → chunk-2DRHT73U.js} +7 -7
- package/dist/{chunk-XHFHXOQQ.js → chunk-2IAZEB45.js} +8 -8
- package/dist/{chunk-35WTFPQS.js → chunk-2IR4T5PO.js} +2 -2
- package/dist/{chunk-KX5IYIOO.js → chunk-2MJ62AYQ.js} +2 -2
- package/dist/chunk-2MJ62AYQ.js.map +1 -0
- package/dist/{chunk-OWSNXPPX.js → chunk-4CK6ZSOK.js} +6 -6
- package/dist/{chunk-YUZ2ECZY.js → chunk-4D5IZSXM.js} +3 -3
- package/dist/{chunk-RFSGKF4O.js → chunk-4VBSTXN6.js} +4 -4
- package/dist/{chunk-3XMG4CZY.js → chunk-54F74XR3.js} +15 -13
- package/dist/{chunk-3XMG4CZY.js.map → chunk-54F74XR3.js.map} +1 -1
- package/dist/{chunk-IN6DWNVE.js → chunk-6HWBRZIN.js} +47 -191
- package/dist/chunk-6HWBRZIN.js.map +1 -0
- package/dist/{chunk-GEMXGXPR.js → chunk-ADMEPUBT.js} +3 -3
- package/dist/{chunk-23UAGEKP.js → chunk-B7XYNRJQ.js} +2 -2
- package/dist/{chunk-QKE3XS2L.js → chunk-BBT6AVUG.js} +2 -2
- package/dist/{chunk-VKWZCEWB.js → chunk-BKVHX6FU.js} +4 -4
- package/dist/{chunk-X6WLCNKC.js → chunk-D4N2V43Z.js} +4 -4
- package/dist/{chunk-XXDXIIQ4.js → chunk-EFW7CAG4.js} +2 -2
- package/dist/{chunk-UDUHRXJ4.js → chunk-EIFCP6CZ.js} +2 -2
- package/dist/{chunk-KPXOJMQ6.js → chunk-FBMZJEB3.js} +2 -2
- package/dist/{chunk-HRXDM6H6.js → chunk-FQXWVS6J.js} +8 -8
- package/dist/{chunk-76I6I5N2.js → chunk-FUCPZVRY.js} +2 -2
- package/dist/{chunk-DTGIUMZV.js → chunk-GDVZ5VII.js} +4 -4
- package/dist/{chunk-QCCAHV6A.js → chunk-GV56WGL2.js} +321 -3308
- package/dist/chunk-GV56WGL2.js.map +1 -0
- package/dist/{chunk-TKTRIZT4.js → chunk-HA6MQMOY.js} +6 -6
- package/dist/{chunk-ECVQNGTH.js → chunk-HQR2ZBHW.js} +3 -3
- package/dist/{chunk-MHAYLDBK.js → chunk-IGSHYP74.js} +4 -4
- package/dist/{chunk-YEUQ7OKT.js → chunk-J6IDQGJL.js} +4 -4
- package/dist/{chunk-5LBEQ4ZU.js → chunk-JPQDNYXH.js} +2 -2
- package/dist/{chunk-6KKZXB2O.js → chunk-JROBZ7JA.js} +2 -2
- package/dist/{chunk-TMI2YF6D.js → chunk-KGEQJ5CC.js} +15 -26
- package/dist/{chunk-TMI2YF6D.js.map → chunk-KGEQJ5CC.js.map} +1 -1
- package/dist/{chunk-2EHDJ47Y.js → chunk-LBSCW232.js} +4 -4
- package/dist/{chunk-M6GH3FGJ.js → chunk-LKP7QDFN.js} +4 -4
- package/dist/{chunk-5EB6RIXJ.js → chunk-LPIF5LIE.js} +2 -2
- package/dist/chunk-M42DZCOU.js +164 -0
- package/dist/chunk-M42DZCOU.js.map +1 -0
- package/dist/{chunk-ND2S5BXB.js → chunk-MSRU4D4P.js} +2 -2
- package/dist/{chunk-BSTXARMY.js → chunk-NSBXVPZL.js} +11 -11
- package/dist/{chunk-Q45PZX2D.js → chunk-ODRPL3WB.js} +2 -2
- package/dist/{chunk-FSBIPCWE.js → chunk-OPXWPJDA.js} +10 -10
- package/dist/chunk-PCQ7ELJH.js +3081 -0
- package/dist/chunk-PCQ7ELJH.js.map +1 -0
- package/dist/{chunk-QAKJNPY3.js → chunk-PCS4VJBV.js} +6 -6
- package/dist/{chunk-GRILZZGS.js → chunk-PWBH7DCQ.js} +3 -3
- package/dist/{chunk-XKBEHKWO.js → chunk-QLWC7MKD.js} +34 -32
- package/dist/chunk-QLWC7MKD.js.map +1 -0
- package/dist/{chunk-XTAHZTES.js → chunk-R4WXQIOZ.js} +6 -6
- package/dist/{chunk-3CDZWY6M.js → chunk-RLT5SEML.js} +5 -5
- package/dist/{chunk-XG6PVB5S.js → chunk-SSQZB5SQ.js} +1 -11
- package/dist/chunk-SSQZB5SQ.js.map +1 -0
- package/dist/chunk-T7JAOYE5.js +393 -0
- package/dist/chunk-T7JAOYE5.js.map +1 -0
- package/dist/chunk-TU2WUBVZ.js +2 -0
- package/dist/{chunk-Q2H7J3FF.js → chunk-U7CTFN2J.js} +12 -10
- package/dist/{chunk-Q2H7J3FF.js.map → chunk-U7CTFN2J.js.map} +1 -1
- package/dist/{chunk-3XGGF5JW.js → chunk-VSEBFHAY.js} +10 -7
- package/dist/{chunk-3XGGF5JW.js.map → chunk-VSEBFHAY.js.map} +1 -1
- package/dist/{chunk-OVOYKWCM.js → chunk-WDWXAYVH.js} +4 -4
- package/dist/{chunk-5WME4CB6.js → chunk-Y6DOMTQD.js} +10 -8
- package/dist/{chunk-5WME4CB6.js.map → chunk-Y6DOMTQD.js.map} +1 -1
- package/dist/chunk-ZMECS2IJ.js +27 -0
- package/dist/chunk-ZMECS2IJ.js.map +1 -0
- package/dist/chunk-ZPLVANY2.js +15 -0
- package/dist/chunk-ZPLVANY2.js.map +1 -0
- package/dist/{cli-MEPJTS2V.js → cli-3BTCK4AB.js} +18 -15
- package/dist/{cli-MEPJTS2V.js.map → cli-3BTCK4AB.js.map} +1 -1
- package/dist/{cli-EMQXRN6E.js → cli-4MF37HAQ.js} +16 -12
- package/dist/{cli-EMQXRN6E.js.map → cli-4MF37HAQ.js.map} +1 -1
- package/dist/{cli-YDMMIL2U.js → cli-6KZTHWGP.js} +17 -14
- package/dist/{cli-YDMMIL2U.js.map → cli-6KZTHWGP.js.map} +1 -1
- package/dist/{cli-ZJRHU7MO.js → cli-DRMZBZLB.js} +39 -34
- package/dist/cli-DRMZBZLB.js.map +1 -0
- package/dist/{cli-J35OPSTP.js → cli-I62SRH3R.js} +10 -8
- package/dist/cli-JJMOVIKS.js +83 -0
- package/dist/cli-JJMOVIKS.js.map +1 -0
- package/dist/{cli-TPONWND4.js → cli-O4ABTN4Z.js} +25 -21
- package/dist/{cli-TPONWND4.js.map → cli-O4ABTN4Z.js.map} +1 -1
- package/dist/{cli-URNPOMOH.js → cli-ONTC5PKT.js} +3 -3
- package/dist/{cli-BJ7JXJ2U.js → cli-RORDPAPE.js} +17 -14
- package/dist/{cli-BJ7JXJ2U.js.map → cli-RORDPAPE.js.map} +1 -1
- package/dist/{cli-B7SFJDZA.js → cli-VID7PJS3.js} +17 -13
- package/dist/{cli-B7SFJDZA.js.map → cli-VID7PJS3.js.map} +1 -1
- package/dist/cli-VUKMWSSF.js +839 -0
- package/dist/cli-VUKMWSSF.js.map +1 -0
- package/dist/cli.js +24 -11
- package/dist/cli.js.map +1 -1
- package/dist/{config-YWSNBFEE.js → config-XDA42RJL.js} +3 -3
- package/dist/docmeta.js +9 -7
- package/dist/docmeta.js.map +1 -1
- package/dist/github-RY3FRA6P.js +29 -0
- package/dist/github-YKQSH7FS.js +34 -0
- package/dist/index.d.ts +1023 -915
- package/dist/index.js +107 -81
- package/dist/index.js.map +1 -1
- package/dist/{json-JIUPGOUQ.js → json-BXY44ED7.js} +13 -10
- package/dist/lint-YJ2L22BW.js +33 -0
- package/dist/list-NSG24VVX.js +31 -0
- package/dist/list-V6EGCSHX.js +34 -0
- package/dist/{page-WQ3GQF76.js → page-EV7OUBAU.js} +12 -9
- package/dist/{prepare-ZUTYXTUZ.js → prepare-JHJDJB6I.js} +17 -14
- package/dist/{prepare-ZUTYXTUZ.js.map → prepare-JHJDJB6I.js.map} +1 -1
- package/dist/{pretty-Q3C433DW.js → pretty-Q5Y2PA64.js} +14 -11
- package/dist/{pretty-CBV5XSMZ.js → pretty-SCRK66M5.js} +13 -10
- package/dist/{reporters-DH5HPFXJ.js → reporters-A5ADKDYR.js} +12 -9
- package/dist/{reporters-TTYGOUAF.js → reporters-RBYTASMI.js} +5 -5
- package/dist/run-BUE2DDXN.js +36 -0
- package/dist/{term-DL3YFL43.js → term-CQAGNG3Q.js} +17 -14
- package/dist/{term-DL3YFL43.js.map → term-CQAGNG3Q.js.map} +1 -1
- package/dist/{validate-UVDMC5LT.js → validate-ZBW44RHT.js} +6 -5
- package/dist/validate-ZBW44RHT.js.map +1 -0
- package/package.json +1 -1
- package/plugin/manni/.claude-plugin/plugin.json +1 -1
- package/dist/calibrate-XFE56P4M.js +0 -36
- package/dist/check-HBRX4FOR.js +0 -26
- package/dist/chunk-IN6DWNVE.js.map +0 -1
- package/dist/chunk-KX5IYIOO.js.map +0 -1
- package/dist/chunk-QCCAHV6A.js.map +0 -1
- package/dist/chunk-XG6PVB5S.js.map +0 -1
- package/dist/chunk-XKBEHKWO.js.map +0 -1
- package/dist/cli-ZJRHU7MO.js.map +0 -1
- package/dist/github-63CZJGZS.js +0 -31
- package/dist/github-IYOVHWHG.js +0 -26
- package/dist/lint-TBE35CCW.js +0 -29
- package/dist/list-IZ4RIM72.js +0 -30
- package/dist/list-TNEJ3J77.js +0 -28
- package/dist/run-LZXKVTM7.js +0 -32
- /package/dist/{batch-W5GXL2P4.js.map → batch-UAULUMGH.js.map} +0 -0
- /package/dist/{build-Q56FEXR6.js.map → build-QSPNK5AL.js.map} +0 -0
- /package/dist/{calibrate-XFE56P4M.js.map → calibrate-KXN4URPM.js.map} +0 -0
- /package/dist/{capture-GMYH4ATL.js.map → capture-JHTSUPUC.js.map} +0 -0
- /package/dist/{check-HBRX4FOR.js.map → check-MDGXEUWL.js.map} +0 -0
- /package/dist/{check-OAJWC3WD.js.map → check-WOQRKNZK.js.map} +0 -0
- /package/dist/{check-ZE5HIDOW.js.map → check-YEOYBFST.js.map} +0 -0
- /package/dist/{chunk-FGUXMZXO.js.map → chunk-2DRHT73U.js.map} +0 -0
- /package/dist/{chunk-XHFHXOQQ.js.map → chunk-2IAZEB45.js.map} +0 -0
- /package/dist/{chunk-35WTFPQS.js.map → chunk-2IR4T5PO.js.map} +0 -0
- /package/dist/{chunk-OWSNXPPX.js.map → chunk-4CK6ZSOK.js.map} +0 -0
- /package/dist/{chunk-YUZ2ECZY.js.map → chunk-4D5IZSXM.js.map} +0 -0
- /package/dist/{chunk-RFSGKF4O.js.map → chunk-4VBSTXN6.js.map} +0 -0
- /package/dist/{chunk-GEMXGXPR.js.map → chunk-ADMEPUBT.js.map} +0 -0
- /package/dist/{chunk-23UAGEKP.js.map → chunk-B7XYNRJQ.js.map} +0 -0
- /package/dist/{chunk-QKE3XS2L.js.map → chunk-BBT6AVUG.js.map} +0 -0
- /package/dist/{chunk-VKWZCEWB.js.map → chunk-BKVHX6FU.js.map} +0 -0
- /package/dist/{chunk-X6WLCNKC.js.map → chunk-D4N2V43Z.js.map} +0 -0
- /package/dist/{chunk-XXDXIIQ4.js.map → chunk-EFW7CAG4.js.map} +0 -0
- /package/dist/{chunk-UDUHRXJ4.js.map → chunk-EIFCP6CZ.js.map} +0 -0
- /package/dist/{chunk-KPXOJMQ6.js.map → chunk-FBMZJEB3.js.map} +0 -0
- /package/dist/{chunk-HRXDM6H6.js.map → chunk-FQXWVS6J.js.map} +0 -0
- /package/dist/{chunk-76I6I5N2.js.map → chunk-FUCPZVRY.js.map} +0 -0
- /package/dist/{chunk-DTGIUMZV.js.map → chunk-GDVZ5VII.js.map} +0 -0
- /package/dist/{chunk-TKTRIZT4.js.map → chunk-HA6MQMOY.js.map} +0 -0
- /package/dist/{chunk-ECVQNGTH.js.map → chunk-HQR2ZBHW.js.map} +0 -0
- /package/dist/{chunk-MHAYLDBK.js.map → chunk-IGSHYP74.js.map} +0 -0
- /package/dist/{chunk-YEUQ7OKT.js.map → chunk-J6IDQGJL.js.map} +0 -0
- /package/dist/{chunk-5LBEQ4ZU.js.map → chunk-JPQDNYXH.js.map} +0 -0
- /package/dist/{chunk-6KKZXB2O.js.map → chunk-JROBZ7JA.js.map} +0 -0
- /package/dist/{chunk-2EHDJ47Y.js.map → chunk-LBSCW232.js.map} +0 -0
- /package/dist/{chunk-M6GH3FGJ.js.map → chunk-LKP7QDFN.js.map} +0 -0
- /package/dist/{chunk-5EB6RIXJ.js.map → chunk-LPIF5LIE.js.map} +0 -0
- /package/dist/{chunk-ND2S5BXB.js.map → chunk-MSRU4D4P.js.map} +0 -0
- /package/dist/{chunk-BSTXARMY.js.map → chunk-NSBXVPZL.js.map} +0 -0
- /package/dist/{chunk-Q45PZX2D.js.map → chunk-ODRPL3WB.js.map} +0 -0
- /package/dist/{chunk-FSBIPCWE.js.map → chunk-OPXWPJDA.js.map} +0 -0
- /package/dist/{chunk-QAKJNPY3.js.map → chunk-PCS4VJBV.js.map} +0 -0
- /package/dist/{chunk-GRILZZGS.js.map → chunk-PWBH7DCQ.js.map} +0 -0
- /package/dist/{chunk-XTAHZTES.js.map → chunk-R4WXQIOZ.js.map} +0 -0
- /package/dist/{chunk-3CDZWY6M.js.map → chunk-RLT5SEML.js.map} +0 -0
- /package/dist/{cli-J35OPSTP.js.map → chunk-TU2WUBVZ.js.map} +0 -0
- /package/dist/{chunk-OVOYKWCM.js.map → chunk-WDWXAYVH.js.map} +0 -0
- /package/dist/{config-YWSNBFEE.js.map → cli-I62SRH3R.js.map} +0 -0
- /package/dist/{cli-URNPOMOH.js.map → cli-ONTC5PKT.js.map} +0 -0
- /package/dist/{github-63CZJGZS.js.map → config-XDA42RJL.js.map} +0 -0
- /package/dist/{github-IYOVHWHG.js.map → github-RY3FRA6P.js.map} +0 -0
- /package/dist/{json-JIUPGOUQ.js.map → github-YKQSH7FS.js.map} +0 -0
- /package/dist/{lint-TBE35CCW.js.map → json-BXY44ED7.js.map} +0 -0
- /package/dist/{list-IZ4RIM72.js.map → lint-YJ2L22BW.js.map} +0 -0
- /package/dist/{list-TNEJ3J77.js.map → list-NSG24VVX.js.map} +0 -0
- /package/dist/{page-WQ3GQF76.js.map → list-V6EGCSHX.js.map} +0 -0
- /package/dist/{pretty-CBV5XSMZ.js.map → page-EV7OUBAU.js.map} +0 -0
- /package/dist/{pretty-Q3C433DW.js.map → pretty-Q5Y2PA64.js.map} +0 -0
- /package/dist/{reporters-DH5HPFXJ.js.map → pretty-SCRK66M5.js.map} +0 -0
- /package/dist/{reporters-TTYGOUAF.js.map → reporters-A5ADKDYR.js.map} +0 -0
- /package/dist/{run-LZXKVTM7.js.map → reporters-RBYTASMI.js.map} +0 -0
- /package/dist/{validate-UVDMC5LT.js.map → run-BUE2DDXN.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tracevals/cli.ts"],"sourcesContent":["/**\n * The tracevals program. Named `tracevals` because that is where it is\n * mounted (`manni tracevals …`); `src/cli.ts` adds it to the umbrella and\n * runs it. Thin commander wrapper; all behavior lives in commands.\n */\nimport { Command } from \"commander\";\nimport pkg from \"../../package.json\" with { type: \"json\" };\nimport { collect, configOption } from \"../shared/cli-options.js\";\nimport { LOCAL_FLAG_HELP } from \"../shared/providers.js\";\nimport { fail } from \"../shared/run.js\";\nimport { terminalConfirm } from \"../shared/prompt.js\";\nimport { colorFor } from \"../shared/color.js\";\nimport { notice } from \"../shared/warn.js\";\nimport { renderList, runList } from \"./commands/list.js\";\nimport { runFill } from \"./commands/fill.js\";\nimport { runRun } from \"./commands/run.js\";\nimport { TracevalsError } from \"./types.js\";\nimport { allowExecutionMessage, isExecutionGrant } from \"../shared/execution.js\";\nimport {\n CALIBRATE_FORMATS,\n REPORT_FORMATS,\n SUMMARY_FORMATS,\n parseFormat,\n type ReportFormat,\n type SummaryFormat,\n} from \"./reporters/index.js\";\n\nconst { version } = pkg;\n\nexport function buildProgram(): Command {\nconst program = new Command();\n\nprogram\n .name(\"tracevals\")\n .description(\n \"Deterministic and LLM-as-judge adherence evals for AI agent session traces.\",\n )\n .version(version)\n .option(\"--no-color\", \"disable colored output\")\n // A pointer, not the whole help screen: the message that precedes it\n // already names the offending flag.\n .showHelpAfterError(\"(add --help for usage)\")\n // MUST come before the `.command()` calls below. `copyInheritedSettings`\n // copies `_exitCallback` by value at subcommand-creation time, so an\n // `exitOverride()` installed afterwards leaves every subcommand calling\n // `process.exit(1)` on a parse error, which is a usage error owed exit 2.\n .exitOverride();\n\ninterface ConfigFlags {\n /** `-c <path>` gives a string, `--no-config` gives false, neither gives undefined. */\n config?: string | boolean;\n}\n\ninterface RunFlags extends ConfigFlags {\n project?: string;\n provider?: string;\n model?: string;\n local?: boolean;\n offline?: boolean;\n runs?: number;\n deterministicOnly?: boolean;\n cache?: boolean;\n maxTurns?: number;\n format?: ReportFormat;\n output?: string;\n history?: boolean;\n failOnReview?: boolean;\n allowExecution?: string[];\n execution?: boolean;\n require?: string[];\n reportUnusedArtifacts?: boolean;\n manifest?: string;\n allProjects?: boolean;\n newerThan?: string;\n limit?: number;\n}\n\n/**\n * Repeatable execution grant, validated on the way in. An unknown value is a\n * usage error rather than a grant that quietly matches nothing.\n */\nfunction collectGrant(value: string, previous: string[]): string[] {\n if (!isExecutionGrant(value)) fail(new TracevalsError(allowExecutionMessage(value)));\n return [...previous, value];\n}\n\n/**\n * `-c, --config <path>` and `--no-config`, on every verb that reads config.\n *\n * Declared once so the four cannot drift apart on a name or a description,\n * the way docevals' `documentInputs()` does it. `list` is the one verb without\n * them: it enumerates the session store and reads no config at all, and an\n * accepted flag that quietly does nothing is worse than an absent one.\n */\nfunction addConfigFlags(cmd: Command): Command {\n return cmd\n .option(\"-c, --config <path>\", \"Path to manni.config.yaml\")\n .option(\"--no-config\", \"Ignore any discovered config file\");\n}\n\n/** The config flags as the command cores take them. */\nfunction configOptions(opts: ConfigFlags): {\n config?: string;\n noConfig?: boolean;\n} {\n const { configPath, noConfig } = configOption(opts.config);\n return {\n ...(configPath === undefined ? {} : { config: configPath }),\n ...(noConfig === true ? { noConfig } : {}),\n };\n}\n\n/**\n * Commander argument parser for `-f/--format`. Routes through `fail()` for the\n * reason the numeric checks below do: commander only special-cases\n * InvalidArgumentError, so any other exception escapes `program.parse()`\n * uncaught — a stack trace and exit 1, when a bad flag owes exit 2.\n */\nfunction parseFormatArg<T extends string>(name: string, allowed: readonly T[]) {\n return (value: string): T => {\n try {\n return parseFormat(value, allowed, name);\n } catch (e) {\n fail(e);\n }\n };\n}\n\nconst range = (min: number, max: number): string =>\n Number.isFinite(max) ? `between ${min} and ${max}` : `of at least ${min}`;\n\n/**\n * A numeric flag, checked before anything reads it.\n *\n * `parseFloat(\"abc\")` is NaN, and every comparison against NaN is false — so a\n * flag that failed to parse does **not** fall back to the config. `undefined`\n * is what defers to the config, and NaN is not undefined: it survives the `??`\n * overlay and lands in the runtime as a limit that can never be reached. A\n * budget of NaN bills without a ceiling while the report still claims one,\n * which is the most expensive way for a safety limit to fail. Range checks\n * therefore test for a *finite* number, not only for the range.\n */\nfunction numeric(\n name: string,\n value: number | undefined,\n min: number,\n max: number = Number.POSITIVE_INFINITY,\n): void {\n if (value === undefined) return;\n if (Number.isFinite(value) && value >= min && value <= max) return;\n throw new TracevalsError(\n `${name} must be a number ${range(min, max)}, got ${value}`,\n );\n}\n\n/**\n * The same for a count. Kept apart from `numeric` because a fraction is never\n * meant here: `--limit 2.5` and `--limit -1` both reach `slice(0, n)`, where\n * the negative one silently evaluates every trace except the oldest.\n */\nfunction whole(\n name: string,\n value: number | undefined,\n min: number,\n max: number = Number.POSITIVE_INFINITY,\n): void {\n if (value === undefined) return;\n if (Number.isInteger(value) && value >= min && value <= max) return;\n throw new TracevalsError(\n `${name} must be a whole number ${range(min, max)}, got ${value}`,\n );\n}\n\n/**\n * The single mapping from `addRunFlags`' options onto the shared run options.\n *\n * `run` and `calibrate` accept the same flags, and `calibrate` used to\n * hand-copy the list, which is how it came to accept a flag and drop it on\n * the floor. `addRunFlags`' own docstring says an accepted flag that\n * quietly does nothing is worse than an absent one, so there is now one place\n * to add a flag rather than two places to remember.\n *\n * Validation lives here for the same reason: both commands get it, or neither.\n */\nfunction sharedRunOptions(opts: RunFlags) {\n whole(\"--runs\", opts.runs, 1);\n whole(\"--limit\", opts.limit, 1);\n whole(\"--max-turns\", opts.maxTurns, 1);\n\n return {\n ...configOptions(opts),\n project: opts.project,\n provider: opts.provider,\n model: opts.model,\n local: opts.local,\n // `undefined` rather than `false` when absent, so a future config\n // `offline:` still decides on a run where the flag was never typed.\n offline: opts.offline ? true : undefined,\n runs: opts.runs,\n deterministicOnly: opts.deterministicOnly,\n noCache: opts.cache === false,\n maxTurns: opts.maxTurns,\n format: opts.format ?? \"pretty\",\n output: opts.output,\n // Undefined when neither spelling is passed, so the config still decides.\n // Both spellings are declared for precisely that reason: commander\n // defaults a lone `--no-x` to `true`, which makes the config's own value\n // unreachable from the command line.\n failOnReview: opts.failOnReview,\n // Commander's default is `[]`, which is \"no flag\", not \"run nothing\": only\n // a list someone typed narrows the run, and `--no-execution` runs none.\n ...(opts.execution === false\n ? { allowExecution: [] }\n : (opts.allowExecution ?? []).length > 0\n ? { allowExecution: opts.allowExecution }\n : {}),\n reportUnusedArtifacts: opts.reportUnusedArtifacts,\n ...(opts.require !== undefined ? { require: opts.require } : {}),\n ...(opts.allProjects !== undefined ? { allProjects: opts.allProjects } : {}),\n ...(opts.newerThan !== undefined ? { newerThan: opts.newerThan } : {}),\n ...(opts.limit !== undefined ? { limit: opts.limit } : {}),\n };\n}\n\nasync function executeRun(traces: string[], opts: RunFlags, color: boolean) {\n const shared = {\n ...sharedRunOptions(opts),\n color,\n // Run-only, both of them: `--history` is a point in one session's\n // timeline, and a manifest belongs to exactly one session (ADR 01024).\n history: opts.history,\n ...(opts.manifest !== undefined ? { manifest: opts.manifest } : {}),\n };\n\n // What decides the report shape is *how traces were selected*, not how many\n // came back. One named trace is a `RunReport`, byte for byte as before; a\n // discovery selector is a `BatchReport` even when it matches exactly one, so\n // a script piping `--format json` gets a stable shape (ADR 01018).\n const selecting =\n opts.allProjects === true ||\n opts.newerThan !== undefined ||\n opts.limit !== undefined;\n\n if (traces.length > 1 || selecting) {\n if (opts.manifest !== undefined) {\n // Each trace finds its own manifest by convention; one named file cannot\n // be evidence about more than the session it was captured for.\n throw new TracevalsError(\n \"--manifest names one session's manifest, so it cannot be used with a corpus; drop it and each trace will find its own\",\n );\n }\n const { runBatch } = await import(\"./commands/batch.js\");\n const { report, rendered } = await runBatch({\n ...shared,\n ...(traces.length > 0 ? { traces } : {}),\n });\n console.log(rendered);\n process.exitCode = report.exitCode;\n return;\n }\n\n let trace = traces[0];\n if (trace === undefined) {\n // The interactive picker needs a TTY; scripted callers must name a trace.\n if (!process.stdout.isTTY || !process.stdin.isTTY) {\n throw new TracevalsError(\n \"no trace given; pass a trace file or run `manni tracevals list`\",\n );\n }\n const { pickTrace } = await import(\"./trace/picker.js\");\n trace = await pickTrace();\n }\n const { report, rendered } = await runRun({ ...shared, tracePath: trace });\n console.log(rendered);\n process.exitCode = report.exitCode;\n}\n\n/**\n * Flags shared by `run` and `calibrate`. `--history` is run-only: calibration\n * is a measurement of a corpus, not a point in one session's timeline, and an\n * accepted flag that quietly does nothing is worse than an absent one.\n */\nfunction addRunFlags(\n cmd: Command,\n options: { history?: boolean; formats?: readonly ReportFormat[] } = {},\n): Command {\n const withHistory = options.history !== false;\n const formats = options.formats ?? REPORT_FORMATS;\n const base = addConfigFlags(cmd)\n .option(\n \"--project <dir>\",\n \"artifact-lookup root (overrides the trace's recorded cwd)\",\n )\n .option(\n \"--provider <name>\",\n \"Judge provider: auto (default) | anthropic | openai | claude-cli | llama-cpp\",\n )\n .option(\n \"--model <model>\",\n \"Model override; needs a named provider, from here or config\",\n )\n .option(\"--local\", LOCAL_FLAG_HELP)\n // `Number`, not `parseInt`: parseInt truncates, so `--runs 1.5` would be\n // silently accepted as 1 and `--runs 1e3` as 1. `whole()` below refuses\n // what Number keeps.\n .option(\"--runs <n>\", \"ensemble runs per eval\", (v) => Number(v))\n .option(\"--deterministic-only\", \"skip LLM-judged evals\")\n .option(\n \"--offline\",\n \"never fetch a remote manifest; read external metadata from local manifests\",\n )\n .option(\"--no-cache\", \"bypass the judge cache\")\n .option(\n \"--max-turns <n>\",\n \"Stop after this many ensemble runs (a cached ensemble costs none)\",\n (v) => Number(v),\n )\n .option(\n \"-f, --format <format>\",\n `Output format: ${formats.join(\" | \")}`,\n parseFormatArg(\"--format\", formats),\n \"pretty\" as ReportFormat,\n )\n .option(\"-o, --output <file>\", \"also write the report to a file\")\n .option(\n \"--report-unused-artifacts\",\n \"list every skill and agent the session was offered and never used\",\n )\n .option(\"--fail-on-review\", \"Exit 1 when any eval lands in the human-review zone (the default)\")\n .option(\"--no-fail-on-review\", \"Do not fail the run on evals left for human review\")\n // `<kind>`, not `<kind...>`: a variadic option greedily eats the\n // positional `[traces...]` that follow it. Repeat the flag instead.\n .option(\n \"--allow-execution <kind>\",\n \"Run only these execution grants (repeatable): frontmatter-commands\",\n collectGrant,\n [],\n )\n .option(\"--no-execution\", \"Clear every execution grant for this run\")\n .option(\n \"--require <module>\",\n \"load a grader plugin; repeatable, and added to config plugins\",\n collect,\n [],\n )\n .option(\"--all-projects\", \"evaluate every project's traces in the session store\")\n .option(\n \"--newer-than <duration>\",\n \"only traces modified within this window, such as 30m, 24h, 7d or 2w\",\n )\n .option(\"--limit <n>\", \"maximum traces to evaluate\", (v) => Number(v));\n return withHistory\n ? base.option(\n \"--history\",\n \"append to history and compare with the previous run\",\n )\n : base;\n}\n\naddRunFlags(\n // No `isDefault` (proposal 0034): `run` is a verb, so a bare\n // `manni tracevals` prints the help and exits 2, and a trace path with no\n // verb is commander's unknown-command refusal rather than a silent run.\n program\n .command(\"run [traces...]\")\n .description(\n \"Evaluate one or more traces against the skills and instructions they used\",\n ),\n)\n // Run-only, and single-trace-only: a manifest belongs to exactly one session\n // (ADR 01024). A corpus still picks one up per trace by convention — this\n // flag is for naming one outright, which only a single trace can mean.\n .option(\n \"--manifest <file>\",\n \"session manifest to compare artifacts against; without it one is looked for beside the trace and under the project\",\n )\n .action(async (traces: string[], opts: RunFlags, command: Command) => {\n try {\n await executeRun(traces, opts, colorFor(command, process.stdout.isTTY));\n } catch (e) {\n fail(e);\n }\n });\n\n// `calibrate` shares `run`'s flags because it *is* a run — plus the labels it\n// is measured against. Kept a separate command rather than a flag on `run`:\n// the report answers a different question and carries a different shape, and\n// a script must be able to tell which it is asking for (ADR 01022).\naddRunFlags(\n program\n .command(\"calibrate [traces...]\")\n .description(\n \"Measure judged and graded verdicts against a labels file: false passes, false fails, and review volume\",\n )\n .option(\n \"--labels <file>\",\n \"calibration labels sidecar (default: calibrate.labels)\",\n )\n .option(\n \"--sweep\",\n \"re-score the corpus across the configured grid of zones and ensemble sizes, from cached verdicts\",\n )\n .option(\"--max-false-pass <n>\", \"exit 1 above this many false passes\", (v) =>\n Number(v),\n )\n .option(\"--max-false-fail <n>\", \"exit 1 above this many false fails\", (v) =>\n Number(v),\n )\n .option(\n \"--max-review <n>\",\n \"exit 1 above this many needs-review outcomes\",\n (v) => Number(v),\n ),\n { history: false, formats: CALIBRATE_FORMATS },\n).action(\n async (\n traces: string[],\n opts: RunFlags & {\n labels?: string;\n sweep?: boolean;\n maxFalsePass?: number;\n maxFalseFail?: number;\n maxReview?: number;\n },\n command: Command,\n ) => {\n try {\n const shared = {\n ...sharedRunOptions(opts),\n color: colorFor(command, process.stdout.isTTY),\n };\n // A threshold that never trips looks exactly like a threshold that held.\n whole(\"--max-false-pass\", opts.maxFalsePass, 0);\n whole(\"--max-false-fail\", opts.maxFalseFail, 0);\n whole(\"--max-review\", opts.maxReview, 0);\n\n const { runCalibrate } = await import(\"./commands/calibrate.js\");\n const { report, rendered } = await runCalibrate({\n ...shared,\n ...(traces.length > 0 ? { traces } : {}),\n ...(opts.labels !== undefined ? { labels: opts.labels } : {}),\n ...(opts.sweep !== undefined ? { sweep: opts.sweep } : {}),\n ...(opts.maxFalsePass !== undefined\n ? { maxFalsePass: opts.maxFalsePass }\n : {}),\n ...(opts.maxFalseFail !== undefined\n ? { maxFalseFail: opts.maxFalseFail }\n : {}),\n ...(opts.maxReview !== undefined ? { maxReview: opts.maxReview } : {}),\n });\n console.log(rendered);\n process.exitCode = report.exitCode;\n } catch (e) {\n fail(e);\n }\n },\n);\n\naddConfigFlags(\n program\n .command(\"fill [paths...]\")\n .description(\n \"Propose evals for skills, agent definitions, and project rules, and write those above the confidence threshold\",\n ),\n)\n .option(\"--project <dir>\", \"project root to scan (default: current directory)\")\n // Repeatable, one value per occurrence, never split on commas — the family's\n // one-separator-per-list rule. It narrows what `fill` scans; there is no\n // `--collection`, because a docs collection is not an artifact set.\n .option(\"--exclude <glob>\", \"Glob to exclude (repeatable)\", collect, [])\n .option(\"--dry-run\", \"report proposals without writing them\")\n .option(\n \"--confidence <n>\",\n \"minimum confidence to write (0-1)\",\n (v) => parseFloat(v),\n )\n .option(\n \"--max-evals <n>\",\n \"maximum evals per artifact, including existing ones\",\n (v) => Number(v),\n )\n .option(\n \"--max-turns <n>\",\n \"Stop after this many inference calls (a cached artifact costs none)\",\n (v) => Number(v),\n )\n .option(\"--no-cache\", \"bypass the proposal cache\")\n .option(\n \"--provider <name>\",\n \"Provider: auto (default) | anthropic | openai | claude-cli | llama-cpp\",\n )\n .option(\n \"--model <model>\",\n \"Model override; needs a named provider, from here or config\",\n )\n .option(\"--local\", LOCAL_FLAG_HELP)\n .option(\n \"--offline\",\n \"never fetch a remote manifest; read external metadata from local manifests\",\n )\n .option(\n \"--require <module>\",\n \"load a grader plugin; repeatable, and added to config plugins\",\n collect,\n [],\n )\n .option(\n \"-f, --format <format>\",\n `Output format: ${SUMMARY_FORMATS.join(\" | \")}`,\n parseFormatArg(\"--format\", SUMMARY_FORMATS),\n \"pretty\" as SummaryFormat,\n )\n .action(async (paths: string[], opts: ConfigFlags & {\n project?: string;\n exclude?: string[];\n dryRun?: boolean;\n confidence?: number;\n maxEvals?: number;\n maxTurns?: number;\n cache?: boolean;\n provider?: string;\n model?: string;\n local?: boolean;\n offline?: boolean;\n require?: string[];\n format?: SummaryFormat;\n }, command: Command) => {\n try {\n numeric(\"--confidence\", opts.confidence, 0, 1);\n whole(\"--max-evals\", opts.maxEvals, 1);\n whole(\"--max-turns\", opts.maxTurns, 1);\n\n const { report, rendered } = await runFill({\n ...configOptions(opts),\n ...(paths.length > 0 ? { paths } : {}),\n ...(opts.project !== undefined ? { project: opts.project } : {}),\n ...(opts.exclude !== undefined ? { exclude: opts.exclude } : {}),\n ...(opts.dryRun !== undefined ? { dryRun: opts.dryRun } : {}),\n ...(opts.confidence !== undefined ? { confidence: opts.confidence } : {}),\n ...(opts.maxEvals !== undefined ? { maxEvals: opts.maxEvals } : {}),\n ...(opts.maxTurns !== undefined ? { maxTurns: opts.maxTurns } : {}),\n ...(opts.cache === false ? { noCache: true } : {}),\n ...(opts.provider !== undefined ? { provider: opts.provider } : {}),\n ...(opts.model !== undefined ? { model: opts.model } : {}),\n ...(opts.local !== undefined ? { local: opts.local } : {}),\n ...(opts.offline === true ? { offline: true } : {}),\n ...(opts.require !== undefined ? { require: opts.require } : {}),\n // P1 (proposal 0047): offered only on a terminal, where there is\n // someone to answer. Off one the block goes to the artifact and the\n // W1 line says so.\n confirm: terminalConfirm(),\n onNotice: notice,\n onRelocated: (result) => {\n const manifests = result.manifests.map((m) => m.file).join(\", \");\n notice(`moved ${String(result.summary.moved)} value(s) into ${manifests}.`);\n },\n color: colorFor(command, process.stdout.isTTY),\n });\n console.log(\n opts.format === \"json\" ? JSON.stringify(report, null, 2) : rendered,\n );\n process.exitCode = report.exitCode;\n } catch (e) {\n fail(e);\n }\n });\n\n// The one write path `run` never takes (ADR 01024). Meant for a `SessionStart`\n// hook, which is why it reads its payload on stdin and — in that mode — writes\n// its report to stderr: a SessionStart hook's stdout becomes model context.\naddConfigFlags(\n program\n .command(\"capture\")\n .description(\n \"Record a session manifest: sha256 of every instruction artifact plus the git SHA, read from a Claude Code hook payload on stdin\",\n ),\n)\n .option(\"--project <dir>\", \"project root to scan (default: the payload's cwd)\")\n .option(\"--session-id <id>\", \"session id (default: the payload's session_id)\")\n .option(\"-o, --out <file>\", \"write here instead of the configured directory\")\n .option(\n \"-f, --format <format>\",\n `Output format: ${SUMMARY_FORMATS.join(\" | \")}`,\n parseFormatArg(\"--format\", SUMMARY_FORMATS),\n \"pretty\" as SummaryFormat,\n )\n .action(async (opts: ConfigFlags & {\n project?: string;\n sessionId?: string;\n out?: string;\n format?: SummaryFormat;\n }) => {\n try {\n const { runCapture } = await import(\"./commands/capture.js\");\n const result = await runCapture({\n version,\n ...configOptions(opts),\n ...(opts.project !== undefined ? { project: opts.project } : {}),\n ...(opts.sessionId !== undefined ? { sessionId: opts.sessionId } : {}),\n ...(opts.out !== undefined ? { out: opts.out } : {}),\n format: opts.format ?? \"pretty\",\n });\n if (result.stdout !== \"\") console.log(result.stdout);\n // Hook mode's report, through the family's stderr writer rather than\n // `console.error`, so the `manni: ` prefix comes from `programName()`\n // and is never hand-spelled. `notice`, not `warn`: the report says what\n // this run did, so it is said every time rather than deduplicated.\n if (result.stderr !== \"\") notice(result.stderr);\n process.exitCode = result.exitCode;\n } catch (e) {\n fail(e);\n }\n });\n\n// Proposal 0079. `prepare` is meant for a SessionStart hook as `capture` is,\n// so under an envelope its report goes to stderr; a SessionStart hook's\n// stdout becomes model context.\naddConfigFlags(\n program\n .command(\"prepare\")\n .description(\n \"Fetch the local models judging needs and extract the rules of every file that applies to every session\",\n ),\n)\n .option(\"--project <dir>\", \"project root (default: the payload's cwd, else the current directory)\")\n .option(\"--no-cache\", \"extract again, even from cached sources\")\n .option(\"--offline\", \"refuse network providers, so only local models are fetched\")\n .option(\n \"-f, --format <format>\",\n `Output format: ${SUMMARY_FORMATS.join(\" | \")}`,\n parseFormatArg(\"--format\", SUMMARY_FORMATS),\n \"pretty\" as SummaryFormat,\n )\n .action(async (opts: ConfigFlags & {\n project?: string;\n cache?: boolean;\n offline?: boolean;\n format?: SummaryFormat;\n }) => {\n try {\n const { runPrepare } = await import(\"./commands/prepare.js\");\n const result = await runPrepare({\n ...configOptions(opts),\n ...(opts.project !== undefined ? { project: opts.project } : {}),\n ...(opts.cache === false ? { noCache: true } : {}),\n ...(opts.offline === true ? { offline: true } : {}),\n format: opts.format ?? \"pretty\",\n });\n if (result.stdout !== \"\") console.log(result.stdout);\n if (result.stderr !== \"\") notice(result.stderr);\n process.exitCode = result.exitCode;\n } catch (e) {\n fail(e);\n }\n });\n\n// `[traces...]` rather than `<trace>`, so a missing or second trace gets the\n// tool's own message and exit 2 instead of commander's.\naddConfigFlags(\n program\n .command(\"check [traces...]\")\n .description(\n \"Judge the last turn of one session against the rules that governed it\",\n ),\n)\n .option(\"--project <dir>\", \"project root for resolving sources (default: the trace's recorded cwd)\")\n .option(\n \"--provider <name>\",\n \"Judge provider: auto (default) | anthropic | openai | claude-cli | jev | llama-cpp\",\n )\n .option(\"--model <model>\", \"Judge model; needs a named provider, from here or config\")\n .option(\"--local\", LOCAL_FLAG_HELP)\n .option(\"--runs <n>\", \"judge calls per rule (overrides judge.ensembleRuns)\", (v) => Number(v))\n .option(\"--no-cache\", \"bypass the rules cache and the verdict cache\")\n .option(\"--offline\", \"refuse network providers; judge and extract with local models only\")\n .option(\n \"-f, --format <format>\",\n `Output format: ${SUMMARY_FORMATS.join(\" | \")}`,\n parseFormatArg(\"--format\", SUMMARY_FORMATS),\n \"pretty\" as SummaryFormat,\n )\n .option(\"-o, --output <file>\", \"also write the report to a file\")\n .action(async (traces: string[], opts: ConfigFlags & {\n project?: string;\n provider?: string;\n model?: string;\n local?: boolean;\n runs?: number;\n cache?: boolean;\n offline?: boolean;\n format?: SummaryFormat;\n output?: string;\n }, command: Command) => {\n try {\n const trace = traces[0];\n if (trace === undefined) {\n throw new TracevalsError(\"no trace given; pass a trace file or run manni tracevals list\");\n }\n if (traces.length > 1) {\n throw new TracevalsError(`tracevals check takes one trace, got ${String(traces.length)}`);\n }\n whole(\"--runs\", opts.runs, 1);\n const { runCheck } = await import(\"./commands/check.js\");\n const { report, rendered } = await runCheck({\n ...configOptions(opts),\n tracePath: trace,\n ...(opts.project !== undefined ? { project: opts.project } : {}),\n ...(opts.provider !== undefined ? { provider: opts.provider } : {}),\n ...(opts.model !== undefined ? { model: opts.model } : {}),\n ...(opts.local !== undefined ? { local: opts.local } : {}),\n ...(opts.runs !== undefined ? { runs: opts.runs } : {}),\n ...(opts.cache === false ? { noCache: true } : {}),\n ...(opts.offline === true ? { offline: true } : {}),\n format: opts.format ?? \"pretty\",\n ...(opts.output !== undefined ? { output: opts.output } : {}),\n color: colorFor(command, process.stdout.isTTY),\n });\n console.log(rendered);\n process.exitCode = report.exitCode;\n } catch (e) {\n fail(e);\n }\n });\n\n// No `-c`/`--no-config`: `release` reads no config, only the envelope.\nprogram\n .command(\"release\")\n .description(\"Return a session's lease on the model host, or with --all stop the host\")\n .option(\"--all\", \"drop every lease, unload every model and stop the host\")\n .option(\n \"-f, --format <format>\",\n `Output format: ${SUMMARY_FORMATS.join(\" | \")}`,\n parseFormatArg(\"--format\", SUMMARY_FORMATS),\n \"pretty\" as SummaryFormat,\n )\n .action(async (opts: { all?: boolean; format?: SummaryFormat }) => {\n try {\n const { runRelease } = await import(\"./commands/release.js\");\n const result = await runRelease({\n ...(opts.all === true ? { all: true } : {}),\n format: opts.format ?? \"pretty\",\n });\n if (result.stdout !== \"\") console.log(result.stdout);\n process.exitCode = result.exitCode;\n } catch (e) {\n fail(e);\n }\n });\n\nprogram\n .command(\"list\")\n .description(\"List discoverable traces (Claude Code session files)\")\n // The long spellings only, matching `run`: a short form that exists on one\n // verb and not on its sibling is exactly the drift \"commands must have\n // parallel behaviors\" exists to prevent.\n .option(\n \"--project <dir>\",\n \"project directory to scope to (default: current directory)\",\n )\n .option(\"--all-projects\", \"scan every project in the session store\")\n .option(\n \"--newer-than <duration>\",\n \"only traces modified within this window, such as 30m, 24h, 7d or 2w\",\n )\n .option(\"--limit <n>\", \"maximum traces to list\", (v) => Number(v))\n .option(\n \"-f, --format <format>\",\n `Output format: ${SUMMARY_FORMATS.join(\" | \")}`,\n parseFormatArg(\"--format\", SUMMARY_FORMATS),\n \"pretty\" as SummaryFormat,\n )\n // No `-c`/`--no-config`: `list` enumerates the session store and reads no\n // config at all, and an accepted flag that quietly does nothing is worse\n // than an absent one.\n .action(async (opts: {\n project?: string;\n allProjects?: boolean;\n newerThan?: string;\n limit?: number;\n format?: SummaryFormat;\n }, command: Command) => {\n try {\n // The same footgun as `run --limit`: `slice(0, -1)` lists everything but\n // the oldest, and reads as a shorter store rather than as a bad flag.\n whole(\"--limit\", opts.limit, 1);\n const run = await runList({\n project: opts.project,\n allProjects: opts.allProjects,\n ...(opts.newerThan !== undefined ? { newerThan: opts.newerThan } : {}),\n limit: opts.limit,\n });\n console.log(\n opts.format === \"json\"\n ? JSON.stringify(run, null, 2)\n : renderList(run, { color: colorFor(command, process.stdout.isTTY) }),\n );\n } catch (e) {\n fail(e);\n }\n });\n\nreturn program;\n}\n"],"mappings":"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","names":["report","rendered"]}
|
|
1
|
+
{"version":3,"sources":["../src/tracevals/cli.ts"],"sourcesContent":["/**\n * The tracevals program. Named `tracevals` because that is where it is\n * mounted (`manni tracevals …`); `src/cli.ts` adds it to the umbrella and\n * runs it. Thin commander wrapper; all behavior lives in commands.\n */\nimport { Command } from \"commander\";\nimport pkg from \"../../package.json\" with { type: \"json\" };\nimport { collect, configOption } from \"../shared/cli-options.js\";\nimport { LOCAL_FLAG_HELP } from \"../shared/providers.js\";\nimport { fail } from \"../shared/run.js\";\nimport { terminalConfirm } from \"../shared/prompt.js\";\nimport { colorFor } from \"../shared/color.js\";\nimport { notice } from \"../shared/warn.js\";\nimport { renderList, runList } from \"./commands/list.js\";\nimport { runFill } from \"./commands/fill.js\";\nimport { runRun } from \"./commands/run.js\";\nimport { TracevalsError } from \"./types.js\";\nimport { allowExecutionMessage, isExecutionGrant } from \"../shared/execution.js\";\nimport {\n CALIBRATE_FORMATS,\n REPORT_FORMATS,\n SUMMARY_FORMATS,\n parseFormat,\n type ReportFormat,\n type SummaryFormat,\n} from \"./reporters/index.js\";\n\nconst { version } = pkg;\n\nexport function buildProgram(): Command {\nconst program = new Command();\n\nprogram\n .name(\"tracevals\")\n .description(\n \"Deterministic and LLM-as-judge adherence evals for AI agent session traces.\",\n )\n .version(version)\n .option(\"--no-color\", \"disable colored output\")\n // A pointer, not the whole help screen: the message that precedes it\n // already names the offending flag.\n .showHelpAfterError(\"(add --help for usage)\")\n // MUST come before the `.command()` calls below. `copyInheritedSettings`\n // copies `_exitCallback` by value at subcommand-creation time, so an\n // `exitOverride()` installed afterwards leaves every subcommand calling\n // `process.exit(1)` on a parse error, which is a usage error owed exit 2.\n .exitOverride();\n\ninterface ConfigFlags {\n /** `-c <path>` gives a string, `--no-config` gives false, neither gives undefined. */\n config?: string | boolean;\n}\n\ninterface RunFlags extends ConfigFlags {\n project?: string;\n provider?: string;\n model?: string;\n local?: boolean;\n offline?: boolean;\n runs?: number;\n deterministicOnly?: boolean;\n cache?: boolean;\n maxTurns?: number;\n format?: ReportFormat;\n output?: string;\n history?: boolean;\n failOnReview?: boolean;\n allowExecution?: string[];\n execution?: boolean;\n require?: string[];\n reportUnusedArtifacts?: boolean;\n manifest?: string;\n allProjects?: boolean;\n newerThan?: string;\n limit?: number;\n}\n\n/**\n * Repeatable execution grant, validated on the way in. An unknown value is a\n * usage error rather than a grant that quietly matches nothing.\n */\nfunction collectGrant(value: string, previous: string[]): string[] {\n if (!isExecutionGrant(value)) fail(new TracevalsError(allowExecutionMessage(value)));\n return [...previous, value];\n}\n\n/**\n * `-c, --config <path>` and `--no-config`, on every verb that reads config.\n *\n * Declared once so the four cannot drift apart on a name or a description,\n * the way docevals' `documentInputs()` does it. `list` is the one verb without\n * them: it enumerates the session store and reads no config at all, and an\n * accepted flag that quietly does nothing is worse than an absent one.\n */\nfunction addConfigFlags(cmd: Command): Command {\n return cmd\n .option(\"-c, --config <path>\", \"Path to manni.config.yaml\")\n .option(\"--no-config\", \"Ignore any discovered config file\");\n}\n\n/** The config flags as the command cores take them. */\nfunction configOptions(opts: ConfigFlags): {\n config?: string;\n noConfig?: boolean;\n} {\n const { configPath, noConfig } = configOption(opts.config);\n return {\n ...(configPath === undefined ? {} : { config: configPath }),\n ...(noConfig === true ? { noConfig } : {}),\n };\n}\n\n/**\n * Commander argument parser for `-f/--format`. Routes through `fail()` for the\n * reason the numeric checks below do: commander only special-cases\n * InvalidArgumentError, so any other exception escapes `program.parse()`\n * uncaught — a stack trace and exit 1, when a bad flag owes exit 2.\n */\nfunction parseFormatArg<T extends string>(name: string, allowed: readonly T[]) {\n return (value: string): T => {\n try {\n return parseFormat(value, allowed, name);\n } catch (e) {\n fail(e);\n }\n };\n}\n\nconst range = (min: number, max: number): string =>\n Number.isFinite(max) ? `between ${min} and ${max}` : `of at least ${min}`;\n\n/**\n * A numeric flag, checked before anything reads it.\n *\n * `parseFloat(\"abc\")` is NaN, and every comparison against NaN is false — so a\n * flag that failed to parse does **not** fall back to the config. `undefined`\n * is what defers to the config, and NaN is not undefined: it survives the `??`\n * overlay and lands in the runtime as a limit that can never be reached. A\n * budget of NaN bills without a ceiling while the report still claims one,\n * which is the most expensive way for a safety limit to fail. Range checks\n * therefore test for a *finite* number, not only for the range.\n */\nfunction numeric(\n name: string,\n value: number | undefined,\n min: number,\n max: number = Number.POSITIVE_INFINITY,\n): void {\n if (value === undefined) return;\n if (Number.isFinite(value) && value >= min && value <= max) return;\n throw new TracevalsError(\n `${name} must be a number ${range(min, max)}, got ${value}`,\n );\n}\n\n/**\n * The same for a count. Kept apart from `numeric` because a fraction is never\n * meant here: `--limit 2.5` and `--limit -1` both reach `slice(0, n)`, where\n * the negative one silently evaluates every trace except the oldest.\n */\nfunction whole(\n name: string,\n value: number | undefined,\n min: number,\n max: number = Number.POSITIVE_INFINITY,\n): void {\n if (value === undefined) return;\n if (Number.isInteger(value) && value >= min && value <= max) return;\n throw new TracevalsError(\n `${name} must be a whole number ${range(min, max)}, got ${value}`,\n );\n}\n\n/**\n * The single mapping from `addRunFlags`' options onto the shared run options.\n *\n * `run` and `calibrate` accept the same flags, and `calibrate` used to\n * hand-copy the list, which is how it came to accept a flag and drop it on\n * the floor. `addRunFlags`' own docstring says an accepted flag that\n * quietly does nothing is worse than an absent one, so there is now one place\n * to add a flag rather than two places to remember.\n *\n * Validation lives here for the same reason: both commands get it, or neither.\n */\nfunction sharedRunOptions(opts: RunFlags) {\n whole(\"--runs\", opts.runs, 1);\n whole(\"--limit\", opts.limit, 1);\n whole(\"--max-turns\", opts.maxTurns, 1);\n\n return {\n ...configOptions(opts),\n project: opts.project,\n provider: opts.provider,\n model: opts.model,\n local: opts.local,\n // `undefined` rather than `false` when absent, so a future config\n // `offline:` still decides on a run where the flag was never typed.\n offline: opts.offline ? true : undefined,\n runs: opts.runs,\n deterministicOnly: opts.deterministicOnly,\n noCache: opts.cache === false,\n maxTurns: opts.maxTurns,\n format: opts.format ?? \"pretty\",\n output: opts.output,\n // Undefined when neither spelling is passed, so the config still decides.\n // Both spellings are declared for precisely that reason: commander\n // defaults a lone `--no-x` to `true`, which makes the config's own value\n // unreachable from the command line.\n failOnReview: opts.failOnReview,\n // Commander's default is `[]`, which is \"no flag\", not \"run nothing\": only\n // a list someone typed narrows the run, and `--no-execution` runs none.\n ...(opts.execution === false\n ? { allowExecution: [] }\n : (opts.allowExecution ?? []).length > 0\n ? { allowExecution: opts.allowExecution }\n : {}),\n reportUnusedArtifacts: opts.reportUnusedArtifacts,\n ...(opts.require !== undefined ? { require: opts.require } : {}),\n ...(opts.allProjects !== undefined ? { allProjects: opts.allProjects } : {}),\n ...(opts.newerThan !== undefined ? { newerThan: opts.newerThan } : {}),\n ...(opts.limit !== undefined ? { limit: opts.limit } : {}),\n };\n}\n\nasync function executeRun(traces: string[], opts: RunFlags, color: boolean) {\n const shared = {\n ...sharedRunOptions(opts),\n color,\n // Run-only, both of them: `--history` is a point in one session's\n // timeline, and a manifest belongs to exactly one session (ADR 01024).\n history: opts.history,\n ...(opts.manifest !== undefined ? { manifest: opts.manifest } : {}),\n };\n\n // What decides the report shape is *how traces were selected*, not how many\n // came back. One named trace is a `RunReport`, byte for byte as before; a\n // discovery selector is a `BatchReport` even when it matches exactly one, so\n // a script piping `--format json` gets a stable shape (ADR 01018).\n const selecting =\n opts.allProjects === true ||\n opts.newerThan !== undefined ||\n opts.limit !== undefined;\n\n if (traces.length > 1 || selecting) {\n if (opts.manifest !== undefined) {\n // Each trace finds its own manifest by convention; one named file cannot\n // be evidence about more than the session it was captured for.\n throw new TracevalsError(\n \"--manifest names one session's manifest, so it cannot be used with a corpus; drop it and each trace will find its own\",\n );\n }\n const { runBatch } = await import(\"./commands/batch.js\");\n const { report, rendered } = await runBatch({\n ...shared,\n ...(traces.length > 0 ? { traces } : {}),\n });\n console.log(rendered);\n process.exitCode = report.exitCode;\n return;\n }\n\n let trace = traces[0];\n if (trace === undefined) {\n // The interactive picker needs a TTY; scripted callers must name a trace.\n if (!process.stdout.isTTY || !process.stdin.isTTY) {\n throw new TracevalsError(\n \"no trace given; pass a trace file or run `manni tracevals list`\",\n );\n }\n const { pickTrace } = await import(\"./trace/picker.js\");\n trace = await pickTrace();\n }\n const { report, rendered } = await runRun({ ...shared, tracePath: trace });\n console.log(rendered);\n process.exitCode = report.exitCode;\n}\n\n/**\n * Flags shared by `run` and `calibrate`. `--history` is run-only: calibration\n * is a measurement of a corpus, not a point in one session's timeline, and an\n * accepted flag that quietly does nothing is worse than an absent one.\n */\nfunction addRunFlags(\n cmd: Command,\n options: { history?: boolean; formats?: readonly ReportFormat[] } = {},\n): Command {\n const withHistory = options.history !== false;\n const formats = options.formats ?? REPORT_FORMATS;\n const base = addConfigFlags(cmd)\n .option(\n \"--project <dir>\",\n \"artifact-lookup root (overrides the trace's recorded cwd)\",\n )\n .option(\n \"--provider <name>\",\n \"Judge provider: auto (default) | anthropic | openai | claude-cli | llama-cpp\",\n )\n .option(\n \"--model <model>\",\n \"Model override; needs a named provider, from here or config\",\n )\n .option(\"--local\", LOCAL_FLAG_HELP)\n // `Number`, not `parseInt`: parseInt truncates, so `--runs 1.5` would be\n // silently accepted as 1 and `--runs 1e3` as 1. `whole()` below refuses\n // what Number keeps.\n .option(\"--runs <n>\", \"ensemble runs per eval\", (v) => Number(v))\n .option(\"--deterministic-only\", \"skip LLM-judged evals\")\n .option(\n \"--offline\",\n \"never fetch a remote manifest; read external metadata from local manifests\",\n )\n .option(\"--no-cache\", \"bypass the judge cache\")\n .option(\n \"--max-turns <n>\",\n \"Stop after this many ensemble runs (a cached ensemble costs none)\",\n (v) => Number(v),\n )\n .option(\n \"-f, --format <format>\",\n `Output format: ${formats.join(\" | \")}`,\n parseFormatArg(\"--format\", formats),\n \"pretty\" as ReportFormat,\n )\n .option(\"-o, --output <file>\", \"also write the report to a file\")\n .option(\n \"--report-unused-artifacts\",\n \"list every skill and agent the session was offered and never used\",\n )\n .option(\"--fail-on-review\", \"Exit 1 when any eval lands in the human-review zone (the default)\")\n .option(\"--no-fail-on-review\", \"Do not fail the run on evals left for human review\")\n // `<kind>`, not `<kind...>`: a variadic option greedily eats the\n // positional `[traces...]` that follow it. Repeat the flag instead.\n .option(\n \"--allow-execution <kind>\",\n \"Run only these execution grants (repeatable): frontmatter-commands\",\n collectGrant,\n [],\n )\n .option(\"--no-execution\", \"Clear every execution grant for this run\")\n .option(\n \"--require <module>\",\n \"load a grader plugin; repeatable, and added to config plugins\",\n collect,\n [],\n )\n .option(\"--all-projects\", \"evaluate every project's traces in the session store\")\n .option(\n \"--newer-than <duration>\",\n \"only traces modified within this window, such as 30m, 24h, 7d or 2w\",\n )\n .option(\"--limit <n>\", \"maximum traces to evaluate\", (v) => Number(v));\n return withHistory\n ? base.option(\n \"--history\",\n \"append to history and compare with the previous run\",\n )\n : base;\n}\n\naddRunFlags(\n // No `isDefault` (proposal 0034): `run` is a verb, so a bare\n // `manni tracevals` prints the help and exits 2, and a trace path with no\n // verb is commander's unknown-command refusal rather than a silent run.\n program\n .command(\"run [traces...]\")\n .description(\n \"Evaluate one or more traces against the skills and instructions they used\",\n ),\n)\n // Run-only, and single-trace-only: a manifest belongs to exactly one session\n // (ADR 01024). A corpus still picks one up per trace by convention — this\n // flag is for naming one outright, which only a single trace can mean.\n .option(\n \"--manifest <file>\",\n \"session manifest to compare artifacts against; without it one is looked for beside the trace and under the project\",\n )\n .action(async (traces: string[], opts: RunFlags, command: Command) => {\n try {\n await executeRun(traces, opts, colorFor(command, process.stdout.isTTY));\n } catch (e) {\n fail(e);\n }\n });\n\n// `calibrate` shares `run`'s flags because it *is* a run — plus the labels it\n// is measured against. Kept a separate command rather than a flag on `run`:\n// the report answers a different question and carries a different shape, and\n// a script must be able to tell which it is asking for (ADR 01022).\naddRunFlags(\n program\n .command(\"calibrate [traces...]\")\n .description(\n \"Measure judged and graded verdicts against a labels file: false passes, false fails, and review volume\",\n )\n .option(\n \"--labels <file>\",\n \"calibration labels sidecar (default: calibrate.labels)\",\n )\n .option(\n \"--sweep\",\n \"re-score the corpus across the configured grid of zones and ensemble sizes, from cached verdicts\",\n )\n .option(\"--max-false-pass <n>\", \"exit 1 above this many false passes\", (v) =>\n Number(v),\n )\n .option(\"--max-false-fail <n>\", \"exit 1 above this many false fails\", (v) =>\n Number(v),\n )\n .option(\n \"--max-review <n>\",\n \"exit 1 above this many needs-review outcomes\",\n (v) => Number(v),\n ),\n { history: false, formats: CALIBRATE_FORMATS },\n).action(\n async (\n traces: string[],\n opts: RunFlags & {\n labels?: string;\n sweep?: boolean;\n maxFalsePass?: number;\n maxFalseFail?: number;\n maxReview?: number;\n },\n command: Command,\n ) => {\n try {\n const shared = {\n ...sharedRunOptions(opts),\n color: colorFor(command, process.stdout.isTTY),\n };\n // A threshold that never trips looks exactly like a threshold that held.\n whole(\"--max-false-pass\", opts.maxFalsePass, 0);\n whole(\"--max-false-fail\", opts.maxFalseFail, 0);\n whole(\"--max-review\", opts.maxReview, 0);\n\n const { runCalibrate } = await import(\"./commands/calibrate.js\");\n const { report, rendered } = await runCalibrate({\n ...shared,\n ...(traces.length > 0 ? { traces } : {}),\n ...(opts.labels !== undefined ? { labels: opts.labels } : {}),\n ...(opts.sweep !== undefined ? { sweep: opts.sweep } : {}),\n ...(opts.maxFalsePass !== undefined\n ? { maxFalsePass: opts.maxFalsePass }\n : {}),\n ...(opts.maxFalseFail !== undefined\n ? { maxFalseFail: opts.maxFalseFail }\n : {}),\n ...(opts.maxReview !== undefined ? { maxReview: opts.maxReview } : {}),\n });\n console.log(rendered);\n process.exitCode = report.exitCode;\n } catch (e) {\n fail(e);\n }\n },\n);\n\naddConfigFlags(\n program\n .command(\"fill [paths...]\")\n .description(\n \"Propose evals for skills, agent definitions, and project rules, and write those above the confidence threshold\",\n ),\n)\n .option(\"--project <dir>\", \"project root to scan (default: current directory)\")\n // Repeatable, one value per occurrence, never split on commas — the family's\n // one-separator-per-list rule. It narrows what `fill` scans; there is no\n // `--collection`, because a docs collection is not an artifact set.\n .option(\"--exclude <glob>\", \"Glob to exclude (repeatable)\", collect, [])\n .option(\"--dry-run\", \"report proposals without writing them\")\n .option(\n \"--confidence <n>\",\n \"minimum confidence to write (0-1)\",\n (v) => parseFloat(v),\n )\n .option(\n \"--max-evals <n>\",\n \"maximum evals per artifact, including existing ones\",\n (v) => Number(v),\n )\n .option(\n \"--max-turns <n>\",\n \"Stop after this many inference calls (a cached artifact costs none)\",\n (v) => Number(v),\n )\n .option(\"--no-cache\", \"bypass the proposal cache\")\n .option(\n \"--provider <name>\",\n \"Provider: auto (default) | anthropic | openai | claude-cli | llama-cpp\",\n )\n .option(\n \"--model <model>\",\n \"Model override; needs a named provider, from here or config\",\n )\n .option(\"--local\", LOCAL_FLAG_HELP)\n .option(\n \"--offline\",\n \"never fetch a remote manifest; read external metadata from local manifests\",\n )\n .option(\n \"--require <module>\",\n \"load a grader plugin; repeatable, and added to config plugins\",\n collect,\n [],\n )\n .option(\n \"-f, --format <format>\",\n `Output format: ${SUMMARY_FORMATS.join(\" | \")}`,\n parseFormatArg(\"--format\", SUMMARY_FORMATS),\n \"pretty\" as SummaryFormat,\n )\n .action(async (paths: string[], opts: ConfigFlags & {\n project?: string;\n exclude?: string[];\n dryRun?: boolean;\n confidence?: number;\n maxEvals?: number;\n maxTurns?: number;\n cache?: boolean;\n provider?: string;\n model?: string;\n local?: boolean;\n offline?: boolean;\n require?: string[];\n format?: SummaryFormat;\n }, command: Command) => {\n try {\n numeric(\"--confidence\", opts.confidence, 0, 1);\n whole(\"--max-evals\", opts.maxEvals, 1);\n whole(\"--max-turns\", opts.maxTurns, 1);\n\n const { report, rendered } = await runFill({\n ...configOptions(opts),\n ...(paths.length > 0 ? { paths } : {}),\n ...(opts.project !== undefined ? { project: opts.project } : {}),\n ...(opts.exclude !== undefined ? { exclude: opts.exclude } : {}),\n ...(opts.dryRun !== undefined ? { dryRun: opts.dryRun } : {}),\n ...(opts.confidence !== undefined ? { confidence: opts.confidence } : {}),\n ...(opts.maxEvals !== undefined ? { maxEvals: opts.maxEvals } : {}),\n ...(opts.maxTurns !== undefined ? { maxTurns: opts.maxTurns } : {}),\n ...(opts.cache === false ? { noCache: true } : {}),\n ...(opts.provider !== undefined ? { provider: opts.provider } : {}),\n ...(opts.model !== undefined ? { model: opts.model } : {}),\n ...(opts.local !== undefined ? { local: opts.local } : {}),\n ...(opts.offline === true ? { offline: true } : {}),\n ...(opts.require !== undefined ? { require: opts.require } : {}),\n // P1 (proposal 0047): offered only on a terminal, where there is\n // someone to answer. Off one the block goes to the artifact and the\n // W1 line says so.\n confirm: terminalConfirm(),\n onNotice: notice,\n onRelocated: (result) => {\n const manifests = result.manifests.map((m) => m.file).join(\", \");\n notice(`moved ${String(result.summary.moved)} value(s) into ${manifests}.`);\n },\n color: colorFor(command, process.stdout.isTTY),\n });\n console.log(\n opts.format === \"json\" ? JSON.stringify(report, null, 2) : rendered,\n );\n process.exitCode = report.exitCode;\n } catch (e) {\n fail(e);\n }\n });\n\n// The one write path `run` never takes (ADR 01024). Meant for a `SessionStart`\n// hook, which is why it reads its payload on stdin and — in that mode — writes\n// its report to stderr: a SessionStart hook's stdout becomes model context.\naddConfigFlags(\n program\n .command(\"capture\")\n .description(\n \"Record a session manifest: sha256 of every instruction artifact plus the git SHA, read from a Claude Code hook payload on stdin\",\n ),\n)\n .option(\"--project <dir>\", \"project root to scan (default: the payload's cwd)\")\n .option(\"--session-id <id>\", \"session id (default: the payload's session_id)\")\n .option(\"-o, --out <file>\", \"write here instead of the configured directory\")\n .option(\n \"-f, --format <format>\",\n `Output format: ${SUMMARY_FORMATS.join(\" | \")}`,\n parseFormatArg(\"--format\", SUMMARY_FORMATS),\n \"pretty\" as SummaryFormat,\n )\n .action(async (opts: ConfigFlags & {\n project?: string;\n sessionId?: string;\n out?: string;\n format?: SummaryFormat;\n }) => {\n try {\n const { runCapture } = await import(\"./commands/capture.js\");\n const result = await runCapture({\n version,\n ...configOptions(opts),\n ...(opts.project !== undefined ? { project: opts.project } : {}),\n ...(opts.sessionId !== undefined ? { sessionId: opts.sessionId } : {}),\n ...(opts.out !== undefined ? { out: opts.out } : {}),\n format: opts.format ?? \"pretty\",\n });\n if (result.stdout !== \"\") console.log(result.stdout);\n // Hook mode's report, through the family's stderr writer rather than\n // `console.error`, so the `manni: ` prefix comes from `programName()`\n // and is never hand-spelled. `notice`, not `warn`: the report says what\n // this run did, so it is said every time rather than deduplicated.\n if (result.stderr !== \"\") notice(result.stderr);\n process.exitCode = result.exitCode;\n } catch (e) {\n fail(e);\n }\n });\n\n// Proposal 0079. `prepare` is meant for a SessionStart hook as `capture` is,\n// so under an envelope its report goes to stderr; a SessionStart hook's\n// stdout becomes model context.\naddConfigFlags(\n program\n .command(\"prepare\")\n .description(\n \"Fetch the local models judging needs and extract the rules of every file that applies to every session\",\n ),\n)\n .option(\"--project <dir>\", \"project root (default: the payload's cwd, else the current directory)\")\n .option(\"--no-cache\", \"extract again, even from cached sources\")\n .option(\"--offline\", \"refuse network providers, so only local models are fetched\")\n .option(\n \"-f, --format <format>\",\n `Output format: ${SUMMARY_FORMATS.join(\" | \")}`,\n parseFormatArg(\"--format\", SUMMARY_FORMATS),\n \"pretty\" as SummaryFormat,\n )\n .action(async (opts: ConfigFlags & {\n project?: string;\n cache?: boolean;\n offline?: boolean;\n format?: SummaryFormat;\n }) => {\n try {\n const { runPrepare } = await import(\"./commands/prepare.js\");\n const result = await runPrepare({\n ...configOptions(opts),\n ...(opts.project !== undefined ? { project: opts.project } : {}),\n ...(opts.cache === false ? { noCache: true } : {}),\n ...(opts.offline === true ? { offline: true } : {}),\n format: opts.format ?? \"pretty\",\n });\n if (result.stdout !== \"\") console.log(result.stdout);\n if (result.stderr !== \"\") notice(result.stderr);\n process.exitCode = result.exitCode;\n } catch (e) {\n fail(e);\n }\n });\n\n// `[traces...]` rather than `<trace>`, so a missing or second trace gets the\n// tool's own message and exit 2 instead of commander's.\naddConfigFlags(\n program\n .command(\"check [traces...]\")\n .description(\n \"Judge the last turn of one session against the rules that governed it\",\n ),\n)\n .option(\"--project <dir>\", \"project root for resolving sources (default: the trace's recorded cwd)\")\n .option(\n \"--provider <name>\",\n \"Judge provider: auto (default) | anthropic | openai | claude-cli | jev | llama-cpp\",\n )\n .option(\"--model <model>\", \"Judge model; needs a named provider, from here or config\")\n .option(\"--local\", LOCAL_FLAG_HELP)\n .option(\"--runs <n>\", \"judge calls per rule (overrides judge.ensembleRuns)\", (v) => Number(v))\n .option(\"--no-cache\", \"bypass the rules cache and the verdict cache\")\n .option(\"--offline\", \"refuse network providers; judge and extract with local models only\")\n .option(\n \"-f, --format <format>\",\n `Output format: ${SUMMARY_FORMATS.join(\" | \")}`,\n parseFormatArg(\"--format\", SUMMARY_FORMATS),\n \"pretty\" as SummaryFormat,\n )\n .option(\"-o, --output <file>\", \"also write the report to a file\")\n .action(async (traces: string[], opts: ConfigFlags & {\n project?: string;\n provider?: string;\n model?: string;\n local?: boolean;\n runs?: number;\n cache?: boolean;\n offline?: boolean;\n format?: SummaryFormat;\n output?: string;\n }, command: Command) => {\n try {\n const trace = traces[0];\n if (trace === undefined) {\n throw new TracevalsError(\"no trace given; pass a trace file or run manni tracevals list\");\n }\n if (traces.length > 1) {\n throw new TracevalsError(`tracevals check takes one trace, got ${String(traces.length)}`);\n }\n whole(\"--runs\", opts.runs, 1);\n const { runCheck } = await import(\"./commands/check.js\");\n const { report, rendered } = await runCheck({\n ...configOptions(opts),\n tracePath: trace,\n ...(opts.project !== undefined ? { project: opts.project } : {}),\n ...(opts.provider !== undefined ? { provider: opts.provider } : {}),\n ...(opts.model !== undefined ? { model: opts.model } : {}),\n ...(opts.local !== undefined ? { local: opts.local } : {}),\n ...(opts.runs !== undefined ? { runs: opts.runs } : {}),\n ...(opts.cache === false ? { noCache: true } : {}),\n ...(opts.offline === true ? { offline: true } : {}),\n format: opts.format ?? \"pretty\",\n ...(opts.output !== undefined ? { output: opts.output } : {}),\n color: colorFor(command, process.stdout.isTTY),\n });\n console.log(rendered);\n process.exitCode = report.exitCode;\n } catch (e) {\n fail(e);\n }\n });\n\n// No `-c`/`--no-config`: `release` reads no config, only the envelope.\nprogram\n .command(\"release\")\n .description(\"Return a session's lease on the model host, or with --all stop the host\")\n .option(\"--all\", \"drop every lease, unload every model and stop the host\")\n .option(\n \"-f, --format <format>\",\n `Output format: ${SUMMARY_FORMATS.join(\" | \")}`,\n parseFormatArg(\"--format\", SUMMARY_FORMATS),\n \"pretty\" as SummaryFormat,\n )\n .action(async (opts: { all?: boolean; format?: SummaryFormat }) => {\n try {\n const { runRelease } = await import(\"./commands/release.js\");\n const result = await runRelease({\n ...(opts.all === true ? { all: true } : {}),\n format: opts.format ?? \"pretty\",\n });\n if (result.stdout !== \"\") console.log(result.stdout);\n process.exitCode = result.exitCode;\n } catch (e) {\n fail(e);\n }\n });\n\nprogram\n .command(\"list\")\n .description(\"List discoverable traces (Claude Code session files)\")\n // The long spellings only, matching `run`: a short form that exists on one\n // verb and not on its sibling is exactly the drift \"commands must have\n // parallel behaviors\" exists to prevent.\n .option(\n \"--project <dir>\",\n \"project directory to scope to (default: current directory)\",\n )\n .option(\"--all-projects\", \"scan every project in the session store\")\n .option(\n \"--newer-than <duration>\",\n \"only traces modified within this window, such as 30m, 24h, 7d or 2w\",\n )\n .option(\"--limit <n>\", \"maximum traces to list\", (v) => Number(v))\n .option(\n \"-f, --format <format>\",\n `Output format: ${SUMMARY_FORMATS.join(\" | \")}`,\n parseFormatArg(\"--format\", SUMMARY_FORMATS),\n \"pretty\" as SummaryFormat,\n )\n // No `-c`/`--no-config`: `list` enumerates the session store and reads no\n // config at all, and an accepted flag that quietly does nothing is worse\n // than an absent one.\n .action(async (opts: {\n project?: string;\n allProjects?: boolean;\n newerThan?: string;\n limit?: number;\n format?: SummaryFormat;\n }, command: Command) => {\n try {\n // The same footgun as `run --limit`: `slice(0, -1)` lists everything but\n // the oldest, and reads as a shorter store rather than as a bad flag.\n whole(\"--limit\", opts.limit, 1);\n const run = await runList({\n project: opts.project,\n allProjects: opts.allProjects,\n ...(opts.newerThan !== undefined ? { newerThan: opts.newerThan } : {}),\n limit: opts.limit,\n });\n console.log(\n opts.format === \"json\"\n ? JSON.stringify(run, null, 2)\n : renderList(run, { color: colorFor(command, process.stdout.isTTY) }),\n );\n } catch (e) {\n fail(e);\n }\n });\n\nreturn program;\n}\n"],"mappings":"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","names":["report","rendered"]}
|
|
@@ -22,12 +22,12 @@ import {
|
|
|
22
22
|
matchesFileGlob,
|
|
23
23
|
readConfigFile,
|
|
24
24
|
selectCollections
|
|
25
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-QLWC7MKD.js";
|
|
26
26
|
import "./chunk-HX44GB4Z.js";
|
|
27
27
|
import "./chunk-QCHVR4ZM.js";
|
|
28
28
|
import {
|
|
29
29
|
package_default
|
|
30
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-2MJ62AYQ.js";
|
|
31
31
|
import {
|
|
32
32
|
programName
|
|
33
33
|
} from "./chunk-OWBRDNRZ.js";
|
|
@@ -1202,4 +1202,4 @@ export {
|
|
|
1202
1202
|
resolveCrawl,
|
|
1203
1203
|
resolveMaxPages
|
|
1204
1204
|
};
|
|
1205
|
-
//# sourceMappingURL=cli-
|
|
1205
|
+
//# sourceMappingURL=cli-ONTC5PKT.js.map
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import {
|
|
3
3
|
renderCheck,
|
|
4
4
|
runCheck
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-HQR2ZBHW.js";
|
|
6
6
|
import {
|
|
7
7
|
EXPORT_TARGETS,
|
|
8
8
|
SEARCH_MODES,
|
|
@@ -19,34 +19,37 @@ import {
|
|
|
19
19
|
runSearch,
|
|
20
20
|
runStats,
|
|
21
21
|
runTraverse
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-2DRHT73U.js";
|
|
23
23
|
import {
|
|
24
24
|
DEFAULT_EXTENSIONS,
|
|
25
25
|
STDIN,
|
|
26
26
|
assertInputFormat,
|
|
27
27
|
runBuild
|
|
28
|
-
} from "./chunk-
|
|
29
|
-
import "./chunk-
|
|
28
|
+
} from "./chunk-2IAZEB45.js";
|
|
29
|
+
import "./chunk-EFW7CAG4.js";
|
|
30
30
|
import {
|
|
31
31
|
ALL_FILL_FIELDS,
|
|
32
32
|
CONFIG_SECTION,
|
|
33
33
|
DEFAULT_CONFIG_FILENAME,
|
|
34
34
|
GraphError
|
|
35
|
-
} from "./chunk-
|
|
36
|
-
import "./chunk-
|
|
35
|
+
} from "./chunk-JROBZ7JA.js";
|
|
36
|
+
import "./chunk-2IR4T5PO.js";
|
|
37
37
|
import "./chunk-TIUTIOFB.js";
|
|
38
38
|
import "./chunk-YGFIQ6Y5.js";
|
|
39
|
-
import "./chunk-
|
|
40
|
-
import "./chunk-
|
|
39
|
+
import "./chunk-TU2WUBVZ.js";
|
|
40
|
+
import "./chunk-LKP7QDFN.js";
|
|
41
|
+
import "./chunk-6HWBRZIN.js";
|
|
42
|
+
import "./chunk-M42DZCOU.js";
|
|
43
|
+
import "./chunk-PCQ7ELJH.js";
|
|
41
44
|
import {
|
|
42
45
|
collect,
|
|
43
46
|
configOption,
|
|
44
47
|
readStdin,
|
|
45
48
|
splitList,
|
|
46
49
|
writeTextAtomic
|
|
47
|
-
} from "./chunk-
|
|
48
|
-
import "./chunk-
|
|
49
|
-
import "./chunk-
|
|
50
|
+
} from "./chunk-GV56WGL2.js";
|
|
51
|
+
import "./chunk-D4N2V43Z.js";
|
|
52
|
+
import "./chunk-VSEBFHAY.js";
|
|
50
53
|
import {
|
|
51
54
|
fail
|
|
52
55
|
} from "./chunk-YEUYKR62.js";
|
|
@@ -54,7 +57,7 @@ import {
|
|
|
54
57
|
shouldColor
|
|
55
58
|
} from "./chunk-RNVYGWIC.js";
|
|
56
59
|
import "./chunk-MNH7QO4Z.js";
|
|
57
|
-
import "./chunk-
|
|
60
|
+
import "./chunk-QLWC7MKD.js";
|
|
58
61
|
import {
|
|
59
62
|
warn
|
|
60
63
|
} from "./chunk-HX44GB4Z.js";
|
|
@@ -63,7 +66,7 @@ import {
|
|
|
63
66
|
} from "./chunk-QCHVR4ZM.js";
|
|
64
67
|
import {
|
|
65
68
|
package_default
|
|
66
|
-
} from "./chunk-
|
|
69
|
+
} from "./chunk-2MJ62AYQ.js";
|
|
67
70
|
import "./chunk-OWBRDNRZ.js";
|
|
68
71
|
import {
|
|
69
72
|
errorMessage
|
|
@@ -627,4 +630,4 @@ export {
|
|
|
627
630
|
buildProgram,
|
|
628
631
|
colorFor
|
|
629
632
|
};
|
|
630
|
-
//# sourceMappingURL=cli-
|
|
633
|
+
//# sourceMappingURL=cli-RORDPAPE.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/graph/cli.ts","../src/graph/reporters/index.ts","../src/graph/commands/init.ts"],"sourcesContent":["/**\n * The graph program. Named `graph` because that is where it is mounted\n * (`manni graph …`); `src/cli.ts` adds it to the umbrella and runs it.\n *\n * Grammar per proposals 0034 and 0051 §2: the domain owns verbs and has no\n * default subcommand, `-f` means the output format everywhere and is checked\n * against the verb's list, and a list reaches a flag by exactly one\n * separator. The plumbing is the family's: `fail()` from `src/shared/run.ts`,\n * `warn()` from `src/shared/warn.ts`, and `--no-color` from\n * `src/shared/color.ts`.\n */\nimport { Command } from \"commander\";\nimport pkg from \"../../package.json\" with { type: \"json\" };\nimport {\n collect,\n configOption,\n readStdin,\n splitList,\n} from \"../shared/cli-options.js\";\nimport { shouldColor } from \"../shared/color.js\";\nimport { fail } from \"../shared/run.js\";\nimport { warn } from \"../shared/warn.js\";\nimport { GraphError } from \"./types.js\";\nimport { LOCAL_FLAG_HELP } from \"../shared/providers.js\";\nimport { ALL_FILL_FIELDS, type FillField } from \"./core/config.js\";\nimport {\n assertInputFormat,\n DEFAULT_EXTENSIONS,\n STDIN,\n} from \"./core/discover.js\";\nimport {\n CHECK_FORMATS,\n CHECK_FORMAT_LIST,\n GRAPH_FORMATS,\n GRAPH_FORMAT_LIST,\n type CheckFormat,\n type GraphFormat,\n} from \"./reporters/index.js\";\nimport { runBuild } from \"./commands/build.js\";\nimport { renderCheck, runCheck } from \"./commands/check.js\";\nimport {\n EXPORT_TARGETS,\n runExport,\n type ExportFormat,\n} from \"./commands/export.js\";\nimport { renderQuery, runQuery } from \"./commands/query.js\";\nimport { renderFill, runFill } from \"./commands/fill.js\";\nimport { runInit } from \"./commands/init.js\";\nimport { renderEmbed, runEmbed } from \"./commands/embed.js\";\nimport {\n renderSearch,\n runSearch,\n SEARCH_MODES,\n type SearchMode,\n} from \"./commands/search.js\";\nimport { renderStats, runStats } from \"./commands/stats.js\";\nimport { renderTraverse, runTraverse } from \"./commands/traverse.js\";\n\n/**\n * Whether `command`'s output gets colour: this domain's `--no-color` and\n * `NO_COLOR` turn it off, and otherwise only a TTY turns it on\n * (`shouldColor`). `isTTY` is passed uncoerced: Node leaves it undefined off\n * a terminal, never false, and `shouldColor` reads a missing one as \"not a\n * terminal\".\n *\n * Exported because this is where the decision is testable — a spawned bin is\n * never a TTY. graph's reporters print no colour yet; when one does, it takes\n * the boolean from here rather than consulting the environment itself.\n */\nexport function colorFor(\n command: Command,\n isTTY: boolean | undefined,\n env?: NodeJS.ProcessEnv,\n): boolean {\n // commander maps --no-color to opts.color === false, on the command that\n // declares it.\n const noColor = colorOwner(command).opts().color === false;\n return shouldColor({ noColor, isTTY, env });\n}\n\n/**\n * The nearest command, this one or an ancestor, that declares `--no-color`:\n * the `graph` program, wherever it is mounted. Not the root: under the umbrella\n * that is `manni`, which has no `--no-color` of its own.\n */\nfunction colorOwner(command: Command): Command {\n for (let c: Command | null = command; c !== null; c = c.parent) {\n if (c.options.some((o) => o.long === \"--no-color\")) return c;\n }\n return command;\n}\n\nexport function buildProgram(): Command {\nconst program = new Command();\n\nprogram\n .name(\"graph\")\n .description(\n \"Deterministic knowledge graphs derived from documentation frontmatter and formatting.\",\n )\n .version(pkg.version)\n .option(\"--no-color\", \"disable colored output\")\n // A pointer, not the whole help screen: the message that precedes it\n // already names the offending flag.\n .showHelpAfterError(\"(add --help for usage)\")\n // MUST come before the `.command()` calls below. `copyInheritedSettings`\n // copies `_exitCallback` by value at subcommand-creation time, so an\n // `exitOverride()` installed afterwards leaves every subcommand still\n // calling `process.exit(1)` — which reports a usage error as a finding.\n .exitOverride();\n\n/**\n * Parse a numeric CLI option, refusing what the config schema refuses.\n *\n * `Number.parseFloat`/`parseInt` return NaN for `abc` and silently accept\n * out-of-range values, and NaN then disables whatever gate it feeds — a cost\n * cap that never fires, a confidence gate that writes everything, a `--top`\n * that asks for a negative number of rows. The documented precedence is\n * config → Ajv → CLI override, so the override has to be held to the same range.\n */\nfunction numericOption(\n flag: string,\n { min, max, integer }: { min: number; max?: number; integer?: boolean },\n) {\n return (raw: string): number => {\n const value = Number.parseFloat(raw);\n if (!Number.isFinite(value)) {\n throw new GraphError(`${flag} expects a number, got \"${raw}\".`);\n }\n if (integer && !Number.isInteger(value)) {\n throw new GraphError(`${flag} expects a whole number, got ${value}.`);\n }\n if (value < min || (max !== undefined && value > max)) {\n const range = max === undefined ? `>= ${min}` : `${min}..${max}`;\n throw new GraphError(`${flag} must be ${range}, got ${value}.`);\n }\n return value;\n };\n}\n\n/** A count: a whole number, at least `min` (1 unless the flag allows zero). */\nfunction countOption(flag: string, min = 1) {\n return numericOption(flag, { min, integer: true });\n}\n\n/**\n * Hold a CLI override to the same list its config key is held to.\n *\n * `fill.provider` is Ajv-validated against the schema enum; the `--provider`\n * override was an arbitrary string cast straight to `ProviderName`, so the\n * documented config → Ajv → CLI precedence had a hole at the last step.\n */\nfunction enumOption<T extends string>(flag: string, allowed: readonly T[]) {\n return (raw: string): T => {\n if (!(allowed as readonly string[]).includes(raw)) {\n throw new GraphError(\n `${flag} must be one of ${allowed.join(\" | \")}, got \"${raw}\".`,\n );\n }\n return raw as T;\n };\n}\n\n/**\n * A flag whose value is one of a named set, refused in the family's words:\n * `Unknown --format \"xml\". Use pretty | json.` The check runs while the\n * options are parsed, so a typo costs a message rather than a graph load.\n */\nfunction choiceOption<T extends string>(flag: string, allowed: readonly T[]) {\n return (raw: string): T => {\n if (!(allowed as readonly string[]).includes(raw)) {\n throw new GraphError(`Unknown ${flag} \"${raw}\". Use ${allowed.join(\" | \")}.`);\n }\n return raw as T;\n };\n}\n\n/** `-f, --format`: every verb's list is `pretty | json` (0051 §2). */\nconst formatOption = choiceOption(\"--format\", GRAPH_FORMATS);\n\n/** `check`'s own, which adds `github` — the CI gate's annotation format. */\nconst checkFormatOption = choiceOption(\"--format\", CHECK_FORMATS);\n\n/**\n * `--fields <list>`: comma-separated and given once, never repeatable — one\n * separator per list (proposal 0034), and the spelling `meta fill --fields`\n * already uses. Each value is held to the same list `fill.fields` is.\n */\nconst fieldsOption = (raw: string): FillField[] =>\n splitList(raw).map((value) => enumOption(\"--fields\", ALL_FILL_FIELDS)(value));\n\n/**\n * The document-set surface the verbs that read documents share (proposals\n * 0041 and 0051 §1): positional `[paths...]` with `-` for stdin,\n * `--collection` and `--exclude` (each one value per occurrence), `--as`,\n * `--ext` (comma-separated, given once), `--allow-empty`, and\n * `-c`/`--no-config`. Declared once so the verbs cannot drift apart on a name\n * or a description, and worded as `meta` and `lint` word them.\n */\nfunction documentInputs(command: Command, verb: string): Command {\n return command\n .argument(\n \"[paths...]\",\n `files, directories, or globs to ${verb} (use - for stdin)`,\n )\n .option(\n \"--collection <name>\",\n \"Configured collection to read (repeatable)\",\n collect,\n [],\n )\n .option(\"--exclude <glob>\", \"Glob to exclude (repeatable)\", collect, [])\n .option(\n \"--as <format>\",\n \"Parse every input as asciidoc, html, markdown, mdx, rst or xml, whatever its extension. Required with -.\",\n )\n .option(\n \"--ext <list>\",\n \"comma-separated extensions for directory walks\",\n DEFAULT_EXTENSIONS.join(\",\"),\n )\n .option(\"--allow-empty\", \"treat zero matched files as success\")\n .option(\"-c, --config <path>\", \"Path to manni.config.yaml\")\n .option(\"--no-config\", \"Ignore any discovered config file\");\n}\n\n/** The input flags as commander hands them over. */\ninterface InputFlags {\n as?: string;\n ext: string;\n allowEmpty?: boolean;\n}\n\n/**\n * The input flags for a core, and stdin when `paths` holds `-`. `--as` is\n * checked first, so `-` without it is refused before anything waits on stdin.\n */\nasync function inputOptions(\n paths: string[],\n opts: InputFlags,\n): Promise<{\n as?: string;\n ext: string[];\n allowEmpty?: boolean;\n stdinContent?: string;\n}> {\n assertInputFormat(paths, opts.as);\n return {\n ...(opts.as === undefined ? {} : { as: opts.as }),\n ext: splitList(opts.ext),\n ...(opts.allowEmpty === true ? { allowEmpty: true } : {}),\n ...(paths.includes(STDIN) ? { stdinContent: await readStdin() } : {}),\n };\n}\n\n/**\n * `-c`/`--no-config` for a verb that reads a built graph rather than a\n * document set. They share one commander attribute, which `configOption`\n * splits.\n */\nfunction configInputs(command: Command): Command {\n return command\n .option(\"-c, --config <path>\", \"Path to manni.config.yaml\")\n .option(\"--no-config\", \"Ignore any discovered config file\");\n}\n\n/**\n * `opts` minus the one attribute `-c` and `--no-config` share. `documentOptions`\n * restates it as the two fields a core reads, and spreading the raw value over\n * them would put commander's `false` back where a path belongs.\n */\nfunction rest<T extends { config?: string | boolean }>(\n opts: T,\n): Omit<T, \"config\"> {\n const { config, ...others } = opts;\n return others;\n}\n\n/** The shared options as the command cores take them. */\nfunction documentOptions(opts: {\n collection?: string[];\n exclude?: string[];\n config?: string | boolean;\n}): {\n config?: string;\n noConfig?: boolean;\n collection?: string[];\n exclude?: string[];\n} {\n const { configPath, noConfig } = configOption(opts.config);\n return {\n ...(configPath === undefined ? {} : { config: configPath }),\n ...(noConfig === true ? { noConfig } : {}),\n ...(opts.collection === undefined ? {} : { collection: opts.collection }),\n ...(opts.exclude === undefined ? {} : { exclude: opts.exclude }),\n };\n}\n\nprogram\n .command(\"init\")\n .description(\"Add a starter `graph:` section to manni.config.yaml in the current directory\")\n .action(async () => {\n try {\n console.log(`Created ${await runInit()}`);\n } catch (e) {\n fail(e);\n }\n });\n\ndocumentInputs(\n program\n .command(\"build\")\n .description(\"Derive the knowledge graph and write deterministic Turtle\"),\n \"build\",\n)\n .option(\"-o, --out <path>\", \"Output .ttl path (default: config out)\")\n .action(async (paths: string[], opts: InputFlags & {\n config?: string | boolean;\n collection?: string[];\n exclude?: string[];\n out?: string;\n }) => {\n try {\n const result = await runBuild({\n paths,\n ...documentOptions(opts),\n ...(await inputOptions(paths, opts)),\n out: opts.out,\n });\n // Warnings go to stderr so stdout stays the machine-readable summary;\n // a degraded build is still a successful one, so the exit code is 0.\n for (const warning of result.warnings) warn(warning);\n console.log(\n `Wrote ${result.outPath} (${result.docs} docs, ${result.quads} triples)`,\n );\n } catch (e) {\n fail(e);\n }\n });\n\nconfigInputs(\n program\n .command(\"check\")\n .description(\n \"Validate the built graph against the bundled SHACL shapes (errors exit 1)\",\n ),\n)\n .option(\"-g, --graph <path>\", \"Graph .ttl path (default: config out)\")\n // One path per occurrence, never split on commas: a path may hold one.\n .option(\n \"--shapes <path>\",\n \"Shapes .ttl file; repeatable (default: config check.shapes, then bundled)\",\n collect,\n [],\n )\n .option(\n \"-f, --format <format>\",\n `Output: ${CHECK_FORMAT_LIST}`,\n checkFormatOption,\n \"pretty\",\n )\n .action(\n async (opts: {\n config?: string | boolean;\n graph?: string;\n shapes: string[];\n format: CheckFormat;\n }) => {\n try {\n const report = await runCheck({ ...rest(opts), ...documentOptions(opts) });\n console.log(renderCheck(report, opts.format));\n process.exitCode = report.exitCode;\n } catch (e) {\n fail(e);\n }\n },\n );\n\ndocumentInputs(\n program\n .command(\"fill\")\n .description(\n \"Propose `graph:` frontmatter fields with an LLM, gated by confidence, and write them back\",\n ),\n \"fill\",\n)\n .option(\n \"-f, --format <format>\",\n `Output: ${GRAPH_FORMAT_LIST}`,\n formatOption,\n \"pretty\",\n )\n .option(\"--dry-run\", \"Report proposals without writing files\")\n .option(\"--force\", \"Overwrite human-set graph fields\")\n .option(\"--no-cache\", \"Bypass the proposal cache\")\n .option(\"--no-validate-graph\", \"Skip the SHACL graph guardrail on proposals\")\n .option(\"--sections\", \"Also propose per-section metadata\")\n .option(\n \"--max-turns <n>\",\n \"Stop after this many inference calls (a cached page costs none)\",\n countOption(\"--max-turns\"),\n )\n .option(\n \"--confidence <n>\",\n \"Minimum model confidence (0..1) to write a field (default: config, 0.7)\",\n numericOption(\"--confidence\", { min: 0, max: 1 }),\n )\n .option(\n // Comma-separated and given once: one separator per list (proposal 0034).\n \"--fields <list>\",\n `Fields to propose (comma-separated; default: config, then every field)`,\n fieldsOption,\n )\n // The nameable providers, and `auto`. `mock` is the library's test double:\n // accepted when asked for by name, never offered.\n .option(\n \"--provider <name>\",\n \"Provider: auto (default) | anthropic | openai | claude-cli | llama-cpp\",\n )\n .option(\"--model <model>\", \"Model override; needs a named provider, from here or config\")\n .option(\"--local\", LOCAL_FLAG_HELP)\n // Typed inline, as every other action in this file is. The option parsers\n // above (`numericOption`, `choiceOption`, `fieldsOption`) have already thrown\n // on anything malformed by the time this runs, so a cast per field would be\n // safe — but it would also be the one command with the most options and the\n // least help from the compiler.\n .action(async (paths: string[], opts: InputFlags & {\n config?: string | boolean;\n collection?: string[];\n exclude?: string[];\n dryRun?: boolean;\n force?: boolean;\n cache?: boolean;\n validateGraph?: boolean;\n sections?: boolean;\n maxTurns?: number;\n confidence?: number;\n fields?: FillField[];\n provider?: string;\n model?: string;\n local?: boolean;\n format: GraphFormat;\n }) => {\n try {\n const report = await runFill({\n paths,\n ...documentOptions(opts),\n ...(await inputOptions(paths, opts)),\n dryRun: opts.dryRun,\n force: opts.force,\n noCache: opts.cache === false,\n noValidateGraph: opts.validateGraph === false,\n sections: opts.sections,\n maxTurns: opts.maxTurns,\n confidence: opts.confidence,\n fields: opts.fields,\n provider: opts.provider,\n model: opts.model,\n local: opts.local,\n });\n // Same channel discipline as build: warnings on stderr, so stdout stays\n // the report, and a warning never changes the exit code.\n for (const warning of report.warnings) warn(warning);\n const rendered = renderFill(report, opts.format);\n if (paths.includes(STDIN)) {\n // With `-` the filled document owns stdout, as under `meta fill -`,\n // and the report in either format is a diagnostic on stderr.\n if (report.stdinDocument !== undefined) {\n process.stdout.write(report.stdinDocument);\n }\n if (rendered.length > 0) process.stderr.write(`${rendered}\\n`);\n } else {\n console.log(rendered);\n }\n process.exitCode = report.exitCode;\n } catch (e) {\n fail(e);\n }\n });\n\nprogram\n .command(\"query\")\n .description(\n \"Match triple patterns against the built graph (omit a term for wildcard)\",\n )\n // Long-only, and named for the triple position each one fills. `-o` is\n // `--out` on every other graph verb and `-s` is meta's schema flag; a\n // one-letter spelling that means two things in one family costs more than\n // the letters it saves.\n .option(\"--subject <term>\", \"Subject IRI or prefixed name\")\n .option(\"--predicate <term>\", \"Predicate IRI or prefixed name\")\n .option(\"--object <term>\", \"Object IRI, prefixed name, or literal value\")\n .option(\"-c, --config <path>\", \"Path to manni.config.yaml\")\n .option(\"--no-config\", \"Ignore any discovered config file\")\n .option(\"-g, --graph <path>\", \"Graph .ttl path (default: config out)\")\n .option(\n \"-f, --format <format>\",\n `Output: ${GRAPH_FORMAT_LIST}`,\n formatOption,\n \"pretty\",\n )\n .action(\n (opts: {\n subject?: string;\n predicate?: string;\n object?: string;\n config?: string | boolean;\n graph?: string;\n format: GraphFormat;\n }) => {\n try {\n const { subject, predicate, object, ...others } = rest(opts);\n const result = runQuery({\n ...others,\n ...documentOptions(opts),\n ...(subject === undefined ? {} : { s: subject }),\n ...(predicate === undefined ? {} : { p: predicate }),\n ...(object === undefined ? {} : { o: object }),\n });\n console.log(renderQuery(result, opts.format));\n } catch (e) {\n fail(e);\n }\n },\n );\n\nprogram\n .command(\"stats\")\n .description(\n \"Summarize the built graph: counts, orphans, broken links, hubs, metadata coverage\",\n )\n .option(\"-c, --config <path>\", \"Path to manni.config.yaml\")\n .option(\"--no-config\", \"Ignore any discovered config file\")\n .option(\"-g, --graph <path>\", \"Graph .ttl path (default: config out)\")\n .option(\n \"-f, --format <format>\",\n `Output: ${GRAPH_FORMAT_LIST}`,\n formatOption,\n \"pretty\",\n )\n .option(\n \"--check\",\n \"Exit 1 when broken internal links exist or coverage is below threshold\",\n )\n .option(\n \"--top <n>\",\n \"How many most-connected docs to list\",\n countOption(\"--top\"),\n )\n .option(\n \"--coverage-threshold <pct>\",\n \"Minimum metadata coverage % (all fields); overrides config for this run\",\n // A percentage, so 0..100 rather than the 0..1 of a confidence. NaN here is\n // worse than a wrong number: `pct < NaN` is false for every field, so the\n // gate this flag exists to tighten would silently pass instead.\n numericOption(\"--coverage-threshold\", { min: 0, max: 100 }),\n )\n .action(\n (opts: {\n config?: string | boolean;\n graph?: string;\n format: GraphFormat;\n check?: boolean;\n top?: number;\n coverageThreshold?: number;\n }) => {\n try {\n const report = runStats({ ...rest(opts), ...documentOptions(opts) });\n console.log(renderStats(report, opts.format));\n process.exitCode = report.exitCode;\n } catch (e) {\n fail(e);\n }\n },\n );\n\nprogram\n .command(\"search\")\n .description(\"Rank graph nodes for a text query (needs `export search`)\")\n .argument(\"<query>\", \"Text query\")\n .option(\"-c, --config <path>\", \"Path to manni.config.yaml\")\n .option(\"--no-config\", \"Ignore any discovered config file\")\n .option(\"-g, --graph <path>\", \"Graph .ttl path (default: config out)\")\n .option(\n \"-i, --index <dir>\",\n \"Directory holding the indexes and manifest (default: beside the graph)\",\n )\n .option(\n \"--lang <tag>\",\n \"Which localization to search (required when the corpus has more than one)\",\n )\n .option(\"--limit <n>\", \"Maximum results (default 10)\", countOption(\"--limit\"))\n .option(\n \"--vectors <path>\",\n \"Vector sidecar path (default: from the manifest)\",\n )\n .option(\n \"--mode <mode>\",\n `Which legs to run: ${SEARCH_MODES.join(\" | \")} (default: hybrid when vectors exist)`,\n choiceOption(\"--mode\", SEARCH_MODES),\n )\n .option(\n \"-f, --format <format>\",\n `Output: ${GRAPH_FORMAT_LIST}`,\n formatOption,\n \"pretty\",\n )\n .action(\n async (\n query: string,\n opts: {\n config?: string | boolean;\n graph?: string;\n index?: string;\n lang?: string;\n limit?: number;\n vectors?: string;\n mode?: SearchMode;\n format: GraphFormat;\n },\n ) => {\n try {\n const report = await runSearch({\n ...rest(opts),\n ...documentOptions(opts),\n query,\n });\n console.log(renderSearch(report, opts.format));\n } catch (e) {\n fail(e);\n }\n },\n );\n\nprogram\n .command(\"traverse\")\n .description(\n \"Walk the graph from a node, honoring scope rules, with the full trace\",\n )\n .argument(\"<node>\", \"Starting node: a full IRI or a prefix:local CURIE\")\n .option(\"-c, --config <path>\", \"Path to manni.config.yaml\")\n .option(\"--no-config\", \"Ignore any discovered config file\")\n .option(\"-g, --graph <path>\", \"Graph .ttl path (default: config out)\")\n .option(\n \"-d, --depth <n>\",\n \"Maximum hops from the node (default 1; 3 under --impact)\",\n // Zero is allowed: it means the node itself, which is a real answer.\n countOption(\"--depth\", 0),\n )\n // Comma-separated and given once: a CURIE holds no comma, so one separator\n // is enough, and a second spelling would be a second thing to document.\n .option(\n \"--predicates <list>\",\n \"Only follow these predicates (comma-separated)\",\n )\n .option(\"--reverse\", \"Follow inbound edges (who points at this node)\")\n .option(\"--impact\", \"Transitive inbound reach: what a change here affects\")\n .option(\n \"--variant <variant>\",\n \"Scope filter: product variant IRI, title, or slug\",\n )\n // Not `--subject`: on `query` that is a triple's subject, and one flag name\n // means one thing across the domain.\n .option(\"--software-subject <subject>\", \"Scope filter: software subject\")\n .option(\"--lang <tag>\", \"Scope filter: BCP-47 language tag, matched in any case\")\n .option(\"--limit <n>\", \"Stop after this many nodes\", countOption(\"--limit\"))\n .option(\n \"-f, --format <format>\",\n `Output: ${GRAPH_FORMAT_LIST}`,\n formatOption,\n \"pretty\",\n )\n .action(\n (\n node: string,\n opts: {\n config?: string | boolean;\n graph?: string;\n depth?: number;\n predicates?: string;\n reverse?: boolean;\n impact?: boolean;\n variant?: string;\n softwareSubject?: string;\n lang?: string;\n limit?: number;\n format: GraphFormat;\n },\n ) => {\n try {\n const { softwareSubject, ...others } = rest(opts);\n const report = runTraverse({\n ...others,\n ...documentOptions(opts),\n ...(softwareSubject === undefined ? {} : { subject: softwareSubject }),\n node,\n predicates:\n opts.predicates === undefined\n ? undefined\n : splitList(opts.predicates),\n });\n console.log(renderTraverse(report, opts.format));\n } catch (e) {\n fail(e);\n }\n },\n );\n\nprogram\n .command(\"embed\")\n .description(\n \"Compute local embeddings for the search index (needs @huggingface/transformers)\",\n )\n .option(\"-c, --config <path>\", \"Path to manni.config.yaml\")\n .option(\"--no-config\", \"Ignore any discovered config file\")\n .option(\"-g, --graph <path>\", \"Graph .ttl path (default: config out)\")\n .option(\n \"-i, --index <dir>\",\n \"Directory holding the indexes and manifest (default: beside the graph)\",\n )\n .option(\n \"-o, --out <dir>\",\n \"Directory for the sidecars (default: the index directory)\",\n )\n // Not `--model`: on `fill` that is the inference model, a different thing.\n .option(\n \"--embedding-model <id>\",\n \"Embedding model id (any id; `mock` for offline runs)\",\n )\n .option(\"--dtype <dtype>\", \"Weight quantization (default q8)\")\n .option(\"--no-cache\", \"Ignore the vector cache\")\n .option(\n \"-f, --format <format>\",\n `Output: ${GRAPH_FORMAT_LIST}`,\n formatOption,\n \"pretty\",\n )\n .action(\n async (opts: {\n config?: string | boolean;\n graph?: string;\n index?: string;\n out?: string;\n embeddingModel?: string;\n dtype?: string;\n cache?: boolean;\n format: GraphFormat;\n }) => {\n try {\n const { embeddingModel, ...others } = rest(opts);\n const report = await runEmbed({\n ...others,\n ...documentOptions(opts),\n ...(embeddingModel === undefined ? {} : { model: embeddingModel }),\n noCache: opts.cache === false,\n });\n console.log(renderEmbed(report, opts.format));\n } catch (e) {\n fail(e);\n }\n },\n );\n\nprogram\n .command(\"export\")\n .description(\n \"Reserialize the built graph into a consumer format (jsonld file, iirds package, or search index)\",\n )\n // The target is a positional, not `-f`: `-f` is the output format in every\n // other verb of the family (0051 §2), and one flag cannot mean two things.\n .argument(\"<target>\", `What to write: ${EXPORT_TARGETS.join(\" | \")}`)\n .option(\"-c, --config <path>\", \"Path to manni.config.yaml\")\n .option(\"--no-config\", \"Ignore any discovered config file\")\n .option(\"-g, --graph <path>\", \"Graph .ttl path (default: config out)\")\n .option(\n \"-o, --out <path>\",\n \"Output path (default: the graph path with the target's extension)\",\n )\n .action(\n async (\n target: string,\n opts: { config?: string | boolean; graph?: string; out?: string },\n ) => {\n try {\n if (!(EXPORT_TARGETS as readonly string[]).includes(target)) {\n throw new GraphError(\n `Unknown export target \"${target}\". Use ${EXPORT_TARGETS.join(\" | \")}.`,\n );\n }\n const result = await runExport({\n ...documentOptions(opts),\n graph: opts.graph,\n format: target as ExportFormat,\n out: opts.out,\n });\n for (const warning of result.warnings) warn(warning);\n console.log(\n `Wrote ${result.nodes} node${result.nodes === 1 ? \"\" : \"s\"} to ${result.outPath}`,\n );\n } catch (e) {\n fail(e);\n }\n },\n );\n\nreturn program;\n}\n","/**\n * What `-f` accepts, per verb.\n *\n * Each verb's renderer lives beside its command core (`renderCheck`,\n * `renderStats`, …); what belongs here is the *list*, stated once so the\n * union, the guard, the help text and the refusal sentence cannot drift\n * apart. It is the same shape a11y and cite keep (`A11Y_FORMATS`,\n * `REPORT_FORMATS`), which is why the sentence a user reads is the family's.\n *\n * Every verb takes `pretty | json`. `check` also takes `github`, because it is\n * the CI gate: it is the one graph verb whose output changes what a reviewer sees\n * on a pull request (proposal 0051 §2). It names its own list here rather than\n * widening the shared one, so no other verb advertises a format it cannot\n * render.\n */\n\n/** The list every graph verb's `-f` accepts, in the order messages list them. */\nexport const GRAPH_FORMATS = [\"pretty\", \"json\"] as const;\nexport type GraphFormat = (typeof GRAPH_FORMATS)[number];\n\n/** `\"pretty | json\"`, for help text and the refusal sentence. */\nexport const GRAPH_FORMAT_LIST: string = GRAPH_FORMATS.join(\" | \");\n\n/** `check`'s list: the shared two plus the CI annotation format. */\nexport const CHECK_FORMATS = [...GRAPH_FORMATS, \"github\"] as const;\nexport type CheckFormat = (typeof CHECK_FORMATS)[number];\n\n/** `\"pretty | json | github\"`, for help text and the refusal sentence. */\nexport const CHECK_FORMAT_LIST: string = CHECK_FORMATS.join(\" | \");\n","/**\n * `manni graph init` — scaffold a starter `graph:` section in manni.config.yaml.\n *\n * The family file is shared with the other tools, so a file that already\n * exists is not overwritten: the section is appended to it, leaving the\n * siblings' keys and comments exactly as they were. A file that already has a\n * `graph:` key is refused.\n */\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { parse as parseYaml } from \"yaml\";\nimport { errorMessage } from \"../../shared/errors.js\";\nimport { writeTextAtomic } from \"../../shared/write-file.js\";\nimport { GraphError } from \"../types.js\";\nimport { CONFIG_SECTION, DEFAULT_CONFIG_FILENAME } from \"../core/config.js\";\n\nconst HEADER = `# manni.config.yaml — shared configuration for the manni family of tools.\n# Each tool reads its own top-level key; manni graph reads \"graph:\".\n`;\n\nconst STARTER = `# Base IRI for every minted node. Set this to a namespace you control;\n# without it, IRIs fall back to the urn:manni:graph: placeholder.\n# baseIri: https://example.com/graph/\n\n# There is no document set here. \\`manni graph build\\` and \\`manni graph fill\\` read the\n# paths you name, or the collections declared once for every tool at the TOP\n# level of this file, beside \\`graph:\\` rather than inside it:\n#\n# collections:\n# - name: site\n# paths: [\"docs/**/*.md\"]\n#\n# Output of \\`manni graph build\\`.\nout: graph/graph.ttl\n\n# Map published-site routes back to source files so route-style links\n# (/docs/actions/find) become graph edges. A route may also carry the BCP-47\n# \\`language\\` labelling every document under its root; a page's own \\`lang\\`\n# frontmatter wins. Uncomment and adjust:\n# routes:\n# - basePath: /docs\n# root: docs\n# extensions: [.md, .mdx, .markdown]\n# indexFiles: [index, README]\n# - basePath: /docs/de\n# root: docs/de\n# language: de\n\n# What to derive triples from. Remove entries to opt out.\nbuild:\n derive: [frontmatter, sections, links, tags, images, code, provenance]\n\n# PROV-O settings. Git history is detected, not switched: per-file dates and\n# author agents, rename -> prov:wasRevisionOf, and the build activity's HEAD\n# committer date are derived wherever git can run over a repository, and a run\n# that cannot says so once and builds the rest. Deterministic per commit;\n# wall-clock time never enters the graph.\n# qualified: emit prov:qualifiedAttribution/qualifiedAssociation nodes\n# with roles alongside the direct properties.\nprovenance:\n qualified: true\n\n# Which fields a published graph may carry is read from x-manni-graph-output in\n# the schema set \\`manni meta validate\\` resolves for each page. Set that under\n# meta: (schemas, strict, register), not here. The default set keeps the\n# stewardship people fields (owner, stakeholders, reviewed-by) out.\n\n# SHACL shapes \\`manni graph check\\` validates the built graph against. Default:\n# the shapes contract bundled with manni (shapes/graph/shapes-1.0.0.ttl).\n# check:\n# shapes: [\"./my-shapes.ttl\"]\n\n# Metadata coverage gate for \\`manni graph stats --check\\`. A number applies to\n# every measured field; a map gates named fields only. Unset gates nothing.\n# stats:\n# coverageThreshold:\n# title: 100\n# description: 50\n\n# Which provider \\`manni graph fill\\` sends pages to. Unset, the family's\n# top-level providers: map decides, and then \\`auto\\`, which detects one: an\n# Anthropic key, then an OpenAI key, then the Claude CLI, then a local model.\n# Connection settings (apiKeyEnv, baseUrl, command) live in that map, declared\n# once for every manni tool. \\`--provider\\` wins over this, \\`--local\\` over both.\n# provider: anthropic # auto | anthropic | openai | claude-cli | llama-cpp\n# model: claude-sonnet-4-5 # the provider's default when omitted\n\n# LLM settings for \\`manni graph fill\\` (SKOS frontmatter proposals).\nfill:\n temperature: 0\n # Stop after this many inference calls. One page is one turn, and a cached\n # page spends none. Unset is unbounded.\n # maxTurns: 50\n cacheDir: .manni/graph/cache\n # fill proposes every field; confidence (0..1 per field) gates what is\n # written. Fields scored below the threshold are reported, not written.\n confidenceThreshold: 0.7\n # fields: defaults to every fillable field — uncomment to restrict.\n # Record meta-provenance (model + /graph/ pointers + confidence) on filled docs.\n writeProvenance: true\n # Reject proposals that would violate the SHACL shapes contract\n # (broader/narrower cycles, conflicting labels).\n validateGraph: true\n # Also propose per-section metadata. Off by default: it costs more output per\n # call, and section metadata is explicit-only, so review it as carefully.\n sections: false\n\n# Local embeddings for semantic search (\\`manni graph embed\\`). Needs the optional\n# peer: npm install @huggingface/transformers\n# embed:\n# model: onnx-community/granite-embedding-small-english-r2-ONNX\n# dtype: q8 # q8 keeps embedding reproducible across platforms\n# out: graph # directory for the per-language vector sidecars\n# cacheDir: .manni/graph/embed-cache\n\n# Optional enrichment for \\`manni graph export iirds\\` (the iiRDS package).\n# Absent, a minimal valid package is still produced.\n# export:\n# iirds:\n# title: My Docs # package title (default: \"manni graph export\")\n# creator: Acme Corp # Creator iirds:Party + vcard:Organization\n# version: \"1.3\" # iiRDS version literal: \"1.2\" | \"1.3\"\n`;\n\n/** The starter as a `graph:` section: every line nested one level. */\nfunction starterSection(): string {\n const body = STARTER.split(\"\\n\")\n .map((line) => (line === \"\" ? \"\" : ` ${line}`))\n .join(\"\\n\");\n return `${CONFIG_SECTION}:\\n${body}`;\n}\n\nexport async function runInit(cwd = process.cwd()): Promise<string> {\n const path = resolve(cwd, DEFAULT_CONFIG_FILENAME);\n if (!existsSync(path)) {\n await writeTextAtomic(path, `${HEADER}${starterSection()}`);\n return path;\n }\n\n // A family file is already here. Parse it to make sure a `graph:` key can be\n // appended: the document must be a mapping (or empty) without one.\n const text = readFileSync(path, \"utf8\");\n let doc: unknown;\n try {\n doc = parseYaml(text);\n } catch (e) {\n throw new GraphError(\n `Invalid YAML in ${DEFAULT_CONFIG_FILENAME}: ${errorMessage(e)}`,\n );\n }\n if (doc != null && (typeof doc !== \"object\" || Array.isArray(doc))) {\n throw new GraphError(\n `${DEFAULT_CONFIG_FILENAME}: top level must be a mapping — not adding a \\`${CONFIG_SECTION}:\\` section to it.`,\n );\n }\n if (doc != null && Object.hasOwn(doc, CONFIG_SECTION)) {\n throw new GraphError(\n `${DEFAULT_CONFIG_FILENAME} already has a \\`${CONFIG_SECTION}:\\` section — not overwriting.`,\n );\n }\n // Append as text rather than re-serialising the document, so the siblings'\n // keys and comments come out byte-for-byte as they went in.\n const separator = text === \"\" || text.endsWith(\"\\n\") ? \"\" : \"\\n\";\n const blank = text === \"\" ? \"\" : \"\\n\";\n await writeTextAtomic(\n path,\n `${text}${separator}${blank}${starterSection()}`,\n );\n return path;\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/graph/cli.ts","../src/graph/reporters/index.ts","../src/graph/commands/init.ts"],"sourcesContent":["/**\n * The graph program. Named `graph` because that is where it is mounted\n * (`manni graph …`); `src/cli.ts` adds it to the umbrella and runs it.\n *\n * Grammar per proposals 0034 and 0051 §2: the domain owns verbs and has no\n * default subcommand, `-f` means the output format everywhere and is checked\n * against the verb's list, and a list reaches a flag by exactly one\n * separator. The plumbing is the family's: `fail()` from `src/shared/run.ts`,\n * `warn()` from `src/shared/warn.ts`, and `--no-color` from\n * `src/shared/color.ts`.\n */\nimport { Command } from \"commander\";\nimport pkg from \"../../package.json\" with { type: \"json\" };\nimport {\n collect,\n configOption,\n readStdin,\n splitList,\n} from \"../shared/cli-options.js\";\nimport { shouldColor } from \"../shared/color.js\";\nimport { fail } from \"../shared/run.js\";\nimport { warn } from \"../shared/warn.js\";\nimport { GraphError } from \"./types.js\";\nimport { LOCAL_FLAG_HELP } from \"../shared/providers.js\";\nimport { ALL_FILL_FIELDS, type FillField } from \"./core/config.js\";\nimport {\n assertInputFormat,\n DEFAULT_EXTENSIONS,\n STDIN,\n} from \"./core/discover.js\";\nimport {\n CHECK_FORMATS,\n CHECK_FORMAT_LIST,\n GRAPH_FORMATS,\n GRAPH_FORMAT_LIST,\n type CheckFormat,\n type GraphFormat,\n} from \"./reporters/index.js\";\nimport { runBuild } from \"./commands/build.js\";\nimport { renderCheck, runCheck } from \"./commands/check.js\";\nimport {\n EXPORT_TARGETS,\n runExport,\n type ExportFormat,\n} from \"./commands/export.js\";\nimport { renderQuery, runQuery } from \"./commands/query.js\";\nimport { renderFill, runFill } from \"./commands/fill.js\";\nimport { runInit } from \"./commands/init.js\";\nimport { renderEmbed, runEmbed } from \"./commands/embed.js\";\nimport {\n renderSearch,\n runSearch,\n SEARCH_MODES,\n type SearchMode,\n} from \"./commands/search.js\";\nimport { renderStats, runStats } from \"./commands/stats.js\";\nimport { renderTraverse, runTraverse } from \"./commands/traverse.js\";\n\n/**\n * Whether `command`'s output gets colour: this domain's `--no-color` and\n * `NO_COLOR` turn it off, and otherwise only a TTY turns it on\n * (`shouldColor`). `isTTY` is passed uncoerced: Node leaves it undefined off\n * a terminal, never false, and `shouldColor` reads a missing one as \"not a\n * terminal\".\n *\n * Exported because this is where the decision is testable — a spawned bin is\n * never a TTY. graph's reporters print no colour yet; when one does, it takes\n * the boolean from here rather than consulting the environment itself.\n */\nexport function colorFor(\n command: Command,\n isTTY: boolean | undefined,\n env?: NodeJS.ProcessEnv,\n): boolean {\n // commander maps --no-color to opts.color === false, on the command that\n // declares it.\n const noColor = colorOwner(command).opts().color === false;\n return shouldColor({ noColor, isTTY, env });\n}\n\n/**\n * The nearest command, this one or an ancestor, that declares `--no-color`:\n * the `graph` program, wherever it is mounted. Not the root: under the umbrella\n * that is `manni`, which has no `--no-color` of its own.\n */\nfunction colorOwner(command: Command): Command {\n for (let c: Command | null = command; c !== null; c = c.parent) {\n if (c.options.some((o) => o.long === \"--no-color\")) return c;\n }\n return command;\n}\n\nexport function buildProgram(): Command {\nconst program = new Command();\n\nprogram\n .name(\"graph\")\n .description(\n \"Deterministic knowledge graphs derived from documentation frontmatter and formatting.\",\n )\n .version(pkg.version)\n .option(\"--no-color\", \"disable colored output\")\n // A pointer, not the whole help screen: the message that precedes it\n // already names the offending flag.\n .showHelpAfterError(\"(add --help for usage)\")\n // MUST come before the `.command()` calls below. `copyInheritedSettings`\n // copies `_exitCallback` by value at subcommand-creation time, so an\n // `exitOverride()` installed afterwards leaves every subcommand still\n // calling `process.exit(1)` — which reports a usage error as a finding.\n .exitOverride();\n\n/**\n * Parse a numeric CLI option, refusing what the config schema refuses.\n *\n * `Number.parseFloat`/`parseInt` return NaN for `abc` and silently accept\n * out-of-range values, and NaN then disables whatever gate it feeds — a cost\n * cap that never fires, a confidence gate that writes everything, a `--top`\n * that asks for a negative number of rows. The documented precedence is\n * config → Ajv → CLI override, so the override has to be held to the same range.\n */\nfunction numericOption(\n flag: string,\n { min, max, integer }: { min: number; max?: number; integer?: boolean },\n) {\n return (raw: string): number => {\n const value = Number.parseFloat(raw);\n if (!Number.isFinite(value)) {\n throw new GraphError(`${flag} expects a number, got \"${raw}\".`);\n }\n if (integer && !Number.isInteger(value)) {\n throw new GraphError(`${flag} expects a whole number, got ${value}.`);\n }\n if (value < min || (max !== undefined && value > max)) {\n const range = max === undefined ? `>= ${min}` : `${min}..${max}`;\n throw new GraphError(`${flag} must be ${range}, got ${value}.`);\n }\n return value;\n };\n}\n\n/** A count: a whole number, at least `min` (1 unless the flag allows zero). */\nfunction countOption(flag: string, min = 1) {\n return numericOption(flag, { min, integer: true });\n}\n\n/**\n * Hold a CLI override to the same list its config key is held to.\n *\n * `fill.provider` is Ajv-validated against the schema enum; the `--provider`\n * override was an arbitrary string cast straight to `ProviderName`, so the\n * documented config → Ajv → CLI precedence had a hole at the last step.\n */\nfunction enumOption<T extends string>(flag: string, allowed: readonly T[]) {\n return (raw: string): T => {\n if (!(allowed as readonly string[]).includes(raw)) {\n throw new GraphError(\n `${flag} must be one of ${allowed.join(\" | \")}, got \"${raw}\".`,\n );\n }\n return raw as T;\n };\n}\n\n/**\n * A flag whose value is one of a named set, refused in the family's words:\n * `Unknown --format \"xml\". Use pretty | json.` The check runs while the\n * options are parsed, so a typo costs a message rather than a graph load.\n */\nfunction choiceOption<T extends string>(flag: string, allowed: readonly T[]) {\n return (raw: string): T => {\n if (!(allowed as readonly string[]).includes(raw)) {\n throw new GraphError(`Unknown ${flag} \"${raw}\". Use ${allowed.join(\" | \")}.`);\n }\n return raw as T;\n };\n}\n\n/** `-f, --format`: every verb's list is `pretty | json` (0051 §2). */\nconst formatOption = choiceOption(\"--format\", GRAPH_FORMATS);\n\n/** `check`'s own, which adds `github` — the CI gate's annotation format. */\nconst checkFormatOption = choiceOption(\"--format\", CHECK_FORMATS);\n\n/**\n * `--fields <list>`: comma-separated and given once, never repeatable — one\n * separator per list (proposal 0034), and the spelling `meta fill --fields`\n * already uses. Each value is held to the same list `fill.fields` is.\n */\nconst fieldsOption = (raw: string): FillField[] =>\n splitList(raw).map((value) => enumOption(\"--fields\", ALL_FILL_FIELDS)(value));\n\n/**\n * The document-set surface the verbs that read documents share (proposals\n * 0041 and 0051 §1): positional `[paths...]` with `-` for stdin,\n * `--collection` and `--exclude` (each one value per occurrence), `--as`,\n * `--ext` (comma-separated, given once), `--allow-empty`, and\n * `-c`/`--no-config`. Declared once so the verbs cannot drift apart on a name\n * or a description, and worded as `meta` and `lint` word them.\n */\nfunction documentInputs(command: Command, verb: string): Command {\n return command\n .argument(\n \"[paths...]\",\n `files, directories, or globs to ${verb} (use - for stdin)`,\n )\n .option(\n \"--collection <name>\",\n \"Configured collection to read (repeatable)\",\n collect,\n [],\n )\n .option(\"--exclude <glob>\", \"Glob to exclude (repeatable)\", collect, [])\n .option(\n \"--as <format>\",\n \"Parse every input as asciidoc, html, markdown, mdx, rst or xml, whatever its extension. Required with -.\",\n )\n .option(\n \"--ext <list>\",\n \"comma-separated extensions for directory walks\",\n DEFAULT_EXTENSIONS.join(\",\"),\n )\n .option(\"--allow-empty\", \"treat zero matched files as success\")\n .option(\"-c, --config <path>\", \"Path to manni.config.yaml\")\n .option(\"--no-config\", \"Ignore any discovered config file\");\n}\n\n/** The input flags as commander hands them over. */\ninterface InputFlags {\n as?: string;\n ext: string;\n allowEmpty?: boolean;\n}\n\n/**\n * The input flags for a core, and stdin when `paths` holds `-`. `--as` is\n * checked first, so `-` without it is refused before anything waits on stdin.\n */\nasync function inputOptions(\n paths: string[],\n opts: InputFlags,\n): Promise<{\n as?: string;\n ext: string[];\n allowEmpty?: boolean;\n stdinContent?: string;\n}> {\n assertInputFormat(paths, opts.as);\n return {\n ...(opts.as === undefined ? {} : { as: opts.as }),\n ext: splitList(opts.ext),\n ...(opts.allowEmpty === true ? { allowEmpty: true } : {}),\n ...(paths.includes(STDIN) ? { stdinContent: await readStdin() } : {}),\n };\n}\n\n/**\n * `-c`/`--no-config` for a verb that reads a built graph rather than a\n * document set. They share one commander attribute, which `configOption`\n * splits.\n */\nfunction configInputs(command: Command): Command {\n return command\n .option(\"-c, --config <path>\", \"Path to manni.config.yaml\")\n .option(\"--no-config\", \"Ignore any discovered config file\");\n}\n\n/**\n * `opts` minus the one attribute `-c` and `--no-config` share. `documentOptions`\n * restates it as the two fields a core reads, and spreading the raw value over\n * them would put commander's `false` back where a path belongs.\n */\nfunction rest<T extends { config?: string | boolean }>(\n opts: T,\n): Omit<T, \"config\"> {\n const { config, ...others } = opts;\n return others;\n}\n\n/** The shared options as the command cores take them. */\nfunction documentOptions(opts: {\n collection?: string[];\n exclude?: string[];\n config?: string | boolean;\n}): {\n config?: string;\n noConfig?: boolean;\n collection?: string[];\n exclude?: string[];\n} {\n const { configPath, noConfig } = configOption(opts.config);\n return {\n ...(configPath === undefined ? {} : { config: configPath }),\n ...(noConfig === true ? { noConfig } : {}),\n ...(opts.collection === undefined ? {} : { collection: opts.collection }),\n ...(opts.exclude === undefined ? {} : { exclude: opts.exclude }),\n };\n}\n\nprogram\n .command(\"init\")\n .description(\"Add a starter `graph:` section to manni.config.yaml in the current directory\")\n .action(async () => {\n try {\n console.log(`Created ${await runInit()}`);\n } catch (e) {\n fail(e);\n }\n });\n\ndocumentInputs(\n program\n .command(\"build\")\n .description(\"Derive the knowledge graph and write deterministic Turtle\"),\n \"build\",\n)\n .option(\"-o, --out <path>\", \"Output .ttl path (default: config out)\")\n .action(async (paths: string[], opts: InputFlags & {\n config?: string | boolean;\n collection?: string[];\n exclude?: string[];\n out?: string;\n }) => {\n try {\n const result = await runBuild({\n paths,\n ...documentOptions(opts),\n ...(await inputOptions(paths, opts)),\n out: opts.out,\n });\n // Warnings go to stderr so stdout stays the machine-readable summary;\n // a degraded build is still a successful one, so the exit code is 0.\n for (const warning of result.warnings) warn(warning);\n console.log(\n `Wrote ${result.outPath} (${result.docs} docs, ${result.quads} triples)`,\n );\n } catch (e) {\n fail(e);\n }\n });\n\nconfigInputs(\n program\n .command(\"check\")\n .description(\n \"Validate the built graph against the bundled SHACL shapes (errors exit 1)\",\n ),\n)\n .option(\"-g, --graph <path>\", \"Graph .ttl path (default: config out)\")\n // One path per occurrence, never split on commas: a path may hold one.\n .option(\n \"--shapes <path>\",\n \"Shapes .ttl file; repeatable (default: config check.shapes, then bundled)\",\n collect,\n [],\n )\n .option(\n \"-f, --format <format>\",\n `Output: ${CHECK_FORMAT_LIST}`,\n checkFormatOption,\n \"pretty\",\n )\n .action(\n async (opts: {\n config?: string | boolean;\n graph?: string;\n shapes: string[];\n format: CheckFormat;\n }) => {\n try {\n const report = await runCheck({ ...rest(opts), ...documentOptions(opts) });\n console.log(renderCheck(report, opts.format));\n process.exitCode = report.exitCode;\n } catch (e) {\n fail(e);\n }\n },\n );\n\ndocumentInputs(\n program\n .command(\"fill\")\n .description(\n \"Propose `graph:` frontmatter fields with an LLM, gated by confidence, and write them back\",\n ),\n \"fill\",\n)\n .option(\n \"-f, --format <format>\",\n `Output: ${GRAPH_FORMAT_LIST}`,\n formatOption,\n \"pretty\",\n )\n .option(\"--dry-run\", \"Report proposals without writing files\")\n .option(\"--force\", \"Overwrite human-set graph fields\")\n .option(\"--no-cache\", \"Bypass the proposal cache\")\n .option(\"--no-validate-graph\", \"Skip the SHACL graph guardrail on proposals\")\n .option(\"--sections\", \"Also propose per-section metadata\")\n .option(\n \"--max-turns <n>\",\n \"Stop after this many inference calls (a cached page costs none)\",\n countOption(\"--max-turns\"),\n )\n .option(\n \"--confidence <n>\",\n \"Minimum model confidence (0..1) to write a field (default: config, 0.7)\",\n numericOption(\"--confidence\", { min: 0, max: 1 }),\n )\n .option(\n // Comma-separated and given once: one separator per list (proposal 0034).\n \"--fields <list>\",\n `Fields to propose (comma-separated; default: config, then every field)`,\n fieldsOption,\n )\n // The nameable providers, and `auto`. `mock` is the library's test double:\n // accepted when asked for by name, never offered.\n .option(\n \"--provider <name>\",\n \"Provider: auto (default) | anthropic | openai | claude-cli | llama-cpp\",\n )\n .option(\"--model <model>\", \"Model override; needs a named provider, from here or config\")\n .option(\"--local\", LOCAL_FLAG_HELP)\n // Typed inline, as every other action in this file is. The option parsers\n // above (`numericOption`, `choiceOption`, `fieldsOption`) have already thrown\n // on anything malformed by the time this runs, so a cast per field would be\n // safe — but it would also be the one command with the most options and the\n // least help from the compiler.\n .action(async (paths: string[], opts: InputFlags & {\n config?: string | boolean;\n collection?: string[];\n exclude?: string[];\n dryRun?: boolean;\n force?: boolean;\n cache?: boolean;\n validateGraph?: boolean;\n sections?: boolean;\n maxTurns?: number;\n confidence?: number;\n fields?: FillField[];\n provider?: string;\n model?: string;\n local?: boolean;\n format: GraphFormat;\n }) => {\n try {\n const report = await runFill({\n paths,\n ...documentOptions(opts),\n ...(await inputOptions(paths, opts)),\n dryRun: opts.dryRun,\n force: opts.force,\n noCache: opts.cache === false,\n noValidateGraph: opts.validateGraph === false,\n sections: opts.sections,\n maxTurns: opts.maxTurns,\n confidence: opts.confidence,\n fields: opts.fields,\n provider: opts.provider,\n model: opts.model,\n local: opts.local,\n });\n // Same channel discipline as build: warnings on stderr, so stdout stays\n // the report, and a warning never changes the exit code.\n for (const warning of report.warnings) warn(warning);\n const rendered = renderFill(report, opts.format);\n if (paths.includes(STDIN)) {\n // With `-` the filled document owns stdout, as under `meta fill -`,\n // and the report in either format is a diagnostic on stderr.\n if (report.stdinDocument !== undefined) {\n process.stdout.write(report.stdinDocument);\n }\n if (rendered.length > 0) process.stderr.write(`${rendered}\\n`);\n } else {\n console.log(rendered);\n }\n process.exitCode = report.exitCode;\n } catch (e) {\n fail(e);\n }\n });\n\nprogram\n .command(\"query\")\n .description(\n \"Match triple patterns against the built graph (omit a term for wildcard)\",\n )\n // Long-only, and named for the triple position each one fills. `-o` is\n // `--out` on every other graph verb and `-s` is meta's schema flag; a\n // one-letter spelling that means two things in one family costs more than\n // the letters it saves.\n .option(\"--subject <term>\", \"Subject IRI or prefixed name\")\n .option(\"--predicate <term>\", \"Predicate IRI or prefixed name\")\n .option(\"--object <term>\", \"Object IRI, prefixed name, or literal value\")\n .option(\"-c, --config <path>\", \"Path to manni.config.yaml\")\n .option(\"--no-config\", \"Ignore any discovered config file\")\n .option(\"-g, --graph <path>\", \"Graph .ttl path (default: config out)\")\n .option(\n \"-f, --format <format>\",\n `Output: ${GRAPH_FORMAT_LIST}`,\n formatOption,\n \"pretty\",\n )\n .action(\n (opts: {\n subject?: string;\n predicate?: string;\n object?: string;\n config?: string | boolean;\n graph?: string;\n format: GraphFormat;\n }) => {\n try {\n const { subject, predicate, object, ...others } = rest(opts);\n const result = runQuery({\n ...others,\n ...documentOptions(opts),\n ...(subject === undefined ? {} : { s: subject }),\n ...(predicate === undefined ? {} : { p: predicate }),\n ...(object === undefined ? {} : { o: object }),\n });\n console.log(renderQuery(result, opts.format));\n } catch (e) {\n fail(e);\n }\n },\n );\n\nprogram\n .command(\"stats\")\n .description(\n \"Summarize the built graph: counts, orphans, broken links, hubs, metadata coverage\",\n )\n .option(\"-c, --config <path>\", \"Path to manni.config.yaml\")\n .option(\"--no-config\", \"Ignore any discovered config file\")\n .option(\"-g, --graph <path>\", \"Graph .ttl path (default: config out)\")\n .option(\n \"-f, --format <format>\",\n `Output: ${GRAPH_FORMAT_LIST}`,\n formatOption,\n \"pretty\",\n )\n .option(\n \"--check\",\n \"Exit 1 when broken internal links exist or coverage is below threshold\",\n )\n .option(\n \"--top <n>\",\n \"How many most-connected docs to list\",\n countOption(\"--top\"),\n )\n .option(\n \"--coverage-threshold <pct>\",\n \"Minimum metadata coverage % (all fields); overrides config for this run\",\n // A percentage, so 0..100 rather than the 0..1 of a confidence. NaN here is\n // worse than a wrong number: `pct < NaN` is false for every field, so the\n // gate this flag exists to tighten would silently pass instead.\n numericOption(\"--coverage-threshold\", { min: 0, max: 100 }),\n )\n .action(\n (opts: {\n config?: string | boolean;\n graph?: string;\n format: GraphFormat;\n check?: boolean;\n top?: number;\n coverageThreshold?: number;\n }) => {\n try {\n const report = runStats({ ...rest(opts), ...documentOptions(opts) });\n console.log(renderStats(report, opts.format));\n process.exitCode = report.exitCode;\n } catch (e) {\n fail(e);\n }\n },\n );\n\nprogram\n .command(\"search\")\n .description(\"Rank graph nodes for a text query (needs `export search`)\")\n .argument(\"<query>\", \"Text query\")\n .option(\"-c, --config <path>\", \"Path to manni.config.yaml\")\n .option(\"--no-config\", \"Ignore any discovered config file\")\n .option(\"-g, --graph <path>\", \"Graph .ttl path (default: config out)\")\n .option(\n \"-i, --index <dir>\",\n \"Directory holding the indexes and manifest (default: beside the graph)\",\n )\n .option(\n \"--lang <tag>\",\n \"Which localization to search (required when the corpus has more than one)\",\n )\n .option(\"--limit <n>\", \"Maximum results (default 10)\", countOption(\"--limit\"))\n .option(\n \"--vectors <path>\",\n \"Vector sidecar path (default: from the manifest)\",\n )\n .option(\n \"--mode <mode>\",\n `Which legs to run: ${SEARCH_MODES.join(\" | \")} (default: hybrid when vectors exist)`,\n choiceOption(\"--mode\", SEARCH_MODES),\n )\n .option(\n \"-f, --format <format>\",\n `Output: ${GRAPH_FORMAT_LIST}`,\n formatOption,\n \"pretty\",\n )\n .action(\n async (\n query: string,\n opts: {\n config?: string | boolean;\n graph?: string;\n index?: string;\n lang?: string;\n limit?: number;\n vectors?: string;\n mode?: SearchMode;\n format: GraphFormat;\n },\n ) => {\n try {\n const report = await runSearch({\n ...rest(opts),\n ...documentOptions(opts),\n query,\n });\n console.log(renderSearch(report, opts.format));\n } catch (e) {\n fail(e);\n }\n },\n );\n\nprogram\n .command(\"traverse\")\n .description(\n \"Walk the graph from a node, honoring scope rules, with the full trace\",\n )\n .argument(\"<node>\", \"Starting node: a full IRI or a prefix:local CURIE\")\n .option(\"-c, --config <path>\", \"Path to manni.config.yaml\")\n .option(\"--no-config\", \"Ignore any discovered config file\")\n .option(\"-g, --graph <path>\", \"Graph .ttl path (default: config out)\")\n .option(\n \"-d, --depth <n>\",\n \"Maximum hops from the node (default 1; 3 under --impact)\",\n // Zero is allowed: it means the node itself, which is a real answer.\n countOption(\"--depth\", 0),\n )\n // Comma-separated and given once: a CURIE holds no comma, so one separator\n // is enough, and a second spelling would be a second thing to document.\n .option(\n \"--predicates <list>\",\n \"Only follow these predicates (comma-separated)\",\n )\n .option(\"--reverse\", \"Follow inbound edges (who points at this node)\")\n .option(\"--impact\", \"Transitive inbound reach: what a change here affects\")\n .option(\n \"--variant <variant>\",\n \"Scope filter: product variant IRI, title, or slug\",\n )\n // Not `--subject`: on `query` that is a triple's subject, and one flag name\n // means one thing across the domain.\n .option(\"--software-subject <subject>\", \"Scope filter: software subject\")\n .option(\"--lang <tag>\", \"Scope filter: BCP-47 language tag, matched in any case\")\n .option(\"--limit <n>\", \"Stop after this many nodes\", countOption(\"--limit\"))\n .option(\n \"-f, --format <format>\",\n `Output: ${GRAPH_FORMAT_LIST}`,\n formatOption,\n \"pretty\",\n )\n .action(\n (\n node: string,\n opts: {\n config?: string | boolean;\n graph?: string;\n depth?: number;\n predicates?: string;\n reverse?: boolean;\n impact?: boolean;\n variant?: string;\n softwareSubject?: string;\n lang?: string;\n limit?: number;\n format: GraphFormat;\n },\n ) => {\n try {\n const { softwareSubject, ...others } = rest(opts);\n const report = runTraverse({\n ...others,\n ...documentOptions(opts),\n ...(softwareSubject === undefined ? {} : { subject: softwareSubject }),\n node,\n predicates:\n opts.predicates === undefined\n ? undefined\n : splitList(opts.predicates),\n });\n console.log(renderTraverse(report, opts.format));\n } catch (e) {\n fail(e);\n }\n },\n );\n\nprogram\n .command(\"embed\")\n .description(\n \"Compute local embeddings for the search index (needs @huggingface/transformers)\",\n )\n .option(\"-c, --config <path>\", \"Path to manni.config.yaml\")\n .option(\"--no-config\", \"Ignore any discovered config file\")\n .option(\"-g, --graph <path>\", \"Graph .ttl path (default: config out)\")\n .option(\n \"-i, --index <dir>\",\n \"Directory holding the indexes and manifest (default: beside the graph)\",\n )\n .option(\n \"-o, --out <dir>\",\n \"Directory for the sidecars (default: the index directory)\",\n )\n // Not `--model`: on `fill` that is the inference model, a different thing.\n .option(\n \"--embedding-model <id>\",\n \"Embedding model id (any id; `mock` for offline runs)\",\n )\n .option(\"--dtype <dtype>\", \"Weight quantization (default q8)\")\n .option(\"--no-cache\", \"Ignore the vector cache\")\n .option(\n \"-f, --format <format>\",\n `Output: ${GRAPH_FORMAT_LIST}`,\n formatOption,\n \"pretty\",\n )\n .action(\n async (opts: {\n config?: string | boolean;\n graph?: string;\n index?: string;\n out?: string;\n embeddingModel?: string;\n dtype?: string;\n cache?: boolean;\n format: GraphFormat;\n }) => {\n try {\n const { embeddingModel, ...others } = rest(opts);\n const report = await runEmbed({\n ...others,\n ...documentOptions(opts),\n ...(embeddingModel === undefined ? {} : { model: embeddingModel }),\n noCache: opts.cache === false,\n });\n console.log(renderEmbed(report, opts.format));\n } catch (e) {\n fail(e);\n }\n },\n );\n\nprogram\n .command(\"export\")\n .description(\n \"Reserialize the built graph into a consumer format (jsonld file, iirds package, or search index)\",\n )\n // The target is a positional, not `-f`: `-f` is the output format in every\n // other verb of the family (0051 §2), and one flag cannot mean two things.\n .argument(\"<target>\", `What to write: ${EXPORT_TARGETS.join(\" | \")}`)\n .option(\"-c, --config <path>\", \"Path to manni.config.yaml\")\n .option(\"--no-config\", \"Ignore any discovered config file\")\n .option(\"-g, --graph <path>\", \"Graph .ttl path (default: config out)\")\n .option(\n \"-o, --out <path>\",\n \"Output path (default: the graph path with the target's extension)\",\n )\n .action(\n async (\n target: string,\n opts: { config?: string | boolean; graph?: string; out?: string },\n ) => {\n try {\n if (!(EXPORT_TARGETS as readonly string[]).includes(target)) {\n throw new GraphError(\n `Unknown export target \"${target}\". Use ${EXPORT_TARGETS.join(\" | \")}.`,\n );\n }\n const result = await runExport({\n ...documentOptions(opts),\n graph: opts.graph,\n format: target as ExportFormat,\n out: opts.out,\n });\n for (const warning of result.warnings) warn(warning);\n console.log(\n `Wrote ${result.nodes} node${result.nodes === 1 ? \"\" : \"s\"} to ${result.outPath}`,\n );\n } catch (e) {\n fail(e);\n }\n },\n );\n\nreturn program;\n}\n","/**\n * What `-f` accepts, per verb.\n *\n * Each verb's renderer lives beside its command core (`renderCheck`,\n * `renderStats`, …); what belongs here is the *list*, stated once so the\n * union, the guard, the help text and the refusal sentence cannot drift\n * apart. It is the same shape a11y and cite keep (`A11Y_FORMATS`,\n * `REPORT_FORMATS`), which is why the sentence a user reads is the family's.\n *\n * Every verb takes `pretty | json`. `check` also takes `github`, because it is\n * the CI gate: it is the one graph verb whose output changes what a reviewer sees\n * on a pull request (proposal 0051 §2). It names its own list here rather than\n * widening the shared one, so no other verb advertises a format it cannot\n * render.\n */\n\n/** The list every graph verb's `-f` accepts, in the order messages list them. */\nexport const GRAPH_FORMATS = [\"pretty\", \"json\"] as const;\nexport type GraphFormat = (typeof GRAPH_FORMATS)[number];\n\n/** `\"pretty | json\"`, for help text and the refusal sentence. */\nexport const GRAPH_FORMAT_LIST: string = GRAPH_FORMATS.join(\" | \");\n\n/** `check`'s list: the shared two plus the CI annotation format. */\nexport const CHECK_FORMATS = [...GRAPH_FORMATS, \"github\"] as const;\nexport type CheckFormat = (typeof CHECK_FORMATS)[number];\n\n/** `\"pretty | json | github\"`, for help text and the refusal sentence. */\nexport const CHECK_FORMAT_LIST: string = CHECK_FORMATS.join(\" | \");\n","/**\n * `manni graph init` — scaffold a starter `graph:` section in manni.config.yaml.\n *\n * The family file is shared with the other tools, so a file that already\n * exists is not overwritten: the section is appended to it, leaving the\n * siblings' keys and comments exactly as they were. A file that already has a\n * `graph:` key is refused.\n */\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { parse as parseYaml } from \"yaml\";\nimport { errorMessage } from \"../../shared/errors.js\";\nimport { writeTextAtomic } from \"../../shared/write-file.js\";\nimport { GraphError } from \"../types.js\";\nimport { CONFIG_SECTION, DEFAULT_CONFIG_FILENAME } from \"../core/config.js\";\n\nconst HEADER = `# manni.config.yaml — shared configuration for the manni family of tools.\n# Each tool reads its own top-level key; manni graph reads \"graph:\".\n`;\n\nconst STARTER = `# Base IRI for every minted node. Set this to a namespace you control;\n# without it, IRIs fall back to the urn:manni:graph: placeholder.\n# baseIri: https://example.com/graph/\n\n# There is no document set here. \\`manni graph build\\` and \\`manni graph fill\\` read the\n# paths you name, or the collections declared once for every tool at the TOP\n# level of this file, beside \\`graph:\\` rather than inside it:\n#\n# collections:\n# - name: site\n# paths: [\"docs/**/*.md\"]\n#\n# Output of \\`manni graph build\\`.\nout: graph/graph.ttl\n\n# Map published-site routes back to source files so route-style links\n# (/docs/actions/find) become graph edges. A route may also carry the BCP-47\n# \\`language\\` labelling every document under its root; a page's own \\`lang\\`\n# frontmatter wins. Uncomment and adjust:\n# routes:\n# - basePath: /docs\n# root: docs\n# extensions: [.md, .mdx, .markdown]\n# indexFiles: [index, README]\n# - basePath: /docs/de\n# root: docs/de\n# language: de\n\n# What to derive triples from. Remove entries to opt out.\nbuild:\n derive: [frontmatter, sections, links, tags, images, code, provenance]\n\n# PROV-O settings. Git history is detected, not switched: per-file dates and\n# author agents, rename -> prov:wasRevisionOf, and the build activity's HEAD\n# committer date are derived wherever git can run over a repository, and a run\n# that cannot says so once and builds the rest. Deterministic per commit;\n# wall-clock time never enters the graph.\n# qualified: emit prov:qualifiedAttribution/qualifiedAssociation nodes\n# with roles alongside the direct properties.\nprovenance:\n qualified: true\n\n# Which fields a published graph may carry is read from x-manni-graph-output in\n# the schema set \\`manni meta validate\\` resolves for each page. Set that under\n# meta: (schemas, strict, register), not here. The default set keeps the\n# stewardship people fields (owner, stakeholders, reviewed-by) out.\n\n# SHACL shapes \\`manni graph check\\` validates the built graph against. Default:\n# the shapes contract bundled with manni (shapes/graph/shapes-1.0.0.ttl).\n# check:\n# shapes: [\"./my-shapes.ttl\"]\n\n# Metadata coverage gate for \\`manni graph stats --check\\`. A number applies to\n# every measured field; a map gates named fields only. Unset gates nothing.\n# stats:\n# coverageThreshold:\n# title: 100\n# description: 50\n\n# Which provider \\`manni graph fill\\` sends pages to. Unset, the family's\n# top-level providers: map decides, and then \\`auto\\`, which detects one: an\n# Anthropic key, then an OpenAI key, then the Claude CLI, then a local model.\n# Connection settings (apiKeyEnv, baseUrl, command) live in that map, declared\n# once for every manni tool. \\`--provider\\` wins over this, \\`--local\\` over both.\n# provider: anthropic # auto | anthropic | openai | claude-cli | llama-cpp\n# model: claude-sonnet-4-5 # the provider's default when omitted\n\n# LLM settings for \\`manni graph fill\\` (SKOS frontmatter proposals).\nfill:\n temperature: 0\n # Stop after this many inference calls. One page is one turn, and a cached\n # page spends none. Unset is unbounded.\n # maxTurns: 50\n cacheDir: .manni/graph/cache\n # fill proposes every field; confidence (0..1 per field) gates what is\n # written. Fields scored below the threshold are reported, not written.\n confidenceThreshold: 0.7\n # fields: defaults to every fillable field — uncomment to restrict.\n # Record meta-provenance (model + /graph/ pointers + confidence) on filled docs.\n writeProvenance: true\n # Reject proposals that would violate the SHACL shapes contract\n # (broader/narrower cycles, conflicting labels).\n validateGraph: true\n # Also propose per-section metadata. Off by default: it costs more output per\n # call, and section metadata is explicit-only, so review it as carefully.\n sections: false\n\n# Local embeddings for semantic search (\\`manni graph embed\\`). Needs the optional\n# peer: npm install @huggingface/transformers\n# embed:\n# model: onnx-community/granite-embedding-small-english-r2-ONNX\n# dtype: q8 # q8 keeps embedding reproducible across platforms\n# out: graph # directory for the per-language vector sidecars\n# cacheDir: .manni/graph/embed-cache\n\n# Optional enrichment for \\`manni graph export iirds\\` (the iiRDS package).\n# Absent, a minimal valid package is still produced.\n# export:\n# iirds:\n# title: My Docs # package title (default: \"manni graph export\")\n# creator: Acme Corp # Creator iirds:Party + vcard:Organization\n# version: \"1.3\" # iiRDS version literal: \"1.2\" | \"1.3\"\n`;\n\n/** The starter as a `graph:` section: every line nested one level. */\nfunction starterSection(): string {\n const body = STARTER.split(\"\\n\")\n .map((line) => (line === \"\" ? \"\" : ` ${line}`))\n .join(\"\\n\");\n return `${CONFIG_SECTION}:\\n${body}`;\n}\n\nexport async function runInit(cwd = process.cwd()): Promise<string> {\n const path = resolve(cwd, DEFAULT_CONFIG_FILENAME);\n if (!existsSync(path)) {\n await writeTextAtomic(path, `${HEADER}${starterSection()}`);\n return path;\n }\n\n // A family file is already here. Parse it to make sure a `graph:` key can be\n // appended: the document must be a mapping (or empty) without one.\n const text = readFileSync(path, \"utf8\");\n let doc: unknown;\n try {\n doc = parseYaml(text);\n } catch (e) {\n throw new GraphError(\n `Invalid YAML in ${DEFAULT_CONFIG_FILENAME}: ${errorMessage(e)}`,\n );\n }\n if (doc != null && (typeof doc !== \"object\" || Array.isArray(doc))) {\n throw new GraphError(\n `${DEFAULT_CONFIG_FILENAME}: top level must be a mapping — not adding a \\`${CONFIG_SECTION}:\\` section to it.`,\n );\n }\n if (doc != null && Object.hasOwn(doc, CONFIG_SECTION)) {\n throw new GraphError(\n `${DEFAULT_CONFIG_FILENAME} already has a \\`${CONFIG_SECTION}:\\` section — not overwriting.`,\n );\n }\n // Append as text rather than re-serialising the document, so the siblings'\n // keys and comments come out byte-for-byte as they went in.\n const separator = text === \"\" || text.endsWith(\"\\n\") ? \"\" : \"\\n\";\n const blank = text === \"\" ? \"\" : \"\\n\";\n await writeTextAtomic(\n path,\n `${text}${separator}${blank}${starterSection()}`,\n );\n return path;\n}\n"],"mappings":"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","names":[]}
|