@hawkeyexl/manni 4.12.4 → 4.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. package/README.md +1 -1
  2. package/dist/{batch-UHLVBMYM.js → batch-OB2FXT47.js} +12 -12
  3. package/dist/{build-4RPXBSAO.js → build-4BL24BG3.js} +13 -13
  4. package/dist/{calibrate-POL5DCJ6.js → calibrate-AEDJ7N7G.js} +13 -13
  5. package/dist/{capture-I7ZYG7NZ.js → capture-TP3P4YNL.js} +12 -12
  6. package/dist/{check-6TEG5TM6.js → check-5IYH42KS.js} +14 -14
  7. package/dist/{check-3O2PZ7TZ.js → check-LU5YC3L4.js} +12 -12
  8. package/dist/{check-V7JUDAPS.js → check-NBN2YK2J.js} +13 -13
  9. package/dist/{check-DGOUTC3V.js → check-S55MH66H.js} +11 -11
  10. package/dist/{chunk-6KONPVHQ.js → chunk-3BVDFQ6Y.js} +2 -2
  11. package/dist/{chunk-JAPSZ44X.js → chunk-3HUCB4Z3.js} +4 -4
  12. package/dist/{chunk-LWMB7JRE.js → chunk-3O6U4ICM.js} +2 -2
  13. package/dist/{chunk-3QUCVYNX.js → chunk-3XGTNN3M.js} +3 -3
  14. package/dist/{chunk-AATCO43N.js → chunk-52WO7ESI.js} +3 -3
  15. package/dist/{chunk-TBAMBLF3.js → chunk-6ZFJWUUH.js} +132 -15
  16. package/dist/chunk-6ZFJWUUH.js.map +1 -0
  17. package/dist/{chunk-7TVIFCGT.js → chunk-7JPL3CUC.js} +2 -2
  18. package/dist/{chunk-RLPWXF5R.js → chunk-7RNONVHI.js} +6 -6
  19. package/dist/{chunk-WWKXPPN5.js → chunk-BMBAAPGN.js} +3 -3
  20. package/dist/{chunk-BGRP44SX.js → chunk-BQXY76JB.js} +4 -4
  21. package/dist/{chunk-N5JSOJY6.js → chunk-CODWRUAD.js} +2 -2
  22. package/dist/{chunk-5OKSFNUV.js → chunk-DQOM3DEU.js} +5 -5
  23. package/dist/{chunk-QUG53QGZ.js → chunk-E6BVUDGY.js} +3 -3
  24. package/dist/{chunk-PSPNIAOP.js → chunk-EQ7E6HMG.js} +8 -8
  25. package/dist/{chunk-7JUIJ7Q5.js → chunk-GWI6JPTT.js} +3 -3
  26. package/dist/{chunk-VXU75N5R.js → chunk-HIEGOW7X.js} +3 -3
  27. package/dist/{chunk-GNUZ37L2.js → chunk-HKTGHLBA.js} +2 -2
  28. package/dist/{chunk-GNUZ37L2.js.map → chunk-HKTGHLBA.js.map} +1 -1
  29. package/dist/{chunk-Y4TDIUG6.js → chunk-HY6ROJTH.js} +2 -2
  30. package/dist/{chunk-PP22XDW2.js → chunk-IGQMBHFY.js} +6 -6
  31. package/dist/{chunk-J4ZOTZII.js → chunk-J5NOWIJ3.js} +6 -6
  32. package/dist/{chunk-XEYS3KAZ.js → chunk-JUL2PRQN.js} +4 -4
  33. package/dist/{chunk-NLELGEKL.js → chunk-KE2F7QES.js} +5 -5
  34. package/dist/{chunk-EBZ4QKKX.js → chunk-LNGSE7V2.js} +2 -2
  35. package/dist/{chunk-EU4HDGG4.js → chunk-LSFXNAHU.js} +7 -7
  36. package/dist/{chunk-SSDSV52B.js → chunk-N6A6DJUO.js} +4 -4
  37. package/dist/{chunk-Z42MO7SO.js → chunk-NSAW7U42.js} +2 -2
  38. package/dist/{chunk-KRKNZ3IV.js → chunk-NTEYYYKL.js} +34 -10
  39. package/dist/chunk-NTEYYYKL.js.map +1 -0
  40. package/dist/{chunk-7QH2ZI4F.js → chunk-NWUXRV6N.js} +52 -27
  41. package/dist/chunk-NWUXRV6N.js.map +1 -0
  42. package/dist/{chunk-QWE3WLV4.js → chunk-OBXCJZ6R.js} +5 -5
  43. package/dist/{chunk-VFL3ERMI.js → chunk-OREHJQNN.js} +2 -2
  44. package/dist/{chunk-DTXLFSAB.js → chunk-OUAH7XF2.js} +2 -2
  45. package/dist/{chunk-ZCJUSQM7.js → chunk-OYIWF3B2.js} +10 -10
  46. package/dist/{chunk-HP43LH7E.js → chunk-PA7CMQGD.js} +2 -2
  47. package/dist/{chunk-5NNPEPVM.js → chunk-PCGBXHSE.js} +3 -3
  48. package/dist/{chunk-TR2XFZPR.js → chunk-QKT67PFE.js} +3 -3
  49. package/dist/{chunk-YGFIQ6Y5.js → chunk-SCLXVTFZ.js} +1 -1
  50. package/dist/{chunk-YGFIQ6Y5.js.map → chunk-SCLXVTFZ.js.map} +1 -1
  51. package/dist/{chunk-PNUM6RHR.js → chunk-TDCOKKMI.js} +3 -3
  52. package/dist/{chunk-X4GQ4HPY.js → chunk-TQ3W6RKG.js} +2 -2
  53. package/dist/{chunk-EX6E2P6Z.js → chunk-ULDV2LUI.js} +2 -2
  54. package/dist/{chunk-XP4RNQZL.js → chunk-UQMLCIRX.js} +242 -15
  55. package/dist/chunk-UQMLCIRX.js.map +1 -0
  56. package/dist/{chunk-KQRYW4DN.js → chunk-VNYXK7TM.js} +3 -3
  57. package/dist/{chunk-3FXPIZXL.js → chunk-VOXOBUTX.js} +2 -2
  58. package/dist/{chunk-4IW6FAUN.js → chunk-VYBYUQIP.js} +7 -7
  59. package/dist/{chunk-4TGIGVFO.js → chunk-WVXCN5DS.js} +4 -4
  60. package/dist/{chunk-J67EOBN3.js → chunk-X4MPUD4B.js} +3 -3
  61. package/dist/{chunk-W7EZJPRX.js → chunk-Y6M4JFKG.js} +3 -3
  62. package/dist/{chunk-U4SY2TJS.js → chunk-YZ4TJLZQ.js} +7 -7
  63. package/dist/{cli-USPQURPP.js → cli-4JHQCPHU.js} +2 -2
  64. package/dist/{cli-UL2IFH3R.js → cli-7DETHSNW.js} +15 -15
  65. package/dist/{cli-4ANSKDPD.js → cli-AZKWTCFV.js} +9 -9
  66. package/dist/{cli-2OQKCKRD.js → cli-BW5VOFOZ.js} +8 -8
  67. package/dist/{cli-5QGP6R63.js → cli-DGFLJ2DD.js} +2 -2
  68. package/dist/{cli-SDTXHLCA.js → cli-ECVT4YXR.js} +16 -16
  69. package/dist/{cli-IE3CYYHA.js → cli-G66X7YMP.js} +54 -15
  70. package/dist/cli-G66X7YMP.js.map +1 -0
  71. package/dist/{cli-2Q5FODAX.js → cli-H5LVGOVT.js} +31 -31
  72. package/dist/{cli-RQRMZKKM.js → cli-KYTCJYXK.js} +16 -16
  73. package/dist/{cli-SGSS6FXE.js → cli-L5B2RVV2.js} +19 -19
  74. package/dist/{cli-RQSCBJJY.js → cli-RP5E7XHC.js} +13 -13
  75. package/dist/cli.js +14 -14
  76. package/dist/docmeta.js +8 -8
  77. package/dist/{github-PBIYRH5S.js → github-DJQ4MWNZ.js} +13 -13
  78. package/dist/{github-RJG2MAWB.js → github-UWTDM2J2.js} +11 -11
  79. package/dist/index.d.ts +76 -4
  80. package/dist/index.js +47 -37
  81. package/dist/index.js.map +1 -1
  82. package/dist/{json-PQURAHQ5.js → json-LCVPMEAM.js} +11 -11
  83. package/dist/{labels-FMLO2URZ.js → labels-OQXBVM4A.js} +10 -10
  84. package/dist/{lint-N2CY66JX.js → lint-O7XRHKFP.js} +13 -13
  85. package/dist/{list-VBFNFEXV.js → list-OOOCLOAL.js} +11 -11
  86. package/dist/{list-OMHTVFDY.js → list-OYQ5XPN2.js} +11 -11
  87. package/dist/{page-X3HYSH6D.js → page-XPX5XJZE.js} +10 -10
  88. package/dist/{prepare-IQMB262G.js → prepare-VMBIQYAM.js} +11 -11
  89. package/dist/{pretty-22PXIEOV.js → pretty-KG6TMOEI.js} +12 -12
  90. package/dist/{pretty-K5BOCKBB.js → pretty-KSTZMBUF.js} +11 -11
  91. package/dist/{reporters-324OWH36.js → reporters-AQU4W3KY.js} +4 -4
  92. package/dist/{reporters-5LIYYE6M.js → reporters-FBYLPKD4.js} +12 -12
  93. package/dist/{run-4EKG6EMI.js → run-KUGTU3TT.js} +11 -11
  94. package/dist/{term-2ADSKGZW.js → term-SI3VM6EM.js} +15 -15
  95. package/dist/{validate-LRYUEZLJ.js → validate-NQO7TFSN.js} +5 -5
  96. package/package.json +1 -1
  97. package/plugin/manni/.claude-plugin/plugin.json +1 -1
  98. package/plugin/manni/skills/fix/SKILL.md +4 -2
  99. package/schemas/lint/template.json +6 -1
  100. package/templates/lint/tgdp/concept.yaml +27 -13
  101. package/templates/lint/tgdp/how-to.yaml +35 -21
  102. package/templates/lint/tgdp/readme.yaml +69 -25
  103. package/templates/lint/tgdp/reference.yaml +44 -31
  104. package/templates/lint/tgdp/release-notes.yaml +48 -19
  105. package/templates/lint/tgdp/troubleshooting.yaml +45 -31
  106. package/templates/lint/tgdp/tutorial.yaml +35 -19
  107. package/dist/chunk-7QH2ZI4F.js.map +0 -1
  108. package/dist/chunk-KRKNZ3IV.js.map +0 -1
  109. package/dist/chunk-TBAMBLF3.js.map +0 -1
  110. package/dist/chunk-XP4RNQZL.js.map +0 -1
  111. package/dist/cli-IE3CYYHA.js.map +0 -1
  112. /package/dist/{batch-UHLVBMYM.js.map → batch-OB2FXT47.js.map} +0 -0
  113. /package/dist/{build-4RPXBSAO.js.map → build-4BL24BG3.js.map} +0 -0
  114. /package/dist/{calibrate-POL5DCJ6.js.map → calibrate-AEDJ7N7G.js.map} +0 -0
  115. /package/dist/{capture-I7ZYG7NZ.js.map → capture-TP3P4YNL.js.map} +0 -0
  116. /package/dist/{check-3O2PZ7TZ.js.map → check-5IYH42KS.js.map} +0 -0
  117. /package/dist/{check-6TEG5TM6.js.map → check-LU5YC3L4.js.map} +0 -0
  118. /package/dist/{check-V7JUDAPS.js.map → check-NBN2YK2J.js.map} +0 -0
  119. /package/dist/{check-DGOUTC3V.js.map → check-S55MH66H.js.map} +0 -0
  120. /package/dist/{chunk-6KONPVHQ.js.map → chunk-3BVDFQ6Y.js.map} +0 -0
  121. /package/dist/{chunk-JAPSZ44X.js.map → chunk-3HUCB4Z3.js.map} +0 -0
  122. /package/dist/{chunk-LWMB7JRE.js.map → chunk-3O6U4ICM.js.map} +0 -0
  123. /package/dist/{chunk-3QUCVYNX.js.map → chunk-3XGTNN3M.js.map} +0 -0
  124. /package/dist/{chunk-AATCO43N.js.map → chunk-52WO7ESI.js.map} +0 -0
  125. /package/dist/{chunk-7TVIFCGT.js.map → chunk-7JPL3CUC.js.map} +0 -0
  126. /package/dist/{chunk-RLPWXF5R.js.map → chunk-7RNONVHI.js.map} +0 -0
  127. /package/dist/{chunk-WWKXPPN5.js.map → chunk-BMBAAPGN.js.map} +0 -0
  128. /package/dist/{chunk-BGRP44SX.js.map → chunk-BQXY76JB.js.map} +0 -0
  129. /package/dist/{chunk-N5JSOJY6.js.map → chunk-CODWRUAD.js.map} +0 -0
  130. /package/dist/{chunk-5OKSFNUV.js.map → chunk-DQOM3DEU.js.map} +0 -0
  131. /package/dist/{chunk-QUG53QGZ.js.map → chunk-E6BVUDGY.js.map} +0 -0
  132. /package/dist/{chunk-PSPNIAOP.js.map → chunk-EQ7E6HMG.js.map} +0 -0
  133. /package/dist/{chunk-7JUIJ7Q5.js.map → chunk-GWI6JPTT.js.map} +0 -0
  134. /package/dist/{chunk-VXU75N5R.js.map → chunk-HIEGOW7X.js.map} +0 -0
  135. /package/dist/{chunk-Y4TDIUG6.js.map → chunk-HY6ROJTH.js.map} +0 -0
  136. /package/dist/{chunk-PP22XDW2.js.map → chunk-IGQMBHFY.js.map} +0 -0
  137. /package/dist/{chunk-J4ZOTZII.js.map → chunk-J5NOWIJ3.js.map} +0 -0
  138. /package/dist/{chunk-XEYS3KAZ.js.map → chunk-JUL2PRQN.js.map} +0 -0
  139. /package/dist/{chunk-NLELGEKL.js.map → chunk-KE2F7QES.js.map} +0 -0
  140. /package/dist/{chunk-EBZ4QKKX.js.map → chunk-LNGSE7V2.js.map} +0 -0
  141. /package/dist/{chunk-EU4HDGG4.js.map → chunk-LSFXNAHU.js.map} +0 -0
  142. /package/dist/{chunk-SSDSV52B.js.map → chunk-N6A6DJUO.js.map} +0 -0
  143. /package/dist/{chunk-Z42MO7SO.js.map → chunk-NSAW7U42.js.map} +0 -0
  144. /package/dist/{chunk-QWE3WLV4.js.map → chunk-OBXCJZ6R.js.map} +0 -0
  145. /package/dist/{chunk-VFL3ERMI.js.map → chunk-OREHJQNN.js.map} +0 -0
  146. /package/dist/{chunk-DTXLFSAB.js.map → chunk-OUAH7XF2.js.map} +0 -0
  147. /package/dist/{chunk-ZCJUSQM7.js.map → chunk-OYIWF3B2.js.map} +0 -0
  148. /package/dist/{chunk-HP43LH7E.js.map → chunk-PA7CMQGD.js.map} +0 -0
  149. /package/dist/{chunk-5NNPEPVM.js.map → chunk-PCGBXHSE.js.map} +0 -0
  150. /package/dist/{chunk-TR2XFZPR.js.map → chunk-QKT67PFE.js.map} +0 -0
  151. /package/dist/{chunk-PNUM6RHR.js.map → chunk-TDCOKKMI.js.map} +0 -0
  152. /package/dist/{chunk-X4GQ4HPY.js.map → chunk-TQ3W6RKG.js.map} +0 -0
  153. /package/dist/{chunk-EX6E2P6Z.js.map → chunk-ULDV2LUI.js.map} +0 -0
  154. /package/dist/{chunk-KQRYW4DN.js.map → chunk-VNYXK7TM.js.map} +0 -0
  155. /package/dist/{chunk-3FXPIZXL.js.map → chunk-VOXOBUTX.js.map} +0 -0
  156. /package/dist/{chunk-4IW6FAUN.js.map → chunk-VYBYUQIP.js.map} +0 -0
  157. /package/dist/{chunk-4TGIGVFO.js.map → chunk-WVXCN5DS.js.map} +0 -0
  158. /package/dist/{chunk-J67EOBN3.js.map → chunk-X4MPUD4B.js.map} +0 -0
  159. /package/dist/{chunk-W7EZJPRX.js.map → chunk-Y6M4JFKG.js.map} +0 -0
  160. /package/dist/{chunk-U4SY2TJS.js.map → chunk-YZ4TJLZQ.js.map} +0 -0
  161. /package/dist/{cli-USPQURPP.js.map → cli-4JHQCPHU.js.map} +0 -0
  162. /package/dist/{cli-UL2IFH3R.js.map → cli-7DETHSNW.js.map} +0 -0
  163. /package/dist/{cli-4ANSKDPD.js.map → cli-AZKWTCFV.js.map} +0 -0
  164. /package/dist/{cli-2OQKCKRD.js.map → cli-BW5VOFOZ.js.map} +0 -0
  165. /package/dist/{cli-5QGP6R63.js.map → cli-DGFLJ2DD.js.map} +0 -0
  166. /package/dist/{cli-SDTXHLCA.js.map → cli-ECVT4YXR.js.map} +0 -0
  167. /package/dist/{cli-2Q5FODAX.js.map → cli-H5LVGOVT.js.map} +0 -0
  168. /package/dist/{cli-RQRMZKKM.js.map → cli-KYTCJYXK.js.map} +0 -0
  169. /package/dist/{cli-SGSS6FXE.js.map → cli-L5B2RVV2.js.map} +0 -0
  170. /package/dist/{cli-RQSCBJJY.js.map → cli-RP5E7XHC.js.map} +0 -0
  171. /package/dist/{github-PBIYRH5S.js.map → github-DJQ4MWNZ.js.map} +0 -0
  172. /package/dist/{github-RJG2MAWB.js.map → github-UWTDM2J2.js.map} +0 -0
  173. /package/dist/{json-PQURAHQ5.js.map → json-LCVPMEAM.js.map} +0 -0
  174. /package/dist/{labels-FMLO2URZ.js.map → labels-OQXBVM4A.js.map} +0 -0
  175. /package/dist/{lint-N2CY66JX.js.map → lint-O7XRHKFP.js.map} +0 -0
  176. /package/dist/{list-OMHTVFDY.js.map → list-OOOCLOAL.js.map} +0 -0
  177. /package/dist/{list-VBFNFEXV.js.map → list-OYQ5XPN2.js.map} +0 -0
  178. /package/dist/{page-X3HYSH6D.js.map → page-XPX5XJZE.js.map} +0 -0
  179. /package/dist/{prepare-IQMB262G.js.map → prepare-VMBIQYAM.js.map} +0 -0
  180. /package/dist/{pretty-22PXIEOV.js.map → pretty-KG6TMOEI.js.map} +0 -0
  181. /package/dist/{pretty-K5BOCKBB.js.map → pretty-KSTZMBUF.js.map} +0 -0
  182. /package/dist/{reporters-324OWH36.js.map → reporters-AQU4W3KY.js.map} +0 -0
  183. /package/dist/{reporters-5LIYYE6M.js.map → reporters-FBYLPKD4.js.map} +0 -0
  184. /package/dist/{run-4EKG6EMI.js.map → run-KUGTU3TT.js.map} +0 -0
  185. /package/dist/{term-2ADSKGZW.js.map → term-SI3VM6EM.js.map} +0 -0
  186. /package/dist/{validate-LRYUEZLJ.js.map → validate-NQO7TFSN.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/lint/cli.ts"],"sourcesContent":["/**\n * The lint program. Named `lint` because that is where it is mounted\n * (`manni lint …`); `src/cli.ts` adds it to the umbrella and runs it. Thin\n * commander wrapper over the command cores. Follows clig.dev: primary output to\n * stdout, diagnostics to stderr, color only on a TTY (and never under\n * NO_COLOR/--no-color), meaningful exit codes.\n *\n * Grammar per proposal 0034: the verbs are `check`, `structure`, `templates`\n * and `tools`, and there is no default subcommand, so a bare `manni lint` is a\n * usage error that lists them. `check` runs every configured job; `structure`\n * runs one of them, and carries the options that belong to the tool performing\n * it.\n *\n * Exit codes are the contract CI reads:\n * 0 every file linted clean\n * 1 the run produced findings\n * 2 the tool could not do its job - bad usage, missing template, unreadable\n * input. A LintError is always this, never a lint failure.\n *\n * The 1/2 split is what lets a workflow tell \"the docs are wrong\" apart from\n * \"the linter is misconfigured\", which a single non-zero exit cannot.\n */\nimport { Command } from \"commander\";\nimport pkg from \"../../package.json\" with { type: \"json\" };\nimport {\n collect,\n configOption,\n explicitFalse,\n readStdin,\n reportConfig,\n splitList,\n} from \"../shared/cli-options.js\";\nimport { shouldColor } from \"../shared/color.js\";\nimport { fail } from \"../shared/run.js\";\nimport { notice } from \"../shared/warn.js\";\nimport {\n OMITTED_WHEN_CLEAN,\n REPORT_FORMAT_LIST,\n STDIN_TOKEN,\n} from \"../meta/internal.js\";\nimport {\n REPORT_FORMATS,\n isReportFormat,\n type ReportFormat as FamilyFormat,\n} from \"../meta/index.js\";\nimport { LintError } from \"./types.js\";\nimport { runLint } from \"./commands/lint.js\";\nimport { runTemplates, runTemplatesInfer } from \"./commands/templates.js\";\nimport { runTools } from \"./commands/tools.js\";\nimport { INFER_FORMATS, isInferFormat, type InferFormat } from \"./core/infer.js\";\nimport {\n LINT_JOBS,\n TOOLS_BY_JOB,\n loadConfig,\n rebaseConfig,\n} from \"./core/config.js\";\nimport { resolveStructureTool } from \"./tools/index.js\";\nimport {\n render,\n renderTemplates,\n renderTools,\n type ListFormat,\n type ReportFormat,\n} from \"./reporters/index.js\";\n\n/** The options `check` and `structure` share, in the family's spelling. */\ninterface InputCliOptions {\n /** `--collection <name>`, repeatable; commander's default value is `[]`. */\n collection: string[];\n /** `--ext <list>`; the command splits it. */\n ext?: string;\n /** `--exclude <glob>`, repeatable; commander's default value is `[]`. */\n exclude: string[];\n /** `--as <format>`: force a parser. */\n as?: string;\n /**\n * `-c, --config <path>` and `--no-config` share one commander attribute:\n * `undefined` with neither flag, the path with `-c`, `false` with\n * `--no-config`. Split by `configOption`.\n */\n config?: string | boolean;\n allowEmpty?: boolean;\n /** `--no-gitignore`. */\n gitignore: boolean;\n /** `-f, --format <format>`. Always a string: the declaration has a default. */\n format: string;\n}\n\n/** `structure` adds the options of the tool that performs the job. */\ninterface StructureCliOptions extends InputCliOptions {\n tool?: string;\n template?: string;\n /** `--templates <path>`, repeatable; commander's default value is `[]`. */\n templates: string[];\n explain?: boolean;\n}\n\n/** What commander parses for `templates`. */\ninterface TemplatesCommandOptions {\n templates: string[];\n config?: string | boolean;\n format: string;\n}\n\n/** What commander parses for `templates infer`. */\ninterface TemplatesInferCliOptions {\n as?: string;\n name?: string;\n config?: string | boolean;\n format: string;\n out?: string;\n force?: boolean;\n}\n\n/** What commander parses for `tools`. */\ninterface ToolsCommandOptions {\n config?: string | boolean;\n format: string;\n}\n\n// `explain` is reachable through `--explain`, not `-f`: it reports on\n// configuration rather than on documents, and offering it as a format would\n// invite `-f explain` alongside a lint that then never happens. The `-f` set\n// itself is the family's, from meta, rather than a fourth hand-kept copy of\n// the same five words.\nconst LIST_FORMATS = new Set<string>([\"pretty\", \"json\"]);\n\n/** The heading the tool's own options print under, after the shared ones. */\nconst TOOL_OPTIONS_GROUP = \"Tool options:\";\n\nfunction resolveColor(program: Command): boolean {\n // commander maps --no-color to opts.color === false.\n const noColor = program.opts().color === false;\n return shouldColor({ noColor, isTTY: process.stdout.isTTY });\n}\n\nfunction reportFormat(value: unknown): FamilyFormat {\n const format = String(value);\n if (!isReportFormat(format)) {\n throw new LintError(\n `Unknown --format \"${format}\". Use ${REPORT_FORMAT_LIST}.`,\n );\n }\n return format;\n}\n\n/**\n * Whether a clean run may print nothing at all in this format.\n *\n * Only `github` may: an empty annotation stream is a clean check. Every other\n * format owes its envelope - an empty JSON array, a SARIF log with no results,\n * a JUnit suite of passing testcases - because a consumer parsing stdout must\n * not have to treat \"no output\" as a third outcome. `explain` is never clean\n * or dirty; it always has something to say.\n */\nfunction omittedWhenClean(format: ReportFormat): boolean {\n return format !== \"explain\" && OMITTED_WHEN_CLEAN.has(format);\n}\n\nfunction listFormat(value: unknown): ListFormat {\n const format = String(value);\n if (!LIST_FORMATS.has(format)) {\n throw new LintError(\n `Unknown --format \"${format}\". Use pretty or json.`,\n );\n }\n return format as ListFormat;\n}\n\n/**\n * `templates infer -f`: the format a *template file* is written in, which is\n * not the set a report is rendered in. A template is YAML or JSON because those\n * are the two the loader reads back, and `pretty` would name a third thing the\n * tool cannot then load.\n */\nfunction inferFormat(value: unknown): InferFormat {\n const format = String(value);\n if (!isInferFormat(format)) {\n throw new LintError(`Unknown --format \"${format}\". Use yaml or json.`);\n }\n return format;\n}\n\n/**\n * `--tool <name>`: which tool performs the structure job. Refused by name\n * rather than ignored, because falling through to manni's engine would lint\n * with something other than what was asked for and say nothing.\n *\n * The refusal is the registry's, not a second copy of it here. `runLint`\n * refuses the same name with the same sentence for a caller that never touches\n * commander; this one fires first, so a bad `--tool` is reported before the\n * run asks what it was pointed at.\n */\nfunction assertStructureTool(value: string | undefined): void {\n if (value === undefined) return;\n resolveStructureTool(value);\n}\n\n/**\n * `-c/--config` and `--no-config`, in one place.\n *\n * Every verb here takes them, and they had been written out three times. A flag\n * two commands both have carries the same name *and* the same description, so\n * the declaration is shared rather than copied - which is what kept the fourth\n * copy, on `templates infer`, from spelling either of them slightly differently.\n */\nfunction withConfigOptions(command: Command): Command {\n return command\n .option(\"-c, --config <path>\", \"path to a manni config file\")\n .option(\"--no-config\", \"ignore any discovered config file\");\n}\n\n/**\n * The value of a flag a command and its parent both declare.\n *\n * Commander keeps parsing a parent's options past a subcommand name unless\n * `enablePositionalOptions()` is on, so `templates infer page.md -f json` sets\n * `format` on `templates` and leaves `infer` holding its own default. Both\n * commands declare `-f`, `-c` and `--no-config`, because \"commands must have\n * parallel behaviors\" and `infer` must list them in its own `--help`.\n *\n * Turning positional options on would fix it and move every other flag in this\n * program with it: `manni lint structure docs/ --no-color` is a root option\n * written after its command, and there are three more like it. So the lookup\n * changes instead. The nearest command actually *given* the flag wins, and the\n * subcommand's own default is the fallback - which is the reading a person\n * typing the line already has.\n */\nfunction optionValue(command: Command, key: string): unknown {\n for (\n let cmd: Command | null = command;\n cmd !== null;\n cmd = cmd.parent ?? null\n ) {\n if (cmd.getOptionValueSource(key) === \"cli\") return cmd.getOptionValue(key);\n }\n return command.getOptionValue(key);\n}\n\n/** The options every job verb takes, in one place so the two cannot drift. */\nfunction withInputOptions(command: Command): Command {\n command\n .argument(\n \"[paths...]\",\n \"files, directories, or globs to lint (use - for stdin)\",\n )\n .option(\n \"--collection <name>\",\n \"configured collection to run over; repeatable\",\n collect,\n [],\n )\n .option(\"--ext <list>\", \"comma-separated extensions for directory walks\")\n .option(\"--exclude <glob>\", \"glob to exclude; repeatable\", collect, [])\n .option(\"--as <format>\", \"force an input format (e.g. markdown, mdx)\")\n .option(\n \"-f, --format <format>\",\n `output: ${REPORT_FORMATS.join(\" | \")}`,\n \"pretty\",\n );\n return withConfigOptions(command)\n .option(\"--allow-empty\", \"treat zero matched files as success\")\n .option(\"--no-gitignore\", \"lint files .gitignore covers\");\n}\n\n/** The lint options every job verb turns its shared flags into. */\nfunction inputOptions(\n paths: string[],\n options: InputCliOptions,\n): {\n inputs: string[];\n collection: string[];\n exts?: string[];\n exclude: string[];\n as?: string;\n configPath?: string;\n noConfig?: boolean;\n allowEmpty?: boolean;\n respectGitignore?: boolean;\n onNotice: (message: string) => void;\n} {\n return {\n inputs: paths,\n collection: options.collection,\n ...(options.ext ? { exts: splitList(options.ext) } : {}),\n exclude: options.exclude,\n ...(options.as === undefined ? {} : { as: options.as }),\n ...configOption(options.config),\n // `undefined` rather than `false` when absent, so config still wins.\n ...(options.allowEmpty ? { allowEmpty: true } : {}),\n respectGitignore: explicitFalse(options.gitignore),\n onNotice: notice,\n };\n}\n\nexport function buildProgram(): Command {\n const program = new Command();\n program\n .name(\"lint\")\n .description(\n \"Validate document structure against doctype templates. Deterministic, CI-friendly.\",\n )\n .version(pkg.version, \"-V, --version\")\n .option(\"--no-color\", \"disable colored output\")\n .showHelpAfterError()\n // Exit code 1 is reserved for \"the docs are wrong\". Commander exits 1 on a\n // usage error by default, which would make a typo'd flag look exactly like\n // a failing lint to a workflow. With no callback, commander throws the\n // CommanderError instead, and the umbrella's runner maps it: help and\n // --version stay 0, every other usage error becomes 2. Commander has\n // already written its own message. This has to precede .command(), which\n // copies the callback into each subcommand.\n .exitOverride();\n\n /** Run one lint, render it, and settle the exit code. Both job verbs share it. */\n const lint = async (\n paths: string[],\n options: StructureCliOptions | InputCliOptions,\n command: Command,\n job: { tool?: StructureCliOptions } = {},\n ): Promise<void> => {\n const tool = job.tool;\n const format = reportFormat(options.format);\n const explain = tool?.explain === true;\n const stdinContent = paths.includes(STDIN_TOKEN) ? await readStdin() : undefined;\n const cwd = process.cwd();\n\n const run = await runLint({\n ...inputOptions(paths, options),\n ...(tool?.tool === undefined ? {} : { tool: tool.tool }),\n ...(tool?.template === undefined ? {} : { template: tool.template }),\n ...(tool && tool.templates.length > 0 ? { templates: tool.templates } : {}),\n ...(explain ? { explain: true } : {}),\n ...(stdinContent === undefined ? {} : { stdinContent }),\n // Which config governed the run, said where a report cannot be parsed\n // around: discovery walks up to the project boundary, so an unexpected\n // ancestor config is the difference between a five-minute diagnosis and\n // an hour of confusion.\n onConfigLoaded: reportConfig(format === \"pretty\", cwd),\n });\n\n const color = resolveColor(command.parent ?? command);\n const chosen: ReportFormat = explain ? \"explain\" : format;\n const text = render(run, chosen, { color });\n if (text.length > 0 || !omittedWhenClean(chosen)) {\n process.stdout.write(`${text}\\n`);\n }\n // `--explain` answers a question about configuration, so its exit code\n // reports whether it could answer it - not whether the docs are clean.\n //\n // That covers routing failures too: a page whose `type` matches no\n // template is a answered question, not an unanswered one, so it exits 0\n // like everything else here. Automation must not read this code as\n // \"everything routed\" - the ordinary run is what reports that, with exit\n // 1. Said in `--help` and the README, because the distinction is invisible\n // from the exit code alone.\n process.exitCode = explain ? 0 : run.summary.failed > 0 ? 1 : 0;\n };\n\n withInputOptions(\n program\n .command(\"check\")\n .description(\"Run every configured lint job over the given files/dirs/globs\"),\n )\n .addHelpText(\n \"after\",\n [\n \"\",\n \"Jobs: structure.\",\n \"\",\n \"Examples:\",\n \" manni lint check docs/ # every configured job\",\n \" manni lint check # targets from collections:\",\n \" manni lint check --collection guides\",\n ' manni lint check \"**/*.md\" -f github # CI annotations',\n \" cat page.md | manni lint check - --as markdown\",\n ].join(\"\\n\"),\n )\n .action(async (paths: string[], options: InputCliOptions, command: Command) => {\n try {\n // Which jobs this run covered, said once, beside the config line. The\n // full form also names the jobs that exist and are not configured;\n // `structure` is the only job there is, so today it is one word.\n if (options.format === \"pretty\") {\n process.stderr.write(`Checked: ${LINT_JOBS.join(\", \")}.\\n`);\n }\n await lint(paths, options, command);\n } catch (err) {\n fail(err);\n }\n });\n\n const structure = withInputOptions(\n program\n .command(\"structure\")\n .description(\n \"Lint document structure against doctype templates, routing each page by its `type`\",\n ),\n );\n structure\n .optionsGroup(TOOL_OPTIONS_GROUP)\n .option(\n \"--tool <name>\",\n `tool that performs the job: ${TOOLS_BY_JOB.structure.join(\", \")}`,\n )\n .option(\n \"-t, --template <ref>\",\n \"apply this template to every file, overriding type routing\",\n )\n .option(\n \"--templates <path>\",\n \"template file to route by: its `types:` win over built-ins; repeatable\",\n collect,\n [],\n )\n .option(\n \"--explain\",\n \"print how each file's template was chosen, and lint nothing (always exits 0, unrouted pages included)\",\n )\n .addHelpText(\n \"after\",\n [\n \"\",\n \"Examples:\",\n \" manni lint structure docs/ # route each page by its `type`\",\n \" manni lint structure docs/ --templates ./templates.yaml # add your own templates\",\n \" manni lint structure # targets from collections:\",\n \" manni lint structure docs/ --explain # show why each page routed where\",\n \" manni lint structure page.md -t tgdp:how-to:1.6 # force one template\",\n ' manni lint structure \"**/*.md\" -f github # CI annotations',\n \" manni lint structure docs/ --exclude '**/drafts/**'\",\n \" cat page.md | manni lint structure - -t tgdp:how-to:1.6 --as markdown\",\n ].join(\"\\n\"),\n )\n .action(\n async (paths: string[], options: StructureCliOptions, command: Command) => {\n try {\n assertStructureTool(options.tool);\n await lint(paths, options, command, { tool: options });\n } catch (err) {\n fail(err);\n }\n },\n );\n\n const templates = program\n .command(\"templates\")\n .description(\"List the templates that can be applied, and the types they serve\")\n .option(\n \"--templates <path>\",\n \"also list the templates in this file; repeatable\",\n collect,\n [],\n );\n withConfigOptions(templates)\n .option(\"-f, --format <format>\", \"output: pretty | json\", \"pretty\")\n .action(async (options: TemplatesCommandOptions, command: Command) => {\n try {\n const format = listFormat(options.format);\n // The listing answers \"what could route a page?\", so it has to see the\n // same template files a lint would - rebased the same way, or it would\n // answer for a different set of files depending on where it was run.\n const { configPath, noConfig } = configOption(options.config);\n const found = noConfig ? null : await loadConfig(configPath);\n const info = await runTemplates({\n templates:\n options.templates.length > 0\n ? options.templates\n : rebaseConfig(found).templates,\n });\n const color = resolveColor(command.parent ?? command);\n process.stdout.write(`${renderTemplates(info, format, { color })}\\n`);\n } catch (err) {\n fail(err);\n }\n });\n\n const inferCommand = templates\n .command(\"infer\")\n .description(\"Write a first template from a page that already has the shape you want\")\n .argument(\"<page>\", \"one file to infer from (use - for stdin)\")\n .option(\"--as <format>\", \"force an input format (e.g. markdown, mdx)\")\n .option(\n \"--name <name>\",\n \"name for the template; defaults to the page's `type`, else its filename\",\n )\n .option(\"-f, --format <format>\", `output: ${INFER_FORMATS.join(\" | \")}`, \"yaml\")\n .option(\"-o, --out <path>\", \"write the template here instead of to stdout\")\n .option(\"--force\", \"overwrite the --out path\");\n withConfigOptions(inferCommand)\n .addHelpText(\n \"after\",\n [\n \"\",\n \"Examples:\",\n \" manni lint templates infer docs/guides/install.md\",\n \" manni lint templates infer docs/guides/install.md --name how-to\",\n \" manni lint templates infer page.mdx -f json\",\n \" manni lint templates infer page.md -o ./templates.yaml\",\n \" manni lint templates infer page.md -o ./templates.yaml --force\",\n \" cat page.md | manni lint templates infer - --as markdown\",\n \"\",\n \"One page, and every rule it writes is exactly one occurrence: a single\",\n \"page cannot show what varies. Loosening a heading into a list or a\",\n \"pattern, setting `min: 0`, and adding a trailing rule with no heading\",\n \"for the sections that may follow are your edits to make.\",\n ].join(\"\\n\"),\n )\n .action(\n async (\n page: string,\n options: TemplatesInferCliOptions,\n command: Command,\n ) => {\n try {\n // `-f`, `-c` and `--no-config` are read through `optionValue`: the\n // parent `templates` declares all three, and commander hands it any\n // of them typed after `infer`.\n const format = inferFormat(optionValue(command, \"format\"));\n const { configPath, noConfig } = configOption(\n optionValue(command, \"config\"),\n );\n const stdinContent =\n page === STDIN_TOKEN ? await readStdin() : undefined;\n const result = await runTemplatesInfer({\n page,\n format,\n ...(options.as === undefined ? {} : { as: options.as }),\n ...(options.name === undefined ? {} : { name: options.name }),\n ...(options.out === undefined ? {} : { out: options.out }),\n ...(options.force === undefined ? {} : { force: options.force }),\n ...(configPath === undefined ? {} : { configPath }),\n ...(noConfig === undefined ? {} : { noConfig }),\n ...(stdinContent === undefined ? {} : { stdinContent }),\n // The template is the primary output, so with no --out it owns\n // stdout and the config line goes to stderr beside it. With --out\n // stdout is free, and the line still belongs on stderr: a reader\n // piping nothing is not a reason to move a diagnostic.\n onConfigLoaded: reportConfig(false, process.cwd()),\n });\n\n if (result.written === undefined) {\n process.stdout.write(result.text);\n return;\n }\n // Said on stderr, so `-o` leaves stdout empty for a shell that is\n // watching it, and the template file is the whole output.\n process.stderr.write(\n `Wrote template \"${result.name}\" to ${result.written}\\n`,\n );\n } catch (err) {\n fail(err);\n }\n },\n );\n\n withConfigOptions(\n program\n .command(\"tools\")\n .description(\n \"List the lint jobs, the tool that performs each, and what it reads\",\n ),\n )\n .option(\"-f, --format <format>\", \"output: pretty | json\", \"pretty\")\n .action(async (options: ToolsCommandOptions, command: Command) => {\n try {\n const format = listFormat(options.format);\n const tools = await runTools(configOption(options.config));\n const color = resolveColor(command.parent ?? command);\n process.stdout.write(`${renderTools(tools, format, { color })}\\n`);\n } catch (err) {\n fail(err);\n }\n });\n\n return program;\n}\n"],"mappings":"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","names":[]}