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.
- package/CHANGELOG.md +20 -1
- package/README.md +2 -2
- package/dist/codegen/code-builder.d.mts +10 -0
- package/dist/codegen/code-builder.d.mts.map +1 -0
- package/dist/codegen/code-builder.mjs +185 -0
- package/dist/codegen/code-builder.mjs.map +1 -0
- package/dist/codegen/discovery.d.mts +44 -0
- package/dist/codegen/discovery.d.mts.map +1 -0
- package/dist/codegen/discovery.mjs +179 -0
- package/dist/codegen/discovery.mjs.map +1 -0
- package/dist/codegen/file-emitter.d.mts +10 -0
- package/dist/codegen/file-emitter.d.mts.map +1 -0
- package/dist/codegen/file-emitter.mjs +58 -0
- package/dist/codegen/file-emitter.mjs.map +1 -0
- package/dist/codegen/generators/barrel-file.d.mts +10 -0
- package/dist/codegen/generators/barrel-file.d.mts.map +1 -0
- package/dist/codegen/generators/barrel-file.mjs +16 -0
- package/dist/codegen/generators/barrel-file.mjs.map +1 -0
- package/dist/codegen/generators/command-file.d.mts +25 -0
- package/dist/codegen/generators/command-file.d.mts.map +1 -0
- package/dist/codegen/generators/command-file.mjs +130 -0
- package/dist/codegen/generators/command-file.mjs.map +1 -0
- package/dist/codegen/generators/command-tree.d.mts +17 -0
- package/dist/codegen/generators/command-tree.d.mts.map +1 -0
- package/dist/codegen/generators/command-tree.mjs +72 -0
- package/dist/codegen/generators/command-tree.mjs.map +1 -0
- package/dist/codegen/index.d.mts +15 -330
- package/dist/codegen/index.mjs +13 -1507
- package/dist/codegen/parsers/bash.d.mts +19 -0
- package/dist/codegen/parsers/bash.d.mts.map +1 -0
- package/dist/codegen/parsers/bash.mjs +112 -0
- package/dist/codegen/parsers/bash.mjs.map +1 -0
- package/dist/codegen/parsers/fish.d.mts +13 -0
- package/dist/codegen/parsers/fish.d.mts.map +1 -0
- package/dist/codegen/parsers/fish.mjs +108 -0
- package/dist/codegen/parsers/fish.mjs.map +1 -0
- package/dist/codegen/parsers/help.d.mts +15 -0
- package/dist/codegen/parsers/help.d.mts.map +1 -0
- package/dist/codegen/parsers/help.mjs +271 -0
- package/dist/codegen/parsers/help.mjs.map +1 -0
- package/dist/codegen/parsers/merge.d.mts +14 -0
- package/dist/codegen/parsers/merge.d.mts.map +1 -0
- package/dist/codegen/parsers/merge.mjs +76 -0
- package/dist/codegen/parsers/merge.mjs.map +1 -0
- package/dist/codegen/parsers/zsh.d.mts +16 -0
- package/dist/codegen/parsers/zsh.d.mts.map +1 -0
- package/dist/codegen/parsers/zsh.mjs +161 -0
- package/dist/codegen/parsers/zsh.mjs.map +1 -0
- package/dist/codegen/schema-to-code.d.mts +24 -0
- package/dist/codegen/schema-to-code.d.mts.map +1 -0
- package/dist/codegen/schema-to-code.mjs +147 -0
- package/dist/codegen/schema-to-code.mjs.map +1 -0
- package/dist/codegen/template.d.mts +18 -0
- package/dist/codegen/template.d.mts.map +1 -0
- package/dist/codegen/template.mjs +37 -0
- package/dist/codegen/template.mjs.map +1 -0
- package/dist/codegen/types.d.mts +144 -0
- package/dist/codegen/types.d.mts.map +1 -0
- package/dist/completion.d.mts +2 -0
- package/dist/completion.mjs +2 -0
- package/dist/core/args.d.mts +3 -0
- package/dist/{args-DrCXxXeP.mjs → core/args.mjs} +49 -113
- package/dist/core/args.mjs.map +1 -0
- package/dist/core/commands.d.mts +13 -0
- package/dist/core/commands.d.mts.map +1 -0
- package/dist/{commands-DLR0rFgq.mjs → core/commands.mjs} +4 -232
- package/dist/core/commands.mjs.map +1 -0
- package/dist/core/create.d.mts +63 -0
- package/dist/core/create.d.mts.map +1 -0
- package/dist/core/create.mjs +230 -0
- package/dist/core/create.mjs.map +1 -0
- package/dist/core/default-runtime.mjs +198 -0
- package/dist/core/default-runtime.mjs.map +1 -0
- package/dist/core/errors.d.mts +107 -0
- package/dist/core/errors.d.mts.map +1 -0
- package/dist/{errors-DA4KzK1M.mjs → core/errors.mjs} +2 -2
- package/dist/core/errors.mjs.map +1 -0
- package/dist/core/exec.mjs +191 -0
- package/dist/core/exec.mjs.map +1 -0
- package/dist/core/interceptors.d.mts +33 -0
- package/dist/core/interceptors.d.mts.map +1 -0
- package/dist/core/interceptors.mjs +253 -0
- package/dist/core/interceptors.mjs.map +1 -0
- package/dist/core/parse.mjs +181 -0
- package/dist/core/parse.mjs.map +1 -0
- package/dist/core/program-methods.mjs +256 -0
- package/dist/core/program-methods.mjs.map +1 -0
- package/dist/core/results.d.mts +13 -0
- package/dist/core/results.d.mts.map +1 -0
- package/dist/core/results.mjs +150 -0
- package/dist/core/results.mjs.map +1 -0
- package/dist/core/runtime.d.mts +213 -0
- package/dist/core/runtime.d.mts.map +1 -0
- package/dist/core/runtime.mjs +10 -0
- package/dist/core/runtime.mjs.map +1 -0
- package/dist/core/validate.mjs +220 -0
- package/dist/core/validate.mjs.map +1 -0
- package/dist/docs/index.d.mts +1 -1
- package/dist/docs/index.d.mts.map +1 -1
- package/dist/docs/index.mjs +2 -2
- package/dist/docs/index.mjs.map +1 -1
- package/dist/extension/auto-output.d.mts +53 -0
- package/dist/extension/auto-output.d.mts.map +1 -0
- package/dist/extension/auto-output.mjs +116 -0
- package/dist/extension/auto-output.mjs.map +1 -0
- package/dist/extension/color.d.mts +19 -0
- package/dist/extension/color.d.mts.map +1 -0
- package/dist/extension/color.mjs +37 -0
- package/dist/extension/color.mjs.map +1 -0
- package/dist/extension/completion.d.mts +25 -0
- package/dist/extension/completion.d.mts.map +1 -0
- package/dist/extension/completion.mjs +40 -0
- package/dist/extension/completion.mjs.map +1 -0
- package/dist/extension/config.d.mts +55 -0
- package/dist/extension/config.d.mts.map +1 -0
- package/dist/extension/config.mjs +162 -0
- package/dist/extension/config.mjs.map +1 -0
- package/dist/extension/env.d.mts +42 -0
- package/dist/extension/env.d.mts.map +1 -0
- package/dist/extension/env.mjs +44 -0
- package/dist/extension/env.mjs.map +1 -0
- package/dist/extension/help.d.mts +29 -0
- package/dist/extension/help.d.mts.map +1 -0
- package/dist/extension/help.mjs +161 -0
- package/dist/extension/help.mjs.map +1 -0
- package/dist/extension/index.d.mts +18 -0
- package/dist/extension/ink.d.mts +31 -0
- package/dist/extension/ink.d.mts.map +1 -0
- package/dist/extension/ink.mjs +69 -0
- package/dist/extension/ink.mjs.map +1 -0
- package/dist/extension/interactive.d.mts +16 -0
- package/dist/extension/interactive.d.mts.map +1 -0
- package/dist/extension/interactive.mjs +89 -0
- package/dist/extension/interactive.mjs.map +1 -0
- package/dist/extension/logger.d.mts +67 -0
- package/dist/extension/logger.d.mts.map +1 -0
- package/dist/extension/logger.mjs +188 -0
- package/dist/extension/logger.mjs.map +1 -0
- package/dist/extension/man.d.mts +25 -0
- package/dist/extension/man.d.mts.map +1 -0
- package/dist/extension/man.mjs +41 -0
- package/dist/extension/man.mjs.map +1 -0
- package/dist/extension/mcp.d.mts +28 -0
- package/dist/extension/mcp.d.mts.map +1 -0
- package/dist/extension/mcp.mjs +44 -0
- package/dist/extension/mcp.mjs.map +1 -0
- package/dist/extension/progress-renderer.d.mts +13 -0
- package/dist/extension/progress-renderer.d.mts.map +1 -0
- package/dist/extension/progress-renderer.mjs +351 -0
- package/dist/extension/progress-renderer.mjs.map +1 -0
- package/dist/extension/progress.d.mts +76 -0
- package/dist/extension/progress.d.mts.map +1 -0
- package/dist/extension/progress.mjs +225 -0
- package/dist/extension/progress.mjs.map +1 -0
- package/dist/extension/repl.d.mts +26 -0
- package/dist/extension/repl.d.mts.map +1 -0
- package/dist/extension/repl.mjs +67 -0
- package/dist/extension/repl.mjs.map +1 -0
- package/dist/extension/serve.d.mts +27 -0
- package/dist/extension/serve.d.mts.map +1 -0
- package/dist/extension/serve.mjs +41 -0
- package/dist/extension/serve.mjs.map +1 -0
- package/dist/extension/signal.d.mts +19 -0
- package/dist/extension/signal.d.mts.map +1 -0
- package/dist/extension/signal.mjs +81 -0
- package/dist/extension/signal.mjs.map +1 -0
- package/dist/extension/stdin.d.mts +19 -0
- package/dist/extension/stdin.d.mts.map +1 -0
- package/dist/extension/stdin.mjs +52 -0
- package/dist/extension/stdin.mjs.map +1 -0
- package/dist/extension/suggestions.d.mts +6 -0
- package/dist/extension/suggestions.d.mts.map +1 -0
- package/dist/extension/suggestions.mjs +113 -0
- package/dist/extension/suggestions.mjs.map +1 -0
- package/dist/extension/timing.d.mts +27 -0
- package/dist/extension/timing.d.mts.map +1 -0
- package/dist/extension/timing.mjs +71 -0
- package/dist/extension/timing.mjs.map +1 -0
- package/dist/extension/tracing.d.mts +85 -0
- package/dist/extension/tracing.d.mts.map +1 -0
- package/dist/extension/tracing.mjs +107 -0
- package/dist/extension/tracing.mjs.map +1 -0
- package/dist/extension/update-check.d.mts +20 -0
- package/dist/extension/update-check.d.mts.map +1 -0
- package/dist/extension/update-check.mjs +62 -0
- package/dist/extension/update-check.mjs.map +1 -0
- package/dist/extension/utils.mjs +43 -0
- package/dist/extension/utils.mjs.map +1 -0
- package/dist/extension/version.d.mts +20 -0
- package/dist/extension/version.d.mts.map +1 -0
- package/dist/extension/version.mjs +51 -0
- package/dist/extension/version.mjs.map +1 -0
- package/dist/{completion-UnBKfGuk.mjs → feature/completion.mjs} +4 -3
- package/dist/feature/completion.mjs.map +1 -0
- package/dist/feature/interactive.mjs +145 -0
- package/dist/feature/interactive.mjs.map +1 -0
- package/dist/feature/mcp.d.mts +18 -0
- package/dist/feature/mcp.d.mts.map +1 -0
- package/dist/{mcp-D6PdtjIs.mjs → feature/mcp.mjs} +6 -6
- package/dist/feature/mcp.mjs.map +1 -0
- package/dist/feature/repl-loop.mjs +217 -0
- package/dist/feature/repl-loop.mjs.map +1 -0
- package/dist/feature/serve.d.mts +18 -0
- package/dist/feature/serve.d.mts.map +1 -0
- package/dist/{serve-PaCLsNoD.mjs → feature/serve.mjs} +7 -7
- package/dist/feature/serve.mjs.map +1 -0
- package/dist/feature/test.d.mts +109 -0
- package/dist/feature/test.d.mts.map +1 -0
- package/dist/feature/test.mjs +116 -0
- package/dist/feature/test.mjs.map +1 -0
- package/dist/feature/update-check.d.mts +35 -0
- package/dist/feature/update-check.d.mts.map +1 -0
- package/dist/{update-check-CZ2VqjnV.mjs → feature/update-check.mjs} +2 -2
- package/dist/feature/update-check.mjs.map +1 -0
- package/dist/feature/wrap.d.mts +58 -0
- package/dist/feature/wrap.d.mts.map +1 -0
- package/dist/feature/wrap.mjs +77 -0
- package/dist/feature/wrap.mjs.map +1 -0
- package/dist/index.d.mts +38 -901
- package/dist/index.mjs +25 -4337
- package/dist/ink.d.mts +2 -0
- package/dist/ink.mjs +2 -0
- package/dist/man.d.mts +2 -0
- package/dist/man.mjs +2 -0
- package/dist/mcp.d.mts +3 -0
- package/dist/mcp.mjs +2 -0
- package/dist/output/colorizer.d.mts +28 -0
- package/dist/output/colorizer.d.mts.map +1 -0
- package/dist/output/colorizer.mjs +94 -0
- package/dist/output/colorizer.mjs.map +1 -0
- package/dist/{formatter-CY3KrOEd.d.mts → output/formatter.d.mts} +2 -28
- package/dist/output/formatter.d.mts.map +1 -0
- package/dist/output/formatter.mjs +360 -0
- package/dist/output/formatter.mjs.map +1 -0
- package/dist/output/help.d.mts +18 -0
- package/dist/output/help.d.mts.map +1 -0
- package/dist/output/help.mjs +267 -0
- package/dist/output/help.mjs.map +1 -0
- package/dist/output/output-indicator.d.mts +27 -0
- package/dist/output/output-indicator.d.mts.map +1 -0
- package/dist/output/output-indicator.mjs +54 -0
- package/dist/output/output-indicator.mjs.map +1 -0
- package/dist/output/primitives.d.mts +33 -0
- package/dist/output/primitives.d.mts.map +1 -0
- package/dist/output/primitives.mjs +206 -0
- package/dist/output/primitives.mjs.map +1 -0
- package/dist/output/styling.d.mts +38 -0
- package/dist/output/styling.d.mts.map +1 -0
- package/dist/output/styling.mjs +146 -0
- package/dist/output/styling.mjs.map +1 -0
- package/dist/schema/zod.d.mts +6 -0
- package/dist/schema/zod.d.mts.map +1 -0
- package/dist/schema/zod.mjs +50 -0
- package/dist/schema/zod.mjs.map +1 -0
- package/dist/serve.d.mts +2 -0
- package/dist/serve.mjs +2 -0
- package/dist/test.d.mts +2 -109
- package/dist/test.mjs +1 -115
- package/dist/tracing.d.mts +2 -0
- package/dist/tracing.mjs +2 -0
- package/dist/types/args-meta.d.mts +129 -0
- package/dist/types/args-meta.d.mts.map +1 -0
- package/dist/types/builder.d.mts +212 -0
- package/dist/types/builder.d.mts.map +1 -0
- package/dist/types/command.d.mts +112 -0
- package/dist/types/command.d.mts.map +1 -0
- package/dist/types/index.d.mts +8 -0
- package/dist/types/interceptor.d.mts +232 -0
- package/dist/types/interceptor.d.mts.map +1 -0
- package/dist/types/preferences.d.mts +79 -0
- package/dist/types/preferences.d.mts.map +1 -0
- package/dist/types/result.d.mts +61 -0
- package/dist/types/result.d.mts.map +1 -0
- package/dist/types/schema.d.mts +24 -0
- package/dist/types/schema.d.mts.map +1 -0
- package/dist/util/dotenv.mjs +174 -0
- package/dist/util/dotenv.mjs.map +1 -0
- package/dist/util/shell-utils.mjs +80 -0
- package/dist/util/shell-utils.mjs.map +1 -0
- package/dist/util/stream.d.mts +33 -0
- package/dist/util/stream.d.mts.map +1 -0
- package/dist/{stream-DC4H8YTx.mjs → util/stream.mjs} +2 -2
- package/dist/util/stream.mjs.map +1 -0
- package/dist/util/type-helpers.d.mts +74 -0
- package/dist/util/type-helpers.d.mts.map +1 -0
- package/dist/util/type-utils.d.mts +186 -0
- package/dist/util/type-utils.d.mts.map +1 -0
- package/dist/util/utils.mjs +43 -0
- package/dist/util/utils.mjs.map +1 -0
- package/dist/zod.d.mts +1 -32
- package/dist/zod.mjs +1 -49
- package/package.json +65 -17
- package/src/completion.ts +2 -0
- package/src/core/args.ts +63 -37
- package/src/core/runtime.ts +11 -2
- package/src/extension/completion.ts +3 -0
- package/src/extension/index.ts +0 -12
- package/src/extension/ink.ts +2 -1
- package/src/extension/man.ts +3 -0
- package/src/extension/mcp.ts +3 -0
- package/src/extension/progress-renderer.ts +32 -8
- package/src/extension/progress.ts +19 -9
- package/src/extension/serve.ts +3 -0
- package/src/extension/tracing.ts +2 -0
- package/src/index.ts +1 -20
- package/src/ink.ts +2 -0
- package/src/man.ts +2 -0
- package/src/mcp.ts +3 -0
- package/src/serve.ts +2 -0
- package/src/tracing.ts +9 -0
- package/src/types/builder.ts +2 -2
- package/src/zod.ts +1 -1
- package/dist/args-DrCXxXeP.mjs.map +0 -1
- package/dist/codegen/index.d.mts.map +0 -1
- package/dist/codegen/index.mjs.map +0 -1
- package/dist/commands-DLR0rFgq.mjs.map +0 -1
- package/dist/completion-UnBKfGuk.mjs.map +0 -1
- package/dist/errors-DA4KzK1M.mjs.map +0 -1
- package/dist/formatter-CY3KrOEd.d.mts.map +0 -1
- package/dist/help-B-ZMYyn-.mjs +0 -892
- package/dist/help-B-ZMYyn-.mjs.map +0 -1
- package/dist/index-D-Dpz7l_.d.mts +0 -1427
- package/dist/index-D-Dpz7l_.d.mts.map +0 -1
- package/dist/index.d.mts.map +0 -1
- package/dist/index.mjs.map +0 -1
- package/dist/mcp-D6PdtjIs.mjs.map +0 -1
- package/dist/serve-PaCLsNoD.mjs.map +0 -1
- package/dist/stream-DC4H8YTx.mjs.map +0 -1
- package/dist/test.d.mts.map +0 -1
- package/dist/test.mjs.map +0 -1
- package/dist/update-check-CZ2VqjnV.mjs.map +0 -1
- package/dist/zod.d.mts.map +0 -1
- package/dist/zod.mjs.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { defineInterceptor } from '../core/interceptors.ts';
|
|
2
|
-
import type { PadroneBarConfig,
|
|
2
|
+
import type { PadroneBarConfig, PadroneProgress, PadroneProgressOptions, PadroneSpinnerConfig } from '../core/runtime.ts';
|
|
3
3
|
import type { AnyPadroneBuilder, CommandTypesBase } from '../types/index.ts';
|
|
4
4
|
import type { WithInterceptor } from '../util/type-utils.ts';
|
|
5
5
|
import type { PadroneProgressRenderer } from './progress-renderer.ts';
|
|
@@ -43,6 +43,8 @@ export type PadroneProgressConfig<TRes = unknown> = {
|
|
|
43
43
|
* Defaults to the built-in terminal renderer (`createTerminalProgress`).
|
|
44
44
|
*/
|
|
45
45
|
renderer?: PadroneProgressRenderer;
|
|
46
|
+
/** Suppress all progress output. The `progress` interface is still provided on the context as a no-op. */
|
|
47
|
+
silent?: boolean;
|
|
46
48
|
};
|
|
47
49
|
|
|
48
50
|
/**
|
|
@@ -52,17 +54,19 @@ export type PadroneProgressConfig<TRes = unknown> = {
|
|
|
52
54
|
*
|
|
53
55
|
* Provide via context as `{ progressConfig: PadroneProgressDefaults }`.
|
|
54
56
|
*/
|
|
55
|
-
export type PadroneProgressDefaults = Pick<PadroneProgressConfig, 'message' | 'spinner' | 'bar' | 'time' | 'eta' | 'renderer'>;
|
|
57
|
+
export type PadroneProgressDefaults = Pick<PadroneProgressConfig, 'message' | 'spinner' | 'bar' | 'time' | 'eta' | 'renderer' | 'silent'>;
|
|
56
58
|
|
|
57
|
-
/** Builder/program type after applying `padroneProgress()`. Adds `{ progress:
|
|
58
|
-
export type WithProgress<T> = WithInterceptor<T, { progress:
|
|
59
|
+
/** Builder/program type after applying `padroneProgress()`. Adds `{ progress: PadroneProgress }` to the command context. */
|
|
60
|
+
export type WithProgress<T> = WithInterceptor<T, { progress: PadroneProgress }>;
|
|
59
61
|
|
|
60
62
|
// ---------------------------------------------------------------------------
|
|
61
63
|
// Internal helpers
|
|
62
64
|
// ---------------------------------------------------------------------------
|
|
63
65
|
|
|
64
|
-
const
|
|
66
|
+
const noopEta = { start() {}, stop() {}, reset() {} };
|
|
67
|
+
const noopIndicator: PadroneProgress = {
|
|
65
68
|
update() {},
|
|
69
|
+
eta: noopEta,
|
|
66
70
|
succeed() {},
|
|
67
71
|
fail() {},
|
|
68
72
|
stop() {},
|
|
@@ -82,7 +86,7 @@ function resolveMessage(field: unknown, value: unknown, fallback?: string): { me
|
|
|
82
86
|
}
|
|
83
87
|
|
|
84
88
|
function cleanup(
|
|
85
|
-
indicator:
|
|
89
|
+
indicator: PadroneProgress,
|
|
86
90
|
successConfig: unknown,
|
|
87
91
|
errorConfig: unknown,
|
|
88
92
|
error: unknown,
|
|
@@ -146,20 +150,23 @@ function progressInterceptor(config: string | PadroneProgressConfig) {
|
|
|
146
150
|
const rawRenderer = isObj ? config.renderer : undefined;
|
|
147
151
|
const rawTime = isObj ? config.time : undefined;
|
|
148
152
|
const rawEta = isObj ? config.eta : undefined;
|
|
153
|
+
const rawSilent = isObj ? config.silent : undefined;
|
|
149
154
|
|
|
150
155
|
return defineInterceptor({ id: 'padrone:progress', name: 'padrone:progress' })
|
|
151
156
|
.requires<{ progressConfig?: PadroneProgressDefaults }>()
|
|
152
157
|
.factory(() => {
|
|
153
|
-
let indicator:
|
|
158
|
+
let indicator: PadroneProgress | undefined;
|
|
154
159
|
let restoreOutput: (() => void) | undefined;
|
|
155
160
|
// Lazily resolved from context + constructor args
|
|
156
161
|
let resolvedRenderer: PadroneProgressRenderer | undefined;
|
|
157
162
|
let resolvedOptions: PadroneProgressOptions | undefined;
|
|
163
|
+
let resolvedSilent = false;
|
|
158
164
|
let msgs: ReturnType<typeof resolveMessages> | undefined;
|
|
159
165
|
|
|
160
166
|
function resolve(ctx: { context?: { progressConfig?: PadroneProgressDefaults } }) {
|
|
161
167
|
if (resolvedRenderer) return;
|
|
162
168
|
const ctxCfg = (ctx.context as Record<string, unknown> | undefined)?.progressConfig as PadroneProgressDefaults | undefined;
|
|
169
|
+
resolvedSilent = rawSilent ?? ctxCfg?.silent ?? false;
|
|
163
170
|
const spinner = rawSpinner ?? ctxCfg?.spinner;
|
|
164
171
|
const bar = rawBar ?? ctxCfg?.bar;
|
|
165
172
|
const time = rawTime ?? ctxCfg?.time;
|
|
@@ -179,6 +186,7 @@ function progressInterceptor(config: string | PadroneProgressConfig) {
|
|
|
179
186
|
return {
|
|
180
187
|
validate(ctx, next) {
|
|
181
188
|
resolve(ctx);
|
|
189
|
+
if (resolvedSilent) return next();
|
|
182
190
|
indicator = resolvedRenderer!(msgs!.validation || msgs!.progress, resolvedOptions);
|
|
183
191
|
|
|
184
192
|
const originalOutput = ctx.runtime.output;
|
|
@@ -227,6 +235,8 @@ function progressInterceptor(config: string | PadroneProgressConfig) {
|
|
|
227
235
|
},
|
|
228
236
|
|
|
229
237
|
execute(_ctx, next) {
|
|
238
|
+
if (resolvedSilent) return next({ context: { progress: noopIndicator } });
|
|
239
|
+
|
|
230
240
|
// Transition from validation message to progress message
|
|
231
241
|
if (indicator && msgs!.validation) indicator.update(msgs!.progress);
|
|
232
242
|
|
|
@@ -295,7 +305,7 @@ function progressInterceptor(config: string | PadroneProgressConfig) {
|
|
|
295
305
|
},
|
|
296
306
|
};
|
|
297
307
|
})
|
|
298
|
-
.provides<{ progress:
|
|
308
|
+
.provides<{ progress: PadroneProgress }>();
|
|
299
309
|
}
|
|
300
310
|
|
|
301
311
|
// ---------------------------------------------------------------------------
|
|
@@ -311,7 +321,7 @@ function progressInterceptor(config: string | PadroneProgressConfig) {
|
|
|
311
321
|
* The indicator is automatically started before validation, updated at each phase transition,
|
|
312
322
|
* and stopped on success (`.succeed()`) or failure (`.fail()`).
|
|
313
323
|
*
|
|
314
|
-
* Provides `{ progress:
|
|
324
|
+
* Provides `{ progress: PadroneProgress }` on the command context.
|
|
315
325
|
* Access it in action handlers as `ctx.context.progress`.
|
|
316
326
|
*
|
|
317
327
|
* Uses the built-in terminal renderer by default. Pass a custom `renderer` for non-terminal
|
package/src/extension/serve.ts
CHANGED
|
@@ -21,6 +21,9 @@ export type WithServe<T> = WithCommand<T, 'serve', ServeCommand>;
|
|
|
21
21
|
*
|
|
22
22
|
* Usage:
|
|
23
23
|
* ```ts
|
|
24
|
+
* import { createPadrone } from 'padrone';
|
|
25
|
+
* import { padroneServe } from 'padrone/serve';
|
|
26
|
+
*
|
|
24
27
|
* createPadrone('my-cli').extend(padroneServe())
|
|
25
28
|
* ```
|
|
26
29
|
*/
|
package/src/extension/tracing.ts
CHANGED
|
@@ -152,6 +152,8 @@ function tracingInterceptor(config: ResolvedTracingConfig) {
|
|
|
152
152
|
* Usage:
|
|
153
153
|
* ```ts
|
|
154
154
|
* import { trace } from '@opentelemetry/api';
|
|
155
|
+
* import { createPadrone, padroneLogger } from 'padrone';
|
|
156
|
+
* import { padroneTracing } from 'padrone/tracing';
|
|
155
157
|
*
|
|
156
158
|
* createPadrone('my-cli')
|
|
157
159
|
* .extend(padroneTracing({ provider: trace.getTracerProvider() }))
|
package/src/index.ts
CHANGED
|
@@ -11,7 +11,7 @@ export type {
|
|
|
11
11
|
PadroneBarAnimation,
|
|
12
12
|
PadroneBarChar,
|
|
13
13
|
PadroneBarConfig,
|
|
14
|
-
|
|
14
|
+
PadroneProgress,
|
|
15
15
|
PadroneProgressOptions,
|
|
16
16
|
PadroneProgressShow,
|
|
17
17
|
PadroneProgressUpdate,
|
|
@@ -23,10 +23,6 @@ export type {
|
|
|
23
23
|
export { REPL_SIGINT } from './core/runtime.ts';
|
|
24
24
|
export type {
|
|
25
25
|
HelpCommand,
|
|
26
|
-
InkOptions,
|
|
27
|
-
OtelSpan,
|
|
28
|
-
OtelTracer,
|
|
29
|
-
OtelTracerProvider,
|
|
30
26
|
PadroneLogger,
|
|
31
27
|
PadroneLoggerConfig,
|
|
32
28
|
PadroneLogLevel,
|
|
@@ -35,47 +31,32 @@ export type {
|
|
|
35
31
|
PadroneProgressMessage,
|
|
36
32
|
PadroneProgressMessages,
|
|
37
33
|
PadroneProgressRenderer,
|
|
38
|
-
PadroneTracer,
|
|
39
|
-
PadroneTracingConfig,
|
|
40
34
|
VersionCommand,
|
|
41
35
|
WithAsync,
|
|
42
|
-
WithCompletion,
|
|
43
36
|
WithHelp,
|
|
44
37
|
WithLogger,
|
|
45
|
-
WithMan,
|
|
46
|
-
WithMcp,
|
|
47
38
|
WithProgress,
|
|
48
39
|
WithRepl,
|
|
49
|
-
WithServe,
|
|
50
|
-
WithTracing,
|
|
51
40
|
WithVersion,
|
|
52
41
|
} from './extension/index.ts';
|
|
53
42
|
export {
|
|
54
43
|
createTerminalProgress,
|
|
55
|
-
isReactElement,
|
|
56
44
|
padroneAutoOutput,
|
|
57
45
|
padroneColor,
|
|
58
|
-
padroneCompletion,
|
|
59
46
|
padroneConfig,
|
|
60
47
|
padroneEnv,
|
|
61
48
|
padroneHelp,
|
|
62
|
-
padroneInk,
|
|
63
49
|
padroneInteractive,
|
|
64
50
|
padroneLogger,
|
|
65
|
-
padroneMan,
|
|
66
|
-
padroneMcp,
|
|
67
51
|
padroneProgress,
|
|
68
52
|
padroneRepl,
|
|
69
|
-
padroneServe,
|
|
70
53
|
padroneSignalHandling,
|
|
71
54
|
padroneStdin,
|
|
72
55
|
padroneSuggestions,
|
|
73
56
|
padroneTiming,
|
|
74
|
-
padroneTracing,
|
|
75
57
|
padroneUpdateCheck,
|
|
76
58
|
padroneVersion,
|
|
77
59
|
} from './extension/index.ts';
|
|
78
|
-
export type { PadroneMcpPreferences } from './feature/mcp.ts';
|
|
79
60
|
export type { UpdateCheckConfig } from './feature/update-check.ts';
|
|
80
61
|
export type { WrapConfig, WrapResult } from './feature/wrap.ts';
|
|
81
62
|
export type { AnsiStyle, ColorConfig, ColorTheme } from './output/colorizer.ts';
|
package/src/ink.ts
ADDED
package/src/man.ts
ADDED
package/src/mcp.ts
ADDED
package/src/serve.ts
ADDED
package/src/tracing.ts
ADDED
package/src/types/builder.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { StandardSchemaV1 } from '@standard-schema/spec';
|
|
2
2
|
import type { Tool } from 'ai';
|
|
3
|
-
import type {
|
|
3
|
+
import type { PadroneProgress, PadroneRuntime } from '../core/runtime.ts';
|
|
4
4
|
import type { PadroneLogger } from '../extension/logger.ts';
|
|
5
5
|
import type { PadroneTracer } from '../extension/tracing.ts';
|
|
6
6
|
import type { PadroneMcpPreferences } from '../feature/mcp.ts';
|
|
@@ -768,7 +768,7 @@ export type PadroneExtension<TIn extends CommandTypesBase = CommandTypesBase, TO
|
|
|
768
768
|
export interface DefineCommandContext {
|
|
769
769
|
logger?: PadroneLogger;
|
|
770
770
|
tracing?: PadroneTracer;
|
|
771
|
-
progress?:
|
|
771
|
+
progress?: PadroneProgress;
|
|
772
772
|
}
|
|
773
773
|
|
|
774
774
|
/** Error brand returned by `.command()` when a `defineCommand.requires()` context requirement is not satisfied. */
|
package/src/zod.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export
|
|
1
|
+
export * from './schema/zod.ts';
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"args-DrCXxXeP.mjs","names":[],"sources":["../src/util/shell-utils.ts","../src/core/args.ts"],"sourcesContent":["/**\n * Convert a camelCase string to kebab-case.\n * Returns null if the string has no uppercase letters (no conversion needed).\n */\nexport function camelToKebab(str: string): string | null {\n if (!/[A-Z]/.test(str)) return null;\n return str.replace(/[A-Z]/g, (ch) => `-${ch.toLowerCase()}`);\n}\n\nexport type ShellType = 'bash' | 'zsh' | 'fish' | 'powershell';\n\n/**\n * Detects the current shell from environment variables and process info.\n * @returns The detected shell type, or undefined if unknown\n */\nexport async function detectShell(): Promise<ShellType | undefined> {\n if (typeof process === 'undefined') return undefined;\n\n // Method 1: Check SHELL environment variable (most common)\n const shellEnv = process.env.SHELL || '';\n if (shellEnv.includes('zsh')) return 'zsh';\n if (shellEnv.includes('bash')) return 'bash';\n if (shellEnv.includes('fish')) return 'fish';\n\n // Method 2: Check Windows-specific shells\n if (process.env.PSModulePath || process.env.POWERSHELL_DISTRIBUTION_CHANNEL) {\n return 'powershell';\n }\n\n // Method 3: Check parent process on Unix-like systems\n try {\n const ppid = process.ppid;\n if (ppid) {\n const { execSync } = (await import('node:child_process')) as typeof import('node:child_process');\n const processName = execSync(`ps -p ${ppid} -o comm=`, {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'ignore'],\n }).trim();\n\n if (processName.includes('zsh')) return 'zsh';\n if (processName.includes('bash')) return 'bash';\n if (processName.includes('fish')) return 'fish';\n }\n } catch {\n // Ignore errors (e.g., ps not available)\n }\n\n return undefined;\n}\n\nexport async function getRcFile(shell: ShellType, home?: string): Promise<string | null> {\n const { homedir } = await import('node:os');\n const { join } = await import('node:path');\n const h = home ?? homedir();\n switch (shell) {\n case 'bash':\n return join(h, '.bashrc');\n case 'zsh':\n return join(h, '.zshrc');\n case 'fish':\n return join(h, '.config', 'fish', 'config.fish');\n case 'powershell':\n return (\n (typeof process !== 'undefined' ? process.env.PROFILE : undefined) ||\n join(h, 'Documents', 'PowerShell', 'Microsoft.PowerShell_profile.ps1')\n );\n default:\n return null;\n }\n}\n\nexport function escapeRegExp(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Writes a snippet to a shell config file using begin/end markers for idempotency.\n * If a block with the same begin marker exists, it is replaced. Otherwise the snippet is appended.\n */\nexport async function writeToRcFile(\n rcFile: string,\n snippet: string,\n beginMarker: string,\n endMarker: string,\n): Promise<{ file: string; updated: boolean }> {\n const { existsSync, mkdirSync, readFileSync, writeFileSync } = await import('node:fs');\n const { dirname } = await import('node:path');\n const existing = existsSync(rcFile) ? readFileSync(rcFile, 'utf-8') : '';\n\n if (existing.includes(beginMarker)) {\n const pattern = new RegExp(`${escapeRegExp(beginMarker)}[\\\\s\\\\S]*?${escapeRegExp(endMarker)}`);\n writeFileSync(rcFile, existing.replace(pattern, snippet));\n return { file: rcFile, updated: true };\n }\n\n mkdirSync(dirname(rcFile), { recursive: true });\n const separator = existing.length > 0 && !existing.endsWith('\\n') ? '\\n' : '';\n writeFileSync(rcFile, `${existing}${separator}\\n${snippet}\\n`);\n return { file: rcFile, updated: false };\n}\n","import type { StandardJSONSchemaV1, StandardSchemaV1 } from '@standard-schema/spec';\nimport type { PadroneFieldMeta } from '../types/args-meta.ts';\nimport { camelToKebab } from '../util/shell-utils.ts';\nimport { asyncStreamRegistry } from '../util/stream.ts';\n\nexport type { PadroneArgsSchemaMeta, PadroneFieldMeta, SingleChar, StdinConfig } from '../types/args-meta.ts';\n\n/** Extract the JSON schema from a Standard Schema, returning it as a plain record. */\nexport function getJsonSchema(schema: StandardJSONSchemaV1): Record<string, any> {\n return schema['~standard'].jsonSchema.input({\n target: 'draft-2020-12',\n libraryOptions: { unrepresentable: 'any' },\n }) as Record<string, any>;\n}\n\nfunction getFieldJsonSchema(schema: StandardJSONSchemaV1 | undefined, field: string): Record<string, any> | undefined {\n if (!schema) return undefined;\n try {\n const jsonSchema = getJsonSchema(schema);\n if (jsonSchema.type === 'object' && jsonSchema.properties) return jsonSchema.properties[field];\n } catch {}\n return undefined;\n}\n\n/**\n * Checks if a field in the schema is an array type (e.g. `z.string().array()`).\n */\nexport function isArrayField(schema: StandardJSONSchemaV1 | undefined, field: string): boolean {\n return getFieldJsonSchema(schema, field)?.type === 'array';\n}\n\n/**\n * Checks if a field is an async stream (marked with `asyncStream()` metadata).\n * Returns the item schema if provided, or `true` if it's a plain string stream.\n */\nexport function isAsyncStreamField(schema: StandardJSONSchemaV1 | undefined, field: string): { itemSchema?: StandardSchemaV1 } | false {\n const prop = getFieldJsonSchema(schema, field);\n const asyncStreamId = prop?.asyncStream;\n if (asyncStreamId && asyncStreamRegistry.has(asyncStreamId)) {\n const meta = asyncStreamRegistry.get(asyncStreamId);\n return { itemSchema: meta?.itemSchema };\n }\n\n return false;\n}\n\n/**\n * Parse positional configuration to extract names and variadic info.\n */\nexport function parsePositionalConfig(positional: readonly string[]): { name: string; variadic: boolean }[] {\n return positional.map((p) => {\n const variadic = p.startsWith('...');\n const name = variadic ? p.slice(3) : p;\n return { name, variadic };\n });\n}\n\n/**\n * Result type for extractSchemaMetadata function.\n */\ninterface SchemaMetadataResult {\n /** Single-char flags: maps flag char → full arg name (e.g. `{ v: 'verbose' }`) */\n flags: Record<string, string>;\n /** Multi-char aliases: maps alias → full arg name (e.g. `{ 'dry-run': 'dryRun' }`) */\n aliases: Record<string, string>;\n /** Negative keywords: maps keyword → target arg name (e.g. `{ remote: 'local' }`) */\n negatives: Record<string, string>;\n /** Args that have custom negation set (even if empty), disabling the `--no-` prefix */\n customNegation: Set<string>;\n}\n\nfunction addEntries(target: Record<string, string>, key: string, items: string | readonly string[], filter?: (item: string) => boolean) {\n const list = typeof items === 'string' ? [items] : items;\n for (const item of list) {\n if (typeof item === 'string' && item && item !== key && !(item in target) && (!filter || filter(item))) {\n target[item] = key;\n }\n }\n}\n\n/**\n * Extract all arg metadata from schema and meta in a single pass.\n * Returns flags (single-char, stackable) and aliases (multi-char, long names) separately.\n * When `autoAlias` is true (default), camelCase property names automatically get kebab-case aliases.\n */\nexport function extractSchemaMetadata(\n schema: StandardJSONSchemaV1,\n meta?: Record<string, PadroneFieldMeta | undefined>,\n autoAlias?: boolean,\n): SchemaMetadataResult {\n const flags: Record<string, string> = {};\n const aliases: Record<string, string> = {};\n const negatives: Record<string, string> = {};\n const customNegation = new Set<string>();\n\n // Extract from meta object\n if (meta) {\n for (const [key, value] of Object.entries(meta)) {\n if (!value) continue;\n\n if (value.flags) {\n addEntries(flags, key, value.flags, (item) => item.length === 1);\n }\n if (value.alias) {\n addEntries(aliases, key, value.alias, (item) => item.length > 1);\n }\n if (value.negative !== undefined) {\n customNegation.add(key);\n addEntries(negatives, key, value.negative);\n }\n }\n }\n\n // Extract from JSON schema properties\n try {\n const jsonSchema = getJsonSchema(schema) as Record<string, any>;\n if (jsonSchema.type === 'object' && jsonSchema.properties) {\n for (const [propertyName, propertySchema] of Object.entries(jsonSchema.properties as Record<string, any>)) {\n if (!propertySchema) continue;\n\n // Extract flags from schema `.meta({ flags: ... })`\n const propFlags = propertySchema.flags;\n if (propFlags) {\n addEntries(flags, propertyName, propFlags, (item) => item.length === 1);\n }\n\n // Extract aliases from schema `.meta({ alias: ... })`\n const propAlias = propertySchema.alias;\n if (propAlias) {\n const list = typeof propAlias === 'string' ? [propAlias] : propAlias;\n if (Array.isArray(list)) {\n addEntries(aliases, propertyName, list, (item) => item.length > 1);\n }\n }\n\n // Extract negative keywords from schema `.meta({ negative: ... })`\n const propNegative = propertySchema.negative;\n if (propNegative !== undefined && !customNegation.has(propertyName)) {\n customNegation.add(propertyName);\n const list = typeof propNegative === 'string' ? [propNegative] : propNegative;\n if (Array.isArray(list)) {\n addEntries(negatives, propertyName, list);\n }\n }\n\n // Auto-generate kebab-case alias for camelCase property names\n if (autoAlias !== false) {\n const kebab = camelToKebab(propertyName);\n if (kebab && !(kebab in aliases)) {\n aliases[kebab] = propertyName;\n }\n }\n }\n }\n } catch {\n // Ignore errors from JSON schema generation\n }\n\n return { flags, aliases, negatives, customNegation };\n}\n\nfunction preprocessMappings(data: Record<string, unknown>, mappings: Record<string, string>): Record<string, unknown> {\n const result = { ...data };\n\n for (const [mappedKey, fullArgName] of Object.entries(mappings)) {\n if (mappedKey in data && mappedKey !== fullArgName) {\n const mappedValue = data[mappedKey];\n // Prefer full arg name if it exists\n if (!(fullArgName in result)) result[fullArgName] = mappedValue;\n delete result[mappedKey];\n }\n }\n\n return result;\n}\n\n/**\n * Apply values to arguments using \"set if not present\" semantics.\n * Existing values take precedence — only fills in undefined or missing keys.\n */\nexport function applyValues(data: Record<string, unknown>, values: Record<string, unknown>): Record<string, unknown> {\n const result = { ...data };\n\n for (const [key, value] of Object.entries(values)) {\n if (key in result && result[key] !== undefined) continue;\n if (value !== undefined) {\n result[key] = value;\n }\n }\n\n return result;\n}\n\n/** Applies flag and alias mappings to raw arguments. */\nexport function preprocessArgs(\n data: Record<string, unknown>,\n ctx: { flags?: Record<string, string>; aliases?: Record<string, string> },\n): Record<string, unknown> {\n let result = { ...data };\n\n if (ctx.flags && Object.keys(ctx.flags).length > 0) {\n result = preprocessMappings(result, ctx.flags);\n }\n if (ctx.aliases && Object.keys(ctx.aliases).length > 0) {\n result = preprocessMappings(result, ctx.aliases);\n }\n\n return result;\n}\n\n/**\n * Auto-coerce CLI string values to match the expected schema types.\n * Handles: string → number, string → boolean for primitive schema fields.\n * Arrays of primitives are also coerced element-wise.\n */\nexport function coerceArgs(data: Record<string, unknown>, schema: StandardJSONSchemaV1): Record<string, unknown> {\n let properties: Record<string, any>;\n try {\n const jsonSchema = getJsonSchema(schema) as Record<string, any>;\n if (jsonSchema.type !== 'object' || !jsonSchema.properties) return data;\n properties = jsonSchema.properties;\n } catch {\n return data;\n }\n\n const result = { ...data };\n\n for (const [key, value] of Object.entries(result)) {\n const prop = properties[key];\n if (!prop) continue;\n\n const targetType = prop.type as string | undefined;\n\n if (targetType === 'number' || targetType === 'integer') {\n if (typeof value === 'string') {\n const num = Number(value);\n if (!Number.isNaN(num)) result[key] = num;\n }\n } else if (targetType === 'boolean') {\n if (typeof value === 'string') {\n const lower = value.toLowerCase();\n if (lower === 'true' || lower === '1' || lower === 'yes' || lower === 'on') result[key] = true;\n else if (lower === 'false' || lower === '0' || lower === 'no' || lower === 'off') result[key] = false;\n }\n } else if (targetType === 'array') {\n // Coerce single items to array\n const arr = Array.isArray(value) ? value : [value];\n const itemType = prop.items?.type as string | undefined;\n if (itemType === 'number' || itemType === 'integer') {\n result[key] = arr.map((v) => {\n if (typeof v === 'string') {\n const num = Number(v);\n return Number.isNaN(num) ? v : num;\n }\n return v;\n });\n } else if (itemType === 'boolean') {\n result[key] = arr.map((v) => {\n if (typeof v === 'string') {\n const lower = v.toLowerCase();\n if (lower === 'true' || lower === '1' || lower === 'yes' || lower === 'on') return true;\n if (lower === 'false' || lower === '0' || lower === 'no' || lower === 'off') return false;\n }\n return v;\n });\n } else if (!Array.isArray(value)) {\n result[key] = arr;\n }\n }\n }\n\n return result;\n}\n\n/**\n * Detect unknown keys in the args that don't match any schema property.\n * Returns an array of { key } for each unknown key.\n * Framework-reserved keys (--config, -c) are always allowed.\n */\nexport function detectUnknownArgs(\n data: Record<string, unknown>,\n schema: StandardJSONSchemaV1,\n flags: Record<string, string>,\n aliases: Record<string, string>,\n negatives?: Record<string, string>,\n): { key: string }[] {\n let properties: Record<string, any>;\n let isLoose = false;\n try {\n const jsonSchema = getJsonSchema(schema) as Record<string, any>;\n if (jsonSchema.type !== 'object' || !jsonSchema.properties) return [];\n properties = jsonSchema.properties;\n // If additionalProperties is set (true, {}, or a schema), the schema allows extra keys\n if (jsonSchema.additionalProperties !== undefined && jsonSchema.additionalProperties !== false) isLoose = true;\n } catch {\n return [];\n }\n\n if (isLoose) return [];\n\n const knownKeys = new Set<string>([\n ...Object.keys(properties),\n ...Object.keys(flags),\n ...Object.values(flags),\n ...Object.keys(aliases),\n ...Object.values(aliases),\n ...(negatives ? Object.keys(negatives) : []),\n ...(negatives ? Object.values(negatives) : []),\n ]);\n const unknowns: { key: string }[] = [];\n\n for (const key of Object.keys(data)) {\n if (!knownKeys.has(key)) {\n unknowns.push({ key });\n }\n }\n\n return unknowns;\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
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/bash.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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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["JS_RESERVED"],"sources":["../../src/codegen/code-builder.ts","../../src/codegen/parsers/bash.ts","../../src/codegen/parsers/fish.ts","../../src/codegen/parsers/help.ts","../../src/codegen/parsers/merge.ts","../../src/codegen/parsers/zsh.ts","../../src/codegen/discovery.ts","../../src/codegen/file-emitter.ts","../../src/codegen/generators/barrel-file.ts","../../src/codegen/schema-to-code.ts","../../src/codegen/generators/command-file.ts","../../src/codegen/generators/command-tree.ts","../../src/codegen/template.ts"],"sourcesContent":["import type { CodeBuilder, CodeBuildResult } from './types.ts';\n\ninterface ImportEntry {\n specifiers: Set<string>;\n defaultSpecifier?: string;\n typeOnly: boolean;\n}\n\ninterface CodeLine {\n type: 'line' | 'raw' | 'block-open' | 'block-close';\n content: string;\n}\n\nclass CodeBuilderImpl implements CodeBuilder {\n private imports = new Map<string, ImportEntry>();\n private lines: CodeLine[] = [];\n private indent: number;\n\n constructor(indent = 0) {\n this.indent = indent;\n }\n\n import(specifier: string | string[], source: string): CodeBuilder {\n const specs = Array.isArray(specifier) ? specifier : [specifier];\n const existing = this.imports.get(source);\n if (existing) {\n for (const s of specs) existing.specifiers.add(s);\n // If we're adding a value import and existing was type-only, downgrade to value\n existing.typeOnly = false;\n } else {\n this.imports.set(source, { specifiers: new Set(specs), typeOnly: false });\n }\n return this;\n }\n\n importDefault(name: string, source: string): CodeBuilder {\n const existing = this.imports.get(source);\n if (existing) {\n existing.defaultSpecifier = name;\n existing.typeOnly = false;\n } else {\n this.imports.set(source, { specifiers: new Set(), defaultSpecifier: name, typeOnly: false });\n }\n return this;\n }\n\n importType(specifier: string | string[], source: string): CodeBuilder {\n const specs = Array.isArray(specifier) ? specifier : [specifier];\n const existing = this.imports.get(source);\n if (existing) {\n for (const s of specs) existing.specifiers.add(s);\n // Don't downgrade: if existing is value import, keep it as value\n } else {\n this.imports.set(source, { specifiers: new Set(specs), typeOnly: true });\n }\n return this;\n }\n\n line(code?: string): CodeBuilder {\n this.lines.push({ type: 'line', content: code ?? '' });\n return this;\n }\n\n block(\n openOrBuilder: string | ((b: CodeBuilder) => CodeBuilder),\n builderOrClose?: string | ((b: CodeBuilder) => CodeBuilder),\n closeOrBuilder?: string | ((b: CodeBuilder) => CodeBuilder),\n ): CodeBuilder {\n let open: string | undefined;\n let close: string | undefined;\n let builder: (b: CodeBuilder) => CodeBuilder;\n\n if (typeof openOrBuilder === 'function') {\n // block(builder)\n builder = openOrBuilder;\n } else if (typeof builderOrClose === 'function') {\n // block(open, builder, close?)\n open = openOrBuilder;\n builder = builderOrClose;\n close = typeof closeOrBuilder === 'string' ? closeOrBuilder : undefined;\n } else if (typeof closeOrBuilder === 'function') {\n // block(open, close, builder)\n open = openOrBuilder;\n close = typeof builderOrClose === 'string' ? builderOrClose : undefined;\n builder = closeOrBuilder;\n } else {\n throw new Error('Invalid block() arguments');\n }\n\n // Always push block-open to increment indent\n this.lines.push({ type: 'block-open', content: open ?? '' });\n\n const inner = new CodeBuilderImpl(this.indent + 1);\n builder(inner);\n\n // Merge inner imports into ours\n for (const [source, entry] of inner.imports) {\n const existing = this.imports.get(source);\n if (existing) {\n for (const s of entry.specifiers) existing.specifiers.add(s);\n if (entry.defaultSpecifier) existing.defaultSpecifier = entry.defaultSpecifier;\n if (!entry.typeOnly) existing.typeOnly = false;\n } else {\n this.imports.set(source, {\n specifiers: new Set(entry.specifiers),\n defaultSpecifier: entry.defaultSpecifier,\n typeOnly: entry.typeOnly,\n });\n }\n }\n\n // Merge inner lines with extra indentation\n for (const line of inner.lines) {\n this.lines.push(line);\n }\n\n // Always push block-close to decrement indent\n this.lines.push({ type: 'block-close', content: close ?? '' });\n\n return this;\n }\n\n comment(text: string): CodeBuilder {\n this.lines.push({ type: 'line', content: `// ${text}` });\n return this;\n }\n\n docComment(text: string): CodeBuilder {\n const lines = text.split('\\n');\n if (lines.length === 1) {\n this.lines.push({ type: 'line', content: `/** ${text} */` });\n } else {\n this.lines.push({ type: 'line', content: '/**' });\n for (const line of lines) {\n this.lines.push({ type: 'line', content: ` * ${line}` });\n }\n this.lines.push({ type: 'line', content: ' */' });\n }\n return this;\n }\n\n todoComment(text: string): CodeBuilder {\n this.lines.push({ type: 'line', content: `// TODO: ${text}` });\n return this;\n }\n\n raw(code: string): CodeBuilder {\n this.lines.push({ type: 'raw', content: code });\n return this;\n }\n\n build(): CodeBuildResult {\n const parts: string[] = [];\n\n // Emit imports first\n if (this.imports.size > 0) {\n const typeImports: string[] = [];\n const valueImports: string[] = [];\n\n for (const [source, entry] of this.imports) {\n const specs = [...entry.specifiers].sort();\n const namedPart =\n specs.length > 0 ? (specs.length === 1 && !specs[0]!.includes(' ') ? `{ ${specs[0]} }` : `{ ${specs.join(', ')} }`) : null;\n const specStr = entry.defaultSpecifier\n ? namedPart\n ? `${entry.defaultSpecifier}, ${namedPart}`\n : entry.defaultSpecifier\n : namedPart!;\n\n const line = entry.typeOnly ? `import type ${specStr} from '${source}'` : `import ${specStr} from '${source}'`;\n\n if (entry.typeOnly) {\n typeImports.push(line);\n } else {\n valueImports.push(line);\n }\n }\n\n // Value imports first, then type imports\n parts.push([...valueImports, ...typeImports].join('\\n'));\n parts.push('');\n }\n\n // Emit code lines\n let currentIndent = this.indent;\n for (const line of this.lines) {\n if (line.type === 'raw') {\n parts.push(line.content);\n } else if (line.type === 'block-open') {\n if (line.content) {\n const indent = ' '.repeat(currentIndent);\n parts.push(`${indent}${line.content}`);\n }\n currentIndent++;\n } else if (line.type === 'block-close') {\n currentIndent--;\n if (line.content) {\n const indent = ' '.repeat(currentIndent);\n parts.push(`${indent}${line.content}`);\n }\n } else {\n // Regular line\n if (line.content === '') {\n parts.push('');\n } else {\n const indent = ' '.repeat(currentIndent);\n parts.push(`${indent}${line.content}`);\n }\n }\n }\n\n return {\n text: parts.join('\\n'),\n imports: new Map(\n [...this.imports].map(([source, entry]) => [source, { specifiers: new Set(entry.specifiers), typeOnly: entry.typeOnly }]),\n ),\n };\n }\n}\n\n/**\n * Create a new CodeBuilder for constructing TypeScript source files.\n */\nexport function createCodeBuilder(): CodeBuilder {\n return new CodeBuilderImpl();\n}\n","import type { CommandMeta, FieldMeta } from '../types.ts';\n\n/**\n * Parse bash completion scripts into CommandMeta.\n *\n * Bash completions typically use `complete -F <func> <command>` and define\n * a function that sets COMPREPLY. Common patterns:\n *\n * local commands=\"init build deploy\"\n * local args=\"--verbose --output --format\"\n * case \"$prev\" in --format) COMPREPLY=($(compgen -W \"json yaml toml\" ...)) ;;\n * COMPREPLY=($(compgen -W \"$commands\" ...))\n * COMPREPLY=($(compgen -W \"$args\" ...))\n */\nexport function parseBashCompletions(text: string): CommandMeta {\n const result: CommandMeta = {\n name: '',\n arguments: [],\n subcommands: [],\n };\n\n // Detect command name from `complete -F _func <command>` or `complete -o ... -F _func <command>`\n const completeMatch = text.match(/complete\\s+(?:[^-]|-[^F])*-F\\s+\\S+\\s+(\\S+)/);\n if (completeMatch) {\n result.name = completeMatch[1]!;\n }\n\n // Fallback: detect from marker comments like ###-begin-<name>-completion-###\n if (!result.name) {\n const markerMatch = text.match(/###-begin-(\\S+)-completion-###/);\n if (markerMatch) {\n result.name = markerMatch[1]!;\n }\n }\n\n // Join continuation lines for easier parsing\n const joined = text.replace(/\\\\\\n\\s*/g, ' ');\n\n // Collect variable values: local commands=\"...\" or local args=\"...\"\n const variables = extractVariables(joined);\n\n // Extract subcommand names from commands variable or compgen -W \"cmd1 cmd2\"\n const commandWords = variables.get('commands') ?? variables.get('cmds') ?? variables.get('subcommands');\n if (commandWords) {\n for (const name of splitWords(commandWords)) {\n result.subcommands!.push({ name });\n }\n }\n\n // Extract option names from args/opts/options variable\n const argWords = variables.get('args') ?? variables.get('opts') ?? variables.get('options') ?? variables.get('flags');\n const optionNames = new Set<string>();\n\n if (argWords) {\n for (const word of splitWords(argWords)) {\n if (word.startsWith('-')) {\n optionNames.add(word);\n }\n }\n }\n\n // Also scan for compgen -W patterns not tied to a case statement\n const compgenRegex = /compgen\\s+-W\\s+[\"']([^\"']+)[\"']/g;\n let compgenMatch: RegExpExecArray | null;\n while ((compgenMatch = compgenRegex.exec(joined)) !== null) {\n // Skip variable references like $args, $commands\n if (compgenMatch[1]!.startsWith('$')) continue;\n for (const word of splitWords(compgenMatch[1]!)) {\n if (word.startsWith('-')) {\n optionNames.add(word);\n }\n }\n }\n\n // Parse case statement for option value completions (enum detection)\n const enumMap = parseCaseStatement(joined);\n\n // Build argument fields\n const seenArgs = new Set<string>();\n\n for (const rawName of optionNames) {\n // Skip builtins\n if (rawName === '--help' || rawName === '-h' || rawName === '--version' || rawName === '-V') continue;\n\n const name = rawName.replace(/^-+/, '').replace(/-([a-z])/g, (_, c: string) => c.toUpperCase());\n if (!name || seenArgs.has(name)) continue;\n seenArgs.add(name);\n\n // Check if this option has enum values from case statement\n const enumValues = enumMap.get(rawName);\n\n const isShort = rawName.startsWith('-') && !rawName.startsWith('--') && rawName.length === 2;\n const field: FieldMeta = {\n name,\n type: enumValues ? 'enum' : 'string',\n enumValues,\n ambiguous: !enumValues,\n };\n\n // If there's a corresponding long-form, record alias\n if (isShort) {\n field.aliases = [rawName];\n }\n\n result.arguments!.push(field);\n }\n\n if (result.arguments!.length === 0) delete result.arguments;\n if (result.subcommands!.length === 0) delete result.subcommands;\n\n return result;\n}\n\n/**\n * Extract variable assignments: `local VAR=\"value\"`, `VAR=\"value\"`, `local VAR='value'`\n */\nfunction extractVariables(text: string): Map<string, string> {\n const vars = new Map<string, string>();\n const regex = /(?:local\\s+)?(\\w+)=[\"']([^\"']+)[\"']/g;\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(text)) !== null) {\n vars.set(match[1]!, match[2]!);\n }\n\n return vars;\n}\n\n/**\n * Parse case statements to find option → enum value mappings.\n *\n * Matches patterns like:\n * case \"$prev\" in\n * --format) COMPREPLY=($(compgen -W \"json yaml toml\" ...)) ;;\n * --env|--environment) COMPREPLY=($(compgen -W \"dev staging prod\" ...)) ;;\n */\nfunction parseCaseStatement(text: string): Map<string, string[]> {\n const result = new Map<string, string[]>();\n\n // Find case blocks on $prev or similar variables\n const caseRegex = /case\\s+[^i]*\\bin\\b\\s*([\\s\\S]*?)esac/g;\n let caseMatch: RegExpExecArray | null;\n\n while ((caseMatch = caseRegex.exec(text)) !== null) {\n const body = caseMatch[1]!;\n\n // Split into branches by ;; delimiter\n const branches = body.split(';;');\n for (const branch of branches) {\n // Match pattern: --opt1|--opt2) ... compgen -W \"values\" ...\n const patternMatch = branch.match(/^\\s*([-\\w|]+)\\)/);\n if (!patternMatch) continue;\n\n // Find compgen -W \"values\" within this branch\n const compgenMatch = branch.match(/compgen\\s+-W\\s+[\"']([^\"']+)[\"']/);\n if (!compgenMatch) continue;\n\n const values = compgenMatch[1]!;\n const words = splitWords(values).filter((w) => !w.startsWith('$'));\n if (words.length === 0) continue;\n\n for (const pattern of patternMatch[1]!.split('|')) {\n const trimmed = pattern.trim();\n if (trimmed.startsWith('-')) {\n result.set(trimmed, words);\n }\n }\n }\n }\n\n return result;\n}\n\n/**\n * Split a space-separated word list, filtering empty strings.\n */\nfunction splitWords(text: string): string[] {\n return text.split(/\\s+/).filter(Boolean);\n}\n","import type { CommandMeta, FieldMeta } from '../types.ts';\n\n/**\n * Parse fish shell completion scripts into CommandMeta.\n *\n * Fish completions use the `complete` builtin:\n * complete -c <command> -s <short> -l <long> -d <description> -a <arguments> -r -f\n */\nexport function parseFishCompletions(text: string): CommandMeta {\n const lines = text.split('\\n');\n const result: CommandMeta = {\n name: '',\n arguments: [],\n subcommands: [],\n };\n\n const subcommandMap = new Map<string, CommandMeta>();\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n\n // Match: complete -c <command> [options]\n const completeMatch = trimmed.match(/^complete\\s+/);\n if (!completeMatch) continue;\n\n const parts = parseCompleteLine(trimmed);\n if (!parts) continue;\n\n // Set root command name\n if (!result.name && parts.command) {\n result.name = parts.command;\n }\n\n // If this completion has a condition like \"__fish_seen_subcommand_from <sub>\"\n // it belongs to a subcommand\n const subcommandCondition = parts.condition?.match(/__fish_seen_subcommand_from\\s+(\\S+)/);\n if (subcommandCondition) {\n const subName = subcommandCondition[1]!;\n let sub = subcommandMap.get(subName);\n if (!sub) {\n sub = { name: subName, arguments: [] };\n subcommandMap.set(subName, sub);\n }\n\n if (parts.longFlag || parts.shortFlag) {\n const field = completionToField(parts);\n if (field) sub.arguments!.push(field);\n }\n continue;\n }\n\n // If this defines a subcommand (has -a with no flags)\n if (parts.arguments && !parts.longFlag && !parts.shortFlag) {\n // Arguments list could be subcommand names\n const names = parts.arguments.split(/\\s+/);\n for (const name of names) {\n if (!name || name.startsWith('(')) continue;\n if (!subcommandMap.has(name)) {\n subcommandMap.set(name, {\n name,\n description: parts.description,\n arguments: [],\n });\n } else if (parts.description) {\n subcommandMap.get(name)!.description = parts.description;\n }\n }\n continue;\n }\n\n // Global option\n if (parts.longFlag || parts.shortFlag) {\n const field = completionToField(parts);\n if (field) result.arguments!.push(field);\n }\n }\n\n // Add subcommands\n for (const sub of subcommandMap.values()) {\n if (sub.arguments!.length === 0) delete sub.arguments;\n result.subcommands!.push(sub);\n }\n\n if (result.arguments!.length === 0) delete result.arguments;\n if (result.subcommands!.length === 0) delete result.subcommands;\n\n return result;\n}\n\ninterface CompleteParts {\n command?: string;\n shortFlag?: string;\n longFlag?: string;\n description?: string;\n arguments?: string;\n condition?: string;\n requiresArg?: boolean;\n noFiles?: boolean;\n}\n\nfunction parseCompleteLine(line: string): CompleteParts | null {\n const parts: CompleteParts = {};\n\n // Extract -c <command>\n const cmdMatch = line.match(/-c\\s+(\\S+)/);\n if (cmdMatch) parts.command = cmdMatch[1];\n\n // Extract -s <short>\n const shortMatch = line.match(/-s\\s+(\\S+)/);\n if (shortMatch) parts.shortFlag = shortMatch[1];\n\n // Extract -l <long>\n const longMatch = line.match(/-l\\s+(\\S+)/);\n if (longMatch) parts.longFlag = longMatch[1];\n\n // Extract -d '<description>' or -d \"<description>\"\n const descMatch = line.match(/-d\\s+['\"]([^'\"]+)['\"]/) || line.match(/-d\\s+(\\S+)/);\n if (descMatch) parts.description = descMatch[1];\n\n // Extract -a '<arguments>'\n const argsMatch = line.match(/-a\\s+['\"]([^'\"]+)['\"]/) || line.match(/-a\\s+(\\S+)/);\n if (argsMatch) parts.arguments = argsMatch[1];\n\n // Extract -n '<condition>'\n const condMatch = line.match(/-n\\s+['\"]([^'\"]+)['\"]/) || line.match(/-n\\s+(\\S+)/);\n if (condMatch) parts.condition = condMatch[1];\n\n // -r means requires argument\n parts.requiresArg = /-r\\b/.test(line);\n // -f means no file completion\n parts.noFiles = /-f\\b/.test(line);\n\n return parts;\n}\n\nfunction completionToField(parts: CompleteParts): FieldMeta | null {\n const name = parts.longFlag ? parts.longFlag.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase()) : parts.shortFlag || '';\n\n if (!name) return null;\n\n let type: FieldMeta['type'] = parts.requiresArg ? 'string' : 'boolean';\n let enumValues: string[] | undefined;\n\n // If -a provides specific values, treat as enum\n if (parts.arguments) {\n const values = parts.arguments.split(/\\s+/).filter((v) => !v.startsWith('('));\n if (values.length > 0 && values.length <= 20) {\n enumValues = values;\n type = 'enum';\n }\n }\n\n const aliases = parts.shortFlag && parts.longFlag ? [`-${parts.shortFlag}`] : undefined;\n\n return {\n name,\n type,\n description: parts.description,\n aliases,\n enumValues,\n };\n}\n","import type { CommandMeta, FieldMeta } from '../types.ts';\n\ninterface ParseHelpOptions {\n /** Name to use for the root command if not detected from the help text */\n name?: string;\n}\n\ntype Section = 'none' | 'usage' | 'commands' | 'options' | 'arguments' | 'positional' | 'aliases' | 'skip';\n\n/**\n * Parse --help text output into CommandMeta.\n * Handles common styles: GNU coreutils, Go cobra, Python argparse, Node commander/yargs, gh CLI.\n */\nexport function parseHelpOutput(text: string, options?: ParseHelpOptions): CommandMeta {\n const lines = text.split('\\n');\n const result: CommandMeta = {\n name: options?.name || '',\n arguments: [],\n positionals: [],\n subcommands: [],\n };\n\n let section: Section = 'none';\n\n // Try to extract name from USAGE line\n // Matches: \"Usage: mycli\", \"USAGE\\n gh <command>\", \"Usage:\\n myapp deploy [flags]\"\n const usageMatch = text.match(/^[Uu](?:SAGE|sage):?\\s*(\\S+)/m) || text.match(/^USAGE\\n\\s+(\\S+)/m);\n if (usageMatch && !result.name) {\n result.name = usageMatch[1]!;\n }\n\n // Extract description from lines before first section header\n const descriptionLines: string[] = [];\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) {\n if (descriptionLines.length > 0) break;\n continue;\n }\n if (isSectionHeader(trimmed)) break;\n if (descriptionLines.length === 0 || descriptionLines.length > 0) {\n descriptionLines.push(trimmed);\n }\n }\n if (descriptionLines.length > 0) {\n result.description = descriptionLines.join(' ');\n }\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]!;\n const trimmed = line.trim();\n\n if (!trimmed) continue;\n\n // Detect section headers\n const sectionType = detectSection(trimmed);\n if (sectionType) {\n section = sectionType;\n continue;\n }\n\n // Parse content based on current section\n switch (section) {\n case 'commands': {\n const cmd = parseCommandLine(line);\n if (cmd) {\n result.subcommands!.push(cmd);\n }\n break;\n }\n case 'options': {\n const field = parseOptionLine(line);\n if (field) {\n result.arguments!.push(field);\n }\n break;\n }\n case 'arguments':\n case 'positional': {\n const field = parsePositionalLine(line);\n if (field) {\n result.positionals!.push(field);\n }\n break;\n }\n case 'aliases': {\n const aliasMatch = trimmed.match(/^\\S+(?:\\s+\\S+)*$/);\n if (aliasMatch) {\n // Extract alias from lines like \"gh pr ls\" — the last word is the alias name\n const parts = trimmed.split(/\\s+/);\n if (parts.length >= 2) {\n const alias = parts[parts.length - 1]!;\n if (!result.aliases) result.aliases = [];\n result.aliases.push(alias);\n }\n }\n break;\n }\n // 'skip', 'usage', 'none' — do nothing\n }\n }\n\n // Clean up empty arrays\n if (result.arguments!.length === 0) delete result.arguments;\n if (result.positionals!.length === 0) delete result.positionals;\n if (result.subcommands!.length === 0) delete result.subcommands;\n if (result.aliases?.length === 0) delete result.aliases;\n\n return result;\n}\n\nfunction isSectionHeader(line: string): boolean {\n // \"USAGE\", \"FLAGS\", \"CORE COMMANDS\", \"Options:\", \"Available Commands:\"\n return /^[A-Z][A-Za-z\\s]*:?\\s*$/i.test(line) || /^[A-Z][A-Z\\s]+$/i.test(line);\n}\n\nfunction detectSection(line: string): Section | null {\n const lower = line.toLowerCase().replace(/:$/, '').trim();\n\n // Commands: \"commands\", \"available commands\", \"subcommands\",\n // and gh-style: \"core commands\", \"general commands\", \"additional commands\", etc.\n // Match anything ending in \"commands\" or \"subcommands\", but NOT \"alias commands\"\n if (/^(?:available\\s+)?(?:commands|subcommands)$/.test(lower)) return 'commands';\n if (/^(?:\\w+\\s+)*commands$/.test(lower) && !/alias/.test(lower)) return 'commands';\n\n // Options/Flags: \"options\", \"flags\", \"global options\", \"inherited flags\"\n if (/^(?:global\\s+|inherited\\s+)?(?:options|flags)$/.test(lower)) return 'options';\n\n // Positional arguments\n if (/^(?:positional\\s+)?(?:arguments|args|positionals)$/.test(lower)) return 'positional';\n\n // Aliases section\n if (/^alias(?:es)?(?:\\s+commands)?$/.test(lower)) return 'aliases';\n\n // Usage section\n if (lower === 'usage') return 'usage';\n\n // Sections to skip entirely\n if (/^(?:help\\s+topics|examples?|learn\\s+more|json\\s+fields|see\\s+also|notes?)$/.test(lower)) return 'skip';\n\n return null;\n}\n\nfunction parseCommandLine(line: string): CommandMeta | null {\n // Pattern: \" command-name: Description text\" (gh-style with colon)\n const colonMatch = line.match(/^\\s{2,}([\\w][\\w-]*):?\\s{2,}(.+)$/);\n if (colonMatch) {\n const name = colonMatch[1]!.replace(/:$/, '');\n return {\n name,\n description: colonMatch[2]!.trim(),\n };\n }\n\n // Pattern: \" command-name\" (no description)\n const nameOnly = line.match(/^\\s{2,}([\\w][\\w-]*):?\\s*$/);\n if (nameOnly) {\n return { name: nameOnly[1]!.replace(/:$/, '') };\n }\n\n return null;\n}\n\nfunction parseOptionLine(line: string): FieldMeta | null {\n // Try cobra-style first: \" -s, --flag type Description\" or \" --flag type Description\"\n // The type hint can be a bare word (string, int) or a complex placeholder ([HOST/]OWNER/REPO)\n // but NOT angle-bracket values like <string> (those fall through to GNU pattern)\n const cobraMatch = line.match(/^\\s{2,}(?:(-\\w),\\s+)?(-{1,2}[\\w-]+)(?:\\s+([^\\s<>]+))?\\s{2,}(.+)$/);\n\n if (cobraMatch) {\n const shortFlag = cobraMatch[1];\n const longFlag = cobraMatch[2]!;\n const typeHint = cobraMatch[3];\n const description = cobraMatch[4]?.trim();\n\n const name = normalizeOptionName(longFlag);\n const aliases = shortFlag ? [normalizeAlias(shortFlag)] : undefined;\n\n const { type, ambiguous } = resolveType(typeHint);\n\n const { defaultValue, resolvedType } = extractDefault(description, type, ambiguous);\n const { enumValues, resolvedType: finalType } = extractEnum(description, resolvedType);\n\n return reconcileField({\n name,\n type: finalType,\n description,\n required: type === 'boolean' ? undefined : true,\n aliases,\n default: defaultValue,\n enumValues,\n ambiguous: ambiguous || undefined,\n });\n }\n\n // GNU/argparse-style: \" -s, --long-name <value> Description\"\n // \" --long-name=<value> Description\"\n const gnuMatch = line.match(/^\\s{2,}(?:(-\\w),?\\s+)?(-{1,2}[\\w-]+)(?:\\s*[=\\s]\\s*(?:<([^>]+)>|\\[([^\\]]+)\\]|(\\w+)))?\\s{2,}(.+)$/);\n\n if (gnuMatch) {\n const shortFlag = gnuMatch[1];\n const longFlag = gnuMatch[2]!;\n const valueName = gnuMatch[3] || gnuMatch[4] || gnuMatch[5];\n const description = gnuMatch[6]?.trim();\n\n const name = normalizeOptionName(longFlag);\n const aliases = shortFlag ? [normalizeAlias(shortFlag)] : undefined;\n\n const { type, ambiguous } = resolveType(valueName);\n\n const { defaultValue, resolvedType } = extractDefault(description, type, ambiguous);\n const { enumValues, resolvedType: finalType } = extractEnum(description, resolvedType);\n\n // [value] means optional, <value> means required\n const required = !gnuMatch[4];\n\n return reconcileField({\n name,\n type: finalType,\n description,\n required: finalType === 'boolean' ? undefined : required,\n aliases,\n default: defaultValue,\n enumValues,\n ambiguous: ambiguous || undefined,\n });\n }\n\n // Simplest pattern: \" --name Description\"\n const simple = line.match(/^\\s{2,}(-{1,2}[\\w-]+)\\s{2,}(.+)$/);\n if (simple) {\n const name = normalizeOptionName(simple[1]!);\n return {\n name,\n type: 'boolean',\n description: simple[2]!.trim(),\n };\n }\n\n return null;\n}\n\n/**\n * Resolve a type hint string to a FieldMeta type.\n */\nfunction resolveType(hint: string | undefined): { type: FieldMeta['type']; ambiguous: boolean } {\n if (!hint) return { type: 'boolean', ambiguous: false };\n\n const lower = hint.toLowerCase();\n\n if (/^(num|number|int|integer|port|count|float|duration)$/.test(lower)) {\n return { type: 'number', ambiguous: false };\n }\n if (/^(str|string|text|name|path|file|dir|url|host|query|expression|template)$/.test(lower)) {\n return { type: 'string', ambiguous: false };\n }\n if (/^(bool|boolean)$/.test(lower)) {\n return { type: 'boolean', ambiguous: false };\n }\n if (/^(strings|fields)$/.test(lower)) {\n return { type: 'array', ambiguous: false };\n }\n\n // Unknown type hint — default to string but mark ambiguous\n return { type: 'string', ambiguous: true };\n}\n\n/**\n * Extract default value from description text.\n */\nfunction extractDefault(\n description: string | undefined,\n type: FieldMeta['type'],\n ambiguous: boolean,\n): { defaultValue: unknown; resolvedType: FieldMeta['type'] } {\n let resolvedType = type;\n let defaultValue: unknown;\n\n const defaultMatch = description?.match(/\\(default[:\\s]+([^)]+)\\)/i) || description?.match(/\\[default[:\\s]+([^\\]]+)\\]/i);\n if (defaultMatch) {\n const raw = defaultMatch[1]!.trim();\n if (raw === 'true' || raw === 'false') {\n defaultValue = raw === 'true';\n resolvedType = 'boolean';\n } else if (/^\\d+$/.test(raw)) {\n defaultValue = parseInt(raw, 10);\n if (resolvedType === 'string' && !ambiguous) resolvedType = 'number';\n } else if (/^\\d+\\.\\d+$/.test(raw)) {\n defaultValue = parseFloat(raw);\n if (resolvedType === 'string' && !ambiguous) resolvedType = 'number';\n } else {\n defaultValue = raw.replace(/^[\"']|[\"']$/g, '');\n }\n }\n\n return { defaultValue, resolvedType };\n}\n\n/**\n * Extract enum values from description text.\n */\nfunction extractEnum(\n description: string | undefined,\n type: FieldMeta['type'],\n): { enumValues: string[] | undefined; resolvedType: FieldMeta['type'] } {\n // Explicit choices: (choices: a, b, c) or (one of: a|b|c)\n const choiceMatch = description?.match(/\\((?:one of|choices?)[:\\s]+([^)]+)\\)/i);\n if (choiceMatch) {\n const values = choiceMatch[1]!.split(/[,|]/).map((v) => v.trim().replace(/^[\"']|[\"']$/g, ''));\n return { enumValues: values, resolvedType: 'enum' };\n }\n\n // Inline enum in description: {open|closed|merged|all} (gh-style)\n const inlineMatch = description?.match(/\\{(\\w+(?:\\|[\\w-]+)+)\\}/);\n if (inlineMatch) {\n const values = inlineMatch[1]!.split('|');\n return { enumValues: values, resolvedType: 'enum' };\n }\n\n return { enumValues: undefined, resolvedType: type };\n}\n\n/**\n * Fix up a parsed field for edge cases:\n * - Enum default not in the listed values → add it\n * - Default value type doesn't match declared type → reset to type default + mark ambiguous\n */\nfunction reconcileField(field: FieldMeta): FieldMeta {\n // If enum has a default that isn't in the value list, add it\n if (field.type === 'enum' && field.enumValues && field.default !== undefined) {\n const defStr = String(field.default);\n if (!field.enumValues.includes(defStr)) {\n field.enumValues = [...field.enumValues, defStr];\n }\n }\n\n // If the default value doesn't match the declared type, reset + mark ambiguous\n if (field.default !== undefined) {\n if (field.type === 'boolean' && typeof field.default !== 'boolean') {\n field.default = false;\n field.ambiguous = true;\n } else if (field.type === 'number' && typeof field.default !== 'number') {\n field.default = 0;\n field.ambiguous = true;\n }\n }\n\n return field;\n}\n\nfunction parsePositionalLine(line: string): FieldMeta | null {\n // Pattern: \" <name> Description\"\n // Pattern: \" name Description\"\n const match = line.match(/^\\s{2,}<?(\\w[\\w-]*)>?\\s{2,}(.+)$/);\n if (!match) return null;\n\n return {\n name: match[1]!,\n type: 'string',\n description: match[2]!.trim(),\n positional: true,\n ambiguous: true,\n };\n}\n\n/**\n * Strip leading dashes from a flag name, preserving kebab-case.\n */\nfunction normalizeOptionName(flag: string): string {\n return flag.replace(/^-+/, '');\n}\n\n/**\n * Strip leading dash from a short alias flag (e.g. '-v' → 'v').\n */\nfunction normalizeAlias(alias: string): string {\n return alias.replace(/^-/, '');\n}\n","import type { CommandMeta, FieldMeta } from '../types.ts';\n\n/**\n * Deep-merge multiple CommandMeta from different sources.\n * Deduplicates fields, resolves conflicts, and combines subcommands.\n *\n * Later sources take precedence for descriptions and types,\n * unless the earlier source was more specific (non-ambiguous).\n */\nexport function mergeCommandMeta(...sources: CommandMeta[]): CommandMeta {\n if (sources.length === 0) {\n return { name: '' };\n }\n\n if (sources.length === 1) {\n return sources[0]!;\n }\n\n const result: CommandMeta = { name: '' };\n\n for (const source of sources) {\n // Name: first non-empty wins\n if (source.name && !result.name) {\n result.name = source.name;\n }\n\n // Description: last non-empty wins\n if (source.description) {\n result.description = source.description;\n }\n\n // Aliases: merge and deduplicate\n if (source.aliases) {\n result.aliases = [...new Set([...(result.aliases || []), ...source.aliases])];\n }\n\n // Examples: merge and deduplicate\n if (source.examples) {\n result.examples = [...new Set([...(result.examples || []), ...source.examples])];\n }\n\n // Deprecated: last truthy wins\n if (source.deprecated !== undefined) {\n result.deprecated = source.deprecated;\n }\n\n // Arguments: merge by name\n if (source.arguments) {\n result.arguments = mergeFields(result.arguments || [], source.arguments);\n }\n\n // Positionals: merge by name\n if (source.positionals) {\n result.positionals = mergeFields(result.positionals || [], source.positionals);\n }\n\n // Subcommands: merge recursively by name\n if (source.subcommands) {\n result.subcommands = mergeSubcommands(result.subcommands || [], source.subcommands);\n }\n }\n\n // Clean up empty arrays\n if (result.aliases?.length === 0) delete result.aliases;\n if (result.examples?.length === 0) delete result.examples;\n if (result.arguments?.length === 0) delete result.arguments;\n if (result.positionals?.length === 0) delete result.positionals;\n if (result.subcommands?.length === 0) delete result.subcommands;\n\n return result;\n}\n\n/**\n * Merge two arrays of FieldMeta by name.\n * Later fields take precedence unless earlier was non-ambiguous.\n */\nfunction mergeFields(existing: FieldMeta[], incoming: FieldMeta[]): FieldMeta[] {\n const map = new Map<string, FieldMeta>();\n\n for (const field of existing) {\n map.set(field.name, { ...field });\n }\n\n for (const field of incoming) {\n const prev = map.get(field.name);\n if (!prev) {\n map.set(field.name, { ...field });\n continue;\n }\n\n // Merge the fields\n const merged: FieldMeta = { ...prev };\n\n // Type: prefer non-ambiguous source\n if (field.type !== 'unknown') {\n if (prev.ambiguous || !field.ambiguous) {\n merged.type = field.type;\n merged.ambiguous = field.ambiguous;\n }\n }\n\n // Description: last non-empty wins\n if (field.description) {\n merged.description = field.description;\n }\n\n // Default: last non-undefined wins\n if (field.default !== undefined) {\n merged.default = field.default;\n }\n\n // Required: last defined wins\n if (field.required !== undefined) {\n merged.required = field.required;\n }\n\n // Aliases: merge and deduplicate\n if (field.aliases) {\n merged.aliases = [...new Set([...(prev.aliases || []), ...field.aliases])];\n }\n\n // Enum values: merge and deduplicate\n if (field.enumValues) {\n merged.enumValues = [...new Set([...(prev.enumValues || []), ...field.enumValues])];\n }\n\n // Items: last non-empty wins\n if (field.items) {\n merged.items = field.items;\n }\n\n map.set(field.name, merged);\n }\n\n return [...map.values()];\n}\n\n/**\n * Merge two arrays of CommandMeta by name, recursively.\n */\nfunction mergeSubcommands(existing: CommandMeta[], incoming: CommandMeta[]): CommandMeta[] {\n const map = new Map<string, CommandMeta>();\n\n for (const cmd of existing) {\n map.set(cmd.name, cmd);\n }\n\n for (const cmd of incoming) {\n const prev = map.get(cmd.name);\n if (!prev) {\n map.set(cmd.name, cmd);\n } else {\n map.set(cmd.name, mergeCommandMeta(prev, cmd));\n }\n }\n\n return [...map.values()];\n}\n","import type { CommandMeta, FieldMeta } from '../types.ts';\n\n/**\n * Parse zsh completion function definitions into CommandMeta.\n *\n * Zsh completions typically use _arguments or compadd:\n * _arguments \\\n * '-v[verbose mode]' \\\n * '--output=[output file]:filename:_files' \\\n * '1:command:(start stop restart)'\n */\nexport function parseZshCompletions(text: string): CommandMeta {\n const result: CommandMeta = {\n name: '',\n arguments: [],\n positionals: [],\n subcommands: [],\n };\n\n // Try to detect command name from function name: _command() or #compdef command\n const compdefMatch = text.match(/#compdef\\s+(\\S+)/);\n if (compdefMatch) {\n result.name = compdefMatch[1]!;\n } else {\n const funcMatch = text.match(/^_(\\w+)\\s*\\(\\)/m);\n if (funcMatch) {\n result.name = funcMatch[1]!;\n }\n }\n\n // Find _arguments blocks\n const argumentsBlocks = findArgumentsBlocks(text);\n\n for (const block of argumentsBlocks) {\n const specs = parseArgumentSpecs(block);\n for (const spec of specs) {\n if (spec.positional) {\n result.positionals!.push(spec);\n } else {\n result.arguments!.push(spec);\n }\n }\n }\n\n // Find subcommand definitions from case statements or _describe\n const subcommands = findSubcommands(text);\n result.subcommands!.push(...subcommands);\n\n if (result.arguments!.length === 0) delete result.arguments;\n if (result.positionals!.length === 0) delete result.positionals;\n if (result.subcommands!.length === 0) delete result.subcommands;\n\n return result;\n}\n\n/**\n * Extract _arguments blocks from zsh completion text.\n * Handles backslash continuation lines.\n */\nfunction findArgumentsBlocks(text: string): string[] {\n const blocks: string[] = [];\n\n // Join continuation lines\n const joined = text.replace(/\\\\\\n\\s*/g, ' ');\n const lines = joined.split('\\n');\n\n for (const line of lines) {\n const match = line.match(/_arguments\\s+(.+)/);\n if (match) {\n blocks.push(match[1]!);\n }\n }\n\n return blocks;\n}\n\n/**\n * Parse individual argument specs from an _arguments line.\n */\nfunction parseArgumentSpecs(block: string): FieldMeta[] {\n const results: FieldMeta[] = [];\n\n // Split into individual specs (quoted strings)\n const specs = extractQuotedStrings(block);\n\n for (const spec of specs) {\n const field = parseZshSpec(spec);\n if (field) results.push(field);\n }\n\n return results;\n}\n\n/**\n * Extract single-quoted strings from an _arguments block.\n */\nfunction extractQuotedStrings(text: string): string[] {\n const strings: string[] = [];\n const regex = /'([^']+)'/g;\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(text)) !== null) {\n strings.push(match[1]!);\n }\n\n return strings;\n}\n\n/**\n * Parse a single zsh argument spec.\n *\n * Formats:\n * '-v[verbose mode]' → boolean flag\n * '--output=[output file]:filename:_files' → string with value\n * '(-v --verbose)'{-v,--verbose}'[verbose mode]' → flag with aliases\n * '*--flag[repeatable]' → array\n * '1:command:(start stop restart)' → positional enum\n * ':filename:_files' → positional\n */\nfunction parseZshSpec(spec: string): FieldMeta | null {\n // Positional argument: 'N:description:action' or ':description:action'\n const positionalMatch = spec.match(/^(\\d+)?:([^:]*):(.*)$/);\n if (positionalMatch) {\n const description = positionalMatch[2] || undefined;\n\n // Check for enum values in (val1 val2 val3)\n const enumMatch = positionalMatch[3]?.match(/^\\(([^)]+)\\)$/);\n if (enumMatch) {\n const values = enumMatch[1]!.split(/\\s+/);\n return {\n name: description?.toLowerCase().replace(/\\s+/g, '_') || `arg${positionalMatch[1] || '0'}`,\n type: 'enum',\n enumValues: values,\n description,\n positional: true,\n };\n }\n\n return {\n name: description?.toLowerCase().replace(/\\s+/g, '_') || `arg${positionalMatch[1] || '0'}`,\n type: 'string',\n description,\n positional: true,\n ambiguous: true,\n };\n }\n\n // Flag argument\n const repeatable = spec.startsWith('*');\n const flagSpec = repeatable ? spec.slice(1) : spec;\n\n // Extract flag name and description\n // Pattern: --flag=[description]:value_description:action\n // Pattern: -f[description]\n const flagMatch = flagSpec.match(/^(-{1,2}[\\w-]+)(?:=?)(?:\\[([^\\]]*)\\])?(?::([^:]*):?(.*))?$/);\n if (!flagMatch) return null;\n\n const rawName = flagMatch[1]!;\n const description = flagMatch[2] || undefined;\n const valueName = flagMatch[3] || undefined;\n\n const name = rawName.replace(/^-+/, '').replace(/-([a-z])/g, (_, c: string) => c.toUpperCase());\n const hasValue = rawName.includes('=') || !!valueName;\n let type: FieldMeta['type'] = hasValue ? 'string' : 'boolean';\n\n if (repeatable) type = 'array';\n\n // Check for enum values\n let enumValues: string[] | undefined;\n if (flagMatch[4]) {\n const enumMatch = flagMatch[4].match(/^\\(([^)]+)\\)$/);\n if (enumMatch) {\n enumValues = enumMatch[1]!.split(/\\s+/);\n type = 'enum';\n }\n }\n\n return {\n name,\n type,\n description,\n enumValues,\n };\n}\n\n/**\n * Find subcommand definitions from _describe calls or case statements.\n */\nfunction findSubcommands(text: string): CommandMeta[] {\n const subcommands: CommandMeta[] = [];\n const seen = new Set<string>();\n\n // Look for _describe patterns: _describe 'command' commands\n // where commands is an array like: ('start:start the service' 'stop:stop the service')\n const describeRegex = /\\(([^)]+)\\)/g;\n const joined = text.replace(/\\\\\\n\\s*/g, ' ');\n\n // Look for arrays of 'name:description' patterns near _describe\n let match: RegExpExecArray | null;\n while ((match = describeRegex.exec(joined)) !== null) {\n const content = match[1]!;\n const entries = content.match(/'([^']+)'/g) || content.match(/\"([^\"]+)\"/g);\n if (!entries) continue;\n\n for (const entry of entries) {\n const clean = entry.replace(/^['\"]|['\"]$/g, '');\n const parts = clean.split(':');\n if (parts.length >= 2 && /^[\\w-]+$/.test(parts[0]!)) {\n const name = parts[0]!;\n if (seen.has(name)) continue;\n seen.add(name);\n subcommands.push({\n name,\n description: parts.slice(1).join(':'),\n });\n }\n }\n }\n\n return subcommands;\n}\n","import { execFile } from 'node:child_process';\nimport { readFile } from 'node:fs/promises';\n\nimport { parseBashCompletions } from './parsers/bash.ts';\nimport { parseFishCompletions } from './parsers/fish.ts';\nimport { parseHelpOutput } from './parsers/help.ts';\nimport { mergeCommandMeta } from './parsers/merge.ts';\nimport { parseZshCompletions } from './parsers/zsh.ts';\nimport type { CommandMeta, GeneratorLogger } from './types.ts';\n\nexport type DiscoverySource = 'help' | 'completion' | 'bash' | 'fish' | 'zsh';\n\nexport interface DiscoveryOptions {\n /** The command to discover (e.g. 'gh', 'docker', 'kubectl'). */\n command: string;\n /**\n * Which parsing sources to use. Default: ['help'].\n * Use `'completion'` to auto-detect the best shell completion source\n * by probing `<cmd> completion <shell>` (bash → fish → zsh).\n */\n sources?: DiscoverySource[];\n /** Max subcommand depth. 0 = root only, undefined = unlimited. */\n depth?: number;\n /** Delay in ms between help invocations. Default: 50 */\n delay?: number;\n /** Logger for progress reporting. */\n log?: GeneratorLogger;\n /** Timeout per help invocation in ms. Default: 10000 */\n timeout?: number;\n}\n\nexport interface DiscoveryResult {\n /** The discovered command tree. */\n command: CommandMeta;\n /** Number of help invocations made. */\n invocations: number;\n /** Errors encountered (non-fatal). */\n warnings: string[];\n}\n\n/**\n * Discover CLI structure by running --help recursively and optionally\n * parsing shell completion scripts.\n */\nexport async function discoverCli(options: DiscoveryOptions): Promise<DiscoveryResult> {\n const { command, sources: rawSources = ['help'], depth, delay = 50, log, timeout = 10000 } = options;\n\n // Resolve 'completion' source by probing for the best available shell\n const sources = await resolveSources(rawSources, command, timeout, log);\n\n const warnings: string[] = [];\n let invocations = 0;\n\n const results: CommandMeta[] = [];\n\n // Source 1: --help recursive crawl\n if (sources.includes('help')) {\n log?.info(`Discovering ${command} via --help...`);\n const helpResult = await crawlHelp(command, [], {\n depth,\n delay,\n timeout,\n log,\n onInvocation: () => {\n invocations++;\n },\n onWarning: (msg) => {\n warnings.push(msg);\n },\n });\n results.push(helpResult);\n }\n\n // Source 2: Bash completions\n if (sources.includes('bash')) {\n log?.info(`Parsing bash completions for ${command}...`);\n const bashText = await getCompletionScript(command, 'bash', timeout);\n if (bashText) {\n results.push(parseBashCompletions(bashText));\n } else {\n warnings.push('Could not obtain bash completion script');\n }\n }\n\n // Source 3: Fish completions\n if (sources.includes('fish')) {\n log?.info(`Parsing fish completions for ${command}...`);\n const fishText = await getCompletionScript(command, 'fish', timeout);\n if (fishText) {\n results.push(parseFishCompletions(fishText));\n } else {\n warnings.push('Could not obtain fish completion script');\n }\n }\n\n // Source 4: Zsh completions\n if (sources.includes('zsh')) {\n log?.info(`Parsing zsh completions for ${command}...`);\n const zshText = await getCompletionScript(command, 'zsh', timeout);\n if (zshText) {\n results.push(parseZshCompletions(zshText));\n } else {\n warnings.push('Could not obtain zsh completion script');\n }\n }\n\n const merged = results.length > 0 ? mergeCommandMeta(...results) : { name: command };\n\n // Ensure the root has the correct name\n if (!merged.name) merged.name = command;\n\n return { command: merged, invocations, warnings };\n}\n\ninterface CrawlOptions {\n depth?: number;\n delay: number;\n timeout: number;\n log?: GeneratorLogger;\n onInvocation: () => void;\n onWarning: (msg: string) => void;\n}\n\n/**\n * Breadth-first crawl of --help output.\n */\nasync function crawlHelp(command: string, prefixArgs: string[], options: CrawlOptions): Promise<CommandMeta> {\n const fullCmd = [command, ...prefixArgs].join(' ');\n\n options.onInvocation();\n const helpText = await runHelp(command, prefixArgs, options.timeout);\n\n if (!helpText) {\n options.onWarning(`No help output from: ${fullCmd} --help`);\n return { name: prefixArgs[prefixArgs.length - 1] || command };\n }\n\n const name = prefixArgs[prefixArgs.length - 1] || command;\n const parsed = parseHelpOutput(helpText, { name });\n\n options.log?.info(` ${fullCmd}: ${parsed.subcommands?.length || 0} subcommands, ${parsed.arguments?.length || 0} options`);\n\n // Recurse into subcommands breadth-first\n const currentDepth = prefixArgs.length;\n if (parsed.subcommands && parsed.subcommands.length > 0 && (options.depth === undefined || currentDepth < options.depth)) {\n const resolvedSubs: CommandMeta[] = [];\n\n for (const sub of parsed.subcommands) {\n if (options.delay > 0) {\n await sleep(options.delay);\n }\n const resolved = await crawlHelp(command, [...prefixArgs, sub.name], options);\n // Preserve description from parent's subcommand list if child didn't have one\n if (!resolved.description && sub.description) {\n resolved.description = sub.description;\n }\n resolvedSubs.push(resolved);\n }\n\n parsed.subcommands = resolvedSubs;\n }\n\n return parsed;\n}\n\n/**\n * Run `<cmd> --help` or `<cmd> help` and return combined stdout+stderr.\n */\nasync function runHelp(command: string, args: string[], timeout: number): Promise<string | null> {\n // Try --help first\n let result = await runCommand(command, [...args, '--help'], timeout);\n if (result) return result;\n\n // Some CLIs use `help <cmd>` instead\n if (args.length > 0) {\n result = await runCommand(command, ['help', ...args], timeout);\n if (result) return result;\n }\n\n return null;\n}\n\n/**\n * Run a command and return its combined output, or null on failure.\n */\nasync function runCommand(command: string, args: string[], timeout: number): Promise<string | null> {\n try {\n const { stdout, stderr } = await new Promise<{ stdout: string; stderr: string }>((resolve) => {\n execFile(command, args, { timeout, maxBuffer: 10 * 1024 * 1024 }, (_error, stdout, stderr) => {\n // Resolve even on non-zero exit — many CLIs exit non-zero on --help\n resolve({ stdout: (stdout ?? '').trim(), stderr: (stderr ?? '').trim() });\n });\n });\n\n // Some CLIs output help to stderr, some exit non-zero on --help\n const combined = stdout || stderr;\n if (!combined) return null;\n\n // Basic sanity check: help text usually has some structure\n if (combined.length < 10) return null;\n\n return combined;\n } catch {\n return null;\n }\n}\n\n/**\n * Try to get a shell completion script for a command.\n * Checks both `<cmd> completion <shell>` and well-known file paths.\n */\nasync function getCompletionScript(command: string, shell: 'bash' | 'fish' | 'zsh', timeout: number): Promise<string | null> {\n // Try `<cmd> completion <shell>`\n const completionArgs = ['completion', shell];\n let result = await runCommand(command, completionArgs, timeout);\n if (result) return result;\n\n // Try `<cmd> completions <shell>`\n result = await runCommand(command, ['completions', shell], timeout);\n if (result) return result;\n\n // Try reading from well-known paths\n const paths =\n shell === 'fish'\n ? [`/usr/share/fish/vendor_completions.d/${command}.fish`, `/usr/local/share/fish/vendor_completions.d/${command}.fish`]\n : shell === 'bash'\n ? [\n `/usr/share/bash-completion/completions/${command}`,\n `/usr/local/share/bash-completion/completions/${command}`,\n `/etc/bash_completion.d/${command}`,\n ]\n : [`/usr/share/zsh/site-functions/_${command}`, `/usr/local/share/zsh/site-functions/_${command}`];\n\n for (const path of paths) {\n try {\n return await readFile(path, 'utf-8');\n } catch {}\n }\n\n return null;\n}\n\n/**\n * Detect the best shell for completion parsing by probing the command.\n * Tries `<cmd> completion <shell>` for bash, fish, zsh (in that order).\n * Returns the shell name if successful, or null if no completion command exists.\n */\nexport async function detectCompletionShell(command: string, timeout = 5000): Promise<'bash' | 'fish' | 'zsh' | null> {\n for (const shell of ['bash', 'fish', 'zsh'] as const) {\n const result = await getCompletionScript(command, shell, timeout);\n if (result) return shell;\n }\n return null;\n}\n\n/**\n * Resolve 'completion' entries in the sources array by probing for the best available shell.\n * Other sources are passed through unchanged.\n */\nasync function resolveSources(\n sources: DiscoverySource[],\n command: string,\n timeout: number,\n log?: GeneratorLogger,\n): Promise<DiscoverySource[]> {\n if (!sources.includes('completion')) return sources;\n\n log?.info(`Probing ${command} for completion command...`);\n const shell = await detectCompletionShell(command, timeout);\n\n return sources.flatMap((s) => {\n if (s !== 'completion') return s;\n if (shell) {\n log?.info(` Found ${shell} completion support`);\n return shell;\n }\n log?.info(' No completion command found, skipping');\n return [];\n });\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { dirname, join, resolve } from 'node:path';\nimport type { CodeBuildResult, EmitResult, FileEmitter, FileEmitterOptions } from './types.ts';\n\ninterface QueuedFile {\n path: string;\n content: string;\n}\n\nclass FileEmitterImpl implements FileEmitter {\n private files: QueuedFile[] = [];\n private options: FileEmitterOptions;\n\n constructor(options: FileEmitterOptions) {\n this.options = options;\n }\n\n addFile(path: string, content: string | CodeBuildResult): void {\n const text = typeof content === 'string' ? content : content.text;\n const fullContent = this.options.header ? `${this.options.header}\\n\\n${text}` : text;\n\n this.files.push({ path, content: fullContent });\n }\n\n async emit(): Promise<EmitResult> {\n const result: EmitResult = {\n written: [],\n skipped: [],\n errors: [],\n };\n\n const outDir = resolve(this.options.outDir);\n\n for (const file of this.files) {\n const fullPath = join(outDir, file.path);\n\n try {\n // Check if file already exists\n if (existsSync(fullPath) && !this.options.overwrite) {\n result.skipped.push(file.path);\n continue;\n }\n\n if (this.options.dryRun) {\n result.written.push(file.path);\n continue;\n }\n\n // Ensure directory exists\n const dir = dirname(fullPath);\n mkdirSync(dir, { recursive: true });\n\n // Write the file\n writeFileSync(fullPath, file.content, 'utf-8');\n result.written.push(file.path);\n } catch (err) {\n result.errors.push({\n file: file.path,\n error: err instanceof Error ? err : new Error(String(err)),\n });\n }\n }\n\n return result;\n }\n}\n\n/**\n * Create a FileEmitter for writing multiple generated files to disk.\n */\nexport function createFileEmitter(options: FileEmitterOptions): FileEmitter {\n return new FileEmitterImpl(options);\n}\n","import type { CodeBuilder, GeneratorContext } from '../types.ts';\n\n/**\n * Generate an index.ts barrel file that re-exports all given files.\n */\nexport function generateBarrelFile(files: string[], ctx: GeneratorContext): CodeBuilder {\n const code = ctx.createCodeBuilder();\n\n for (const file of files) {\n // Strip .ts extension for the import path and ensure relative path\n const importPath = file.startsWith('./') ? file : `./${file}`;\n code.line(`export * from '${importPath}'`);\n }\n\n return code;\n}\n","import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { getJsonSchema } from '../core/args.ts';\nimport type { FieldMeta } from './types.ts';\n\ninterface SchemaToCodeResult {\n /** The generated Zod source code */\n code: string;\n /** Imports needed (e.g. ['z']) */\n imports: string[];\n}\n\n/**\n * Convert a JSON Schema property to Zod code.\n */\nfunction jsonSchemaPropertyToZod(prop: Record<string, any>, required: boolean, ambiguous?: boolean): string {\n let code: string;\n\n const type = prop.type as string | undefined;\n const enumValues = prop.enum as unknown[] | undefined;\n\n if (enumValues && enumValues.length > 0) {\n const values = enumValues.map((v) => JSON.stringify(v)).join(', ');\n code = `z.enum([${values}])`;\n } else if (type === 'string') {\n code = 'z.string()';\n } else if (type === 'number' || type === 'integer') {\n code = 'z.number()';\n } else if (type === 'boolean') {\n code = 'z.boolean()';\n } else if (type === 'array') {\n const items = prop.items as Record<string, any> | undefined;\n const itemCode = items ? jsonSchemaPropertyToZod(items, true) : 'z.unknown()';\n code = `${itemCode}.array()`;\n } else {\n code = 'z.unknown()';\n }\n\n if (prop.default !== undefined) {\n code += `.default(${JSON.stringify(prop.default)})`;\n } else if (!required) {\n code += '.optional()';\n }\n\n if (prop.description) {\n code += `.describe(${JSON.stringify(prop.description)})`;\n }\n\n if (ambiguous) {\n code += ' /* TODO: verify type */';\n }\n\n return code;\n}\n\n/**\n * Generate Zod source code from a Standard Schema instance by introspecting\n * its `~standard.jsonSchema` interface.\n */\nexport function schemaToCode(schema: StandardSchemaV1): SchemaToCodeResult {\n try {\n const jsonSchema = getJsonSchema(schema as any) as Record<string, any>;\n return jsonSchemaToCode(jsonSchema);\n } catch {\n return { code: 'z.unknown()', imports: ['z'] };\n }\n}\n\nfunction jsonSchemaToCode(jsonSchema: Record<string, any>): SchemaToCodeResult {\n if (jsonSchema.type === 'object' && jsonSchema.properties) {\n const properties = jsonSchema.properties as Record<string, any>;\n const required = new Set((jsonSchema.required as string[]) || []);\n\n const entries = Object.entries(properties).map(([key, prop]) => {\n const isRequired = required.has(key);\n const zodCode = jsonSchemaPropertyToZod(prop as Record<string, any>, isRequired);\n return ` ${key}: ${zodCode},`;\n });\n\n const code = `z.object({\\n${entries.join('\\n')}\\n})`;\n return { code, imports: ['z'] };\n }\n\n // Fallback for non-object schemas\n const code = jsonSchemaPropertyToZod(jsonSchema, true);\n return { code, imports: ['z'] };\n}\n\n/**\n * Build a real Zod schema from FieldMeta objects.\n * Returns the schema as Zod source code, since we can't dynamically import Zod here\n * (codegen has no runtime dependency on padrone's main entry point).\n */\nexport function fieldMetaToCode(fields: FieldMeta[]): SchemaToCodeResult {\n const entries = fields.map((field) => {\n let code: string;\n\n switch (field.type) {\n case 'string':\n code = 'z.string()';\n break;\n case 'number':\n code = 'z.number()';\n break;\n case 'boolean':\n code = 'z.boolean()';\n break;\n case 'array': {\n const itemType = field.items || 'string';\n const itemCode = itemType === 'number' ? 'z.number()' : 'z.string()';\n code = `${itemCode}.array()`;\n break;\n }\n case 'enum':\n if (field.enumValues && field.enumValues.length > 0) {\n const values = field.enumValues.map((v) => JSON.stringify(v)).join(', ');\n code = `z.enum([${values}])`;\n } else {\n code = 'z.string()';\n }\n break;\n default:\n code = 'z.unknown()';\n break;\n }\n\n if (field.default !== undefined) {\n code += `.default(${JSON.stringify(field.default)})`;\n } else if (!field.required) {\n code += '.optional()';\n }\n\n if (field.description) {\n code += `.describe(${JSON.stringify(field.description)})`;\n }\n\n if (field.ambiguous) {\n code += ' /* TODO: verify type */';\n }\n\n const key = needsQuoting(field.name) ? JSON.stringify(field.name) : field.name;\n return ` ${key}: ${code},`;\n });\n\n const code = `z.object({\\n${entries.join('\\n')}\\n})`;\n return { code, imports: ['z'] };\n}\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/** Returns true if the name needs quoting to be a valid JS object key. */\nfunction needsQuoting(name: string): boolean {\n if (JS_RESERVED.has(name)) return true;\n // Must be a valid identifier: starts with letter/$/_, contains only word chars\n return !/^[a-zA-Z_$][\\w$]*$/.test(name);\n}\n","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","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","/**\n * Lightweight string template engine.\n *\n * Syntax:\n * - `{{var}}` — interpolation\n * - `{{#arr}}...{{/arr}}` — iteration (`.` refers to current item)\n * - `{{#bool}}...{{/bool}}` — conditional blocks\n * - `{{>partial}}` — include a named sub-template\n */\n\ntype TemplateRenderer = (data: Record<string, unknown>, partials?: Record<string, string>) => string;\n\n/**\n * Compile a template string into a reusable render function.\n */\nexport function template(text: string): TemplateRenderer {\n return (data: Record<string, unknown>, partials?: Record<string, string>) => {\n return render(text, data, partials);\n };\n}\n\nfunction render(text: string, data: Record<string, unknown>, partials?: Record<string, string>): string {\n let result = text;\n\n // Process block sections: {{#key}}...{{/key}}\n result = result.replace(/\\{\\{#(\\w+)\\}\\}([\\s\\S]*?)\\{\\{\\/\\1\\}\\}/g, (_match, key: string, body: string) => {\n const value = data[key];\n\n if (value === undefined || value === null || value === false) {\n return '';\n }\n\n if (Array.isArray(value)) {\n return value\n .map((item) => {\n if (typeof item === 'object' && item !== null) {\n return render(body, item as Record<string, unknown>, partials);\n }\n // For primitive items, replace {{.}} with the item value\n return body.replace(/\\{\\{\\.\\}\\}/g, String(item));\n })\n .join('');\n }\n\n // Truthy conditional\n if (typeof value === 'object') {\n return render(body, value as Record<string, unknown>, partials);\n }\n return render(body, data, partials);\n });\n\n // Process partials: {{>partialName}}\n if (partials) {\n result = result.replace(/\\{\\{>(\\w+)\\}\\}/g, (_match, name: string) => {\n const partialText = partials[name];\n if (!partialText) return '';\n return render(partialText, data, partials);\n });\n }\n\n // Process interpolation: {{var}}\n result = result.replace(/\\{\\{(\\w+)\\}\\}/g, (_match, key: string) => {\n const value = data[key];\n if (value === undefined || value === null) return '';\n return String(value);\n });\n\n return result;\n}\n"],"mappings":"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"}
|