padrone 1.0.0 → 1.2.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 (80) hide show
  1. package/CHANGELOG.md +51 -0
  2. package/LICENSE +1 -1
  3. package/README.md +92 -49
  4. package/dist/args-CKNh7Dm9.mjs +175 -0
  5. package/dist/args-CKNh7Dm9.mjs.map +1 -0
  6. package/dist/chunk-y_GBKt04.mjs +5 -0
  7. package/dist/codegen/index.d.mts +305 -0
  8. package/dist/codegen/index.d.mts.map +1 -0
  9. package/dist/codegen/index.mjs +1348 -0
  10. package/dist/codegen/index.mjs.map +1 -0
  11. package/dist/completion.d.mts +64 -0
  12. package/dist/completion.d.mts.map +1 -0
  13. package/dist/completion.mjs +417 -0
  14. package/dist/completion.mjs.map +1 -0
  15. package/dist/docs/index.d.mts +34 -0
  16. package/dist/docs/index.d.mts.map +1 -0
  17. package/dist/docs/index.mjs +404 -0
  18. package/dist/docs/index.mjs.map +1 -0
  19. package/dist/formatter-Dvx7jFXr.d.mts +82 -0
  20. package/dist/formatter-Dvx7jFXr.d.mts.map +1 -0
  21. package/dist/help-mUIX0T0V.mjs +1195 -0
  22. package/dist/help-mUIX0T0V.mjs.map +1 -0
  23. package/dist/index.d.mts +122 -438
  24. package/dist/index.d.mts.map +1 -1
  25. package/dist/index.mjs +1240 -1161
  26. package/dist/index.mjs.map +1 -1
  27. package/dist/test.d.mts +112 -0
  28. package/dist/test.d.mts.map +1 -0
  29. package/dist/test.mjs +138 -0
  30. package/dist/test.mjs.map +1 -0
  31. package/dist/types-qrtt0135.d.mts +1037 -0
  32. package/dist/types-qrtt0135.d.mts.map +1 -0
  33. package/dist/update-check-EbNDkzyV.mjs +146 -0
  34. package/dist/update-check-EbNDkzyV.mjs.map +1 -0
  35. package/package.json +61 -20
  36. package/src/args.ts +365 -0
  37. package/src/cli/completions.ts +29 -0
  38. package/src/cli/docs.ts +86 -0
  39. package/src/cli/doctor.ts +312 -0
  40. package/src/cli/index.ts +159 -0
  41. package/src/cli/init.ts +135 -0
  42. package/src/cli/link.ts +320 -0
  43. package/src/cli/wrap.ts +152 -0
  44. package/src/codegen/README.md +118 -0
  45. package/src/codegen/code-builder.ts +226 -0
  46. package/src/codegen/discovery.ts +232 -0
  47. package/src/codegen/file-emitter.ts +73 -0
  48. package/src/codegen/generators/barrel-file.ts +16 -0
  49. package/src/codegen/generators/command-file.ts +184 -0
  50. package/src/codegen/generators/command-tree.ts +124 -0
  51. package/src/codegen/index.ts +33 -0
  52. package/src/codegen/parsers/fish.ts +163 -0
  53. package/src/codegen/parsers/help.ts +378 -0
  54. package/src/codegen/parsers/merge.ts +158 -0
  55. package/src/codegen/parsers/zsh.ts +221 -0
  56. package/src/codegen/schema-to-code.ts +199 -0
  57. package/src/codegen/template.ts +69 -0
  58. package/src/codegen/types.ts +143 -0
  59. package/src/colorizer.ts +2 -2
  60. package/src/command-utils.ts +501 -0
  61. package/src/completion.ts +110 -97
  62. package/src/create.ts +1044 -284
  63. package/src/docs/index.ts +607 -0
  64. package/src/errors.ts +131 -0
  65. package/src/formatter.ts +149 -63
  66. package/src/help.ts +151 -55
  67. package/src/index.ts +13 -15
  68. package/src/interactive.ts +169 -0
  69. package/src/parse.ts +31 -16
  70. package/src/repl-loop.ts +317 -0
  71. package/src/runtime.ts +304 -0
  72. package/src/shell-utils.ts +83 -0
  73. package/src/test.ts +285 -0
  74. package/src/type-helpers.ts +12 -12
  75. package/src/type-utils.ts +124 -14
  76. package/src/types.ts +803 -144
  77. package/src/update-check.ts +244 -0
  78. package/src/wrap.ts +185 -0
  79. package/src/zod.d.ts +2 -2
  80. package/src/options.ts +0 -180
