padrone 1.5.0 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/README.md +15 -11
  3. package/dist/{args-D5PNDyNu.mjs → args-Cnq0nwSM.mjs} +91 -41
  4. package/dist/args-Cnq0nwSM.mjs.map +1 -0
  5. package/dist/codegen/index.mjs +4 -4
  6. package/dist/codegen/index.mjs.map +1 -1
  7. package/dist/commands-B_gufyR9.mjs +514 -0
  8. package/dist/commands-B_gufyR9.mjs.map +1 -0
  9. package/dist/{completion.mjs → completion-BEuflbDO.mjs} +12 -82
  10. package/dist/completion-BEuflbDO.mjs.map +1 -0
  11. package/dist/docs/index.d.mts +4 -4
  12. package/dist/docs/index.d.mts.map +1 -1
  13. package/dist/docs/index.mjs +10 -12
  14. package/dist/docs/index.mjs.map +1 -1
  15. package/dist/{errors-BiVrBgi6.mjs → errors-DA4KzK1M.mjs} +26 -3
  16. package/dist/errors-DA4KzK1M.mjs.map +1 -0
  17. package/dist/{formatter-DtHzbP22.d.mts → formatter-DrvhDMrq.d.mts} +3 -3
  18. package/dist/formatter-DrvhDMrq.d.mts.map +1 -0
  19. package/dist/{help-bbmu9-qd.mjs → help-BtxLgrF_.mjs} +190 -43
  20. package/dist/help-BtxLgrF_.mjs.map +1 -0
  21. package/dist/{types-Ch8Mk6Qb.d.mts → index-D6-7dz0l.d.mts} +634 -745
  22. package/dist/index-D6-7dz0l.d.mts.map +1 -0
  23. package/dist/index.d.mts +869 -36
  24. package/dist/index.d.mts.map +1 -1
  25. package/dist/index.mjs +3884 -1699
  26. package/dist/index.mjs.map +1 -1
  27. package/dist/{mcp-mLWIdUIu.mjs → mcp-6-Jw4Bpq.mjs} +13 -15
  28. package/dist/mcp-6-Jw4Bpq.mjs.map +1 -0
  29. package/dist/{serve-B0u43DK7.mjs → serve-YVTPzBCl.mjs} +12 -14
  30. package/dist/serve-YVTPzBCl.mjs.map +1 -0
  31. package/dist/{stream-BcC146Ud.mjs → stream-DC4H8YTx.mjs} +24 -3
  32. package/dist/stream-DC4H8YTx.mjs.map +1 -0
  33. package/dist/test.d.mts +5 -8
  34. package/dist/test.d.mts.map +1 -1
  35. package/dist/test.mjs +2 -13
  36. package/dist/test.mjs.map +1 -1
  37. package/dist/{update-check-CFX1FV3v.mjs → update-check-CZ2VqjnV.mjs} +16 -17
  38. package/dist/update-check-CZ2VqjnV.mjs.map +1 -0
  39. package/dist/zod.d.mts +2 -2
  40. package/dist/zod.d.mts.map +1 -1
  41. package/dist/zod.mjs +2 -2
  42. package/dist/zod.mjs.map +1 -1
  43. package/package.json +15 -12
  44. package/src/cli/completions.ts +14 -11
  45. package/src/cli/docs.ts +13 -10
  46. package/src/cli/doctor.ts +22 -18
  47. package/src/cli/index.ts +28 -82
  48. package/src/cli/init.ts +10 -7
  49. package/src/cli/link.ts +20 -16
  50. package/src/cli/wrap.ts +14 -11
  51. package/src/codegen/schema-to-code.ts +2 -2
  52. package/src/{args.ts → core/args.ts} +32 -225
  53. package/src/core/commands.ts +373 -0
  54. package/src/core/create.ts +301 -0
  55. package/src/core/default-runtime.ts +239 -0
  56. package/src/{errors.ts → core/errors.ts} +22 -0
  57. package/src/core/exec.ts +259 -0
  58. package/src/core/interceptors.ts +302 -0
  59. package/src/{parse.ts → core/parse.ts} +36 -89
  60. package/src/core/program-methods.ts +301 -0
  61. package/src/core/results.ts +229 -0
  62. package/src/core/runtime.ts +246 -0
  63. package/src/core/validate.ts +247 -0
  64. package/src/docs/index.ts +12 -13
  65. package/src/extension/auto-output.ts +146 -0
  66. package/src/extension/color.ts +38 -0
  67. package/src/extension/completion.ts +49 -0
  68. package/src/extension/config.ts +262 -0
  69. package/src/extension/env.ts +101 -0
  70. package/src/extension/help.ts +192 -0
  71. package/src/extension/index.ts +44 -0
  72. package/src/extension/ink.ts +93 -0
  73. package/src/extension/interactive.ts +106 -0
  74. package/src/extension/logger.ts +262 -0
  75. package/src/extension/man.ts +51 -0
  76. package/src/extension/mcp.ts +52 -0
  77. package/src/extension/progress-renderer.ts +338 -0
  78. package/src/extension/progress.ts +299 -0
  79. package/src/extension/repl.ts +94 -0
  80. package/src/extension/serve.ts +48 -0
  81. package/src/extension/signal.ts +87 -0
  82. package/src/extension/stdin.ts +62 -0
  83. package/src/extension/suggestions.ts +114 -0
  84. package/src/extension/timing.ts +81 -0
  85. package/src/extension/tracing.ts +175 -0
  86. package/src/extension/update-check.ts +77 -0
  87. package/src/extension/utils.ts +51 -0
  88. package/src/extension/version.ts +63 -0
  89. package/src/{completion.ts → feature/completion.ts} +12 -12
  90. package/src/{interactive.ts → feature/interactive.ts} +4 -4
  91. package/src/{mcp.ts → feature/mcp.ts} +12 -15
  92. package/src/{repl-loop.ts → feature/repl-loop.ts} +10 -13
  93. package/src/{serve.ts → feature/serve.ts} +11 -15
  94. package/src/feature/test.ts +262 -0
  95. package/src/{update-check.ts → feature/update-check.ts} +16 -16
  96. package/src/{wrap.ts → feature/wrap.ts} +10 -8
  97. package/src/index.ts +115 -30
  98. package/src/{formatter.ts → output/formatter.ts} +124 -176
  99. package/src/{help.ts → output/help.ts} +22 -8
  100. package/src/output/output-indicator.ts +87 -0
  101. package/src/output/primitives.ts +335 -0
  102. package/src/output/styling.ts +221 -0
  103. package/src/{zod.d.ts → schema/zod.d.ts} +1 -1
  104. package/src/schema/zod.ts +50 -0
  105. package/src/test.ts +2 -276
  106. package/src/types/args-meta.ts +151 -0
  107. package/src/types/builder.ts +718 -0
  108. package/src/types/command.ts +157 -0
  109. package/src/types/index.ts +60 -0
  110. package/src/types/interceptor.ts +296 -0
  111. package/src/types/preferences.ts +83 -0
  112. package/src/types/result.ts +71 -0
  113. package/src/types/schema.ts +19 -0
  114. package/src/util/dotenv.ts +244 -0
  115. package/src/{shell-utils.ts → util/shell-utils.ts} +26 -9
  116. package/src/{stream.ts → util/stream.ts} +27 -1
  117. package/src/{type-helpers.ts → util/type-helpers.ts} +23 -16
  118. package/src/{type-utils.ts → util/type-utils.ts} +71 -33
  119. package/src/util/utils.ts +51 -0
  120. package/src/zod.ts +1 -50
  121. package/dist/args-D5PNDyNu.mjs.map +0 -1
  122. package/dist/chunk-CjcI7cDX.mjs +0 -15
  123. package/dist/command-utils-B1D-HqCd.mjs +0 -1117
  124. package/dist/command-utils-B1D-HqCd.mjs.map +0 -1
  125. package/dist/completion.d.mts +0 -64
  126. package/dist/completion.d.mts.map +0 -1
  127. package/dist/completion.mjs.map +0 -1
  128. package/dist/errors-BiVrBgi6.mjs.map +0 -1
  129. package/dist/formatter-DtHzbP22.d.mts.map +0 -1
  130. package/dist/help-bbmu9-qd.mjs.map +0 -1
  131. package/dist/mcp-mLWIdUIu.mjs.map +0 -1
  132. package/dist/serve-B0u43DK7.mjs.map +0 -1
  133. package/dist/stream-BcC146Ud.mjs.map +0 -1
  134. package/dist/types-Ch8Mk6Qb.d.mts.map +0 -1
  135. package/dist/update-check-CFX1FV3v.mjs.map +0 -1
  136. package/src/command-utils.ts +0 -882
  137. package/src/create.ts +0 -1829
  138. package/src/runtime.ts +0 -497
  139. package/src/types.ts +0 -1291
  140. package/src/utils.ts +0 -140
  141. /package/src/{colorizer.ts → output/colorizer.ts} +0 -0
