padrone 1.9.0 → 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 (328) hide show
  1. package/CHANGELOG.md +13 -0
  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-WmyGc59s.mjs → core/args.mjs} +5 -81
  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-ohEApqIw.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-D8qkAinX.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-wCoVFTXz.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-ICZFl3xr.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 -902
  220. package/dist/index.mjs +25 -4377
  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/extension/completion.ts +3 -0
  295. package/src/extension/index.ts +0 -12
  296. package/src/extension/ink.ts +2 -1
  297. package/src/extension/man.ts +3 -0
  298. package/src/extension/mcp.ts +3 -0
  299. package/src/extension/serve.ts +3 -0
  300. package/src/extension/tracing.ts +2 -0
  301. package/src/index.ts +0 -19
  302. package/src/ink.ts +2 -0
  303. package/src/man.ts +2 -0
  304. package/src/mcp.ts +3 -0
  305. package/src/serve.ts +2 -0
  306. package/src/tracing.ts +9 -0
  307. package/src/zod.ts +1 -1
  308. package/dist/args-WmyGc59s.mjs.map +0 -1
  309. package/dist/codegen/index.d.mts.map +0 -1
  310. package/dist/codegen/index.mjs.map +0 -1
  311. package/dist/commands-ohEApqIw.mjs.map +0 -1
  312. package/dist/completion-D8qkAinX.mjs.map +0 -1
  313. package/dist/errors-DA4KzK1M.mjs.map +0 -1
  314. package/dist/formatter-CY3KrOEd.d.mts.map +0 -1
  315. package/dist/help-CeI45CJx.mjs +0 -892
  316. package/dist/help-CeI45CJx.mjs.map +0 -1
  317. package/dist/index-C3Ed1LYN.d.mts +0 -1432
  318. package/dist/index-C3Ed1LYN.d.mts.map +0 -1
  319. package/dist/index.d.mts.map +0 -1
  320. package/dist/index.mjs.map +0 -1
  321. package/dist/mcp-wCoVFTXz.mjs.map +0 -1
  322. package/dist/serve-ICZFl3xr.mjs.map +0 -1
  323. package/dist/stream-DC4H8YTx.mjs.map +0 -1
  324. package/dist/test.d.mts.map +0 -1
  325. package/dist/test.mjs.map +0 -1
  326. package/dist/update-check-CZ2VqjnV.mjs.map +0 -1
  327. package/dist/zod.d.mts.map +0 -1
  328. package/dist/zod.mjs.map +0 -1