@@ -0,0 +1,305 @@
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' | 'fish' | 'zsh';
153
+ interface DiscoveryOptions {
154
+ /** The command to discover (e.g. 'gh', 'docker', 'kubectl'). */
155
+ command: string;
156
+ /** Which parsing sources to use. Default: ['help'] */
157
+ sources?: DiscoverySource[];
158
+ /** Max subcommand depth. 0 = root only, undefined = unlimited. */
159
+ depth?: number;
160
+ /** Delay in ms between help invocations. Default: 50 */
161
+ delay?: number;
162
+ /** Logger for progress reporting. */
163
+ log?: GeneratorLogger;
164
+ /** Timeout per help invocation in ms. Default: 10000 */
165
+ timeout?: number;
166
+ }
167
+ interface DiscoveryResult {
168
+ /** The discovered command tree. */
169
+ command: CommandMeta;
170
+ /** Number of help invocations made. */
171
+ invocations: number;
172
+ /** Errors encountered (non-fatal). */
173
+ warnings: string[];
174
+ }
175
+ /**
176
+ * Discover CLI structure by running --help recursively and optionally
177
+ * parsing shell completion scripts.
178
+ */
179
+ declare function discoverCli(options: DiscoveryOptions): Promise<DiscoveryResult>;
180
+ //#endregion
181
+ //#region src/codegen/file-emitter.d.ts
182
+ /**
183
+ * Create a FileEmitter for writing multiple generated files to disk.
184
+ */
185
+ declare function createFileEmitter(options: FileEmitterOptions): FileEmitter;
186
+ //#endregion
187
+ //#region src/codegen/generators/barrel-file.d.ts
188
+ /**
189
+ * Generate an index.ts barrel file that re-exports all given files.
190
+ */
191
+ declare function generateBarrelFile(files: string[], ctx: GeneratorContext): CodeBuilder;
192
+ //#endregion
193
+ //#region src/codegen/generators/command-file.d.ts
194
+ interface CommandFileOptions {
195
+ /** Wrap config: generates .wrap() instead of .action(). */
196
+ wrap?: {
197
+ /** The external command to wrap (e.g. 'gh'). */command: string; /** Fixed args preceding the options (e.g. ['pr', 'list']). */
198
+ args?: string[];
199
+ };
200
+ /** Subcommand references to wire into this command via .command() calls. */
201
+ subcommands?: {
202
+ name: string;
203
+ varName: string;
204
+ importPath: string;
205
+ aliases?: string[];
206
+ }[];
207
+ }
208
+ /**
209
+ * Generate a single Padrone command file from a CommandMeta.
210
+ * Produces a named function that chains .configure(), .arguments(), and .wrap() or .action().
211
+ */
212
+ declare function generateCommandFile(command: CommandMeta, ctx: GeneratorContext, options?: CommandFileOptions): CodeBuilder;
213
+ //#endregion
214
+ //#region src/codegen/generators/command-tree.d.ts
215
+ interface CommandTreeOptions {
216
+ /** When set, generates .wrap() calls instead of .action(). */
217
+ wrap?: {
218
+ /** The external command being wrapped (e.g. 'gh'). */command: string;
219
+ };
220
+ }
221
+ /**
222
+ * Walk a CommandMeta tree and emit one file per command plus a root program file.
223
+ * Maps nested subcommands to a directory structure.
224
+ */
225
+ declare function generateCommandTree(root: CommandMeta, ctx: GeneratorContext, options?: CommandTreeOptions): void;
226
+ //#endregion
227
+ //#region src/codegen/parsers/fish.d.ts
228
+ /**
229
+ * Parse fish shell completion scripts into CommandMeta.
230
+ *
231
+ * Fish completions use the `complete` builtin:
232
+ * complete -c <command> -s <short> -l <long> -d <description> -a <arguments> -r -f
233
+ */
234
+ declare function parseFishCompletions(text: string): CommandMeta;
235
+ //#endregion
236
+ //#region src/codegen/parsers/help.d.ts
237
+ interface ParseHelpOptions {
238
+ /** Name to use for the root command if not detected from the help text */
239
+ name?: string;
240
+ }
241
+ /**
242
+ * Parse --help text output into CommandMeta.
243
+ * Handles common styles: GNU coreutils, Go cobra, Python argparse, Node commander/yargs, gh CLI.
244
+ */
245
+ declare function parseHelpOutput(text: string, options?: ParseHelpOptions): CommandMeta;
246
+ //#endregion
247
+ //#region src/codegen/parsers/merge.d.ts
248
+ /**
249
+ * Deep-merge multiple CommandMeta from different sources.
250
+ * Deduplicates fields, resolves conflicts, and combines subcommands.
251
+ *
252
+ * Later sources take precedence for descriptions and types,
253
+ * unless the earlier source was more specific (non-ambiguous).
254
+ */
255
+ declare function mergeCommandMeta(...sources: CommandMeta[]): CommandMeta;
256
+ //#endregion
257
+ //#region src/codegen/parsers/zsh.d.ts
258
+ /**
259
+ * Parse zsh completion function definitions into CommandMeta.
260
+ *
261
+ * Zsh completions typically use _arguments or compadd:
262
+ * _arguments \
263
+ * '-v[verbose mode]' \
264
+ * '--output=[output file]:filename:_files' \
265
+ * '1:command:(start stop restart)'
266
+ */
267
+ declare function parseZshCompletions(text: string): CommandMeta;
268
+ //#endregion
269
+ //#region src/codegen/schema-to-code.d.ts
270
+ interface SchemaToCodeResult {
271
+ /** The generated Zod source code */
272
+ code: string;
273
+ /** Imports needed (e.g. ['z']) */
274
+ imports: string[];
275
+ }
276
+ /**
277
+ * Generate Zod source code from a Standard Schema instance by introspecting
278
+ * its `~standard.jsonSchema` interface.
279
+ */
280
+ declare function schemaToCode(schema: StandardSchemaV1): SchemaToCodeResult;
281
+ /**
282
+ * Build a real Zod schema from FieldMeta objects.
283
+ * Returns the schema as Zod source code, since we can't dynamically import Zod here
284
+ * (codegen has no runtime dependency on padrone's main entry point).
285
+ */
286
+ declare function fieldMetaToCode(fields: FieldMeta[]): SchemaToCodeResult;
287
+ //#endregion
288
+ //#region src/codegen/template.d.ts
289
+ /**
290
+ * Lightweight string template engine.
291
+ *
292
+ * Syntax:
293
+ * - `{{var}}` — interpolation
294
+ * - `{{#arr}}...{{/arr}}` — iteration (`.` refers to current item)
295
+ * - `{{#bool}}...{{/bool}}` — conditional blocks
296
+ * - `{{>partial}}` — include a named sub-template
297
+ */
298
+ type TemplateRenderer = (data: Record<string, unknown>, partials?: Record<string, string>) => string;
299
+ /**
300
+ * Compile a template string into a reusable render function.
301
+ */
302
+ declare function template(text: string): TemplateRenderer;
303
+ //#endregion
304
+ 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, discoverCli, fieldMetaToCode, generateBarrelFile, generateCommandFile, generateCommandTree, mergeCommandMeta, parseFishCompletions, parseHelpOutput, parseZshCompletions, schemaToCode, template };
305
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/codegen/types.ts","../../src/codegen/code-builder.ts","../../src/codegen/discovery.ts","../../src/codegen/file-emitter.ts","../../src/codegen/generators/barrel-file.ts","../../src/codegen/generators/command-file.ts","../../src/codegen/generators/command-tree.ts","../../src/codegen/parsers/fish.ts","../../src/codegen/parsers/help.ts","../../src/codegen/parsers/merge.ts","../../src/codegen/parsers/zsh.ts","../../src/codegen/schema-to-code.ts","../../src/codegen/template.ts"],"mappings":"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"}