@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/site/cli.ts","../src/site/core/detect.ts","../src/site/errors.ts","../src/site/core/config.ts","../src/site/core/run.ts","../src/site/core/static-server.ts","../src/site/commands/run.ts"],"sourcesContent":["/**\n * The `site` domain's commander program. Mounted by `src/cli.ts` under\n * `manni site`; no entry point of its own. Like `key` (proposal 0045), `site`\n * is a family resource with verbs: the site every other domain checks\n * (proposal 0082). Three verbs, no default subcommand.\n *\n * These verbs print no report: the framework's output is the output, on the\n * inherited stdio. manni's own lines are diagnostics on stderr. Exit `0` done,\n * `2` operational/usage, and never `1`, because nothing here is a finding.\n */\nimport { Command } from \"commander\";\nimport pkg from \"../../package.json\" with { type: \"json\" };\nimport { fail } from \"../shared/run.js\";\nimport { runSite } from \"./commands/run.js\";\nimport type { Verb } from \"./types.js\";\n\n/** What commander hands each verb's action. */\ninterface SiteCliOptions {\n /** `-c, --config <file>`. */\n config?: string;\n /** `--port <n>` as typed; `resolvePlan` validates it. start and preview only. */\n port?: string;\n /** `--host <host>`. start and preview only. */\n host?: string;\n}\n\n/**\n * Split a verb's operands into `[dir]` and what came after `--`.\n *\n * Commander drops the `--` itself, at whichever program met it first (here,\n * the umbrella), and hands everything after it on as operands. So `[dir]`\n * alone cannot tell `start -- --open` (no dir) from `start website`. The\n * process argv still has the `--`, and what follows it is the tail of the\n * operands; a tail that does not match (a program parsed from elsewhere) is\n * no passthrough at all.\n * ponytail: an option given `--` as its value (`--host --`) is misread as the\n * separator; nobody binds a host named `--`.\n */\nfunction splitOperands(args: readonly string[]): { dir: string | undefined; passthrough: string[]; extra: number } {\n const at = process.argv.indexOf(\"--\");\n const tail = at === -1 ? [] : process.argv.slice(at + 1);\n const start = args.length - tail.length;\n const passthrough = start >= 0 && tail.every((arg, i) => args[start + i] === arg) ? tail : [];\n const before = args.slice(0, args.length - passthrough.length);\n return { dir: before[0], passthrough, extra: before.length };\n}\n\nexport function buildProgram(): Command {\n const program = new Command();\n program\n .name(\"site\")\n .description(\"Start, build and preview the docs site\")\n .version(pkg.version, \"-V, --version\")\n // A pointer, not the whole help screen: the message that precedes it\n // already names the offending flag.\n .showHelpAfterError(\"(add --help for usage)\")\n // MUST come before the `.command()` calls below. `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)`.\n .exitOverride();\n\n const verb = (name: Verb, description: string, serves: boolean): void => {\n const cmd = program\n .command(name)\n .description(description)\n .argument(\"[dir]\", \"the site's directory (default: site.dir, else found by search)\")\n // Everything after `--` arrives as operands; splitOperands sorts them.\n .allowExcessArguments();\n if (serves) {\n cmd\n .option(\"--port <n>\", \"port, an integer from 1 to 65535 (default: a local collection url, else the framework's)\")\n .option(\"--host <host>\", \"host to bind (default: a local collection url, else the framework's)\");\n }\n cmd\n .option(\"-c, --config <file>\", \"path to a manni config file\")\n .action(async (_dir: string | undefined, options: SiteCliOptions, self: Command) => {\n const { dir, passthrough, extra } = splitOperands(self.args);\n if (extra > 1) {\n self.error(\n `error: too many arguments for '${name}'. Expected 1 argument but got ${String(extra)}.`,\n { code: \"commander.excessArguments\" },\n );\n }\n try {\n process.exitCode = await runSite(name, {\n cwd: process.cwd(),\n dir,\n configPath: options.config,\n port: options.port,\n host: options.host,\n passthrough,\n });\n } catch (err) {\n fail(err);\n }\n });\n };\n\n verb(\"start\", \"Run the docs framework's dev server\", true);\n verb(\"build\", \"Build the docs site\", false);\n verb(\"preview\", \"Build the docs site, then serve the output\", true);\n\n program.addHelpText(\n \"after\",\n [\n \"\",\n \"Examples:\",\n \" manni site start # detect the framework, run its dev server\",\n \" manni site build\",\n \" manni site preview --port 4000 # build, then serve the output\",\n \" manni site start website -- --open # arguments after -- go to the framework\",\n ].join(\"\\n\"),\n );\n\n return program;\n}\n","/**\n * From a directory to the commands `manni site` runs (proposal 0082). The\n * site is found, its framework read from marker files (detect, don't switch),\n * and each verb resolved to argv, a `site.commands` override, or the built-in\n * static server. Everything that can fail before a process starts fails here.\n */\nimport { existsSync, readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { dirname, join, posix, relative, resolve } from \"node:path\";\nimport type { CollectionConfig } from \"../../shared/collections.js\";\nimport { FAMILY_CONFIG_NAMES } from \"../../shared/config-file.js\";\nimport { searchPath } from \"../../shared/git-root.js\";\nimport { warn } from \"../../shared/warn.js\";\nimport { SiteError } from \"../errors.js\";\nimport type { Plan, PlannedStep, Verb } from \"../types.js\";\nimport { loadSiteConfig } from \"./config.js\";\n\nexport interface ResolveOptions {\n cwd: string;\n /** The positional `[dir]`, relative to `cwd`. */\n dir?: string;\n configPath?: string;\n /** `--port` as typed; validated here. */\n port?: string;\n host?: string;\n /** Everything after `--`. */\n passthrough: string[];\n}\n\n/** A command: Node frameworks name the script they prefer over the binary. */\ninterface Cmd {\n script?: string;\n argv: string[];\n}\n\ninterface Site {\n dir: string;\n scripts: Record<string, unknown>;\n deps: Set<string>;\n}\n\ninterface Framework {\n name: string;\n /** The marker that matched, for messages, or `null`. */\n marker: (site: Site) => string | null;\n /** How the binary is reached: a package manager, uv/poetry, bundler, or PATH. */\n runner: \"node\" | \"python\" | \"ruby\" | \"path\";\n /** Node only: the package that provides the binary. */\n pkg?: (site: Site) => string;\n commands: (site: Site) => { start: Cmd; build?: Cmd; preview?: Cmd; out?: string };\n /** `-a` means one `-a host:port`; `null` means the server takes no host. */\n hostFlag: \"--host\" | \"--hostname\" | \"--bind\" | \"-a\" | null;\n defaultPort: number;\n}\n\nconst has = (dir: string, ...parts: string[]): boolean => existsSync(join(dir, ...parts));\nconst read = (path: string): string => {\n try {\n return readFileSync(path, \"utf8\");\n } catch {\n return \"\";\n }\n};\nconst dep = (name: string) => (s: Site) => (s.deps.has(name) ? name : null);\nconst node = (bin: string, start: string, build: string, preview: string, args: string[] = []) => ({\n start: { script: start, argv: [bin, \"dev\", ...args] },\n build: { script: build, argv: [bin, \"build\", ...args] },\n preview: { script: preview, argv: [bin, \"preview\", ...args] },\n});\nconst next = () => ({\n start: { script: \"dev\", argv: [\"next\", \"dev\"] },\n build: { script: \"build\", argv: [\"next\", \"build\"] },\n preview: { script: \"start\", argv: [\"next\", \"start\"] },\n});\n\nfunction mintlify(s: Site): string | null {\n if (has(s.dir, \"mint.json\")) return \"mint.json\";\n try {\n const doc = JSON.parse(read(join(s.dir, \"docs.json\"))) as Record<string, unknown>;\n const schema = doc.$schema;\n // Without Mintlify's $schema, it takes the pair its docs.json requires: a theme and a navigation.\n const shaped = typeof doc.theme === \"string\" && typeof doc.navigation === \"object\" && doc.navigation !== null;\n if ((typeof schema === \"string\" && schema.includes(\"mintlify\")) || shaped) {\n return \"docs.json\";\n }\n } catch {\n // No docs.json, or not JSON: not Mintlify.\n }\n return null;\n}\n\n// Both the MkDocs and Zensical markers ask, so each site is answered once.\nconst zensicalSeen = new WeakMap<Site, string | null>();\n\nfunction zensical(s: Site): string | null {\n const seen = zensicalSeen.get(s);\n if (seen !== undefined) return seen;\n const found = zensicalMarker(s);\n zensicalSeen.set(s, found);\n return found;\n}\n\nfunction zensicalMarker(s: Site): string | null {\n if (has(s.dir, \"zensical.toml\")) return \"zensical.toml\";\n if (!has(s.dir, \"mkdocs.yml\")) return null;\n let files: string[];\n try {\n files = readdirSync(s.dir).filter((f) => /^requirements.*\\.txt$/.test(f) || f === \"pyproject.toml\");\n } catch {\n // An unlistable directory names no Python deps; it reads as plain MkDocs.\n return null;\n }\n return files.some((f) => /\\bzensical\\b/.test(read(join(s.dir, f)))) ? \"mkdocs.yml\" : null;\n}\n\nconst sphinxSource = (s: Site): string => (has(s.dir, \"conf.py\") ? \".\" : \"source\");\n\n/** Detected frameworks, in the order an ambiguity lists them. */\nconst FRAMEWORKS: Framework[] = [\n {\n name: \"Mintlify\",\n marker: mintlify,\n runner: \"path\",\n commands: () => ({ start: { argv: [\"mint\", \"dev\"] } }),\n hostFlag: null,\n defaultPort: 3000,\n },\n {\n name: \"Fern\",\n marker: (s) => (has(s.dir, \"fern\", \"fern.config.json\") ? \"fern/fern.config.json\" : null),\n runner: \"path\",\n commands: () => ({ start: { argv: [\"fern\", \"docs\", \"dev\"] } }),\n hostFlag: null,\n defaultPort: 3000,\n },\n {\n name: \"Starlight\",\n marker: dep(\"@astrojs/starlight\"),\n runner: \"node\",\n pkg: () => \"astro\",\n commands: () => node(\"astro\", \"dev\", \"build\", \"preview\"),\n hostFlag: \"--host\",\n defaultPort: 4321,\n },\n {\n name: \"Docusaurus\",\n marker: dep(\"@docusaurus/core\"),\n runner: \"node\",\n pkg: () => \"@docusaurus/core\",\n commands: () => ({\n start: { script: \"start\", argv: [\"docusaurus\", \"start\"] },\n build: { script: \"build\", argv: [\"docusaurus\", \"build\"] },\n preview: { script: \"serve\", argv: [\"docusaurus\", \"serve\"] },\n }),\n hostFlag: \"--host\",\n defaultPort: 3000,\n },\n {\n name: \"VitePress\",\n marker: dep(\"vitepress\"),\n runner: \"node\",\n pkg: () => \"vitepress\",\n commands: (s) =>\n node(\"vitepress\", \"docs:dev\", \"docs:build\", \"docs:preview\", (has(s.dir, \".vitepress\") || !has(s.dir, \"docs\", \".vitepress\")) ? [] : [\"docs\"]),\n hostFlag: \"--host\",\n defaultPort: 5173,\n },\n {\n name: \"Nextra\",\n marker: dep(\"nextra\"),\n runner: \"node\",\n pkg: () => \"next\",\n commands: next,\n hostFlag: \"--hostname\",\n defaultPort: 3000,\n },\n {\n name: \"Fumadocs\",\n marker: dep(\"fumadocs-core\"),\n runner: \"node\",\n pkg: () => \"next\",\n commands: next,\n hostFlag: \"--hostname\",\n defaultPort: 3000,\n },\n {\n name: \"Rspress\",\n marker: (s) => dep(\"rspress\")(s) ?? dep(\"@rspress/core\")(s),\n runner: \"node\",\n pkg: (s) => (s.deps.has(\"rspress\") ? \"rspress\" : \"@rspress/core\"),\n commands: () => node(\"rspress\", \"dev\", \"build\", \"preview\"),\n hostFlag: \"--host\",\n defaultPort: 3000,\n },\n {\n name: \"MkDocs\",\n marker: (s) => (has(s.dir, \"mkdocs.yml\") && zensical(s) === null ? \"mkdocs.yml\" : null),\n runner: \"python\",\n commands: () => ({ start: { argv: [\"mkdocs\", \"serve\"] }, build: { argv: [\"mkdocs\", \"build\"] }, out: \"site\" }),\n hostFlag: \"-a\",\n defaultPort: 8000,\n },\n {\n name: \"Zensical\",\n marker: zensical,\n runner: \"python\",\n commands: () => ({ start: { argv: [\"zensical\", \"serve\"] }, build: { argv: [\"zensical\", \"build\"] }, out: \"site\" }),\n hostFlag: \"-a\",\n defaultPort: 8000,\n },\n {\n name: \"Sphinx\",\n marker: (s) => (has(s.dir, \"conf.py\") ? \"conf.py\" : has(s.dir, \"source\", \"conf.py\") ? \"source/conf.py\" : null),\n runner: \"python\",\n commands: (s) => {\n const src = sphinxSource(s);\n return {\n start: { argv: [\"sphinx-autobuild\", src, posix.join(src, \"_build\", \"html\")] },\n build: { argv: [\"sphinx-build\", \"-M\", \"html\", src, posix.join(src, \"_build\")] },\n out: posix.join(src, \"_build\", \"html\"),\n };\n },\n hostFlag: \"--host\",\n defaultPort: 8000,\n },\n {\n name: \"Hugo\",\n marker: (s) => [\"hugo.toml\", \"hugo.yaml\", \"hugo.json\"].find((f) => has(s.dir, f)) ?? null,\n runner: \"path\",\n commands: () => ({ start: { argv: [\"hugo\", \"server\"] }, build: { argv: [\"hugo\"] }, out: \"public\" }),\n hostFlag: \"--bind\",\n defaultPort: 1313,\n },\n {\n name: \"Jekyll\",\n marker: (s) =>\n has(s.dir, \"_config.yml\") && /\\b(jekyll|github-pages)\\b/.test(read(join(s.dir, \"Gemfile\")))\n ? \"_config.yml\"\n : null,\n runner: \"ruby\",\n commands: () => ({ start: { argv: [\"jekyll\", \"serve\"] }, build: { argv: [\"jekyll\", \"build\"] }, out: \"_site\" }),\n hostFlag: \"--host\",\n defaultPort: 4000,\n },\n];\n\nconst LOCAL_HOSTS = new Set([\"localhost\", \"127.0.0.1\", \"[::1]\"]);\nconst STATIC_HOST = \"127.0.0.1\";\n// Only the name error messages show; discovery reads FAMILY_CONFIG_NAMES itself.\nconst CONFIG_NAME = FAMILY_CONFIG_NAMES[0] ?? \"manni.config.yaml\";\n\ntype PackageManager = \"npm\" | \"pnpm\" | \"yarn\" | \"bun\";\nconst LOCKFILES: [string, PackageManager][] = [\n [\"package-lock.json\", \"npm\"],\n [\"npm-shrinkwrap.json\", \"npm\"],\n [\"pnpm-lock.yaml\", \"pnpm\"],\n [\"yarn.lock\", \"yarn\"],\n [\"bun.lock\", \"bun\"],\n [\"bun.lockb\", \"bun\"],\n];\nconst EXEC: Record<PackageManager, string[]> = {\n npm: [\"npx\"],\n pnpm: [\"pnpm\", \"exec\"],\n yarn: [\"yarn\"],\n bun: [\"bun\", \"x\"],\n};\n\nfunction readPackageJson(dir: string): Record<string, unknown> | null {\n const text = read(join(dir, \"package.json\"));\n if (text === \"\") return null;\n try {\n const value: unknown = JSON.parse(text);\n return typeof value === \"object\" && value !== null ? (value as Record<string, unknown>) : null;\n } catch {\n return null;\n }\n}\n\nconst record = (value: unknown): Record<string, unknown> =>\n typeof value === \"object\" && value !== null ? (value as Record<string, unknown>) : {};\n\nfunction siteAt(dir: string): Site {\n const pkg = readPackageJson(dir);\n return {\n dir,\n scripts: record(pkg?.scripts),\n deps: new Set([...Object.keys(record(pkg?.dependencies)), ...Object.keys(record(pkg?.devDependencies))]),\n };\n}\n\n/** `packageManager:` from the nearest package.json carrying it, then the nearest lockfile, then npm. */\nfunction packageManager(dir: string): PackageManager {\n const chain = searchPath(dir);\n for (const d of chain) {\n const field = readPackageJson(d)?.packageManager;\n const name = typeof field === \"string\" ? field.split(\"@\")[0] : undefined;\n if (name !== undefined && Object.hasOwn(EXEC, name)) return name as PackageManager;\n }\n for (const d of chain) {\n const hit = LOCKFILES.find(([file]) => has(d, file));\n if (hit) return hit[1];\n }\n return \"npm\";\n}\n\nfunction pythonPrefix(dir: string): string[] {\n for (const d of searchPath(dir)) {\n if (has(d, \"uv.lock\")) return [\"uv\", \"run\"];\n if (has(d, \"poetry.lock\")) return [\"poetry\", \"run\"];\n }\n return [];\n}\n\nfunction isDirectory(path: string): boolean {\n try {\n return statSync(path).isDirectory();\n } catch {\n return false;\n }\n}\n\nfunction parsePort(raw: string): number {\n const port = /^\\d+$/.test(raw) ? Number(raw) : NaN;\n if (!(port >= 1 && port <= 65535)) {\n throw new SiteError(`--port must be an integer from 1 to 65535, got \"${raw}\".`);\n }\n return port;\n}\n\n/**\n * One argument for the shell an override runs in, so `-- --title \"My Docs\"`\n * stays one argument. Plain tokens pass unchanged.\n */\nfunction shellQuote(arg: string): string {\n if (/^[\\w@%+=:,./-]+$/.test(arg)) return arg;\n // cmd.exe doubles a quote inside quotes; POSIX closes, escapes and reopens.\n return process.platform === \"win32\" ? `\"${arg.replace(/\"/g, '\"\"')}\"` : `'${arg.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nconst andList = (items: string[]): string =>\n items.length <= 1 ? items.join(\"\") : `${items.slice(0, -1).join(\", \")} and ${items.at(-1) ?? \"\"}`;\n\ninterface Address {\n host?: string;\n port?: number;\n base: string;\n}\n\n/** The host, port and path a local collection `url:` names, when they agree. */\nfunction collectionAddress(collections: CollectionConfig[], framework: string, portFlag: boolean): Address {\n const local = collections.flatMap((c) => {\n if (c.url === undefined) return [];\n const url = new URL(c.url);\n if (!LOCAL_HOSTS.has(url.hostname)) return [];\n const port = url.port === \"\" ? (url.protocol === \"https:\" ? 443 : 80) : Number(url.port);\n return [{ name: c.name, host: url.hostname.replace(/^\\[|\\]$/g, \"\"), port, base: url.pathname }];\n });\n const [first] = local;\n if (first === undefined) return { base: \"/\" };\n if (local.some((l) => l.host !== first.host || l.port !== first.port)) {\n if (!portFlag) {\n warn(\n `collections ${andList(local.map((l) => l.name))} name different local URLs. Using ${framework}'s default port; pass --port to pick one.`,\n );\n }\n return { base: \"/\" };\n }\n // Collections on one server are sections of one site: it mounts where they all live.\n return { ...first, base: sharedPath(local.map((l) => l.base)) };\n}\n\n/** The longest leading run of whole path segments every path shares, as `/a/b/`. */\nfunction sharedPath(paths: string[]): string {\n const split = paths.map((p) => p.split(\"/\").filter((s) => s !== \"\"));\n const [head = [], ...rest] = split;\n const shared: string[] = [];\n for (const [i, segment] of head.entries()) {\n if (!rest.every((p) => p[i] === segment)) break;\n shared.push(segment);\n }\n return shared.length === 0 ? \"/\" : `/${shared.join(\"/\")}/`;\n}\n\nfunction addressArgs(fw: Framework, host: string | undefined, port: number | undefined): string[] {\n if (fw.hostFlag === \"-a\") {\n if (host === undefined && port === undefined) return [];\n const h = host ?? STATIC_HOST;\n return [\"-a\", `${h.includes(\":\") ? `[${h}]` : h}:${String(port ?? fw.defaultPort)}`];\n }\n return [\n ...(host !== undefined && fw.hostFlag !== null ? [fw.hostFlag, host] : []),\n ...(port !== undefined ? [\"--port\", String(port)] : []),\n ];\n}\n\nexport function resolvePlan(verb: Verb, opts: ResolveOptions): Plan {\n const config = loadSiteConfig(opts.cwd, opts.configPath);\n const shown = (dir: string): string => {\n const rel = relative(opts.cwd, dir).replace(/\\\\/g, \"/\");\n return rel === \"\" ? \"./\" : `${rel}/`;\n };\n\n // The verb whose step takes --port and --host; `build` takes neither.\n const serving = verb === \"build\" ? null : verb;\n const flagPort = serving !== null && opts.port !== undefined ? parsePort(opts.port) : undefined;\n const flagHost = serving !== null ? opts.host : undefined;\n if (serving !== null && config.commands[serving] !== undefined) {\n if (flagPort !== undefined) {\n throw new SiteError(`--port does not apply to site.commands.${serving}. Put the port in that command.`);\n }\n if (flagHost !== undefined) {\n throw new SiteError(`--host does not apply to site.commands.${serving}. Put the host in that command.`);\n }\n }\n\n const needed: Verb[] = verb === \"preview\" ? [\"build\", \"preview\"] : [verb];\n const missing = needed.find((v) => config.commands[v] === undefined);\n const key = `site.commands.${missing ?? verb} in ${CONFIG_NAME}`;\n const setIt = `Set ${key}.`;\n\n // Find the site.\n let site: Site | undefined;\n const explicit = opts.dir !== undefined ? resolve(opts.cwd, opts.dir) : config.dir;\n if (explicit !== undefined) {\n if (!isDirectory(explicit)) throw new SiteError(`${shown(explicit)} does not exist.`);\n // Fern's site is the folder above `fern/`, wherever the user points.\n const dir = has(explicit, \"fern.config.json\") && !has(explicit, \"fern\", \"fern.config.json\") ? dirname(explicit) : explicit;\n site = siteAt(dir);\n } else {\n const base = config.configDir ?? resolve(opts.cwd);\n const candidates = [base, join(base, \"docs\"), join(base, \"website\"), join(base, \"site\")];\n for (const dir of candidates) {\n if (!isDirectory(dir)) continue;\n const candidate = siteAt(dir);\n if (FRAMEWORKS.some((fw) => fw.marker(candidate) !== null)) {\n site = candidate;\n break;\n }\n }\n if (site === undefined) {\n if (missing !== undefined) {\n const names = candidates.map(shown);\n throw new SiteError(\n `no docs site found in ${names.slice(0, -1).join(\", \")} or ${names.at(-1) ?? \"\"}. Pass the site's directory, or set ${key}.`,\n );\n }\n site = siteAt(base);\n }\n }\n const where = shown(site.dir);\n const found = site;\n\n // Which framework, only when some step needs one.\n const matches = FRAMEWORKS.flatMap((fw) => {\n const marker = fw.marker(found);\n return marker === null ? [] : [{ fw, marker }];\n });\n let fw: Framework | undefined;\n if (missing !== undefined) {\n if (matches.length === 0) throw new SiteError(`no docs framework detected in ${where}. ${setIt}`);\n if (matches.length > 1) {\n const list = matches.map((m) => `${m.fw.name} (${m.marker})`).join(\", \");\n throw new SiteError(`${where} holds more than one docs site: ${list}. ${setIt}`);\n }\n fw = matches[0]?.fw;\n }\n\n const steps = needed.map((v): PlannedStep => {\n const override = config.commands[v];\n const isServe = v === serving;\n // Passthrough goes to the verb's own step: the serve step, for preview.\n const extra = v === verb ? opts.passthrough : [];\n if (override !== undefined) {\n const command = [override, ...extra.map(shellQuote)].join(\" \");\n return {\n announce: `Running site.commands.${v} in ${where}: ${command}`,\n display: command,\n notFound: \"\",\n step: { kind: \"shell\", command, cwd: found.dir },\n };\n }\n if (fw === undefined) throw new SiteError(`no docs framework detected in ${where}. ${setIt}`);\n const cmds = fw.commands(found);\n const cmd = cmds[v];\n if (v === \"build\" && cmd === undefined) {\n throw new SiteError(`${fw.name} has no local build. Run manni site start, or set site.commands.build.`);\n }\n\n let address: Address = { base: \"/\" };\n if (isServe) {\n if (flagHost !== undefined && fw.hostFlag === null) {\n throw new SiteError(`${fw.name}'s dev server takes no host option. Drop --host.`);\n }\n // Always read the url: its path is the mount point even when both flags set host and port.\n const url = collectionAddress(config.collections, fw.name, flagPort !== undefined);\n address = { host: flagHost ?? url.host, port: flagPort ?? url.port, base: url.base };\n }\n\n if (cmd === undefined) {\n if (cmds.out === undefined) {\n throw new SiteError(`${fw.name} has no local preview. Run manni site start, or set site.commands.preview.`);\n }\n if (extra.length > 0) {\n throw new SiteError(`${fw.name} previews through manni's built-in server, which takes no extra arguments. Drop the arguments after --.`);\n }\n return {\n announce: \"\",\n display: \"\",\n notFound: \"\",\n step: {\n kind: \"static\",\n root: join(found.dir, cmds.out),\n host: address.host ?? STATIC_HOST,\n port: address.port ?? fw.defaultPort,\n base: address.base,\n },\n };\n }\n\n const flags = [...(isServe ? addressArgs(fw, address.host, address.port) : []), ...extra];\n let argv: string[];\n if (fw.runner === \"node\") {\n const pm = packageManager(found.dir);\n requireInstalled(fw, found, pm, where);\n argv =\n cmd.script !== undefined && cmd.script in found.scripts\n ? [pm, \"run\", cmd.script, ...(pm === \"npm\" && flags.length > 0 ? [\"--\"] : []), ...flags]\n : [...EXEC[pm], ...cmd.argv, ...flags];\n } else {\n const prefix = fw.runner === \"python\" ? pythonPrefix(found.dir) : fw.runner === \"ruby\" ? [\"bundle\", \"exec\"] : [];\n argv = [...prefix, ...cmd.argv, ...flags];\n }\n const display = argv.join(\" \");\n const bin = argv[0] ?? \"\";\n // A prefix manni added (npm, uv, bundle...) is its own install, not the framework's.\n const install = bin === cmd.argv[0] ? `${fw.name}'s CLI` : bin;\n return {\n announce: `${fw.name} in ${where}. Running ${display}`,\n display,\n notFound: `${bin} not found on PATH. Install ${install}, or set site.commands.${v}.`,\n step: { kind: \"exec\", argv, cwd: found.dir },\n };\n });\n return { steps };\n}\n\n/**\n * The framework's package must resolve from the site, as Node would find it.\n * ponytail: the walk stops at the git root, not the filesystem root, so a\n * package installed above the repository is reported missing. Widen it if\n * anyone keeps node_modules outside their checkout.\n */\nfunction requireInstalled(fw: Framework, site: Site, pm: PackageManager, where: string): void {\n const pkg = fw.pkg?.(site);\n if (pkg === undefined) return;\n const chain = searchPath(site.dir);\n if (chain.some((d) => has(d, \"node_modules\", pkg, \"package.json\"))) return;\n // Yarn Plug'n'Play keeps no node_modules; its loader resolves the package.\n if (chain.some((d) => has(d, \".pnp.cjs\") || has(d, \".pnp.js\"))) return;\n const npmLock = chain.some((d) => has(d, \"package-lock.json\") || has(d, \"npm-shrinkwrap.json\"));\n const install = pm === \"npm\" ? (npmLock ? \"npm ci\" : \"npm install\") : `${pm} install`;\n throw new SiteError(`${pkg} is not installed for ${where}. Run ${install} in ${where} first.`);\n}\n","import { ToolError } from \"../shared/errors.js\";\n\n/** An operational or usage error in the site domain: exit 2. */\nexport class SiteError extends ToolError {\n constructor(message: string) {\n super(message);\n this.name = \"SiteError\";\n }\n}\n","/**\n * The `site:` key of the family config file (`manni.config.yaml`). Finding\n * the file is the shared layer's job; what the section may hold is decided\n * here, with a11y's posture: an unknown key or a wrong type names the file and\n * the key, because a misspelled `comands:` silently ignored would run the\n * detected command instead of the one the user wrote.\n */\nimport { resolve } from \"node:path\";\nimport type { CollectionConfig } from \"../../shared/collections.js\";\nimport {\n findConfigFileSync,\n readConfigFileSync,\n type ConfigFileOptions,\n} from \"../../shared/config-file.js\";\nimport { SiteError } from \"../errors.js\";\nimport type { Verb } from \"../types.js\";\n\nexport interface SiteConfig {\n /** Absolute; `site.dir` resolved against the config file's directory. */\n dir?: string;\n commands: Partial<Record<Verb, string>>;\n /** The family file's `collections:`, for the local `url:` port and path. */\n collections: CollectionConfig[];\n /** Directory of the config file; `null` when none was found. */\n configDir: string | null;\n}\n\nconst SECTION = \"site\";\nconst CONFIG_KEYS = [\"dir\", \"commands\"] as const;\nconst COMMAND_KEYS = [\"start\", \"build\", \"preview\"] as const;\n\nconst CONFIG_FILE: ConfigFileOptions = {\n section: SECTION,\n legacyNames: [],\n toError: (message) => new SiteError(message),\n};\n\n/** Discover the config from `cwd`, or read `configPath` when given. */\nexport function loadSiteConfig(cwd: string, configPath?: string): SiteConfig {\n const file =\n configPath === undefined\n ? findConfigFileSync(cwd, CONFIG_FILE)\n : readConfigFileSync(configPath, cwd, CONFIG_FILE);\n if (file === null) return { commands: {}, collections: [], configDir: null };\n return {\n ...parseSiteConfig(file.value, file.source, file.dir),\n collections: file.collections,\n configDir: file.dir,\n };\n}\n\n/** Pure parser, exported for tests. */\nexport function parseSiteConfig(\n value: unknown,\n source: string,\n configDir: string,\n): Pick<SiteConfig, \"dir\" | \"commands\"> {\n const obj = asMapping(value, SECTION, CONFIG_KEYS, source);\n const config: Pick<SiteConfig, \"dir\" | \"commands\"> = { commands: {} };\n if (obj.dir !== undefined) {\n config.dir = resolve(configDir, asString(obj.dir, \"dir\", source));\n }\n const commands = asMapping(obj.commands, `${SECTION}.commands`, COMMAND_KEYS, source);\n for (const verb of COMMAND_KEYS) {\n const command = commands[verb];\n if (command !== undefined) {\n const line = asString(command, `commands.${verb}`, source);\n // A blank line runs as a shell no-op that exits 0: a build that never built.\n if (line.trim() === \"\") {\n throw new SiteError(`${source}: ${SECTION}.commands.${verb} must not be empty.`);\n }\n config.commands[verb] = line;\n }\n }\n return config;\n}\n\nfunction asMapping(\n value: unknown,\n name: string,\n keys: readonly string[],\n source: string,\n): Record<string, unknown> {\n if (value == null) return {};\n if (typeof value !== \"object\" || Array.isArray(value)) {\n throw new SiteError(`${source}: \\`${name}:\\` must be a mapping.`);\n }\n const obj = value as Record<string, unknown>;\n for (const key of Object.keys(obj)) {\n if (!keys.includes(key)) {\n throw new SiteError(\n `${source}: \\`${name}:\\` has unknown key \"${key}\". Supported keys: ${keys.join(\", \")}.`,\n );\n }\n }\n return obj;\n}\n\nfunction asString(value: unknown, key: string, source: string): string {\n if (typeof value !== \"string\") {\n throw new SiteError(`${source}: ${SECTION}.${key} must be a string.`);\n }\n return value;\n}\n","/**\n * The runner: carries out a `Plan` step by step, with the child's stdio\n * inherited so the framework's own output is the output. No timeout, because\n * the last step of `start` and `preview` is a server that runs until Ctrl-C.\n */\nimport { spawn, type ChildProcess } from \"node:child_process\";\nimport { accessSync, constants, statSync } from \"node:fs\";\nimport { delimiter, resolve } from \"node:path\";\nimport { launcherCommandLine } from \"../../shared/batch-launcher.js\";\nimport { notice } from \"../../shared/warn.js\";\nimport { SiteError } from \"../errors.js\";\nimport type { Plan, PlannedStep, Step } from \"../types.js\";\nimport { serveStatic } from \"./static-server.js\";\n\nfunction isExecutable(path: string): boolean {\n try {\n if (!statSync(path).isFile()) return false;\n if (process.platform !== \"win32\") accessSync(path, constants.X_OK);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Where `name` resolves, the way the OS would find it: a name with a separator\n * against `cwd`, a bare one along PATH. On Windows a name without one of\n * PATHEXT's extensions is tried with each in turn, so `npm` finds `npm.cmd`.\n */\nfunction findOnPath(name: string, cwd: string): string | undefined {\n const win = process.platform === \"win32\";\n const exts = win\n ? (process.env[\"PATHEXT\"] ?? \".COM;.EXE;.BAT;.CMD\").split(\";\").filter((e) => e !== \"\")\n : [];\n const lower = name.toLowerCase();\n const names =\n win && !exts.some((e) => lower.endsWith(e.toLowerCase())) ? exts.map((e) => name + e) : [name];\n const dirs = /[\\\\/]/.test(name)\n ? [cwd]\n : (process.env[\"PATH\"] ?? \"\").split(delimiter).filter((d) => d !== \"\");\n for (const dir of dirs) {\n for (const candidate of names) {\n const path = resolve(dir, candidate);\n if (isExecutable(path)) return path;\n }\n }\n return undefined;\n}\n\nfunction startExec(planned: PlannedStep, step: Extract<Step, { kind: \"exec\" }>): ChildProcess {\n const [name, ...args] = step.argv;\n const binary = name === undefined ? undefined : findOnPath(name, step.cwd);\n if (binary === undefined) throw new SiteError(planned.notFound);\n const line = launcherCommandLine(\n binary,\n args,\n (value) => new SiteError(`${planned.display} cannot be given an argument containing a quote: ${value}`),\n );\n return spawn(line.command, line.argv, {\n cwd: step.cwd,\n stdio: \"inherit\",\n windowsVerbatimArguments: line.verbatim,\n });\n}\n\nfunction exitOf(\n planned: PlannedStep,\n child: ChildProcess,\n): Promise<{ code: number | null; signal: NodeJS.Signals | null }> {\n return new Promise((settle, reject) => {\n child.once(\"error\", (err: NodeJS.ErrnoException) => {\n reject(\n err.code === \"ENOENT\"\n ? new SiteError(planned.notFound)\n : new SiteError(`${planned.display} could not start: ${err.message}`),\n );\n });\n child.once(\"exit\", (code, signal) => {\n settle({ code, signal });\n });\n });\n}\n\n/**\n * One step; resolves true when the user stopped it. While any step runs this\n * process ignores SIGINT itself (the terminal delivers Ctrl-C to the whole\n * process group, child included) and forwards SIGTERM, which reaches this\n * process alone, so a cancelled build is not left running. An exit after\n * either is a stop the user asked for, so it is not a failure whatever code\n * the child chose. Otherwise the step must exit 0.\n */\nasync function runStep(planned: PlannedStep): Promise<boolean> {\n const { step } = planned;\n if (step.kind === \"static\") {\n await serveStatic(step);\n return true;\n }\n const child =\n step.kind === \"exec\"\n ? startExec(planned, step)\n : spawn(step.command, { cwd: step.cwd, stdio: \"inherit\", shell: true });\n // An object, not a `let`: TypeScript cannot see the handlers assign it.\n const signal = { received: false };\n const onInt = (): void => {\n signal.received = true;\n };\n const onTerm = (): void => {\n signal.received = true;\n child.kill(\"SIGTERM\");\n };\n process.on(\"SIGINT\", onInt);\n process.on(\"SIGTERM\", onTerm);\n try {\n const exit = await exitOf(planned, child);\n if (signal.received) return true;\n if (exit.code === 0) return false;\n throw new SiteError(\n exit.code === null\n ? `${planned.display} was stopped by ${String(exit.signal)}.`\n : `${planned.display} exited with code ${String(exit.code)}.`,\n );\n } finally {\n process.off(\"SIGINT\", onInt);\n process.off(\"SIGTERM\", onTerm);\n }\n}\n\n/** Run every step in order. Resolves the exit code, 0; a failure throws `SiteError`. */\nexport async function runPlan(plan: Plan): Promise<number> {\n for (const planned of plan.steps) {\n if (planned.announce !== \"\") notice(planned.announce);\n // A stop during the build ends the run there: nothing is served.\n if (await runStep(planned)) break;\n }\n return 0;\n}\n","/**\n * The built-in static server `manni site preview` uses for frameworks whose\n * own CLI has no preview (MkDocs, Zensical, Sphinx, Hugo, Jekyll). It serves a\n * build output directory, mounted at the collection `url:` path, until the\n * process is stopped. `node:http` and `node:fs` only.\n */\nimport { createReadStream } from \"node:fs\";\nimport { stat } from \"node:fs/promises\";\nimport { createServer, type IncomingMessage, type Server, type ServerResponse } from \"node:http\";\nimport type { AddressInfo } from \"node:net\";\nimport { extname, join, relative, resolve, sep } from \"node:path\";\nimport { errorMessage } from \"../../shared/errors.js\";\nimport { SiteError } from \"../errors.js\";\n\nexport interface StaticOptions {\n root: string;\n host: string;\n port: number;\n /** The URL path the root is mounted at, e.g. `/manni/`. */\n base: string;\n}\n\n// ponytail: the types a static docs build ships. Anything else goes out as\n// application/octet-stream; add a row when a site needs one.\nconst MIME: Record<string, string> = {\n \".html\": \"text/html; charset=utf-8\",\n \".css\": \"text/css; charset=utf-8\",\n \".js\": \"text/javascript; charset=utf-8\",\n \".mjs\": \"text/javascript; charset=utf-8\",\n \".json\": \"application/json; charset=utf-8\",\n \".map\": \"application/json; charset=utf-8\",\n \".txt\": \"text/plain; charset=utf-8\",\n \".xml\": \"application/xml; charset=utf-8\",\n \".svg\": \"image/svg+xml\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n \".avif\": \"image/avif\",\n \".ico\": \"image/x-icon\",\n \".woff\": \"font/woff\",\n \".woff2\": \"font/woff2\",\n \".ttf\": \"font/ttf\",\n \".wasm\": \"application/wasm\",\n \".pdf\": \"application/pdf\",\n \".webmanifest\": \"application/manifest+json\",\n};\n\n/** `/manni/` from `manni`, `/manni` or `/manni/`; `/` from `/` or empty. */\nfunction normalizeBase(base: string): string {\n const trimmed = base.replace(/^\\/+|\\/+$/g, \"\");\n return trimmed === \"\" ? \"/\" : `/${trimmed}/`;\n}\n\nasync function kindOf(path: string): Promise<\"file\" | \"dir\" | undefined> {\n try {\n const s = await stat(path);\n if (s.isDirectory()) return \"dir\";\n return s.isFile() ? \"file\" : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction sendFile(req: IncomingMessage, res: ServerResponse, path: string, status = 200): void {\n res.writeHead(status, {\n \"content-type\": MIME[extname(path).toLowerCase()] ?? \"application/octet-stream\",\n });\n if (req.method === \"HEAD\") {\n res.end();\n return;\n }\n createReadStream(path)\n .on(\"error\", () => res.destroy())\n .pipe(res);\n}\n\nfunction redirect(res: ServerResponse, status: 301 | 302, location: string): void {\n res.writeHead(status, { location });\n res.end();\n}\n\n/**\n * The file inside `root` a URL path below the base names, or undefined when it\n * names nothing inside it. The URL parser has already collapsed `..` and\n * `%2e%2e` segments; what it leaves are encoded separators (`..%2f`, `..%5c`),\n * so the decoded path is checked for `..` segments and then for containment.\n * Both layers are needed: the parser normalises before it decodes, so a `..`\n * hidden behind an encoded separator only appears after this decode.\n */\nfunction inside(root: string, rest: string): string | undefined {\n let decoded: string;\n try {\n decoded = decodeURIComponent(rest);\n } catch {\n return undefined;\n }\n if (decoded.includes(\"\\0\") || decoded.split(/[\\\\/]/).includes(\"..\")) return undefined;\n const path = resolve(root, `.${sep}${decoded}`);\n return path === root || path.startsWith(root + sep) ? path : undefined;\n}\n\nfunction handler(root: string, base: string) {\n const notFound = join(root, \"404.html\");\n return async (req: IncomingMessage, res: ServerResponse): Promise<void> => {\n if (req.method !== \"GET\" && req.method !== \"HEAD\") {\n res.writeHead(405, { allow: \"GET, HEAD\" });\n res.end();\n return;\n }\n const url = new URL(req.url ?? \"/\", \"http://localhost\");\n const { pathname } = url;\n if (base !== \"/\" && (pathname === \"/\" || pathname === base.slice(0, -1))) {\n redirect(res, pathname === \"/\" ? 302 : 301, `${base}${url.search}`);\n return;\n }\n const path = pathname.startsWith(base) ? inside(root, pathname.slice(base.length)) : undefined;\n const kind = path === undefined ? undefined : await kindOf(path);\n if (path !== undefined && kind === \"dir\" && !pathname.endsWith(\"/\")) {\n redirect(res, 301, `${pathname}/${url.search}`);\n return;\n }\n const file = path !== undefined && kind === \"dir\" ? join(path, \"index.html\") : path;\n if (file !== undefined && (await kindOf(file)) === \"file\") {\n sendFile(req, res, file);\n } else if ((await kindOf(notFound)) === \"file\") {\n sendFile(req, res, notFound, 404);\n } else {\n res.writeHead(404, { \"content-type\": \"text/plain; charset=utf-8\" });\n res.end(\"Not found\\n\");\n }\n };\n}\n\nfunction urlOf(host: string, port: number, base: string): string {\n const shown = host.includes(\":\") ? `[${host}]` : host;\n return `http://${shown}:${String(port)}${base}`;\n}\n\n/**\n * Serve `root` at `base` on `host:port` and print the URL to stdout once\n * listening. Resolves with the listening server; the caller closes it.\n */\nexport async function startStaticServer(opts: StaticOptions): Promise<Server> {\n const root = resolve(opts.root);\n if ((await kindOf(root)) !== \"dir\") {\n const shown = relative(process.cwd(), root).split(sep).join(\"/\") || \".\";\n throw new SiteError(`${shown}/ does not exist.`);\n }\n const base = normalizeBase(opts.base);\n const handle = handler(root, base);\n const server = createServer((req, res) => {\n handle(req, res).catch(() => res.destroy());\n });\n await new Promise<void>((settle, reject) => {\n server.once(\"error\", (err: NodeJS.ErrnoException) => {\n reject(\n new SiteError(\n err.code === \"EADDRINUSE\"\n ? `port ${String(opts.port)} is in use. Pass --port, or stop the process holding it.`\n : `cannot listen on ${urlOf(opts.host, opts.port, \"\")}: ${errorMessage(err)}`,\n ),\n );\n });\n server.listen(opts.port, opts.host, settle);\n });\n const { port } = server.address() as AddressInfo;\n process.stdout.write(`${urlOf(opts.host, port, base)}\\n`);\n return server;\n}\n\n/** Serve until SIGINT or SIGTERM, then close the server and resolve. */\nexport async function serveStatic(opts: StaticOptions): Promise<void> {\n const server = await startStaticServer(opts);\n await new Promise<void>((settle) => {\n const stop = (): void => {\n process.off(\"SIGINT\", stop);\n process.off(\"SIGTERM\", stop);\n server.close(() => {\n settle();\n });\n server.closeAllConnections();\n };\n process.on(\"SIGINT\", stop);\n process.on(\"SIGTERM\", stop);\n });\n}\n","/**\n * The one command core behind `start`, `build` and `preview`: resolve the\n * verb to a plan, then run it. The three verbs differ only in the plan, which\n * `resolvePlan` owns, so they share this core rather than three copies of it.\n */\nimport { resolvePlan, type ResolveOptions } from \"../core/detect.js\";\nimport { runPlan } from \"../core/run.js\";\nimport type { Verb } from \"../types.js\";\n\n/** Resolves the exit code, 0; anything operational throws `SiteError`. */\nexport async function runSite(verb: Verb, opts: ResolveOptions): Promise<number> {\n return runPlan(resolvePlan(verb, opts));\n}\n"],"mappings":"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","names":["resolve","resolve","fw","statSync","resolve","join","relative","resolve","resolve","join","relative","statSync","resolve"]}
|
package/dist/cli.js
CHANGED
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
} from "./chunk-YEUYKR62.js";
|
|
5
5
|
import {
|
|
6
6
|
package_default
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-2MJ62AYQ.js";
|
|
8
8
|
import "./chunk-OWBRDNRZ.js";
|
|
9
9
|
import "./chunk-G3T47CFV.js";
|
|
10
10
|
import "./chunk-2H7UOFLK.js";
|
|
@@ -15,7 +15,7 @@ var DOMAINS = [
|
|
|
15
15
|
{
|
|
16
16
|
names: ["meta"],
|
|
17
17
|
load: async () => [
|
|
18
|
-
(await import("./cli-
|
|
18
|
+
(await import("./cli-I62SRH3R.js")).buildProgram().name("meta").description(
|
|
19
19
|
"Validate, read, query and fill document metadata against JSON Schema"
|
|
20
20
|
)
|
|
21
21
|
]
|
|
@@ -23,7 +23,7 @@ var DOMAINS = [
|
|
|
23
23
|
{
|
|
24
24
|
names: ["a11y"],
|
|
25
25
|
load: async () => [
|
|
26
|
-
(await import("./cli-
|
|
26
|
+
(await import("./cli-ONTC5PKT.js")).buildProgram().name("a11y").description(
|
|
27
27
|
"Crawl a site and check every page for accessibility violations with axe-core"
|
|
28
28
|
)
|
|
29
29
|
]
|
|
@@ -31,7 +31,7 @@ var DOMAINS = [
|
|
|
31
31
|
{
|
|
32
32
|
names: ["cite"],
|
|
33
33
|
load: async () => [
|
|
34
|
-
(await import("./cli-
|
|
34
|
+
(await import("./cli-6KZTHWGP.js")).buildProgram().name("cite").description(
|
|
35
35
|
"Track citations from doc claims to source lines and check them for drift"
|
|
36
36
|
)
|
|
37
37
|
]
|
|
@@ -39,7 +39,7 @@ var DOMAINS = [
|
|
|
39
39
|
{
|
|
40
40
|
names: ["lint"],
|
|
41
41
|
load: async () => [
|
|
42
|
-
(await import("./cli-
|
|
42
|
+
(await import("./cli-4MF37HAQ.js")).buildProgram().name("lint").description(
|
|
43
43
|
"Validate document structure against doctype templates, routed by a page's type"
|
|
44
44
|
)
|
|
45
45
|
]
|
|
@@ -47,7 +47,7 @@ var DOMAINS = [
|
|
|
47
47
|
{
|
|
48
48
|
names: ["docevals"],
|
|
49
49
|
load: async () => [
|
|
50
|
-
(await import("./cli-
|
|
50
|
+
(await import("./cli-VID7PJS3.js")).buildProgram().name("docevals").description(
|
|
51
51
|
"Deterministic and LLM-as-judge evals for documentation pages, driven by frontmatter"
|
|
52
52
|
)
|
|
53
53
|
]
|
|
@@ -55,13 +55,19 @@ var DOMAINS = [
|
|
|
55
55
|
{
|
|
56
56
|
names: ["term"],
|
|
57
57
|
load: async () => [
|
|
58
|
-
(await import("./term-
|
|
58
|
+
(await import("./term-CQAGNG3Q.js")).buildProgram().name("term").description("Check, lint and render a docset's terms and the references into them")
|
|
59
|
+
]
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
names: ["test"],
|
|
63
|
+
load: async () => [
|
|
64
|
+
(await import("./cli-JJMOVIKS.js")).buildProgram().name("test").description("Run the docs' procedure tests with Doc Detective and report in the family contract")
|
|
59
65
|
]
|
|
60
66
|
},
|
|
61
67
|
{
|
|
62
68
|
names: ["graph"],
|
|
63
69
|
load: async () => [
|
|
64
|
-
(await import("./cli-
|
|
70
|
+
(await import("./cli-RORDPAPE.js")).buildProgram().name("graph").description(
|
|
65
71
|
"Deterministic knowledge graphs derived from documentation frontmatter and formatting"
|
|
66
72
|
)
|
|
67
73
|
]
|
|
@@ -69,7 +75,7 @@ var DOMAINS = [
|
|
|
69
75
|
{
|
|
70
76
|
names: ["tracevals"],
|
|
71
77
|
load: async () => [
|
|
72
|
-
(await import("./cli-
|
|
78
|
+
(await import("./cli-O4ABTN4Z.js")).buildProgram().name("tracevals").description(
|
|
73
79
|
"Deterministic and LLM-as-judge adherence evals for AI agent session traces"
|
|
74
80
|
)
|
|
75
81
|
]
|
|
@@ -78,7 +84,14 @@ var DOMAINS = [
|
|
|
78
84
|
{
|
|
79
85
|
names: ["key"],
|
|
80
86
|
load: async () => [
|
|
81
|
-
(await import("./cli-
|
|
87
|
+
(await import("./cli-3BTCK4AB.js")).buildProgram().name("key").description("Set and rotate the family key that encrypted values are encrypted with.")
|
|
88
|
+
]
|
|
89
|
+
},
|
|
90
|
+
// The docs site, a family resource with verbs like `key` (proposal 0082).
|
|
91
|
+
{
|
|
92
|
+
names: ["site"],
|
|
93
|
+
load: async () => [
|
|
94
|
+
(await import("./cli-VUKMWSSF.js")).buildProgram().name("site").description("Start, build and preview the docs site")
|
|
82
95
|
]
|
|
83
96
|
},
|
|
84
97
|
// The two family verbs (proposal 0078), and the only verbs the umbrella
|
|
@@ -86,7 +99,7 @@ var DOMAINS = [
|
|
|
86
99
|
{
|
|
87
100
|
names: ["check", "status"],
|
|
88
101
|
load: async () => {
|
|
89
|
-
const { buildCheck, buildStatus } = await import("./cli-
|
|
102
|
+
const { buildCheck, buildStatus } = await import("./cli-DRMZBZLB.js");
|
|
90
103
|
return [buildCheck(), buildStatus()];
|
|
91
104
|
}
|
|
92
105
|
}
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts"],"sourcesContent":["/**\n * The `manni` CLI: one bin, one subcommand per tool in the family.\n *\n * Each tool builds its own commander program and is mounted here under its\n * name, so `manni meta validate …` is the metadata tool's `validate` with\n * nothing in between. The umbrella owns only what is common to all of them:\n * the name, the version, and the exit-code contract in `runProgram`.\n *\n * Tools land here one at a time, on their own branches; until one merges its\n * subcommand does not exist.\n *\n * Every domain is imported on demand. A domain's module graph is its whole\n * dependency tree (Playwright, axe, Asciidoctor, the RDF stack, ajv), and a\n * hook runs `manni check` after every edit, so the bin mounts only the domain\n * argv names. `--version` mounts none. Anything else (`--help`, a bare\n * `manni`, a typo) mounts them all, so help and \"unknown command\" read as\n * they always did.\n */\nimport { Command } from \"commander\";\nimport pkg from \"../package.json\" with { type: \"json\" };\nimport { runIfMain } from \"./shared/run.js\";\n\ninterface Domain {\n /** The command names the loader mounts, known before it is loaded. */\n names: readonly string[];\n load: () => Promise<Command[]>;\n}\n\n// In the order `manni --help` lists them.\nconst DOMAINS: readonly Domain[] = [\n {\n names: [\"meta\"],\n load: async () => [\n (await import(\"./meta/cli.js\"))\n .buildProgram()\n .name(\"meta\")\n .description(\n \"Validate, read, query and fill document metadata against JSON Schema\",\n ),\n ],\n },\n {\n names: [\"a11y\"],\n load: async () => [\n (await import(\"./a11y/cli.js\"))\n .buildProgram()\n .name(\"a11y\")\n .description(\n \"Crawl a site and check every page for accessibility violations with axe-core\",\n ),\n ],\n },\n {\n names: [\"cite\"],\n load: async () => [\n (await import(\"./cite/cli.js\"))\n .buildProgram()\n .name(\"cite\")\n .description(\n \"Track citations from doc claims to source lines and check them for drift\",\n ),\n ],\n },\n {\n names: [\"lint\"],\n load: async () => [\n (await import(\"./lint/cli.js\"))\n .buildProgram()\n .name(\"lint\")\n .description(\n \"Validate document structure against doctype templates, routed by a page's type\",\n ),\n ],\n },\n {\n names: [\"docevals\"],\n load: async () => [\n (await import(\"./docevals/cli.js\"))\n .buildProgram()\n .name(\"docevals\")\n .description(\n \"Deterministic and LLM-as-judge evals for documentation pages, driven by frontmatter\",\n ),\n ],\n },\n {\n names: [\"term\"],\n load: async () => [\n (await import(\"./term/index.js\"))\n .buildProgram()\n .name(\"term\")\n .description(\"Check, lint and render a docset's terms and the references into them\"),\n ],\n },\n {\n names: [\"graph\"],\n load: async () => [\n (await import(\"./graph/cli.js\"))\n .buildProgram()\n .name(\"graph\")\n .description(\n \"Deterministic knowledge graphs derived from documentation frontmatter and formatting\",\n ),\n ],\n },\n {\n names: [\"tracevals\"],\n load: async () => [\n (await import(\"./tracevals/cli.js\"))\n .buildProgram()\n .name(\"tracevals\")\n .description(\n \"Deterministic and LLM-as-judge adherence evals for AI agent session traces\",\n ),\n ],\n },\n // Not a tool but a family resource with verbs (proposal 0045).\n {\n names: [\"key\"],\n load: async () => [\n (await import(\"./key/cli.js\"))\n .buildProgram()\n .name(\"key\")\n .description(\"Set and rotate the family key that encrypted values are encrypted with.\"),\n ],\n },\n // The two family verbs (proposal 0078), and the only verbs the umbrella\n // carries: each runs other domains' command cores and owns no checks.\n {\n names: [\"check\", \"status\"],\n load: async () => {\n const { buildCheck, buildStatus } = await import(\"./family/cli.js\");\n return [buildCheck(), buildStatus()];\n },\n },\n];\n\nconst VERSION_FLAGS = new Set([\"-V\", \"--version\"]);\n\n/**\n * The domains a run with these arguments (argv after the script) dispatches\n * to. The umbrella's only options are `--version` and `--help`, so the first\n * argument is one of them or the command commander will look up.\n */\nfunction domainsFor(args: readonly string[]): readonly Domain[] {\n const first = args[0];\n if (first === undefined) return DOMAINS;\n if (VERSION_FLAGS.has(first)) return [];\n const named = DOMAINS.find((d) => d.names.includes(first));\n return named === undefined ? DOMAINS : [named];\n}\n\nasync function mount(domains: readonly Domain[]): Promise<Command> {\n const mounted = (await Promise.all(domains.map((d) => d.load()))).flat();\n const metaCommands = new Set(\n mounted.find((c) => c.name() === \"meta\")?.commands.map((c) => c.name()),\n );\n\n const program = new Command();\n program\n .name(\"manni\")\n .description(\"Tools for documentation that is meant to be checked.\")\n .version(pkg.version, \"-V, --version\")\n // A pointer, not the whole help screen. Commander appends this after every\n // usage error, and the message that precedes it already names the problem.\n .showHelpAfterError(\"(add --help for usage)\")\n // MUST come before `addCommand`, which copies the exit callback into the\n // mounted program by value. See the same note in ./meta/cli.ts.\n .exitOverride()\n .configureOutput({\n outputError: (str, write) => {\n write(str);\n // `manni validate …` is the most likely thing a docmeta user types\n // first. Commander's \"unknown command\" is correct and unhelpful; say\n // where the command went.\n const m = /unknown command '([^']+)'/.exec(str);\n const name = m?.[1];\n if (name !== undefined && metaCommands.has(name)) {\n write(\n `(\\`${name}\\` is a metadata command: try \\`manni meta ${name}\\`)\\n`,\n );\n }\n },\n });\n\n for (const command of mounted) program.addCommand(command);\n return program;\n}\n\n/** The whole command tree, every domain mounted. */\nexport function buildProgram(): Promise<Command> {\n return mount(DOMAINS);\n}\n\n/** The tree a run with these arguments needs: the one domain they name, or all of them. */\nexport function buildProgramFor(args: readonly string[]): Promise<Command> {\n return mount(domainsFor(args));\n}\n\nrunIfMain(import.meta.url, () => buildProgramFor(process.argv.slice(2)));\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts"],"sourcesContent":["/**\n * The `manni` CLI: one bin, one subcommand per tool in the family.\n *\n * Each tool builds its own commander program and is mounted here under its\n * name, so `manni meta validate …` is the metadata tool's `validate` with\n * nothing in between. The umbrella owns only what is common to all of them:\n * the name, the version, and the exit-code contract in `runProgram`.\n *\n * Tools land here one at a time, on their own branches; until one merges its\n * subcommand does not exist.\n *\n * Every domain is imported on demand. A domain's module graph is its whole\n * dependency tree (Playwright, axe, Asciidoctor, the RDF stack, ajv), and a\n * hook runs `manni check` after every edit, so the bin mounts only the domain\n * argv names. `--version` mounts none. Anything else (`--help`, a bare\n * `manni`, a typo) mounts them all, so help and \"unknown command\" read as\n * they always did.\n */\nimport { Command } from \"commander\";\nimport pkg from \"../package.json\" with { type: \"json\" };\nimport { runIfMain } from \"./shared/run.js\";\n\ninterface Domain {\n /** The command names the loader mounts, known before it is loaded. */\n names: readonly string[];\n load: () => Promise<Command[]>;\n}\n\n// In the order `manni --help` lists them.\nconst DOMAINS: readonly Domain[] = [\n {\n names: [\"meta\"],\n load: async () => [\n (await import(\"./meta/cli.js\"))\n .buildProgram()\n .name(\"meta\")\n .description(\n \"Validate, read, query and fill document metadata against JSON Schema\",\n ),\n ],\n },\n {\n names: [\"a11y\"],\n load: async () => [\n (await import(\"./a11y/cli.js\"))\n .buildProgram()\n .name(\"a11y\")\n .description(\n \"Crawl a site and check every page for accessibility violations with axe-core\",\n ),\n ],\n },\n {\n names: [\"cite\"],\n load: async () => [\n (await import(\"./cite/cli.js\"))\n .buildProgram()\n .name(\"cite\")\n .description(\n \"Track citations from doc claims to source lines and check them for drift\",\n ),\n ],\n },\n {\n names: [\"lint\"],\n load: async () => [\n (await import(\"./lint/cli.js\"))\n .buildProgram()\n .name(\"lint\")\n .description(\n \"Validate document structure against doctype templates, routed by a page's type\",\n ),\n ],\n },\n {\n names: [\"docevals\"],\n load: async () => [\n (await import(\"./docevals/cli.js\"))\n .buildProgram()\n .name(\"docevals\")\n .description(\n \"Deterministic and LLM-as-judge evals for documentation pages, driven by frontmatter\",\n ),\n ],\n },\n {\n names: [\"term\"],\n load: async () => [\n (await import(\"./term/index.js\"))\n .buildProgram()\n .name(\"term\")\n .description(\"Check, lint and render a docset's terms and the references into them\"),\n ],\n },\n {\n names: [\"test\"],\n load: async () => [\n (await import(\"./test/cli.js\"))\n .buildProgram()\n .name(\"test\")\n .description(\"Run the docs' procedure tests with Doc Detective and report in the family contract\"),\n ],\n },\n {\n names: [\"graph\"],\n load: async () => [\n (await import(\"./graph/cli.js\"))\n .buildProgram()\n .name(\"graph\")\n .description(\n \"Deterministic knowledge graphs derived from documentation frontmatter and formatting\",\n ),\n ],\n },\n {\n names: [\"tracevals\"],\n load: async () => [\n (await import(\"./tracevals/cli.js\"))\n .buildProgram()\n .name(\"tracevals\")\n .description(\n \"Deterministic and LLM-as-judge adherence evals for AI agent session traces\",\n ),\n ],\n },\n // Not a tool but a family resource with verbs (proposal 0045).\n {\n names: [\"key\"],\n load: async () => [\n (await import(\"./key/cli.js\"))\n .buildProgram()\n .name(\"key\")\n .description(\"Set and rotate the family key that encrypted values are encrypted with.\"),\n ],\n },\n // The docs site, a family resource with verbs like `key` (proposal 0082).\n {\n names: [\"site\"],\n load: async () => [\n (await import(\"./site/cli.js\"))\n .buildProgram()\n .name(\"site\")\n .description(\"Start, build and preview the docs site\"),\n ],\n },\n // The two family verbs (proposal 0078), and the only verbs the umbrella\n // carries: each runs other domains' command cores and owns no checks.\n {\n names: [\"check\", \"status\"],\n load: async () => {\n const { buildCheck, buildStatus } = await import(\"./family/cli.js\");\n return [buildCheck(), buildStatus()];\n },\n },\n];\n\nconst VERSION_FLAGS = new Set([\"-V\", \"--version\"]);\n\n/**\n * The domains a run with these arguments (argv after the script) dispatches\n * to. The umbrella's only options are `--version` and `--help`, so the first\n * argument is one of them or the command commander will look up.\n */\nfunction domainsFor(args: readonly string[]): readonly Domain[] {\n const first = args[0];\n if (first === undefined) return DOMAINS;\n if (VERSION_FLAGS.has(first)) return [];\n const named = DOMAINS.find((d) => d.names.includes(first));\n return named === undefined ? DOMAINS : [named];\n}\n\nasync function mount(domains: readonly Domain[]): Promise<Command> {\n const mounted = (await Promise.all(domains.map((d) => d.load()))).flat();\n const metaCommands = new Set(\n mounted.find((c) => c.name() === \"meta\")?.commands.map((c) => c.name()),\n );\n\n const program = new Command();\n program\n .name(\"manni\")\n .description(\"Tools for documentation that is meant to be checked.\")\n .version(pkg.version, \"-V, --version\")\n // A pointer, not the whole help screen. Commander appends this after every\n // usage error, and the message that precedes it already names the problem.\n .showHelpAfterError(\"(add --help for usage)\")\n // MUST come before `addCommand`, which copies the exit callback into the\n // mounted program by value. See the same note in ./meta/cli.ts.\n .exitOverride()\n .configureOutput({\n outputError: (str, write) => {\n write(str);\n // `manni validate …` is the most likely thing a docmeta user types\n // first. Commander's \"unknown command\" is correct and unhelpful; say\n // where the command went.\n const m = /unknown command '([^']+)'/.exec(str);\n const name = m?.[1];\n if (name !== undefined && metaCommands.has(name)) {\n write(\n `(\\`${name}\\` is a metadata command: try \\`manni meta ${name}\\`)\\n`,\n );\n }\n },\n });\n\n for (const command of mounted) program.addCommand(command);\n return program;\n}\n\n/** The whole command tree, every domain mounted. */\nexport function buildProgram(): Promise<Command> {\n return mount(DOMAINS);\n}\n\n/** The tree a run with these arguments needs: the one domain they name, or all of them. */\nexport function buildProgramFor(args: readonly string[]): Promise<Command> {\n return mount(domainsFor(args));\n}\n\nrunIfMain(import.meta.url, () => buildProgramFor(process.argv.slice(2)));\n"],"mappings":";;;;;;;;;;;;AAkBA,SAAS,eAAe;AAWxB,IAAM,UAA6B;AAAA,EACjC;AAAA,IACE,OAAO,CAAC,MAAM;AAAA,IACd,MAAM,YAAY;AAAA,OACf,MAAM,OAAO,mBAAe,GAC1B,aAAa,EACb,KAAK,MAAM,EACX;AAAA,QACC;AAAA,MACF;AAAA,IACJ;AAAA,EACF;AAAA,EACA;AAAA,IACE,OAAO,CAAC,MAAM;AAAA,IACd,MAAM,YAAY;AAAA,OACf,MAAM,OAAO,mBAAe,GAC1B,aAAa,EACb,KAAK,MAAM,EACX;AAAA,QACC;AAAA,MACF;AAAA,IACJ;AAAA,EACF;AAAA,EACA;AAAA,IACE,OAAO,CAAC,MAAM;AAAA,IACd,MAAM,YAAY;AAAA,OACf,MAAM,OAAO,mBAAe,GAC1B,aAAa,EACb,KAAK,MAAM,EACX;AAAA,QACC;AAAA,MACF;AAAA,IACJ;AAAA,EACF;AAAA,EACA;AAAA,IACE,OAAO,CAAC,MAAM;AAAA,IACd,MAAM,YAAY;AAAA,OACf,MAAM,OAAO,mBAAe,GAC1B,aAAa,EACb,KAAK,MAAM,EACX;AAAA,QACC;AAAA,MACF;AAAA,IACJ;AAAA,EACF;AAAA,EACA;AAAA,IACE,OAAO,CAAC,UAAU;AAAA,IAClB,MAAM,YAAY;AAAA,OACf,MAAM,OAAO,mBAAmB,GAC9B,aAAa,EACb,KAAK,UAAU,EACf;AAAA,QACC;AAAA,MACF;AAAA,IACJ;AAAA,EACF;AAAA,EACA;AAAA,IACE,OAAO,CAAC,MAAM;AAAA,IACd,MAAM,YAAY;AAAA,OACf,MAAM,OAAO,oBAAiB,GAC5B,aAAa,EACb,KAAK,MAAM,EACX,YAAY,sEAAsE;AAAA,IACvF;AAAA,EACF;AAAA,EACA;AAAA,IACE,OAAO,CAAC,MAAM;AAAA,IACd,MAAM,YAAY;AAAA,OACf,MAAM,OAAO,mBAAe,GAC1B,aAAa,EACb,KAAK,MAAM,EACX,YAAY,oFAAoF;AAAA,IACrG;AAAA,EACF;AAAA,EACA;AAAA,IACE,OAAO,CAAC,OAAO;AAAA,IACf,MAAM,YAAY;AAAA,OACf,MAAM,OAAO,mBAAgB,GAC3B,aAAa,EACb,KAAK,OAAO,EACZ;AAAA,QACC;AAAA,MACF;AAAA,IACJ;AAAA,EACF;AAAA,EACA;AAAA,IACE,OAAO,CAAC,WAAW;AAAA,IACnB,MAAM,YAAY;AAAA,OACf,MAAM,OAAO,mBAAoB,GAC/B,aAAa,EACb,KAAK,WAAW,EAChB;AAAA,QACC;AAAA,MACF;AAAA,IACJ;AAAA,EACF;AAAA;AAAA,EAEA;AAAA,IACE,OAAO,CAAC,KAAK;AAAA,IACb,MAAM,YAAY;AAAA,OACf,MAAM,OAAO,mBAAc,GACzB,aAAa,EACb,KAAK,KAAK,EACV,YAAY,yEAAyE;AAAA,IAC1F;AAAA,EACF;AAAA;AAAA,EAEA;AAAA,IACE,OAAO,CAAC,MAAM;AAAA,IACd,MAAM,YAAY;AAAA,OACf,MAAM,OAAO,mBAAe,GAC1B,aAAa,EACb,KAAK,MAAM,EACX,YAAY,wCAAwC;AAAA,IACzD;AAAA,EACF;AAAA;AAAA;AAAA,EAGA;AAAA,IACE,OAAO,CAAC,SAAS,QAAQ;AAAA,IACzB,MAAM,YAAY;AAChB,YAAM,EAAE,YAAY,YAAY,IAAI,MAAM,OAAO,mBAAiB;AAClE,aAAO,CAAC,WAAW,GAAG,YAAY,CAAC;AAAA,IACrC;AAAA,EACF;AACF;AAEA,IAAM,gBAAgB,oBAAI,IAAI,CAAC,MAAM,WAAW,CAAC;AAOjD,SAAS,WAAW,MAA4C;AAC9D,QAAM,QAAQ,KAAK,CAAC;AACpB,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,cAAc,IAAI,KAAK,EAAG,QAAO,CAAC;AACtC,QAAM,QAAQ,QAAQ,KAAK,CAAC,MAAM,EAAE,MAAM,SAAS,KAAK,CAAC;AACzD,SAAO,UAAU,SAAY,UAAU,CAAC,KAAK;AAC/C;AAEA,eAAe,MAAM,SAA8C;AACjE,QAAM,WAAW,MAAM,QAAQ,IAAI,QAAQ,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,GAAG,KAAK;AACvE,QAAM,eAAe,IAAI;AAAA,IACvB,QAAQ,KAAK,CAAC,MAAM,EAAE,KAAK,MAAM,MAAM,GAAG,SAAS,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAAA,EACxE;AAEA,QAAM,UAAU,IAAI,QAAQ;AAC5B,UACG,KAAK,OAAO,EACZ,YAAY,sDAAsD,EAClE,QAAQ,gBAAI,SAAS,eAAe,EAGpC,mBAAmB,wBAAwB,EAG3C,aAAa,EACb,gBAAgB;AAAA,IACf,aAAa,CAAC,KAAK,UAAU;AAC3B,YAAM,GAAG;AAIT,YAAM,IAAI,4BAA4B,KAAK,GAAG;AAC9C,YAAM,OAAO,IAAI,CAAC;AAClB,UAAI,SAAS,UAAa,aAAa,IAAI,IAAI,GAAG;AAChD;AAAA,UACE,MAAM,IAAI,8CAA8C,IAAI;AAAA;AAAA,QAC9D;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAEH,aAAW,WAAW,QAAS,SAAQ,WAAW,OAAO;AACzD,SAAO;AACT;AAGO,SAAS,eAAiC;AAC/C,SAAO,MAAM,OAAO;AACtB;AAGO,SAAS,gBAAgB,MAA2C;AACzE,SAAO,MAAM,WAAW,IAAI,CAAC;AAC/B;AAEA,UAAU,YAAY,KAAK,MAAM,gBAAgB,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC;","names":[]}
|
|
@@ -5,12 +5,12 @@ import {
|
|
|
5
5
|
discoverConfig,
|
|
6
6
|
loadConfig,
|
|
7
7
|
parseConfig
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-FBMZJEB3.js";
|
|
9
9
|
import "./chunk-CU57HT2E.js";
|
|
10
10
|
import "./chunk-NGTVREIH.js";
|
|
11
11
|
import "./chunk-UKZNLVJW.js";
|
|
12
12
|
import "./chunk-YNHZHSSM.js";
|
|
13
|
-
import "./chunk-
|
|
13
|
+
import "./chunk-QLWC7MKD.js";
|
|
14
14
|
import "./chunk-HX44GB4Z.js";
|
|
15
15
|
import "./chunk-QCHVR4ZM.js";
|
|
16
16
|
import "./chunk-OWBRDNRZ.js";
|
|
@@ -23,4 +23,4 @@ export {
|
|
|
23
23
|
loadConfig,
|
|
24
24
|
parseConfig
|
|
25
25
|
};
|
|
26
|
-
//# sourceMappingURL=config-
|
|
26
|
+
//# sourceMappingURL=config-XDA42RJL.js.map
|
package/dist/docmeta.js
CHANGED
|
@@ -1,20 +1,22 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
buildProgram
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
6
|
-
import "./chunk-
|
|
7
|
-
import "./chunk-
|
|
8
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-Y6DOMTQD.js";
|
|
5
|
+
import "./chunk-6HWBRZIN.js";
|
|
6
|
+
import "./chunk-M42DZCOU.js";
|
|
7
|
+
import "./chunk-PCQ7ELJH.js";
|
|
8
|
+
import "./chunk-GV56WGL2.js";
|
|
9
|
+
import "./chunk-D4N2V43Z.js";
|
|
10
|
+
import "./chunk-VSEBFHAY.js";
|
|
9
11
|
import {
|
|
10
12
|
runIfMain
|
|
11
13
|
} from "./chunk-YEUYKR62.js";
|
|
12
14
|
import "./chunk-RNVYGWIC.js";
|
|
13
15
|
import "./chunk-MNH7QO4Z.js";
|
|
14
|
-
import "./chunk-
|
|
16
|
+
import "./chunk-QLWC7MKD.js";
|
|
15
17
|
import "./chunk-HX44GB4Z.js";
|
|
16
18
|
import "./chunk-QCHVR4ZM.js";
|
|
17
|
-
import "./chunk-
|
|
19
|
+
import "./chunk-2MJ62AYQ.js";
|
|
18
20
|
import "./chunk-OWBRDNRZ.js";
|
|
19
21
|
import "./chunk-G3T47CFV.js";
|
|
20
22
|
import "./chunk-2H7UOFLK.js";
|
package/dist/docmeta.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/docmeta.ts"],"sourcesContent":["/**\n * The `docmeta` bin: the metadata tool under the name it had before it became\n * `manni meta`. Same program, same options, same exit codes, so a script or\n * workflow written against `docmeta …` keeps working. Only the usage line and\n * the stderr prefix say `docmeta`.\n */\nimport { buildProgram } from \"./meta/cli.js\";\nimport { runIfMain } from \"./shared/run.js\";\n\nrunIfMain(import.meta.url, () => buildProgram().name(\"docmeta\"));\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/docmeta.ts"],"sourcesContent":["/**\n * The `docmeta` bin: the metadata tool under the name it had before it became\n * `manni meta`. Same program, same options, same exit codes, so a script or\n * workflow written against `docmeta …` keeps working. Only the usage line and\n * the stderr prefix say `docmeta`.\n */\nimport { buildProgram } from \"./meta/cli.js\";\nimport { runIfMain } from \"./shared/run.js\";\n\nrunIfMain(import.meta.url, () => buildProgram().name(\"docmeta\"));\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AASA,UAAU,YAAY,KAAK,MAAM,aAAa,EAAE,KAAK,SAAS,CAAC;","names":[]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
renderFindingsGithub
|
|
4
|
+
} from "./chunk-LPIF5LIE.js";
|
|
5
|
+
import "./chunk-J6IDQGJL.js";
|
|
6
|
+
import "./chunk-77AINBYM.js";
|
|
7
|
+
import "./chunk-IKEWBMCN.js";
|
|
8
|
+
import "./chunk-TU2WUBVZ.js";
|
|
9
|
+
import "./chunk-LKP7QDFN.js";
|
|
10
|
+
import "./chunk-6HWBRZIN.js";
|
|
11
|
+
import "./chunk-M42DZCOU.js";
|
|
12
|
+
import "./chunk-PCQ7ELJH.js";
|
|
13
|
+
import "./chunk-GV56WGL2.js";
|
|
14
|
+
import "./chunk-D4N2V43Z.js";
|
|
15
|
+
import "./chunk-VSEBFHAY.js";
|
|
16
|
+
import "./chunk-YEUYKR62.js";
|
|
17
|
+
import "./chunk-RNVYGWIC.js";
|
|
18
|
+
import "./chunk-MNH7QO4Z.js";
|
|
19
|
+
import "./chunk-QLWC7MKD.js";
|
|
20
|
+
import "./chunk-HX44GB4Z.js";
|
|
21
|
+
import "./chunk-QCHVR4ZM.js";
|
|
22
|
+
import "./chunk-2MJ62AYQ.js";
|
|
23
|
+
import "./chunk-OWBRDNRZ.js";
|
|
24
|
+
import "./chunk-G3T47CFV.js";
|
|
25
|
+
import "./chunk-2H7UOFLK.js";
|
|
26
|
+
export {
|
|
27
|
+
renderFindingsGithub
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=github-RY3FRA6P.js.map
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
NAMES_ITS_SUBJECT,
|
|
4
|
+
findingMessage,
|
|
5
|
+
renderCheckGithub
|
|
6
|
+
} from "./chunk-ADMEPUBT.js";
|
|
7
|
+
import "./chunk-4D5IZSXM.js";
|
|
8
|
+
import "./chunk-WDWXAYVH.js";
|
|
9
|
+
import "./chunk-BKVHX6FU.js";
|
|
10
|
+
import "./chunk-IKEWBMCN.js";
|
|
11
|
+
import "./chunk-TU2WUBVZ.js";
|
|
12
|
+
import "./chunk-LKP7QDFN.js";
|
|
13
|
+
import "./chunk-6HWBRZIN.js";
|
|
14
|
+
import "./chunk-M42DZCOU.js";
|
|
15
|
+
import "./chunk-PCQ7ELJH.js";
|
|
16
|
+
import "./chunk-GV56WGL2.js";
|
|
17
|
+
import "./chunk-D4N2V43Z.js";
|
|
18
|
+
import "./chunk-VSEBFHAY.js";
|
|
19
|
+
import "./chunk-YEUYKR62.js";
|
|
20
|
+
import "./chunk-RNVYGWIC.js";
|
|
21
|
+
import "./chunk-MNH7QO4Z.js";
|
|
22
|
+
import "./chunk-QLWC7MKD.js";
|
|
23
|
+
import "./chunk-HX44GB4Z.js";
|
|
24
|
+
import "./chunk-QCHVR4ZM.js";
|
|
25
|
+
import "./chunk-2MJ62AYQ.js";
|
|
26
|
+
import "./chunk-OWBRDNRZ.js";
|
|
27
|
+
import "./chunk-G3T47CFV.js";
|
|
28
|
+
import "./chunk-2H7UOFLK.js";
|
|
29
|
+
export {
|
|
30
|
+
NAMES_ITS_SUBJECT,
|
|
31
|
+
findingMessage,
|
|
32
|
+
renderCheckGithub
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=github-YKQSH7FS.js.map
|