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
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
//#region src/util/utils.ts
|
|
2
|
+
function getRootCommand(cmd) {
|
|
3
|
+
let current = cmd;
|
|
4
|
+
while (current.parent) current = current.parent;
|
|
5
|
+
return current;
|
|
6
|
+
}
|
|
7
|
+
async function readVersionFromPackageJson() {
|
|
8
|
+
try {
|
|
9
|
+
const fs = await import("node:fs");
|
|
10
|
+
const path = await import("node:path");
|
|
11
|
+
let dir = process.cwd();
|
|
12
|
+
for (let i = 0; i < 10; i++) {
|
|
13
|
+
const pkgPath = path.join(dir, "package.json");
|
|
14
|
+
if (fs.existsSync(pkgPath)) {
|
|
15
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
|
|
16
|
+
if (pkg.version) return pkg.version;
|
|
17
|
+
}
|
|
18
|
+
const parentDir = path.dirname(dir);
|
|
19
|
+
if (parentDir === dir) break;
|
|
20
|
+
dir = parentDir;
|
|
21
|
+
}
|
|
22
|
+
} catch {}
|
|
23
|
+
return "0.0.0";
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Attempts to get the version from various sources:
|
|
27
|
+
* 1. Explicit version set on the command
|
|
28
|
+
* 2. npm_package_version environment variable (set by npm/yarn/pnpm when running scripts)
|
|
29
|
+
* 3. package.json in current or parent directories
|
|
30
|
+
*
|
|
31
|
+
* Returns synchronously when an explicit version or env var is available.
|
|
32
|
+
* Falls back to async package.json discovery otherwise.
|
|
33
|
+
*/
|
|
34
|
+
function getVersion(explicitVersion) {
|
|
35
|
+
if (explicitVersion) return explicitVersion;
|
|
36
|
+
if (typeof process !== "undefined" && process.env?.npm_package_version) return process.env.npm_package_version;
|
|
37
|
+
if (typeof process !== "undefined") return readVersionFromPackageJson();
|
|
38
|
+
return "0.0.0";
|
|
39
|
+
}
|
|
40
|
+
//#endregion
|
|
41
|
+
export { getRootCommand, getVersion };
|
|
42
|
+
|
|
43
|
+
//# sourceMappingURL=utils.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.mjs","names":[],"sources":["../../src/util/utils.ts"],"sourcesContent":["import type { AnyPadroneCommand } from '../types/index.ts';\n\nexport function getRootCommand(cmd: AnyPadroneCommand): AnyPadroneCommand {\n let current = cmd;\n while (current.parent) current = current.parent;\n return current;\n}\n\nasync function readVersionFromPackageJson(): Promise<string> {\n try {\n const fs = await import('node:fs');\n const path = await import('node:path');\n let dir = process.cwd();\n\n // Walk up the directory tree looking for package.json\n for (let i = 0; i < 10; i++) {\n const pkgPath = path.join(dir, 'package.json');\n if (fs.existsSync(pkgPath)) {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n if (pkg.version) return pkg.version;\n }\n const parentDir = path.dirname(dir);\n if (parentDir === dir) break; // Reached root\n dir = parentDir;\n }\n } catch {\n // Ignore errors (e.g., fs not available in browser)\n }\n return '0.0.0';\n}\n\n/**\n * Attempts to get the version from various sources:\n * 1. Explicit version set on the command\n * 2. npm_package_version environment variable (set by npm/yarn/pnpm when running scripts)\n * 3. package.json in current or parent directories\n *\n * Returns synchronously when an explicit version or env var is available.\n * Falls back to async package.json discovery otherwise.\n */\nexport function getVersion(explicitVersion?: string): string | Promise<string> {\n if (explicitVersion) return explicitVersion;\n\n if (typeof process !== 'undefined' && process.env?.npm_package_version) {\n return process.env.npm_package_version;\n }\n\n if (typeof process !== 'undefined') return readVersionFromPackageJson();\n\n return '0.0.0';\n}\n"],"mappings":";AAEA,SAAgB,eAAe,KAA2C;CACxE,IAAI,UAAU;CACd,OAAO,QAAQ,QAAQ,UAAU,QAAQ;CACzC,OAAO;AACT;AAEA,eAAe,6BAA8C;CAC3D,IAAI;EACF,MAAM,KAAK,MAAM,OAAO;EACxB,MAAM,OAAO,MAAM,OAAO;EAC1B,IAAI,MAAM,QAAQ,IAAI;EAGtB,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,KAAK;GAC3B,MAAM,UAAU,KAAK,KAAK,KAAK,cAAc;GAC7C,IAAI,GAAG,WAAW,OAAO,GAAG;IAC1B,MAAM,MAAM,KAAK,MAAM,GAAG,aAAa,SAAS,OAAO,CAAC;IACxD,IAAI,IAAI,SAAS,OAAO,IAAI;GAC9B;GACA,MAAM,YAAY,KAAK,QAAQ,GAAG;GAClC,IAAI,cAAc,KAAK;GACvB,MAAM;EACR;CACF,QAAQ,CAER;CACA,OAAO;AACT;;;;;;;;;;AAWA,SAAgB,WAAW,iBAAoD;CAC7E,IAAI,iBAAiB,OAAO;CAE5B,IAAI,OAAO,YAAY,eAAe,QAAQ,KAAK,qBACjD,OAAO,QAAQ,IAAI;CAGrB,IAAI,OAAO,YAAY,aAAa,OAAO,2BAA2B;CAEtE,OAAO;AACT"}
|
package/dist/zod.d.mts
CHANGED
|
@@ -1,32 +1 @@
|
|
|
1
|
-
|
|
2
|
-
import * as z from "zod/v4";
|
|
3
|
-
|
|
4
|
-
//#region src/schema/zod.d.ts
|
|
5
|
-
/**
|
|
6
|
-
* Creates a Zod schema for an async stream field, ready to use in `.arguments()`.
|
|
7
|
-
* Wraps `z.custom<AsyncIterable<T>>()` with the `asyncStream()` metadata automatically.
|
|
8
|
-
*
|
|
9
|
-
* @param itemSchema - Optional item schema for per-item validation.
|
|
10
|
-
*
|
|
11
|
-
* @example
|
|
12
|
-
* ```ts
|
|
13
|
-
* import { zodAsyncStream } from 'padrone/zod';
|
|
14
|
-
*
|
|
15
|
-
* // String lines
|
|
16
|
-
* z.object({ lines: zodAsyncStream() })
|
|
17
|
-
*
|
|
18
|
-
* // Typed items — each line JSON.parse'd and validated
|
|
19
|
-
* const recordSchema = z.object({ name: z.string(), age: z.number() });
|
|
20
|
-
* z.object({ records: zodAsyncStream(jsonCodec(recordSchema)) })
|
|
21
|
-
* ```
|
|
22
|
-
*/
|
|
23
|
-
declare function zodAsyncStream<T = string>(itemSchema?: PadroneSchema<unknown, T>): z.ZodCustom<AsyncIterable<T>, AsyncIterable<T>>;
|
|
24
|
-
/**
|
|
25
|
-
* JSON codec for Zod schemas
|
|
26
|
-
* @see https://zod.dev/codecs?id=jsonschema
|
|
27
|
-
* Unlike the example in the docs, this codec also handles the case where the input is already an object
|
|
28
|
-
*/
|
|
29
|
-
declare const jsonCodec: <T extends z.ZodType>(schema: T) => z.ZodCodec<z.ZodUnion<readonly [z.ZodString, z.ZodUnknown]>, T>;
|
|
30
|
-
//#endregion
|
|
31
|
-
export { jsonCodec, zodAsyncStream };
|
|
32
|
-
//# sourceMappingURL=zod.d.mts.map
|
|
1
|
+
export { };
|
package/dist/zod.mjs
CHANGED
|
@@ -1,50 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import * as z from "zod/v4";
|
|
3
|
-
//#region src/schema/zod.ts
|
|
4
|
-
/**
|
|
5
|
-
* Creates a Zod schema for an async stream field, ready to use in `.arguments()`.
|
|
6
|
-
* Wraps `z.custom<AsyncIterable<T>>()` with the `asyncStream()` metadata automatically.
|
|
7
|
-
*
|
|
8
|
-
* @param itemSchema - Optional item schema for per-item validation.
|
|
9
|
-
*
|
|
10
|
-
* @example
|
|
11
|
-
* ```ts
|
|
12
|
-
* import { zodAsyncStream } from 'padrone/zod';
|
|
13
|
-
*
|
|
14
|
-
* // String lines
|
|
15
|
-
* z.object({ lines: zodAsyncStream() })
|
|
16
|
-
*
|
|
17
|
-
* // Typed items — each line JSON.parse'd and validated
|
|
18
|
-
* const recordSchema = z.object({ name: z.string(), age: z.number() });
|
|
19
|
-
* z.object({ records: zodAsyncStream(jsonCodec(recordSchema)) })
|
|
20
|
-
* ```
|
|
21
|
-
*/
|
|
22
|
-
function zodAsyncStream(itemSchema) {
|
|
23
|
-
return z.custom().meta(asyncStream(itemSchema));
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* JSON codec for Zod schemas
|
|
27
|
-
* @see https://zod.dev/codecs?id=jsonschema
|
|
28
|
-
* Unlike the example in the docs, this codec also handles the case where the input is already an object
|
|
29
|
-
*/
|
|
30
|
-
const jsonCodec = (schema) => z.codec(z.union([z.string(), z.unknown()]), schema, {
|
|
31
|
-
decode: (jsonString, ctx) => {
|
|
32
|
-
try {
|
|
33
|
-
if (typeof jsonString !== "string") return jsonString;
|
|
34
|
-
return JSON.parse(jsonString);
|
|
35
|
-
} catch (err) {
|
|
36
|
-
ctx.issues.push({
|
|
37
|
-
code: "invalid_format",
|
|
38
|
-
format: "json",
|
|
39
|
-
input: typeof jsonString === "string" ? jsonString : JSON.stringify(jsonString),
|
|
40
|
-
message: err.message
|
|
41
|
-
});
|
|
42
|
-
return z.NEVER;
|
|
43
|
-
}
|
|
44
|
-
},
|
|
45
|
-
encode: (value) => JSON.stringify(value)
|
|
46
|
-
});
|
|
47
|
-
//#endregion
|
|
1
|
+
import { jsonCodec, zodAsyncStream } from "./schema/zod.mjs";
|
|
48
2
|
export { jsonCodec, zodAsyncStream };
|
|
49
|
-
|
|
50
|
-
//# sourceMappingURL=zod.mjs.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "padrone",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "Create type-safe, interactive CLI apps with Zod schemas",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -21,13 +21,13 @@
|
|
|
21
21
|
"vercel-ai",
|
|
22
22
|
"standard-schema"
|
|
23
23
|
],
|
|
24
|
-
"homepage": "https://github.com/
|
|
24
|
+
"homepage": "https://github.com/gkurt/padrone",
|
|
25
25
|
"bugs": {
|
|
26
|
-
"url": "https://github.com/
|
|
26
|
+
"url": "https://github.com/gkurt/padrone/issues"
|
|
27
27
|
},
|
|
28
28
|
"repository": {
|
|
29
29
|
"type": "git",
|
|
30
|
-
"url": "git+https://github.com/
|
|
30
|
+
"url": "git+https://github.com/gkurt/padrone.git"
|
|
31
31
|
},
|
|
32
32
|
"author": {
|
|
33
33
|
"name": "Gokhan Kurt",
|
|
@@ -68,16 +68,16 @@
|
|
|
68
68
|
"./codegen": {
|
|
69
69
|
"padrone@dev": "./src/codegen/index.ts",
|
|
70
70
|
"import": {
|
|
71
|
-
"types": "./dist/codegen.d.mts",
|
|
72
|
-
"default": "./dist/codegen.mjs"
|
|
71
|
+
"types": "./dist/codegen/index.d.mts",
|
|
72
|
+
"default": "./dist/codegen/index.mjs"
|
|
73
73
|
},
|
|
74
74
|
"source": "./src/codegen/index.ts"
|
|
75
75
|
},
|
|
76
76
|
"./docs": {
|
|
77
77
|
"padrone@dev": "./src/docs/index.ts",
|
|
78
78
|
"import": {
|
|
79
|
-
"types": "./dist/docs.d.mts",
|
|
80
|
-
"default": "./dist/docs.mjs"
|
|
79
|
+
"types": "./dist/docs/index.d.mts",
|
|
80
|
+
"default": "./dist/docs/index.mjs"
|
|
81
81
|
},
|
|
82
82
|
"source": "./src/docs/index.ts"
|
|
83
83
|
},
|
|
@@ -89,10 +89,58 @@
|
|
|
89
89
|
},
|
|
90
90
|
"source": "./src/zod.ts"
|
|
91
91
|
},
|
|
92
|
+
"./ink": {
|
|
93
|
+
"padrone@dev": "./src/ink.ts",
|
|
94
|
+
"import": {
|
|
95
|
+
"types": "./dist/ink.d.mts",
|
|
96
|
+
"default": "./dist/ink.mjs"
|
|
97
|
+
},
|
|
98
|
+
"source": "./src/ink.ts"
|
|
99
|
+
},
|
|
100
|
+
"./mcp": {
|
|
101
|
+
"padrone@dev": "./src/mcp.ts",
|
|
102
|
+
"import": {
|
|
103
|
+
"types": "./dist/mcp.d.mts",
|
|
104
|
+
"default": "./dist/mcp.mjs"
|
|
105
|
+
},
|
|
106
|
+
"source": "./src/mcp.ts"
|
|
107
|
+
},
|
|
108
|
+
"./serve": {
|
|
109
|
+
"padrone@dev": "./src/serve.ts",
|
|
110
|
+
"import": {
|
|
111
|
+
"types": "./dist/serve.d.mts",
|
|
112
|
+
"default": "./dist/serve.mjs"
|
|
113
|
+
},
|
|
114
|
+
"source": "./src/serve.ts"
|
|
115
|
+
},
|
|
116
|
+
"./tracing": {
|
|
117
|
+
"padrone@dev": "./src/tracing.ts",
|
|
118
|
+
"import": {
|
|
119
|
+
"types": "./dist/tracing.d.mts",
|
|
120
|
+
"default": "./dist/tracing.mjs"
|
|
121
|
+
},
|
|
122
|
+
"source": "./src/tracing.ts"
|
|
123
|
+
},
|
|
124
|
+
"./completion": {
|
|
125
|
+
"padrone@dev": "./src/completion.ts",
|
|
126
|
+
"import": {
|
|
127
|
+
"types": "./dist/completion.d.mts",
|
|
128
|
+
"default": "./dist/completion.mjs"
|
|
129
|
+
},
|
|
130
|
+
"source": "./src/completion.ts"
|
|
131
|
+
},
|
|
132
|
+
"./man": {
|
|
133
|
+
"padrone@dev": "./src/man.ts",
|
|
134
|
+
"import": {
|
|
135
|
+
"types": "./dist/man.d.mts",
|
|
136
|
+
"default": "./dist/man.mjs"
|
|
137
|
+
},
|
|
138
|
+
"source": "./src/man.ts"
|
|
139
|
+
},
|
|
92
140
|
"./package.json": "./package.json"
|
|
93
141
|
},
|
|
94
142
|
"scripts": {
|
|
95
|
-
"build": "tsdown src/index.ts src/test.ts src/zod.ts src/codegen/index.ts src/docs/index.ts --dts --sourcemap",
|
|
143
|
+
"build": "tsdown src/index.ts src/test.ts src/zod.ts src/ink.ts src/mcp.ts src/serve.ts src/tracing.ts src/completion.ts src/man.ts src/codegen/index.ts src/docs/index.ts --dts --sourcemap --unbundle",
|
|
96
144
|
"start": "bun --conditions=padrone@dev src/cli/index.ts",
|
|
97
145
|
"dev": "bun --conditions=padrone@dev --watch src/cli/index.ts",
|
|
98
146
|
"test": "bun test --conditions=padrone@dev",
|
|
@@ -105,16 +153,16 @@
|
|
|
105
153
|
"enquirer": "^2.4.1"
|
|
106
154
|
},
|
|
107
155
|
"devDependencies": {
|
|
108
|
-
"@types/react": "^19.2.
|
|
109
|
-
"ai": "^
|
|
110
|
-
"ink": "^
|
|
111
|
-
"react": "^19.2.
|
|
112
|
-
"tsdown": "^0.
|
|
113
|
-
"zod": "^4.3
|
|
156
|
+
"@types/react": "^19.2.17",
|
|
157
|
+
"ai": "^7.0.8",
|
|
158
|
+
"ink": "^7.1.0",
|
|
159
|
+
"react": "^19.2.7",
|
|
160
|
+
"tsdown": "^0.22.3",
|
|
161
|
+
"zod": "^4.4.3"
|
|
114
162
|
},
|
|
115
163
|
"peerDependencies": {
|
|
116
|
-
"ai": "5 || 6",
|
|
117
|
-
"ink": "^6.0.0",
|
|
164
|
+
"ai": "5 || 6 || 7",
|
|
165
|
+
"ink": "^6.0.0 || ^7.0.0",
|
|
118
166
|
"react": ">=18.0.0",
|
|
119
167
|
"zod": "^3.25.0 || ^4.0.0"
|
|
120
168
|
},
|
package/src/core/args.ts
CHANGED
|
@@ -208,10 +208,58 @@ export function preprocessArgs(
|
|
|
208
208
|
return result;
|
|
209
209
|
}
|
|
210
210
|
|
|
211
|
+
/**
|
|
212
|
+
* Walk a JSON schema fragment and collect the set of allowed primitive types,
|
|
213
|
+
* descending into `anyOf` / `oneOf` (used for unions). For variants whose type
|
|
214
|
+
* is `array`, item types are collected separately into `itemTypes`.
|
|
215
|
+
*/
|
|
216
|
+
function collectAllowedTypes(prop: Record<string, any> | undefined, types: Set<string>, itemTypes: Set<string>): void {
|
|
217
|
+
if (!prop) return;
|
|
218
|
+
|
|
219
|
+
if (prop.type !== undefined) {
|
|
220
|
+
const list = Array.isArray(prop.type) ? prop.type : [prop.type];
|
|
221
|
+
for (const t of list) {
|
|
222
|
+
if (typeof t === 'string') types.add(t);
|
|
223
|
+
}
|
|
224
|
+
if (list.includes('array') && prop.items) {
|
|
225
|
+
collectAllowedTypes(prop.items, itemTypes, new Set());
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
const variants = prop.anyOf ?? prop.oneOf;
|
|
230
|
+
if (Array.isArray(variants)) {
|
|
231
|
+
for (const variant of variants) collectAllowedTypes(variant, types, itemTypes);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/** Coerce a single CLI string to a primitive based on the set of allowed types. */
|
|
236
|
+
function coerceScalar(value: unknown, allowedTypes: Set<string>): unknown {
|
|
237
|
+
if (typeof value !== 'string') return value;
|
|
238
|
+
|
|
239
|
+
if (allowedTypes.has('boolean')) {
|
|
240
|
+
const lower = value.toLowerCase();
|
|
241
|
+
if (lower === 'true' || lower === '1' || lower === 'yes' || lower === 'on') return true;
|
|
242
|
+
if (lower === 'false' || lower === '0' || lower === 'no' || lower === 'off') return false;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
if (allowedTypes.has('number') || allowedTypes.has('integer')) {
|
|
246
|
+
const trimmed = value.trim();
|
|
247
|
+
if (trimmed !== '') {
|
|
248
|
+
const num = Number(trimmed);
|
|
249
|
+
if (!Number.isNaN(num)) return num;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
return value;
|
|
254
|
+
}
|
|
255
|
+
|
|
211
256
|
/**
|
|
212
257
|
* Auto-coerce CLI string values to match the expected schema types.
|
|
213
258
|
* Handles: string → number, string → boolean for primitive schema fields.
|
|
214
259
|
* Arrays of primitives are also coerced element-wise.
|
|
260
|
+
* Union types (`anyOf` / `oneOf`) are coerced to the most specific matching
|
|
261
|
+
* primitive — e.g. `--test true` for `z.union([z.boolean(), z.string()])`
|
|
262
|
+
* becomes the boolean `true` rather than the string "true".
|
|
215
263
|
*/
|
|
216
264
|
export function coerceArgs(data: Record<string, unknown>, schema: StandardJSONSchemaV1): Record<string, unknown> {
|
|
217
265
|
let properties: Record<string, any>;
|
|
@@ -229,43 +277,21 @@ export function coerceArgs(data: Record<string, unknown>, schema: StandardJSONSc
|
|
|
229
277
|
const prop = properties[key];
|
|
230
278
|
if (!prop) continue;
|
|
231
279
|
|
|
232
|
-
const
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
} else if (
|
|
246
|
-
|
|
247
|
-
const arr = Array.isArray(value) ? value : [value];
|
|
248
|
-
const itemType = prop.items?.type as string | undefined;
|
|
249
|
-
if (itemType === 'number' || itemType === 'integer') {
|
|
250
|
-
result[key] = arr.map((v) => {
|
|
251
|
-
if (typeof v === 'string') {
|
|
252
|
-
const num = Number(v);
|
|
253
|
-
return Number.isNaN(num) ? v : num;
|
|
254
|
-
}
|
|
255
|
-
return v;
|
|
256
|
-
});
|
|
257
|
-
} else if (itemType === 'boolean') {
|
|
258
|
-
result[key] = arr.map((v) => {
|
|
259
|
-
if (typeof v === 'string') {
|
|
260
|
-
const lower = v.toLowerCase();
|
|
261
|
-
if (lower === 'true' || lower === '1' || lower === 'yes' || lower === 'on') return true;
|
|
262
|
-
if (lower === 'false' || lower === '0' || lower === 'no' || lower === 'off') return false;
|
|
263
|
-
}
|
|
264
|
-
return v;
|
|
265
|
-
});
|
|
266
|
-
} else if (!Array.isArray(value)) {
|
|
267
|
-
result[key] = arr;
|
|
268
|
-
}
|
|
280
|
+
const types = new Set<string>();
|
|
281
|
+
const itemTypes = new Set<string>();
|
|
282
|
+
collectAllowedTypes(prop, types, itemTypes);
|
|
283
|
+
|
|
284
|
+
const isArrayValue = Array.isArray(value);
|
|
285
|
+
const allowsArray = types.has('array');
|
|
286
|
+
const allowsScalar = types.has('string') || types.has('boolean') || types.has('number') || types.has('integer');
|
|
287
|
+
|
|
288
|
+
if (isArrayValue && allowsArray) {
|
|
289
|
+
result[key] = value.map((v) => coerceScalar(v, itemTypes));
|
|
290
|
+
} else if (!isArrayValue && allowsArray && !allowsScalar) {
|
|
291
|
+
// Wrap single value into an array when only array shapes are allowed
|
|
292
|
+
result[key] = [coerceScalar(value, itemTypes)];
|
|
293
|
+
} else if (!isArrayValue) {
|
|
294
|
+
result[key] = coerceScalar(value, types);
|
|
269
295
|
}
|
|
270
296
|
}
|
|
271
297
|
|
package/src/core/runtime.ts
CHANGED
|
@@ -4,14 +4,14 @@ import type { HelpFormat } from '../output/formatter.ts';
|
|
|
4
4
|
/** Process signals that Padrone can handle for graceful shutdown. */
|
|
5
5
|
export type PadroneSignal = 'SIGINT' | 'SIGTERM' | 'SIGHUP';
|
|
6
6
|
|
|
7
|
-
/** Value accepted by `
|
|
7
|
+
/** Value accepted by `PadroneProgress.update()`. */
|
|
8
8
|
export type PadroneProgressUpdate = string | number | { message?: string; progress?: number; indeterminate?: boolean; time?: boolean };
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
11
|
* A progress indicator instance (spinner, progress bar, etc).
|
|
12
12
|
* Created by the runtime's `progress` factory and used to show loading state during command execution.
|
|
13
13
|
*/
|
|
14
|
-
export type
|
|
14
|
+
export type PadroneProgress = {
|
|
15
15
|
/**
|
|
16
16
|
* Update the indicator.
|
|
17
17
|
* - `string` — update the displayed message.
|
|
@@ -31,6 +31,15 @@ export type PadroneProgressIndicator = {
|
|
|
31
31
|
succeed: (message?: string | null, options?: { indicator?: string }) => void;
|
|
32
32
|
/** Mark as failed and stop. Pass `null` to stop without rendering a final message. */
|
|
33
33
|
fail: (message?: string | null, options?: { indicator?: string }) => void;
|
|
34
|
+
/** Control ETA (estimated time remaining) display at runtime. */
|
|
35
|
+
eta: {
|
|
36
|
+
/** Enable ETA tracking. Starts collecting samples from subsequent `update()` calls. */
|
|
37
|
+
start: () => void;
|
|
38
|
+
/** Disable ETA display. */
|
|
39
|
+
stop: () => void;
|
|
40
|
+
/** Clear collected samples and restart estimation. Useful between operation phases. */
|
|
41
|
+
reset: () => void;
|
|
42
|
+
};
|
|
34
43
|
/** Stop without success/fail status. */
|
|
35
44
|
stop: () => void;
|
|
36
45
|
/** Temporarily hide the indicator so other output can be written cleanly. */
|
|
@@ -21,6 +21,9 @@ export type WithCompletion<T> = WithCommand<T, 'completion', CompletionCommand>;
|
|
|
21
21
|
*
|
|
22
22
|
* Usage:
|
|
23
23
|
* ```ts
|
|
24
|
+
* import { createPadrone } from 'padrone';
|
|
25
|
+
* import { padroneCompletion } from 'padrone/completion';
|
|
26
|
+
*
|
|
24
27
|
* createPadrone('my-cli').extend(padroneCompletion())
|
|
25
28
|
* ```
|
|
26
29
|
*/
|
package/src/extension/index.ts
CHANGED
|
@@ -2,23 +2,15 @@ export type { WithAsync } from '../util/type-utils.ts';
|
|
|
2
2
|
export type { PadroneAutoOutputOptions } from './auto-output.ts';
|
|
3
3
|
export { padroneAutoOutput } from './auto-output.ts';
|
|
4
4
|
export { padroneColor } from './color.ts';
|
|
5
|
-
export type { WithCompletion } from './completion.ts';
|
|
6
|
-
export { padroneCompletion } from './completion.ts';
|
|
7
5
|
export type { PadroneConfigOptions } from './config.ts';
|
|
8
6
|
export { padroneConfig } from './config.ts';
|
|
9
7
|
export type { PadroneEnvOptions } from './env.ts';
|
|
10
8
|
export { padroneEnv } from './env.ts';
|
|
11
9
|
export type { HelpCommand, WithHelp } from './help.ts';
|
|
12
10
|
export { padroneHelp } from './help.ts';
|
|
13
|
-
export type { InkOptions } from './ink.ts';
|
|
14
|
-
export { isReactElement, padroneInk } from './ink.ts';
|
|
15
11
|
export { padroneInteractive } from './interactive.ts';
|
|
16
12
|
export type { PadroneLogger, PadroneLoggerConfig, PadroneLogLevel, WithLogger } from './logger.ts';
|
|
17
13
|
export { padroneLogger } from './logger.ts';
|
|
18
|
-
export type { WithMan } from './man.ts';
|
|
19
|
-
export { padroneMan } from './man.ts';
|
|
20
|
-
export type { WithMcp } from './mcp.ts';
|
|
21
|
-
export { padroneMcp } from './mcp.ts';
|
|
22
14
|
export type {
|
|
23
15
|
PadroneProgressConfig,
|
|
24
16
|
PadroneProgressDefaults,
|
|
@@ -31,15 +23,11 @@ export type { PadroneProgressRenderer } from './progress-renderer.ts';
|
|
|
31
23
|
export { createTerminalProgress } from './progress-renderer.ts';
|
|
32
24
|
export type { WithRepl } from './repl.ts';
|
|
33
25
|
export { padroneRepl } from './repl.ts';
|
|
34
|
-
export type { WithServe } from './serve.ts';
|
|
35
|
-
export { padroneServe } from './serve.ts';
|
|
36
26
|
export { padroneSignalHandling } from './signal.ts';
|
|
37
27
|
export { padroneStdin } from './stdin.ts';
|
|
38
28
|
export { padroneSuggestions } from './suggestions.ts';
|
|
39
29
|
export type { PadroneTimingOptions } from './timing.ts';
|
|
40
30
|
export { padroneTiming } from './timing.ts';
|
|
41
|
-
export type { OtelSpan, OtelTracer, OtelTracerProvider, PadroneTracer, PadroneTracingConfig, WithTracing } from './tracing.ts';
|
|
42
|
-
export { padroneTracing } from './tracing.ts';
|
|
43
31
|
export { padroneUpdateCheck } from './update-check.ts';
|
|
44
32
|
export type { VersionCommand, WithVersion } from './version.ts';
|
|
45
33
|
export { padroneVersion } from './version.ts';
|
package/src/extension/ink.ts
CHANGED
|
@@ -78,7 +78,8 @@ function createInkInterceptor(rawOptions?: InkOptions) {
|
|
|
78
78
|
* Requires `ink` and `react` as peer dependencies.
|
|
79
79
|
*
|
|
80
80
|
* ```ts
|
|
81
|
-
* import { createPadrone
|
|
81
|
+
* import { createPadrone } from 'padrone';
|
|
82
|
+
* import { padroneInk } from 'padrone/ink';
|
|
82
83
|
*
|
|
83
84
|
* const program = createPadrone('my-tui')
|
|
84
85
|
* .extend(padroneInk())
|
package/src/extension/man.ts
CHANGED
package/src/extension/mcp.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type {
|
|
2
2
|
PadroneBarConfig,
|
|
3
|
-
|
|
3
|
+
PadroneProgress,
|
|
4
4
|
PadroneProgressOptions,
|
|
5
5
|
PadroneProgressShow,
|
|
6
6
|
PadroneProgressUpdate,
|
|
@@ -134,8 +134,8 @@ function estimateEta(samples: { time: number; progress: number }[]): number | un
|
|
|
134
134
|
// Factory type
|
|
135
135
|
// ---------------------------------------------------------------------------
|
|
136
136
|
|
|
137
|
-
/** Factory function that creates a `
|
|
138
|
-
export type PadroneProgressRenderer = (message: string, options?: PadroneProgressOptions) =>
|
|
137
|
+
/** Factory function that creates a `PadroneProgress`. */
|
|
138
|
+
export type PadroneProgressRenderer = (message: string, options?: PadroneProgressOptions) => PadroneProgress;
|
|
139
139
|
|
|
140
140
|
// ---------------------------------------------------------------------------
|
|
141
141
|
// Default terminal renderer
|
|
@@ -145,7 +145,7 @@ export type PadroneProgressRenderer = (message: string, options?: PadroneProgres
|
|
|
145
145
|
* Creates a terminal progress indicator (spinner, bar, or both).
|
|
146
146
|
* Returns a no-op indicator in non-TTY/CI environments.
|
|
147
147
|
*/
|
|
148
|
-
export function createTerminalProgress(message: string, options?: PadroneProgressOptions):
|
|
148
|
+
export function createTerminalProgress(message: string, options?: PadroneProgressOptions): PadroneProgress {
|
|
149
149
|
const spinnerCfg = resolveSpinnerConfig(options?.spinner);
|
|
150
150
|
const successIcon = options?.successIndicator ?? '✔';
|
|
151
151
|
const errorIcon = options?.errorIndicator ?? '✖';
|
|
@@ -154,8 +154,10 @@ export function createTerminalProgress(message: string, options?: PadroneProgres
|
|
|
154
154
|
const formatFinal = (icon: string, msg: string) => (icon ? `${icon} ${msg}\n` : `${msg}\n`);
|
|
155
155
|
|
|
156
156
|
if (typeof process === 'undefined' || !process.stderr?.isTTY) {
|
|
157
|
+
const noopEta = { start() {}, stop() {}, reset() {} };
|
|
157
158
|
return {
|
|
158
159
|
update() {},
|
|
160
|
+
eta: noopEta,
|
|
159
161
|
succeed(msg, opts) {
|
|
160
162
|
if (msg === null) return;
|
|
161
163
|
const icon = opts?.indicator ?? successIcon;
|
|
@@ -176,11 +178,11 @@ export function createTerminalProgress(message: string, options?: PadroneProgres
|
|
|
176
178
|
const ansiPattern = /\x1b\[[0-9;]*m/g;
|
|
177
179
|
|
|
178
180
|
if (spinnerCfg.show === 'never' && (!barCfg || barCfg.show === 'never') && !message) {
|
|
179
|
-
return { update() {}, succeed() {}, fail() {}, stop() {}, pause() {}, resume() {} };
|
|
181
|
+
return { update() {}, eta: { start() {}, stop() {}, reset() {} }, succeed() {}, fail() {}, stop() {}, pause() {}, resume() {} };
|
|
180
182
|
}
|
|
181
183
|
|
|
182
184
|
const showTime = options?.time ?? false;
|
|
183
|
-
|
|
185
|
+
let etaEnabled = options?.eta ?? false;
|
|
184
186
|
|
|
185
187
|
let spinnerFrame = 0;
|
|
186
188
|
let barFrame = 0;
|
|
@@ -224,7 +226,7 @@ export function createTerminalProgress(message: string, options?: PadroneProgres
|
|
|
224
226
|
|
|
225
227
|
let line = '';
|
|
226
228
|
if (barVisible) line += formatBar(progress, barCfg!, barFrame);
|
|
227
|
-
const hasEta =
|
|
229
|
+
const hasEta = etaEnabled && progress !== undefined && progress < 1 && etaMs !== undefined;
|
|
228
230
|
if (timeEnabled || hasEta) {
|
|
229
231
|
const parts: string[] = [];
|
|
230
232
|
if (timeEnabled) parts.push(`⏱ ${formatDuration(Date.now() - startTime)}`);
|
|
@@ -278,6 +280,27 @@ export function createTerminalProgress(message: string, options?: PadroneProgres
|
|
|
278
280
|
clearLines();
|
|
279
281
|
};
|
|
280
282
|
|
|
283
|
+
const eta = {
|
|
284
|
+
start() {
|
|
285
|
+
if (stopped) return;
|
|
286
|
+
etaEnabled = true;
|
|
287
|
+
render();
|
|
288
|
+
},
|
|
289
|
+
stop() {
|
|
290
|
+
if (stopped) return;
|
|
291
|
+
etaEnabled = false;
|
|
292
|
+
etaMs = undefined;
|
|
293
|
+
render();
|
|
294
|
+
},
|
|
295
|
+
reset() {
|
|
296
|
+
if (stopped) return;
|
|
297
|
+
etaSamples.length = 0;
|
|
298
|
+
etaMs = undefined;
|
|
299
|
+
etaCalculatedAt = 0;
|
|
300
|
+
render();
|
|
301
|
+
},
|
|
302
|
+
};
|
|
303
|
+
|
|
281
304
|
return {
|
|
282
305
|
update(value) {
|
|
283
306
|
if (stopped) return;
|
|
@@ -285,7 +308,7 @@ export function createTerminalProgress(message: string, options?: PadroneProgres
|
|
|
285
308
|
if (parsed.message !== undefined) text = parsed.message;
|
|
286
309
|
if (parsed.progress !== undefined) {
|
|
287
310
|
progress = parsed.progress;
|
|
288
|
-
if (
|
|
311
|
+
if (etaEnabled) {
|
|
289
312
|
const now = Date.now();
|
|
290
313
|
etaSamples.push({ time: now, progress: parsed.progress });
|
|
291
314
|
const estimated = estimateEta(etaSamples);
|
|
@@ -309,6 +332,7 @@ export function createTerminalProgress(message: string, options?: PadroneProgres
|
|
|
309
332
|
}
|
|
310
333
|
render();
|
|
311
334
|
},
|
|
335
|
+
eta,
|
|
312
336
|
succeed(msg, opts) {
|
|
313
337
|
clear();
|
|
314
338
|
if (msg === null) return;
|