@@ -0,0 +1,262 @@
1
+ import { defineInterceptor } from '#src/core/interceptors.ts';
2
+ import { thenMaybe } from '#src/core/results.ts';
3
+ import type { ResolvedPadroneRuntime } from '#src/core/runtime.ts';
4
+ import type { AnyPadroneBuilder, CommandTypesBase } from '#src/types/index.ts';
5
+ import type { WithInterceptor } from '#src/util/type-utils.ts';
6
+ import type { PadroneTracer } from './tracing.ts';
7
+
8
+ // ---------------------------------------------------------------------------
9
+ // Types
10
+ // ---------------------------------------------------------------------------
11
+
12
+ /** Log level values ordered by severity. */
13
+ export type PadroneLogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'silent';
14
+
15
+ /** Logger instance injected into the command context. */
16
+ export type PadroneLogger = {
17
+ trace: (...args: unknown[]) => void;
18
+ debug: (...args: unknown[]) => void;
19
+ info: (...args: unknown[]) => void;
20
+ warn: (...args: unknown[]) => void;
21
+ error: (...args: unknown[]) => void;
22
+ /** The current effective log level. */
23
+ level: PadroneLogLevel;
24
+ /** Create a child logger with a prefix label. */
25
+ child: (label: string) => PadroneLogger;
26
+ };
27
+
28
+ /** Configuration for the logger extension. */
29
+ export type PadroneLoggerConfig = {
30
+ /** Minimum log level to output. Defaults to `'info'`. */
31
+ level?: PadroneLogLevel;
32
+ /** Prefix prepended to every log message. */
33
+ prefix?: string;
34
+ /** Include timestamps in log output. Defaults to `false`. */
35
+ timestamps?: boolean;
36
+ };
37
+
38
+ /** Builder/program type after applying `padroneLogger()`. Adds `{ logger: PadroneLogger }` to the command context. */
39
+ export type WithLogger<T> = WithInterceptor<T, { logger: PadroneLogger }>;
40
+
41
+ // ---------------------------------------------------------------------------
42
+ // Internal helpers
43
+ // ---------------------------------------------------------------------------
44
+
45
+ const LEVEL_ORDER: Record<PadroneLogLevel, number> = { trace: 0, debug: 1, info: 2, warn: 3, error: 4, silent: 5 };
46
+ const LEVEL_LABELS: Record<Exclude<PadroneLogLevel, 'silent'>, string> = {
47
+ trace: 'TRACE',
48
+ debug: 'DEBUG',
49
+ info: 'INFO',
50
+ warn: 'WARN',
51
+ error: 'ERROR',
52
+ };
53
+ const VALID_LEVELS = new Set<string>(Object.keys(LEVEL_ORDER));
54
+
55
+ /** Format specifier pattern: matches %s, %d, %i, %f, %o, %O, %j, %% */
56
+ const FORMAT_PATTERN = /%%|%[sdifjoO]/g;
57
+
58
+ /**
59
+ * Applies printf-style format specifiers to args, following the WHATWG Console Standard
60
+ * and Node.js `util.format` conventions. Remaining args are appended space-separated.
61
+ */
62
+ function formatArgs(args: unknown[]): string {
63
+ if (args.length === 0) return '';
64
+ if (typeof args[0] !== 'string' || !FORMAT_PATTERN.test(args[0])) {
65
+ return args.map((a) => (typeof a === 'string' ? a : JSON.stringify(a))).join(' ');
66
+ }
67
+
68
+ const template = args[0];
69
+ let argIndex = 1;
70
+ const result = template.replace(FORMAT_PATTERN, (token) => {
71
+ if (token === '%%') return '%';
72
+ if (argIndex >= args.length) return token;
73
+ const val = args[argIndex++];
74
+ switch (token) {
75
+ case '%s':
76
+ return String(val);
77
+ case '%d':
78
+ case '%i':
79
+ return String(Math.trunc(Number(val)));
80
+ case '%f':
81
+ return String(Number(val));
82
+ case '%j':
83
+ try {
84
+ return JSON.stringify(val);
85
+ } catch {
86
+ return '[Circular]';
87
+ }
88
+ case '%o':
89
+ case '%O':
90
+ return typeof val === 'string' ? val : JSON.stringify(val);
91
+ default:
92
+ return token;
93
+ }
94
+ });
95
+
96
+ // Append remaining args that weren't consumed by specifiers
97
+ const remaining = args.slice(argIndex);
98
+ if (remaining.length === 0) return result;
99
+ const tail = remaining.map((a) => (typeof a === 'string' ? a : JSON.stringify(a))).join(' ');
100
+ return `${result} ${tail}`;
101
+ }
102
+
103
+ function resolveCliLevel(rawArgs: Record<string, unknown>): PadroneLogLevel | undefined {
104
+ // --trace → trace level
105
+ if ('trace' in rawArgs) {
106
+ const t = rawArgs.trace;
107
+ delete rawArgs.trace;
108
+ if (t !== false) return 'trace';
109
+ }
110
+ // --verbose / --debug → debug level
111
+ if ('verbose' in rawArgs) {
112
+ const v = rawArgs.verbose;
113
+ delete rawArgs.verbose;
114
+ if (v !== false) return 'debug';
115
+ }
116
+ if ('debug' in rawArgs) {
117
+ const d = rawArgs.debug;
118
+ delete rawArgs.debug;
119
+ if (d !== false) return 'debug';
120
+ }
121
+ // --silent / --quiet → suppress all output
122
+ if ('silent' in rawArgs) {
123
+ const s = rawArgs.silent;
124
+ delete rawArgs.silent;
125
+ if (s !== false) return 'silent';
126
+ }
127
+ if ('quiet' in rawArgs) {
128
+ const q = rawArgs.quiet;
129
+ delete rawArgs.quiet;
130
+ if (q !== false) return 'silent';
131
+ }
132
+ // --log-level=<level> → explicit level (parser keeps kebab-case)
133
+ if ('log-level' in rawArgs) {
134
+ const val = rawArgs['log-level'];
135
+ delete rawArgs['log-level'];
136
+ if (typeof val === 'string' && VALID_LEVELS.has(val)) return val as PadroneLogLevel;
137
+ }
138
+ return undefined;
139
+ }
140
+
141
+ function createLogger(
142
+ runtime: ResolvedPadroneRuntime,
143
+ level: PadroneLogLevel,
144
+ config: ResolvedLoggerConfig,
145
+ tracing?: PadroneTracer,
146
+ ): PadroneLogger {
147
+ const threshold = LEVEL_ORDER[level];
148
+
149
+ function format(lvl: Exclude<PadroneLogLevel, 'silent'>, prefix: string, args: unknown[]): string {
150
+ const parts: string[] = [];
151
+ if (config.timestamps) parts.push(new Date().toISOString());
152
+ parts.push(`[${LEVEL_LABELS[lvl]}]`);
153
+ if (prefix) parts.push(prefix);
154
+ parts.push(formatArgs(args));
155
+ return parts.join(' ');
156
+ }
157
+
158
+ function makeLogger(prefix: string): PadroneLogger {
159
+ const emit = (lvl: Exclude<PadroneLogLevel, 'silent'>, args: unknown[]) => {
160
+ if (LEVEL_ORDER[lvl] < threshold) return;
161
+ const message = format(lvl, prefix, args);
162
+ tracing?.rootSpan.addEvent('log', {
163
+ 'log.level': lvl,
164
+ 'log.message': args.map((a) => (typeof a === 'string' ? a : JSON.stringify(a))).join(' '),
165
+ });
166
+ if (lvl === 'error' || lvl === 'warn') runtime.error(message);
167
+ else runtime.output(message);
168
+ };
169
+
170
+ return {
171
+ trace: (...args) => emit('trace', args),
172
+ debug: (...args) => emit('debug', args),
173
+ info: (...args) => emit('info', args),
174
+ warn: (...args) => emit('warn', args),
175
+ error: (...args) => emit('error', args),
176
+ level,
177
+ child: (label) => makeLogger(prefix ? `${prefix} [${label}]` : `[${label}]`),
178
+ };
179
+ }
180
+
181
+ return makeLogger(config.prefix);
182
+ }
183
+
184
+ // ---------------------------------------------------------------------------
185
+ // Interceptor
186
+ // ---------------------------------------------------------------------------
187
+
188
+ type ResolvedLoggerConfig = { level: PadroneLogLevel; prefix: string; timestamps: boolean };
189
+
190
+ function loggerInterceptor(rawConfig?: PadroneLoggerConfig) {
191
+ return defineInterceptor({ id: 'padrone:logger', name: 'padrone:logger' })
192
+ .requires<{ tracing?: PadroneTracer; loggerConfig?: PadroneLoggerConfig }>()
193
+ .factory(() => {
194
+ let cliLevel: PadroneLogLevel | undefined;
195
+
196
+ return {
197
+ parse(_ctx, next) {
198
+ return thenMaybe(next(), (res) => {
199
+ cliLevel = resolveCliLevel(res.rawArgs);
200
+ return res;
201
+ });
202
+ },
203
+
204
+ execute(ctx, next) {
205
+ const ctxCfg = (ctx.context as Record<string, unknown> | undefined)?.loggerConfig as PadroneLoggerConfig | undefined;
206
+ const resolved: ResolvedLoggerConfig = {
207
+ level: cliLevel ?? rawConfig?.level ?? ctxCfg?.level ?? 'info',
208
+ prefix: rawConfig?.prefix ?? '',
209
+ timestamps: rawConfig?.timestamps ?? ctxCfg?.timestamps ?? false,
210
+ };
211
+ const logger = createLogger(ctx.runtime, resolved.level, resolved, ctx.context?.tracing);
212
+ return next({ context: { ...ctx.context, logger } });
213
+ },
214
+ };
215
+ });
216
+ }
217
+
218
+ // ---------------------------------------------------------------------------
219
+ // Extension
220
+ // ---------------------------------------------------------------------------
221
+
222
+ /**
223
+ * Extension that injects a structured logger into the command context.
224
+ *
225
+ * The logger respects a configurable log level threshold, supports prefixed
226
+ * child loggers, and routes output through the runtime's `output`/`error`
227
+ * functions so it works in any environment (terminal, test, web).
228
+ *
229
+ * Supports CLI flags for runtime level overrides:
230
+ * - `--trace` → sets level to `trace`
231
+ * - `--verbose` or `--debug` → sets level to `debug`
232
+ * - `--silent` or `--quiet` → sets level to `silent`
233
+ * - `--log-level=<level>` → sets an explicit level (`trace`, `debug`, `info`, `warn`, `error`, `silent`)
234
+ *
235
+ * CLI flags take precedence over the programmatic config.
236
+ *
237
+ * Provides `{ logger: PadroneLogger }` on the command context.
238
+ * Access it in action handlers as `ctx.context.logger`.
239
+ *
240
+ * Usage:
241
+ * ```ts
242
+ * createPadrone('my-cli')
243
+ * .extend(padroneLogger({ level: 'info' }))
244
+ * .command('sync', (c) =>
245
+ * c.action((_args, ctx) => {
246
+ * ctx.context.logger.info('starting sync');
247
+ * const db = ctx.context.logger.child('db');
248
+ * db.debug('connecting...');
249
+ * })
250
+ * )
251
+ * ```
252
+ *
253
+ * Then run:
254
+ * ```sh
255
+ * my-cli sync --verbose # debug level
256
+ * my-cli sync --quiet # silent
257
+ * my-cli sync --log-level=warn
258
+ * ```
259
+ */
260
+ export function padroneLogger<T extends CommandTypesBase>(config?: PadroneLoggerConfig): (builder: T) => WithLogger<T> {
261
+ return ((builder: AnyPadroneBuilder) => builder.intercept(loggerInterceptor(config))) as any;
262
+ }
@@ -0,0 +1,51 @@
1
+ import { resolveAllCommands } from '../core/commands.ts';
2
+ import type { AnyPadroneBuilder, CommandTypesBase, PadroneCommand } from '../types/index.ts';
3
+ import type { PadroneSchema } from '../types/schema.ts';
4
+ import type { WithCommand } from '../util/type-utils.ts';
5
+ import { getRootCommand } from '../util/utils.ts';
6
+ import { passthroughSchema } from './utils.ts';
7
+
8
+ // ── Types ────────────────────────────────────────────────────────────────
9
+
10
+ type ManArgs = { setup?: boolean; remove?: boolean };
11
+
12
+ type ManCommand = PadroneCommand<'man', '', PadroneSchema<ManArgs>, string, [], [], true>;
13
+
14
+ export type WithMan<T> = WithCommand<T, 'man', ManCommand>;
15
+
16
+ // ── Extension ────────────────────────────────────────────────────────────
17
+
18
+ /**
19
+ * Extension that adds the `man` command for man page generation.
20
+ *
21
+ * Usage:
22
+ * ```ts
23
+ * createPadrone('my-cli').extend(padroneMan())
24
+ * ```
25
+ */
26
+ export function padroneMan(): <T extends CommandTypesBase>(builder: T) => WithMan<T> {
27
+ return ((builder: AnyPadroneBuilder) =>
28
+ builder.command('man', (c) =>
29
+ c
30
+ .configure({ description: 'Generate man pages', hidden: true })
31
+ .arguments(passthroughSchema({ setup: 'boolean', remove: 'boolean' }))
32
+ .async()
33
+ .action(async (args, ctx) => {
34
+ const rootCommand = getRootCommand(ctx.command);
35
+ resolveAllCommands(rootCommand);
36
+ const { setupManPages, removeManPages, generateDocs } = await import('../docs/index.ts');
37
+ if (args.setup) {
38
+ const setupResult = await setupManPages(rootCommand);
39
+ return `${setupResult.updated ? 'Updated' : 'Installed'} ${setupResult.written.length} man page(s) in ${setupResult.dir}`;
40
+ }
41
+ if (args.remove) {
42
+ const removeResult = await removeManPages(rootCommand);
43
+ return removeResult.removed.length > 0
44
+ ? `Removed ${removeResult.removed.length} man page(s) from ${removeResult.dir}`
45
+ : 'No man pages found to remove.';
46
+ }
47
+ const docsResult = generateDocs(rootCommand, { format: 'man' });
48
+ return docsResult.pages[0]?.content ?? '';
49
+ }),
50
+ )) as any;
51
+ }
@@ -0,0 +1,52 @@
1
+ import { resolveAllCommands } from '../core/commands.ts';
2
+ import type { PadroneMcpPreferences } from '../feature/mcp.ts';
3
+ import type { AnyPadroneBuilder, CommandTypesBase, PadroneCommand } from '../types/index.ts';
4
+ import type { PadroneSchema } from '../types/schema.ts';
5
+ import type { WithCommand } from '../util/type-utils.ts';
6
+ import { getRootCommand } from '../util/utils.ts';
7
+ import { passthroughSchema } from './utils.ts';
8
+
9
+ // ── Types ────────────────────────────────────────────────────────────────
10
+
11
+ type McpArgs = { transport?: string; port?: string; host?: string; basePath?: string };
12
+
13
+ type McpCommand = PadroneCommand<'mcp', '', PadroneSchema<McpArgs>, void, [], [], true>;
14
+
15
+ export type WithMcp<T> = WithCommand<T, 'mcp', McpCommand>;
16
+
17
+ // ── Extension ────────────────────────────────────────────────────────────
18
+
19
+ /**
20
+ * Extension that adds the `mcp` command for starting a Model Context Protocol server.
21
+ *
22
+ * Usage:
23
+ * ```ts
24
+ * createPadrone('my-cli').extend(padroneMcp())
25
+ * ```
26
+ */
27
+ export function padroneMcp(defaults?: PadroneMcpPreferences): <T extends CommandTypesBase>(builder: T) => WithMcp<T> {
28
+ return ((builder: AnyPadroneBuilder) =>
29
+ builder.command('mcp', (c) =>
30
+ c
31
+ .configure({ description: 'Start a Model Context Protocol server', hidden: true })
32
+ .arguments(passthroughSchema({ transport: 'string', port: 'string', host: 'string', 'base-path': 'string' }), {
33
+ positional: ['transport'],
34
+ })
35
+ .async()
36
+ .action(async (args, ctx) => {
37
+ const rootCommand = getRootCommand(ctx.command);
38
+ resolveAllCommands(rootCommand);
39
+ const { startMcpServer } = await import('../feature/mcp.ts');
40
+ const transport = args.transport === 'stdio' || args.transport === 'http' ? args.transport : undefined;
41
+ const port = args.port ? parseInt(args.port, 10) : undefined;
42
+ const prefs: PadroneMcpPreferences = {
43
+ ...defaults,
44
+ transport: transport ?? defaults?.transport,
45
+ port: port && !Number.isNaN(port) ? port : defaults?.port,
46
+ host: args.host ?? defaults?.host,
47
+ basePath: args['base-path'] ?? defaults?.basePath,
48
+ };
49
+ await startMcpServer(ctx.program, rootCommand, ctx.program.eval, prefs);
50
+ }),
51
+ )) as any;
52
+ }