@@ -0,0 +1,25 @@
1
+ import { CodeBuilder, CommandMeta, GeneratorContext } from "../types.mjs";
2
+
3
+ //#region src/codegen/generators/command-file.d.ts
4
+ interface CommandFileOptions {
5
+ /** Wrap config: generates .wrap() instead of .action(). */
6
+ wrap?: {
7
+ /** The external command to wrap (e.g. 'gh'). */command: string; /** Fixed args preceding the options (e.g. ['pr', 'list']). */
8
+ args?: string[];
9
+ };
10
+ /** Subcommand references to wire into this command via .command() calls. */
11
+ subcommands?: {
12
+ name: string;
13
+ varName: string;
14
+ importPath: string;
15
+ aliases?: string[];
16
+ }[];
17
+ }
18
+ /**
19
+ * Generate a single Padrone command file from a CommandMeta.
20
+ * Produces a named function that chains .configure(), .arguments(), and .wrap() or .action().
21
+ */
22
+ declare function generateCommandFile(command: CommandMeta, ctx: GeneratorContext, options?: CommandFileOptions): CodeBuilder;
23
+ //#endregion
24
+ export { CommandFileOptions, generateCommandFile };
25
+ //# sourceMappingURL=command-file.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-file.d.mts","names":[],"sources":["../../../src/codegen/generators/command-file.ts"],"mappings":";;;UA+DiB,kBAAA;EAAkB;EAEjC,IAAA;IAEE,gDAAA,OAAA,UAKF;IAHE,IAAA;EAAA;EAG6C;EAA/C,WAAA;IAAgB,IAAA;IAAc,OAAA;IAAiB,UAAA;IAAoB,OAAA;EAAA;AAAA;;;;;iBAOrD,mBAAA,CAAoB,OAAA,EAAS,WAAA,EAAa,GAAA,EAAK,gBAAA,EAAkB,OAAA,GAAU,kBAAA,GAAqB,WAAA"}
@@ -0,0 +1,130 @@
1
+ import { fieldMetaToCode } from "../schema-to-code.mjs";
2
+ //#region src/codegen/generators/command-file.ts
3
+ const JS_RESERVED = /* @__PURE__ */ new Set([
4
+ "break",
5
+ "case",
6
+ "catch",
7
+ "continue",
8
+ "debugger",
9
+ "default",
10
+ "delete",
11
+ "do",
12
+ "else",
13
+ "export",
14
+ "extends",
15
+ "finally",
16
+ "for",
17
+ "function",
18
+ "if",
19
+ "import",
20
+ "in",
21
+ "instanceof",
22
+ "new",
23
+ "return",
24
+ "super",
25
+ "switch",
26
+ "this",
27
+ "throw",
28
+ "try",
29
+ "typeof",
30
+ "var",
31
+ "void",
32
+ "while",
33
+ "with",
34
+ "yield",
35
+ "class",
36
+ "const",
37
+ "enum",
38
+ "let",
39
+ "static",
40
+ "implements",
41
+ "interface",
42
+ "package",
43
+ "private",
44
+ "protected",
45
+ "public",
46
+ "await",
47
+ "async"
48
+ ]);
49
+ /** Convert a command name to a safe JS identifier (camelCase, reserved-word-safe). */
50
+ function toSafeIdentifier(name) {
51
+ const camel = name.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
52
+ if (/^\d/.test(camel)) return `_${camel}`;
53
+ if (JS_RESERVED.has(camel)) return `_${camel}`;
54
+ return camel;
55
+ }
56
+ /** Build the exported function name for a command (e.g. 'repo' → 'repoCommand'). */
57
+ function toCommandFunctionName(name) {
58
+ return `${toSafeIdentifier(name)}Command`;
59
+ }
60
+ /**
61
+ * Generate a single Padrone command file from a CommandMeta.
62
+ * Produces a named function that chains .configure(), .arguments(), and .wrap() or .action().
63
+ */
64
+ function generateCommandFile(command, ctx, options) {
65
+ const code = ctx.createCodeBuilder();
66
+ const hasArgs = command.arguments && command.arguments.length > 0 || command.positionals && command.positionals.length > 0;
67
+ if (hasArgs) code.import("z", "zod/v4");
68
+ code.importType("AnyPadroneBuilder", "padrone");
69
+ if (options?.subcommands) for (const sub of options.subcommands) code.import([sub.varName], sub.importPath);
70
+ code.line();
71
+ if (command.deprecated) {
72
+ const msg = typeof command.deprecated === "string" ? command.deprecated : "This command is deprecated";
73
+ code.comment(`@deprecated ${msg}`);
74
+ }
75
+ const fnName = toCommandFunctionName(command.name);
76
+ code.line(`export function ${fnName}<T extends AnyPadroneBuilder>(cmd: T) {`);
77
+ code.line(` return cmd`);
78
+ const configParts = [];
79
+ if (command.description) configParts.push(`description: ${JSON.stringify(command.description)}`);
80
+ if (command.deprecated) configParts.push(`deprecated: ${typeof command.deprecated === "string" ? JSON.stringify(command.deprecated) : "true"}`);
81
+ if (configParts.length > 0) code.line(` .configure({ ${configParts.join(", ")} })`);
82
+ if (hasArgs) {
83
+ const allFields = [...command.arguments || [], ...command.positionals || []];
84
+ const schemaCode = fieldMetaToCode(allFields);
85
+ const positionalNames = (command.positionals || []).map((p) => p.type === "array" ? `'...${p.name}'` : `'${p.name}'`);
86
+ const fieldsMap = buildFieldsMap(allFields);
87
+ if (positionalNames.length > 0 || fieldsMap) {
88
+ code.line(` .arguments(${schemaCode.code}, {`);
89
+ if (positionalNames.length > 0) code.line(` positional: [${positionalNames.join(", ")}],`);
90
+ if (fieldsMap) code.line(` fields: ${fieldsMap},`);
91
+ code.line(` })`);
92
+ } else code.line(` .arguments(${schemaCode.code})`);
93
+ }
94
+ if (options?.subcommands) for (const sub of options.subcommands) {
95
+ const nameArg = sub.aliases && sub.aliases.length > 0 ? `[${JSON.stringify(sub.name)}, ${sub.aliases.map((a) => JSON.stringify(a)).join(", ")}]` : JSON.stringify(sub.name);
96
+ code.line(` .command(${nameArg}, ${sub.varName})`);
97
+ }
98
+ if (options?.wrap) {
99
+ const wrapParts = [];
100
+ wrapParts.push(`command: ${JSON.stringify(options.wrap.command)}`);
101
+ if (options.wrap.args && options.wrap.args.length > 0) wrapParts.push(`args: [${options.wrap.args.map((a) => JSON.stringify(a)).join(", ")}]`);
102
+ code.line(` .wrap({ ${wrapParts.join(", ")} })`);
103
+ } else code.line(` .action((args) => { /* TODO */ })`);
104
+ code.line(`}`);
105
+ return code;
106
+ }
107
+ function buildFieldsMap(fields) {
108
+ const entries = [];
109
+ for (const field of fields) if (field.aliases && field.aliases.length > 0) {
110
+ const singleChar = field.aliases.filter((a) => a.replace(/^-+/, "").length === 1).map((a) => a.replace(/^-+/, ""));
111
+ const multiChar = field.aliases.filter((a) => a.replace(/^-+/, "").length > 1).map((a) => a.replace(/^-+/, ""));
112
+ const key = /^[a-zA-Z_$][\w$]*$/.test(field.name) ? field.name : JSON.stringify(field.name);
113
+ const parts = [];
114
+ if (singleChar.length > 0) {
115
+ const flags = singleChar.length === 1 ? JSON.stringify(singleChar[0]) : `[${singleChar.map((a) => JSON.stringify(a)).join(", ")}]`;
116
+ parts.push(`flags: ${flags}`);
117
+ }
118
+ if (multiChar.length > 0) {
119
+ const alias = multiChar.length === 1 ? JSON.stringify(multiChar[0]) : `[${multiChar.map((a) => JSON.stringify(a)).join(", ")}]`;
120
+ parts.push(`alias: ${alias}`);
121
+ }
122
+ if (parts.length > 0) entries.push(`${key}: { ${parts.join(", ")} }`);
123
+ }
124
+ if (entries.length === 0) return null;
125
+ return `{ ${entries.join(", ")} }`;
126
+ }
127
+ //#endregion
128
+ export { generateCommandFile, toCommandFunctionName, toSafeIdentifier };
129
+
130
+ //# sourceMappingURL=command-file.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-file.mjs","names":[],"sources":["../../../src/codegen/generators/command-file.ts"],"sourcesContent":["import { fieldMetaToCode } from '../schema-to-code.ts';\nimport type { CodeBuilder, CommandMeta, FieldMeta, GeneratorContext } from '../types.ts';\n\nconst JS_RESERVED = new Set([\n 'break',\n 'case',\n 'catch',\n 'continue',\n 'debugger',\n 'default',\n 'delete',\n 'do',\n 'else',\n 'export',\n 'extends',\n 'finally',\n 'for',\n 'function',\n 'if',\n 'import',\n 'in',\n 'instanceof',\n 'new',\n 'return',\n 'super',\n 'switch',\n 'this',\n 'throw',\n 'try',\n 'typeof',\n 'var',\n 'void',\n 'while',\n 'with',\n 'yield',\n 'class',\n 'const',\n 'enum',\n 'let',\n 'static',\n 'implements',\n 'interface',\n 'package',\n 'private',\n 'protected',\n 'public',\n 'await',\n 'async',\n]);\n\n/** Convert a command name to a safe JS identifier (camelCase, reserved-word-safe). */\nexport function toSafeIdentifier(name: string): string {\n const camel = name.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase());\n if (/^\\d/.test(camel)) return `_${camel}`;\n if (JS_RESERVED.has(camel)) return `_${camel}`;\n return camel;\n}\n\n/** Build the exported function name for a command (e.g. 'repo' → 'repoCommand'). */\nexport function toCommandFunctionName(name: string): string {\n return `${toSafeIdentifier(name)}Command`;\n}\n\nexport interface CommandFileOptions {\n /** Wrap config: generates .wrap() instead of .action(). */\n wrap?: {\n /** The external command to wrap (e.g. 'gh'). */\n command: string;\n /** Fixed args preceding the options (e.g. ['pr', 'list']). */\n args?: string[];\n };\n /** Subcommand references to wire into this command via .command() calls. */\n subcommands?: { name: string; varName: string; importPath: string; aliases?: string[] }[];\n}\n\n/**\n * Generate a single Padrone command file from a CommandMeta.\n * Produces a named function that chains .configure(), .arguments(), and .wrap() or .action().\n */\nexport function generateCommandFile(command: CommandMeta, ctx: GeneratorContext, options?: CommandFileOptions): CodeBuilder {\n const code = ctx.createCodeBuilder();\n\n const hasArgs = (command.arguments && command.arguments.length > 0) || (command.positionals && command.positionals.length > 0);\n\n if (hasArgs) {\n code.import('z', 'zod/v4');\n }\n\n code.importType('AnyPadroneBuilder', 'padrone');\n\n // Import subcommand modules\n if (options?.subcommands) {\n for (const sub of options.subcommands) {\n code.import([sub.varName], sub.importPath);\n }\n }\n\n code.line();\n\n if (command.deprecated) {\n const msg = typeof command.deprecated === 'string' ? command.deprecated : 'This command is deprecated';\n code.comment(`@deprecated ${msg}`);\n }\n\n const fnName = toCommandFunctionName(command.name);\n code.line(`export function ${fnName}<T extends AnyPadroneBuilder>(cmd: T) {`);\n code.line(` return cmd`);\n\n // .configure()\n const configParts: string[] = [];\n if (command.description) {\n configParts.push(`description: ${JSON.stringify(command.description)}`);\n }\n if (command.deprecated) {\n configParts.push(`deprecated: ${typeof command.deprecated === 'string' ? JSON.stringify(command.deprecated) : 'true'}`);\n }\n if (configParts.length > 0) {\n code.line(` .configure({ ${configParts.join(', ')} })`);\n }\n\n // .arguments()\n if (hasArgs) {\n const allFields = [...(command.arguments || []), ...(command.positionals || [])];\n const schemaCode = fieldMetaToCode(allFields);\n\n const positionalNames = (command.positionals || []).map((p) => (p.type === 'array' ? `'...${p.name}'` : `'${p.name}'`));\n const fieldsMap = buildFieldsMap(allFields);\n const hasMetaOptions = positionalNames.length > 0 || fieldsMap;\n\n if (hasMetaOptions) {\n code.line(` .arguments(${schemaCode.code}, {`);\n if (positionalNames.length > 0) {\n code.line(` positional: [${positionalNames.join(', ')}],`);\n }\n if (fieldsMap) {\n code.line(` fields: ${fieldsMap},`);\n }\n code.line(` })`);\n } else {\n code.line(` .arguments(${schemaCode.code})`);\n }\n }\n\n // .command() calls for subcommands\n if (options?.subcommands) {\n for (const sub of options.subcommands) {\n const nameArg =\n sub.aliases && sub.aliases.length > 0\n ? `[${JSON.stringify(sub.name)}, ${sub.aliases.map((a) => JSON.stringify(a)).join(', ')}]`\n : JSON.stringify(sub.name);\n code.line(` .command(${nameArg}, ${sub.varName})`);\n }\n }\n\n // .wrap() or .action()\n if (options?.wrap) {\n const wrapParts: string[] = [];\n wrapParts.push(`command: ${JSON.stringify(options.wrap.command)}`);\n if (options.wrap.args && options.wrap.args.length > 0) {\n wrapParts.push(`args: [${options.wrap.args.map((a) => JSON.stringify(a)).join(', ')}]`);\n }\n code.line(` .wrap({ ${wrapParts.join(', ')} })`);\n } else {\n code.line(` .action((args) => { /* TODO */ })`);\n }\n\n code.line(`}`);\n\n return code;\n}\n\nfunction buildFieldsMap(fields: FieldMeta[]): string | null {\n const entries: string[] = [];\n for (const field of fields) {\n if (field.aliases && field.aliases.length > 0) {\n // Split into flags (single-char) and aliases (multi-char)\n const singleChar = field.aliases.filter((a) => a.replace(/^-+/, '').length === 1).map((a) => a.replace(/^-+/, ''));\n const multiChar = field.aliases.filter((a) => a.replace(/^-+/, '').length > 1).map((a) => a.replace(/^-+/, ''));\n\n const key = /^[a-zA-Z_$][\\w$]*$/.test(field.name) ? field.name : JSON.stringify(field.name);\n const parts: string[] = [];\n if (singleChar.length > 0) {\n const flags = singleChar.length === 1 ? JSON.stringify(singleChar[0]) : `[${singleChar.map((a) => JSON.stringify(a)).join(', ')}]`;\n parts.push(`flags: ${flags}`);\n }\n if (multiChar.length > 0) {\n const alias = multiChar.length === 1 ? JSON.stringify(multiChar[0]) : `[${multiChar.map((a) => JSON.stringify(a)).join(', ')}]`;\n parts.push(`alias: ${alias}`);\n }\n if (parts.length > 0) {\n entries.push(`${key}: { ${parts.join(', ')} }`);\n }\n }\n }\n if (entries.length === 0) return null;\n return `{ ${entries.join(', ')} }`;\n}\n"],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { CommandMeta, GeneratorContext } from "../types.mjs";
2
+
3
+ //#region src/codegen/generators/command-tree.d.ts
4
+ interface CommandTreeOptions {
5
+ /** When set, generates .wrap() calls instead of .action(). */
6
+ wrap?: {
7
+ /** The external command being wrapped (e.g. 'gh'). */command: string;
8
+ };
9
+ }
10
+ /**
11
+ * Walk a CommandMeta tree and emit one file per command plus a root program file.
12
+ * Maps nested subcommands to a directory structure.
13
+ */
14
+ declare function generateCommandTree(root: CommandMeta, ctx: GeneratorContext, options?: CommandTreeOptions): void;
15
+ //#endregion
16
+ export { CommandTreeOptions, generateCommandTree };
17
+ //# sourceMappingURL=command-tree.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-tree.d.mts","names":[],"sources":["../../../src/codegen/generators/command-tree.ts"],"mappings":";;;UAKiB,kBAAA;;EAEf,IAAA;IAFiC,sDAI/B,OAAO;EAAA;AAAA;AAQX;;;;AAAA,iBAAgB,mBAAA,CAAoB,IAAA,EAAM,WAAA,EAAa,GAAA,EAAK,gBAAA,EAAkB,OAAA,GAAU,kBAAA"}
@@ -0,0 +1,72 @@
1
+ import { fieldMetaToCode } from "../schema-to-code.mjs";
2
+ import { generateCommandFile, toCommandFunctionName } from "./command-file.mjs";
3
+ //#region src/codegen/generators/command-tree.ts
4
+ /**
5
+ * Walk a CommandMeta tree and emit one file per command plus a root program file.
6
+ * Maps nested subcommands to a directory structure.
7
+ */
8
+ function generateCommandTree(root, ctx, options) {
9
+ const rootImports = [];
10
+ function walkCommands(cmd, dirPath, parentArgs) {
11
+ if (cmd === root) {
12
+ for (const sub of cmd.subcommands || []) walkCommands(sub, "commands", []);
13
+ return;
14
+ }
15
+ const filePath = `${dirPath}/${cmd.name}.ts`;
16
+ const childRefs = [];
17
+ if (cmd.subcommands && cmd.subcommands.length > 0) for (const sub of cmd.subcommands) {
18
+ walkCommands(sub, `${dirPath}/${cmd.name}`, [...parentArgs, cmd.name]);
19
+ childRefs.push({
20
+ name: sub.name,
21
+ varName: toCommandFunctionName(sub.name),
22
+ importPath: `./${cmd.name}/${sub.name}.ts`,
23
+ aliases: sub.aliases
24
+ });
25
+ }
26
+ const fileOptions = {};
27
+ if (options?.wrap) fileOptions.wrap = {
28
+ command: options.wrap.command,
29
+ args: [...parentArgs, cmd.name]
30
+ };
31
+ if (childRefs.length > 0) fileOptions.subcommands = childRefs;
32
+ const code = generateCommandFile(cmd, ctx, Object.keys(fileOptions).length > 0 ? fileOptions : void 0);
33
+ ctx.emitter.addFile(filePath, code.build());
34
+ rootImports.push({
35
+ name: cmd.name,
36
+ varName: toCommandFunctionName(cmd.name),
37
+ path: `./${filePath.replace(/\.ts$/, ".ts")}`,
38
+ aliases: cmd.aliases
39
+ });
40
+ }
41
+ walkCommands(root, "", []);
42
+ const program = ctx.createCodeBuilder();
43
+ const rootHasArgs = root.arguments && root.arguments.length > 0 || root.positionals && root.positionals.length > 0;
44
+ if (rootHasArgs) program.import("z", "zod/v4");
45
+ program.import(["createPadrone"], "padrone");
46
+ const directChildren = rootImports.filter((imp) => imp.path.split("/").length <= 3);
47
+ for (const imp of directChildren) program.import([imp.varName], imp.path);
48
+ program.line();
49
+ program.line(`const program = createPadrone(${JSON.stringify(root.name)})`);
50
+ const configParts = [];
51
+ if (root.description) configParts.push(`description: ${JSON.stringify(root.description)}`);
52
+ if (configParts.length > 0) program.line(` .configure({ ${configParts.join(", ")} })`);
53
+ if (rootHasArgs) {
54
+ const schemaCode = fieldMetaToCode([...root.arguments || [], ...root.positionals || []]);
55
+ program.line(` .arguments(${schemaCode.code})`);
56
+ }
57
+ for (const imp of directChildren) {
58
+ const nameArg = imp.aliases && imp.aliases.length > 0 ? `[${JSON.stringify(imp.name)}, ${imp.aliases.map((a) => JSON.stringify(a)).join(", ")}]` : JSON.stringify(imp.name);
59
+ program.line(` .command(${nameArg}, ${imp.varName})`);
60
+ }
61
+ if (directChildren.length === 0 && options?.wrap) program.line(` .wrap({ command: ${JSON.stringify(options.wrap.command)} })`);
62
+ program.line();
63
+ program.line(`export default program`);
64
+ ctx.emitter.addFile("program.ts", program.build());
65
+ const index = ctx.createCodeBuilder();
66
+ index.line(`export { default } from './program.ts'`);
67
+ ctx.emitter.addFile("index.ts", index.build());
68
+ }
69
+ //#endregion
70
+ export { generateCommandTree };
71
+
72
+ //# sourceMappingURL=command-tree.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-tree.mjs","names":[],"sources":["../../../src/codegen/generators/command-tree.ts"],"sourcesContent":["import { fieldMetaToCode } from '../schema-to-code.ts';\nimport type { CommandMeta, GeneratorContext } from '../types.ts';\nimport type { CommandFileOptions } from './command-file.ts';\nimport { generateCommandFile, toCommandFunctionName } from './command-file.ts';\n\nexport interface CommandTreeOptions {\n /** When set, generates .wrap() calls instead of .action(). */\n wrap?: {\n /** The external command being wrapped (e.g. 'gh'). */\n command: string;\n };\n}\n\n/**\n * Walk a CommandMeta tree and emit one file per command plus a root program file.\n * Maps nested subcommands to a directory structure.\n */\nexport function generateCommandTree(root: CommandMeta, ctx: GeneratorContext, options?: CommandTreeOptions): void {\n const rootImports: { name: string; varName: string; path: string; aliases?: string[] }[] = [];\n\n // Recursively generate command files (depth-first so children exist before parents)\n function walkCommands(cmd: CommandMeta, dirPath: string, parentArgs: string[]): void {\n if (cmd === root) {\n for (const sub of cmd.subcommands || []) {\n walkCommands(sub, 'commands', []);\n }\n return;\n }\n\n const filePath = `${dirPath}/${cmd.name}.ts`;\n\n // Recurse into subcommands first so we can reference them\n const childRefs: { name: string; varName: string; importPath: string; aliases?: string[] }[] = [];\n if (cmd.subcommands && cmd.subcommands.length > 0) {\n for (const sub of cmd.subcommands) {\n walkCommands(sub, `${dirPath}/${cmd.name}`, [...parentArgs, cmd.name]);\n childRefs.push({\n name: sub.name,\n varName: toCommandFunctionName(sub.name),\n importPath: `./${cmd.name}/${sub.name}.ts`,\n aliases: sub.aliases,\n });\n }\n }\n\n const fileOptions: CommandFileOptions = {};\n if (options?.wrap) {\n fileOptions.wrap = { command: options.wrap.command, args: [...parentArgs, cmd.name] };\n }\n if (childRefs.length > 0) {\n fileOptions.subcommands = childRefs;\n }\n\n const code = generateCommandFile(cmd, ctx, Object.keys(fileOptions).length > 0 ? fileOptions : undefined);\n ctx.emitter.addFile(filePath, code.build());\n\n rootImports.push({\n name: cmd.name,\n varName: toCommandFunctionName(cmd.name),\n path: `./${filePath.replace(/\\.ts$/, '.ts')}`,\n aliases: cmd.aliases,\n });\n }\n\n walkCommands(root, '', []);\n\n // Generate root program.ts\n const program = ctx.createCodeBuilder();\n\n const rootHasArgs = (root.arguments && root.arguments.length > 0) || (root.positionals && root.positionals.length > 0);\n if (rootHasArgs) {\n program.import('z', 'zod/v4');\n }\n program.import(['createPadrone'], 'padrone');\n\n // Only import direct children of root\n const directChildren = rootImports.filter((imp) => imp.path.split('/').length <= 3);\n for (const imp of directChildren) {\n program.import([imp.varName], imp.path);\n }\n\n program.line();\n program.line(`const program = createPadrone(${JSON.stringify(root.name)})`);\n\n // .configure()\n const configParts: string[] = [];\n if (root.description) {\n configParts.push(`description: ${JSON.stringify(root.description)}`);\n }\n if (configParts.length > 0) {\n program.line(` .configure({ ${configParts.join(', ')} })`);\n }\n\n // Root arguments (for programs that have options at the root level)\n if (rootHasArgs) {\n const allFields = [...(root.arguments || []), ...(root.positionals || [])];\n const schemaCode = fieldMetaToCode(allFields);\n program.line(` .arguments(${schemaCode.code})`);\n }\n\n // Chain .command() calls for direct children\n for (const imp of directChildren) {\n const nameArg =\n imp.aliases && imp.aliases.length > 0\n ? `[${JSON.stringify(imp.name)}, ${imp.aliases.map((a) => JSON.stringify(a)).join(', ')}]`\n : JSON.stringify(imp.name);\n program.line(` .command(${nameArg}, ${imp.varName})`);\n }\n\n // If root has no subcommands, add .wrap() or .action()\n if (directChildren.length === 0 && options?.wrap) {\n program.line(` .wrap({ command: ${JSON.stringify(options.wrap.command)} })`);\n }\n\n program.line();\n program.line(`export default program`);\n\n ctx.emitter.addFile('program.ts', program.build());\n\n // Generate index.ts\n const index = ctx.createCodeBuilder();\n index.line(`export { default } from './program.ts'`);\n ctx.emitter.addFile('index.ts', index.build());\n}\n"],"mappings":"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"}
@@ -1,330 +1,15 @@
1
- import { StandardSchemaV1 } from "@standard-schema/spec";
2
-
3
- //#region src/codegen/types.d.ts
4
- /**
5
- * Metadata for a single field/option/flag parsed from CLI help or completion data.
6
- */
7
- interface FieldMeta {
8
- name: string;
9
- type: 'string' | 'number' | 'boolean' | 'array' | 'enum' | 'unknown';
10
- /** For arrays: the item type */
11
- items?: string;
12
- /** For enums: the allowed values */
13
- enumValues?: string[];
14
- description?: string;
15
- default?: unknown;
16
- required?: boolean;
17
- aliases?: string[];
18
- positional?: boolean;
19
- /** Mark fields the parser wasn't confident about */
20
- ambiguous?: boolean;
21
- }
22
- /**
23
- * Intermediate representation for a CLI command.
24
- * All parsers produce these, all generators consume them.
25
- */
26
- interface CommandMeta {
27
- name: string;
28
- description?: string;
29
- aliases?: string[];
30
- /** Named options/flags */
31
- arguments?: FieldMeta[];
32
- /** Positional arguments */
33
- positionals?: FieldMeta[];
34
- /** Recursive subcommands */
35
- subcommands?: CommandMeta[];
36
- examples?: string[];
37
- deprecated?: boolean | string;
38
- }
39
- /**
40
- * Logger interface for generators to report progress.
41
- */
42
- interface GeneratorLogger {
43
- info(message: string): void;
44
- warn(message: string): void;
45
- error(message: string): void;
46
- success(message: string): void;
47
- }
48
- /**
49
- * Shared context passed to all generators.
50
- */
51
- interface GeneratorContext {
52
- /** Target output directory */
53
- outDir: string;
54
- /** Code builder factory */
55
- createCodeBuilder: () => CodeBuilder;
56
- /** File emitter for writing output */
57
- emitter: FileEmitter;
58
- /** Template engine */
59
- template: TemplateFunction;
60
- /** User-facing logger */
61
- log: GeneratorLogger;
62
- }
63
- /**
64
- * Result from CodeBuilder.build()
65
- */
66
- interface CodeBuildResult {
67
- /** The formatted source string */
68
- text: string;
69
- /** Resolved import map for deduplication across files */
70
- imports: Map<string, {
71
- specifiers: Set<string>;
72
- typeOnly: boolean;
73
- }>;
74
- }
75
- /**
76
- * Fluent builder for constructing TypeScript source files.
77
- */
78
- interface CodeBuilder {
79
- /** Add a named import: import { specifier } from source */
80
- import(specifier: string | string[], source: string): CodeBuilder;
81
- /** Add a default import: import name from source */
82
- importDefault(name: string, source: string): CodeBuilder;
83
- /** Add a type-only import: import type { specifier } from source */
84
- importType(specifier: string | string[], source: string): CodeBuilder;
85
- /** Add a line of code (empty string or no argument for blank line) */
86
- line(code?: string): CodeBuilder;
87
- /** Add a nested block with automatic indentation */
88
- block(builder: (b: CodeBuilder) => CodeBuilder): CodeBuilder;
89
- /** Add a nested block with open/close strings */
90
- block(open: string, builder: (b: CodeBuilder) => CodeBuilder, close?: string): CodeBuilder;
91
- /** Add a nested block with open string, close string override, and builder */
92
- block(open: string, close: string, builder: (b: CodeBuilder) => CodeBuilder): CodeBuilder;
93
- /** Add a single-line comment */
94
- comment(text: string): CodeBuilder;
95
- /** Add a JSDoc comment */
96
- docComment(text: string): CodeBuilder;
97
- /** Add a TODO comment */
98
- todoComment(text: string): CodeBuilder;
99
- /** Add raw pre-formatted code (no indentation adjustment) */
100
- raw(code: string): CodeBuilder;
101
- /** Build the final source string */
102
- build(): CodeBuildResult;
103
- }
104
- /**
105
- * Result from FileEmitter.emit()
106
- */
107
- interface EmitResult {
108
- /** Files that were written */
109
- written: string[];
110
- /** Files that were skipped (already exist, no overwrite) */
111
- skipped: string[];
112
- /** Files that failed to write */
113
- errors: {
114
- file: string;
115
- error: Error;
116
- }[];
117
- }
118
- /**
119
- * Options for creating a FileEmitter.
120
- */
121
- interface FileEmitterOptions {
122
- /** Target output directory */
123
- outDir: string;
124
- /** Header comment prepended to every file */
125
- header?: string;
126
- /** How to handle existing files: true = overwrite, false = skip */
127
- overwrite?: boolean;
128
- /** Print what would be written without writing */
129
- dryRun?: boolean;
130
- }
131
- /**
132
- * Manages writing multiple generated files to disk.
133
- */
134
- interface FileEmitter {
135
- /** Queue a file for writing */
136
- addFile(path: string, content: string | CodeBuildResult): void;
137
- /** Write all queued files to disk */
138
- emit(): Promise<EmitResult>;
139
- }
140
- /**
141
- * Template function returned by template().
142
- */
143
- type TemplateFunction = (text: string) => (data: Record<string, unknown>) => string;
144
- //#endregion
145
- //#region src/codegen/code-builder.d.ts
146
- /**
147
- * Create a new CodeBuilder for constructing TypeScript source files.
148
- */
149
- declare function createCodeBuilder(): CodeBuilder;
150
- //#endregion
151
- //#region src/codegen/discovery.d.ts
152
- type DiscoverySource = 'help' | 'completion' | 'bash' | 'fish' | 'zsh';
153
- interface DiscoveryOptions {
154
- /** The command to discover (e.g. 'gh', 'docker', 'kubectl'). */
155
- command: string;
156
- /**
157
- * Which parsing sources to use. Default: ['help'].
158
- * Use `'completion'` to auto-detect the best shell completion source
159
- * by probing `<cmd> completion <shell>` (bash → fish → zsh).
160
- */
161
- sources?: DiscoverySource[];
162
- /** Max subcommand depth. 0 = root only, undefined = unlimited. */
163
- depth?: number;
164
- /** Delay in ms between help invocations. Default: 50 */
165
- delay?: number;
166
- /** Logger for progress reporting. */
167
- log?: GeneratorLogger;
168
- /** Timeout per help invocation in ms. Default: 10000 */
169
- timeout?: number;
170
- }
171
- interface DiscoveryResult {
172
- /** The discovered command tree. */
173
- command: CommandMeta;
174
- /** Number of help invocations made. */
175
- invocations: number;
176
- /** Errors encountered (non-fatal). */
177
- warnings: string[];
178
- }
179
- /**
180
- * Discover CLI structure by running --help recursively and optionally
181
- * parsing shell completion scripts.
182
- */
183
- declare function discoverCli(options: DiscoveryOptions): Promise<DiscoveryResult>;
184
- /**
185
- * Detect the best shell for completion parsing by probing the command.
186
- * Tries `<cmd> completion <shell>` for bash, fish, zsh (in that order).
187
- * Returns the shell name if successful, or null if no completion command exists.
188
- */
189
- declare function detectCompletionShell(command: string, timeout?: number): Promise<'bash' | 'fish' | 'zsh' | null>;
190
- //#endregion
191
- //#region src/codegen/file-emitter.d.ts
192
- /**
193
- * Create a FileEmitter for writing multiple generated files to disk.
194
- */
195
- declare function createFileEmitter(options: FileEmitterOptions): FileEmitter;
196
- //#endregion
197
- //#region src/codegen/generators/barrel-file.d.ts
198
- /**
199
- * Generate an index.ts barrel file that re-exports all given files.
200
- */
201
- declare function generateBarrelFile(files: string[], ctx: GeneratorContext): CodeBuilder;
202
- //#endregion
203
- //#region src/codegen/generators/command-file.d.ts
204
- interface CommandFileOptions {
205
- /** Wrap config: generates .wrap() instead of .action(). */
206
- wrap?: {
207
- /** The external command to wrap (e.g. 'gh'). */command: string; /** Fixed args preceding the options (e.g. ['pr', 'list']). */
208
- args?: string[];
209
- };
210
- /** Subcommand references to wire into this command via .command() calls. */
211
- subcommands?: {
212
- name: string;
213
- varName: string;
214
- importPath: string;
215
- aliases?: string[];
216
- }[];
217
- }
218
- /**
219
- * Generate a single Padrone command file from a CommandMeta.
220
- * Produces a named function that chains .configure(), .arguments(), and .wrap() or .action().
221
- */
222
- declare function generateCommandFile(command: CommandMeta, ctx: GeneratorContext, options?: CommandFileOptions): CodeBuilder;
223
- //#endregion
224
- //#region src/codegen/generators/command-tree.d.ts
225
- interface CommandTreeOptions {
226
- /** When set, generates .wrap() calls instead of .action(). */
227
- wrap?: {
228
- /** The external command being wrapped (e.g. 'gh'). */command: string;
229
- };
230
- }
231
- /**
232
- * Walk a CommandMeta tree and emit one file per command plus a root program file.
233
- * Maps nested subcommands to a directory structure.
234
- */
235
- declare function generateCommandTree(root: CommandMeta, ctx: GeneratorContext, options?: CommandTreeOptions): void;
236
- //#endregion
237
- //#region src/codegen/parsers/bash.d.ts
238
- /**
239
- * Parse bash completion scripts into CommandMeta.
240
- *
241
- * Bash completions typically use `complete -F <func> <command>` and define
242
- * a function that sets COMPREPLY. Common patterns:
243
- *
244
- * local commands="init build deploy"
245
- * local args="--verbose --output --format"
246
- * case "$prev" in --format) COMPREPLY=($(compgen -W "json yaml toml" ...)) ;;
247
- * COMPREPLY=($(compgen -W "$commands" ...))
248
- * COMPREPLY=($(compgen -W "$args" ...))
249
- */
250
- declare function parseBashCompletions(text: string): CommandMeta;
251
- //#endregion
252
- //#region src/codegen/parsers/fish.d.ts
253
- /**
254
- * Parse fish shell completion scripts into CommandMeta.
255
- *
256
- * Fish completions use the `complete` builtin:
257
- * complete -c <command> -s <short> -l <long> -d <description> -a <arguments> -r -f
258
- */
259
- declare function parseFishCompletions(text: string): CommandMeta;
260
- //#endregion
261
- //#region src/codegen/parsers/help.d.ts
262
- interface ParseHelpOptions {
263
- /** Name to use for the root command if not detected from the help text */
264
- name?: string;
265
- }
266
- /**
267
- * Parse --help text output into CommandMeta.
268
- * Handles common styles: GNU coreutils, Go cobra, Python argparse, Node commander/yargs, gh CLI.
269
- */
270
- declare function parseHelpOutput(text: string, options?: ParseHelpOptions): CommandMeta;
271
- //#endregion
272
- //#region src/codegen/parsers/merge.d.ts
273
- /**
274
- * Deep-merge multiple CommandMeta from different sources.
275
- * Deduplicates fields, resolves conflicts, and combines subcommands.
276
- *
277
- * Later sources take precedence for descriptions and types,
278
- * unless the earlier source was more specific (non-ambiguous).
279
- */
280
- declare function mergeCommandMeta(...sources: CommandMeta[]): CommandMeta;
281
- //#endregion
282
- //#region src/codegen/parsers/zsh.d.ts
283
- /**
284
- * Parse zsh completion function definitions into CommandMeta.
285
- *
286
- * Zsh completions typically use _arguments or compadd:
287
- * _arguments \
288
- * '-v[verbose mode]' \
289
- * '--output=[output file]:filename:_files' \
290
- * '1:command:(start stop restart)'
291
- */
292
- declare function parseZshCompletions(text: string): CommandMeta;
293
- //#endregion
294
- //#region src/codegen/schema-to-code.d.ts
295
- interface SchemaToCodeResult {
296
- /** The generated Zod source code */
297
- code: string;
298
- /** Imports needed (e.g. ['z']) */
299
- imports: string[];
300
- }
301
- /**
302
- * Generate Zod source code from a Standard Schema instance by introspecting
303
- * its `~standard.jsonSchema` interface.
304
- */
305
- declare function schemaToCode(schema: StandardSchemaV1): SchemaToCodeResult;
306
- /**
307
- * Build a real Zod schema from FieldMeta objects.
308
- * Returns the schema as Zod source code, since we can't dynamically import Zod here
309
- * (codegen has no runtime dependency on padrone's main entry point).
310
- */
311
- declare function fieldMetaToCode(fields: FieldMeta[]): SchemaToCodeResult;
312
- //#endregion
313
- //#region src/codegen/template.d.ts
314
- /**
315
- * Lightweight string template engine.
316
- *
317
- * Syntax:
318
- * - `{{var}}` — interpolation
319
- * - `{{#arr}}...{{/arr}}` — iteration (`.` refers to current item)
320
- * - `{{#bool}}...{{/bool}}` — conditional blocks
321
- * - `{{>partial}}` — include a named sub-template
322
- */
323
- type TemplateRenderer = (data: Record<string, unknown>, partials?: Record<string, string>) => string;
324
- /**
325
- * Compile a template string into a reusable render function.
326
- */
327
- declare function template(text: string): TemplateRenderer;
328
- //#endregion
329
- export { type CodeBuildResult, type CodeBuilder, type CommandFileOptions, type CommandMeta, type CommandTreeOptions, type DiscoveryOptions, type DiscoveryResult, type DiscoverySource, type EmitResult, type FieldMeta, type FileEmitter, type FileEmitterOptions, type GeneratorContext, type GeneratorLogger, type TemplateFunction, createCodeBuilder, createFileEmitter, detectCompletionShell, discoverCli, fieldMetaToCode, generateBarrelFile, generateCommandFile, generateCommandTree, mergeCommandMeta, parseBashCompletions, parseFishCompletions, parseHelpOutput, parseZshCompletions, schemaToCode, template };
330
- //# sourceMappingURL=index.d.mts.map
1
+ import { CodeBuildResult, CodeBuilder, CommandMeta, EmitResult, FieldMeta, FileEmitter, FileEmitterOptions, GeneratorContext, GeneratorLogger, TemplateFunction } from "./types.mjs";
2
+ import { createCodeBuilder } from "./code-builder.mjs";
3
+ import { DiscoveryOptions, DiscoveryResult, DiscoverySource, detectCompletionShell, discoverCli } from "./discovery.mjs";
4
+ import { createFileEmitter } from "./file-emitter.mjs";
5
+ import { generateBarrelFile } from "./generators/barrel-file.mjs";
6
+ import { CommandFileOptions, generateCommandFile } from "./generators/command-file.mjs";
7
+ import { CommandTreeOptions, generateCommandTree } from "./generators/command-tree.mjs";
8
+ import { parseBashCompletions } from "./parsers/bash.mjs";
9
+ import { parseFishCompletions } from "./parsers/fish.mjs";
10
+ import { parseHelpOutput } from "./parsers/help.mjs";
11
+ import { mergeCommandMeta } from "./parsers/merge.mjs";
12
+ import { parseZshCompletions } from "./parsers/zsh.mjs";
13
+ import { fieldMetaToCode, schemaToCode } from "./schema-to-code.mjs";
14
+ import { template } from "./template.mjs";
15
+ export { type CodeBuildResult, type CodeBuilder, type CommandFileOptions, type CommandMeta, type CommandTreeOptions, type DiscoveryOptions, type DiscoveryResult, type DiscoverySource, type EmitResult, type FieldMeta, type FileEmitter, type FileEmitterOptions, type GeneratorContext, type GeneratorLogger, type TemplateFunction, createCodeBuilder, createFileEmitter, detectCompletionShell, discoverCli, fieldMetaToCode, generateBarrelFile, generateCommandFile, generateCommandTree, mergeCommandMeta, parseBashCompletions, parseFishCompletions, parseHelpOutput, parseZshCompletions, schemaToCode, template };