padrone 1.8.2 → 2.0.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 (333) hide show
  1. package/CHANGELOG.md +20 -1
  2. package/README.md +2 -2
  3. package/dist/codegen/code-builder.d.mts +10 -0
  4. package/dist/codegen/code-builder.d.mts.map +1 -0
  5. package/dist/codegen/code-builder.mjs +185 -0
  6. package/dist/codegen/code-builder.mjs.map +1 -0
  7. package/dist/codegen/discovery.d.mts +44 -0
  8. package/dist/codegen/discovery.d.mts.map +1 -0
  9. package/dist/codegen/discovery.mjs +179 -0
  10. package/dist/codegen/discovery.mjs.map +1 -0
  11. package/dist/codegen/file-emitter.d.mts +10 -0
  12. package/dist/codegen/file-emitter.d.mts.map +1 -0
  13. package/dist/codegen/file-emitter.mjs +58 -0
  14. package/dist/codegen/file-emitter.mjs.map +1 -0
  15. package/dist/codegen/generators/barrel-file.d.mts +10 -0
  16. package/dist/codegen/generators/barrel-file.d.mts.map +1 -0
  17. package/dist/codegen/generators/barrel-file.mjs +16 -0
  18. package/dist/codegen/generators/barrel-file.mjs.map +1 -0
  19. package/dist/codegen/generators/command-file.d.mts +25 -0
  20. package/dist/codegen/generators/command-file.d.mts.map +1 -0
  21. package/dist/codegen/generators/command-file.mjs +130 -0
  22. package/dist/codegen/generators/command-file.mjs.map +1 -0
  23. package/dist/codegen/generators/command-tree.d.mts +17 -0
  24. package/dist/codegen/generators/command-tree.d.mts.map +1 -0
  25. package/dist/codegen/generators/command-tree.mjs +72 -0
  26. package/dist/codegen/generators/command-tree.mjs.map +1 -0
  27. package/dist/codegen/index.d.mts +15 -330
  28. package/dist/codegen/index.mjs +13 -1507
  29. package/dist/codegen/parsers/bash.d.mts +19 -0
  30. package/dist/codegen/parsers/bash.d.mts.map +1 -0
  31. package/dist/codegen/parsers/bash.mjs +112 -0
  32. package/dist/codegen/parsers/bash.mjs.map +1 -0
  33. package/dist/codegen/parsers/fish.d.mts +13 -0
  34. package/dist/codegen/parsers/fish.d.mts.map +1 -0
  35. package/dist/codegen/parsers/fish.mjs +108 -0
  36. package/dist/codegen/parsers/fish.mjs.map +1 -0
  37. package/dist/codegen/parsers/help.d.mts +15 -0
  38. package/dist/codegen/parsers/help.d.mts.map +1 -0
  39. package/dist/codegen/parsers/help.mjs +271 -0
  40. package/dist/codegen/parsers/help.mjs.map +1 -0
  41. package/dist/codegen/parsers/merge.d.mts +14 -0
  42. package/dist/codegen/parsers/merge.d.mts.map +1 -0
  43. package/dist/codegen/parsers/merge.mjs +76 -0
  44. package/dist/codegen/parsers/merge.mjs.map +1 -0
  45. package/dist/codegen/parsers/zsh.d.mts +16 -0
  46. package/dist/codegen/parsers/zsh.d.mts.map +1 -0
  47. package/dist/codegen/parsers/zsh.mjs +161 -0
  48. package/dist/codegen/parsers/zsh.mjs.map +1 -0
  49. package/dist/codegen/schema-to-code.d.mts +24 -0
  50. package/dist/codegen/schema-to-code.d.mts.map +1 -0
  51. package/dist/codegen/schema-to-code.mjs +147 -0
  52. package/dist/codegen/schema-to-code.mjs.map +1 -0
  53. package/dist/codegen/template.d.mts +18 -0
  54. package/dist/codegen/template.d.mts.map +1 -0
  55. package/dist/codegen/template.mjs +37 -0
  56. package/dist/codegen/template.mjs.map +1 -0
  57. package/dist/codegen/types.d.mts +144 -0
  58. package/dist/codegen/types.d.mts.map +1 -0
  59. package/dist/completion.d.mts +2 -0
  60. package/dist/completion.mjs +2 -0
  61. package/dist/core/args.d.mts +3 -0
  62. package/dist/{args-DrCXxXeP.mjs → core/args.mjs} +49 -113
  63. package/dist/core/args.mjs.map +1 -0
  64. package/dist/core/commands.d.mts +13 -0
  65. package/dist/core/commands.d.mts.map +1 -0
  66. package/dist/{commands-DLR0rFgq.mjs → core/commands.mjs} +4 -232
  67. package/dist/core/commands.mjs.map +1 -0
  68. package/dist/core/create.d.mts +63 -0
  69. package/dist/core/create.d.mts.map +1 -0
  70. package/dist/core/create.mjs +230 -0
  71. package/dist/core/create.mjs.map +1 -0
  72. package/dist/core/default-runtime.mjs +198 -0
  73. package/dist/core/default-runtime.mjs.map +1 -0
  74. package/dist/core/errors.d.mts +107 -0
  75. package/dist/core/errors.d.mts.map +1 -0
  76. package/dist/{errors-DA4KzK1M.mjs → core/errors.mjs} +2 -2
  77. package/dist/core/errors.mjs.map +1 -0
  78. package/dist/core/exec.mjs +191 -0
  79. package/dist/core/exec.mjs.map +1 -0
  80. package/dist/core/interceptors.d.mts +33 -0
  81. package/dist/core/interceptors.d.mts.map +1 -0
  82. package/dist/core/interceptors.mjs +253 -0
  83. package/dist/core/interceptors.mjs.map +1 -0
  84. package/dist/core/parse.mjs +181 -0
  85. package/dist/core/parse.mjs.map +1 -0
  86. package/dist/core/program-methods.mjs +256 -0
  87. package/dist/core/program-methods.mjs.map +1 -0
  88. package/dist/core/results.d.mts +13 -0
  89. package/dist/core/results.d.mts.map +1 -0
  90. package/dist/core/results.mjs +150 -0
  91. package/dist/core/results.mjs.map +1 -0
  92. package/dist/core/runtime.d.mts +213 -0
  93. package/dist/core/runtime.d.mts.map +1 -0
  94. package/dist/core/runtime.mjs +10 -0
  95. package/dist/core/runtime.mjs.map +1 -0
  96. package/dist/core/validate.mjs +220 -0
  97. package/dist/core/validate.mjs.map +1 -0
  98. package/dist/docs/index.d.mts +1 -1
  99. package/dist/docs/index.d.mts.map +1 -1
  100. package/dist/docs/index.mjs +2 -2
  101. package/dist/docs/index.mjs.map +1 -1
  102. package/dist/extension/auto-output.d.mts +53 -0
  103. package/dist/extension/auto-output.d.mts.map +1 -0
  104. package/dist/extension/auto-output.mjs +116 -0
  105. package/dist/extension/auto-output.mjs.map +1 -0
  106. package/dist/extension/color.d.mts +19 -0
  107. package/dist/extension/color.d.mts.map +1 -0
  108. package/dist/extension/color.mjs +37 -0
  109. package/dist/extension/color.mjs.map +1 -0
  110. package/dist/extension/completion.d.mts +25 -0
  111. package/dist/extension/completion.d.mts.map +1 -0
  112. package/dist/extension/completion.mjs +40 -0
  113. package/dist/extension/completion.mjs.map +1 -0
  114. package/dist/extension/config.d.mts +55 -0
  115. package/dist/extension/config.d.mts.map +1 -0
  116. package/dist/extension/config.mjs +162 -0
  117. package/dist/extension/config.mjs.map +1 -0
  118. package/dist/extension/env.d.mts +42 -0
  119. package/dist/extension/env.d.mts.map +1 -0
  120. package/dist/extension/env.mjs +44 -0
  121. package/dist/extension/env.mjs.map +1 -0
  122. package/dist/extension/help.d.mts +29 -0
  123. package/dist/extension/help.d.mts.map +1 -0
  124. package/dist/extension/help.mjs +161 -0
  125. package/dist/extension/help.mjs.map +1 -0
  126. package/dist/extension/index.d.mts +18 -0
  127. package/dist/extension/ink.d.mts +31 -0
  128. package/dist/extension/ink.d.mts.map +1 -0
  129. package/dist/extension/ink.mjs +69 -0
  130. package/dist/extension/ink.mjs.map +1 -0
  131. package/dist/extension/interactive.d.mts +16 -0
  132. package/dist/extension/interactive.d.mts.map +1 -0
  133. package/dist/extension/interactive.mjs +89 -0
  134. package/dist/extension/interactive.mjs.map +1 -0
  135. package/dist/extension/logger.d.mts +67 -0
  136. package/dist/extension/logger.d.mts.map +1 -0
  137. package/dist/extension/logger.mjs +188 -0
  138. package/dist/extension/logger.mjs.map +1 -0
  139. package/dist/extension/man.d.mts +25 -0
  140. package/dist/extension/man.d.mts.map +1 -0
  141. package/dist/extension/man.mjs +41 -0
  142. package/dist/extension/man.mjs.map +1 -0
  143. package/dist/extension/mcp.d.mts +28 -0
  144. package/dist/extension/mcp.d.mts.map +1 -0
  145. package/dist/extension/mcp.mjs +44 -0
  146. package/dist/extension/mcp.mjs.map +1 -0
  147. package/dist/extension/progress-renderer.d.mts +13 -0
  148. package/dist/extension/progress-renderer.d.mts.map +1 -0
  149. package/dist/extension/progress-renderer.mjs +351 -0
  150. package/dist/extension/progress-renderer.mjs.map +1 -0
  151. package/dist/extension/progress.d.mts +76 -0
  152. package/dist/extension/progress.d.mts.map +1 -0
  153. package/dist/extension/progress.mjs +225 -0
  154. package/dist/extension/progress.mjs.map +1 -0
  155. package/dist/extension/repl.d.mts +26 -0
  156. package/dist/extension/repl.d.mts.map +1 -0
  157. package/dist/extension/repl.mjs +67 -0
  158. package/dist/extension/repl.mjs.map +1 -0
  159. package/dist/extension/serve.d.mts +27 -0
  160. package/dist/extension/serve.d.mts.map +1 -0
  161. package/dist/extension/serve.mjs +41 -0
  162. package/dist/extension/serve.mjs.map +1 -0
  163. package/dist/extension/signal.d.mts +19 -0
  164. package/dist/extension/signal.d.mts.map +1 -0
  165. package/dist/extension/signal.mjs +81 -0
  166. package/dist/extension/signal.mjs.map +1 -0
  167. package/dist/extension/stdin.d.mts +19 -0
  168. package/dist/extension/stdin.d.mts.map +1 -0
  169. package/dist/extension/stdin.mjs +52 -0
  170. package/dist/extension/stdin.mjs.map +1 -0
  171. package/dist/extension/suggestions.d.mts +6 -0
  172. package/dist/extension/suggestions.d.mts.map +1 -0
  173. package/dist/extension/suggestions.mjs +113 -0
  174. package/dist/extension/suggestions.mjs.map +1 -0
  175. package/dist/extension/timing.d.mts +27 -0
  176. package/dist/extension/timing.d.mts.map +1 -0
  177. package/dist/extension/timing.mjs +71 -0
  178. package/dist/extension/timing.mjs.map +1 -0
  179. package/dist/extension/tracing.d.mts +85 -0
  180. package/dist/extension/tracing.d.mts.map +1 -0
  181. package/dist/extension/tracing.mjs +107 -0
  182. package/dist/extension/tracing.mjs.map +1 -0
  183. package/dist/extension/update-check.d.mts +20 -0
  184. package/dist/extension/update-check.d.mts.map +1 -0
  185. package/dist/extension/update-check.mjs +62 -0
  186. package/dist/extension/update-check.mjs.map +1 -0
  187. package/dist/extension/utils.mjs +43 -0
  188. package/dist/extension/utils.mjs.map +1 -0
  189. package/dist/extension/version.d.mts +20 -0
  190. package/dist/extension/version.d.mts.map +1 -0
  191. package/dist/extension/version.mjs +51 -0
  192. package/dist/extension/version.mjs.map +1 -0
  193. package/dist/{completion-UnBKfGuk.mjs → feature/completion.mjs} +4 -3
  194. package/dist/feature/completion.mjs.map +1 -0
  195. package/dist/feature/interactive.mjs +145 -0
  196. package/dist/feature/interactive.mjs.map +1 -0
  197. package/dist/feature/mcp.d.mts +18 -0
  198. package/dist/feature/mcp.d.mts.map +1 -0
  199. package/dist/{mcp-D6PdtjIs.mjs → feature/mcp.mjs} +6 -6
  200. package/dist/feature/mcp.mjs.map +1 -0
  201. package/dist/feature/repl-loop.mjs +217 -0
  202. package/dist/feature/repl-loop.mjs.map +1 -0
  203. package/dist/feature/serve.d.mts +18 -0
  204. package/dist/feature/serve.d.mts.map +1 -0
  205. package/dist/{serve-PaCLsNoD.mjs → feature/serve.mjs} +7 -7
  206. package/dist/feature/serve.mjs.map +1 -0
  207. package/dist/feature/test.d.mts +109 -0
  208. package/dist/feature/test.d.mts.map +1 -0
  209. package/dist/feature/test.mjs +116 -0
  210. package/dist/feature/test.mjs.map +1 -0
  211. package/dist/feature/update-check.d.mts +35 -0
  212. package/dist/feature/update-check.d.mts.map +1 -0
  213. package/dist/{update-check-CZ2VqjnV.mjs → feature/update-check.mjs} +2 -2
  214. package/dist/feature/update-check.mjs.map +1 -0
  215. package/dist/feature/wrap.d.mts +58 -0
  216. package/dist/feature/wrap.d.mts.map +1 -0
  217. package/dist/feature/wrap.mjs +77 -0
  218. package/dist/feature/wrap.mjs.map +1 -0
  219. package/dist/index.d.mts +38 -901
  220. package/dist/index.mjs +25 -4337
  221. package/dist/ink.d.mts +2 -0
  222. package/dist/ink.mjs +2 -0
  223. package/dist/man.d.mts +2 -0
  224. package/dist/man.mjs +2 -0
  225. package/dist/mcp.d.mts +3 -0
  226. package/dist/mcp.mjs +2 -0
  227. package/dist/output/colorizer.d.mts +28 -0
  228. package/dist/output/colorizer.d.mts.map +1 -0
  229. package/dist/output/colorizer.mjs +94 -0
  230. package/dist/output/colorizer.mjs.map +1 -0
  231. package/dist/{formatter-CY3KrOEd.d.mts → output/formatter.d.mts} +2 -28
  232. package/dist/output/formatter.d.mts.map +1 -0
  233. package/dist/output/formatter.mjs +360 -0
  234. package/dist/output/formatter.mjs.map +1 -0
  235. package/dist/output/help.d.mts +18 -0
  236. package/dist/output/help.d.mts.map +1 -0
  237. package/dist/output/help.mjs +267 -0
  238. package/dist/output/help.mjs.map +1 -0
  239. package/dist/output/output-indicator.d.mts +27 -0
  240. package/dist/output/output-indicator.d.mts.map +1 -0
  241. package/dist/output/output-indicator.mjs +54 -0
  242. package/dist/output/output-indicator.mjs.map +1 -0
  243. package/dist/output/primitives.d.mts +33 -0
  244. package/dist/output/primitives.d.mts.map +1 -0
  245. package/dist/output/primitives.mjs +206 -0
  246. package/dist/output/primitives.mjs.map +1 -0
  247. package/dist/output/styling.d.mts +38 -0
  248. package/dist/output/styling.d.mts.map +1 -0
  249. package/dist/output/styling.mjs +146 -0
  250. package/dist/output/styling.mjs.map +1 -0
  251. package/dist/schema/zod.d.mts +6 -0
  252. package/dist/schema/zod.d.mts.map +1 -0
  253. package/dist/schema/zod.mjs +50 -0
  254. package/dist/schema/zod.mjs.map +1 -0
  255. package/dist/serve.d.mts +2 -0
  256. package/dist/serve.mjs +2 -0
  257. package/dist/test.d.mts +2 -109
  258. package/dist/test.mjs +1 -115
  259. package/dist/tracing.d.mts +2 -0
  260. package/dist/tracing.mjs +2 -0
  261. package/dist/types/args-meta.d.mts +129 -0
  262. package/dist/types/args-meta.d.mts.map +1 -0
  263. package/dist/types/builder.d.mts +212 -0
  264. package/dist/types/builder.d.mts.map +1 -0
  265. package/dist/types/command.d.mts +112 -0
  266. package/dist/types/command.d.mts.map +1 -0
  267. package/dist/types/index.d.mts +8 -0
  268. package/dist/types/interceptor.d.mts +232 -0
  269. package/dist/types/interceptor.d.mts.map +1 -0
  270. package/dist/types/preferences.d.mts +79 -0
  271. package/dist/types/preferences.d.mts.map +1 -0
  272. package/dist/types/result.d.mts +61 -0
  273. package/dist/types/result.d.mts.map +1 -0
  274. package/dist/types/schema.d.mts +24 -0
  275. package/dist/types/schema.d.mts.map +1 -0
  276. package/dist/util/dotenv.mjs +174 -0
  277. package/dist/util/dotenv.mjs.map +1 -0
  278. package/dist/util/shell-utils.mjs +80 -0
  279. package/dist/util/shell-utils.mjs.map +1 -0
  280. package/dist/util/stream.d.mts +33 -0
  281. package/dist/util/stream.d.mts.map +1 -0
  282. package/dist/{stream-DC4H8YTx.mjs → util/stream.mjs} +2 -2
  283. package/dist/util/stream.mjs.map +1 -0
  284. package/dist/util/type-helpers.d.mts +74 -0
  285. package/dist/util/type-helpers.d.mts.map +1 -0
  286. package/dist/util/type-utils.d.mts +186 -0
  287. package/dist/util/type-utils.d.mts.map +1 -0
  288. package/dist/util/utils.mjs +43 -0
  289. package/dist/util/utils.mjs.map +1 -0
  290. package/dist/zod.d.mts +1 -32
  291. package/dist/zod.mjs +1 -49
  292. package/package.json +65 -17
  293. package/src/completion.ts +2 -0
  294. package/src/core/args.ts +63 -37
  295. package/src/core/runtime.ts +11 -2
  296. package/src/extension/completion.ts +3 -0
  297. package/src/extension/index.ts +0 -12
  298. package/src/extension/ink.ts +2 -1
  299. package/src/extension/man.ts +3 -0
  300. package/src/extension/mcp.ts +3 -0
  301. package/src/extension/progress-renderer.ts +32 -8
  302. package/src/extension/progress.ts +19 -9
  303. package/src/extension/serve.ts +3 -0
  304. package/src/extension/tracing.ts +2 -0
  305. package/src/index.ts +1 -20
  306. package/src/ink.ts +2 -0
  307. package/src/man.ts +2 -0
  308. package/src/mcp.ts +3 -0
  309. package/src/serve.ts +2 -0
  310. package/src/tracing.ts +9 -0
  311. package/src/types/builder.ts +2 -2
  312. package/src/zod.ts +1 -1
  313. package/dist/args-DrCXxXeP.mjs.map +0 -1
  314. package/dist/codegen/index.d.mts.map +0 -1
  315. package/dist/codegen/index.mjs.map +0 -1
  316. package/dist/commands-DLR0rFgq.mjs.map +0 -1
  317. package/dist/completion-UnBKfGuk.mjs.map +0 -1
  318. package/dist/errors-DA4KzK1M.mjs.map +0 -1
  319. package/dist/formatter-CY3KrOEd.d.mts.map +0 -1
  320. package/dist/help-B-ZMYyn-.mjs +0 -892
  321. package/dist/help-B-ZMYyn-.mjs.map +0 -1
  322. package/dist/index-D-Dpz7l_.d.mts +0 -1427
  323. package/dist/index-D-Dpz7l_.d.mts.map +0 -1
  324. package/dist/index.d.mts.map +0 -1
  325. package/dist/index.mjs.map +0 -1
  326. package/dist/mcp-D6PdtjIs.mjs.map +0 -1
  327. package/dist/serve-PaCLsNoD.mjs.map +0 -1
  328. package/dist/stream-DC4H8YTx.mjs.map +0 -1
  329. package/dist/test.d.mts.map +0 -1
  330. package/dist/test.mjs.map +0 -1
  331. package/dist/update-check-CZ2VqjnV.mjs.map +0 -1
  332. package/dist/zod.d.mts.map +0 -1
  333. package/dist/zod.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.mjs","names":[],"sources":["../../src/core/validate.ts"],"sourcesContent":["import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport type { AnyPadroneCommand, InterceptorValidateResult } from '../types/index.ts';\nimport { coerceArgs, detectUnknownArgs, extractSchemaMetadata, getJsonSchema, parsePositionalConfig, preprocessArgs } from './args.ts';\nimport { getCommandRuntime } from './commands.ts';\nimport { getNestedValue, parseCliInputToParts, setNestedValue } from './parse.ts';\nimport { thenMaybe } from './results.ts';\n\n/**\n * Parses CLI input to find the command and extract raw arguments without validation.\n */\nexport function parseCommand(input: string | undefined, rootCommand: AnyPadroneCommand, findCommandByName: FindCommandFn) {\n input ??= getCommandRuntime(rootCommand).argv().join(' ') || undefined;\n if (!input) {\n const defaultCommand = findCommandByName('', rootCommand.commands);\n if (defaultCommand) {\n return { command: defaultCommand, rawArgs: {} as Record<string, unknown>, args: [] as string[], unmatchedTerms: [] as string[] };\n }\n return { command: rootCommand, rawArgs: {} as Record<string, unknown>, args: [] as string[], unmatchedTerms: [] as string[] };\n }\n\n const parts = parseCliInputToParts(input);\n\n const terms = parts.filter((p) => p.type === 'term').map((p) => p.value);\n const argTokens = parts.filter((p) => p.type === 'arg').map((p) => p.value);\n\n let curCommand: AnyPadroneCommand | undefined = rootCommand;\n let unmatchedTerms: string[] = [];\n\n if (terms[0] === rootCommand.name) terms.shift();\n\n for (let i = 0; i < terms.length; i++) {\n const term = terms[i] || '';\n const found = findCommandByName(term, curCommand.commands);\n\n if (found) {\n curCommand = found;\n } else {\n unmatchedTerms = terms.slice(i);\n argTokens.unshift(...unmatchedTerms);\n break;\n }\n }\n\n if (unmatchedTerms.length === 0 && curCommand.commands?.length) {\n const defaultCommand = findCommandByName('', curCommand.commands);\n if (defaultCommand) curCommand = defaultCommand;\n }\n\n if (!curCommand) return { command: rootCommand, rawArgs: {} as Record<string, unknown>, args: argTokens, unmatchedTerms };\n\n const argsMeta = curCommand.meta?.fields;\n const schemaMetadata = curCommand.argsSchema\n ? extractSchemaMetadata(curCommand.argsSchema, argsMeta, curCommand.meta?.autoAlias)\n : { flags: {}, aliases: {}, negatives: {}, customNegation: new Set<string>() };\n const { flags, aliases, negatives, customNegation } = schemaMetadata;\n\n const arrayArguments = new Set<string>();\n if (curCommand.argsSchema) {\n try {\n const jsonSchema = getJsonSchema(curCommand.argsSchema) as Record<string, any>;\n if (jsonSchema.type === 'object' && jsonSchema.properties) {\n for (const [key, prop] of Object.entries(jsonSchema.properties as Record<string, any>)) {\n if (prop?.type === 'array') arrayArguments.add(key);\n }\n }\n } catch {\n // Ignore schema parsing errors\n }\n }\n\n const argParts = parts.filter((p) => p.type === 'named' || p.type === 'alias');\n const rawArgs: Record<string, unknown> = {};\n\n for (const arg of argParts) {\n let key: string[];\n if (arg.type === 'alias' && arg.key.length === 1 && flags[arg.key[0]!]) {\n key = [flags[arg.key[0]!]!];\n } else if (arg.type === 'named' && arg.key.length === 1 && aliases[arg.key[0]!]) {\n key = [aliases[arg.key[0]!]!];\n } else if (arg.type === 'named' && arg.key.length === 1 && negatives[arg.key[0]!]) {\n // Negative keyword: --remote sets local to false\n setNestedValue(rawArgs, [negatives[arg.key[0]!]!], false);\n continue;\n } else {\n key = arg.key;\n }\n\n const rootKey = key[0]!;\n\n if (arg.type === 'named' && arg.negated) {\n // Skip --no- prefix negation for args with custom negation\n if (customNegation.has(rootKey)) {\n // Treat as unknown: put it back as `no-<key>` so detectUnknownArgs catches it\n setNestedValue(rawArgs, [`no-${key.join('.')}`], false);\n continue;\n }\n setNestedValue(rawArgs, key, false);\n continue;\n }\n\n const value = arg.value ?? true;\n\n if (arrayArguments.has(rootKey)) {\n const existing = getNestedValue(rawArgs, key);\n if (existing !== undefined) {\n if (Array.isArray(existing)) {\n if (Array.isArray(value)) existing.push(...value);\n else existing.push(value);\n } else {\n if (Array.isArray(value)) setNestedValue(rawArgs, key, [existing, ...value]);\n else setNestedValue(rawArgs, key, [existing, value]);\n }\n } else {\n setNestedValue(rawArgs, key, Array.isArray(value) ? value : [value]);\n }\n } else {\n const existing = getNestedValue(rawArgs, key);\n if (existing !== undefined) {\n if (Array.isArray(existing)) {\n if (Array.isArray(value)) existing.push(...value);\n else existing.push(value);\n } else {\n if (Array.isArray(value)) setNestedValue(rawArgs, key, [existing, ...value]);\n else setNestedValue(rawArgs, key, [existing, value]);\n }\n } else {\n setNestedValue(rawArgs, key, value);\n }\n }\n }\n\n return { command: curCommand, rawArgs, args: argTokens, unmatchedTerms };\n}\n\ntype FindCommandFn = (name: string, commands?: AnyPadroneCommand[]) => AnyPadroneCommand | undefined;\n\n/**\n * Preprocesses raw arguments: maps positional arguments and performs auto-coercion.\n * External data sources (stdin, env, config) are handled by extensions before this runs.\n */\nexport function buildCommandArgs(\n command: AnyPadroneCommand,\n rawArgs: Record<string, unknown>,\n positionalArgs: string[],\n): { args: Record<string, unknown>; issues?: StandardSchemaV1.Issue[] } {\n let preprocessedArgs = preprocessArgs(rawArgs, { flags: {}, aliases: {} });\n let issues: StandardSchemaV1.Issue[] | undefined;\n\n const positionalConfig = command.meta?.positional ? parsePositionalConfig(command.meta.positional) : [];\n\n if (positionalConfig.length > 0) {\n let argIndex = 0;\n for (let i = 0; i < positionalConfig.length; i++) {\n const { name, variadic } = positionalConfig[i]!;\n if (argIndex >= positionalArgs.length) break;\n\n // Detect ambiguity: same arg provided both positionally and as a named option\n if (name in preprocessedArgs) {\n issues ??= [];\n issues.push({ path: [name], message: `Ambiguous argument \"${name}\": provided both positionally and as a named option` });\n continue;\n }\n\n if (variadic) {\n const remainingPositionals = positionalConfig.slice(i + 1);\n const nonVariadicAfter = remainingPositionals.filter((p) => !p.variadic).length;\n const variadicEnd = positionalArgs.length - nonVariadicAfter;\n preprocessedArgs[name] = positionalArgs.slice(argIndex, variadicEnd);\n argIndex = variadicEnd;\n } else if (i === positionalConfig.length - 1 && positionalArgs.length > argIndex + 1) {\n preprocessedArgs[name] = positionalArgs.slice(argIndex).join(' ');\n argIndex = positionalArgs.length;\n } else {\n preprocessedArgs[name] = positionalArgs[argIndex];\n argIndex++;\n }\n }\n }\n\n if (command.argsSchema) {\n preprocessedArgs = coerceArgs(preprocessedArgs, command.argsSchema);\n }\n\n return { args: preprocessedArgs, issues };\n}\n\n/**\n * Detects unknown options in args that aren't defined in the schema.\n * Returns unknown key info with suggestions, or empty array if schema is loose.\n */\nexport function checkUnknownArgs(command: AnyPadroneCommand, preprocessedArgs: Record<string, unknown>): { key: string }[] {\n if (!command.argsSchema) {\n const unknowns: { key: string }[] = [];\n for (const key of Object.keys(preprocessedArgs)) {\n unknowns.push({ key });\n }\n return unknowns;\n }\n\n const argsMeta = command.meta?.fields;\n const { flags, aliases, negatives } = extractSchemaMetadata(command.argsSchema, argsMeta, command.meta?.autoAlias);\n\n return detectUnknownArgs(preprocessedArgs, command.argsSchema, flags, aliases, negatives);\n}\n\n/**\n * Validates preprocessed arguments against the command's schema.\n * First checks for unknown args (strict by default), then runs schema validation.\n * Returns sync or async result depending on the schema's validate method.\n */\nexport function validateCommandArgs(command: AnyPadroneCommand, preprocessedArgs: Record<string, unknown>) {\n const unknownArgs = checkUnknownArgs(command, preprocessedArgs);\n if (unknownArgs.length > 0) {\n const issues: StandardSchemaV1.Issue[] = unknownArgs.map(({ key }) => ({\n path: [key],\n message: `Unknown option: \"${key}\"`,\n }));\n return { args: undefined, argsResult: { issues } as any };\n }\n\n const argsParsed = command.argsSchema ? command.argsSchema['~standard'].validate(preprocessedArgs) : { value: {} };\n\n const buildResult = (parsed: StandardSchemaV1.Result<unknown>) => ({\n args: parsed.issues ? undefined : (parsed.value as any),\n argsResult: parsed as any,\n });\n\n return thenMaybe(argsParsed, buildResult);\n}\n\n/**\n * Returns the list of known option names from a command's schema (for fuzzy suggestion).\n */\nexport function getKnownOptionNames(command: AnyPadroneCommand): string[] {\n if (!command.argsSchema) return [];\n try {\n const js = getJsonSchema(command.argsSchema) as Record<string, any>;\n if (js.type === 'object' && js.properties) return Object.keys(js.properties);\n } catch {\n /* ignore */\n }\n return [];\n}\n\n/**\n * Formats validation issue messages for display.\n */\nexport function formatIssueMessages(issues: readonly StandardSchemaV1.Issue[]): string {\n return issues.map((i) => ` - ${i.path?.join('.') || 'root'}: ${i.message}`).join('\\n');\n}\n\n/**\n * Core validate function for parse() — preprocesses and validates CLI args.\n * Used by the parse program method (lighter weight than the full exec pipeline).\n * External data sources (stdin, env, config) are not resolved here — use eval() for that.\n */\nexport function coreValidateForParse(\n command: AnyPadroneCommand,\n rawArgs: Record<string, unknown>,\n positionalArgs: string[],\n): InterceptorValidateResult | Promise<InterceptorValidateResult> {\n const { args: preprocessedArgs, issues } = buildCommandArgs(command, rawArgs, positionalArgs);\n if (issues) return { args: undefined, argsResult: { issues } as any };\n const validated = validateCommandArgs(command, preprocessedArgs);\n return thenMaybe(validated, (v) => v as InterceptorValidateResult);\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { r as HelpInfo } from "../formatter-CY3KrOEd.mjs";
1
+ import { HelpInfo } from "../output/formatter.mjs";
2
2
 
3
3
  //#region src/docs/index.d.ts
4
4
  type DocsFormat = 'markdown' | 'html' | 'man' | 'json';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/docs/index.ts"],"mappings":";;;KAWY,UAAA;AAAA,KAEA,WAAA;EAFA,6CAIV,MAAA,GAAS,UAAA;EAET,MAAA,WANoB;EAQpB,aAAA,YANqB;EAQrB,WAAA,IAAe,IAAA,EAAM,QAAA,EAAU,KAAA,aAAkB,MAAA,mBANxC;EAQT,SAAA,YAFiD;EAIjD,MAAA;AAAA;AAAA,KAGU,QAAA;EAbD,8EAeT,IAAA,UAXA;EAaA,OAAA,UAXqB;EAarB,OAAA;AAAA;AAAA,KAGU,UAAA;EAdV,2BAgBA,KAAA,EAAO,QAAA,IAdD;EAgBN,OAAA,YAbU;EAeV,OAAA;EAEA,MAAA;IAAU,IAAA;IAAc,KAAA,EAAO,KAAA;EAAA;AAAA;;AARjC;;;iBAigBgB,YAAA,CAAa,OAAA,UAAiB,OAAA,GAAS,WAAA,GAAmB,UAAA;AAAA,KAoF9D,mBAAA;EAnlBH,8CAqlBP,GAAA,UAjlBA;EAmlBA,OAAA,YAjlBU;EAmlBV,OAAA;AAAA;;;AA1FF;;;;;iBAqHsB,aAAA,CAAc,OAAA,WAAkB,OAAA,CAAQ,mBAAA;;;;iBA+BxC,cAAA,CAAe,OAAA,WAAkB,OAAA;EAAU,GAAA;EAAa,OAAA;AAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/docs/index.ts"],"mappings":";;;KAWY,UAAA;AAAA,KAEA,WAAA;EAFA,6CAIV,MAAA,GAAS,UAAA;EAET,MAAA,WANoB;EAQpB,aAAA,YANqB;EAQrB,WAAA,IAAe,IAAA,EAAM,QAAA,EAAU,KAAA,aAAkB,MAAA,mBANxC;EAQT,SAAA,YAFiD;EAIjD,MAAA;AAAA;AAAA,KAGU,QAAA;EAbD,8EAeT,IAAA,UAXA;EAaA,OAAA,UAXqB;EAarB,OAAA;AAAA;AAAA,KAGU,UAAA;EAdV,2BAgBA,KAAA,EAAO,QAAA,IAdD;EAgBN,OAAA,YAbU;EAeV,OAAA;EAEA,MAAA;IAAU,IAAA;IAAc,KAAA,EAAO,KAAK;EAAA;AAAA;AAX7B;AAGT;;;AAHS,iBAogBO,YAAA,CAAa,OAAA,UAAiB,OAAA,GAAS,WAAA,GAAmB,UAAU;AAAA,KAoFxE,mBAAA;EAnlBH,8CAqlBP,GAAA,UAjlBA;EAmlBA,OAAA,YAjlBU;EAmlBV,OAAA;AAAA;;AAnlBoC;AAyftC;;;;;iBAqHsB,aAAA,CAAc,OAAA,WAAkB,OAAO,CAAC,mBAAA;;;;iBA+BxC,cAAA,CAAe,OAAA,WAAkB,OAAO;EAAG,GAAA;EAAa,OAAA;AAAA"}
@@ -1,5 +1,5 @@
1
- import { s as getCommand } from "../commands-DLR0rFgq.mjs";
2
- import { n as getHelpInfo } from "../help-B-ZMYyn-.mjs";
1
+ import { getCommand } from "../core/commands.mjs";
2
+ import { getHelpInfo } from "../output/help.mjs";
3
3
  import { existsSync, mkdirSync, writeFileSync } from "node:fs";
4
4
  import { dirname, join, resolve } from "node:path";
5
5
  //#region src/docs/index.ts
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../src/docs/index.ts"],"sourcesContent":["import { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { dirname, join, resolve } from 'node:path';\nimport { getCommand } from '../core/commands.ts';\nimport type { HelpArgumentInfo, HelpInfo, HelpPositionalInfo, HelpSubcommandInfo } from '../output/formatter.ts';\nimport { getHelpInfo } from '../output/help.ts';\nimport type { AnyPadroneCommand } from '../types/index.ts';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type DocsFormat = 'markdown' | 'html' | 'man' | 'json';\n\nexport type DocsOptions = {\n /** Output format. Defaults to 'markdown'. */\n format?: DocsFormat;\n /** Output directory. If not set, docs are returned but not written. */\n output?: string;\n /** Include hidden commands and options. Defaults to false. */\n includeHidden?: boolean;\n /** Frontmatter generator for markdown files (VitePress, Starlight, etc.). */\n frontmatter?: (info: HelpInfo, depth: number) => Record<string, unknown>;\n /** Whether to overwrite existing files. Defaults to true. */\n overwrite?: boolean;\n /** Print what would be written without writing. */\n dryRun?: boolean;\n};\n\nexport type DocsPage = {\n /** File path relative to output directory (e.g., \"deploy.md\", \"index.md\"). */\n path: string;\n /** Generated content for this page. */\n content: string;\n /** The command name this page documents. */\n command: string;\n};\n\nexport type DocsResult = {\n /** All generated pages. */\n pages: DocsPage[];\n /** Files that were written (empty if no output dir). */\n written: string[];\n /** Files that were skipped (already exist, no overwrite). */\n skipped: string[];\n /** Files that failed to write. */\n errors: { file: string; error: Error }[];\n};\n\n// ============================================================================\n// Help Info Collection\n// ============================================================================\n\nfunction collectAllHelpInfo(cmd: AnyPadroneCommand, includeHidden: boolean): HelpInfo[] {\n const info = getHelpInfo(cmd, 'standard');\n const result: HelpInfo[] = [info];\n\n if (cmd.commands) {\n for (const sub of cmd.commands) {\n if (!includeHidden && sub.hidden) continue;\n result.push(...collectAllHelpInfo(sub, includeHidden));\n }\n }\n\n return result;\n}\n\n// ============================================================================\n// Markdown Generator\n// ============================================================================\n\nfunction generateFrontmatter(data: Record<string, unknown>): string {\n const lines: string[] = ['---'];\n for (const [key, value] of Object.entries(data)) {\n if (typeof value === 'string') {\n lines.push(`${key}: \"${value.replace(/\"/g, '\\\\\"')}\"`);\n } else if (typeof value === 'number' || typeof value === 'boolean') {\n lines.push(`${key}: ${value}`);\n } else if (Array.isArray(value)) {\n lines.push(`${key}:`);\n for (const item of value) {\n lines.push(` - \"${String(item).replace(/\"/g, '\\\\\"')}\"`);\n }\n }\n }\n lines.push('---');\n return lines.join('\\n');\n}\n\nfunction formatMarkdownPositional(arg: HelpPositionalInfo): string {\n const parts: string[] = [];\n parts.push(`- \\`${arg.name}\\``);\n if (arg.type) parts.push(`*(${arg.type})*`);\n if (arg.optional) parts.push('*(optional)*');\n if (arg.default !== undefined) parts.push(`— default: \\`${String(arg.default)}\\``);\n if (arg.description) parts.push(`— ${arg.description}`);\n return parts.join(' ');\n}\n\nfunction formatMarkdownArgument(arg: HelpArgumentInfo): string[] {\n const lines: string[] = [];\n\n const flagName = `--${arg.name}`;\n const flagStr = arg.flags?.length ? `${arg.flags.map((f) => `-${f}`).join(', ')}, ` : '';\n const aliasStr = arg.aliases?.length ? `${arg.aliases.map((a) => `--${a}`).join(', ')}, ` : '';\n const header = `#### \\`${flagStr}${aliasStr}${flagName}\\``;\n lines.push(header);\n lines.push('');\n\n if (arg.description) {\n lines.push(arg.description);\n lines.push('');\n }\n\n const meta: string[] = [];\n if (arg.type && arg.type !== 'boolean') meta.push(`**Type:** \\`${arg.type}\\``);\n if (!arg.optional) meta.push('**Required**');\n if (arg.default !== undefined) meta.push(`**Default:** \\`${String(arg.default)}\\``);\n if (arg.enum) meta.push(`**Choices:** ${arg.enum.map((v) => `\\`${v}\\``).join(', ')}`);\n if (arg.variadic) meta.push('**Repeatable**');\n if (arg.deprecated) {\n const msg = typeof arg.deprecated === 'string' ? arg.deprecated : '';\n meta.push(`**Deprecated**${msg ? `: ${msg}` : ''}`);\n }\n\n if (meta.length > 0) {\n lines.push(meta.join(' | '));\n lines.push('');\n }\n\n if (arg.env) {\n const envVars = typeof arg.env === 'string' ? [arg.env] : arg.env;\n lines.push(`**Environment:** ${envVars.map((v) => `\\`${v}\\``).join(', ')}`);\n lines.push('');\n }\n\n if (arg.configKey) {\n lines.push(`**Config key:** \\`${arg.configKey}\\``);\n lines.push('');\n }\n\n if (arg.examples?.length) {\n lines.push(`**Examples:** ${arg.examples.map((e) => `\\`${typeof e === 'string' ? e : JSON.stringify(e)}\\``).join(', ')}`);\n lines.push('');\n }\n\n return lines;\n}\n\nfunction formatMarkdownSubcommand(sub: HelpSubcommandInfo): string {\n const parts: string[] = [];\n const suffix = sub.hasSubcommands ? ' ...' : '';\n parts.push(`| \\`${sub.name}${suffix}\\``);\n\n const aliases = sub.aliases?.filter((a) => a !== '[default]');\n parts.push(`| ${aliases?.length ? aliases.map((a) => `\\`${a}\\``).join(', ') : ''}`);\n\n const desc = sub.title ?? sub.description ?? '';\n parts.push(`| ${desc}`);\n parts.push('|');\n\n return parts.join(' ');\n}\n\nfunction generateMarkdownPage(info: HelpInfo, depth: number, frontmatterFn?: DocsOptions['frontmatter']): string {\n const lines: string[] = [];\n\n if (frontmatterFn) {\n const fm = frontmatterFn(info, depth);\n if (Object.keys(fm).length > 0) {\n lines.push(generateFrontmatter(fm));\n lines.push('');\n }\n }\n\n // Title\n const displayName = info.name === '<root>' || !info.name ? 'CLI Reference' : info.name;\n lines.push(`# ${displayName}`);\n lines.push('');\n\n // Deprecation warning\n if (info.deprecated) {\n const msg = typeof info.deprecated === 'string' ? info.deprecated : 'This command is deprecated.';\n lines.push(`> **Deprecated:** ${msg}`);\n lines.push('');\n }\n\n // Description\n if (info.title) {\n lines.push(`> ${info.title}`);\n lines.push('');\n }\n if (info.description) {\n lines.push(info.description);\n lines.push('');\n }\n\n // Aliases\n if (info.aliases?.length) {\n const realAliases = info.aliases.filter((a) => a !== '[default]');\n if (realAliases.length > 0) {\n lines.push(`**Aliases:** ${realAliases.map((a) => `\\`${a}\\``).join(', ')}`);\n lines.push('');\n }\n }\n\n // Usage\n const usageParts: string[] = [info.usage.command];\n if (info.usage.hasSubcommands) usageParts.push('[command]');\n if (info.positionals?.length) {\n for (const arg of info.positionals) {\n usageParts.push(arg.optional ? `[${arg.name}]` : `<${arg.name}>`);\n }\n }\n if (info.usage.hasArguments) usageParts.push('[options]');\n\n lines.push('## Usage');\n lines.push('');\n lines.push('```');\n lines.push(usageParts.join(' '));\n lines.push('```');\n lines.push('');\n\n // Examples\n if (info.examples?.length) {\n lines.push('## Examples');\n lines.push('');\n lines.push('```');\n for (const ex of info.examples) {\n lines.push(`$ ${ex}`);\n }\n lines.push('```');\n lines.push('');\n }\n\n // Subcommands\n if (info.subcommands?.length) {\n const visibleSubs = info.subcommands.filter((s) => !s.hidden);\n if (visibleSubs.length > 0) {\n lines.push('## Commands');\n lines.push('');\n lines.push('| Command | Aliases | Description |');\n lines.push('| --- | --- | --- |');\n for (const sub of visibleSubs) {\n lines.push(formatMarkdownSubcommand(sub));\n }\n lines.push('');\n }\n }\n\n // Positional arguments\n if (info.positionals?.length) {\n lines.push('## Arguments');\n lines.push('');\n for (const arg of info.positionals) {\n lines.push(formatMarkdownPositional(arg));\n }\n lines.push('');\n }\n\n // Options\n if (info.arguments?.length) {\n lines.push('## Options');\n lines.push('');\n for (const arg of info.arguments) {\n lines.push(...formatMarkdownArgument(arg));\n }\n }\n\n return `${lines.join('\\n').trimEnd()}\\n`;\n}\n\n// ============================================================================\n// HTML Generator\n// ============================================================================\n\nfunction escapeHtml(text: string): string {\n return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n}\n\nfunction generateHtmlPage(info: HelpInfo, depth: number): string {\n const displayName = info.name === '<root>' || !info.name ? 'CLI Reference' : escapeHtml(info.name);\n\n const sections: string[] = [];\n\n // Header\n sections.push(`<article class=\"padrone-docs-page\" data-command=\"${escapeHtml(info.name)}\" data-depth=\"${depth}\">`);\n sections.push(` <h1>${displayName}</h1>`);\n\n if (info.deprecated) {\n const msg = typeof info.deprecated === 'string' ? escapeHtml(info.deprecated) : 'This command is deprecated.';\n sections.push(` <div class=\"deprecated-warning\"><strong>Deprecated:</strong> ${msg}</div>`);\n }\n\n if (info.title) {\n sections.push(` <p class=\"command-title\">${escapeHtml(info.title)}</p>`);\n }\n if (info.description) {\n sections.push(` <p class=\"command-description\">${escapeHtml(info.description)}</p>`);\n }\n\n // Aliases\n if (info.aliases?.length) {\n const realAliases = info.aliases.filter((a) => a !== '[default]');\n if (realAliases.length > 0) {\n sections.push(` <p><strong>Aliases:</strong> ${realAliases.map((a) => `<code>${escapeHtml(a)}</code>`).join(', ')}</p>`);\n }\n }\n\n // Usage\n const usageParts: string[] = [info.usage.command];\n if (info.usage.hasSubcommands) usageParts.push('[command]');\n if (info.positionals?.length) {\n for (const arg of info.positionals) {\n usageParts.push(arg.optional ? `[${arg.name}]` : `<${arg.name}>`);\n }\n }\n if (info.usage.hasArguments) usageParts.push('[options]');\n\n sections.push(' <h2>Usage</h2>');\n sections.push(` <pre><code>${escapeHtml(usageParts.join(' '))}</code></pre>`);\n\n // Examples\n if (info.examples?.length) {\n sections.push(' <h2>Examples</h2>');\n sections.push(` <pre><code>${info.examples.map((ex) => `$ ${escapeHtml(ex)}`).join('\\n')}</code></pre>`);\n }\n\n // Subcommands\n if (info.subcommands?.length) {\n const visibleSubs = info.subcommands.filter((s) => !s.hidden);\n if (visibleSubs.length > 0) {\n sections.push(' <h2>Commands</h2>');\n sections.push(' <table>');\n sections.push(' <thead><tr><th>Command</th><th>Aliases</th><th>Description</th></tr></thead>');\n sections.push(' <tbody>');\n for (const sub of visibleSubs) {\n const aliases = sub.aliases?.filter((a) => a !== '[default]');\n const desc = sub.title ?? sub.description ?? '';\n const suffix = sub.hasSubcommands ? ' ...' : '';\n sections.push(\n ` <tr><td><code>${escapeHtml(sub.name + suffix)}</code></td><td>${aliases?.length ? aliases.map((a) => `<code>${escapeHtml(a)}</code>`).join(', ') : ''}</td><td>${escapeHtml(desc)}</td></tr>`,\n );\n }\n sections.push(' </tbody>');\n sections.push(' </table>');\n }\n }\n\n // Positional arguments\n if (info.positionals?.length) {\n sections.push(' <h2>Arguments</h2>');\n sections.push(' <dl>');\n for (const arg of info.positionals) {\n sections.push(\n ` <dt><code>${escapeHtml(arg.name)}</code>${arg.type ? ` <span class=\"type\">${escapeHtml(arg.type)}</span>` : ''}${arg.optional ? ' <em>(optional)</em>' : ''}</dt>`,\n );\n if (arg.description) sections.push(` <dd>${escapeHtml(arg.description)}</dd>`);\n if (arg.default !== undefined) sections.push(` <dd>Default: <code>${escapeHtml(String(arg.default))}</code></dd>`);\n }\n sections.push(' </dl>');\n }\n\n // Options\n if (info.arguments?.length) {\n sections.push(' <h2>Options</h2>');\n sections.push(' <dl>');\n for (const arg of info.arguments) {\n const flagName = `--${arg.name}`;\n const flagStr = arg.flags?.length ? `${arg.flags.map((f) => `-${f}`).join(', ')}, ` : '';\n const aliasStr = arg.aliases?.length ? `${arg.aliases.map((a) => `--${a}`).join(', ')}, ` : '';\n const typeSpan = arg.type && arg.type !== 'boolean' ? ` <span class=\"type\">${escapeHtml(arg.type)}</span>` : '';\n sections.push(` <dt><code>${escapeHtml(flagStr + aliasStr + flagName)}</code>${typeSpan}</dt>`);\n if (arg.description) sections.push(` <dd>${escapeHtml(arg.description)}</dd>`);\n\n const meta: string[] = [];\n if (!arg.optional) meta.push('Required');\n if (arg.default !== undefined) meta.push(`Default: <code>${escapeHtml(String(arg.default))}</code>`);\n if (arg.enum) meta.push(`Choices: ${arg.enum.map((v) => `<code>${escapeHtml(v)}</code>`).join(', ')}`);\n if (arg.variadic) meta.push('Repeatable');\n if (arg.deprecated) {\n const msg = typeof arg.deprecated === 'string' ? escapeHtml(arg.deprecated) : '';\n meta.push(`Deprecated${msg ? `: ${msg}` : ''}`);\n }\n if (meta.length > 0) sections.push(` <dd class=\"meta\">${meta.join(' · ')}</dd>`);\n\n if (arg.env) {\n const envVars = typeof arg.env === 'string' ? [arg.env] : arg.env;\n sections.push(` <dd>Environment: ${envVars.map((v) => `<code>${escapeHtml(v)}</code>`).join(', ')}</dd>`);\n }\n if (arg.configKey) {\n sections.push(` <dd>Config key: <code>${escapeHtml(arg.configKey)}</code></dd>`);\n }\n }\n sections.push(' </dl>');\n }\n\n sections.push('</article>');\n return `${sections.join('\\n')}\\n`;\n}\n\n// ============================================================================\n// Man Page Generator (experimental)\n// ============================================================================\n\nfunction escapeMan(text: string): string {\n return text.replace(/\\\\/g, '\\\\\\\\').replace(/-/g, '\\\\-').replace(/'/g, '\\\\(aq');\n}\n\nfunction generateManPage(info: HelpInfo, _depth: number, programName: string): string {\n const commandName = info.name === '<root>' || !info.name ? programName : info.name;\n const manName = commandName.replace(/\\s+/g, '-');\n const lines: string[] = [];\n\n lines.push(`.TH \"${escapeMan(manName.toUpperCase())}\" \"1\" \"\" \"\" \"\"`);\n\n // NAME\n lines.push('.SH NAME');\n const desc = info.title ?? info.description ?? '';\n lines.push(`${escapeMan(manName)}${desc ? ` \\\\- ${escapeMan(desc)}` : ''}`);\n\n // SYNOPSIS\n lines.push('.SH SYNOPSIS');\n const usageParts: string[] = [`\\\\fB${escapeMan(commandName)}\\\\fR`];\n if (info.usage.hasSubcommands) usageParts.push('[\\\\fIcommand\\\\fR]');\n if (info.positionals?.length) {\n for (const arg of info.positionals) {\n usageParts.push(arg.optional ? `[\\\\fI${escapeMan(arg.name)}\\\\fR]` : `\\\\fI${escapeMan(arg.name)}\\\\fR`);\n }\n }\n if (info.usage.hasArguments) usageParts.push('[\\\\fIoptions\\\\fR]');\n lines.push(usageParts.join(' '));\n\n // DESCRIPTION\n if (info.description) {\n lines.push('.SH DESCRIPTION');\n lines.push(escapeMan(info.description));\n }\n\n // EXAMPLES\n if (info.examples?.length) {\n lines.push('.SH EXAMPLES');\n for (const ex of info.examples) {\n lines.push('.PP');\n lines.push(`.nf\\n$ ${escapeMan(ex)}\\n.fi`);\n }\n }\n\n // COMMANDS\n if (info.subcommands?.length) {\n const visibleSubs = info.subcommands.filter((s) => !s.hidden);\n if (visibleSubs.length > 0) {\n lines.push('.SH COMMANDS');\n for (const sub of visibleSubs) {\n const suffix = sub.hasSubcommands ? ' ...' : '';\n lines.push(`.TP`);\n lines.push(`\\\\fB${escapeMan(sub.name + suffix)}\\\\fR`);\n const subDesc = sub.title ?? sub.description;\n if (subDesc) lines.push(escapeMan(subDesc));\n }\n }\n }\n\n // ARGUMENTS\n if (info.positionals?.length) {\n lines.push('.SH ARGUMENTS');\n for (const arg of info.positionals) {\n lines.push('.TP');\n lines.push(`\\\\fI${escapeMan(arg.name)}\\\\fR`);\n const parts: string[] = [];\n if (arg.description) parts.push(escapeMan(arg.description));\n if (arg.optional) parts.push('(optional)');\n if (arg.default !== undefined) parts.push(`Default: ${escapeMan(String(arg.default))}`);\n if (parts.length > 0) lines.push(parts.join('. '));\n }\n }\n\n // OPTIONS\n if (info.arguments?.length) {\n lines.push('.SH OPTIONS');\n for (const arg of info.arguments) {\n const flagName = `\\\\-\\\\-${escapeMan(arg.name)}`;\n const flagStr = arg.flags?.length ? `${arg.flags.map((f) => `\\\\-${escapeMan(f)}`).join(', ')}, ` : '';\n const aliasStr = arg.aliases?.length ? `${arg.aliases.map((a) => `\\\\-\\\\-${escapeMan(a)}`).join(', ')}, ` : '';\n lines.push('.TP');\n lines.push(`\\\\fB${flagStr}${aliasStr}${flagName}\\\\fR${arg.type ? ` \\\\fI${escapeMan(arg.type)}\\\\fR` : ''}`);\n const parts: string[] = [];\n if (arg.description) parts.push(escapeMan(arg.description));\n if (arg.default !== undefined) parts.push(`Default: ${escapeMan(String(arg.default))}`);\n if (arg.enum) parts.push(`Choices: ${arg.enum.map((v) => escapeMan(v)).join(', ')}`);\n if (parts.length > 0) lines.push(parts.join('. '));\n\n if (arg.env) {\n const envVars = typeof arg.env === 'string' ? [arg.env] : arg.env;\n lines.push(`.br`);\n lines.push(`Environment: ${envVars.map((v) => escapeMan(v)).join(', ')}`);\n }\n }\n }\n\n return `${lines.join('\\n')}\\n`;\n}\n\n// ============================================================================\n// Page Path Helpers\n// ============================================================================\n\nfunction commandToPath(info: HelpInfo, ext: string, isRoot: boolean): string {\n if (isRoot) return `index${ext}`;\n // Split on whitespace and replace empty segments (from empty-name default commands) with \"_default\"\n const segments = info.name.split(/\\s+/).map((s) => s || '_default');\n return segments.join('/') + ext;\n}\n\n// ============================================================================\n// Index Page Generators\n// ============================================================================\n\nfunction generateMarkdownIndex(rootInfo: HelpInfo, allInfos: HelpInfo[]): string {\n const lines: string[] = [];\n lines.push(`# ${rootInfo.title ?? rootInfo.name ?? 'CLI'} Reference`);\n lines.push('');\n\n if (rootInfo.description) {\n lines.push(rootInfo.description);\n lines.push('');\n }\n\n if (allInfos.length > 1) {\n lines.push('## Commands');\n lines.push('');\n for (const info of allInfos) {\n const path = commandToPath(info, '.md', info === rootInfo);\n const name = info === rootInfo ? info.name || 'root' : info.name;\n const desc = info.title ?? info.description ?? '';\n lines.push(`- [${name}](${path})${desc ? ` — ${desc}` : ''}`);\n }\n lines.push('');\n }\n\n return `${lines.join('\\n').trimEnd()}\\n`;\n}\n\n// ============================================================================\n// Main Entry Point\n// ============================================================================\n\n/**\n * Generate documentation for a Padrone CLI program or command tree.\n * Accepts either a PadroneProgram (from createPadrone()) or a raw AnyPadroneCommand.\n */\nexport function generateDocs(program: object, options: DocsOptions = {}): DocsResult {\n const { format = 'markdown', output, includeHidden = false, frontmatter, overwrite = true, dryRun = false } = options;\n\n const cmd = getCommand(program);\n const allInfos = collectAllHelpInfo(cmd, includeHidden);\n const rootInfo = allInfos[0]!;\n const programName = cmd.name || 'program';\n\n const pages: DocsPage[] = [];\n\n const ext = format === 'markdown' ? '.md' : format === 'html' ? '.html' : format === 'man' ? '.1' : '.json';\n\n for (let i = 0; i < allInfos.length; i++) {\n const info = allInfos[i]!;\n const isRoot = i === 0;\n const depth = isRoot ? 0 : info.name.split(/\\s+/).length;\n const path = commandToPath(info, ext, isRoot);\n\n let content: string;\n switch (format) {\n case 'markdown':\n content = generateMarkdownPage(info, depth, frontmatter);\n break;\n case 'html':\n content = generateHtmlPage(info, depth);\n break;\n case 'man':\n content = generateManPage(info, depth, programName);\n break;\n case 'json':\n content = `${JSON.stringify(info, null, 2)}\\n`;\n break;\n }\n\n pages.push({ path, content, command: info.name });\n }\n\n // Generate index page for markdown (when there are subcommands)\n if (format === 'markdown' && allInfos.length > 1) {\n // Replace the root page with a combined index\n const rootPage = pages[0]!;\n rootPage.content = generateMarkdownIndex(rootInfo, allInfos);\n }\n\n const result: DocsResult = { pages, written: [], skipped: [], errors: [] };\n\n // Write to disk if output dir specified\n if (output) {\n const outDir = resolve(output);\n\n for (const page of pages) {\n const fullPath = join(outDir, page.path);\n\n try {\n if (existsSync(fullPath) && !overwrite) {\n result.skipped.push(page.path);\n continue;\n }\n\n if (dryRun) {\n result.written.push(page.path);\n continue;\n }\n\n const dir = dirname(fullPath);\n mkdirSync(dir, { recursive: true });\n writeFileSync(fullPath, page.content, 'utf-8');\n result.written.push(page.path);\n } catch (err) {\n result.errors.push({\n file: page.path,\n error: err instanceof Error ? err : new Error(String(err)),\n });\n }\n }\n }\n\n return result;\n}\n\n// ============================================================================\n// Man Page Installation\n// ============================================================================\n\nexport type SetupManPagesResult = {\n /** Directory where man pages were written. */\n dir: string;\n /** Man page files that were written. */\n written: string[];\n /** Whether existing pages were overwritten (true) or newly created (false). */\n updated: boolean;\n};\n\n/**\n * Returns the local man page directory for the given section.\n * Uses `~/.local/share/man/man<section>` (XDG convention).\n */\nasync function getManPageDir(section = 1): Promise<string> {\n const { homedir } = await import('node:os');\n return join(process.env.XDG_DATA_HOME || join(homedir(), '.local', 'share'), 'man', `man${section}`);\n}\n\n/**\n * Converts a command name to a man page filename.\n * \"myapp\" → \"myapp.1\", \"myapp deploy\" → \"myapp-deploy.1\"\n */\nfunction manPageFilename(commandName: string, section = 1): string {\n return `${commandName.replace(/\\s+/g, '-')}.${section}`;\n}\n\n/**\n * Installs man pages for a Padrone CLI program into the local man directory.\n * Generates man pages for all commands and writes them to `~/.local/share/man/man1/`.\n *\n * After installation, `man <program>` and `man <program>-<subcommand>` should work\n * (assuming `~/.local/share/man` is in `MANPATH` or `manpath` picks it up).\n */\nexport async function setupManPages(program: object): Promise<SetupManPagesResult> {\n const cmd = getCommand(program);\n const allInfos = collectAllHelpInfo(cmd, false);\n const programName = cmd.name || 'program';\n const manDir = await getManPageDir(1);\n\n mkdirSync(manDir, { recursive: true });\n\n const written: string[] = [];\n let updated = false;\n\n for (let i = 0; i < allInfos.length; i++) {\n const info = allInfos[i]!;\n const depth = i === 0 ? 0 : info.name.split(/\\s+/).length;\n const commandName = info.name === '<root>' || !info.name ? programName : info.name;\n const filename = manPageFilename(commandName);\n const fullPath = join(manDir, filename);\n\n if (existsSync(fullPath)) updated = true;\n\n const content = generateManPage(info, depth, programName);\n writeFileSync(fullPath, content, 'utf-8');\n written.push(filename);\n }\n\n return { dir: manDir, written, updated };\n}\n\n/**\n * Removes installed man pages for a Padrone CLI program.\n */\nexport async function removeManPages(program: object): Promise<{ dir: string; removed: string[] }> {\n const { unlinkSync } = await import('node:fs');\n const cmd = getCommand(program);\n const allInfos = collectAllHelpInfo(cmd, false);\n const programName = cmd.name || 'program';\n const manDir = await getManPageDir(1);\n const removed: string[] = [];\n\n for (let i = 0; i < allInfos.length; i++) {\n const info = allInfos[i]!;\n const commandName = info.name === '<root>' || !info.name ? programName : info.name;\n const filename = manPageFilename(commandName);\n const fullPath = join(manDir, filename);\n\n if (existsSync(fullPath)) {\n unlinkSync(fullPath);\n removed.push(filename);\n }\n }\n\n return { dir: manDir, removed };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/docs/index.ts"],"sourcesContent":["import { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { dirname, join, resolve } from 'node:path';\nimport { getCommand } from '../core/commands.ts';\nimport type { HelpArgumentInfo, HelpInfo, HelpPositionalInfo, HelpSubcommandInfo } from '../output/formatter.ts';\nimport { getHelpInfo } from '../output/help.ts';\nimport type { AnyPadroneCommand } from '../types/index.ts';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type DocsFormat = 'markdown' | 'html' | 'man' | 'json';\n\nexport type DocsOptions = {\n /** Output format. Defaults to 'markdown'. */\n format?: DocsFormat;\n /** Output directory. If not set, docs are returned but not written. */\n output?: string;\n /** Include hidden commands and options. Defaults to false. */\n includeHidden?: boolean;\n /** Frontmatter generator for markdown files (VitePress, Starlight, etc.). */\n frontmatter?: (info: HelpInfo, depth: number) => Record<string, unknown>;\n /** Whether to overwrite existing files. Defaults to true. */\n overwrite?: boolean;\n /** Print what would be written without writing. */\n dryRun?: boolean;\n};\n\nexport type DocsPage = {\n /** File path relative to output directory (e.g., \"deploy.md\", \"index.md\"). */\n path: string;\n /** Generated content for this page. */\n content: string;\n /** The command name this page documents. */\n command: string;\n};\n\nexport type DocsResult = {\n /** All generated pages. */\n pages: DocsPage[];\n /** Files that were written (empty if no output dir). */\n written: string[];\n /** Files that were skipped (already exist, no overwrite). */\n skipped: string[];\n /** Files that failed to write. */\n errors: { file: string; error: Error }[];\n};\n\n// ============================================================================\n// Help Info Collection\n// ============================================================================\n\nfunction collectAllHelpInfo(cmd: AnyPadroneCommand, includeHidden: boolean): HelpInfo[] {\n const info = getHelpInfo(cmd, 'standard');\n const result: HelpInfo[] = [info];\n\n if (cmd.commands) {\n for (const sub of cmd.commands) {\n if (!includeHidden && sub.hidden) continue;\n result.push(...collectAllHelpInfo(sub, includeHidden));\n }\n }\n\n return result;\n}\n\n// ============================================================================\n// Markdown Generator\n// ============================================================================\n\nfunction generateFrontmatter(data: Record<string, unknown>): string {\n const lines: string[] = ['---'];\n for (const [key, value] of Object.entries(data)) {\n if (typeof value === 'string') {\n lines.push(`${key}: \"${value.replace(/\"/g, '\\\\\"')}\"`);\n } else if (typeof value === 'number' || typeof value === 'boolean') {\n lines.push(`${key}: ${value}`);\n } else if (Array.isArray(value)) {\n lines.push(`${key}:`);\n for (const item of value) {\n lines.push(` - \"${String(item).replace(/\"/g, '\\\\\"')}\"`);\n }\n }\n }\n lines.push('---');\n return lines.join('\\n');\n}\n\nfunction formatMarkdownPositional(arg: HelpPositionalInfo): string {\n const parts: string[] = [];\n parts.push(`- \\`${arg.name}\\``);\n if (arg.type) parts.push(`*(${arg.type})*`);\n if (arg.optional) parts.push('*(optional)*');\n if (arg.default !== undefined) parts.push(`— default: \\`${String(arg.default)}\\``);\n if (arg.description) parts.push(`— ${arg.description}`);\n return parts.join(' ');\n}\n\nfunction formatMarkdownArgument(arg: HelpArgumentInfo): string[] {\n const lines: string[] = [];\n\n const flagName = `--${arg.name}`;\n const flagStr = arg.flags?.length ? `${arg.flags.map((f) => `-${f}`).join(', ')}, ` : '';\n const aliasStr = arg.aliases?.length ? `${arg.aliases.map((a) => `--${a}`).join(', ')}, ` : '';\n const header = `#### \\`${flagStr}${aliasStr}${flagName}\\``;\n lines.push(header);\n lines.push('');\n\n if (arg.description) {\n lines.push(arg.description);\n lines.push('');\n }\n\n const meta: string[] = [];\n if (arg.type && arg.type !== 'boolean') meta.push(`**Type:** \\`${arg.type}\\``);\n if (!arg.optional) meta.push('**Required**');\n if (arg.default !== undefined) meta.push(`**Default:** \\`${String(arg.default)}\\``);\n if (arg.enum) meta.push(`**Choices:** ${arg.enum.map((v) => `\\`${v}\\``).join(', ')}`);\n if (arg.variadic) meta.push('**Repeatable**');\n if (arg.deprecated) {\n const msg = typeof arg.deprecated === 'string' ? arg.deprecated : '';\n meta.push(`**Deprecated**${msg ? `: ${msg}` : ''}`);\n }\n\n if (meta.length > 0) {\n lines.push(meta.join(' | '));\n lines.push('');\n }\n\n if (arg.env) {\n const envVars = typeof arg.env === 'string' ? [arg.env] : arg.env;\n lines.push(`**Environment:** ${envVars.map((v) => `\\`${v}\\``).join(', ')}`);\n lines.push('');\n }\n\n if (arg.configKey) {\n lines.push(`**Config key:** \\`${arg.configKey}\\``);\n lines.push('');\n }\n\n if (arg.examples?.length) {\n lines.push(`**Examples:** ${arg.examples.map((e) => `\\`${typeof e === 'string' ? e : JSON.stringify(e)}\\``).join(', ')}`);\n lines.push('');\n }\n\n return lines;\n}\n\nfunction formatMarkdownSubcommand(sub: HelpSubcommandInfo): string {\n const parts: string[] = [];\n const suffix = sub.hasSubcommands ? ' ...' : '';\n parts.push(`| \\`${sub.name}${suffix}\\``);\n\n const aliases = sub.aliases?.filter((a) => a !== '[default]');\n parts.push(`| ${aliases?.length ? aliases.map((a) => `\\`${a}\\``).join(', ') : ''}`);\n\n const desc = sub.title ?? sub.description ?? '';\n parts.push(`| ${desc}`);\n parts.push('|');\n\n return parts.join(' ');\n}\n\nfunction generateMarkdownPage(info: HelpInfo, depth: number, frontmatterFn?: DocsOptions['frontmatter']): string {\n const lines: string[] = [];\n\n if (frontmatterFn) {\n const fm = frontmatterFn(info, depth);\n if (Object.keys(fm).length > 0) {\n lines.push(generateFrontmatter(fm));\n lines.push('');\n }\n }\n\n // Title\n const displayName = info.name === '<root>' || !info.name ? 'CLI Reference' : info.name;\n lines.push(`# ${displayName}`);\n lines.push('');\n\n // Deprecation warning\n if (info.deprecated) {\n const msg = typeof info.deprecated === 'string' ? info.deprecated : 'This command is deprecated.';\n lines.push(`> **Deprecated:** ${msg}`);\n lines.push('');\n }\n\n // Description\n if (info.title) {\n lines.push(`> ${info.title}`);\n lines.push('');\n }\n if (info.description) {\n lines.push(info.description);\n lines.push('');\n }\n\n // Aliases\n if (info.aliases?.length) {\n const realAliases = info.aliases.filter((a) => a !== '[default]');\n if (realAliases.length > 0) {\n lines.push(`**Aliases:** ${realAliases.map((a) => `\\`${a}\\``).join(', ')}`);\n lines.push('');\n }\n }\n\n // Usage\n const usageParts: string[] = [info.usage.command];\n if (info.usage.hasSubcommands) usageParts.push('[command]');\n if (info.positionals?.length) {\n for (const arg of info.positionals) {\n usageParts.push(arg.optional ? `[${arg.name}]` : `<${arg.name}>`);\n }\n }\n if (info.usage.hasArguments) usageParts.push('[options]');\n\n lines.push('## Usage');\n lines.push('');\n lines.push('```');\n lines.push(usageParts.join(' '));\n lines.push('```');\n lines.push('');\n\n // Examples\n if (info.examples?.length) {\n lines.push('## Examples');\n lines.push('');\n lines.push('```');\n for (const ex of info.examples) {\n lines.push(`$ ${ex}`);\n }\n lines.push('```');\n lines.push('');\n }\n\n // Subcommands\n if (info.subcommands?.length) {\n const visibleSubs = info.subcommands.filter((s) => !s.hidden);\n if (visibleSubs.length > 0) {\n lines.push('## Commands');\n lines.push('');\n lines.push('| Command | Aliases | Description |');\n lines.push('| --- | --- | --- |');\n for (const sub of visibleSubs) {\n lines.push(formatMarkdownSubcommand(sub));\n }\n lines.push('');\n }\n }\n\n // Positional arguments\n if (info.positionals?.length) {\n lines.push('## Arguments');\n lines.push('');\n for (const arg of info.positionals) {\n lines.push(formatMarkdownPositional(arg));\n }\n lines.push('');\n }\n\n // Options\n if (info.arguments?.length) {\n lines.push('## Options');\n lines.push('');\n for (const arg of info.arguments) {\n lines.push(...formatMarkdownArgument(arg));\n }\n }\n\n return `${lines.join('\\n').trimEnd()}\\n`;\n}\n\n// ============================================================================\n// HTML Generator\n// ============================================================================\n\nfunction escapeHtml(text: string): string {\n return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n}\n\nfunction generateHtmlPage(info: HelpInfo, depth: number): string {\n const displayName = info.name === '<root>' || !info.name ? 'CLI Reference' : escapeHtml(info.name);\n\n const sections: string[] = [];\n\n // Header\n sections.push(`<article class=\"padrone-docs-page\" data-command=\"${escapeHtml(info.name)}\" data-depth=\"${depth}\">`);\n sections.push(` <h1>${displayName}</h1>`);\n\n if (info.deprecated) {\n const msg = typeof info.deprecated === 'string' ? escapeHtml(info.deprecated) : 'This command is deprecated.';\n sections.push(` <div class=\"deprecated-warning\"><strong>Deprecated:</strong> ${msg}</div>`);\n }\n\n if (info.title) {\n sections.push(` <p class=\"command-title\">${escapeHtml(info.title)}</p>`);\n }\n if (info.description) {\n sections.push(` <p class=\"command-description\">${escapeHtml(info.description)}</p>`);\n }\n\n // Aliases\n if (info.aliases?.length) {\n const realAliases = info.aliases.filter((a) => a !== '[default]');\n if (realAliases.length > 0) {\n sections.push(` <p><strong>Aliases:</strong> ${realAliases.map((a) => `<code>${escapeHtml(a)}</code>`).join(', ')}</p>`);\n }\n }\n\n // Usage\n const usageParts: string[] = [info.usage.command];\n if (info.usage.hasSubcommands) usageParts.push('[command]');\n if (info.positionals?.length) {\n for (const arg of info.positionals) {\n usageParts.push(arg.optional ? `[${arg.name}]` : `<${arg.name}>`);\n }\n }\n if (info.usage.hasArguments) usageParts.push('[options]');\n\n sections.push(' <h2>Usage</h2>');\n sections.push(` <pre><code>${escapeHtml(usageParts.join(' '))}</code></pre>`);\n\n // Examples\n if (info.examples?.length) {\n sections.push(' <h2>Examples</h2>');\n sections.push(` <pre><code>${info.examples.map((ex) => `$ ${escapeHtml(ex)}`).join('\\n')}</code></pre>`);\n }\n\n // Subcommands\n if (info.subcommands?.length) {\n const visibleSubs = info.subcommands.filter((s) => !s.hidden);\n if (visibleSubs.length > 0) {\n sections.push(' <h2>Commands</h2>');\n sections.push(' <table>');\n sections.push(' <thead><tr><th>Command</th><th>Aliases</th><th>Description</th></tr></thead>');\n sections.push(' <tbody>');\n for (const sub of visibleSubs) {\n const aliases = sub.aliases?.filter((a) => a !== '[default]');\n const desc = sub.title ?? sub.description ?? '';\n const suffix = sub.hasSubcommands ? ' ...' : '';\n sections.push(\n ` <tr><td><code>${escapeHtml(sub.name + suffix)}</code></td><td>${aliases?.length ? aliases.map((a) => `<code>${escapeHtml(a)}</code>`).join(', ') : ''}</td><td>${escapeHtml(desc)}</td></tr>`,\n );\n }\n sections.push(' </tbody>');\n sections.push(' </table>');\n }\n }\n\n // Positional arguments\n if (info.positionals?.length) {\n sections.push(' <h2>Arguments</h2>');\n sections.push(' <dl>');\n for (const arg of info.positionals) {\n sections.push(\n ` <dt><code>${escapeHtml(arg.name)}</code>${arg.type ? ` <span class=\"type\">${escapeHtml(arg.type)}</span>` : ''}${arg.optional ? ' <em>(optional)</em>' : ''}</dt>`,\n );\n if (arg.description) sections.push(` <dd>${escapeHtml(arg.description)}</dd>`);\n if (arg.default !== undefined) sections.push(` <dd>Default: <code>${escapeHtml(String(arg.default))}</code></dd>`);\n }\n sections.push(' </dl>');\n }\n\n // Options\n if (info.arguments?.length) {\n sections.push(' <h2>Options</h2>');\n sections.push(' <dl>');\n for (const arg of info.arguments) {\n const flagName = `--${arg.name}`;\n const flagStr = arg.flags?.length ? `${arg.flags.map((f) => `-${f}`).join(', ')}, ` : '';\n const aliasStr = arg.aliases?.length ? `${arg.aliases.map((a) => `--${a}`).join(', ')}, ` : '';\n const typeSpan = arg.type && arg.type !== 'boolean' ? ` <span class=\"type\">${escapeHtml(arg.type)}</span>` : '';\n sections.push(` <dt><code>${escapeHtml(flagStr + aliasStr + flagName)}</code>${typeSpan}</dt>`);\n if (arg.description) sections.push(` <dd>${escapeHtml(arg.description)}</dd>`);\n\n const meta: string[] = [];\n if (!arg.optional) meta.push('Required');\n if (arg.default !== undefined) meta.push(`Default: <code>${escapeHtml(String(arg.default))}</code>`);\n if (arg.enum) meta.push(`Choices: ${arg.enum.map((v) => `<code>${escapeHtml(v)}</code>`).join(', ')}`);\n if (arg.variadic) meta.push('Repeatable');\n if (arg.deprecated) {\n const msg = typeof arg.deprecated === 'string' ? escapeHtml(arg.deprecated) : '';\n meta.push(`Deprecated${msg ? `: ${msg}` : ''}`);\n }\n if (meta.length > 0) sections.push(` <dd class=\"meta\">${meta.join(' · ')}</dd>`);\n\n if (arg.env) {\n const envVars = typeof arg.env === 'string' ? [arg.env] : arg.env;\n sections.push(` <dd>Environment: ${envVars.map((v) => `<code>${escapeHtml(v)}</code>`).join(', ')}</dd>`);\n }\n if (arg.configKey) {\n sections.push(` <dd>Config key: <code>${escapeHtml(arg.configKey)}</code></dd>`);\n }\n }\n sections.push(' </dl>');\n }\n\n sections.push('</article>');\n return `${sections.join('\\n')}\\n`;\n}\n\n// ============================================================================\n// Man Page Generator (experimental)\n// ============================================================================\n\nfunction escapeMan(text: string): string {\n return text.replace(/\\\\/g, '\\\\\\\\').replace(/-/g, '\\\\-').replace(/'/g, '\\\\(aq');\n}\n\nfunction generateManPage(info: HelpInfo, _depth: number, programName: string): string {\n const commandName = info.name === '<root>' || !info.name ? programName : info.name;\n const manName = commandName.replace(/\\s+/g, '-');\n const lines: string[] = [];\n\n lines.push(`.TH \"${escapeMan(manName.toUpperCase())}\" \"1\" \"\" \"\" \"\"`);\n\n // NAME\n lines.push('.SH NAME');\n const desc = info.title ?? info.description ?? '';\n lines.push(`${escapeMan(manName)}${desc ? ` \\\\- ${escapeMan(desc)}` : ''}`);\n\n // SYNOPSIS\n lines.push('.SH SYNOPSIS');\n const usageParts: string[] = [`\\\\fB${escapeMan(commandName)}\\\\fR`];\n if (info.usage.hasSubcommands) usageParts.push('[\\\\fIcommand\\\\fR]');\n if (info.positionals?.length) {\n for (const arg of info.positionals) {\n usageParts.push(arg.optional ? `[\\\\fI${escapeMan(arg.name)}\\\\fR]` : `\\\\fI${escapeMan(arg.name)}\\\\fR`);\n }\n }\n if (info.usage.hasArguments) usageParts.push('[\\\\fIoptions\\\\fR]');\n lines.push(usageParts.join(' '));\n\n // DESCRIPTION\n if (info.description) {\n lines.push('.SH DESCRIPTION');\n lines.push(escapeMan(info.description));\n }\n\n // EXAMPLES\n if (info.examples?.length) {\n lines.push('.SH EXAMPLES');\n for (const ex of info.examples) {\n lines.push('.PP');\n lines.push(`.nf\\n$ ${escapeMan(ex)}\\n.fi`);\n }\n }\n\n // COMMANDS\n if (info.subcommands?.length) {\n const visibleSubs = info.subcommands.filter((s) => !s.hidden);\n if (visibleSubs.length > 0) {\n lines.push('.SH COMMANDS');\n for (const sub of visibleSubs) {\n const suffix = sub.hasSubcommands ? ' ...' : '';\n lines.push(`.TP`);\n lines.push(`\\\\fB${escapeMan(sub.name + suffix)}\\\\fR`);\n const subDesc = sub.title ?? sub.description;\n if (subDesc) lines.push(escapeMan(subDesc));\n }\n }\n }\n\n // ARGUMENTS\n if (info.positionals?.length) {\n lines.push('.SH ARGUMENTS');\n for (const arg of info.positionals) {\n lines.push('.TP');\n lines.push(`\\\\fI${escapeMan(arg.name)}\\\\fR`);\n const parts: string[] = [];\n if (arg.description) parts.push(escapeMan(arg.description));\n if (arg.optional) parts.push('(optional)');\n if (arg.default !== undefined) parts.push(`Default: ${escapeMan(String(arg.default))}`);\n if (parts.length > 0) lines.push(parts.join('. '));\n }\n }\n\n // OPTIONS\n if (info.arguments?.length) {\n lines.push('.SH OPTIONS');\n for (const arg of info.arguments) {\n const flagName = `\\\\-\\\\-${escapeMan(arg.name)}`;\n const flagStr = arg.flags?.length ? `${arg.flags.map((f) => `\\\\-${escapeMan(f)}`).join(', ')}, ` : '';\n const aliasStr = arg.aliases?.length ? `${arg.aliases.map((a) => `\\\\-\\\\-${escapeMan(a)}`).join(', ')}, ` : '';\n lines.push('.TP');\n lines.push(`\\\\fB${flagStr}${aliasStr}${flagName}\\\\fR${arg.type ? ` \\\\fI${escapeMan(arg.type)}\\\\fR` : ''}`);\n const parts: string[] = [];\n if (arg.description) parts.push(escapeMan(arg.description));\n if (arg.default !== undefined) parts.push(`Default: ${escapeMan(String(arg.default))}`);\n if (arg.enum) parts.push(`Choices: ${arg.enum.map((v) => escapeMan(v)).join(', ')}`);\n if (parts.length > 0) lines.push(parts.join('. '));\n\n if (arg.env) {\n const envVars = typeof arg.env === 'string' ? [arg.env] : arg.env;\n lines.push(`.br`);\n lines.push(`Environment: ${envVars.map((v) => escapeMan(v)).join(', ')}`);\n }\n }\n }\n\n return `${lines.join('\\n')}\\n`;\n}\n\n// ============================================================================\n// Page Path Helpers\n// ============================================================================\n\nfunction commandToPath(info: HelpInfo, ext: string, isRoot: boolean): string {\n if (isRoot) return `index${ext}`;\n // Split on whitespace and replace empty segments (from empty-name default commands) with \"_default\"\n const segments = info.name.split(/\\s+/).map((s) => s || '_default');\n return segments.join('/') + ext;\n}\n\n// ============================================================================\n// Index Page Generators\n// ============================================================================\n\nfunction generateMarkdownIndex(rootInfo: HelpInfo, allInfos: HelpInfo[]): string {\n const lines: string[] = [];\n lines.push(`# ${rootInfo.title ?? rootInfo.name ?? 'CLI'} Reference`);\n lines.push('');\n\n if (rootInfo.description) {\n lines.push(rootInfo.description);\n lines.push('');\n }\n\n if (allInfos.length > 1) {\n lines.push('## Commands');\n lines.push('');\n for (const info of allInfos) {\n const path = commandToPath(info, '.md', info === rootInfo);\n const name = info === rootInfo ? info.name || 'root' : info.name;\n const desc = info.title ?? info.description ?? '';\n lines.push(`- [${name}](${path})${desc ? ` — ${desc}` : ''}`);\n }\n lines.push('');\n }\n\n return `${lines.join('\\n').trimEnd()}\\n`;\n}\n\n// ============================================================================\n// Main Entry Point\n// ============================================================================\n\n/**\n * Generate documentation for a Padrone CLI program or command tree.\n * Accepts either a PadroneProgram (from createPadrone()) or a raw AnyPadroneCommand.\n */\nexport function generateDocs(program: object, options: DocsOptions = {}): DocsResult {\n const { format = 'markdown', output, includeHidden = false, frontmatter, overwrite = true, dryRun = false } = options;\n\n const cmd = getCommand(program);\n const allInfos = collectAllHelpInfo(cmd, includeHidden);\n const rootInfo = allInfos[0]!;\n const programName = cmd.name || 'program';\n\n const pages: DocsPage[] = [];\n\n const ext = format === 'markdown' ? '.md' : format === 'html' ? '.html' : format === 'man' ? '.1' : '.json';\n\n for (let i = 0; i < allInfos.length; i++) {\n const info = allInfos[i]!;\n const isRoot = i === 0;\n const depth = isRoot ? 0 : info.name.split(/\\s+/).length;\n const path = commandToPath(info, ext, isRoot);\n\n let content: string;\n switch (format) {\n case 'markdown':\n content = generateMarkdownPage(info, depth, frontmatter);\n break;\n case 'html':\n content = generateHtmlPage(info, depth);\n break;\n case 'man':\n content = generateManPage(info, depth, programName);\n break;\n case 'json':\n content = `${JSON.stringify(info, null, 2)}\\n`;\n break;\n }\n\n pages.push({ path, content, command: info.name });\n }\n\n // Generate index page for markdown (when there are subcommands)\n if (format === 'markdown' && allInfos.length > 1) {\n // Replace the root page with a combined index\n const rootPage = pages[0]!;\n rootPage.content = generateMarkdownIndex(rootInfo, allInfos);\n }\n\n const result: DocsResult = { pages, written: [], skipped: [], errors: [] };\n\n // Write to disk if output dir specified\n if (output) {\n const outDir = resolve(output);\n\n for (const page of pages) {\n const fullPath = join(outDir, page.path);\n\n try {\n if (existsSync(fullPath) && !overwrite) {\n result.skipped.push(page.path);\n continue;\n }\n\n if (dryRun) {\n result.written.push(page.path);\n continue;\n }\n\n const dir = dirname(fullPath);\n mkdirSync(dir, { recursive: true });\n writeFileSync(fullPath, page.content, 'utf-8');\n result.written.push(page.path);\n } catch (err) {\n result.errors.push({\n file: page.path,\n error: err instanceof Error ? err : new Error(String(err)),\n });\n }\n }\n }\n\n return result;\n}\n\n// ============================================================================\n// Man Page Installation\n// ============================================================================\n\nexport type SetupManPagesResult = {\n /** Directory where man pages were written. */\n dir: string;\n /** Man page files that were written. */\n written: string[];\n /** Whether existing pages were overwritten (true) or newly created (false). */\n updated: boolean;\n};\n\n/**\n * Returns the local man page directory for the given section.\n * Uses `~/.local/share/man/man<section>` (XDG convention).\n */\nasync function getManPageDir(section = 1): Promise<string> {\n const { homedir } = await import('node:os');\n return join(process.env.XDG_DATA_HOME || join(homedir(), '.local', 'share'), 'man', `man${section}`);\n}\n\n/**\n * Converts a command name to a man page filename.\n * \"myapp\" → \"myapp.1\", \"myapp deploy\" → \"myapp-deploy.1\"\n */\nfunction manPageFilename(commandName: string, section = 1): string {\n return `${commandName.replace(/\\s+/g, '-')}.${section}`;\n}\n\n/**\n * Installs man pages for a Padrone CLI program into the local man directory.\n * Generates man pages for all commands and writes them to `~/.local/share/man/man1/`.\n *\n * After installation, `man <program>` and `man <program>-<subcommand>` should work\n * (assuming `~/.local/share/man` is in `MANPATH` or `manpath` picks it up).\n */\nexport async function setupManPages(program: object): Promise<SetupManPagesResult> {\n const cmd = getCommand(program);\n const allInfos = collectAllHelpInfo(cmd, false);\n const programName = cmd.name || 'program';\n const manDir = await getManPageDir(1);\n\n mkdirSync(manDir, { recursive: true });\n\n const written: string[] = [];\n let updated = false;\n\n for (let i = 0; i < allInfos.length; i++) {\n const info = allInfos[i]!;\n const depth = i === 0 ? 0 : info.name.split(/\\s+/).length;\n const commandName = info.name === '<root>' || !info.name ? programName : info.name;\n const filename = manPageFilename(commandName);\n const fullPath = join(manDir, filename);\n\n if (existsSync(fullPath)) updated = true;\n\n const content = generateManPage(info, depth, programName);\n writeFileSync(fullPath, content, 'utf-8');\n written.push(filename);\n }\n\n return { dir: manDir, written, updated };\n}\n\n/**\n * Removes installed man pages for a Padrone CLI program.\n */\nexport async function removeManPages(program: object): Promise<{ dir: string; removed: string[] }> {\n const { unlinkSync } = await import('node:fs');\n const cmd = getCommand(program);\n const allInfos = collectAllHelpInfo(cmd, false);\n const programName = cmd.name || 'program';\n const manDir = await getManPageDir(1);\n const removed: string[] = [];\n\n for (let i = 0; i < allInfos.length; i++) {\n const info = allInfos[i]!;\n const commandName = info.name === '<root>' || !info.name ? programName : info.name;\n const filename = manPageFilename(commandName);\n const fullPath = join(manDir, filename);\n\n if (existsSync(fullPath)) {\n unlinkSync(fullPath);\n removed.push(filename);\n }\n }\n\n return { dir: manDir, removed };\n}\n"],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import { CommandTypesBase } from "../types/command.mjs";
2
+ import { OutputConfig } from "../output/output-indicator.mjs";
3
+
4
+ //#region src/extension/auto-output.d.ts
5
+ type PadroneAutoOutputOptions = {
6
+ /** Disable auto-output entirely. */disabled?: boolean;
7
+ /**
8
+ * Declarative output format for the command's return value.
9
+ * When set, auto-output formats the return value through the specified primitive
10
+ * instead of passing it raw to `runtime.output`.
11
+ * Ignored when the action calls `ctx.context.output.*` explicitly.
12
+ *
13
+ * ```ts
14
+ * // Format return value as a table
15
+ * c.extend(padroneAutoOutput({ output: 'table' }))
16
+ *
17
+ * // Format with options
18
+ * c.extend(padroneAutoOutput({ output: { type: 'table', options: { border: false } } }))
19
+ * ```
20
+ */
21
+ output?: OutputConfig;
22
+ /**
23
+ * Automatically print unhandled errors to stderr in CLI mode.
24
+ * Skips errors already handled by other extensions (routing, validation, signal).
25
+ * @default true
26
+ */
27
+ errorOutput?: boolean;
28
+ };
29
+ /**
30
+ * Extension that automatically writes a command's return value to output after execution.
31
+ *
32
+ * - Values are passed directly to the runtime's `output` function (no stringification).
33
+ * - Promises are awaited before output.
34
+ * - Iterators and async iterators are consumed, outputting each yielded value as it arrives.
35
+ * The result is replaced with the collected array so `drain()` still works.
36
+ * - `undefined` and `null` results produce no output.
37
+ *
38
+ * Also injects `ctx.context.output` with format-aware output primitives (table, tree, list, kv).
39
+ * When action handlers use these methods, auto-output skips to avoid double output.
40
+ *
41
+ * Included in the default extensions. Can also be applied per-command:
42
+ * ```ts
43
+ * createPadrone('my-cli')
44
+ * .command('users', (c) =>
45
+ * c.extend(padroneAutoOutput({ output: 'table' }))
46
+ * .action(() => fetchUsers())
47
+ * )
48
+ * ```
49
+ */
50
+ declare function padroneAutoOutput(options?: PadroneAutoOutputOptions): <T extends CommandTypesBase>(builder: T) => T;
51
+ //#endregion
52
+ export { PadroneAutoOutputOptions, padroneAutoOutput };
53
+ //# sourceMappingURL=auto-output.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-output.d.mts","names":[],"sources":["../../src/extension/auto-output.ts"],"mappings":";;;;KAsHY,wBAAA;sCAEV,QAAA;EAFU;;;;;;;;;AAuBC;AAwBb;;;;EA9BE,MAAA,GAAS,YAAY;EA8BsF;;;;;EAxB3G,WAAA;AAAA;;;;;;AAwBkH;;;;;;;;;;;;;;;;iBAApG,iBAAA,CAAkB,OAAA,GAAU,wBAAA,cAAsC,gBAAA,EAAkB,OAAA,EAAS,CAAA,KAAM,CAAA"}
@@ -0,0 +1,116 @@
1
+ import { isAsyncIterator, isIterator } from "../core/results.mjs";
2
+ import { defineInterceptor } from "../core/interceptors.mjs";
3
+ import { resolveOutputFormat } from "../output/styling.mjs";
4
+ import { createOutputIndicator, formatDeclarativeOutput } from "../output/output-indicator.mjs";
5
+ //#region src/extension/auto-output.ts
6
+ /**
7
+ * Outputs each value and collects into a result.
8
+ * For iterators: outputs each yielded value, returns collected array.
9
+ * For promises: awaits, then recurses.
10
+ * For other values: outputs directly, returns as-is.
11
+ */
12
+ function outputAndCollect(value, output) {
13
+ if (value == null) return value;
14
+ if (isAsyncIterator(value)) return (async () => {
15
+ const items = [];
16
+ const iter = value[Symbol.asyncIterator]();
17
+ while (true) {
18
+ const { done, value: item } = await iter.next();
19
+ if (done) break;
20
+ items.push(item);
21
+ if (item != null) output(item);
22
+ }
23
+ return items;
24
+ })();
25
+ if (typeof value !== "string" && !Array.isArray(value) && isIterator(value)) {
26
+ const items = [];
27
+ const iter = value[Symbol.iterator]();
28
+ while (true) {
29
+ const { done, value: item } = iter.next();
30
+ if (done) break;
31
+ items.push(item);
32
+ if (item != null) output(item);
33
+ }
34
+ return items;
35
+ }
36
+ if (value instanceof Promise) return value.then((resolved) => outputAndCollect(resolved, output));
37
+ output(value);
38
+ return value;
39
+ }
40
+ const autoOutputMeta = {
41
+ id: "padrone:auto-output",
42
+ name: "padrone:auto-output",
43
+ order: -1100
44
+ };
45
+ function createAutoOutputInterceptor(outputConfig, errorOutput) {
46
+ return defineInterceptor(autoOutputMeta, () => ({
47
+ error(ctx, next) {
48
+ const handleResult = (er) => {
49
+ if (!er.error || errorOutput === false || ctx.caller !== "cli" || ctx.phase !== "execute") return er;
50
+ const message = er.error instanceof Error ? er.error.message : String(er.error);
51
+ ctx.runtime.error(message);
52
+ return er;
53
+ };
54
+ const result = next();
55
+ if (result instanceof Promise) return result.then(handleResult);
56
+ return handleResult(result);
57
+ },
58
+ execute(ctx, next) {
59
+ const outputCtx = resolveOutputFormat(ctx.runtime, ctx.caller);
60
+ const indicator = createOutputIndicator(ctx.runtime.output, outputCtx);
61
+ const handleResult = (e) => {
62
+ if (indicator.called) return e;
63
+ const autoOutput = (value) => {
64
+ if (value == null) return value;
65
+ if (outputConfig) {
66
+ const rendered = formatDeclarativeOutput(value, outputConfig, outputCtx);
67
+ if (rendered !== void 0) {
68
+ ctx.runtime.output(rendered);
69
+ return value;
70
+ }
71
+ }
72
+ return outputAndCollect(value, ctx.runtime.output);
73
+ };
74
+ if (e.result instanceof Promise) return { result: e.result.then(autoOutput) };
75
+ const collected = autoOutput(e.result);
76
+ if (collected instanceof Promise) return collected.then((v) => ({ result: v }));
77
+ return { result: collected };
78
+ };
79
+ const executedOrPromise = next({ context: { output: indicator } });
80
+ if (executedOrPromise instanceof Promise) return executedOrPromise.then(handleResult);
81
+ return handleResult(executedOrPromise);
82
+ }
83
+ }));
84
+ }
85
+ /**
86
+ * Extension that automatically writes a command's return value to output after execution.
87
+ *
88
+ * - Values are passed directly to the runtime's `output` function (no stringification).
89
+ * - Promises are awaited before output.
90
+ * - Iterators and async iterators are consumed, outputting each yielded value as it arrives.
91
+ * The result is replaced with the collected array so `drain()` still works.
92
+ * - `undefined` and `null` results produce no output.
93
+ *
94
+ * Also injects `ctx.context.output` with format-aware output primitives (table, tree, list, kv).
95
+ * When action handlers use these methods, auto-output skips to avoid double output.
96
+ *
97
+ * Included in the default extensions. Can also be applied per-command:
98
+ * ```ts
99
+ * createPadrone('my-cli')
100
+ * .command('users', (c) =>
101
+ * c.extend(padroneAutoOutput({ output: 'table' }))
102
+ * .action(() => fetchUsers())
103
+ * )
104
+ * ```
105
+ */
106
+ function padroneAutoOutput(options) {
107
+ const interceptor = options?.disabled ? defineInterceptor({
108
+ ...autoOutputMeta,
109
+ disabled: true
110
+ }, () => ({})) : createAutoOutputInterceptor(options?.output, options?.errorOutput);
111
+ return ((builder) => builder.intercept(interceptor));
112
+ }
113
+ //#endregion
114
+ export { padroneAutoOutput };
115
+
116
+ //# sourceMappingURL=auto-output.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-output.mjs","names":[],"sources":["../../src/extension/auto-output.ts"],"sourcesContent":["import { defineInterceptor } from '../core/interceptors.ts';\nimport { isAsyncIterator, isIterator } from '../core/results.ts';\nimport type { OutputConfig } from '../output/output-indicator.ts';\nimport { createOutputIndicator, formatDeclarativeOutput } from '../output/output-indicator.ts';\nimport { resolveOutputFormat } from '../output/styling.ts';\nimport type {\n AnyPadroneBuilder,\n CommandTypesBase,\n InterceptorErrorContext,\n InterceptorErrorResult,\n InterceptorExecuteContext,\n InterceptorExecuteResult,\n} from '../types/index.ts';\n\n// ── Helpers ─────────────────────────────────────────────────────────────\n\n/**\n * Outputs each value and collects into a result.\n * For iterators: outputs each yielded value, returns collected array.\n * For promises: awaits, then recurses.\n * For other values: outputs directly, returns as-is.\n */\nfunction outputAndCollect(value: unknown, output: (...args: unknown[]) => void): unknown {\n if (value == null) return value;\n\n if (isAsyncIterator(value)) {\n return (async () => {\n const items: unknown[] = [];\n const iter = (value as any)[Symbol.asyncIterator]();\n while (true) {\n const { done, value: item } = await iter.next();\n if (done) break;\n items.push(item);\n if (item != null) output(item);\n }\n return items;\n })();\n }\n\n if (typeof value !== 'string' && !Array.isArray(value) && isIterator(value)) {\n const items: unknown[] = [];\n const iter = (value as any)[Symbol.iterator]();\n while (true) {\n const { done, value: item } = iter.next();\n if (done) break;\n items.push(item);\n if (item != null) output(item);\n }\n return items;\n }\n\n if (value instanceof Promise) {\n return value.then((resolved) => outputAndCollect(resolved, output));\n }\n\n output(value);\n return value;\n}\n\n// ── Interceptor ─────────────────────────────────────────────────────────\n\nconst autoOutputMeta = { id: 'padrone:auto-output', name: 'padrone:auto-output', order: -1100 } as const;\n\nfunction createAutoOutputInterceptor(outputConfig?: OutputConfig, errorOutput?: boolean) {\n return defineInterceptor(autoOutputMeta, () => ({\n error(ctx: InterceptorErrorContext, next: () => InterceptorErrorResult | Promise<InterceptorErrorResult>) {\n const handleResult = (er: InterceptorErrorResult): InterceptorErrorResult => {\n if (!er.error || errorOutput === false || ctx.caller !== 'cli' || ctx.phase !== 'execute') return er;\n const message = er.error instanceof Error ? er.error.message : String(er.error);\n ctx.runtime.error(message);\n return er;\n };\n\n const result = next();\n if (result instanceof Promise) return result.then(handleResult);\n return handleResult(result);\n },\n execute(ctx: InterceptorExecuteContext, next) {\n const outputCtx = resolveOutputFormat(ctx.runtime, ctx.caller);\n const indicator = createOutputIndicator(ctx.runtime.output, outputCtx);\n\n const handleResult = (e: InterceptorExecuteResult): InterceptorExecuteResult | Promise<InterceptorExecuteResult> => {\n // If the action already called output.*, skip auto-output\n if (indicator.called) return e;\n\n const autoOutput = (value: unknown): unknown => {\n if (value == null) return value;\n\n // Declarative output config: format the return value through the primitive\n if (outputConfig) {\n const rendered = formatDeclarativeOutput(value, outputConfig, outputCtx);\n if (rendered !== undefined) {\n ctx.runtime.output(rendered);\n return value;\n }\n }\n\n return outputAndCollect(value, ctx.runtime.output);\n };\n\n if (e.result instanceof Promise) {\n return { result: e.result.then(autoOutput) };\n }\n\n const collected = autoOutput(e.result);\n if (collected instanceof Promise) return collected.then((v) => ({ result: v }));\n return { result: collected };\n };\n\n const executedOrPromise = next({ context: { output: indicator } });\n if (executedOrPromise instanceof Promise) return executedOrPromise.then(handleResult);\n return handleResult(executedOrPromise);\n },\n }));\n}\n\n// ── Extension ───────────────────────────────────────────────────────────\n\nexport type PadroneAutoOutputOptions = {\n /** Disable auto-output entirely. */\n disabled?: boolean;\n /**\n * Declarative output format for the command's return value.\n * When set, auto-output formats the return value through the specified primitive\n * instead of passing it raw to `runtime.output`.\n * Ignored when the action calls `ctx.context.output.*` explicitly.\n *\n * ```ts\n * // Format return value as a table\n * c.extend(padroneAutoOutput({ output: 'table' }))\n *\n * // Format with options\n * c.extend(padroneAutoOutput({ output: { type: 'table', options: { border: false } } }))\n * ```\n */\n output?: OutputConfig;\n /**\n * Automatically print unhandled errors to stderr in CLI mode.\n * Skips errors already handled by other extensions (routing, validation, signal).\n * @default true\n */\n errorOutput?: boolean;\n};\n\n/**\n * Extension that automatically writes a command's return value to output after execution.\n *\n * - Values are passed directly to the runtime's `output` function (no stringification).\n * - Promises are awaited before output.\n * - Iterators and async iterators are consumed, outputting each yielded value as it arrives.\n * The result is replaced with the collected array so `drain()` still works.\n * - `undefined` and `null` results produce no output.\n *\n * Also injects `ctx.context.output` with format-aware output primitives (table, tree, list, kv).\n * When action handlers use these methods, auto-output skips to avoid double output.\n *\n * Included in the default extensions. Can also be applied per-command:\n * ```ts\n * createPadrone('my-cli')\n * .command('users', (c) =>\n * c.extend(padroneAutoOutput({ output: 'table' }))\n * .action(() => fetchUsers())\n * )\n * ```\n */\nexport function padroneAutoOutput(options?: PadroneAutoOutputOptions): <T extends CommandTypesBase>(builder: T) => T {\n const interceptor = options?.disabled\n ? defineInterceptor({ ...autoOutputMeta, disabled: true }, () => ({}))\n : createAutoOutputInterceptor(options?.output, options?.errorOutput);\n return ((builder: AnyPadroneBuilder) => builder.intercept(interceptor)) as any;\n}\n"],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { CommandTypesBase } from "../types/command.mjs";
2
+ //#region src/extension/color.d.ts
3
+ /**
4
+ * Extension that handles `--color` / `--no-color` flags:
5
+ * - `--color` or `--color=true` → use default theme
6
+ * - `--color=false` or `--no-color` → disable colors (text format)
7
+ * - `--color=<theme>` → use the named theme
8
+ *
9
+ * Modifies the runtime's format and theme accordingly.
10
+ *
11
+ * Usage:
12
+ * ```ts
13
+ * createPadrone('my-cli').extend(padroneColor())
14
+ * ```
15
+ */
16
+ declare function padroneColor(): <T extends CommandTypesBase>(builder: T) => T;
17
+ //#endregion
18
+ export { padroneColor };
19
+ //# sourceMappingURL=color.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"color.d.mts","names":[],"sources":["../../src/extension/color.ts"],"mappings":";;;;;AAmCA;;;;;;;;;;iBAAgB,YAAA,eAA2B,gBAAA,EAAkB,OAAA,EAAS,CAAA,KAAM,CAAA"}
@@ -0,0 +1,37 @@
1
+ import { thenMaybe } from "../core/results.mjs";
2
+ import { defineInterceptor } from "../core/interceptors.mjs";
3
+ //#region src/extension/color.ts
4
+ const colorInterceptor = defineInterceptor({
5
+ id: "padrone:color",
6
+ name: "padrone:color",
7
+ order: -1001
8
+ }, () => ({ parse(ctx, next) {
9
+ return thenMaybe(next(), (res) => {
10
+ if ("color" in res.rawArgs) {
11
+ const color = res.rawArgs.color;
12
+ delete res.rawArgs.color;
13
+ ctx.runtime.theme = color;
14
+ }
15
+ return res;
16
+ });
17
+ } }));
18
+ /**
19
+ * Extension that handles `--color` / `--no-color` flags:
20
+ * - `--color` or `--color=true` → use default theme
21
+ * - `--color=false` or `--no-color` → disable colors (text format)
22
+ * - `--color=<theme>` → use the named theme
23
+ *
24
+ * Modifies the runtime's format and theme accordingly.
25
+ *
26
+ * Usage:
27
+ * ```ts
28
+ * createPadrone('my-cli').extend(padroneColor())
29
+ * ```
30
+ */
31
+ function padroneColor() {
32
+ return ((builder) => builder.intercept(colorInterceptor));
33
+ }
34
+ //#endregion
35
+ export { padroneColor };
36
+
37
+ //# sourceMappingURL=color.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"color.mjs","names":[],"sources":["../../src/extension/color.ts"],"sourcesContent":["import { thenMaybe } from '#src/core/results.ts';\nimport { defineInterceptor } from '../core/interceptors.ts';\nimport type { AnyPadroneBuilder, CommandTypesBase } from '../types/index.ts';\n\n// ── Interceptor ─────────────────────────────────────────────────────────\n\nconst colorInterceptor = defineInterceptor({ id: 'padrone:color', name: 'padrone:color', order: -1001 }, () => ({\n parse(ctx, next) {\n return thenMaybe(next(), (res) => {\n if ('color' in res.rawArgs) {\n const color = res.rawArgs.color;\n delete res.rawArgs.color;\n\n ctx.runtime.theme = color as any;\n }\n return res;\n });\n },\n}));\n\n// ── Extension ────────────────────────────────────────────────────────────\n\n/**\n * Extension that handles `--color` / `--no-color` flags:\n * - `--color` or `--color=true` → use default theme\n * - `--color=false` or `--no-color` → disable colors (text format)\n * - `--color=<theme>` → use the named theme\n *\n * Modifies the runtime's format and theme accordingly.\n *\n * Usage:\n * ```ts\n * createPadrone('my-cli').extend(padroneColor())\n * ```\n */\nexport function padroneColor(): <T extends CommandTypesBase>(builder: T) => T {\n return ((builder: AnyPadroneBuilder) => builder.intercept(colorInterceptor)) as any;\n}\n"],"mappings":";;;AAMA,MAAM,mBAAmB,kBAAkB;CAAE,IAAI;CAAiB,MAAM;CAAiB,OAAO;AAAM,UAAU,EAC9G,MAAM,KAAK,MAAM;CACf,OAAO,UAAU,KAAK,IAAI,QAAQ;EAChC,IAAI,WAAW,IAAI,SAAS;GAC1B,MAAM,QAAQ,IAAI,QAAQ;GAC1B,OAAO,IAAI,QAAQ;GAEnB,IAAI,QAAQ,QAAQ;EACtB;EACA,OAAO;CACT,CAAC;AACH,EACF,EAAE;;;;;;;;;;;;;;AAiBF,SAAgB,eAA8D;CAC5E,SAAS,YAA+B,QAAQ,UAAU,gBAAgB;AAC5E"}
@@ -0,0 +1,25 @@
1
+ import { PadroneSchema } from "../types/schema.mjs";
2
+ import { WithCommand } from "../util/type-utils.mjs";
3
+ import { CommandTypesBase, PadroneCommand } from "../types/command.mjs";
4
+ //#region src/extension/completion.d.ts
5
+ type CompletionArgs = {
6
+ shell?: string;
7
+ setup?: boolean;
8
+ };
9
+ type CompletionCommand = PadroneCommand<'completion', '', PadroneSchema<CompletionArgs>, string, [], [], true>;
10
+ type WithCompletion<T> = WithCommand<T, 'completion', CompletionCommand>;
11
+ /**
12
+ * Extension that adds the `completion` command for shell completion script generation.
13
+ *
14
+ * Usage:
15
+ * ```ts
16
+ * import { createPadrone } from 'padrone';
17
+ * import { padroneCompletion } from 'padrone/completion';
18
+ *
19
+ * createPadrone('my-cli').extend(padroneCompletion())
20
+ * ```
21
+ */
22
+ declare function padroneCompletion(): <T extends CommandTypesBase>(builder: T) => WithCompletion<T>;
23
+ //#endregion
24
+ export { WithCompletion, padroneCompletion };
25
+ //# sourceMappingURL=completion.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.d.mts","names":[],"sources":["../../src/extension/completion.ts"],"mappings":";;;;KAUK,cAAA;EAAmB,KAAA;EAAgB,KAAK;AAAA;AAAA,KAExC,iBAAA,GAAoB,cAAA,mBAAiC,aAAA,CAAc,cAAA;AAAA,KAE5D,cAAA,MAAoB,WAAA,CAAY,CAAA,gBAAiB,iBAAA;;AAJhB;AAAA;;;;;;;;;iBAmB7B,iBAAA,eAAgC,gBAAA,EAAkB,OAAA,EAAS,CAAA,KAAM,cAAA,CAAe,CAAA"}
@@ -0,0 +1,40 @@
1
+ import { resolveAllCommands } from "../core/commands.mjs";
2
+ import { getRootCommand } from "../util/utils.mjs";
3
+ import { passthroughSchema } from "./utils.mjs";
4
+ //#region src/extension/completion.ts
5
+ /**
6
+ * Extension that adds the `completion` command for shell completion script generation.
7
+ *
8
+ * Usage:
9
+ * ```ts
10
+ * import { createPadrone } from 'padrone';
11
+ * import { padroneCompletion } from 'padrone/completion';
12
+ *
13
+ * createPadrone('my-cli').extend(padroneCompletion())
14
+ * ```
15
+ */
16
+ function padroneCompletion() {
17
+ return ((builder) => builder.command("completion", (c) => c.configure({
18
+ description: "Generate shell completion scripts",
19
+ hidden: true
20
+ }).arguments(passthroughSchema({
21
+ shell: "string",
22
+ setup: "boolean"
23
+ }), { positional: ["shell"] }).async().action(async (args, ctx) => {
24
+ const rootCommand = getRootCommand(ctx.command);
25
+ resolveAllCommands(rootCommand);
26
+ const { detectShell, generateCompletionOutput, setupCompletions } = await import("../feature/completion.mjs");
27
+ const shell = args.shell;
28
+ if (args.setup) {
29
+ const resolvedShell = shell ?? await detectShell();
30
+ if (!resolvedShell) throw new Error("Could not detect shell. Specify one: completion bash --setup");
31
+ const setupResult = await setupCompletions(rootCommand.name, resolvedShell);
32
+ return `${setupResult.updated ? "Updated" : "Added"} ${rootCommand.name} completions in ${setupResult.file}`;
33
+ }
34
+ return generateCompletionOutput(rootCommand, shell);
35
+ })));
36
+ }
37
+ //#endregion
38
+ export { padroneCompletion };
39
+
40
+ //# sourceMappingURL=completion.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.mjs","names":[],"sources":["../../src/extension/completion.ts"],"sourcesContent":["import type { ShellType } from '#src/util/shell-utils.ts';\nimport { resolveAllCommands } from '../core/commands.ts';\nimport type { AnyPadroneBuilder, CommandTypesBase, PadroneCommand } from '../types/index.ts';\nimport type { PadroneSchema } from '../types/schema.ts';\nimport type { WithCommand } from '../util/type-utils.ts';\nimport { getRootCommand } from '../util/utils.ts';\nimport { passthroughSchema } from './utils.ts';\n\n// ── Types ────────────────────────────────────────────────────────────────\n\ntype CompletionArgs = { shell?: string; setup?: boolean };\n\ntype CompletionCommand = PadroneCommand<'completion', '', PadroneSchema<CompletionArgs>, string, [], [], true>;\n\nexport type WithCompletion<T> = WithCommand<T, 'completion', CompletionCommand>;\n\n// ── Extension ────────────────────────────────────────────────────────────\n\n/**\n * Extension that adds the `completion` command for shell completion script generation.\n *\n * Usage:\n * ```ts\n * import { createPadrone } from 'padrone';\n * import { padroneCompletion } from 'padrone/completion';\n *\n * createPadrone('my-cli').extend(padroneCompletion())\n * ```\n */\nexport function padroneCompletion(): <T extends CommandTypesBase>(builder: T) => WithCompletion<T> {\n return ((builder: AnyPadroneBuilder) =>\n builder.command('completion', (c) =>\n c\n .configure({ description: 'Generate shell completion scripts', hidden: true })\n .arguments(passthroughSchema({ shell: 'string', setup: 'boolean' }), { positional: ['shell'] })\n .async()\n .action(async (args, ctx) => {\n const rootCommand = getRootCommand(ctx.command);\n resolveAllCommands(rootCommand);\n const { detectShell, generateCompletionOutput, setupCompletions } = await import('../feature/completion.ts');\n const shell = args.shell as ShellType;\n const setup = args.setup;\n if (setup) {\n const resolvedShell = shell ?? (await detectShell());\n if (!resolvedShell) throw new Error('Could not detect shell. Specify one: completion bash --setup');\n const setupResult = await setupCompletions(rootCommand.name, resolvedShell);\n return `${setupResult.updated ? 'Updated' : 'Added'} ${rootCommand.name} completions in ${setupResult.file}`;\n }\n return generateCompletionOutput(rootCommand, shell);\n }),\n )) as any;\n}\n"],"mappings":";;;;;;;;;;;;;;;AA6BA,SAAgB,oBAAmF;CACjG,SAAS,YACP,QAAQ,QAAQ,eAAe,MAC7B,EACG,UAAU;EAAE,aAAa;EAAqC,QAAQ;CAAK,CAAC,CAAC,CAC7E,UAAU,kBAAkB;EAAE,OAAO;EAAU,OAAO;CAAU,CAAC,GAAG,EAAE,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,CAC9F,MAAM,CAAC,CACP,OAAO,OAAO,MAAM,QAAQ;EAC3B,MAAM,cAAc,eAAe,IAAI,OAAO;EAC9C,mBAAmB,WAAW;EAC9B,MAAM,EAAE,aAAa,0BAA0B,qBAAqB,MAAM,OAAO;EACjF,MAAM,QAAQ,KAAK;EAEnB,IADc,KAAK,OACR;GACT,MAAM,gBAAgB,SAAU,MAAM,YAAY;GAClD,IAAI,CAAC,eAAe,MAAM,IAAI,MAAM,8DAA8D;GAClG,MAAM,cAAc,MAAM,iBAAiB,YAAY,MAAM,aAAa;GAC1E,OAAO,GAAG,YAAY,UAAU,YAAY,QAAQ,GAAG,YAAY,KAAK,kBAAkB,YAAY;EACxG;EACA,OAAO,yBAAyB,aAAa,KAAK;CACpD,CAAC,CACL;AACJ"}