padrone 1.8.1 → 1.8.2

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["_fs","_path","initNodeModules","formatDuration"],"sources":["../src/core/results.ts","../src/core/interceptors.ts","../src/output/primitives.ts","../src/output/output-indicator.ts","../src/extension/auto-output.ts","../src/extension/color.ts","../src/core/parse.ts","../src/core/validate.ts","../src/extension/utils.ts","../src/extension/help.ts","../src/feature/interactive.ts","../src/extension/interactive.ts","../src/extension/repl.ts","../src/extension/signal.ts","../src/extension/stdin.ts","../src/extension/suggestions.ts","../src/extension/version.ts","../src/feature/wrap.ts","../src/core/exec.ts","../src/feature/repl-loop.ts","../src/core/program-methods.ts","../src/core/create.ts","../src/extension/completion.ts","../src/extension/config.ts","../src/util/dotenv.ts","../src/extension/env.ts","../src/extension/ink.ts","../src/extension/logger.ts","../src/extension/man.ts","../src/extension/mcp.ts","../src/extension/progress-renderer.ts","../src/extension/progress.ts","../src/extension/serve.ts","../src/extension/timing.ts","../src/extension/tracing.ts","../src/extension/update-check.ts"],"sourcesContent":["import type { AnyPadroneCommand, PadroneSchema } from '../types/index.ts';\nimport type { Thenable } from '../util/type-utils.ts';\nimport { getCommandRuntime } from './commands.ts';\n\n/**\n * Brands a schema as async, signaling that its `validate()` may return a Promise.\n * When an async-branded schema is passed to `.arguments()`, `.configFile()`, or `.env()`,\n * the command's `parse()` and `cli()` will return Promises.\n */\nexport function asyncSchema<T extends PadroneSchema>(schema: T): T & { '~async': true } {\n return Object.assign(schema, { '~async': true as const });\n}\n\nexport const noop = <TRes>() => undefined as TRes;\n\n/**\n * Maps over a value that may or may not be a Promise.\n * If the value is a Promise, chains with `.then()`. Otherwise, calls the function synchronously.\n * This preserves sync behavior for sync schemas and async behavior for async schemas.\n */\nexport function thenMaybe<T, U>(value: T | Promise<T>, fn: (v: T) => U | Promise<U>): U | Promise<U> {\n if (value instanceof Promise) return value.then(fn);\n return fn(value);\n}\n\n/**\n * Makes a sync result object thenable by adding `.then()`, `.catch()`, and `.finally()` methods.\n * If the value is already a Promise, returns it as-is.\n * This allows users to write `await program.cli()` or `program.cli().then(...)` regardless of sync/async.\n *\n * The `.then()` resolves with a plain copy (without thenable methods) to avoid infinite\n * recursive unwrapping by the Promise resolution algorithm.\n */\nexport function makeThenable<T>(value: T | Promise<T>): Thenable<T> {\n if (value instanceof Promise) return value as any;\n if (value !== null && typeof value === 'object' && !('then' in value)) {\n const toPlain = () => {\n const plain = { ...value } as any;\n delete plain.then;\n delete plain.catch;\n delete plain.finally;\n return plain as T;\n };\n // biome-ignore lint/suspicious/noThenProperty: intentional thenable shim for sync results\n (value as any).then = (onfulfilled?: (v: T) => any, onrejected?: (reason: any) => any) => {\n try {\n const result = onfulfilled ? onfulfilled(toPlain()) : toPlain();\n return Promise.resolve(result);\n } catch (err) {\n if (onrejected) return Promise.resolve(onrejected(err));\n return Promise.reject(err);\n }\n };\n (value as any).catch = (onrejected?: (reason: any) => any) => (value as any).then(undefined, onrejected);\n (value as any).finally = (onfinally?: () => void) =>\n (value as any).then(\n (v: any) => {\n onfinally?.();\n return v;\n },\n (err: any) => {\n onfinally?.();\n throw err;\n },\n );\n }\n return value as any;\n}\n\n/**\n * Wraps a Promise to include a `drain()` method at the top level.\n * This allows `await promise.drain()` without first awaiting the promise.\n * Since cli/eval never reject, this just delegates to the resolved result's `drain()`.\n */\nexport function withPromiseDrain<T extends Promise<any>>(promise: T): T & { drain: () => Promise<any> } {\n (promise as any).drain = async () => {\n const resolved = await promise;\n return resolved.drain();\n };\n return promise as any;\n}\n\nexport function isIterator(value: unknown): value is Iterator<unknown> {\n return typeof value === 'object' && value !== null && Symbol.iterator in value && typeof (value as any)[Symbol.iterator] === 'function';\n}\n\nexport function isAsyncIterator(value: unknown): value is AsyncIterator<unknown> {\n return (\n typeof value === 'object' &&\n value !== null &&\n Symbol.asyncIterator in value &&\n typeof (value as any)[Symbol.asyncIterator] === 'function'\n );\n}\n\n/**\n * Writes a command's return value to output, handling promises, iterators, and async iterators.\n * Values are passed directly to the output function without stringification —\n * runtimes like Node/Bun already format objects via console.log.\n * Returns void or a Promise depending on whether async consumption is needed.\n */\nexport function outputValue(value: unknown, output: (...args: unknown[]) => void): void | Promise<void> {\n if (value == null) return;\n\n // Async iterator — consume and output each yielded value\n if (isAsyncIterator(value)) {\n return (async () => {\n const iter = (value as any)[Symbol.asyncIterator]();\n while (true) {\n const { done, value: item } = await iter.next();\n if (done) break;\n if (item != null) output(item);\n }\n })();\n }\n\n // Sync iterator (but not a plain string/array which also have Symbol.iterator)\n if (typeof value !== 'string' && !Array.isArray(value) && isIterator(value)) {\n const iter = (value as any)[Symbol.iterator]();\n while (true) {\n const { done, value: item } = iter.next();\n if (done) break;\n if (item != null) output(item);\n }\n return;\n }\n\n // Promise — await then output\n if (value instanceof Promise) {\n return value.then((resolved) => outputValue(resolved, output));\n }\n\n // Pass value directly — runtime handles formatting\n output(value);\n}\n\n/**\n * Resolves a result value by unwrapping Promises and collecting iterables into arrays.\n * This is the runtime counterpart of the `Drained<T>` type.\n */\nexport async function drainValue(value: unknown): Promise<unknown> {\n // Unwrap promises first\n if (value instanceof Promise) {\n return drainValue(await value);\n }\n\n // Async iterator — collect into array\n if (isAsyncIterator(value)) {\n const items: unknown[] = [];\n const iter = (value as any)[Symbol.asyncIterator]();\n while (true) {\n const { done, value: item } = await iter.next();\n if (done) break;\n items.push(item);\n }\n return items;\n }\n\n // Sync iterator (but not string/array)\n if (typeof value !== 'string' && !Array.isArray(value) && isIterator(value)) {\n const items: unknown[] = [];\n const iter = (value as any)[Symbol.iterator]();\n while (true) {\n const { done, value: item } = iter.next();\n if (done) break;\n items.push(item);\n }\n return items;\n }\n\n return value;\n}\n\n/**\n * Attaches a `drain()` method to a command result object.\n * If the result has an `error` field, `drain()` returns `{ error }`.\n * Otherwise, resolves the result (unwrapping Promises, collecting iterables), catches errors,\n * and returns a discriminated union `{ value } | { error }` that never throws.\n */\nexport function withDrain<T extends Record<string, unknown>>(obj: T): T & { drain: () => Promise<any> } {\n (obj as any).drain = async () => {\n if ('error' in obj && obj.error !== undefined) {\n return { error: obj.error };\n }\n try {\n const value = await drainValue(obj.result);\n return { value };\n } catch (err) {\n return { error: err };\n }\n };\n return obj as any;\n}\n\n/**\n * Creates an error command result with a `drain()` that returns the error.\n */\nexport function errorResult(error: unknown, partial?: { command?: unknown; args?: unknown; argsResult?: unknown }) {\n return withDrain({\n error,\n result: undefined,\n command: partial?.command,\n args: partial?.args,\n argsResult: partial?.argsResult,\n });\n}\n\nexport function isAsyncBranded(schema: unknown): boolean {\n return !!schema && typeof schema === 'object' && '~async' in schema && (schema as any)['~async'] === true;\n}\n\nexport function hasInteractiveConfig(meta: unknown): boolean {\n if (!meta || typeof meta !== 'object') return false;\n const m = meta as Record<string, unknown>;\n return m.interactive === true || Array.isArray(m.interactive) || m.optionalInteractive === true || Array.isArray(m.optionalInteractive);\n}\n\nexport function warnIfUnexpectedAsync<T>(value: T, command: AnyPadroneCommand): T {\n const runtime = getCommandRuntime(command);\n if (runtime.env().NODE_ENV === 'production') return value;\n if (value instanceof Promise && !command.isAsync) {\n runtime.error(\n `[padrone] Command \"${command.path || command.name}\" returned a Promise from validation, ` +\n `but was not marked as async. Use \\`.async()\\` on the builder or \\`asyncSchema()\\` to brand your schema. ` +\n `Without this, TypeScript will infer a sync return type and the result will be a Promise at runtime.`,\n );\n }\n return value;\n}\n","import type {\n AnyPadroneCommand,\n AnyPadroneProgram,\n InterceptorDefBuilder,\n InterceptorErrorContext,\n InterceptorErrorResult,\n InterceptorFactory,\n InterceptorMeta,\n InterceptorShutdownContext,\n InterceptorStartContext,\n PadroneInterceptorFn,\n RegisteredInterceptor,\n ResolvedInterceptor,\n} from '../types/index.ts';\nimport { thenMaybe } from './results.ts';\nimport type { ResolvedPadroneRuntime } from './runtime.ts';\n\n// ---------------------------------------------------------------------------\n// defineInterceptor — creates a single-value distributable interceptor\n// ---------------------------------------------------------------------------\n\nfunction buildInterceptorFn(meta: InterceptorMeta, factory: InterceptorFactory<any, any, any>): PadroneInterceptorFn<any, any, any> {\n Object.defineProperty(factory, 'name', { value: meta.name, configurable: true });\n if (meta.id !== undefined) (factory as any).id = meta.id;\n if (meta.order !== undefined) (factory as any).order = meta.order;\n if (meta.disabled !== undefined) (factory as any).disabled = meta.disabled;\n if (meta.inherit !== undefined) (factory as any).inherit = meta.inherit;\n (factory as any).provides = () => factory;\n (factory as any).requires = () => factory;\n return factory as PadroneInterceptorFn<any, any, any>;\n}\n\n/**\n * Creates a self-contained interceptor value by attaching static metadata to the factory function.\n * The returned value can be passed directly to `.intercept()` or exported from a package.\n *\n * Two-arg form — define metadata and factory in one call:\n * ```ts\n * export const myInterceptor = defineInterceptor(\n * { name: 'my-interceptor', order: 10 },\n * () => ({\n * execute(ctx, next) { return next(); },\n * }),\n * );\n * ```\n *\n * Single-arg form — chain `.requires<T>()` for typed context, then `.factory()`:\n * ```ts\n * export const myInterceptor = defineInterceptor({ name: 'with-db' })\n * .requires<{ db: DB }>()\n * .factory(() => ({\n * execute(ctx, next) {\n * ctx.context.db; // typed!\n * return next();\n * },\n * }));\n * ```\n */\nexport function defineInterceptor<TArgs = unknown, TResult = unknown>(\n meta: InterceptorMeta,\n factory: InterceptorFactory<TArgs, TResult>,\n): PadroneInterceptorFn<TArgs, TResult>;\nexport function defineInterceptor(meta: InterceptorMeta): InterceptorDefBuilder;\nexport function defineInterceptor(\n meta: InterceptorMeta,\n factory?: InterceptorFactory<any, any, any>,\n): PadroneInterceptorFn<any, any, any> | InterceptorDefBuilder {\n if (factory) return buildInterceptorFn(meta, factory);\n const builder: InterceptorDefBuilder = {\n requires: () => builder as any,\n factory: (f) => buildInterceptorFn(meta, f) as any,\n };\n return builder;\n}\n\n// ---------------------------------------------------------------------------\n// Registration normalization\n// ---------------------------------------------------------------------------\n\n/**\n * Normalizes an interceptor input (single-value form or two-arg form) into the internal\n * `RegisteredInterceptor` storage format.\n */\nexport function toRegisteredInterceptor(\n metaOrFn: InterceptorMeta | PadroneInterceptorFn<any, any, any>,\n factory?: InterceptorFactory<any, any, any>,\n): RegisteredInterceptor {\n if (typeof metaOrFn === 'function') {\n // Single-value form: PadroneInterceptorFn (factory with meta as own properties)\n return {\n meta: { name: metaOrFn.name, id: metaOrFn.id, order: metaOrFn.order, disabled: metaOrFn.disabled, inherit: metaOrFn.inherit },\n factory: metaOrFn,\n };\n }\n // Two-arg form: (meta, factory)\n return { meta: metaOrFn, factory: factory! };\n}\n\n// ---------------------------------------------------------------------------\n// Factory resolution\n// ---------------------------------------------------------------------------\n\n/**\n * Resolves registered interceptors by calling their factories and merging the resulting\n * phase handlers with the static metadata. Uses a cache to ensure each factory is called\n * at most once per execution (so root interceptor closures are shared across all phases).\n */\nexport function resolveRegisteredInterceptors(\n registered: RegisteredInterceptor[],\n cache: Map<RegisteredInterceptor, ResolvedInterceptor>,\n): ResolvedInterceptor[] {\n return registered.map((reg) => {\n let resolved = cache.get(reg);\n if (!resolved) {\n resolved = { ...reg.meta, ...reg.factory() };\n cache.set(reg, resolved);\n }\n return resolved;\n });\n}\n\n// ---------------------------------------------------------------------------\n// Interceptor chain runner\n// ---------------------------------------------------------------------------\n\n/**\n * Deduplicates interceptors by `id`. When multiple interceptors share the same `id`,\n * only the last one in the array is kept. Interceptors without an `id` are always kept.\n */\nfunction deduplicateInterceptors(interceptors: ResolvedInterceptor[]): ResolvedInterceptor[] {\n // Fast path: no ids at all\n if (!interceptors.some((p) => p.id)) return interceptors;\n\n // Find the last index for each id\n const lastIndex = new Map<string, number>();\n for (let i = 0; i < interceptors.length; i++) {\n const id = interceptors[i]!.id;\n if (id) lastIndex.set(id, i);\n }\n\n return interceptors.filter((p, i) => !p.id || lastIndex.get(p.id) === i);\n}\n\n/**\n * Runs an interceptor chain for a given phase using the onion/middleware pattern.\n * Interceptors are sorted by `order` (ascending, stable), then composed so that\n * the first interceptor in sorted order is the outermost wrapper.\n * If no interceptors handle this phase, `core` is called directly.\n *\n * Each interceptor's `next()` accepts optional partial overrides that are merged\n * into the context before passing to the next interceptor or core function.\n */\nexport function runInterceptorChain<TCtx extends object, TResult>(\n phase: 'start' | 'parse' | 'route' | 'validate' | 'execute' | 'error' | 'shutdown',\n interceptors: ResolvedInterceptor[],\n ctx: TCtx,\n core: (ctx: TCtx) => TResult | Promise<TResult>,\n): TResult | Promise<TResult> {\n // Deduplicate by id (last wins), then filter to enabled interceptors that have a handler for this phase\n const deduped = deduplicateInterceptors(interceptors);\n const phaseInterceptors = deduped.filter((p) => p[phase] && !p.disabled);\n if (phaseInterceptors.length === 0) return core(ctx);\n\n // Stable sort by order (lower = outermost). Equal order preserves registration order.\n phaseInterceptors.sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n\n // Build chain from inside out: last interceptor wraps core, first interceptor is outermost\n let next: (currentCtx: TCtx) => TResult | Promise<TResult> = core;\n for (let i = phaseInterceptors.length - 1; i >= 0; i--) {\n const handler = phaseInterceptors[i]![phase]! as unknown as (\n ctx: TCtx,\n next: (overrides?: Record<string, unknown>) => TResult | Promise<TResult>,\n ) => TResult | Promise<TResult>;\n const prevNext = next;\n next = (currentCtx: TCtx) =>\n handler(currentCtx, (overrides?: Record<string, unknown>) => {\n if (!overrides) return prevNext(currentCtx);\n // Auto-merge context: `next({ context: { user } })` merges into existing context\n // instead of replacing it, so interceptors can't accidentally drop context.\n if (overrides.context != null && typeof overrides.context === 'object') {\n overrides = { ...overrides, context: Object.assign({}, (currentCtx as Record<string, unknown>).context, overrides.context) };\n }\n return prevNext(Object.assign({}, currentCtx, overrides) as TCtx);\n });\n }\n\n return next(ctx);\n}\n\n/**\n * Wraps a pipeline with start → error → shutdown lifecycle hooks.\n * - `start` interceptors wrap the pipeline (onion pattern, root interceptors only).\n * - On error: `error` interceptors run (can transform/suppress the error).\n * - Always: `shutdown` interceptors run (success or failure).\n */\nexport function wrapWithLifecycle<T>(\n interceptors: ResolvedInterceptor[],\n command: AnyPadroneCommand,\n input: string | undefined,\n pipeline: (signal: AbortSignal, context: unknown) => T | Promise<T>,\n wrapErrorResult?: (result: unknown) => T,\n signal?: AbortSignal,\n context?: unknown,\n runtime?: ResolvedPadroneRuntime,\n program?: AnyPadroneProgram,\n caller: 'cli' | 'eval' | 'run' | 'repl' | 'serve' | 'mcp' | 'tool' = 'eval',\n pipelineState?: { rawArgs?: Record<string, unknown>; positionalArgs?: string[]; args?: unknown },\n): T | Promise<T> {\n const defaultSignal = typeof AbortSignal !== 'undefined' ? AbortSignal.abort() : (undefined as unknown as AbortSignal);\n const hasStart = interceptors.some((p) => p.start);\n const hasError = interceptors.some((p) => p.error);\n const hasShutdown = interceptors.some((p) => p.shutdown);\n\n // Fast path: no lifecycle interceptors\n if (!hasStart && !hasError && !hasShutdown) return pipeline(signal ?? defaultSignal, context);\n // Mutable refs: start-phase interceptors can override signal and context (e.g., signal extension, auth),\n // and the overrides propagate to error/shutdown contexts.\n let effectiveSignal = signal ?? defaultSignal;\n let effectiveContext = context;\n\n const runShutdown = (error?: unknown, result?: unknown) => {\n if (!hasShutdown) return;\n const ctx: InterceptorShutdownContext = {\n command,\n input,\n error,\n result,\n signal: effectiveSignal,\n context: effectiveContext as object,\n runtime: runtime!,\n program: program!,\n caller,\n ...pipelineState,\n };\n return runInterceptorChain('shutdown', interceptors, ctx, () => {});\n };\n\n const runError = (error: unknown): T | Promise<T> => {\n if (!hasError) {\n const s = runShutdown(error);\n if (s instanceof Promise)\n return s.then(() => {\n throw error;\n });\n throw error;\n }\n const ctx: InterceptorErrorContext = {\n command,\n input,\n error,\n signal: effectiveSignal,\n context: effectiveContext as object,\n runtime: runtime!,\n program: program!,\n caller,\n ...pipelineState,\n };\n const errorResult = runInterceptorChain('error', interceptors, ctx, (): InterceptorErrorResult => ({ error }));\n return thenMaybe(errorResult, (er) => {\n if (er.error !== undefined) {\n const s = runShutdown(er.error);\n return thenMaybe(s as void | Promise<void>, () => {\n throw er.error;\n });\n }\n const wrapped = wrapErrorResult ? wrapErrorResult(er.result) : (er.result as T);\n const s = runShutdown(undefined, wrapped);\n return thenMaybe(s as void | Promise<void>, () => wrapped);\n });\n };\n\n const handleSuccess = (result: T): T | Promise<T> => {\n const s = runShutdown(undefined, result);\n if (s instanceof Promise) return s.then(() => result);\n return result;\n };\n\n const startCtx: InterceptorStartContext = {\n command,\n signal: effectiveSignal,\n context: effectiveContext as object,\n runtime: runtime!,\n program: program!,\n input,\n caller,\n };\n let result: T | Promise<T>;\n try {\n result = (\n hasStart\n ? runInterceptorChain('start', interceptors, startCtx, (ctx) => {\n // Capture overrides from start-phase interceptors so downstream phases see them.\n effectiveSignal = ctx.signal;\n effectiveContext = ctx.context;\n return pipeline(ctx.signal, ctx.context);\n })\n : pipeline(effectiveSignal, effectiveContext)\n ) as T | Promise<T>;\n } catch (e) {\n return runError(e);\n }\n\n if (result instanceof Promise) {\n return result.then(handleSuccess, runError);\n }\n\n return handleSuccess(result);\n}\n\n/**\n * Wraps a command-level pipeline (validate + execute) with error → shutdown lifecycle hooks.\n * Unlike `wrapWithLifecycle`, this has no `start` phase and uses the resolved command context.\n * Only interceptors exclusive to the command chain (not in root) should be passed here.\n */\nexport function wrapWithCommandLifecycle<T>(\n interceptors: ResolvedInterceptor[],\n command: AnyPadroneCommand,\n input: string | undefined,\n pipeline: () => T | Promise<T>,\n wrapErrorResult: ((result: unknown) => T) | undefined,\n signal: AbortSignal,\n context: unknown,\n runtime: ResolvedPadroneRuntime,\n program: AnyPadroneProgram,\n caller: 'cli' | 'eval' | 'run' | 'repl' | 'serve' | 'mcp' | 'tool',\n pipelineState: { rawArgs?: Record<string, unknown>; positionalArgs?: string[]; args?: unknown },\n): T | Promise<T> {\n const hasError = interceptors.some((p) => p.error);\n const hasShutdown = interceptors.some((p) => p.shutdown);\n\n if (!hasError && !hasShutdown) return pipeline();\n\n const runShutdown = (error?: unknown, result?: unknown) => {\n if (!hasShutdown) return;\n const ctx: InterceptorShutdownContext = {\n command,\n input,\n error,\n result,\n signal,\n context: context as object,\n runtime,\n program,\n caller,\n ...pipelineState,\n };\n return runInterceptorChain('shutdown', interceptors, ctx, () => {});\n };\n\n const runError = (error: unknown): T | Promise<T> => {\n if (!hasError) {\n const s = runShutdown(error);\n if (s instanceof Promise)\n return s.then(() => {\n throw error;\n });\n throw error;\n }\n const ctx: InterceptorErrorContext = {\n command,\n input,\n error,\n signal,\n context: context as object,\n runtime,\n program,\n caller,\n ...pipelineState,\n };\n const errorResult = runInterceptorChain('error', interceptors, ctx, (): InterceptorErrorResult => ({ error }));\n return thenMaybe(errorResult, (er) => {\n if (er.error !== undefined) {\n const s = runShutdown(er.error);\n return thenMaybe(s as void | Promise<void>, () => {\n throw er.error;\n });\n }\n const wrapped = wrapErrorResult ? wrapErrorResult(er.result) : (er.result as T);\n const s = runShutdown(undefined, wrapped);\n return thenMaybe(s as void | Promise<void>, () => wrapped);\n });\n };\n\n const handleSuccess = (result: T): T | Promise<T> => {\n const s = runShutdown(undefined, result);\n if (s instanceof Promise) return s.then(() => result);\n return result;\n };\n\n let result: T | Promise<T>;\n try {\n result = pipeline();\n } catch (e) {\n return runError(e);\n }\n\n if (result instanceof Promise) {\n return result.then(handleSuccess, runError);\n }\n\n return handleSuccess(result);\n}\n","import { escapeHtml, type OutputContext } from './styling.ts';\n\n// ── Table ───────────────────────────────────────────────────────────────\n\nexport type TableOptions = {\n /** Explicit column keys to display (default: infer from first row's keys). */\n columns?: string[];\n /** Column key → display header name mapping. */\n headers?: Record<string, string>;\n /** Column key → text alignment. */\n align?: Record<string, 'left' | 'right' | 'center'>;\n /** Maximum column width before truncation. */\n maxColumnWidth?: number;\n /** Show borders (default: true for ansi/text, false for others). */\n border?: boolean;\n};\n\nfunction stringifyCell(value: unknown): string {\n if (value === undefined || value === null) return '';\n if (typeof value === 'string') return value;\n if (typeof value === 'number' || typeof value === 'boolean') return String(value);\n return JSON.stringify(value);\n}\n\nfunction truncate(text: string, max: number): string {\n if (max <= 0 || text.length <= max) return text;\n return max <= 1 ? '…' : `${text.slice(0, max - 1)}…`;\n}\n\nfunction padCell(text: string, width: number, alignment: 'left' | 'right' | 'center' = 'left'): string {\n const pad = width - text.length;\n if (pad <= 0) return text;\n if (alignment === 'right') return ' '.repeat(pad) + text;\n if (alignment === 'center') {\n const left = Math.floor(pad / 2);\n return ' '.repeat(left) + text + ' '.repeat(pad - left);\n }\n return text + ' '.repeat(pad);\n}\n\nexport function renderTable(data: Record<string, unknown>[], options: TableOptions | undefined, ctx: OutputContext): string {\n if (data.length === 0) return '';\n if (ctx.format === 'json') return JSON.stringify(data, null, 2);\n\n const columns = options?.columns ?? Object.keys(data[0]!);\n if (columns.length === 0) return '';\n\n const headers = columns.map((col) => options?.headers?.[col] ?? col);\n const maxCol = options?.maxColumnWidth;\n\n const rows = data.map((row) =>\n columns.map((col) => {\n const text = stringifyCell(row[col]);\n return maxCol ? truncate(text, maxCol) : text;\n }),\n );\n\n const colWidths = columns.map((_, i) => {\n const headerWidth = headers[i]!.length;\n const maxCellWidth = rows.reduce((max, row) => Math.max(max, row[i]!.length), 0);\n return Math.max(headerWidth, maxCellWidth);\n });\n\n const getAlign = (i: number): 'left' | 'right' | 'center' => options?.align?.[columns[i]!] ?? 'left';\n\n if (ctx.format === 'markdown') return renderTableMarkdown(headers, rows, colWidths, getAlign);\n if (ctx.format === 'html') return renderTableHtml(columns, headers, rows, data, getAlign);\n return renderTableText(headers, rows, colWidths, getAlign, options?.border !== false, ctx);\n}\n\nfunction renderTableText(\n headers: string[],\n rows: string[][],\n colWidths: number[],\n getAlign: (i: number) => 'left' | 'right' | 'center',\n border: boolean,\n ctx: OutputContext,\n): string {\n const { styler } = ctx;\n const formatRow = (cells: string[], style?: (s: string) => string) =>\n cells.map((cell, i) => {\n const padded = padCell(cell, colWidths[i]!, getAlign(i));\n return style ? style(padded) : padded;\n });\n\n if (border) {\n const sep = ctx.styler.meta('─');\n const divider = colWidths.map((w) => sep.repeat(w + 2)).join(styler.meta('┼'));\n const row = (cells: string[]) => cells.map((c, i) => ` ${padCell(c, colWidths[i]!, getAlign(i))} `).join(styler.meta('│'));\n const headerRow = row(headers.map((h) => styler.label(h)));\n const dataRows = rows.map((r) => row(r.map((c) => styler.description(c))));\n return [headerRow, styler.meta('─') + divider + styler.meta('─'), ...dataRows].join('\\n');\n }\n\n const headerCells = formatRow(headers, styler.label);\n const dataCells = rows.map((r) => formatRow(r, styler.description));\n const gap = ' ';\n return [headerCells.join(gap), ...dataCells.map((r) => r.join(gap))].join('\\n');\n}\n\nfunction renderTableMarkdown(\n headers: string[],\n rows: string[][],\n colWidths: number[],\n getAlign: (i: number) => 'left' | 'right' | 'center',\n): string {\n const headerLine = `| ${headers.map((h, i) => padCell(h, colWidths[i]!, 'left')).join(' | ')} |`;\n const separatorLine =\n '| ' +\n colWidths\n .map((w, i) => {\n const a = getAlign(i);\n const dashes = '─'.repeat(Math.max(w, 3));\n if (a === 'center') return `:${dashes}:`;\n if (a === 'right') return `${dashes}:`;\n return dashes;\n })\n .join(' | ') +\n ' |';\n const dataLines = rows.map((r) => `| ${r.map((c, i) => padCell(c, colWidths[i]!, 'left')).join(' | ')} |`);\n return [headerLine, separatorLine, ...dataLines].join('\\n');\n}\n\nfunction renderTableHtml(\n columns: string[],\n headers: string[],\n _rows: string[][],\n data: Record<string, unknown>[],\n getAlign: (i: number) => 'left' | 'right' | 'center',\n): string {\n const ths = headers.map((h, i) => {\n const a = getAlign(i);\n const style = a !== 'left' ? ` style=\"text-align: ${a};\"` : '';\n return `<th${style}>${escapeHtml(h)}</th>`;\n });\n const trs = data.map(\n (row) =>\n '<tr>' +\n columns\n .map((col, i) => {\n const a = getAlign(i);\n const style = a !== 'left' ? ` style=\"text-align: ${a};\"` : '';\n return `<td${style}>${escapeHtml(stringifyCell(row[col]))}</td>`;\n })\n .join('') +\n '</tr>',\n );\n return `<table><thead><tr>${ths.join('')}</tr></thead><tbody>${trs.join('')}</tbody></table>`;\n}\n\n// ── Tree ────────────────────────────────────────────────────────────────\n\nexport type TreeNode = {\n label: string;\n children?: TreeNode[];\n};\n\nexport type TreeOptions = {\n /** Characters per indent level (default: 2). */\n indent?: number;\n /** Show tree guide lines (default: true for ansi/text). */\n guides?: boolean;\n};\n\nexport function renderTree(data: TreeNode | TreeNode[], options: TreeOptions | undefined, ctx: OutputContext): string {\n const nodes = Array.isArray(data) ? data : [data];\n if (nodes.length === 0) return '';\n if (ctx.format === 'json') return JSON.stringify(nodes, null, 2);\n if (ctx.format === 'markdown') return renderTreeMarkdown(nodes, 0);\n if (ctx.format === 'html') return renderTreeHtml(nodes);\n\n const guides = options?.guides !== false;\n return renderTreeText(nodes, '', guides, ctx).join('\\n');\n}\n\nfunction renderTreeText(nodes: TreeNode[], prefix: string, guides: boolean, ctx: OutputContext): string[] {\n const lines: string[] = [];\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i]!;\n const isLast = i === nodes.length - 1;\n if (guides) {\n const connector = isLast ? '└── ' : '├── ';\n const childPrefix = isLast ? ' ' : '│ ';\n lines.push(prefix + ctx.styler.meta(connector) + ctx.styler.label(node.label));\n if (node.children?.length) lines.push(...renderTreeText(node.children, prefix + ctx.styler.meta(childPrefix), guides, ctx));\n } else {\n const indent = prefix ? `${prefix} ` : '';\n lines.push(indent + ctx.styler.label(node.label));\n if (node.children?.length) lines.push(...renderTreeText(node.children, indent, guides, ctx));\n }\n }\n return lines;\n}\n\nfunction renderTreeMarkdown(nodes: TreeNode[], depth: number): string {\n return nodes\n .map((node) => {\n const indent = ' '.repeat(depth);\n const line = `${indent}- ${node.label}`;\n if (!node.children?.length) return line;\n return `${line}\\n${renderTreeMarkdown(node.children, depth + 1)}`;\n })\n .join('\\n');\n}\n\nfunction renderTreeHtml(nodes: TreeNode[]): string {\n const items = nodes\n .map((node) => {\n const label = escapeHtml(node.label);\n if (!node.children?.length) return `<li>${label}</li>`;\n return `<li>${label}${renderTreeHtml(node.children)}</li>`;\n })\n .join('');\n return `<ul>${items}</ul>`;\n}\n\n// ── List ────────────────────────────────────────────────────────────────\n\nexport type ListItem = string | { label: string; description?: string };\n\nexport type ListOptions = {\n /** Bullet character (default: '•' for ansi, '-' for text). */\n bullet?: string;\n /** Use numbered list instead of bullets. */\n numbered?: boolean;\n /** Indent level (default: 0). */\n indent?: number;\n};\n\nexport function renderList(data: ListItem[], options: ListOptions | undefined, ctx: OutputContext): string {\n if (data.length === 0) return '';\n if (ctx.format === 'json') {\n const normalized = data.map((item) => (typeof item === 'string' ? { label: item } : item));\n return JSON.stringify(normalized, null, 2);\n }\n if (ctx.format === 'markdown') return renderListMarkdown(data, options);\n if (ctx.format === 'html') return renderListHtml(data, options);\n return renderListText(data, options, ctx);\n}\n\nfunction renderListText(data: ListItem[], options: ListOptions | undefined, ctx: OutputContext): string {\n const { styler } = ctx;\n const numbered = options?.numbered ?? false;\n const bullet = options?.bullet ?? (ctx.format === 'ansi' ? '•' : '-');\n const baseIndent = ' '.repeat(options?.indent ?? 0);\n\n return data\n .map((item, i) => {\n const prefix = numbered ? `${i + 1}.` : bullet;\n const label = typeof item === 'string' ? item : item.label;\n const desc = typeof item === 'object' && item.description ? item.description : undefined;\n const line = `${baseIndent}${styler.meta(prefix)} ${styler.label(label)}`;\n if (!desc) return line;\n return `${line} ${styler.description(desc)}`;\n })\n .join('\\n');\n}\n\nfunction renderListMarkdown(data: ListItem[], options: ListOptions | undefined): string {\n const numbered = options?.numbered ?? false;\n return data\n .map((item, i) => {\n const prefix = numbered ? `${i + 1}.` : '-';\n const label = typeof item === 'string' ? item : item.label;\n const desc = typeof item === 'object' && item.description ? item.description : undefined;\n if (!desc) return `${prefix} ${label}`;\n return `${prefix} **${label}** — ${desc}`;\n })\n .join('\\n');\n}\n\nfunction renderListHtml(data: ListItem[], options: ListOptions | undefined): string {\n const tag = options?.numbered ? 'ol' : 'ul';\n const items = data\n .map((item) => {\n const label = typeof item === 'string' ? item : item.label;\n const desc = typeof item === 'object' && item.description ? item.description : undefined;\n if (!desc) return `<li>${escapeHtml(label)}</li>`;\n return `<li><strong>${escapeHtml(label)}</strong> — ${escapeHtml(desc)}</li>`;\n })\n .join('');\n return `<${tag}>${items}</${tag}>`;\n}\n\n// ── Key-Value ───────────────────────────────────────────────────────────\n\nexport type KeyValueOptions = {\n /** Separator between key and value (default: ': '). */\n separator?: string;\n /** Align values by padding keys to the same width. */\n align?: boolean;\n /** Key → display label mapping. */\n labels?: Record<string, string>;\n};\n\nexport function renderKeyValue(data: Record<string, unknown>, options: KeyValueOptions | undefined, ctx: OutputContext): string {\n const entries = Object.entries(data);\n if (entries.length === 0) return '';\n if (ctx.format === 'json') return JSON.stringify(data, null, 2);\n if (ctx.format === 'markdown') return renderKeyValueMarkdown(entries, options);\n if (ctx.format === 'html') return renderKeyValueHtml(entries, options);\n return renderKeyValueText(entries, options, ctx);\n}\n\nfunction getLabel(key: string, labels?: Record<string, string>): string {\n return labels?.[key] ?? key;\n}\n\nfunction renderKeyValueText(entries: [string, unknown][], options: KeyValueOptions | undefined, ctx: OutputContext): string {\n const { styler } = ctx;\n const sep = options?.separator ?? ': ';\n const shouldAlign = options?.align !== false;\n\n const displayLabels = entries.map(([k]) => getLabel(k, options?.labels));\n const maxWidth = shouldAlign ? Math.max(...displayLabels.map((l) => l.length)) : 0;\n\n return entries\n .map(([_key, value], i) => {\n const label = displayLabels[i]!;\n const paddedLabel = shouldAlign ? label + ' '.repeat(maxWidth - label.length) : label;\n return `${styler.label(paddedLabel)}${styler.meta(sep)}${styler.description(stringifyCell(value))}`;\n })\n .join('\\n');\n}\n\nfunction renderKeyValueMarkdown(entries: [string, unknown][], options: KeyValueOptions | undefined): string {\n return entries.map(([key, value]) => `- **${getLabel(key, options?.labels)}**: ${stringifyCell(value)}`).join('\\n');\n}\n\nfunction renderKeyValueHtml(entries: [string, unknown][], options: KeyValueOptions | undefined): string {\n const items = entries\n .map(([key, value]) => `<dt>${escapeHtml(getLabel(key, options?.labels))}</dt><dd>${escapeHtml(stringifyCell(value))}</dd>`)\n .join('');\n return `<dl>${items}</dl>`;\n}\n","import type { KeyValueOptions, ListItem, ListOptions, TableOptions, TreeNode, TreeOptions } from './primitives.ts';\nimport { renderKeyValue, renderList, renderTable, renderTree } from './primitives.ts';\nimport type { OutputContext } from './styling.ts';\n\n/**\n * Runtime output helper injected into action context as `ctx.context.output`.\n * Provides format-aware output primitives (table, tree, list, key-value).\n *\n * Each method renders data using the resolved format (ANSI, text, JSON, markdown, HTML)\n * and writes it to the runtime's output function.\n */\nexport type PadroneOutputIndicator = {\n /** Render data as a table. */\n table(data: Record<string, unknown>[], options?: TableOptions): void;\n /** Render data as a tree. */\n tree(data: TreeNode | TreeNode[], options?: TreeOptions): void;\n /** Render data as a list. */\n list(data: ListItem[], options?: ListOptions): void;\n /** Render data as aligned key-value pairs. */\n kv(data: Record<string, unknown>, options?: KeyValueOptions): void;\n /** Write raw output (same as runtime.output but sets the \"already called\" flag). */\n raw(...args: unknown[]): void;\n /** Whether any output method has been called. */\n readonly called: boolean;\n};\n\n/** Declarative output configuration for a command. */\nexport type OutputPrimitiveType = 'table' | 'tree' | 'list' | 'kv' | 'json';\nexport type OutputConfig =\n | OutputPrimitiveType\n | { type: OutputPrimitiveType; options?: TableOptions | TreeOptions | ListOptions | KeyValueOptions };\n\n/** Create an output indicator that renders through the given output function and format context. */\nexport function createOutputIndicator(outputFn: (...args: unknown[]) => void, ctx: OutputContext): PadroneOutputIndicator {\n let _called = false;\n\n const emit = (rendered: string) => {\n _called = true;\n outputFn(rendered);\n };\n\n return {\n table(data, options) {\n emit(renderTable(data, options, ctx));\n },\n tree(data, options) {\n emit(renderTree(data, options, ctx));\n },\n list(data, options) {\n emit(renderList(data, options, ctx));\n },\n kv(data, options) {\n emit(renderKeyValue(data, options, ctx));\n },\n raw(...args) {\n _called = true;\n outputFn(...args);\n },\n get called() {\n return _called;\n },\n };\n}\n\n/** Format a return value using a declarative output config. */\nexport function formatDeclarativeOutput(value: unknown, config: OutputConfig, ctx: OutputContext): string | undefined {\n const type = typeof config === 'string' ? config : config.type;\n const options = typeof config === 'object' ? config.options : undefined;\n\n switch (type) {\n case 'table':\n if (!Array.isArray(value)) return undefined;\n return renderTable(value as Record<string, unknown>[], options as TableOptions | undefined, ctx);\n case 'tree':\n return renderTree(value as TreeNode | TreeNode[], options as TreeOptions | undefined, ctx);\n case 'list':\n if (!Array.isArray(value)) return undefined;\n return renderList(value as ListItem[], options as ListOptions | undefined, ctx);\n case 'kv':\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return undefined;\n return renderKeyValue(value as Record<string, unknown>, options as KeyValueOptions | undefined, ctx);\n case 'json':\n return JSON.stringify(value, null, 2);\n default:\n return undefined;\n }\n}\n","import { defineInterceptor } from '../core/interceptors.ts';\nimport { isAsyncIterator, isIterator } from '../core/results.ts';\nimport type { OutputConfig } from '../output/output-indicator.ts';\nimport { createOutputIndicator, formatDeclarativeOutput } from '../output/output-indicator.ts';\nimport { resolveOutputFormat } from '../output/styling.ts';\nimport type { AnyPadroneBuilder, CommandTypesBase, InterceptorExecuteContext, InterceptorExecuteResult } from '../types/index.ts';\n\n// ── Helpers ─────────────────────────────────────────────────────────────\n\n/**\n * Outputs each value and collects into a result.\n * For iterators: outputs each yielded value, returns collected array.\n * For promises: awaits, then recurses.\n * For other values: outputs directly, returns as-is.\n */\nfunction outputAndCollect(value: unknown, output: (...args: unknown[]) => void): unknown {\n if (value == null) return value;\n\n if (isAsyncIterator(value)) {\n return (async () => {\n const items: unknown[] = [];\n const iter = (value as any)[Symbol.asyncIterator]();\n while (true) {\n const { done, value: item } = await iter.next();\n if (done) break;\n items.push(item);\n if (item != null) output(item);\n }\n return items;\n })();\n }\n\n if (typeof value !== 'string' && !Array.isArray(value) && isIterator(value)) {\n const items: unknown[] = [];\n const iter = (value as any)[Symbol.iterator]();\n while (true) {\n const { done, value: item } = iter.next();\n if (done) break;\n items.push(item);\n if (item != null) output(item);\n }\n return items;\n }\n\n if (value instanceof Promise) {\n return value.then((resolved) => outputAndCollect(resolved, output));\n }\n\n output(value);\n return value;\n}\n\n// ── Interceptor ─────────────────────────────────────────────────────────\n\nconst autoOutputMeta = { id: 'padrone:auto-output', name: 'padrone:auto-output', order: -1100 } as const;\n\nfunction createAutoOutputInterceptor(outputConfig?: OutputConfig) {\n return defineInterceptor(autoOutputMeta, () => ({\n execute(ctx: InterceptorExecuteContext, next) {\n const outputCtx = resolveOutputFormat(ctx.runtime, ctx.caller);\n const indicator = createOutputIndicator(ctx.runtime.output, outputCtx);\n\n const handleResult = (e: InterceptorExecuteResult): InterceptorExecuteResult | Promise<InterceptorExecuteResult> => {\n // If the action already called output.*, skip auto-output\n if (indicator.called) return e;\n\n const autoOutput = (value: unknown): unknown => {\n if (value == null) return value;\n\n // Declarative output config: format the return value through the primitive\n if (outputConfig) {\n const rendered = formatDeclarativeOutput(value, outputConfig, outputCtx);\n if (rendered !== undefined) {\n ctx.runtime.output(rendered);\n return value;\n }\n }\n\n return outputAndCollect(value, ctx.runtime.output);\n };\n\n if (e.result instanceof Promise) {\n return { result: e.result.then(autoOutput) };\n }\n\n const collected = autoOutput(e.result);\n if (collected instanceof Promise) return collected.then((v) => ({ result: v }));\n return { result: collected };\n };\n\n const executedOrPromise = next({ context: { output: indicator } });\n if (executedOrPromise instanceof Promise) return executedOrPromise.then(handleResult);\n return handleResult(executedOrPromise);\n },\n }));\n}\n\n// ── Extension ───────────────────────────────────────────────────────────\n\nexport type PadroneAutoOutputOptions = {\n /** Disable auto-output entirely. */\n disabled?: boolean;\n /**\n * Declarative output format for the command's return value.\n * When set, auto-output formats the return value through the specified primitive\n * instead of passing it raw to `runtime.output`.\n * Ignored when the action calls `ctx.context.output.*` explicitly.\n *\n * ```ts\n * // Format return value as a table\n * c.extend(padroneAutoOutput({ output: 'table' }))\n *\n * // Format with options\n * c.extend(padroneAutoOutput({ output: { type: 'table', options: { border: false } } }))\n * ```\n */\n output?: OutputConfig;\n};\n\n/**\n * Extension that automatically writes a command's return value to output after execution.\n *\n * - Values are passed directly to the runtime's `output` function (no stringification).\n * - Promises are awaited before output.\n * - Iterators and async iterators are consumed, outputting each yielded value as it arrives.\n * The result is replaced with the collected array so `drain()` still works.\n * - `undefined` and `null` results produce no output.\n *\n * Also injects `ctx.context.output` with format-aware output primitives (table, tree, list, kv).\n * When action handlers use these methods, auto-output skips to avoid double output.\n *\n * Included in the default extensions. Can also be applied per-command:\n * ```ts\n * createPadrone('my-cli')\n * .command('users', (c) =>\n * c.extend(padroneAutoOutput({ output: 'table' }))\n * .action(() => fetchUsers())\n * )\n * ```\n */\nexport function padroneAutoOutput(options?: PadroneAutoOutputOptions): <T extends CommandTypesBase>(builder: T) => T {\n const interceptor = options?.disabled\n ? defineInterceptor({ ...autoOutputMeta, disabled: true }, () => ({}))\n : createAutoOutputInterceptor(options?.output);\n return ((builder: AnyPadroneBuilder) => builder.intercept(interceptor)) as any;\n}\n","import { thenMaybe } from '#src/core/results.ts';\nimport { defineInterceptor } from '../core/interceptors.ts';\nimport type { AnyPadroneBuilder, CommandTypesBase } from '../types/index.ts';\n\n// ── Interceptor ─────────────────────────────────────────────────────────\n\nconst colorInterceptor = defineInterceptor({ id: 'padrone:color', name: 'padrone:color', order: -1001 }, () => ({\n parse(ctx, next) {\n return thenMaybe(next(), (res) => {\n if ('color' in res.rawArgs) {\n const color = res.rawArgs.color;\n delete res.rawArgs.color;\n\n ctx.runtime.theme = color as any;\n }\n return res;\n });\n },\n}));\n\n// ── Extension ────────────────────────────────────────────────────────────\n\n/**\n * Extension that handles `--color` / `--no-color` flags:\n * - `--color` or `--color=true` → use default theme\n * - `--color=false` or `--no-color` → disable colors (text format)\n * - `--color=<theme>` → use the named theme\n *\n * Modifies the runtime's format and theme accordingly.\n *\n * Usage:\n * ```ts\n * createPadrone('my-cli').extend(padroneColor())\n * ```\n */\nexport function padroneColor(): <T extends CommandTypesBase>(builder: T) => T {\n return ((builder: AnyPadroneBuilder) => builder.intercept(colorInterceptor)) as any;\n}\n","type ParseParts = {\n /**\n * An alphanumeric term representing a command, subcommand, or positional argument.\n * Note that a term can be ambiguous until fully matched within the command hierarchy.\n * We cannot fully distinguish between a nested command or a positional argument until\n * the command structure is known.\n */\n term: {\n type: 'term';\n value: string;\n };\n /**\n * A positional argument provided to the command.\n * Unlike `term`, this is definitively an argument. This can be determined when\n * the argument is non-alphanumeric, like a path or a number.\n */\n arg: {\n type: 'arg';\n value: string;\n };\n /**\n * An arg provided to the command, prefixed with `--`.\n * If the arg has an `=` sign, the value after it is used as the arg's value.\n * Otherwise, the value is obtained from the next part or set to `true` if no value is provided.\n * The key is an array representing the path for nested args (e.g., `--user.id=123` becomes `['user', 'id']`).\n */\n named: {\n type: 'named';\n key: string[];\n value?: string | string[];\n negated?: boolean;\n };\n /**\n * An alias arg provided to the command, prefixed with `-`.\n * Which arg it maps to cannot be determined until the command structure is known.\n * Aliases cannot be nested, so the key is always a single-element array.\n */\n alias: {\n type: 'alias';\n key: string[];\n value?: string | string[];\n };\n};\n\ntype ParsePart = ParseParts[keyof ParseParts];\n\ntype QuoteChar = '\"' | \"'\" | '`';\n\n/**\n * Split a string by a delimiter, respecting quoted segments and optional bracket nesting.\n * Handles escape sequences within quotes (\\\\\" and \\\\\\\\).\n */\nfunction splitQuoteAware(input: string, delimiter: ' ' | ',', opts?: { brackets?: boolean; trim?: boolean }): string[] {\n const results: string[] = [];\n let current = '';\n let inQuote: QuoteChar | null = null;\n let bracketDepth = 0;\n let i = 0;\n\n while (i < input.length) {\n const char = input[i];\n\n if (inQuote) {\n if (char === '\\\\' && i + 1 < input.length) {\n const nextChar = input[i + 1];\n if (nextChar === inQuote || nextChar === '\\\\') {\n current += nextChar;\n i += 2;\n continue;\n }\n }\n if (char === inQuote) {\n inQuote = null;\n } else {\n current += char;\n }\n } else if (opts?.brackets && char === '[') {\n bracketDepth++;\n current += char;\n } else if (opts?.brackets && char === ']') {\n bracketDepth = Math.max(0, bracketDepth - 1);\n current += char;\n } else if (bracketDepth > 0) {\n current += char;\n } else if (char === '\"' || char === \"'\" || char === '`') {\n inQuote = char;\n } else if (char === delimiter || (delimiter === ' ' && char === '\\t')) {\n if (delimiter === ' ' ? current : true) {\n results.push(opts?.trim ? current.trim() : current);\n current = '';\n }\n } else {\n current += char;\n }\n i++;\n }\n\n if (delimiter === ' ' ? current : current || results.length > 0) {\n results.push(opts?.trim ? current.trim() : current);\n }\n\n return results;\n}\n\nexport function parseCliInputToParts(input: string): ParsePart[] {\n const parts = splitQuoteAware(input.trim(), ' ', { brackets: true });\n const result: ParsePart[] = [];\n\n // Index into `result` of the last part that can accept a pending value (-1 = none)\n let pendingIdx = -1;\n // Once a non-term positional arg appears, all subsequent bare values become args\n let allowTerm = true;\n let afterDoubleDash = false;\n\n for (const part of parts) {\n if (!part) continue;\n\n // Bare `--` separator: everything after is a literal positional arg\n if (part === '--' && !afterDoubleDash) {\n pendingIdx = -1;\n afterDoubleDash = true;\n allowTerm = false;\n continue;\n }\n\n if (afterDoubleDash) {\n result.push({ type: 'arg', value: part });\n continue;\n }\n\n const hadPending = pendingIdx;\n pendingIdx = -1;\n\n if (part.startsWith('--no-') && part.length > 5) {\n // Negated boolean arg (--no-verbose or --no-config.debug)\n const key = part.slice(5).split('.');\n result.push({ type: 'named', key, value: undefined, negated: true });\n } else if (part.startsWith('--')) {\n const [keyStr = '', value] = splitNamedArgValue(part.slice(2));\n const key = keyStr.split('.');\n result.push({ type: 'named', key, value });\n if (typeof value === 'undefined') pendingIdx = result.length - 1;\n } else if (part.startsWith('-') && part.length > 1 && !/^-\\d/.test(part)) {\n // Short flag(s) (but not negative numbers like -5)\n // Supports flag stacking: -abc → -a -b -c (last flag can take a value)\n const [keyStr = '', value] = splitNamedArgValue(part.slice(1));\n\n if (keyStr.length > 1 && typeof value === 'undefined') {\n // Flag stacking: -abc → -a, -b, -c (all set to true except last which can take next arg's value)\n for (let ci = 0; ci < keyStr.length - 1; ci++) {\n result.push({ type: 'alias', key: [keyStr[ci]!], value: undefined });\n }\n result.push({ type: 'alias', key: [keyStr[keyStr.length - 1]!], value: undefined });\n pendingIdx = result.length - 1;\n } else if (keyStr.length > 1 && typeof value !== 'undefined') {\n // -abc=val → -a, -b, -c=val (stacked with value on last)\n for (let ci = 0; ci < keyStr.length - 1; ci++) {\n result.push({ type: 'alias', key: [keyStr[ci]!], value: undefined });\n }\n result.push({ type: 'alias', key: [keyStr[keyStr.length - 1]!], value });\n } else {\n // Single char: -v or -v=value\n result.push({ type: 'alias', key: [keyStr], value });\n if (typeof value === 'undefined') pendingIdx = result.length - 1;\n }\n } else if (hadPending >= 0) {\n result[hadPending]!.value = part;\n } else if (/^[a-zA-Z0-9_-]+$/.test(part) && allowTerm) {\n result.push({ type: 'term', value: part });\n } else {\n result.push({ type: 'arg', value: part });\n allowTerm = false;\n }\n }\n return result;\n}\n\n/**\n * Split named arg key and value, handling quoted values after =.\n */\nfunction splitNamedArgValue(str: string): [string, string | string[] | undefined] {\n const eqIndex = str.indexOf('=');\n if (eqIndex === -1) return [str, undefined];\n\n const key = str.slice(0, eqIndex);\n let value = str.slice(eqIndex + 1);\n\n // Remove surrounding quotes from value if present\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\")) ||\n (value.startsWith('`') && value.endsWith('`'))\n ) {\n value = value.slice(1, -1);\n return [key, value];\n }\n\n // Handle array syntax: [a,b,c] -> ['a', 'b', 'c']\n if (value.startsWith('[') && value.endsWith(']')) {\n const inner = value.slice(1, -1);\n if (inner === '') return [key, []];\n return [key, splitQuoteAware(inner, ',', { trim: true })];\n }\n\n return [key, value];\n}\n\n/**\n * Sets a value at a nested path in an object.\n * For example: setNestedValue(obj, ['user', 'profile', 'name'], 'John')\n * Creates intermediate objects as needed.\n */\nexport function setNestedValue(obj: Record<string, unknown>, path: string[], value: unknown): void {\n let current: Record<string, unknown> = obj;\n\n for (let i = 0; i < path.length - 1; i++) {\n const part = path[i]!;\n if (!(part in current) || typeof current[part] !== 'object' || current[part] === null) {\n current[part] = {};\n }\n current = current[part] as Record<string, unknown>;\n }\n\n const lastPart = path[path.length - 1]!;\n current[lastPart] = value;\n}\n\n/**\n * Gets a value at a nested path in an object.\n * Returns undefined if the path doesn't exist.\n */\nexport function getNestedValue(obj: Record<string, unknown>, path: string[]): unknown {\n let current: unknown = obj;\n\n for (const part of path) {\n if (current === null || current === undefined || typeof current !== 'object') {\n return undefined;\n }\n current = (current as Record<string, unknown>)[part];\n }\n\n return current;\n}\n","import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport type { AnyPadroneCommand, InterceptorValidateResult } from '../types/index.ts';\nimport { coerceArgs, detectUnknownArgs, extractSchemaMetadata, getJsonSchema, parsePositionalConfig, preprocessArgs } from './args.ts';\nimport { getCommandRuntime } from './commands.ts';\nimport { getNestedValue, parseCliInputToParts, setNestedValue } from './parse.ts';\nimport { thenMaybe } from './results.ts';\n\n/**\n * Parses CLI input to find the command and extract raw arguments without validation.\n */\nexport function parseCommand(input: string | undefined, rootCommand: AnyPadroneCommand, findCommandByName: FindCommandFn) {\n input ??= getCommandRuntime(rootCommand).argv().join(' ') || undefined;\n if (!input) {\n const defaultCommand = findCommandByName('', rootCommand.commands);\n if (defaultCommand) {\n return { command: defaultCommand, rawArgs: {} as Record<string, unknown>, args: [] as string[], unmatchedTerms: [] as string[] };\n }\n return { command: rootCommand, rawArgs: {} as Record<string, unknown>, args: [] as string[], unmatchedTerms: [] as string[] };\n }\n\n const parts = parseCliInputToParts(input);\n\n const terms = parts.filter((p) => p.type === 'term').map((p) => p.value);\n const argTokens = parts.filter((p) => p.type === 'arg').map((p) => p.value);\n\n let curCommand: AnyPadroneCommand | undefined = rootCommand;\n let unmatchedTerms: string[] = [];\n\n if (terms[0] === rootCommand.name) terms.shift();\n\n for (let i = 0; i < terms.length; i++) {\n const term = terms[i] || '';\n const found = findCommandByName(term, curCommand.commands);\n\n if (found) {\n curCommand = found;\n } else {\n unmatchedTerms = terms.slice(i);\n argTokens.unshift(...unmatchedTerms);\n break;\n }\n }\n\n if (unmatchedTerms.length === 0 && curCommand.commands?.length) {\n const defaultCommand = findCommandByName('', curCommand.commands);\n if (defaultCommand) curCommand = defaultCommand;\n }\n\n if (!curCommand) return { command: rootCommand, rawArgs: {} as Record<string, unknown>, args: argTokens, unmatchedTerms };\n\n const argsMeta = curCommand.meta?.fields;\n const schemaMetadata = curCommand.argsSchema\n ? extractSchemaMetadata(curCommand.argsSchema, argsMeta, curCommand.meta?.autoAlias)\n : { flags: {}, aliases: {}, negatives: {}, customNegation: new Set<string>() };\n const { flags, aliases, negatives, customNegation } = schemaMetadata;\n\n const arrayArguments = new Set<string>();\n if (curCommand.argsSchema) {\n try {\n const jsonSchema = getJsonSchema(curCommand.argsSchema) as Record<string, any>;\n if (jsonSchema.type === 'object' && jsonSchema.properties) {\n for (const [key, prop] of Object.entries(jsonSchema.properties as Record<string, any>)) {\n if (prop?.type === 'array') arrayArguments.add(key);\n }\n }\n } catch {\n // Ignore schema parsing errors\n }\n }\n\n const argParts = parts.filter((p) => p.type === 'named' || p.type === 'alias');\n const rawArgs: Record<string, unknown> = {};\n\n for (const arg of argParts) {\n let key: string[];\n if (arg.type === 'alias' && arg.key.length === 1 && flags[arg.key[0]!]) {\n key = [flags[arg.key[0]!]!];\n } else if (arg.type === 'named' && arg.key.length === 1 && aliases[arg.key[0]!]) {\n key = [aliases[arg.key[0]!]!];\n } else if (arg.type === 'named' && arg.key.length === 1 && negatives[arg.key[0]!]) {\n // Negative keyword: --remote sets local to false\n setNestedValue(rawArgs, [negatives[arg.key[0]!]!], false);\n continue;\n } else {\n key = arg.key;\n }\n\n const rootKey = key[0]!;\n\n if (arg.type === 'named' && arg.negated) {\n // Skip --no- prefix negation for args with custom negation\n if (customNegation.has(rootKey)) {\n // Treat as unknown: put it back as `no-<key>` so detectUnknownArgs catches it\n setNestedValue(rawArgs, [`no-${key.join('.')}`], false);\n continue;\n }\n setNestedValue(rawArgs, key, false);\n continue;\n }\n\n const value = arg.value ?? true;\n\n if (arrayArguments.has(rootKey)) {\n const existing = getNestedValue(rawArgs, key);\n if (existing !== undefined) {\n if (Array.isArray(existing)) {\n if (Array.isArray(value)) existing.push(...value);\n else existing.push(value);\n } else {\n if (Array.isArray(value)) setNestedValue(rawArgs, key, [existing, ...value]);\n else setNestedValue(rawArgs, key, [existing, value]);\n }\n } else {\n setNestedValue(rawArgs, key, Array.isArray(value) ? value : [value]);\n }\n } else {\n const existing = getNestedValue(rawArgs, key);\n if (existing !== undefined) {\n if (Array.isArray(existing)) {\n if (Array.isArray(value)) existing.push(...value);\n else existing.push(value);\n } else {\n if (Array.isArray(value)) setNestedValue(rawArgs, key, [existing, ...value]);\n else setNestedValue(rawArgs, key, [existing, value]);\n }\n } else {\n setNestedValue(rawArgs, key, value);\n }\n }\n }\n\n return { command: curCommand, rawArgs, args: argTokens, unmatchedTerms };\n}\n\ntype FindCommandFn = (name: string, commands?: AnyPadroneCommand[]) => AnyPadroneCommand | undefined;\n\n/**\n * Preprocesses raw arguments: maps positional arguments and performs auto-coercion.\n * External data sources (stdin, env, config) are handled by extensions before this runs.\n */\nexport function buildCommandArgs(\n command: AnyPadroneCommand,\n rawArgs: Record<string, unknown>,\n positionalArgs: string[],\n): { args: Record<string, unknown>; issues?: StandardSchemaV1.Issue[] } {\n let preprocessedArgs = preprocessArgs(rawArgs, { flags: {}, aliases: {} });\n let issues: StandardSchemaV1.Issue[] | undefined;\n\n const positionalConfig = command.meta?.positional ? parsePositionalConfig(command.meta.positional) : [];\n\n if (positionalConfig.length > 0) {\n let argIndex = 0;\n for (let i = 0; i < positionalConfig.length; i++) {\n const { name, variadic } = positionalConfig[i]!;\n if (argIndex >= positionalArgs.length) break;\n\n // Detect ambiguity: same arg provided both positionally and as a named option\n if (name in preprocessedArgs) {\n issues ??= [];\n issues.push({ path: [name], message: `Ambiguous argument \"${name}\": provided both positionally and as a named option` });\n continue;\n }\n\n if (variadic) {\n const remainingPositionals = positionalConfig.slice(i + 1);\n const nonVariadicAfter = remainingPositionals.filter((p) => !p.variadic).length;\n const variadicEnd = positionalArgs.length - nonVariadicAfter;\n preprocessedArgs[name] = positionalArgs.slice(argIndex, variadicEnd);\n argIndex = variadicEnd;\n } else if (i === positionalConfig.length - 1 && positionalArgs.length > argIndex + 1) {\n preprocessedArgs[name] = positionalArgs.slice(argIndex).join(' ');\n argIndex = positionalArgs.length;\n } else {\n preprocessedArgs[name] = positionalArgs[argIndex];\n argIndex++;\n }\n }\n }\n\n if (command.argsSchema) {\n preprocessedArgs = coerceArgs(preprocessedArgs, command.argsSchema);\n }\n\n return { args: preprocessedArgs, issues };\n}\n\n/**\n * Detects unknown options in args that aren't defined in the schema.\n * Returns unknown key info with suggestions, or empty array if schema is loose.\n */\nexport function checkUnknownArgs(command: AnyPadroneCommand, preprocessedArgs: Record<string, unknown>): { key: string }[] {\n if (!command.argsSchema) {\n const unknowns: { key: string }[] = [];\n for (const key of Object.keys(preprocessedArgs)) {\n unknowns.push({ key });\n }\n return unknowns;\n }\n\n const argsMeta = command.meta?.fields;\n const { flags, aliases, negatives } = extractSchemaMetadata(command.argsSchema, argsMeta, command.meta?.autoAlias);\n\n return detectUnknownArgs(preprocessedArgs, command.argsSchema, flags, aliases, negatives);\n}\n\n/**\n * Validates preprocessed arguments against the command's schema.\n * First checks for unknown args (strict by default), then runs schema validation.\n * Returns sync or async result depending on the schema's validate method.\n */\nexport function validateCommandArgs(command: AnyPadroneCommand, preprocessedArgs: Record<string, unknown>) {\n const unknownArgs = checkUnknownArgs(command, preprocessedArgs);\n if (unknownArgs.length > 0) {\n const issues: StandardSchemaV1.Issue[] = unknownArgs.map(({ key }) => ({\n path: [key],\n message: `Unknown option: \"${key}\"`,\n }));\n return { args: undefined, argsResult: { issues } as any };\n }\n\n const argsParsed = command.argsSchema ? command.argsSchema['~standard'].validate(preprocessedArgs) : { value: {} };\n\n const buildResult = (parsed: StandardSchemaV1.Result<unknown>) => ({\n args: parsed.issues ? undefined : (parsed.value as any),\n argsResult: parsed as any,\n });\n\n return thenMaybe(argsParsed, buildResult);\n}\n\n/**\n * Returns the list of known option names from a command's schema (for fuzzy suggestion).\n */\nexport function getKnownOptionNames(command: AnyPadroneCommand): string[] {\n if (!command.argsSchema) return [];\n try {\n const js = getJsonSchema(command.argsSchema) as Record<string, any>;\n if (js.type === 'object' && js.properties) return Object.keys(js.properties);\n } catch {\n /* ignore */\n }\n return [];\n}\n\n/**\n * Formats validation issue messages for display.\n */\nexport function formatIssueMessages(issues: readonly StandardSchemaV1.Issue[]): string {\n return issues.map((i) => ` - ${i.path?.join('.') || 'root'}: ${i.message}`).join('\\n');\n}\n\n/**\n * Core validate function for parse() — preprocesses and validates CLI args.\n * Used by the parse program method (lighter weight than the full exec pipeline).\n * External data sources (stdin, env, config) are not resolved here — use eval() for that.\n */\nexport function coreValidateForParse(\n command: AnyPadroneCommand,\n rawArgs: Record<string, unknown>,\n positionalArgs: string[],\n): InterceptorValidateResult | Promise<InterceptorValidateResult> {\n const { args: preprocessedArgs, issues } = buildCommandArgs(command, rawArgs, positionalArgs);\n if (issues) return { args: undefined, argsResult: { issues } as any };\n const validated = validateCommandArgs(command, preprocessedArgs);\n return thenMaybe(validated, (v) => v as InterceptorValidateResult);\n}\n","import type { AnyPadroneCommand, PadroneSchema } from '../types/index.ts';\n\ntype SchemaShape = Record<string, 'string' | 'string[]' | 'boolean'>;\n\ntype InferPassthroughSchema<T extends SchemaShape> = {\n [K in keyof T]: T[K] extends 'string' ? string : T[K] extends 'string[]' ? string[] : T[K] extends 'boolean' ? boolean : never;\n};\n\n/** Minimal Standard Schema that passes through known fields, ignoring unknown ones. */\nexport function passthroughSchema<TShape extends SchemaShape>(fields: TShape): PadroneSchema<InferPassthroughSchema<TShape>> {\n return {\n '~standard': {\n version: 1 as const,\n vendor: 'padrone' as const,\n jsonSchema: {\n input: () => ({}),\n output: () => ({}),\n },\n validate: (value) => {\n const input = value && typeof value === 'object' ? (value as Record<string, unknown>) : {};\n const result: Record<string, unknown> = {};\n for (const [name, type] of Object.entries(fields)) {\n const v = input[name];\n if (v === undefined) continue;\n if (type === 'string[]') {\n if (Array.isArray(v)) result[name] = v.map(String);\n else if (typeof v === 'string') result[name] = [v];\n } else if (type === 'string') {\n if (typeof v === 'string') result[name] = v;\n else if (Array.isArray(v) && v.length > 0) result[name] = String(v[0]);\n } else if (type === 'boolean') {\n result[name] = v === true || v === 'true';\n }\n }\n return { value: result as InferPassthroughSchema<TShape> };\n },\n },\n };\n}\n\n/** Find a command by space-separated name in the command tree. */\nexport function findCommandInTree(name: string, rootCommand: AnyPadroneCommand): AnyPadroneCommand | undefined {\n const parts = name.split(' ').filter(Boolean);\n let current = rootCommand;\n for (const part of parts) {\n const found = current.commands?.find((c) => c.name === part || c.aliases?.includes(part));\n if (!found) return undefined;\n current = found;\n }\n return current;\n}\n","import { resolveAllCommands, resolveCommand } from '../core/commands.ts';\nimport { RoutingError, ValidationError } from '../core/errors.ts';\nimport { defineInterceptor } from '../core/interceptors.ts';\nimport { thenMaybe } from '../core/results.ts';\nimport { formatIssueMessages } from '../core/validate.ts';\nimport type { HelpDetail, HelpFormat } from '../output/formatter.ts';\nimport { generateHelp } from '../output/help.ts';\nimport type { AnyPadroneBuilder, AnyPadroneCommand, CommandTypesBase, PadroneCommand } from '../types/index.ts';\nimport type { PadroneSchema } from '../types/schema.ts';\nimport type { WithCommand } from '../util/type-utils.ts';\nimport { getRootCommand } from '../util/utils.ts';\nimport { findCommandInTree, passthroughSchema } from './utils.ts';\n\n// ── Types ────────────────────────────────────────────────────────────────\n\ntype HelpArgs = { command?: string[]; detail?: HelpDetail; format?: HelpFormat; all?: boolean };\n\nexport type HelpCommand = PadroneCommand<'help', '', PadroneSchema<HelpArgs>, string, [], ['h', ''], false>;\n\nexport type WithHelp<T> = WithCommand<T, 'help', HelpCommand>;\n\n// ── Interceptor ─────────────────────────────────────────────────────────\n\nconst helpInterceptor = defineInterceptor({ id: 'padrone:help', name: 'padrone:help', order: -1000 }, () => {\n let helpText: string | undefined;\n let showDefaultHelp = false;\n\n return {\n parse(ctx, next) {\n return thenMaybe(next(), (res) => {\n const hasHelpFlag = res.rawArgs.help || res.rawArgs.h;\n const reverseHelp = !hasHelpFlag && res.positionalArgs?.length > 0 && res.positionalArgs[res.positionalArgs.length - 1] === 'help';\n\n if (hasHelpFlag || reverseHelp) {\n delete res.rawArgs.help;\n delete res.rawArgs.h;\n\n const detail = res.rawArgs.detail as HelpDetail | undefined;\n const format = res.rawArgs.format as HelpFormat | undefined;\n const all = res.rawArgs.all as boolean | undefined;\n delete res.rawArgs.detail;\n delete res.rawArgs.format;\n delete res.rawArgs.all;\n delete res.rawArgs.d;\n delete res.rawArgs.f;\n\n const rootCommand = getRootCommand(res.command);\n resolveAllCommands(rootCommand);\n\n helpText = generateHelp(rootCommand, res.command, {\n detail,\n format: format ?? ctx.runtime.format,\n theme: ctx.runtime.theme,\n all,\n terminal: ctx.runtime.terminal,\n env: ctx.runtime.env(),\n });\n return res;\n }\n\n // Track whether the parsed command has no action (for default help in execute phase)\n if (helpText === undefined) {\n const { command } = res;\n const hasSubcommands = command.commands && command.commands.length > 0;\n const hasSchema = command.argsSchema != null;\n const hasUnmatchedTerms = res.positionalArgs?.length > 0 && !command.meta?.positional?.length;\n if (!command.action && (hasSubcommands || !hasSchema) && !hasUnmatchedTerms) {\n showDefaultHelp = true;\n }\n }\n\n return res;\n });\n },\n validate(_ctx, next) {\n if (helpText !== undefined) return { args: undefined as any, argsResult: { value: undefined } as any };\n return next();\n },\n execute(ctx, next) {\n if (helpText !== undefined) return { result: helpText };\n if (showDefaultHelp) {\n const rootCommand = getRootCommand(ctx.command);\n resolveAllCommands(rootCommand);\n return {\n result: generateHelp(rootCommand, ctx.command, {\n format: ctx.runtime.format,\n theme: ctx.runtime.theme,\n terminal: ctx.runtime.terminal,\n env: ctx.runtime.env(),\n }),\n };\n }\n return next();\n },\n error(ctx, next) {\n return thenMaybe(next(), (er) => {\n if (ctx.caller !== 'cli' || !er.error) return er;\n\n const rootCommand = getRootCommand(ctx.command);\n\n if (er.error instanceof RoutingError) {\n const targetPath = er.error.command;\n const targetCommand = targetPath ? findCommandInTree(targetPath, rootCommand) : undefined;\n const sourceCmd = targetCommand ?? rootCommand;\n\n ctx.runtime.error(er.error.message);\n\n if (er.error.suggestions.length > 0) {\n const visibleCommands = (sourceCmd.commands ?? []).filter((c: AnyPadroneCommand) => !c.hidden && c.name);\n if (visibleCommands.length > 0) {\n for (const cmd of visibleCommands) resolveCommand(cmd);\n const cmdList = visibleCommands.map((c: AnyPadroneCommand) => c.name).join(', ');\n ctx.runtime.output(`\\nAvailable commands: ${cmdList}`);\n }\n } else {\n resolveAllCommands(rootCommand);\n const helpText = generateHelp(rootCommand, sourceCmd, {\n format: ctx.runtime.format,\n theme: ctx.runtime.theme,\n terminal: ctx.runtime.terminal,\n env: ctx.runtime.env(),\n });\n ctx.runtime.error(helpText);\n }\n\n return er;\n }\n\n if (er.error instanceof ValidationError) {\n const targetPath = er.error.command;\n const targetCommand = targetPath ? findCommandInTree(targetPath, rootCommand) : undefined;\n const issueMessages = formatIssueMessages(er.error.issues);\n\n resolveAllCommands(rootCommand);\n const helpText = generateHelp(rootCommand, targetCommand ?? rootCommand, {\n format: ctx.runtime.format,\n theme: ctx.runtime.theme,\n terminal: ctx.runtime.terminal,\n env: ctx.runtime.env(),\n });\n ctx.runtime.error(`Validation error:\\n${issueMessages}`);\n ctx.runtime.error(helpText);\n\n return er;\n }\n\n return er;\n });\n },\n };\n});\n\n// ── Extension ────────────────────────────────────────────────────────────\n\n/**\n * Extension that adds help support:\n * - `help` command with aliases `h` and `` (empty = executes on root when no subcommand matches)\n * - `--help` / `-h` flags\n * - `<cmd> help` reverse syntax\n * - Default help display when a command has no action\n *\n * Usage:\n * ```ts\n * createPadrone('my-cli').extend(padroneHelp())\n * ```\n */\nexport function padroneHelp(): <T extends CommandTypesBase>(builder: T) => WithHelp<T> {\n return ((builder: AnyPadroneBuilder) =>\n builder\n .command(['help', 'h'], (c) =>\n c\n .configure({ description: 'Display help for a command', hidden: true })\n .arguments(passthroughSchema({ command: 'string[]', detail: 'string', format: 'string', all: 'boolean' }), {\n positional: ['...command'],\n })\n .action((args, ctx) => {\n const rootCommand = getRootCommand(ctx.command);\n resolveAllCommands(rootCommand);\n const commandName = args.command?.join(' ');\n const targetCommand = commandName ? findCommandInTree(commandName, rootCommand) : rootCommand;\n return generateHelp(rootCommand, targetCommand ?? rootCommand, {\n detail: args.detail as HelpDetail,\n format: (args.format as HelpFormat) ?? ctx.runtime.format,\n theme: ctx.runtime.theme,\n all: args.all,\n terminal: ctx.runtime.terminal,\n env: ctx.runtime.env(),\n });\n }),\n )\n .intercept(helpInterceptor)) as any;\n}\n","import { getJsonSchema } from '../core/args.ts';\nimport type { InteractivePromptConfig, ResolvedPadroneRuntime } from '../core/runtime.ts';\nimport type { AnyPadroneCommand } from '../types/index.ts';\n\n/**\n * Auto-detect the prompt type for a field based on its JSON schema property definition.\n */\nexport function detectPromptConfig(\n name: string,\n propSchema: Record<string, any> | undefined,\n description?: string,\n): InteractivePromptConfig {\n const message = description || propSchema?.description || name;\n\n if (!propSchema) return { name, message, type: 'input' };\n\n if (propSchema.type === 'boolean') {\n return { name, message, type: 'confirm', default: propSchema.default };\n }\n\n if (propSchema.enum) {\n return {\n name,\n message,\n type: 'select',\n choices: propSchema.enum.map((v: unknown) => ({ label: String(v), value: v })),\n default: propSchema.default,\n };\n }\n\n if (propSchema.type === 'array' && propSchema.items?.enum) {\n return {\n name,\n message,\n type: 'multiselect',\n choices: propSchema.items.enum.map((v: unknown) => ({ label: String(v), value: v })),\n default: propSchema.default,\n };\n }\n\n if (propSchema.format === 'password') {\n return { name, message, type: 'password', default: propSchema.default };\n }\n\n return { name, message, type: 'input', default: propSchema.default };\n}\n\n/**\n * Prompt a single field and validate it against the command's schema.\n * Re-prompts with a warning until the user provides a valid value.\n */\nasync function promptWithValidation(\n field: string,\n config: InteractivePromptConfig,\n currentData: Record<string, unknown>,\n command: AnyPadroneCommand,\n runtime: ResolvedPadroneRuntime,\n): Promise<unknown> {\n let promptConfig = config;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const value = await runtime.prompt!(promptConfig);\n\n if (!command.argsSchema) return value;\n\n // Validate the full object with the new value to catch field-level issues\n const testData = { ...currentData, [field]: value };\n const validated = await command.argsSchema['~standard'].validate(testData);\n\n if (!validated.issues) return value;\n\n // Only keep issues whose path starts with this field\n const fieldIssues = validated.issues.filter((issue: { path?: ReadonlyArray<PropertyKey> }) => {\n const rootKey = issue.path?.[0];\n return rootKey !== undefined && String(rootKey) === field;\n });\n\n if (fieldIssues.length === 0) return value;\n\n // Warn the user and re-prompt with the invalid value as default\n const messages = fieldIssues.map((i: { message: string }) => i.message).join('; ');\n runtime.error(`Invalid value for \"${field}\": ${messages}`);\n promptConfig = { ...config, default: value };\n }\n}\n\n/**\n * Prompt for missing interactive fields.\n * Runs after env/config preprocessing and before schema validation.\n *\n * When `force` is true, all configured interactive fields are prompted even if they already\n * have values. The current values are used as defaults in the prompts.\n */\nexport async function promptInteractiveFields(\n data: Record<string, unknown>,\n command: AnyPadroneCommand,\n runtime: ResolvedPadroneRuntime,\n force?: boolean,\n): Promise<Record<string, unknown>> {\n if (!runtime.prompt) return data;\n\n const meta = command.meta;\n const interactiveConfig = meta?.interactive;\n const optionalInteractiveConfig = meta?.optionalInteractive;\n if (!interactiveConfig && !optionalInteractiveConfig) return data;\n\n // Extract JSON schema properties for prompt type detection\n let jsonProperties: Record<string, any> = {};\n let requiredFields: Set<string> = new Set();\n if (command.argsSchema) {\n try {\n const jsonSchema = getJsonSchema(command.argsSchema) as Record<string, any>;\n if (jsonSchema.type === 'object' && jsonSchema.properties) {\n jsonProperties = jsonSchema.properties;\n }\n if (Array.isArray(jsonSchema.required)) {\n requiredFields = new Set(jsonSchema.required);\n }\n } catch {\n // Ignore schema parsing errors\n }\n }\n\n const fieldDescriptions: Record<string, string | undefined> = {};\n if (meta?.fields) {\n for (const [key, value] of Object.entries(meta.fields)) {\n if (value?.description) fieldDescriptions[key] = value.description;\n }\n }\n\n const result = { ...data };\n\n // Determine which required interactive fields to prompt\n let fieldsToPrompt: string[] = [];\n if (interactiveConfig === true) {\n if (force) {\n // When forced, prompt all required fields regardless of current value\n fieldsToPrompt = [...requiredFields];\n } else {\n // All required fields that are missing\n fieldsToPrompt = [...requiredFields].filter((name) => result[name] === undefined);\n }\n } else if (Array.isArray(interactiveConfig)) {\n if (force) {\n fieldsToPrompt = [...interactiveConfig];\n } else {\n fieldsToPrompt = interactiveConfig.filter((name) => result[name] === undefined);\n }\n }\n\n // Prompt each required interactive field with per-field validation\n for (const field of fieldsToPrompt) {\n const config = detectPromptConfig(field, jsonProperties[field], fieldDescriptions[field]);\n // When forced, use the current value as the default\n if (force && result[field] !== undefined) {\n config.default = result[field];\n }\n result[field] = await promptWithValidation(field, config, result, command, runtime);\n }\n\n // Determine optional interactive fields\n let optionalFields: string[] = [];\n if (optionalInteractiveConfig === true) {\n if (force) {\n // When forced, include all non-required fields (even those with values)\n const allKeys = Object.keys(jsonProperties);\n optionalFields = allKeys.filter((name) => !requiredFields.has(name));\n } else {\n // All non-required fields that are still missing\n const allKeys = Object.keys(jsonProperties);\n optionalFields = allKeys.filter((name) => !requiredFields.has(name) && result[name] === undefined);\n }\n } else if (Array.isArray(optionalInteractiveConfig)) {\n if (force) {\n optionalFields = [...optionalInteractiveConfig];\n } else {\n optionalFields = optionalInteractiveConfig.filter((name) => result[name] === undefined);\n }\n }\n\n // Show multiselect for optional fields, then prompt selected ones\n if (optionalFields.length > 0) {\n const selected = (await runtime.prompt({\n name: '_optionalFields',\n message: 'Would you also like to configure:',\n type: 'multiselect',\n choices: optionalFields.map((f) => {\n const label = fieldDescriptions[f] || jsonProperties[f]?.description || f;\n const currentValue = result[f];\n // When forced, show current value next to the label for fields that already have values\n const displayLabel = force && currentValue !== undefined ? `${label} (current: ${currentValue})` : label;\n return { label: displayLabel, value: f };\n }),\n })) as string[];\n\n if (Array.isArray(selected)) {\n for (const field of selected) {\n const config = detectPromptConfig(field, jsonProperties[field], fieldDescriptions[field]);\n // When forced, use the current value as the default\n if (force && result[field] !== undefined) {\n config.default = result[field];\n }\n result[field] = await promptWithValidation(field, config, result, command, runtime);\n }\n }\n }\n\n return result;\n}\n","import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { defineInterceptor } from '../core/interceptors.ts';\nimport { hasInteractiveConfig, thenMaybe } from '../core/results.ts';\nimport { buildCommandArgs, checkUnknownArgs } from '../core/validate.ts';\nimport { promptInteractiveFields } from '../feature/interactive.ts';\nimport type { AnyPadroneBuilder, CommandTypesBase, InterceptorValidateContext, InterceptorValidateResult } from '../types/index.ts';\n\n// ── Interceptor ─────────────────────────────────────────────────────────\n\nconst interactiveInterceptor = defineInterceptor({ id: 'padrone:interactive', name: 'padrone:interactive', order: -999 }, () => ({\n validate(ctx: InterceptorValidateContext, next) {\n // Extract --interactive / -i flags from rawArgs\n let flagInteractive: boolean | undefined;\n if (hasInteractiveConfig(ctx.command.meta)) {\n if (ctx.rawArgs.interactive !== undefined) {\n flagInteractive = ctx.rawArgs.interactive !== false && ctx.rawArgs.interactive !== 'false';\n delete ctx.rawArgs.interactive;\n }\n if (ctx.rawArgs.i !== undefined) {\n flagInteractive = ctx.rawArgs.i !== false && ctx.rawArgs.i !== 'false';\n delete ctx.rawArgs.i;\n }\n }\n\n // Resolve effective interactivity\n const { runtime, command } = ctx;\n const runtimeDefault: boolean | undefined =\n runtime.interactive === 'forced' ? true : runtime.interactive === 'disabled' ? false : undefined;\n const effectiveInteractive: boolean | undefined = flagInteractive ?? ctx.evalInteractive ?? runtimeDefault;\n const commandUsesStdin = !!command.meta?.stdin;\n const stdinIsPiped = commandUsesStdin && (runtime.stdin ? !runtime.stdin.isTTY : runtime.terminal?.isTTY !== true);\n const interactivitySuppressed =\n runtime.interactive === 'unsupported' || effectiveInteractive === false || (stdinIsPiped && effectiveInteractive !== true);\n const forceInteractive = !interactivitySuppressed && effectiveInteractive === true;\n\n const willPrompt = !interactivitySuppressed && runtime.prompt && hasInteractiveConfig(command.meta);\n if (!willPrompt) return next();\n\n // Preprocess args to determine what's missing\n const { args: preprocessedArgs, issues: positionalIssues } = buildCommandArgs(command, ctx.rawArgs, ctx.positionalArgs);\n if (positionalIssues) return { args: undefined, argsResult: { issues: positionalIssues } } as any;\n\n // Check for unknown args before prompting\n const unknowns = checkUnknownArgs(command, preprocessedArgs);\n if (unknowns.length > 0) {\n const issues: StandardSchemaV1.Issue[] = unknowns.map(({ key }) => ({\n path: [key],\n message: `Unknown option: \"${key}\"`,\n }));\n return { args: undefined, argsResult: { issues } } as any;\n }\n\n // Early-validate provided fields — fail fast on user-supplied errors before prompting\n const earlyValidateAndPrompt = (): InterceptorValidateResult | Promise<InterceptorValidateResult> => {\n if (command.argsSchema) {\n const providedKeys = new Set(Object.keys(preprocessedArgs).filter((k) => preprocessedArgs[k] !== undefined));\n const earlyCheck = command.argsSchema['~standard'].validate(preprocessedArgs);\n\n const checkForProvidedFieldErrors = (result: StandardSchemaV1.Result<unknown>): InterceptorValidateResult | undefined => {\n if (!result.issues) return undefined;\n const providedFieldIssues = result.issues.filter((issue: StandardSchemaV1.Issue) => {\n const rootKey = issue.path?.[0];\n return rootKey !== undefined && providedKeys.has(String(rootKey));\n });\n if (providedFieldIssues.length > 0) return { args: undefined, argsResult: { issues: providedFieldIssues } as any };\n return undefined;\n };\n\n const earlyResult = thenMaybe(earlyCheck, (result) => checkForProvidedFieldErrors(result) ?? undefined);\n if (earlyResult instanceof Promise) {\n return earlyResult.then((err) => (err ? err : doPrompt()));\n }\n if (earlyResult) return earlyResult;\n }\n\n return doPrompt();\n };\n\n // Prompt for missing fields, then pass filled args to downstream validation via next()\n const doPrompt = (): InterceptorValidateResult | Promise<InterceptorValidateResult> => {\n const afterInteractive = promptInteractiveFields(preprocessedArgs, command, runtime, forceInteractive || undefined);\n\n return thenMaybe(afterInteractive, (filledArgs) => {\n // Pass preprocessed+prompted args downstream with empty positionalArgs (already mapped)\n return next({ rawArgs: filledArgs, positionalArgs: [] });\n });\n };\n\n return earlyValidateAndPrompt();\n },\n}));\n\n// ── Extension ────────────────────────────────────────────────────────────\n\n/**\n * Extension that handles interactive prompting for missing arguments.\n * Extracts `--interactive` / `-i` flags, resolves effective interactivity,\n * and prompts for missing fields before passing filled args to validation.\n *\n * Usage:\n * ```ts\n * createPadrone('my-cli').extend(padroneInteractive())\n * ```\n */\nexport function padroneInteractive(): <T extends CommandTypesBase>(builder: T) => T {\n return ((builder: AnyPadroneBuilder) => builder.intercept(interactiveInterceptor)) as any;\n}\n","import { defineInterceptor } from '../core/interceptors.ts';\nimport { parseCliInputToParts } from '../core/parse.ts';\nimport { withDrain } from '../core/results.ts';\nimport type {\n AnyPadroneBuilder,\n AnyPadroneCommand,\n CommandTypesBase,\n InterceptorStartContext,\n PadroneCommand,\n PadroneReplPreferences,\n} from '../types/index.ts';\nimport type { PadroneSchema } from '../types/schema.ts';\nimport type { WithCommand } from '../util/type-utils.ts';\nimport { passthroughSchema } from './utils.ts';\n\n// ── Types ────────────────────────────────────────────────────────────────\n\ntype ReplArgs = { scope?: string };\n\ntype ReplCommand = PadroneCommand<'repl', '', PadroneSchema<ReplArgs>, void, [], [], true>;\n\nexport type WithRepl<T> = WithCommand<T, 'repl', ReplCommand>;\n\n// ── Extension ────────────────────────────────────────────────────────────\n\n/**\n * Extension that adds REPL support:\n * - `repl` command that starts an interactive REPL\n * - `--repl` flag that starts the REPL from any invocation\n *\n * Usage:\n * ```ts\n * createPadrone('my-cli').extend(padroneRepl())\n * ```\n */\nexport function padroneRepl(\n defaults?: PadroneReplPreferences & { disabled?: boolean },\n): <T extends CommandTypesBase>(builder: T) => WithRepl<T> {\n const disabled = defaults?.disabled;\n return ((builder: AnyPadroneBuilder) =>\n builder\n .command('repl', (c) =>\n c\n .configure({ description: 'Start an interactive REPL', hidden: true })\n .arguments(passthroughSchema({ scope: 'string' }), { positional: ['scope'] })\n .async()\n .action(async (args, ctx) => {\n const prefs: PadroneReplPreferences = { ...defaults, scope: args.scope ?? defaults?.scope };\n const repl = ctx.program.repl(prefs);\n const { value } = await repl.drain();\n return value;\n }),\n )\n .intercept(createReplInterceptor(defaults, disabled))) as any;\n}\n\nfunction createReplInterceptor(defaults?: PadroneReplPreferences, disabled?: boolean) {\n return defineInterceptor({ id: 'padrone:repl', name: 'padrone:repl', order: -1000, disabled }, () => ({\n start(ctx: InterceptorStartContext, next: () => unknown) {\n const replInfo = checkReplFlag(ctx.input, ctx.command);\n if (!replInfo) return next();\n\n const program = ctx.program;\n if (!program?.repl) return next();\n\n const prefs: PadroneReplPreferences = { ...defaults, scope: replInfo.scope ?? defaults?.scope };\n\n // Return a Promise so the pipeline awaits the REPL result\n return program\n .repl(prefs)\n .drain()\n .then((r: any) => withDrain({ command: ctx.command, args: undefined, result: r.value }));\n },\n }));\n}\n\n/** Check for --repl flag in input. */\nfunction checkReplFlag(input: string | undefined, rootCommand: AnyPadroneCommand): { scope?: string } | null {\n if (!input) return null;\n\n const parts = parseCliInputToParts(input);\n const terms = parts.filter((p) => p.type === 'term').map((p) => p.value);\n const args = parts.filter((p) => p.type === 'named');\n const keyIs = (key: string[], name: string) => key.length === 1 && key[0] === name;\n\n const hasReplFlag = args.some((p) => p.type === 'named' && keyIs(p.key, 'repl'));\n if (!hasReplFlag) return null;\n\n const normalizedTerms = [...terms];\n if (normalizedTerms[0] === rootCommand.name) normalizedTerms.shift();\n\n const scope = normalizedTerms.length > 0 ? normalizedTerms.join(' ') : undefined;\n return { scope };\n}\n","import { SignalError, signalExitCode } from '../core/errors.ts';\nimport { defineInterceptor } from '../core/interceptors.ts';\nimport { thenMaybe } from '../core/results.ts';\nimport type { PadroneSignal } from '../core/runtime.ts';\nimport type { AnyPadroneBuilder, CommandTypesBase } from '../types/index.ts';\n\n// ── Interceptor ─────────────────────────────────────────────────────────\n\nconst signalMeta = { id: 'padrone:signal', name: 'padrone:signal', order: -2000 } as const;\n\nconst signalInterceptor = defineInterceptor(signalMeta, () => {\n const abortController = new AbortController();\n let receivedSignal: PadroneSignal | undefined;\n let lastSigintTime = 0;\n let unsubscribe: (() => void) | undefined;\n const DOUBLE_SIGINT_MS = 2000;\n\n const cleanup = () => {\n unsubscribe?.();\n unsubscribe = undefined;\n };\n\n const attachSignalInfo = <T>(result: T): T => {\n if (receivedSignal && result && typeof result === 'object') {\n (result as any).signal = receivedSignal;\n (result as any).exitCode = signalExitCode(receivedSignal);\n }\n return result;\n };\n\n return {\n start(ctx, next) {\n const runtimeExit = ctx.runtime.exit;\n unsubscribe = ctx.runtime.onSignal?.((sig) => {\n if (abortController.signal.aborted) {\n if (sig === 'SIGINT') {\n const elapsed = Date.now() - lastSigintTime;\n if (elapsed > 0 && elapsed < DOUBLE_SIGINT_MS) {\n runtimeExit?.(signalExitCode(sig));\n }\n lastSigintTime = Date.now();\n }\n return;\n }\n if (sig === 'SIGINT') lastSigintTime = Date.now();\n receivedSignal = sig;\n abortController.abort(sig);\n });\n\n const result = next({ signal: abortController.signal });\n return thenMaybe(result, (r) => {\n cleanup();\n return attachSignalInfo(r);\n });\n },\n error(_ctx, next) {\n return thenMaybe(next(), (er) => {\n if (receivedSignal && er.error instanceof Error) {\n er.error = new SignalError(receivedSignal, { cause: er.error });\n }\n return er;\n });\n },\n shutdown(_ctx, next) {\n cleanup();\n return next();\n },\n };\n});\n\n// ── Extension ───────────────────────────────────────────────────────────\n\n/**\n * Extension that wires process signal handling (SIGINT, SIGTERM, SIGHUP) into the interceptor lifecycle.\n *\n * - Creates an `AbortController` whose signal is propagated to all downstream phases.\n * - Subscribes to `runtime.onSignal` to forward OS signals to the abort controller.\n * - Implements SIGINT double-tap: two SIGINTs within 2 seconds force-exits the process.\n * - Attaches `signal` and `exitCode` to results and errors when interrupted.\n * - Cleans up the signal subscription on completion or failure.\n *\n * Included in the default extensions. Runs at order `-2000` (outermost).\n */\nexport function padroneSignalHandling(options?: { disabled?: boolean }): <T extends CommandTypesBase>(builder: T) => T {\n const interceptor = options?.disabled ? defineInterceptor({ ...signalMeta, disabled: true }, () => ({})) : signalInterceptor;\n return ((builder: AnyPadroneBuilder) => builder.intercept(interceptor)) as any;\n}\n","import { applyValues, isArrayField, isAsyncStreamField } from '../core/args.ts';\nimport { resolveStdin, resolveStdinAlways } from '../core/default-runtime.ts';\nimport { defineInterceptor } from '../core/interceptors.ts';\nimport type { AnyPadroneBuilder, CommandTypesBase, InterceptorValidateContext } from '../types/index.ts';\nimport { createStdinStream } from '../util/stream.ts';\n\n// ── Interceptor ─────────────────────────────────────────────────────────\n\nconst stdinInterceptor = defineInterceptor({ id: 'padrone:stdin', name: 'padrone:stdin', order: -1001 }, () => ({\n validate(ctx: InterceptorValidateContext, next) {\n const stdinField = ctx.command.meta?.stdin;\n if (!stdinField) return next();\n\n // Skip if the field was already provided via CLI flags\n if (stdinField in ctx.rawArgs && ctx.rawArgs[stdinField] !== undefined) return next();\n\n const streamInfo = isAsyncStreamField(ctx.command.argsSchema, stdinField);\n if (streamInfo) {\n const stdinForStream = resolveStdinAlways(ctx.runtime as any);\n const mergedRawArgs = applyValues(ctx.rawArgs, { [stdinField]: createStdinStream(stdinForStream, streamInfo.itemSchema) });\n return next({ rawArgs: mergedRawArgs });\n }\n\n const stdin = resolveStdin(ctx.runtime as any);\n if (!stdin) return next();\n\n if (isArrayField(ctx.command.argsSchema, stdinField)) {\n return (async () => {\n const lines: string[] = [];\n for await (const line of stdin.lines()) {\n lines.push(line);\n }\n const mergedRawArgs = applyValues(ctx.rawArgs, { [stdinField]: lines });\n return next({ rawArgs: mergedRawArgs });\n })();\n }\n\n return stdin.text().then((text) => {\n if (!text) return next();\n const mergedRawArgs = applyValues(ctx.rawArgs, { [stdinField]: text });\n return next({ rawArgs: mergedRawArgs });\n });\n },\n}));\n\n// ── Extension ────────────────────────────────────────────────────────────\n\n/**\n * Extension that reads stdin data into the argument field specified by `meta.stdin`.\n * Included by default via `createPadrone()`.\n *\n * Read mode is inferred from the schema type:\n * - `string` field → reads all stdin as a single string\n * - `string[]` field → reads stdin line-by-line into an array\n * - `AsyncIterable` field → returns a stream for line-by-line async consumption\n *\n * Stdin is only read when piped (not a TTY) and the field wasn't already provided via CLI flags.\n */\nexport function padroneStdin(options?: { disabled?: boolean }): <T extends CommandTypesBase>(builder: T) => T {\n const interceptor = options?.disabled ? defineInterceptor({ ...stdinInterceptor, disabled: true }, () => ({})) : stdinInterceptor;\n return ((builder: AnyPadroneBuilder) => builder.intercept(interceptor)) as any;\n}\n","import { resolveCommand, suggestSimilar } from '../core/commands.ts';\nimport { RoutingError } from '../core/errors.ts';\nimport { defineInterceptor } from '../core/interceptors.ts';\nimport { thenMaybe } from '../core/results.ts';\nimport { getKnownOptionNames } from '../core/validate.ts';\nimport type { AnyPadroneBuilder, AnyPadroneCommand, CommandTypesBase } from '../types/index.ts';\n\nfunction formatSuggestions(names: string[], prefix = ''): string {\n if (names.length === 0) return '';\n const quoted = names.map((n) => `\"${prefix}${n}\"`);\n if (quoted.length === 1) return `Did you mean ${quoted[0]}?`;\n return `Did you mean ${quoted.slice(0, -1).join(', ')} or ${quoted.at(-1)}?`;\n}\n\nfunction findSourceCommand(commandPath: string | undefined, root: AnyPadroneCommand): AnyPadroneCommand {\n if (!commandPath || commandPath === root.name || commandPath === root.path) return root;\n const parts = commandPath.split(' ');\n let current = root;\n for (const part of parts) {\n const found = current.commands?.find((c) => {\n resolveCommand(c);\n return c.name === part || c.aliases?.includes(part);\n });\n if (found) current = found;\n else break;\n }\n return current;\n}\n\nfunction enrichRoutingError(err: unknown, rootCommand: AnyPadroneCommand): unknown {\n if (!(err instanceof RoutingError)) return err;\n\n const unknownMatch = err.message.match(/^Unknown command: (\\S+)/);\n const unexpectedMatch = err.message.match(/^Unexpected arguments for '[^']+': (\\S+)/);\n const term = unknownMatch?.[1] ?? unexpectedMatch?.[1];\n if (!term) return err;\n\n const sourceCmd = findSourceCommand(err.command, rootCommand);\n\n const candidateNames: string[] = [];\n if (sourceCmd.commands) {\n for (const cmd of sourceCmd.commands) {\n resolveCommand(cmd);\n if (!cmd.hidden) {\n candidateNames.push(cmd.name);\n if (cmd.aliases) candidateNames.push(...cmd.aliases);\n }\n }\n }\n\n const similar = suggestSimilar(term, candidateNames);\n const suggestionText = formatSuggestions(similar);\n if (!suggestionText) return err;\n\n const suggestions = [suggestionText];\n const enrichedMsg = `${err.message}\\n\\n ${suggestionText}`;\n return new RoutingError(enrichedMsg, { suggestions, command: err.command });\n}\n\nfunction enrichIssuesWithSuggestions(\n issues: readonly { path?: readonly unknown[]; message: string }[],\n knownOptions: () => string[],\n): typeof issues {\n return issues.map((i: any) => {\n // Handle direct unknown option detection (from checkUnknownArgs)\n const unknownMatch = i.message?.match(/^Unknown option: \"([^\"]+)\"$/);\n if (unknownMatch) {\n const similar = suggestSimilar(unknownMatch[1], knownOptions());\n if (similar.length) {\n const hint = formatSuggestions(similar, '--');\n return { ...i, message: `${i.message} ${hint}` };\n }\n return i;\n }\n\n // Handle Zod strict schema errors (Unrecognized key(s) in object: \"foo\")\n const keys: string[] | undefined = i.keys ?? i.message?.match(/[Uu]nrecognized key(?:s)?[^\"]*\"([^\"]+)\"/)?.slice(1);\n if (!keys?.length) return i;\n const hints = keys.flatMap((k: string) => {\n const similar = suggestSimilar(k, knownOptions());\n return similar.length ? [formatSuggestions(similar, '--')] : [];\n });\n if (!hints.length) return i;\n return { ...i, message: `${i.message} ${hints.join(' ')}` };\n });\n}\n\nconst suggestionsInterceptor = defineInterceptor({ id: 'padrone:suggestions', name: 'padrone:suggestions', order: -500 }, () => ({\n parse(ctx, next) {\n try {\n const result = next();\n if (result instanceof Promise) {\n return result.catch((err: unknown) => {\n throw enrichRoutingError(err, ctx.command);\n });\n }\n return result;\n } catch (err) {\n throw enrichRoutingError(err, ctx.command);\n }\n },\n validate(ctx, next) {\n const result = next();\n return thenMaybe(result, (v) => {\n if (!v.argsResult?.issues?.length) return v;\n const enriched = enrichIssuesWithSuggestions(v.argsResult.issues, () => getKnownOptionNames(ctx.command));\n return { ...v, argsResult: { ...v.argsResult, issues: enriched } } as typeof v;\n });\n },\n}));\n\nexport function padroneSuggestions(): <T extends CommandTypesBase>(builder: T) => T {\n return ((builder: AnyPadroneBuilder) => builder.intercept(suggestionsInterceptor)) as any;\n}\n","import { thenMaybe } from '#src/core/results.ts';\nimport { resolveCommand } from '../core/commands.ts';\nimport { defineInterceptor } from '../core/interceptors.ts';\nimport type { AnyPadroneBuilder, CommandTypesBase, PadroneCommand } from '../types/index.ts';\nimport type { PadroneSchema } from '../types/schema.ts';\nimport type { WithCommand } from '../util/type-utils.ts';\nimport { getRootCommand, getVersion } from '../util/utils.ts';\n\n// ── Types ────────────────────────────────────────────────────────────────\n\nexport type VersionCommand = PadroneCommand<'version', '', PadroneSchema<void>, string, [], [], false>;\n\nexport type WithVersion<T> = WithCommand<T, 'version', VersionCommand>;\n\n// ── Interceptor ─────────────────────────────────────────────────────────\n\nconst versionInterceptor = defineInterceptor({ id: 'padrone:version', name: 'padrone:version', order: -1000 }, () => ({\n parse(_ctx, next) {\n return thenMaybe(next(), (res) => {\n const hasVersionFlag = res.rawArgs.version || res.rawArgs.v || res.rawArgs.V;\n\n // Only show version for root command (no subcommand matched)\n if (hasVersionFlag && !res.command.parent) {\n delete res.rawArgs.version;\n delete res.rawArgs.v;\n delete res.rawArgs.V;\n\n // Route to the version command so its action handles the rest\n const versionCmd = res.command.commands?.find((c) => c.name === 'version');\n if (versionCmd) {\n resolveCommand(versionCmd);\n return { ...res, command: versionCmd, rawArgs: {}, positionalArgs: [] };\n }\n }\n\n return res;\n });\n },\n}));\n\n// ── Extension ────────────────────────────────────────────────────────────\n\n/**\n * Extension that adds version support:\n * - `version` command\n * - `--version` / `-v` / `-V` flags (root command only)\n *\n * Usage:\n * ```ts\n * createPadrone('my-cli').extend(padroneVersion())\n * ```\n */\nexport function padroneVersion(): <T extends CommandTypesBase>(builder: T) => WithVersion<T> {\n return ((builder: AnyPadroneBuilder) =>\n builder\n .command('version', (c) =>\n c.configure({ description: 'Display the version number', hidden: true }).action((_args, ctx) => {\n const rootCommand = getRootCommand(ctx.command);\n return getVersion(rootCommand.version);\n }),\n )\n .intercept(versionInterceptor)) as any;\n}\n","import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { ValidationError } from '../core/errors.ts';\nimport type { PadroneSchema } from '../types/index.ts';\nimport { concatBytes } from '../util/stream.ts';\n\n/**\n * Configuration for wrapping an external CLI tool.\n */\nexport type WrapConfig<TCommandArgs extends PadroneSchema = PadroneSchema, TWrapArgs extends PadroneSchema = TCommandArgs> = {\n /**\n * The command to execute (e.g., 'git', 'docker', 'npm').\n */\n command: string;\n /**\n * Optional fixed arguments that always precede the arguments (e.g., ['commit'] for 'git commit').\n */\n args?: string[];\n /**\n * Positional argument configuration for the external command.\n * If not provided, defaults to the wrapping command's positional configuration.\n */\n positional?: string[];\n /**\n * Whether to inherit stdio streams (stdin, stdout, stderr) from the parent process.\n * Default: true\n */\n inheritStdio?: boolean;\n /**\n * Optional schema that transforms command arguments to external CLI arguments.\n * The schema's input type should match the command arguments, and its output type defines\n * the arguments expected by the external command.\n * If not provided, command arguments are passed through as-is.\n */\n schema?: TWrapArgs | ((commandArguments: TCommandArgs) => TWrapArgs);\n};\n\n/**\n * Result from executing a wrapped CLI tool.\n */\nexport type WrapResult = {\n /**\n * The exit code of the process.\n */\n exitCode: number;\n /**\n * Standard output from the process (only if inheritStdio is false).\n */\n stdout?: string;\n /**\n * Standard error from the process (only if inheritStdio is false).\n */\n stderr?: string;\n /**\n * Whether the process exited successfully (exit code 0).\n */\n success: boolean;\n};\n\n/**\n * Converts parsed arguments to CLI arguments for an external command.\n */\nfunction argsToCliArgs(input: Record<string, unknown> | undefined, positional: readonly string[] = []): string[] {\n const args: string[] = [];\n\n // Handle undefined or null input\n if (!input) return args;\n\n const positionalValues: Record<string, unknown> = {};\n const regularArguments: Record<string, unknown> = {};\n\n // Separate positional and regular arguments\n for (const [key, value] of Object.entries(input)) {\n if (positional.includes(key) || positional.includes(`...${key}`)) {\n positionalValues[key] = value;\n } else {\n regularArguments[key] = value;\n }\n }\n\n // Add regular arguments first\n for (const [key, value] of Object.entries(regularArguments)) {\n if (value === undefined || value === null) continue;\n\n // Use the key as-is with -- prefix\n const flag = `--${key}`;\n\n if (typeof value === 'boolean') {\n if (value) args.push(flag);\n } else if (Array.isArray(value)) {\n // For arrays, add the flag multiple times\n for (const item of value) {\n args.push(flag, String(item));\n }\n } else {\n args.push(flag, String(value));\n }\n }\n\n // Add positional arguments in the specified order\n for (const posKey of positional) {\n const isVariadic = posKey.startsWith('...');\n const key = isVariadic ? posKey.slice(3) : posKey;\n const value = positionalValues[key];\n\n if (value === undefined || value === null) continue;\n\n if (isVariadic && Array.isArray(value)) {\n args.push(...value.map(String));\n } else {\n args.push(String(value));\n }\n }\n\n return args;\n}\n\n/**\n * Creates an action handler that wraps an external CLI tool.\n * @param config - Configuration for wrapping the external command (includes optional schema)\n * @param commandArguments - The command's arguments schema\n * @param commandPositional - Default positional config from the wrapping command\n */\nexport function createWrapHandler<TCommandArgs extends PadroneSchema, TWrapArgs extends PadroneSchema>(\n config: WrapConfig<TCommandArgs, TWrapArgs>,\n commandArguments: TCommandArgs,\n commandPositional?: readonly string[],\n): (args: StandardSchemaV1.InferOutput<TCommandArgs>) => Promise<WrapResult> {\n return async (args: StandardSchemaV1.InferOutput<TCommandArgs>): Promise<WrapResult> => {\n const { command, args: fixedArgs = [], inheritStdio = true, positional = commandPositional, schema: wrapSchema } = config;\n\n // Get the wrap schema (handle function or direct schema)\n const schema = wrapSchema ? (typeof wrapSchema === 'function' ? wrapSchema(commandArguments) : wrapSchema) : commandArguments;\n\n // Transform command arguments to external CLI arguments using the wrap schema\n const validationResult = schema['~standard'].validate(args);\n\n const processResult = (result: StandardSchemaV1.Result<unknown>) => {\n if (result.issues) {\n const issueMessages = result.issues\n .map((i: StandardSchemaV1.Issue) => ` - ${(i.path as (string | number)[] | undefined)?.join('.') || 'root'}: ${i.message}`)\n .join('\\n');\n throw new ValidationError(`Wrap schema validation failed:\\n${issueMessages}`, result.issues as any);\n }\n return result.value;\n };\n\n const externalArguments =\n validationResult instanceof Promise ? await validationResult.then(processResult) : processResult(validationResult);\n\n // Convert arguments to CLI arguments\n const regularArgs = argsToCliArgs(externalArguments as Record<string, unknown>, positional);\n\n // Combine fixed args and regular args\n const allArgs = [...fixedArgs, ...regularArgs];\n\n // Execute the external command\n const { spawn } = await import('node:child_process');\n\n return new Promise<WrapResult>((resolve, reject) => {\n const proc = spawn(command, allArgs, {\n stdio: inheritStdio ? 'inherit' : ['ignore', 'pipe', 'pipe'],\n });\n\n const stdoutChunks: Uint8Array[] = [];\n const stderrChunks: Uint8Array[] = [];\n\n if (!inheritStdio) {\n proc.stdout!.on('data', (chunk: Uint8Array) => stdoutChunks.push(chunk));\n proc.stderr!.on('data', (chunk: Uint8Array) => stderrChunks.push(chunk));\n }\n\n const decoder = new TextDecoder();\n proc.on('error', reject);\n proc.on('close', (code) => {\n const exitCode = code ?? 1;\n resolve({\n exitCode,\n stdout: inheritStdio ? undefined : decoder.decode(concatBytes(stdoutChunks)),\n stderr: inheritStdio ? undefined : decoder.decode(concatBytes(stderrChunks)),\n success: exitCode === 0,\n });\n });\n });\n };\n}\n","import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport type {\n AnyPadroneCommand,\n AnyPadroneProgram,\n InterceptorExecuteContext,\n InterceptorExecuteResult,\n InterceptorParseContext,\n InterceptorParseResult,\n InterceptorRouteContext,\n InterceptorValidateContext,\n InterceptorValidateResult,\n PadroneActionContext,\n PadroneEvalPreferences,\n RegisteredInterceptor,\n ResolvedInterceptor,\n} from '../types/index.ts';\nimport { getCommandRuntime } from './commands.ts';\nimport { RoutingError, SignalError, ValidationError } from './errors.ts';\nimport { resolveRegisteredInterceptors, runInterceptorChain, wrapWithCommandLifecycle, wrapWithLifecycle } from './interceptors.ts';\nimport { errorResult, noop, thenMaybe, warnIfUnexpectedAsync, withDrain } from './results.ts';\nimport { buildCommandArgs, formatIssueMessages, validateCommandArgs } from './validate.ts';\n\nexport type ExecContext = {\n rootCommand: AnyPadroneCommand;\n builder: AnyPadroneProgram;\n parseCommandFn: (input: string | undefined) => {\n command: AnyPadroneCommand;\n rawArgs: Record<string, unknown>;\n args: string[];\n unmatchedTerms: string[];\n };\n collectInterceptorsFn: (cmd: AnyPadroneCommand) => RegisteredInterceptor[];\n};\n\n/**\n * Collects registered interceptors from the command's parent chain (root → ... → target).\n * Root/program interceptors come first (outermost), target command's interceptors last (innermost).\n */\nexport function collectInterceptors(cmd: AnyPadroneCommand, rootCommand: AnyPadroneCommand): RegisteredInterceptor[] {\n const chain: RegisteredInterceptor[][] = [];\n let current: AnyPadroneCommand | undefined = cmd;\n while (current) {\n const isTarget = current === cmd;\n if (!current.parent) {\n if (rootCommand.interceptors?.length) {\n const isRootTarget = cmd === rootCommand || !cmd.parent;\n chain.unshift(isRootTarget ? rootCommand.interceptors : rootCommand.interceptors.filter((i) => i.meta.inherit !== false));\n }\n } else {\n if (current.interceptors?.length) {\n chain.unshift(isTarget ? current.interceptors : current.interceptors.filter((i) => i.meta.inherit !== false));\n }\n }\n current = current.parent;\n }\n return chain.flat();\n}\n\n/** Wraps an error into a result, preserving any signal info from the pipeline. */\nexport function errorResultWithSignal(err: unknown) {\n const result = errorResult(err);\n if (err instanceof SignalError) {\n (result as any).signal = err.signal;\n (result as any).exitCode = err.exitCode;\n }\n return result;\n}\n\n/** Resolve context by walking the command parent chain and applying transforms from root to target. */\nfunction resolveContext(command: AnyPadroneCommand, initialContext: unknown): unknown {\n const chain: AnyPadroneCommand[] = [];\n let current: AnyPadroneCommand | undefined = command;\n while (current) {\n chain.unshift(current);\n current = current.parent;\n }\n let resolved = initialContext;\n for (const cmd of chain) {\n if (cmd.contextTransform) resolved = cmd.contextTransform(resolved);\n }\n return resolved;\n}\n\n/** Validate parse result — reject unmatched terms when the command doesn't accept positional args. */\nfunction validateParseResult(\n parseResult: { command: AnyPadroneCommand; rawArgs: Record<string, unknown>; args: string[]; unmatchedTerms: string[] },\n rootCommand: AnyPadroneCommand,\n): InterceptorParseResult {\n const { command, rawArgs, args, unmatchedTerms } = parseResult;\n\n if (unmatchedTerms.length > 0) {\n const hasPositionalConfig = command.meta?.positional && command.meta.positional.length > 0;\n if (!hasPositionalConfig) {\n const isRootCommand = command === rootCommand;\n const commandDisplayName = command.name || command.aliases?.[0] || command.path || '(default)';\n const errorMsg = isRootCommand\n ? `Unknown command: ${unmatchedTerms[0]}`\n : `Unexpected arguments for '${commandDisplayName}': ${unmatchedTerms.join(' ')}`;\n\n throw new RoutingError(errorMsg, { command: command.path || command.name });\n }\n }\n\n return { command, rawArgs, positionalArgs: args };\n}\n\n/** Handle validation issues based on error mode: throw (hard) or return result with issues (soft). */\nfunction handleValidationIssues(argsResult: StandardSchemaV1.FailureResult, command: AnyPadroneCommand, errorMode: 'soft' | 'hard') {\n if (errorMode === 'hard') {\n const issueMessages = formatIssueMessages(argsResult.issues);\n throw new ValidationError(`Validation error:\\n${issueMessages}`, argsResult.issues as any, {\n command: command.path || command.name,\n });\n }\n\n return withDrain({\n command: command as any,\n args: undefined,\n argsResult,\n result: undefined,\n });\n}\n\n/**\n * Core execution logic shared by eval() and cli().\n * errorMode controls validation error behavior:\n * - 'soft': return result with issues (eval behavior)\n * - 'hard': print error + help and throw (cli-without-input behavior)\n */\nexport function execCommand(\n resolvedInput: string | undefined,\n ctx: ExecContext,\n evalOptions?: PadroneEvalPreferences,\n errorMode: 'soft' | 'hard' = 'soft',\n caller: PadroneActionContext['caller'] = 'eval',\n) {\n const { rootCommand, parseCommandFn, collectInterceptorsFn } = ctx;\n const baseRuntime = getCommandRuntime(rootCommand);\n const runtime = evalOptions?.runtime\n ? Object.assign({}, baseRuntime, Object.fromEntries(Object.entries(evalOptions.runtime).filter(([, v]) => v !== undefined)))\n : baseRuntime;\n\n // Inert signal — the signal extension overrides this via next({ signal }) in the start phase.\n const inertSignal = new AbortController().signal;\n\n // Pipeline state accumulated as phases complete — propagated to error/shutdown contexts.\n const pipelineState: { rawArgs?: Record<string, unknown>; positionalArgs?: string[]; args?: unknown } = {};\n\n const initialContext = evalOptions?.context;\n\n // Factory resolution cache — ensures each factory is called at most once per execution,\n // so root interceptor closures are shared when they appear in both root and command chains.\n const factoryCache = new Map<RegisteredInterceptor, ResolvedInterceptor>();\n const rootRegistered = rootCommand.interceptors ?? [];\n const rootInterceptors = resolveRegisteredInterceptors(rootRegistered, factoryCache);\n const rootInterceptorSet = new Set(rootInterceptors);\n\n const runPipeline = (signal: AbortSignal, pipelineContext: unknown) => {\n // ── Phase 1: Parse ──────────────────────────────────────────────────\n const parseCtx: InterceptorParseContext = {\n input: resolvedInput,\n command: rootCommand,\n signal,\n context: pipelineContext as object,\n runtime,\n program: ctx.builder,\n caller,\n };\n\n const coreParse = (parseCtx: InterceptorParseContext): InterceptorParseResult =>\n validateParseResult(parseCommandFn(parseCtx.input), rootCommand);\n\n const parsedOrPromise = runInterceptorChain('parse', rootInterceptors, parseCtx, coreParse);\n\n // ── Phases 2 & 3 chained after parse ────────────────────────────────\n const continueAfterParse = (parsed: InterceptorParseResult) => {\n const { command } = parsed;\n pipelineState.rawArgs = parsed.rawArgs;\n pipelineState.positionalArgs = parsed.positionalArgs;\n const commandInterceptors = resolveRegisteredInterceptors(collectInterceptorsFn(command), factoryCache);\n const commandOnlyInterceptors = commandInterceptors.filter((i) => !rootInterceptorSet.has(i));\n const context = resolveContext(command, pipelineContext);\n\n // ── Phase 2: Route ──────────────────────────────────────────────\n const routeCtx: InterceptorRouteContext = {\n ...parseCtx,\n command,\n rawArgs: parsed.rawArgs,\n positionalArgs: parsed.positionalArgs,\n context: context as object,\n };\n\n const routedOrPromise = runInterceptorChain('route', commandInterceptors, routeCtx, () => {});\n\n const continueAfterRoute = () => {\n const runValidateAndExecute = () => {\n // ── Phase 3: Validate ───────────────────────────────────────────\n const validateCtx: InterceptorValidateContext = {\n ...parseCtx,\n command,\n rawArgs: parsed.rawArgs,\n positionalArgs: parsed.positionalArgs,\n context: context as object,\n evalInteractive: evalOptions?.interactive,\n };\n\n const coreValidate = (\n validateCtx: InterceptorValidateContext,\n ): InterceptorValidateResult | Promise<InterceptorValidateResult> => {\n const { args: preprocessedArgs, issues } = buildCommandArgs(\n validateCtx.command,\n validateCtx.rawArgs,\n validateCtx.positionalArgs,\n );\n if (issues) return { args: undefined, argsResult: { issues } as any };\n const validated = validateCommandArgs(validateCtx.command, preprocessedArgs);\n return thenMaybe(validated, (v) => v as InterceptorValidateResult);\n };\n\n const validatedOrPromise = runInterceptorChain('validate', commandInterceptors, validateCtx, coreValidate);\n\n // ── Phase 3: Execute (or handle validation errors) ──────────────\n const continueAfterValidate = (v: InterceptorValidateResult) => {\n pipelineState.args = v.args;\n if (v.argsResult?.issues) return handleValidationIssues(v.argsResult as StandardSchemaV1.FailureResult, command, errorMode);\n\n const executeCtx: InterceptorExecuteContext = {\n ...validateCtx,\n args: v.args,\n };\n\n const coreExecute = (executeCtx: InterceptorExecuteContext): InterceptorExecuteResult => {\n const handler = command.action ?? noop;\n const effectiveRuntime = executeCtx.runtime;\n const actionCtx: PadroneActionContext = {\n runtime: effectiveRuntime,\n command: executeCtx.command,\n program: ctx.builder as any,\n signal: executeCtx.signal,\n context: executeCtx.context,\n caller,\n };\n const result = handler(executeCtx.args as any, actionCtx);\n return { result };\n };\n\n const executedOrPromise = runInterceptorChain('execute', commandInterceptors, executeCtx, coreExecute);\n\n return thenMaybe(executedOrPromise, (e) => {\n const finalize = (result: unknown) =>\n withDrain({\n command: command as any,\n args: v.args,\n argsResult: v.argsResult,\n result,\n });\n\n if (e.result instanceof Promise) return e.result.then(finalize);\n return finalize(e.result);\n });\n };\n\n return thenMaybe(warnIfUnexpectedAsync(validatedOrPromise, command), continueAfterValidate) as any;\n };\n\n return wrapWithCommandLifecycle(\n commandOnlyInterceptors,\n command,\n resolvedInput,\n runValidateAndExecute,\n (result) => withDrain({ command: command as any, args: undefined, argsResult: undefined, result }),\n signal,\n context,\n runtime,\n ctx.builder,\n caller,\n pipelineState,\n );\n };\n\n return thenMaybe(routedOrPromise, continueAfterRoute) as any;\n };\n\n return thenMaybe(parsedOrPromise, continueAfterParse) as any;\n };\n\n return wrapWithLifecycle(\n rootInterceptors,\n rootCommand,\n resolvedInput,\n runPipeline,\n (result) => withDrain({ command: rootCommand, args: undefined, argsResult: undefined, result }),\n inertSignal,\n initialContext,\n runtime,\n ctx.builder,\n caller,\n pipelineState,\n ) as any;\n}\n","import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { buildReplCompleter, findCommandByName, getCommandRuntime } from '../core/commands.ts';\nimport { createTerminalReplSession } from '../core/default-runtime.ts';\nimport { REPL_SIGINT, type ReplSessionConfig } from '../core/runtime.ts';\nimport type { AnyPadroneCommand, PadroneEvalPreferences, PadroneReplPreferences } from '../types/index.ts';\nimport { getVersion } from '../util/utils.ts';\n\nexport type ReplDeps = {\n existingCommand: AnyPadroneCommand;\n evalCommand: (input: string, prefs?: PadroneEvalPreferences) => any;\n replActiveRef: { value: boolean };\n};\n\n/**\n * Creates a REPL async iterable for running commands interactively.\n */\nexport function createReplIterator(deps: ReplDeps, options?: PadroneReplPreferences): AsyncIterable<any> & { drain: () => Promise<any> } {\n const { existingCommand, evalCommand, replActiveRef } = deps;\n\n if (replActiveRef.value) {\n const runtime = getCommandRuntime(existingCommand);\n runtime.error('REPL is already running. Nested REPL sessions are not supported.');\n return (async function* () {})() as any;\n }\n\n const runtime = getCommandRuntime(existingCommand);\n\n const programName = existingCommand.name || 'padrone';\n const env = runtime.env();\n const useAnsi = runtime.format === 'ansi' || (runtime.format === 'auto' && !env.NO_COLOR && !env.CI && runtime.terminal?.isTTY === true);\n\n // Track command history for .history built-in\n const commandHistory: string[] = [];\n\n // Resolve the initial scope command from options.scope (command path like 'db' or 'db migrate')\n const resolveScope = (scope: string): AnyPadroneCommand[] => {\n const parts = scope.split(/\\s+/);\n const stack: AnyPadroneCommand[] = [];\n let current = existingCommand;\n for (const part of parts) {\n const found = findCommandByName(part, current.commands);\n if (!found) break;\n stack.push(found);\n current = found;\n }\n return stack;\n };\n\n async function* replIterator() {\n replActiveRef.value = true;\n const showGreeting = options?.greeting !== false;\n const showHint = options?.hint !== false;\n\n // Empty line before greeting/hint block\n if (showGreeting || showHint) runtime.output('');\n\n // Greeting: default shows program title (or name) + version, like \"Welcome to My App v1.0.0\"\n if (showGreeting) {\n if (options?.greeting) {\n runtime.output(options.greeting);\n } else {\n const displayName = existingCommand.title || programName;\n const version = existingCommand.version ? await getVersion(existingCommand.version) : undefined;\n const greeting = version ? `Welcome to ${displayName} v${version}` : `Welcome to ${displayName}`;\n runtime.output(greeting);\n }\n }\n\n // Hint: dimmed text below greeting\n if (showHint) {\n const hintText =\n (typeof options?.hint === 'string' ? options.hint : undefined) ?? 'Type \".help\" for more information, \".exit\" to quit.';\n runtime.output(useAnsi ? `\\x1b[2m${hintText}\\x1b[0m` : hintText);\n }\n\n // Empty line after greeting/hint block\n if (showGreeting || showHint) runtime.output('');\n\n // Scope stack for nested/contextual REPLs.\n // `cd <subcommand>` pushes, `cd ..`/`..` pops. The scope path is prepended to all eval input.\n const scopeStack: AnyPadroneCommand[] = options?.scope ? resolveScope(options.scope) : [];\n\n const getScopeCommand = () => (scopeStack.length ? scopeStack[scopeStack.length - 1]! : existingCommand);\n const getScopePath = () => scopeStack.map((c) => c.name).join(' ');\n\n const buildPrompt = () => {\n if (options?.prompt) return typeof options.prompt === 'function' ? options.prompt() : options.prompt;\n const scopePath = getScopePath();\n const label = scopePath ? `${programName}/${scopePath.replace(/ /g, '/')}` : programName;\n return useAnsi ? `\\x1b[1m${label}\\x1b[0m ❯ ` : `${label} ❯ `;\n };\n\n // Build completer scoped to the current command\n const buildScopedCompleter = () => {\n const scopeCmd = getScopeCommand();\n const inScope = scopeStack.length > 0;\n return buildReplCompleter(scopeCmd, { inScope });\n };\n\n // Build session config with completer\n const sessionConfig: ReplSessionConfig = { history: options?.history };\n if (options?.completion !== false) {\n sessionConfig.completer = buildScopedCompleter();\n }\n\n // If the runtime provides a custom readLine, use it (stateless, no history/completion).\n // Otherwise, create a persistent terminal session with history + tab completion.\n const session = runtime.readLine ? undefined : createTerminalReplSession(sessionConfig);\n const questionFn = session ? (prompt: string) => session.question(prompt) : runtime.readLine!;\n\n // Update the session's completer when scope changes\n const updateCompleter = () => {\n if (options?.completion === false) return;\n const completer = buildScopedCompleter();\n if (session) session.completer = completer;\n sessionConfig.completer = completer;\n };\n\n // Track last SIGINT time for double Ctrl+C to exit\n let lastSigintTime = 0;\n\n try {\n while (true) {\n const promptStr = buildPrompt();\n const input = await questionFn(promptStr);\n\n // EOF (Ctrl+D, closed connection)\n if (input === null) break;\n\n // Handle Ctrl+C (SIGINT sentinel from terminal session)\n if (input === REPL_SIGINT) {\n const now = Date.now();\n if (now - lastSigintTime < 2000) break; // Double Ctrl+C within 2s → exit\n lastSigintTime = now;\n runtime.output('(press Ctrl+C again to exit, or Ctrl+D)');\n continue;\n }\n\n const trimmed = input.trim();\n if (!trimmed) continue;\n\n // Reset SIGINT timer on any real input\n lastSigintTime = 0;\n\n // Track command history for .history\n commandHistory.push(trimmed);\n\n // Dot-prefixed built-in REPL commands\n if (trimmed === '.exit' || trimmed === '.quit') break;\n if (trimmed === '.clear') {\n runtime.output('\\x1B[2J\\x1B[H');\n continue;\n }\n if (trimmed === '.help') {\n const lines = [\n 'REPL Commands:',\n ' . Execute the current scoped command',\n ' .help Print this help message',\n ' .exit Exit the REPL',\n ' .clear Clear the screen',\n ' .history Show command history',\n ' .scope <cmd> Scope into a subcommand',\n ' .scope .. Go up one scope level',\n ];\n lines.push(\n '',\n 'Keybindings:',\n ' Ctrl+C Cancel current line (press twice to exit)',\n ' Ctrl+D Exit the REPL',\n ' Up/Down Navigate history',\n ' Tab Auto-complete',\n '',\n 'Type \"help\" to see available commands.',\n );\n runtime.output(lines.join('\\n'));\n continue;\n }\n if (trimmed === '.history') {\n // Show all previous entries (excluding the .history command itself)\n const entries = commandHistory.slice(0, -1);\n if (entries.length === 0) {\n runtime.output('No history.');\n } else {\n runtime.output(entries.map((entry, i) => `${i + 1} ${entry}`).join('\\n'));\n }\n continue;\n }\n\n // `.scope <subcommand>` — scope the REPL to a command subtree\n // `.scope ..` or `..` — go up one scope level\n if (trimmed.startsWith('.scope ') || trimmed === '.scope') {\n const target = trimmed.slice(6).trim();\n if (target === '..' || target === '') {\n if (scopeStack.length > 0) {\n scopeStack.pop();\n updateCompleter();\n }\n } else {\n const scopeCmd = getScopeCommand();\n const found = findCommandByName(target, scopeCmd.commands);\n if (found) {\n if (found.commands?.length) {\n scopeStack.push(found);\n updateCompleter();\n } else {\n runtime.error(`\"${target}\" has no subcommands to scope into.`);\n }\n } else {\n runtime.error(`Unknown command: ${target}`);\n }\n }\n continue;\n }\n\n // `..` shorthand for `.scope ..`\n if (trimmed === '..') {\n if (scopeStack.length > 0) {\n scopeStack.pop();\n updateCompleter();\n }\n continue;\n }\n\n // `.` (bare dot) — execute the current command (scoped or root)\n let evalInput = trimmed;\n if (trimmed === '.') {\n evalInput = '';\n }\n\n const prefix = options?.outputPrefix;\n const prefixLines = prefix\n ? (text: string) =>\n text\n .split('\\n')\n .map((l) => prefix + l)\n .join('\\n')\n : undefined;\n\n // Temporarily patch runtime on all commands so handler output gets prefixed.\n // Commands store parent refs from build time, so we patch each command directly.\n const savedRuntimes: { cmd: AnyPadroneCommand; runtime: typeof existingCommand.runtime }[] = [];\n if (prefixLines) {\n const prefixedRuntime = {\n ...existingCommand.runtime,\n output: (...args: unknown[]) => {\n const first = args[0];\n runtime.output(typeof first === 'string' ? prefixLines(first) : first, ...args.slice(1));\n },\n error: (text: string) => runtime.error(prefixLines(text)),\n };\n const patchAll = (cmd: AnyPadroneCommand) => {\n savedRuntimes.push({ cmd, runtime: cmd.runtime });\n cmd.runtime = prefixedRuntime;\n cmd.commands?.forEach(patchAll);\n };\n patchAll(existingCommand);\n }\n\n // Resolve before/after spacing from the shorthand or object form\n const sp = options?.spacing;\n const isSpacingObject = typeof sp === 'object' && sp !== null && !Array.isArray(sp);\n const spacingBefore = isSpacingObject ? sp.before : sp;\n const spacingAfter = isSpacingObject ? sp.after : sp;\n\n const emitSpacingLine = (value: boolean | string) => {\n if (typeof value === 'string') {\n const sep = value.length === 1 ? value.repeat(runtime.terminal?.columns ?? 80) : value;\n runtime.output(sep);\n } else if (value) {\n runtime.output('');\n }\n };\n const emitSpacing = (value: typeof spacingBefore) => {\n if (!value) return;\n if (Array.isArray(value)) {\n for (const line of value) emitSpacingLine(line);\n } else {\n emitSpacingLine(value);\n }\n };\n\n emitSpacing(spacingBefore);\n\n // Prepend scope path so evalCommand resolves relative to root\n const scopePath = getScopePath();\n const scopedInput = scopePath ? (evalInput ? `${scopePath} ${evalInput}` : scopePath) : evalInput;\n\n try {\n const replEvalPrefs: PadroneEvalPreferences | undefined = { caller: 'repl' };\n const result = await evalCommand(scopedInput, replEvalPrefs);\n if (result.error) {\n const msg = result.error instanceof Error ? result.error.message : String(result.error);\n runtime.error(prefixLines ? prefixLines(msg) : msg);\n } else if (result.argsResult?.issues) {\n const issueMessages = result.argsResult.issues\n .map((i: StandardSchemaV1.Issue) => ` - ${i.path?.join('.') || 'root'}: ${i.message}`)\n .join('\\n');\n const msg = `Validation error:\\n${issueMessages}`;\n runtime.error(prefixLines ? prefixLines(msg) : msg);\n }\n yield result as any;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n runtime.error(prefixLines ? prefixLines(msg) : msg);\n } finally {\n for (const { cmd, runtime: saved } of savedRuntimes) cmd.runtime = saved;\n emitSpacing(spacingAfter);\n }\n }\n } finally {\n replActiveRef.value = false;\n session?.close();\n }\n }\n\n const iterable = replIterator();\n (iterable as any).drain = async () => {\n try {\n const results: any[] = [];\n for await (const result of iterable) results.push(result);\n return { value: results };\n } catch (err) {\n return { error: err };\n }\n };\n return iterable as any;\n}\n","import type { Schema } from 'ai';\nimport type { ShellType } from '../feature/completion.ts';\nimport { createReplIterator } from '../feature/repl-loop.ts';\nimport { generateHelp } from '../output/help.ts';\nimport type {\n AnyPadroneCommand,\n AnyPadroneProgram,\n InterceptorExecuteContext,\n InterceptorExecuteResult,\n PadroneActionContext,\n PadroneAPI,\n PadroneReplPreferences,\n} from '../types/index.ts';\nimport { extractSchemaMetadata, parsePositionalConfig } from './args.ts';\nimport { findCommandByName, getCommandRuntime, resolveAllCommands } from './commands.ts';\nimport { RoutingError } from './errors.ts';\nimport type { ExecContext } from './exec.ts';\nimport { collectInterceptors, errorResultWithSignal, execCommand } from './exec.ts';\nimport { resolveRegisteredInterceptors, runInterceptorChain } from './interceptors.ts';\nimport { errorResult, makeThenable, thenMaybe, warnIfUnexpectedAsync, withDrain, withPromiseDrain } from './results.ts';\nimport { coreValidateForParse } from './validate.ts';\n\nexport function createProgramMethods(ctx: ExecContext, evalCommand: AnyPadroneProgram['eval']) {\n const { rootCommand } = ctx;\n\n // A never-aborted signal for contexts that don't need signal handling (parse, run).\n const inertSignal = new AbortController().signal;\n\n const stringify: AnyPadroneProgram['stringify'] = (command = '' as any, args) => {\n const commandObj = typeof command === 'string' ? findCommandByName(command, rootCommand.commands) : (command as AnyPadroneCommand);\n if (!commandObj) throw new RoutingError(`Command \"${command ?? ''}\" not found`);\n\n const parts: string[] = [];\n\n if (commandObj.path) parts.push(commandObj.path);\n\n const positionalConfig = commandObj.meta?.positional ? parsePositionalConfig(commandObj.meta.positional) : [];\n const positionalNames = new Set(positionalConfig.map((p) => p.name));\n\n // Build reverse map: arg name → first negative keyword (for stringify)\n const negativeKeyword: Record<string, string> = {};\n if (commandObj.argsSchema) {\n const { negatives } = extractSchemaMetadata(commandObj.argsSchema, commandObj.meta?.fields, commandObj.meta?.autoAlias);\n for (const [keyword, argName] of Object.entries(negatives)) {\n if (!(argName in negativeKeyword)) negativeKeyword[argName] = keyword;\n }\n }\n\n if (args && typeof args === 'object') {\n for (const { name, variadic } of positionalConfig) {\n const value = (args as Record<string, unknown>)[name];\n if (value === undefined) continue;\n\n if (variadic && Array.isArray(value)) {\n for (const v of value) {\n const vStr = String(v);\n if (vStr.includes(' ')) parts.push(`\"${vStr}\"`);\n else parts.push(vStr);\n }\n } else {\n const argStr = String(value);\n if (argStr.includes(' ')) parts.push(`\"${argStr}\"`);\n else parts.push(argStr);\n }\n }\n\n const stringifyValue = (key: string, value: unknown) => {\n if (value === undefined) return;\n\n if (typeof value === 'boolean') {\n if (value) parts.push(`--${key}`);\n else if (negativeKeyword[key]) parts.push(`--${negativeKeyword[key]}`);\n else parts.push(`--no-${key}`);\n } else if (Array.isArray(value)) {\n for (const v of value) {\n const vStr = String(v);\n if (vStr.includes(' ')) parts.push(`--${key}=\"${vStr}\"`);\n else parts.push(`--${key}=${vStr}`);\n }\n } else if (typeof value === 'object' && value !== null) {\n for (const [nestedKey, nestedValue] of Object.entries(value)) {\n stringifyValue(`${key}.${nestedKey}`, nestedValue);\n }\n } else if (typeof value === 'string') {\n if (value.includes(' ')) parts.push(`--${key}=\"${value}\"`);\n else parts.push(`--${key}=${value}`);\n } else {\n parts.push(`--${key}=${value}`);\n }\n };\n\n for (const [key, value] of Object.entries(args)) {\n if (value === undefined || positionalNames.has(key)) continue;\n stringifyValue(key, value);\n }\n }\n\n return parts.join(' ');\n };\n\n const resolveContext = (command: AnyPadroneCommand, initialContext: unknown): unknown => {\n const chain: AnyPadroneCommand[] = [];\n let current: AnyPadroneCommand | undefined = command;\n while (current) {\n chain.unshift(current);\n current = current.parent;\n }\n let resolved = initialContext;\n for (const cmd of chain) {\n if (cmd.contextTransform) resolved = cmd.contextTransform(resolved);\n }\n return resolved;\n };\n\n const run: AnyPadroneProgram['run'] = (command, args, prefs?: { context?: unknown }) => {\n try {\n const commandObj = typeof command === 'string' ? findCommandByName(command, rootCommand.commands) : (command as AnyPadroneCommand);\n if (!commandObj) throw new RoutingError(`Command \"${command ?? ''}\" not found`);\n if (!commandObj.action) throw new RoutingError(`Command \"${commandObj.path}\" has no action`, { command: commandObj.path });\n\n const resolvedCtx = resolveContext(commandObj, prefs?.context);\n const commandRuntime = getCommandRuntime(commandObj);\n const executeCtx: InterceptorExecuteContext = {\n command: commandObj,\n input: undefined,\n rawArgs: {},\n positionalArgs: [],\n args,\n signal: inertSignal,\n context: resolvedCtx as object,\n runtime: commandRuntime,\n program: ctx.builder as any,\n caller: 'run',\n };\n\n const coreExecute = (executeCtx: InterceptorExecuteContext): InterceptorExecuteResult => {\n const actionCtx: PadroneActionContext = {\n runtime: executeCtx.runtime,\n command: executeCtx.command,\n program: ctx.builder as any,\n signal: inertSignal,\n context: executeCtx.context,\n caller: 'run',\n };\n const result = commandObj.action!(executeCtx.args as any, actionCtx);\n return { result };\n };\n\n const commandInterceptors = resolveRegisteredInterceptors(collectInterceptors(commandObj, rootCommand), new Map());\n const executedOrPromise = runInterceptorChain('execute', commandInterceptors, executeCtx, coreExecute);\n\n const toResult = (e: InterceptorExecuteResult) => withDrain({ command: commandObj as any, args: args as any, result: e.result });\n\n if (executedOrPromise instanceof Promise) {\n return executedOrPromise.then(toResult).catch((err: unknown) => errorResult(err, { command: commandObj, args })) as any;\n }\n return toResult(executedOrPromise);\n } catch (err) {\n return errorResult(err) as any;\n }\n };\n\n const tool: AnyPadroneProgram['tool'] = () => {\n resolveAllCommands(rootCommand);\n const helpText = generateHelp(rootCommand, undefined, { format: 'text' });\n\n const description = `Run a command. Pass the full command string including arguments. Use \"help <command>\" for detailed usage.\\n\\n${helpText}`;\n\n return {\n type: 'function',\n name: rootCommand.name,\n strict: true,\n title: rootCommand.description,\n description,\n inputExamples: [{ input: { command: '<command> [positionals...] [arguments...]' } }],\n inputSchema: {\n [Symbol.for('vercel.ai.schema') as keyof Schema & symbol]: true,\n jsonSchema: {\n type: 'object',\n properties: { command: { type: 'string' } },\n additionalProperties: false,\n },\n _type: undefined as unknown as { command: string },\n validate: (value) => {\n const command = (value as any)?.command;\n if (typeof command === 'string') return { success: true, value: { command } };\n return { success: false, error: new Error('Expected an object with command property as string.') };\n },\n } satisfies Schema<{ command: string }> as Schema<{ command: string }>,\n needsApproval: async (input) => {\n const parsed = await parse(input.command);\n if (typeof parsed.command.needsApproval === 'function') return parsed.command.needsApproval(parsed.args);\n if (parsed.command.needsApproval != null) return !!parsed.command.needsApproval;\n return !!parsed.command.mutation;\n },\n execute: async (input) => {\n const output: string[] = [];\n const errors: string[] = [];\n const result = await evalCommand(input.command, {\n caller: 'tool',\n runtime: {\n output: (...args) => output.push(args.map(String).join(' ')),\n error: (text) => errors.push(text),\n interactive: 'unsupported',\n format: 'text',\n },\n });\n return { result: result.result, logs: output.join('\\n'), error: errors.join('\\n') };\n },\n };\n };\n\n const replActiveRef = { value: false };\n const replFn = (options?: PadroneReplPreferences) =>\n createReplIterator({ existingCommand: rootCommand, evalCommand, replActiveRef }, options);\n\n const cli: AnyPadroneProgram['cli'] = (cliOptions) => {\n try {\n const runtime = getCommandRuntime(rootCommand);\n const resolvedInput = (runtime.argv().join(' ') || undefined) as string | undefined;\n\n const result = execCommand(resolvedInput, ctx, cliOptions, 'hard', 'cli');\n\n if (result instanceof Promise) return withPromiseDrain(result.catch((err: unknown) => errorResultWithSignal(err))) as any;\n return makeThenable(result);\n } catch (err) {\n return makeThenable(errorResultWithSignal(err)) as any;\n }\n };\n\n const find: AnyPadroneProgram['find'] = (command) => {\n if (typeof command !== 'string') return findCommandByName(command.path, rootCommand.commands) as any;\n return findCommandByName(command, rootCommand.commands) as any;\n };\n\n const parse: AnyPadroneProgram['parse'] = (input) => {\n const { command, rawArgs, args } = ctx.parseCommandFn(input as string | undefined);\n\n const validatedOrPromise = coreValidateForParse(command, rawArgs, args);\n\n return makeThenable(\n warnIfUnexpectedAsync(\n thenMaybe(validatedOrPromise, (v: any) => ({ command: command as any, args: v.args, argsResult: v.argsResult })),\n command,\n ),\n ) as any;\n };\n\n const help: AnyPadroneProgram['help'] = (command, prefs) => {\n resolveAllCommands(rootCommand);\n const commandObj = !command\n ? rootCommand\n : typeof command === 'string'\n ? findCommandByName(command, rootCommand.commands)\n : (command as AnyPadroneCommand);\n if (!commandObj) throw new RoutingError(`Command \"${command ?? ''}\" not found`);\n const runtime = getCommandRuntime(rootCommand);\n return generateHelp(rootCommand, commandObj, {\n ...prefs,\n format: prefs?.format ?? runtime.format,\n theme: prefs?.theme ?? runtime.theme,\n terminal: prefs?.terminal ?? runtime.terminal,\n env: prefs?.env ?? runtime.env(),\n });\n };\n\n const api: AnyPadroneProgram['api'] = () => {\n resolveAllCommands(rootCommand);\n function buildApi(command: AnyPadroneCommand) {\n const runCommand = ((args) => run(command, args).result) as PadroneAPI<AnyPadroneCommand>;\n if (!command.commands) return runCommand;\n for (const cmd of command.commands) runCommand[cmd.name] = buildApi(cmd);\n return runCommand;\n }\n return buildApi(rootCommand);\n };\n\n const completion: AnyPadroneProgram['completion'] = async (shell) => {\n resolveAllCommands(rootCommand);\n const { generateCompletionOutput } = await import('../feature/completion.ts');\n return generateCompletionOutput(rootCommand, shell as ShellType | undefined);\n };\n\n const mcp: AnyPadroneProgram['mcp'] = async (prefs) => {\n resolveAllCommands(rootCommand);\n const { startMcpServer } = await import('../feature/mcp.ts');\n return startMcpServer(ctx.builder as any, rootCommand, evalCommand, prefs);\n };\n\n const serve: AnyPadroneProgram['serve'] = async (prefs) => {\n resolveAllCommands(rootCommand);\n const { startServeServer } = await import('../feature/serve.ts');\n return startServeServer(ctx.builder as any, rootCommand, evalCommand, prefs);\n };\n\n return {\n find,\n parse,\n stringify,\n run,\n eval: evalCommand,\n cli,\n tool,\n repl: replFn,\n api,\n help,\n completion,\n mcp,\n serve,\n };\n}\n","import { padroneAutoOutput } from '../extension/auto-output.ts';\nimport { padroneColor } from '../extension/color.ts';\nimport type { HelpCommand } from '../extension/help.ts';\nimport { padroneHelp } from '../extension/help.ts';\nimport { padroneInteractive } from '../extension/interactive.ts';\nimport { padroneRepl } from '../extension/repl.ts';\nimport { padroneSignalHandling } from '../extension/signal.ts';\nimport { padroneStdin } from '../extension/stdin.ts';\nimport { padroneSuggestions } from '../extension/suggestions.ts';\nimport type { VersionCommand } from '../extension/version.ts';\nimport { padroneVersion } from '../extension/version.ts';\nimport { createWrapHandler } from '../feature/wrap.ts';\nimport type {\n AnyPadroneCommand,\n AnyPadroneProgram,\n CommandTypesBase,\n DefineCommandBuilder,\n DefineCommandContext,\n InterceptorFactory,\n InterceptorMeta,\n PadroneBuilder,\n PadroneCommand,\n PadroneInterceptorFn,\n PadroneProgram,\n PadroneSchema,\n RegisteredInterceptor,\n} from '../types/index.ts';\nimport { commandSymbol, findCommandByName, lazyResolver, mergeCommands, repathCommandTree, resolveCommand } from './commands.ts';\nimport { RoutingError } from './errors.ts';\nimport type { ExecContext } from './exec.ts';\nimport { collectInterceptors, errorResultWithSignal, execCommand } from './exec.ts';\nimport { toRegisteredInterceptor } from './interceptors.ts';\nimport { createProgramMethods } from './program-methods.ts';\nimport { hasInteractiveConfig, isAsyncBranded, makeThenable, noop, withPromiseDrain } from './results.ts';\nimport { parseCommand } from './validate.ts';\n\nexport { buildReplCompleter } from './commands.ts';\nexport { asyncSchema } from './results.ts';\n\n/**\n * Options for configuring which built-in extensions are applied by default.\n */\nexport type PadroneBuiltins = {\n /** Enable `help` command, `--help` / `-h` flags, and default help display. Defaults to `true`. */\n help?: boolean;\n /** Enable `version` command and `--version` / `-v` / `-V` flags. Defaults to `true`. */\n version?: boolean;\n /** Enable `repl` command and `--repl` flag. Defaults to `true`. */\n repl?: boolean;\n /** Enable `--color` / `--no-color` flag support. Defaults to `true`. */\n color?: boolean;\n /** Enable \"Did you mean?\" suggestions for unknown commands and options. Defaults to `true`. */\n suggestions?: boolean;\n /** Enable signal handling (SIGINT, SIGTERM, SIGHUP). Defaults to `true`. */\n signal?: boolean;\n /** Enable automatic result output for `cli()`. Defaults to `true`. */\n autoOutput?: boolean;\n /** Enable stdin piping support. Defaults to `true`. */\n stdin?: boolean;\n /** Enable interactive prompting for missing arguments. Defaults to `true`. */\n interactive?: boolean;\n};\n\nexport type PadroneOptions = { builtins?: PadroneBuiltins };\n\n// biome-ignore lint/complexity/noBannedTypes: empty object signals \"all defaults enabled\"\ntype DefaultBuiltins = {};\n\ntype BuiltinCommands<B> = [...(B extends { help: false } ? [] : [HelpCommand]), ...(B extends { version: false } ? [] : [VersionCommand])];\n\nexport function createPadrone<TProgramName extends string, const TBuiltins extends PadroneBuiltins = DefaultBuiltins>(\n name: TProgramName,\n options?: { builtins?: TBuiltins },\n): PadroneProgram<TProgramName, '', '', PadroneSchema<void>, void, BuiltinCommands<TBuiltins>> {\n let builder: any = createPadroneBuilder({ name, path: '', commands: [] } as any);\n\n const b = options?.builtins;\n if (b?.help !== false) builder = builder.extend(padroneHelp());\n if (b?.version !== false) builder = builder.extend(padroneVersion());\n if (b?.repl !== false) builder = builder.extend(padroneRepl());\n if (b?.color !== false) builder = builder.extend(padroneColor());\n if (b?.suggestions !== false) builder = builder.extend(padroneSuggestions());\n if (b?.signal !== false) builder = builder.extend(padroneSignalHandling());\n if (b?.autoOutput !== false) builder = builder.extend(padroneAutoOutput());\n if (b?.stdin !== false) builder = builder.extend(padroneStdin());\n if (b?.interactive !== false) builder = builder.extend(padroneInteractive());\n\n return builder as any;\n}\n\nexport function createPadroneBuilder<TBuilder extends PadroneProgram = PadroneProgram>(\n inputCommand: AnyPadroneCommand,\n): TBuilder & { [commandSymbol]: AnyPadroneCommand } {\n // Re-parent direct subcommands so getCommandRuntime walks to the current root,\n // not a stale parent from before .runtime()/.configure()/etc.\n const existingCommand =\n inputCommand.commands?.length && inputCommand.commands.some((c) => c.parent && c.parent !== inputCommand)\n ? {\n ...inputCommand,\n commands: inputCommand.commands.map((c) => (c.parent && c.parent !== inputCommand ? { ...c, parent: inputCommand } : c)),\n }\n : inputCommand;\n\n const parseCommandFn = (input: string | undefined) => parseCommand(input, existingCommand, findCommandByName);\n const collectInterceptorsFn = (cmd: AnyPadroneCommand) => collectInterceptors(cmd, existingCommand);\n\n // Execution context shared by exec and program methods.\n // `builder` is assigned after the builder object is created (forward ref resolved at runtime only).\n const execCtx: ExecContext = {\n rootCommand: existingCommand,\n builder: undefined as any,\n parseCommandFn,\n collectInterceptorsFn,\n };\n\n const evalCommand: AnyPadroneProgram['eval'] = (input, evalOptions) => {\n try {\n const result = execCommand(input as string, execCtx, evalOptions, 'soft', evalOptions?.caller ?? 'eval');\n if (result instanceof Promise) return withPromiseDrain(result.catch((err: unknown) => errorResultWithSignal(err))) as any;\n return makeThenable(result);\n } catch (err) {\n return makeThenable(errorResultWithSignal(err)) as any;\n }\n };\n\n const programMethods = createProgramMethods(execCtx, evalCommand);\n\n const builder = {\n extend(extension: (builder: any) => any) {\n return extension(builder);\n },\n configure(config) {\n return createPadroneBuilder({ ...existingCommand, ...config }) as any;\n },\n runtime(runtimeConfig) {\n return createPadroneBuilder({ ...existingCommand, runtime: { ...existingCommand.runtime, ...runtimeConfig } }) as any;\n },\n async() {\n return createPadroneBuilder({ ...existingCommand, isAsync: true }) as any;\n },\n context(transform?: (ctx: unknown) => unknown) {\n if (!transform) return createPadroneBuilder({ ...existingCommand }) as any;\n const existing = existingCommand.contextTransform;\n const composed = existing ? (ctx: unknown) => transform(existing(ctx)) : transform;\n return createPadroneBuilder({ ...existingCommand, contextTransform: composed }) as any;\n },\n arguments(schema, meta) {\n const resolvedArgs = typeof schema === 'function' ? schema(existingCommand.argsSchema as any) : schema;\n const isAsync = existingCommand.isAsync || isAsyncBranded(resolvedArgs) || hasInteractiveConfig(meta);\n return createPadroneBuilder({ ...existingCommand, argsSchema: resolvedArgs, meta, isAsync }) as any;\n },\n action(handler = noop) {\n const baseHandler = existingCommand.action ?? noop;\n return createPadroneBuilder({\n ...existingCommand,\n action: (args: any, ctx: any) => (handler as any)(args, ctx, baseHandler),\n }) as any;\n },\n wrap(config) {\n const handler = createWrapHandler(config, existingCommand.argsSchema as any, existingCommand.meta?.positional);\n return createPadroneBuilder({ ...existingCommand, action: handler }) as any;\n },\n command(nameOrNames: string | readonly string[], builderFn?: (builder: any) => any) {\n const name = Array.isArray(nameOrNames) ? nameOrNames[0] : nameOrNames;\n const aliases = Array.isArray(nameOrNames) && nameOrNames.length > 1 ? (nameOrNames.slice(1) as string[]) : undefined;\n\n const existingSubcommand = existingCommand.commands?.find((c) => c.name === name) as AnyPadroneCommand | undefined;\n if (existingSubcommand) resolveCommand(existingSubcommand);\n\n const initialCommand: AnyPadroneCommand = existingSubcommand\n ? { ...existingSubcommand, aliases: aliases ?? existingSubcommand.aliases, parent: existingCommand }\n : ({\n name,\n path: existingCommand.path ? `${existingCommand.path} ${name}` : name,\n aliases,\n parent: existingCommand,\n '~types': {} as any,\n } satisfies PadroneCommand);\n\n if (builderFn) {\n const lazyCmd: AnyPadroneCommand = { ...initialCommand };\n (lazyCmd as any)[lazyResolver] = (target: AnyPadroneCommand) => {\n const savedParent = target.parent;\n const b = createPadroneBuilder(target);\n const commandObj = ((builderFn(b as any) as unknown as typeof b)?.[commandSymbol] as AnyPadroneCommand) ?? target;\n const mergedCommandObj = existingSubcommand ? mergeCommands(existingSubcommand, commandObj) : commandObj;\n Object.assign(target, mergedCommandObj);\n // Restore parent: mergeCommands copies the existing command's parent which may be stale\n // (e.g. when an extension is applied twice, the merged parent predates re-parenting).\n target.parent = savedParent;\n };\n\n const commands = existingCommand.commands || [];\n const existingIndex = commands.findIndex((c) => c.name === name);\n const updatedCommands =\n existingIndex >= 0\n ? [...commands.slice(0, existingIndex), lazyCmd, ...commands.slice(existingIndex + 1)]\n : [...commands, lazyCmd];\n\n return createPadroneBuilder({ ...existingCommand, commands: updatedCommands }) as any;\n }\n\n const commands = existingCommand.commands || [];\n const existingIndex = commands.findIndex((c) => c.name === name);\n const updatedCommands =\n existingIndex >= 0\n ? [...commands.slice(0, existingIndex), initialCommand, ...commands.slice(existingIndex + 1)]\n : [...commands, initialCommand];\n\n return createPadroneBuilder({ ...existingCommand, commands: updatedCommands }) as any;\n },\n\n mount(nameOrNames: string | readonly string[], program: unknown, options?: { context?: (ctx: unknown) => unknown }) {\n const name = Array.isArray(nameOrNames) ? nameOrNames[0] : nameOrNames;\n const aliases = Array.isArray(nameOrNames) && nameOrNames.length > 1 ? (nameOrNames.slice(1) as string[]) : undefined;\n\n const programCommand = (program as any)[commandSymbol] as AnyPadroneCommand | undefined;\n if (!programCommand) throw new RoutingError('Cannot mount: not a valid Padrone program');\n\n const remounted = repathCommandTree(programCommand, name, existingCommand.path || '', existingCommand);\n remounted.aliases = aliases;\n\n if (options?.context) {\n const existing = remounted.contextTransform;\n remounted.contextTransform = existing ? (ctx: unknown) => existing(options.context!(ctx)) : options.context;\n }\n\n const existingSubcommand = existingCommand.commands?.find((c) => c.name === name) as AnyPadroneCommand | undefined;\n const mergedCommandObj = existingSubcommand ? mergeCommands(existingSubcommand, remounted) : remounted;\n\n const commands = existingCommand.commands || [];\n const existingIndex = commands.findIndex((c) => c.name === name);\n const updatedCommands =\n existingIndex >= 0\n ? [...commands.slice(0, existingIndex), mergedCommandObj, ...commands.slice(existingIndex + 1)]\n : [...commands, mergedCommandObj];\n\n return createPadroneBuilder({ ...existingCommand, commands: updatedCommands }) as any;\n },\n\n intercept(metaOrFn: InterceptorMeta | PadroneInterceptorFn<any, any, any>, factory?: InterceptorFactory<any, any, any>) {\n const registered: RegisteredInterceptor = toRegisteredInterceptor(metaOrFn, factory);\n return createPadroneBuilder({\n ...existingCommand,\n interceptors: [...(existingCommand.interceptors ?? []), registered],\n }) as any;\n },\n\n ...programMethods,\n\n get info() {\n return {\n name: existingCommand.name,\n title: existingCommand.title,\n description: existingCommand.description,\n version: existingCommand.version,\n examples: existingCommand.examples,\n deprecated: existingCommand.deprecated,\n commands: (existingCommand.commands ?? []).map((c) => c.name),\n };\n },\n\n '~types': {} as any,\n\n [commandSymbol]: existingCommand,\n } satisfies AnyPadroneProgram & { [commandSymbol]: AnyPadroneCommand } as any;\n\n // Fix forward reference: execCtx.builder needs to reference the builder after it's created\n execCtx.builder = builder;\n\n return builder as TBuilder & { [commandSymbol]: AnyPadroneCommand };\n}\n\n/**\n * Identity helper that contextually types a command builder callback while preserving its full return type.\n * Use this when defining commands in separate files — the parent program retains exact type information\n * about the subcommand's args, result, and nested commands.\n *\n * The builder's context includes `DefineCommandContext` by default (optional `logger`, `tracing`, `progress`).\n * Override globally via module augmentation on `DefineCommandContext`, or per-command via `.requires()`.\n *\n * @example Direct form (most common)\n * ```ts\n * export const myCommand = defineCommand((c) =>\n * c.arguments(z.object({ name: z.string() }))\n * .action((args) => console.log(args.name))\n * );\n * ```\n *\n * @example With required interceptor context\n * ```ts\n * export const adminCommand = defineCommand()\n * .requires<{ adminDb: AdminDB }>()\n * .define((c) => c.action((_args, ctx) => ctx.context.adminDb.query(...)));\n * ```\n */\nexport function defineCommand<TContext = unknown, TOut extends CommandTypesBase = CommandTypesBase>(\n fn: (builder: PadroneBuilder<string, string, string, PadroneSchema<void>, void, [], any, false, TContext, DefineCommandContext>) => TOut,\n): typeof fn;\nexport function defineCommand(): DefineCommandBuilder;\nexport function defineCommand(fn?: any): any {\n if (fn) return fn;\n const builder: DefineCommandBuilder = {\n requires: () => builder as any,\n define: (f: any) => f,\n };\n return builder;\n}\n","import type { ShellType } from '#src/util/shell-utils.ts';\nimport { resolveAllCommands } from '../core/commands.ts';\nimport type { AnyPadroneBuilder, CommandTypesBase, PadroneCommand } from '../types/index.ts';\nimport type { PadroneSchema } from '../types/schema.ts';\nimport type { WithCommand } from '../util/type-utils.ts';\nimport { getRootCommand } from '../util/utils.ts';\nimport { passthroughSchema } from './utils.ts';\n\n// ── Types ────────────────────────────────────────────────────────────────\n\ntype CompletionArgs = { shell?: string; setup?: boolean };\n\ntype CompletionCommand = PadroneCommand<'completion', '', PadroneSchema<CompletionArgs>, string, [], [], true>;\n\nexport type WithCompletion<T> = WithCommand<T, 'completion', CompletionCommand>;\n\n// ── Extension ────────────────────────────────────────────────────────────\n\n/**\n * Extension that adds the `completion` command for shell completion script generation.\n *\n * Usage:\n * ```ts\n * createPadrone('my-cli').extend(padroneCompletion())\n * ```\n */\nexport function padroneCompletion(): <T extends CommandTypesBase>(builder: T) => WithCompletion<T> {\n return ((builder: AnyPadroneBuilder) =>\n builder.command('completion', (c) =>\n c\n .configure({ description: 'Generate shell completion scripts', hidden: true })\n .arguments(passthroughSchema({ shell: 'string', setup: 'boolean' }), { positional: ['shell'] })\n .async()\n .action(async (args, ctx) => {\n const rootCommand = getRootCommand(ctx.command);\n resolveAllCommands(rootCommand);\n const { detectShell, generateCompletionOutput, setupCompletions } = await import('../feature/completion.ts');\n const shell = args.shell as ShellType;\n const setup = args.setup;\n if (setup) {\n const resolvedShell = shell ?? (await detectShell());\n if (!resolvedShell) throw new Error('Could not detect shell. Specify one: completion bash --setup');\n const setupResult = await setupCompletions(rootCommand.name, resolvedShell);\n return `${setupResult.updated ? 'Updated' : 'Added'} ${rootCommand.name} completions in ${setupResult.file}`;\n }\n return generateCompletionOutput(rootCommand, shell);\n }),\n )) as any;\n}\n","import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { applyValues } from '../core/args.ts';\nimport { ConfigError } from '../core/errors.ts';\nimport { defineInterceptor } from '../core/interceptors.ts';\nimport { thenMaybe } from '../core/results.ts';\nimport type { AnyPadroneBuilder, CommandTypesBase, InterceptorValidateContext } from '../types/index.ts';\nimport type { WithAsync } from '../util/type-utils.ts';\nimport { getRootCommand } from '../util/utils.ts';\n\n// ── Types ────────────────────────────────────────────────────────────────\n\nexport type PadroneConfigOptions = {\n /** Config file names to auto-detect (e.g. `['config.json', '.myapprc']`). First found is used. */\n files?: string | string[];\n /** Schema to validate and transform config file data into the args shape. */\n schema?: StandardSchemaV1;\n /** Disable this extension. */\n disabled?: boolean;\n /** Whether to add `--config` / `-c` flag support. Defaults to `true`. */\n flag?: boolean;\n /** Whether subcommands inherit this interceptor. Defaults to `true`. */\n inherit?: boolean;\n /**\n * Search for config files in the user's platform-specific config directory.\n * - `true` — use the program name as the subdirectory (e.g. program `'myapp'` → `~/.config/myapp/`).\n * - `string` — use a custom app name as the subdirectory.\n * - `false` — disable (default).\n *\n * Directories searched (after cwd):\n * - **Linux**: `$XDG_CONFIG_HOME/<app>` or `~/.config/<app>`\n * - **macOS**: `~/Library/Application Support/<app>` (or `$XDG_CONFIG_HOME/<app>` when set)\n * - **Windows**: `%APPDATA%\\<app>`\n *\n * Config files found in cwd always take precedence over XDG paths.\n */\n xdg?: string | boolean;\n /**\n * Custom config loader. When provided, replaces the built-in file system loader.\n * Useful for testing or non-CLI environments.\n */\n loadConfig?: (\n files: string | string[],\n xdgAppName?: string,\n ) => Record<string, unknown> | undefined | Promise<Record<string, unknown> | undefined>;\n};\n\n// ── File system config loader ───────────────────────────────────────────\n\n// Lazily resolved Node.js modules — cached after first import to keep loadConfig sync after initialization.\nlet _fs: typeof import('node:fs') | undefined;\nlet _path: typeof import('node:path') | undefined;\n\nasync function initNodeModules(): Promise<void> {\n if (_fs && _path) return;\n _fs = await import('node:fs');\n _path = await import('node:path');\n}\n\n// Eagerly start caching node modules so loadConfig is sync by the time it's called.\ntry {\n if (typeof process !== 'undefined') initNodeModules();\n} catch {\n // Non-CLI environments (browser, edge) — ignore\n}\n\nfunction getUserConfigDir(path: typeof import('node:path'), appName: string): string | undefined {\n const platform = process.platform;\n\n // Respect XDG_CONFIG_HOME on all platforms when explicitly set\n const xdgHome = process.env.XDG_CONFIG_HOME;\n if (xdgHome) return path.join(xdgHome, appName);\n\n const home = process.env.HOME || process.env.USERPROFILE;\n if (!home) return undefined;\n\n if (platform === 'win32') {\n const appData = process.env.APPDATA;\n return appData ? path.join(appData, appName) : path.join(home, 'AppData', 'Roaming', appName);\n }\n if (platform === 'darwin') return path.join(home, 'Library', 'Application Support', appName);\n\n // Linux and other Unix — default XDG path\n return path.join(home, '.config', appName);\n}\n\nfunction resolveConfigPath(fs: any, path: any, cwd: string, files: string | string[], xdgAppName?: string): string | undefined {\n if (typeof files === 'string') {\n const abs = path.isAbsolute(files) ? files : path.resolve(cwd, files);\n if (!fs.existsSync(abs)) {\n console.error(`Config file not found: ${abs}`);\n return undefined;\n }\n return abs;\n }\n\n // Search in cwd first\n for (const candidate of files) {\n const abs = path.isAbsolute(candidate) ? candidate : path.resolve(cwd, candidate);\n if (fs.existsSync(abs)) return abs;\n }\n\n // Then search in the user config directory (XDG / platform-specific)\n if (xdgAppName) {\n const configDir = getUserConfigDir(path, xdgAppName);\n if (configDir) {\n for (const candidate of files) {\n const abs = path.join(configDir, candidate);\n if (fs.existsSync(abs)) return abs;\n }\n }\n }\n\n return undefined;\n}\n\nfunction loadConfigSync(\n fs: typeof import('node:fs'),\n path: typeof import('node:path'),\n files: string | string[],\n xdgAppName?: string,\n): Record<string, unknown> | undefined | Promise<Record<string, unknown> | undefined> {\n const cwd = process.cwd();\n const absolutePath = resolveConfigPath(fs, path, cwd, files, xdgAppName);\n if (!absolutePath) return undefined;\n\n const getContent = () => fs.readFileSync(absolutePath, 'utf-8');\n const ext = path.extname(absolutePath).toLowerCase();\n\n if (ext === '.yaml' || ext === '.yml') return Bun.YAML.parse(getContent()) as any;\n if (ext === '.toml') return Bun.TOML.parse(getContent()) as any;\n if (ext === '.jsonc') return Bun.JSONC.parse(getContent()) as any;\n if (ext === '.json') {\n if (Bun.JSONC) return Bun.JSONC.parse(getContent()) as any;\n try {\n return JSON.parse(getContent());\n } catch {\n return Bun.JSONC.parse(getContent()) as any;\n }\n }\n if (ext === '.js' || ext === '.cjs' || ext === '.mjs' || ext === '.ts' || ext === '.cts' || ext === '.mts') {\n return import(/* @vite-ignore */ absolutePath).then((mod) => mod.default ?? mod);\n }\n\n // Unknown extension — try JSON\n try {\n return JSON.parse(getContent());\n } catch {\n console.error(`Unable to parse config file: ${absolutePath}`);\n return undefined;\n }\n}\n\n/**\n * Built-in config file loader. Directly accesses the file system.\n * Returns `undefined` in non-CLI environments where `node:fs` is unavailable.\n */\nfunction loadConfig(\n files: string | string[],\n xdgAppName?: string,\n): Record<string, unknown> | undefined | Promise<Record<string, unknown> | undefined> {\n if (typeof process === 'undefined') return undefined;\n\n try {\n if (_fs && _path) return loadConfigSync(_fs, _path, files, xdgAppName);\n return initNodeModules().then(() => loadConfigSync(_fs!, _path!, files, xdgAppName));\n } catch {\n return undefined;\n }\n}\n\n// ── Extension ────────────────────────────────────────────────────────────\n\n/**\n * Extension that handles config file loading, validation, and merging into command arguments.\n *\n * Features:\n * - `--config` / `-c` flag for explicit config file path (can be disabled via `flag: false`)\n * - Auto-detection of config files from a list of candidate names\n * - Optional schema validation and transformation of config data\n * - Directly accesses the file system (gracefully no-ops in non-CLI environments)\n *\n * Config values have the lowest precedence (CLI > stdin > env > config).\n *\n * Not included in the default built-in extensions — must be explicitly added:\n * ```ts\n * createPadrone('my-cli')\n * .extend(padroneConfig({\n * files: ['config.json', '.myapprc'],\n * schema: z.object({ port: z.number(), host: z.string() }),\n * }))\n * ```\n */\nexport function padroneConfig(options?: PadroneConfigOptions): <T extends CommandTypesBase>(builder: T) => WithAsync<T> {\n if (options?.disabled) {\n const disabled = defineInterceptor({ id: 'padrone:config', name: 'padrone:config', order: -999, disabled: true }, () => ({}));\n return ((builder: AnyPadroneBuilder) => builder.intercept(disabled)) as any;\n }\n\n const configFiles = options?.files ? (Array.isArray(options.files) ? options.files : [options.files]) : undefined;\n const configSchema = options?.schema;\n const flagEnabled = options?.flag !== false;\n const inherit = options?.inherit;\n const xdgOption = options?.xdg;\n const configLoader = options?.loadConfig ?? loadConfig;\n\n const interceptor = defineInterceptor(\n { id: 'padrone:config', name: 'padrone:config', order: -999, ...(inherit === false && { inherit: false }) },\n () => ({\n validate(ctx: InterceptorValidateContext, next) {\n // Extract --config / -c from rawArgs\n let explicitConfigPath: string | undefined;\n if (flagEnabled) {\n explicitConfigPath = (ctx.rawArgs.config ?? ctx.rawArgs.c) as string | undefined;\n if (typeof explicitConfigPath === 'string') {\n delete ctx.rawArgs.config;\n delete ctx.rawArgs.c;\n }\n }\n\n // Skip entirely when there's nothing to load\n if (!explicitConfigPath && !configFiles) return next();\n\n // Resolve XDG app name: true → derive from root command name, string → use as-is\n let xdgAppName: string | undefined;\n if (typeof xdgOption === 'string') xdgAppName = xdgOption;\n else if (xdgOption === true) xdgAppName = getRootCommand(ctx.command).name;\n\n // Load config data: explicit --config flag takes priority, then auto-detect\n const configDataOrPromise = configLoader(explicitConfigPath ?? configFiles ?? [], xdgAppName);\n\n const applyConfig = (configData: Record<string, unknown> | undefined) => {\n if (!configData) return next();\n\n // Validate against schema if provided\n if (configSchema) {\n const validated = configSchema['~standard'].validate(configData);\n return thenMaybe(validated, (result) => {\n if (result.issues) {\n const issueMessages = result.issues\n .map((i: StandardSchemaV1.Issue) => ` - ${i.path?.join('.') || 'root'}: ${i.message}`)\n .join('\\n');\n throw new ConfigError(`Invalid config file:\\n${issueMessages}`, {\n command: ctx.command.path || ctx.command.name,\n });\n }\n const validatedData = result.value as Record<string, unknown>;\n const mergedRawArgs = applyValues(ctx.rawArgs, validatedData);\n return next({ rawArgs: mergedRawArgs });\n });\n }\n\n // No schema — pass through as-is\n const mergedRawArgs = applyValues(ctx.rawArgs, configData);\n return next({ rawArgs: mergedRawArgs });\n };\n\n return thenMaybe(configDataOrPromise, applyConfig);\n },\n }),\n );\n\n return ((builder: AnyPadroneBuilder) => builder.intercept(interceptor)) as any;\n}\n","// ── File resolution ─────────────────────────────────────────────────────\n\n/** Returns ordered list of `.env` file names to load (no fs access). */\nexport function resolveEnvFiles(modes: string[] = [], local = true, base = true): string[] {\n const files: string[] = [];\n if (base) {\n files.push('.env');\n if (local) files.push('.env.local');\n }\n for (const mode of modes) {\n files.push(`.env.${mode}`);\n if (local) files.push(`.env.${mode}.local`);\n }\n return files;\n}\n\n// ── Parser ──────────────────────────────────────────────────────────────\n\n/** Parse a `.env` file string into key-value pairs. */\nexport function parseEnvFile(content: string): Record<string, string> {\n const result: Record<string, string> = {};\n const lines = content.split('\\n');\n let i = 0;\n\n while (i < lines.length) {\n const line = lines[i]!.trim();\n i++;\n\n // Skip empty lines and comments\n if (!line || line.startsWith('#')) continue;\n\n // Strip optional `export ` prefix\n const stripped = line.startsWith('export ') ? line.slice(7) : line;\n\n const eqIndex = stripped.indexOf('=');\n if (eqIndex === -1) continue;\n\n const key = stripped.slice(0, eqIndex).trim();\n let raw = stripped.slice(eqIndex + 1);\n\n // Detect quoted values\n const trimmedRaw = raw.trimStart();\n const quote = trimmedRaw[0];\n\n if (quote === '\"' || quote === \"'\" || quote === '`') {\n let value = trimmedRaw.slice(1);\n\n // Check for closing quote on the same line\n const closeIndex = findClosingQuote(value, quote);\n if (closeIndex !== -1) {\n value = value.slice(0, closeIndex);\n } else {\n // Multiline: accumulate until closing quote\n while (i < lines.length) {\n const nextLine = lines[i]!;\n i++;\n const ci = findClosingQuote(nextLine, quote);\n if (ci !== -1) {\n value += `\\n${nextLine.slice(0, ci)}`;\n break;\n }\n value += `\\n${nextLine}`;\n }\n }\n\n if (quote === '\"') value = unescapeDoubleQuoted(value);\n result[key] = value;\n } else {\n // Unquoted: strip inline comments, trim\n const commentIndex = raw.indexOf(' #');\n if (commentIndex !== -1) raw = raw.slice(0, commentIndex);\n result[key] = raw.trim();\n }\n }\n\n return result;\n}\n\nfunction findClosingQuote(s: string, quote: string): number {\n let i = 0;\n while (i < s.length) {\n if (s[i] === '\\\\' && quote === '\"') {\n i += 2; // skip escaped char\n continue;\n }\n if (s[i] === quote) return i;\n i++;\n }\n return -1;\n}\n\nfunction unescapeDoubleQuoted(s: string): string {\n return s.replace(/\\\\n/g, '\\n').replace(/\\\\r/g, '\\r').replace(/\\\\t/g, '\\t').replace(/\\\\\"/g, '\"').replace(/\\\\\\\\/g, '\\\\');\n}\n\n// ── Variable expansion ──────────────────────────────────────────────────\n\n/**\n * Expand `$VAR`, `${VAR}`, `${VAR:-default}`, `${VAR-default}` in a string.\n * Escaped `\\$` produces a literal `$`. Undefined variables resolve to `\"\"`.\n */\nexport function expandVariables(value: string, env: Record<string, string | undefined>): string {\n let result = '';\n let i = 0;\n\n while (i < value.length) {\n if (value[i] === '\\\\' && value[i + 1] === '$') {\n result += '$';\n i += 2;\n continue;\n }\n\n if (value[i] === '$') {\n i++;\n if (i >= value.length) {\n result += '$';\n break;\n }\n\n if (value[i] === '{') {\n // ${VAR}, ${VAR:-default}, ${VAR-default}\n i++;\n const closeIdx = value.indexOf('}', i);\n if (closeIdx === -1) {\n result += `\\${${value.slice(i)}`;\n break;\n }\n\n const expr = value.slice(i, closeIdx);\n i = closeIdx + 1;\n\n const colonDashIdx = expr.indexOf(':-');\n const dashIdx = colonDashIdx === -1 ? expr.indexOf('-') : -1;\n\n if (colonDashIdx !== -1) {\n // ${VAR:-default} — use default if unset or empty\n const varName = expr.slice(0, colonDashIdx);\n const fallback = expr.slice(colonDashIdx + 2);\n const val = env[varName];\n result += val ? val : expandVariables(fallback, env);\n } else if (dashIdx !== -1) {\n // ${VAR-default} — use default only if unset\n const varName = expr.slice(0, dashIdx);\n const fallback = expr.slice(dashIdx + 1);\n const val = env[varName];\n result += val !== undefined ? val : expandVariables(fallback, env);\n } else {\n result += env[expr] ?? '';\n }\n } else {\n // $VAR — collect word chars\n let varName = '';\n while (i < value.length && /[\\w]/.test(value[i]!)) {\n varName += value[i];\n i++;\n }\n if (varName) {\n result += env[varName] ?? '';\n } else {\n result += '$';\n }\n }\n continue;\n }\n\n result += value[i];\n i++;\n }\n\n return result;\n}\n\n// ── File loading ────────────────────────────────────────────────────────\n\nexport type LoadEnvFilesOptions = {\n dir?: string;\n modes?: string[];\n local?: boolean;\n override?: boolean;\n base?: boolean;\n};\n\n/**\n * Load and merge `.env` files, returning the combined key-value map.\n * Variable expansion uses the merged file values + process env as lookup.\n *\n * Returns synchronously when `node:fs`/`node:path` are already cached (typical),\n * or a Promise on the very first call.\n */\nexport function loadEnvFiles(\n options: LoadEnvFilesOptions,\n processEnv: Record<string, string | undefined>,\n): Record<string, string> | Promise<Record<string, string>> {\n if (typeof process === 'undefined') return {};\n\n try {\n if (_fs && _path) return loadEnvFilesSync(_fs, _path, options, processEnv);\n return initNodeModules()\n .then(() => loadEnvFilesSync(_fs!, _path!, options, processEnv))\n .catch(() => ({}) as Record<string, string>);\n } catch {\n return {};\n }\n}\n\n// ── Internals ───────────────────────────────────────────────────────────\n\nlet _fs: typeof import('node:fs') | undefined;\nlet _path: typeof import('node:path') | undefined;\n\nasync function initNodeModules(): Promise<void> {\n if (_fs && _path) return;\n _fs = await import('node:fs');\n _path = await import('node:path');\n}\n\nif (typeof process !== 'undefined') initNodeModules();\n\nfunction loadEnvFilesSync(\n fs: typeof import('node:fs'),\n path: typeof import('node:path'),\n options: LoadEnvFilesOptions,\n processEnv: Record<string, string | undefined>,\n): Record<string, string> {\n const dir = options.dir ?? process.cwd();\n const fileNames = resolveEnvFiles(options.modes, options.local ?? true, options.base ?? true);\n const merged: Record<string, string> = {};\n\n for (const name of fileNames) {\n const filePath = path.resolve(dir, name);\n if (!fs.existsSync(filePath)) continue;\n const content = fs.readFileSync(filePath, 'utf-8');\n const parsed = parseEnvFile(content);\n Object.assign(merged, parsed);\n }\n\n // Expand variables: file values + processEnv as lookup (processEnv wins in lookup unless override)\n const lookup = options.override ? { ...processEnv, ...merged } : { ...merged, ...processEnv };\n for (const key of Object.keys(merged)) {\n merged[key] = expandVariables(merged[key]!, lookup);\n }\n\n return merged;\n}\n","import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { applyValues } from '../core/args.ts';\nimport { defineInterceptor } from '../core/interceptors.ts';\nimport { thenMaybe } from '../core/results.ts';\nimport type { AnyPadroneBuilder, CommandTypesBase, InterceptorValidateContext } from '../types/index.ts';\nimport type { LoadEnvFilesOptions } from '../util/dotenv.ts';\nimport { loadEnvFiles } from '../util/dotenv.ts';\nimport type { WithAsync } from '../util/type-utils.ts';\n\n// ── Types ────────────────────────────────────────────────────────────────\n\nexport type PadroneEnvOptions = {\n /** Env modes to load (e.g. `['production']`). Loads `.env.{mode}` files. */\n modes?: string[];\n /** Whether to load `.env.local` and `.env.{mode}.local` files. @default true */\n local?: boolean;\n /** Directory to search for `.env` files. @default process.cwd() */\n dir?: string;\n /** When `true`, file values override `process.env` values. @default false */\n override?: boolean;\n /** When `false`, the base `.env` (and `.env.local`) files are not loaded. @default true */\n base?: boolean;\n};\n\n// ── Helpers ──────────────────────────────────────────────────────────────\n\nfunction isSchema(value: unknown): value is StandardSchemaV1 {\n return value != null && typeof value === 'object' && '~standard' in value;\n}\n\n// ── Extension ────────────────────────────────────────────────────────────\n\n/**\n * Extension that reads environment variables, validates them against a schema,\n * and merges the transformed values into command arguments.\n *\n * Supports loading `.env` files with mode-based overrides and variable expansion.\n *\n * ```ts\n * // Schema only (reads process.env)\n * .extend(padroneEnv(\n * z.object({ PORT: z.string() }).transform(e => ({ port: Number(e.PORT) }))\n * ))\n *\n * // Schema + .env file loading\n * .extend(padroneEnv(\n * z.object({ PORT: z.string() }).transform(e => ({ port: Number(e.PORT) })),\n * { modes: ['production'] }\n * ))\n *\n * // .env file loading only (no schema validation)\n * .extend(padroneEnv({ modes: ['production'] }))\n * ```\n *\n * Env values have lower precedence than CLI args and stdin, but higher than config files.\n */\nexport function padroneEnv(schema: StandardSchemaV1): <T extends CommandTypesBase>(builder: T) => WithAsync<T>;\nexport function padroneEnv(schema: StandardSchemaV1, options: PadroneEnvOptions): <T extends CommandTypesBase>(builder: T) => WithAsync<T>;\nexport function padroneEnv(options: PadroneEnvOptions): <T extends CommandTypesBase>(builder: T) => WithAsync<T>;\nexport function padroneEnv(\n schemaOrOptions: StandardSchemaV1 | PadroneEnvOptions,\n maybeOptions?: PadroneEnvOptions,\n): <T extends CommandTypesBase>(builder: T) => WithAsync<T> {\n const schema = isSchema(schemaOrOptions) ? schemaOrOptions : undefined;\n const options = isSchema(schemaOrOptions) ? maybeOptions : schemaOrOptions;\n const hasFiles = options?.modes !== undefined;\n const fileOptions: LoadEnvFilesOptions | undefined = hasFiles ? options : undefined;\n const override = options?.override ?? false;\n\n const interceptor = defineInterceptor({ id: 'padrone:env', name: 'padrone:env', order: -1000 }, () => ({\n validate(ctx: InterceptorValidateContext, next) {\n const processEnv = ctx.runtime.env();\n\n const applyEnv = (envFromFiles: Record<string, string>) => {\n const rawEnv = override ? { ...processEnv, ...envFromFiles } : { ...envFromFiles, ...processEnv };\n\n if (schema) {\n const envValidated = schema['~standard'].validate(rawEnv);\n return thenMaybe(envValidated, (result) => {\n if (result.issues || !result.value) return next();\n return next({ rawArgs: applyValues(ctx.rawArgs, result.value as Record<string, unknown>) });\n });\n }\n\n // No schema — merge file env values directly into rawArgs\n if (Object.keys(envFromFiles).length > 0) {\n return next({ rawArgs: applyValues(ctx.rawArgs, envFromFiles) });\n }\n return next();\n };\n\n if (hasFiles) {\n const loaded = loadEnvFiles(fileOptions!, processEnv);\n return thenMaybe(loaded, applyEnv);\n }\n\n return applyEnv({});\n },\n }));\n\n return ((builder: AnyPadroneBuilder) => builder.intercept(interceptor)) as any;\n}\n","import { defineInterceptor } from '../core/interceptors.ts';\nimport type { AnyPadroneBuilder, CommandTypesBase } from '../types/index.ts';\nimport type { InterceptorExecuteResult } from '../types/interceptor.ts';\n\n// ── React element detection ─────────────────────────────────────────────\n\nconst reactElement = Symbol.for('react.element');\nconst reactTransitional = Symbol.for('react.transitional.element');\n\n/** Checks whether a value is a React element (JSX) by inspecting its `$$typeof` symbol. */\nexport function isReactElement(value: unknown): boolean {\n if (value === null || typeof value !== 'object') return false;\n const tag = (value as Record<string | symbol, unknown>).$$typeof;\n return tag === reactElement || tag === reactTransitional;\n}\n\n// ── Types ───────────────────────────────────────────────────────────────\n\nexport type InkOptions = {\n /** Whether to wait for the Ink app to unmount before resolving. Defaults to `true`. */\n waitUntilExit?: boolean;\n /** Options forwarded to Ink's `render()`. */\n render?: import('ink').RenderOptions;\n};\n\n// ── Interceptor ─────────────────────────────────────────────────────────\n\nconst inkMeta = { id: 'padrone:ink', name: 'padrone:ink', order: -1050 } as const;\n\nfunction createInkInterceptor(rawOptions?: InkOptions) {\n return defineInterceptor(inkMeta)\n .requires<{ inkConfig?: InkOptions }>()\n .factory(() => ({\n execute(ctx, next) {\n const ctxCfg = (ctx.context as Record<string, unknown> | undefined)?.inkConfig as InkOptions | undefined;\n const options: InkOptions = { ...ctxCfg, ...rawOptions };\n const { waitUntilExit = true } = options;\n\n const handleResult = async (e: InterceptorExecuteResult): Promise<InterceptorExecuteResult> => {\n let value = e.result;\n if (value instanceof Promise) value = await value;\n if (!isReactElement(value)) return e;\n\n const { render } = await import('ink');\n const instance = render(value as import('react').ReactElement, options.render);\n\n // Unmount on abort so Ink cleans up stdin/stdout\n const onAbort = () => instance.unmount();\n ctx.signal.addEventListener('abort', onAbort, { once: true });\n\n if (waitUntilExit) {\n try {\n await instance.waitUntilExit();\n } finally {\n ctx.signal.removeEventListener('abort', onAbort);\n }\n }\n\n // Return undefined so auto-output skips this result\n return { result: undefined };\n };\n\n const executedOrPromise = next();\n if (executedOrPromise instanceof Promise) return executedOrPromise.then(handleResult);\n return handleResult(executedOrPromise);\n },\n }));\n}\n\n// ── Extension ───────────────────────────────────────────────────────────\n\n/**\n * Extension that renders React (Ink) components returned from command actions.\n *\n * When a command's action returns a React element (JSX), this extension\n * renders it using Ink instead of passing it to the normal output path.\n *\n * Requires `ink` and `react` as peer dependencies.\n *\n * ```ts\n * import { createPadrone, padroneInk } from 'padrone';\n *\n * const program = createPadrone('my-tui')\n * .extend(padroneInk())\n * .command('dashboard', (c) =>\n * c.action(() => <Dashboard />)\n * );\n * ```\n */\nexport function padroneInk(options?: InkOptions): <T extends CommandTypesBase>(builder: T) => T {\n const interceptor = createInkInterceptor(options);\n return ((builder: AnyPadroneBuilder) => builder.intercept(interceptor)) as any;\n}\n","import { defineInterceptor } from '#src/core/interceptors.ts';\nimport { thenMaybe } from '#src/core/results.ts';\nimport type { ResolvedPadroneRuntime } from '#src/core/runtime.ts';\nimport type { AnyPadroneBuilder, CommandTypesBase } from '#src/types/index.ts';\nimport type { WithInterceptor } from '#src/util/type-utils.ts';\nimport type { PadroneTracer } from './tracing.ts';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Log level values ordered by severity. */\nexport type PadroneLogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'silent';\n\n/** Logger instance injected into the command context. */\nexport type PadroneLogger = {\n trace: (...args: unknown[]) => void;\n debug: (...args: unknown[]) => void;\n info: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void;\n error: (...args: unknown[]) => void;\n /** The current effective log level. */\n level: PadroneLogLevel;\n /** Create a child logger with a prefix label. */\n child: (label: string) => PadroneLogger;\n};\n\n/** Configuration for the logger extension. */\nexport type PadroneLoggerConfig = {\n /** Minimum log level to output. Defaults to `'info'`. */\n level?: PadroneLogLevel;\n /** Prefix prepended to every log message. */\n prefix?: string;\n /** Include timestamps in log output. Defaults to `false`. */\n timestamps?: boolean;\n};\n\n/** Builder/program type after applying `padroneLogger()`. Adds `{ logger: PadroneLogger }` to the command context. */\nexport type WithLogger<T> = WithInterceptor<T, { logger: PadroneLogger }>;\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nconst LEVEL_ORDER: Record<PadroneLogLevel, number> = { trace: 0, debug: 1, info: 2, warn: 3, error: 4, silent: 5 };\nconst LEVEL_LABELS: Record<Exclude<PadroneLogLevel, 'silent'>, string> = {\n trace: 'TRACE',\n debug: 'DEBUG',\n info: 'INFO',\n warn: 'WARN',\n error: 'ERROR',\n};\nconst VALID_LEVELS = new Set<string>(Object.keys(LEVEL_ORDER));\n\n/** Format specifier pattern: matches %s, %d, %i, %f, %o, %O, %j, %% */\nconst FORMAT_PATTERN = /%%|%[sdifjoO]/g;\n\n/**\n * Applies printf-style format specifiers to args, following the WHATWG Console Standard\n * and Node.js `util.format` conventions. Remaining args are appended space-separated.\n */\nfunction formatArgs(args: unknown[]): string {\n if (args.length === 0) return '';\n if (typeof args[0] !== 'string' || !FORMAT_PATTERN.test(args[0])) {\n return args.map((a) => (typeof a === 'string' ? a : JSON.stringify(a))).join(' ');\n }\n\n const template = args[0];\n let argIndex = 1;\n const result = template.replace(FORMAT_PATTERN, (token) => {\n if (token === '%%') return '%';\n if (argIndex >= args.length) return token;\n const val = args[argIndex++];\n switch (token) {\n case '%s':\n return String(val);\n case '%d':\n case '%i':\n return String(Math.trunc(Number(val)));\n case '%f':\n return String(Number(val));\n case '%j':\n try {\n return JSON.stringify(val);\n } catch {\n return '[Circular]';\n }\n case '%o':\n case '%O':\n return typeof val === 'string' ? val : JSON.stringify(val);\n default:\n return token;\n }\n });\n\n // Append remaining args that weren't consumed by specifiers\n const remaining = args.slice(argIndex);\n if (remaining.length === 0) return result;\n const tail = remaining.map((a) => (typeof a === 'string' ? a : JSON.stringify(a))).join(' ');\n return `${result} ${tail}`;\n}\n\nfunction resolveCliLevel(rawArgs: Record<string, unknown>): PadroneLogLevel | undefined {\n // --trace → trace level\n if ('trace' in rawArgs) {\n const t = rawArgs.trace;\n delete rawArgs.trace;\n if (t !== false) return 'trace';\n }\n // --verbose / --debug → debug level\n if ('verbose' in rawArgs) {\n const v = rawArgs.verbose;\n delete rawArgs.verbose;\n if (v !== false) return 'debug';\n }\n if ('debug' in rawArgs) {\n const d = rawArgs.debug;\n delete rawArgs.debug;\n if (d !== false) return 'debug';\n }\n // --silent / --quiet → suppress all output\n if ('silent' in rawArgs) {\n const s = rawArgs.silent;\n delete rawArgs.silent;\n if (s !== false) return 'silent';\n }\n if ('quiet' in rawArgs) {\n const q = rawArgs.quiet;\n delete rawArgs.quiet;\n if (q !== false) return 'silent';\n }\n // --log-level=<level> → explicit level (parser keeps kebab-case)\n if ('log-level' in rawArgs) {\n const val = rawArgs['log-level'];\n delete rawArgs['log-level'];\n if (typeof val === 'string' && VALID_LEVELS.has(val)) return val as PadroneLogLevel;\n }\n return undefined;\n}\n\nfunction createLogger(\n runtime: ResolvedPadroneRuntime,\n level: PadroneLogLevel,\n config: ResolvedLoggerConfig,\n tracing?: PadroneTracer,\n): PadroneLogger {\n const threshold = LEVEL_ORDER[level];\n\n function format(lvl: Exclude<PadroneLogLevel, 'silent'>, prefix: string, args: unknown[]): string {\n const parts: string[] = [];\n if (config.timestamps) parts.push(new Date().toISOString());\n parts.push(`[${LEVEL_LABELS[lvl]}]`);\n if (prefix) parts.push(prefix);\n parts.push(formatArgs(args));\n return parts.join(' ');\n }\n\n function makeLogger(prefix: string): PadroneLogger {\n const emit = (lvl: Exclude<PadroneLogLevel, 'silent'>, args: unknown[]) => {\n if (LEVEL_ORDER[lvl] < threshold) return;\n const message = format(lvl, prefix, args);\n tracing?.rootSpan.addEvent('log', {\n 'log.level': lvl,\n 'log.message': args.map((a) => (typeof a === 'string' ? a : JSON.stringify(a))).join(' '),\n });\n if (lvl === 'error' || lvl === 'warn') runtime.error(message);\n else runtime.output(message);\n };\n\n return {\n trace: (...args) => emit('trace', args),\n debug: (...args) => emit('debug', args),\n info: (...args) => emit('info', args),\n warn: (...args) => emit('warn', args),\n error: (...args) => emit('error', args),\n level,\n child: (label) => makeLogger(prefix ? `${prefix} [${label}]` : `[${label}]`),\n };\n }\n\n return makeLogger(config.prefix);\n}\n\n// ---------------------------------------------------------------------------\n// Interceptor\n// ---------------------------------------------------------------------------\n\ntype ResolvedLoggerConfig = { level: PadroneLogLevel; prefix: string; timestamps: boolean };\n\nfunction loggerInterceptor(rawConfig?: PadroneLoggerConfig) {\n return defineInterceptor({ id: 'padrone:logger', name: 'padrone:logger' })\n .requires<{ tracing?: PadroneTracer; loggerConfig?: PadroneLoggerConfig }>()\n .factory(() => {\n let cliLevel: PadroneLogLevel | undefined;\n\n return {\n parse(_ctx, next) {\n return thenMaybe(next(), (res) => {\n cliLevel = resolveCliLevel(res.rawArgs);\n return res;\n });\n },\n\n execute(ctx, next) {\n const ctxCfg = (ctx.context as Record<string, unknown> | undefined)?.loggerConfig as PadroneLoggerConfig | undefined;\n const resolved: ResolvedLoggerConfig = {\n level: cliLevel ?? rawConfig?.level ?? ctxCfg?.level ?? 'info',\n prefix: rawConfig?.prefix ?? '',\n timestamps: rawConfig?.timestamps ?? ctxCfg?.timestamps ?? false,\n };\n const logger = createLogger(ctx.runtime, resolved.level, resolved, ctx.context?.tracing);\n return next({ context: { logger } });\n },\n };\n });\n}\n\n// ---------------------------------------------------------------------------\n// Extension\n// ---------------------------------------------------------------------------\n\n/**\n * Extension that injects a structured logger into the command context.\n *\n * The logger respects a configurable log level threshold, supports prefixed\n * child loggers, and routes output through the runtime's `output`/`error`\n * functions so it works in any environment (terminal, test, web).\n *\n * Supports CLI flags for runtime level overrides:\n * - `--trace` → sets level to `trace`\n * - `--verbose` or `--debug` → sets level to `debug`\n * - `--silent` or `--quiet` → sets level to `silent`\n * - `--log-level=<level>` → sets an explicit level (`trace`, `debug`, `info`, `warn`, `error`, `silent`)\n *\n * CLI flags take precedence over the programmatic config.\n *\n * Provides `{ logger: PadroneLogger }` on the command context.\n * Access it in action handlers as `ctx.context.logger`.\n *\n * Usage:\n * ```ts\n * createPadrone('my-cli')\n * .extend(padroneLogger({ level: 'info' }))\n * .command('sync', (c) =>\n * c.action((_args, ctx) => {\n * ctx.context.logger.info('starting sync');\n * const db = ctx.context.logger.child('db');\n * db.debug('connecting...');\n * })\n * )\n * ```\n *\n * Then run:\n * ```sh\n * my-cli sync --verbose # debug level\n * my-cli sync --quiet # silent\n * my-cli sync --log-level=warn\n * ```\n */\nexport function padroneLogger<T extends CommandTypesBase>(config?: PadroneLoggerConfig): (builder: T) => WithLogger<T> {\n return ((builder: AnyPadroneBuilder) => builder.intercept(loggerInterceptor(config))) as any;\n}\n","import { resolveAllCommands } from '../core/commands.ts';\nimport type { AnyPadroneBuilder, CommandTypesBase, PadroneCommand } from '../types/index.ts';\nimport type { PadroneSchema } from '../types/schema.ts';\nimport type { WithCommand } from '../util/type-utils.ts';\nimport { getRootCommand } from '../util/utils.ts';\nimport { passthroughSchema } from './utils.ts';\n\n// ── Types ────────────────────────────────────────────────────────────────\n\ntype ManArgs = { setup?: boolean; remove?: boolean };\n\ntype ManCommand = PadroneCommand<'man', '', PadroneSchema<ManArgs>, string, [], [], true>;\n\nexport type WithMan<T> = WithCommand<T, 'man', ManCommand>;\n\n// ── Extension ────────────────────────────────────────────────────────────\n\n/**\n * Extension that adds the `man` command for man page generation.\n *\n * Usage:\n * ```ts\n * createPadrone('my-cli').extend(padroneMan())\n * ```\n */\nexport function padroneMan(): <T extends CommandTypesBase>(builder: T) => WithMan<T> {\n return ((builder: AnyPadroneBuilder) =>\n builder.command('man', (c) =>\n c\n .configure({ description: 'Generate man pages', hidden: true })\n .arguments(passthroughSchema({ setup: 'boolean', remove: 'boolean' }))\n .async()\n .action(async (args, ctx) => {\n const rootCommand = getRootCommand(ctx.command);\n resolveAllCommands(rootCommand);\n const { setupManPages, removeManPages, generateDocs } = await import('../docs/index.ts');\n if (args.setup) {\n const setupResult = await setupManPages(rootCommand);\n return `${setupResult.updated ? 'Updated' : 'Installed'} ${setupResult.written.length} man page(s) in ${setupResult.dir}`;\n }\n if (args.remove) {\n const removeResult = await removeManPages(rootCommand);\n return removeResult.removed.length > 0\n ? `Removed ${removeResult.removed.length} man page(s) from ${removeResult.dir}`\n : 'No man pages found to remove.';\n }\n const docsResult = generateDocs(rootCommand, { format: 'man' });\n return docsResult.pages[0]?.content ?? '';\n }),\n )) as any;\n}\n","import { resolveAllCommands } from '../core/commands.ts';\nimport type { PadroneMcpPreferences } from '../feature/mcp.ts';\nimport type { AnyPadroneBuilder, CommandTypesBase, PadroneCommand } from '../types/index.ts';\nimport type { PadroneSchema } from '../types/schema.ts';\nimport type { WithCommand } from '../util/type-utils.ts';\nimport { getRootCommand } from '../util/utils.ts';\nimport { passthroughSchema } from './utils.ts';\n\n// ── Types ────────────────────────────────────────────────────────────────\n\ntype McpArgs = { transport?: string; port?: string; host?: string; basePath?: string };\n\ntype McpCommand = PadroneCommand<'mcp', '', PadroneSchema<McpArgs>, void, [], [], true>;\n\nexport type WithMcp<T> = WithCommand<T, 'mcp', McpCommand>;\n\n// ── Extension ────────────────────────────────────────────────────────────\n\n/**\n * Extension that adds the `mcp` command for starting a Model Context Protocol server.\n *\n * Usage:\n * ```ts\n * createPadrone('my-cli').extend(padroneMcp())\n * ```\n */\nexport function padroneMcp(defaults?: PadroneMcpPreferences): <T extends CommandTypesBase>(builder: T) => WithMcp<T> {\n return ((builder: AnyPadroneBuilder) =>\n builder.command('mcp', (c) =>\n c\n .configure({ description: 'Start a Model Context Protocol server', hidden: true })\n .arguments(passthroughSchema({ transport: 'string', port: 'string', host: 'string', 'base-path': 'string' }), {\n positional: ['transport'],\n })\n .async()\n .action(async (args, ctx) => {\n const rootCommand = getRootCommand(ctx.command);\n resolveAllCommands(rootCommand);\n const { startMcpServer } = await import('../feature/mcp.ts');\n const transport = args.transport === 'stdio' || args.transport === 'http' ? args.transport : undefined;\n const port = args.port ? parseInt(args.port, 10) : undefined;\n const prefs: PadroneMcpPreferences = {\n ...defaults,\n transport: transport ?? defaults?.transport,\n port: port && !Number.isNaN(port) ? port : defaults?.port,\n host: args.host ?? defaults?.host,\n basePath: args['base-path'] ?? defaults?.basePath,\n };\n await startMcpServer(ctx.program, rootCommand, ctx.program.eval, prefs);\n }),\n )) as any;\n}\n","import type {\n PadroneBarConfig,\n PadroneProgressIndicator,\n PadroneProgressOptions,\n PadroneProgressShow,\n PadroneProgressUpdate,\n PadroneSpinnerConfig,\n PadroneSpinnerPreset,\n} from '../core/runtime.ts';\n\n// ---------------------------------------------------------------------------\n// Spinner presets & resolution\n// ---------------------------------------------------------------------------\n\nconst spinnerPresets: Record<PadroneSpinnerPreset, string[]> = {\n dots: ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'],\n line: ['-', '\\\\', '|', '/'],\n arc: ['◜', '◠', '◝', '◞', '◡', '◟'],\n bounce: ['⠁', '⠂', '⠄', '⡀', '⢀', '⠠', '⠐', '⠈'],\n};\n\ntype ResolvedSpinnerConfig = { frames: string[]; interval: number; show: PadroneProgressShow };\n\nfunction resolveSpinnerConfig(config?: PadroneSpinnerConfig): ResolvedSpinnerConfig {\n if (config === false) return { frames: [], interval: 80, show: 'never' };\n if (config === true) return { frames: spinnerPresets.dots, interval: 80, show: 'always' };\n if (typeof config === 'string') return { frames: spinnerPresets[config], interval: 80, show: 'auto' };\n if (typeof config === 'object') {\n return {\n frames: config.frames ?? spinnerPresets.dots,\n interval: config.interval ?? 80,\n show: config.show ?? 'auto',\n };\n }\n return { frames: spinnerPresets.dots, interval: 80, show: 'auto' };\n}\n\n// ---------------------------------------------------------------------------\n// Bar resolution & rendering\n// ---------------------------------------------------------------------------\n\ntype ResolvedBarConfig = {\n width: number;\n filled: string;\n empty: string;\n animation: 'bounce' | 'slide' | 'pulse';\n show: PadroneProgressShow;\n};\n\nconst defaultBarConfig: ResolvedBarConfig = { width: 20, filled: '█', empty: '░', animation: 'bounce', show: 'auto' };\n\nfunction resolveBarConfig(bar: boolean | PadroneBarConfig | undefined): ResolvedBarConfig | undefined {\n if (bar === false) return undefined;\n if (!bar) return { ...defaultBarConfig };\n if (bar === true) return { ...defaultBarConfig, show: 'always' };\n return {\n width: bar.width ?? 20,\n filled: bar.filled ?? '█',\n empty: bar.empty ?? '░',\n animation: bar.animation ?? 'bounce',\n show: bar.show ?? 'always',\n };\n}\n\nconst SEGMENT_RATIO = 0.25;\nconst pulseGradient = ['░', '▒', '▓', '█', '▓', '▒', '░'];\n\nfunction formatIndeterminate(cfg: ResolvedBarConfig, frame: number): string {\n const { width, filled, empty, animation } = cfg;\n const pad = ''.padStart(4);\n\n if (animation === 'pulse') {\n const idx = frame % pulseGradient.length;\n return `${pad} ${pulseGradient[idx]!.repeat(width)}`;\n }\n\n const seg = Math.max(2, Math.round(width * SEGMENT_RATIO));\n const travel = width - seg;\n\n if (animation === 'slide') {\n const offset = frame % (travel + 1);\n return `${pad} ${empty.repeat(offset)}${filled.repeat(seg)}${empty.repeat(travel - offset)}`;\n }\n\n // bounce (default)\n const cycle = travel * 2;\n const pos = frame % cycle;\n const offset = pos <= travel ? pos : cycle - pos;\n return `${pad} ${empty.repeat(offset)}${filled.repeat(seg)}${empty.repeat(width - offset - seg)}`;\n}\n\nfunction formatBar(progress: number | undefined, cfg: ResolvedBarConfig, frame: number): string {\n if (progress === undefined) return formatIndeterminate(cfg, frame);\n const { width, filled, empty } = cfg;\n const clamped = Math.max(0, Math.min(1, progress));\n const filledCount = Math.round(clamped * width);\n const pct = `${Math.round(clamped * 100)}%`.padStart(4);\n return `${pct} ${filled.repeat(filledCount)}${empty.repeat(width - filledCount)}`;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction parseUpdate(value: PadroneProgressUpdate): { message?: string; progress?: number; indeterminate?: boolean; time?: boolean } {\n if (typeof value === 'string') return { message: value };\n if (typeof value === 'number') return { progress: value };\n return value;\n}\n\nfunction formatDuration(ms: number): string {\n const totalSeconds = Math.floor(ms / 1000);\n const hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n if (hours > 0) return `${hours}:${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;\n return `${minutes}:${String(seconds).padStart(2, '0')}`;\n}\n\nfunction estimateEta(samples: { time: number; progress: number }[]): number | undefined {\n if (samples.length < 2) return undefined;\n const first = samples[0]!;\n const last = samples[samples.length - 1]!;\n const progressDelta = last.progress - first.progress;\n if (progressDelta <= 0) return undefined;\n const timeDelta = last.time - first.time;\n const rate = progressDelta / timeDelta;\n const remaining = 1 - last.progress;\n if (remaining <= 0) return 0;\n return remaining / rate;\n}\n\n// ---------------------------------------------------------------------------\n// Factory type\n// ---------------------------------------------------------------------------\n\n/** Factory function that creates a `PadroneProgressIndicator`. */\nexport type PadroneProgressRenderer = (message: string, options?: PadroneProgressOptions) => PadroneProgressIndicator;\n\n// ---------------------------------------------------------------------------\n// Default terminal renderer\n// ---------------------------------------------------------------------------\n\n/**\n * Creates a terminal progress indicator (spinner, bar, or both).\n * Returns a no-op indicator in non-TTY/CI environments.\n */\nexport function createTerminalProgress(message: string, options?: PadroneProgressOptions): PadroneProgressIndicator {\n const spinnerCfg = resolveSpinnerConfig(options?.spinner);\n const successIcon = options?.successIndicator ?? '✔';\n const errorIcon = options?.errorIndicator ?? '✖';\n const barCfg = resolveBarConfig(options?.bar);\n\n const formatFinal = (icon: string, msg: string) => (icon ? `${icon} ${msg}\\n` : `${msg}\\n`);\n\n if (typeof process === 'undefined' || !process.stderr?.isTTY) {\n return {\n update() {},\n succeed(msg, opts) {\n if (msg === null) return;\n const icon = opts?.indicator ?? successIcon;\n if (msg || message) process?.stderr?.write?.(formatFinal(icon, msg || message));\n },\n fail(msg, opts) {\n if (msg === null) return;\n const icon = opts?.indicator ?? errorIcon;\n if (msg || message) process?.stderr?.write?.(formatFinal(icon, msg || message));\n },\n stop() {},\n pause() {},\n resume() {},\n };\n }\n\n // biome-ignore lint/suspicious/noControlCharactersInRegex: ANSI escape stripping requires matching ESC\n const ansiPattern = /\\x1b\\[[0-9;]*m/g;\n\n if (spinnerCfg.show === 'never' && (!barCfg || barCfg.show === 'never') && !message) {\n return { update() {}, succeed() {}, fail() {}, stop() {}, pause() {}, resume() {} };\n }\n\n const showTime = options?.time ?? false;\n const showEta = options?.eta ?? false;\n\n let spinnerFrame = 0;\n let barFrame = 0;\n let text = message;\n let progress: number | undefined;\n let indeterminate = false;\n let stopped = false;\n let paused = false;\n let timeEnabled = showTime;\n let startTime = showTime ? Date.now() : 0;\n const etaSamples: { time: number; progress: number }[] = [];\n let etaMs: number | undefined;\n let etaCalculatedAt = 0;\n\n const writeStderr = process.stderr.write.bind(process.stderr);\n const writeStdout = process.stdout.write.bind(process.stdout);\n let prevLineCount = 0;\n\n const clearLines = () => {\n if (prevLineCount > 1) {\n // Move cursor up and clear each wrapped line above the current one\n for (let i = 1; i < prevLineCount; i++) writeStderr('\\x1b[1A\\x1b[2K');\n }\n writeStderr('\\x1b[2K\\r');\n prevLineCount = 0;\n };\n\n /** Count how many terminal rows `str` occupies, accounting for line wrapping. */\n const lineCount = (str: string): number => {\n const cols = process.stderr.columns || 80;\n // Strip ANSI escape sequences for accurate width measurement\n const visible = str.replace(ansiPattern, '');\n return Math.max(1, Math.ceil(visible.length / cols));\n };\n\n const render = () => {\n if (paused || stopped) return;\n\n const barVisible = barCfg && (barCfg.show === 'always' || (barCfg.show === 'auto' && (progress !== undefined || indeterminate)));\n const spinnerVisible = spinnerCfg.show === 'always' || (spinnerCfg.show === 'auto' && !barVisible);\n\n let line = '';\n if (barVisible) line += formatBar(progress, barCfg!, barFrame);\n const hasEta = showEta && progress !== undefined && progress < 1 && etaMs !== undefined;\n if (timeEnabled || hasEta) {\n const parts: string[] = [];\n if (timeEnabled) parts.push(`⏱ ${formatDuration(Date.now() - startTime)}`);\n if (hasEta) {\n const elapsed = Date.now() - etaCalculatedAt;\n parts.push(`ETA ${formatDuration(Math.max(0, etaMs! - elapsed))}`);\n }\n if (line) line += ' ';\n line += parts.join(' | ');\n }\n if (spinnerVisible) {\n if (line) line += ' ';\n line += frames[spinnerFrame] ?? '';\n }\n if (text) {\n if (line) line += ' ';\n line += text;\n }\n\n if (line) {\n clearLines();\n writeStderr(line);\n prevLineCount = lineCount(line);\n } else {\n clearLines();\n }\n };\n\n const { frames } = spinnerCfg;\n const needsAnimation = spinnerCfg.show !== 'never' || (barCfg && barCfg.show !== 'never');\n const tickInterval = barCfg && barCfg.show !== 'never' ? Math.min(80, spinnerCfg.interval) : spinnerCfg.interval;\n\n const timer = needsAnimation\n ? setInterval(() => {\n spinnerFrame = (spinnerFrame + 1) % (frames.length || 1);\n barFrame++;\n render();\n }, tickInterval)\n : undefined;\n\n // Prevent the spinner timer from keeping the process alive on uncaught errors\n if (timer && typeof timer === 'object' && 'unref' in timer) (timer as NodeJS.Timeout).unref();\n\n render();\n\n const clear = () => {\n if (stopped) return;\n stopped = true;\n paused = false;\n if (timer) clearInterval(timer);\n clearLines();\n };\n\n return {\n update(value) {\n if (stopped) return;\n const parsed = parseUpdate(value);\n if (parsed.message !== undefined) text = parsed.message;\n if (parsed.progress !== undefined) {\n progress = parsed.progress;\n if (showEta) {\n const now = Date.now();\n etaSamples.push({ time: now, progress: parsed.progress });\n const estimated = estimateEta(etaSamples);\n if (estimated !== undefined) {\n etaMs = estimated;\n etaCalculatedAt = now;\n }\n }\n }\n if (parsed.indeterminate !== undefined) {\n indeterminate = parsed.indeterminate;\n if (indeterminate) progress = undefined;\n }\n if (parsed.time !== undefined) {\n if (parsed.time && !timeEnabled) {\n timeEnabled = true;\n startTime = Date.now();\n } else if (!parsed.time) {\n timeEnabled = false;\n }\n }\n render();\n },\n succeed(msg, opts) {\n clear();\n if (msg === null) return;\n const finalMsg = msg ?? text;\n const icon = opts?.indicator ?? successIcon;\n if (finalMsg) writeStderr(formatFinal(icon, finalMsg));\n },\n fail(msg, opts) {\n clear();\n if (msg === null) return;\n const finalMsg = msg ?? text;\n const icon = opts?.indicator ?? errorIcon;\n if (finalMsg) writeStderr(formatFinal(icon, finalMsg));\n },\n stop() {\n clear();\n },\n pause() {\n if (stopped || paused) return;\n paused = true;\n clearLines();\n writeStdout('\\x1b[2K\\r');\n },\n resume() {\n if (stopped || !paused) return;\n paused = false;\n render();\n },\n };\n}\n","import { defineInterceptor } from '../core/interceptors.ts';\nimport type { PadroneBarConfig, PadroneProgressIndicator, PadroneProgressOptions, PadroneSpinnerConfig } from '../core/runtime.ts';\nimport type { AnyPadroneBuilder, CommandTypesBase } from '../types/index.ts';\nimport type { WithInterceptor } from '../util/type-utils.ts';\nimport type { PadroneProgressRenderer } from './progress-renderer.ts';\nimport { createTerminalProgress } from './progress-renderer.ts';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** A progress message value: a plain string, `null` to suppress, or an object with a message and custom indicator icon. */\nexport type PadroneProgressMessage = string | null | { message?: string | null; indicator?: string };\n\n/** Per-phase message configuration for progress indicators. */\nexport type PadroneProgressMessages<TRes = unknown> = {\n /** Message shown during async validation. Defaults to `''` (spinner only). */\n validation?: string;\n /** Message shown while the command's action is running. */\n progress?: string;\n /** Message shown when the command succeeds. `null` to suppress. Defaults to the `progress` message. */\n success?: PadroneProgressMessage | ((result: TRes) => PadroneProgressMessage);\n /** Message shown when the command fails. `null` to suppress. Defaults to the error message. */\n error?: PadroneProgressMessage | ((error: unknown) => PadroneProgressMessage);\n};\n\n/**\n * Progress indicator configuration with messages, visual options, and renderer.\n */\nexport type PadroneProgressConfig<TRes = unknown> = {\n /** Per-phase messages. A string sets the `progress` message; an object configures individual phases. */\n message?: string | PadroneProgressMessages<TRes>;\n /** Spinner configuration. Default `show` is `'auto'` (visible when bar is not shown). `true` forces spinner to always show (even alongside a bar). */\n spinner?: PadroneSpinnerConfig;\n /** Enable a progress bar. `true` for defaults (`show: 'always'`), or a `PadroneBarConfig` object. `false` to disable entirely. When omitted, bar defaults to `show: 'auto'`. */\n bar?: boolean | PadroneBarConfig;\n /** Show elapsed time since the indicator started. Can also be started on demand via `update({ time: true })`. */\n time?: boolean;\n /** Show estimated time remaining based on progress rate. Requires numeric `update()` calls. */\n eta?: boolean;\n /**\n * Custom renderer factory. Called to create the progress indicator.\n * Defaults to the built-in terminal renderer (`createTerminalProgress`).\n */\n renderer?: PadroneProgressRenderer;\n};\n\n/**\n * Shared progress defaults that can be provided via context instead of repeating\n * at each call site. Per-instance message fields are excluded — those always come\n * from the constructor argument.\n *\n * Provide via context as `{ progressConfig: PadroneProgressDefaults }`.\n */\nexport type PadroneProgressDefaults = Pick<PadroneProgressConfig, 'message' | 'spinner' | 'bar' | 'time' | 'eta' | 'renderer'>;\n\n/** Builder/program type after applying `padroneProgress()`. Adds `{ progress: PadroneProgressIndicator }` to the command context. */\nexport type WithProgress<T> = WithInterceptor<T, { progress: PadroneProgressIndicator }>;\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nconst noopIndicator: PadroneProgressIndicator = {\n update() {},\n succeed() {},\n fail() {},\n stop() {},\n pause() {},\n resume() {},\n};\n\nfunction resolveMessage(field: unknown, value: unknown, fallback?: string): { message: string | null | undefined; indicator?: string } {\n const raw = typeof field === 'function' ? (field as (v: unknown) => unknown)(value) : field;\n if (raw === undefined) return { message: fallback };\n if (raw === null || typeof raw === 'string') return { message: raw };\n if (typeof raw === 'object' && raw !== null) {\n const obj = raw as { message?: string | null; indicator?: string };\n return { message: obj.message, indicator: obj.indicator };\n }\n return { message: fallback };\n}\n\nfunction cleanup(\n indicator: PadroneProgressIndicator,\n successConfig: unknown,\n errorConfig: unknown,\n error: unknown,\n result: unknown,\n isError: boolean,\n) {\n if (isError) {\n const fallback = error instanceof Error ? error.message : String(error);\n const { message: errorMsg, indicator: errorIcon } = resolveMessage(errorConfig, error, fallback);\n indicator.fail(errorMsg, errorIcon !== undefined ? { indicator: errorIcon } : undefined);\n } else {\n const { message: successMsg, indicator: successIcon } = resolveMessage(successConfig, result);\n indicator.succeed(successMsg, successIcon !== undefined ? { indicator: successIcon } : undefined);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Interceptor\n// ---------------------------------------------------------------------------\n\nfunction resolveMessages(raw: string | PadroneProgressMessages | undefined): {\n progress: string;\n validation: string;\n success: unknown;\n error: unknown;\n} {\n if (!raw || typeof raw === 'string') {\n return { progress: raw || 'Working...', validation: '', success: undefined, error: undefined };\n }\n return {\n progress: raw.progress ?? 'Working...',\n validation: raw.validation ?? '',\n success: raw.success,\n error: raw.error,\n };\n}\n\nfunction mergeMessages(\n cmd: ReturnType<typeof resolveMessages>,\n ctx: ReturnType<typeof resolveMessages>,\n cmdRaw: string | PadroneProgressMessages | undefined,\n): ReturnType<typeof resolveMessages> {\n // String shorthand: all fields come from the string, no context fallback for individual fields\n if (typeof cmdRaw === 'string') return cmd;\n // Object: per-field fallback to context\n const obj = (typeof cmdRaw === 'object' ? cmdRaw : undefined) as PadroneProgressMessages | undefined;\n return {\n progress: obj?.progress !== undefined ? cmd.progress : (ctx.progress ?? cmd.progress),\n validation: obj?.validation !== undefined ? cmd.validation : ctx.validation || cmd.validation,\n success: obj?.success !== undefined ? cmd.success : (ctx.success ?? cmd.success),\n error: obj?.error !== undefined ? cmd.error : (ctx.error ?? cmd.error),\n };\n}\n\nfunction progressInterceptor(config: string | PadroneProgressConfig) {\n const isObj = typeof config === 'object';\n const rawMessage = typeof config === 'string' ? config : isObj ? config.message : undefined;\n // Raw constructor values — undefined means \"not set by caller\"\n const rawSpinner = isObj ? config.spinner : undefined;\n const rawBar = isObj ? config.bar : undefined;\n const rawRenderer = isObj ? config.renderer : undefined;\n const rawTime = isObj ? config.time : undefined;\n const rawEta = isObj ? config.eta : undefined;\n\n return defineInterceptor({ id: 'padrone:progress', name: 'padrone:progress' })\n .requires<{ progressConfig?: PadroneProgressDefaults }>()\n .factory(() => {\n let indicator: PadroneProgressIndicator | undefined;\n let restoreOutput: (() => void) | undefined;\n // Lazily resolved from context + constructor args\n let resolvedRenderer: PadroneProgressRenderer | undefined;\n let resolvedOptions: PadroneProgressOptions | undefined;\n let msgs: ReturnType<typeof resolveMessages> | undefined;\n\n function resolve(ctx: { context?: { progressConfig?: PadroneProgressDefaults } }) {\n if (resolvedRenderer) return;\n const ctxCfg = (ctx.context as Record<string, unknown> | undefined)?.progressConfig as PadroneProgressDefaults | undefined;\n const spinner = rawSpinner ?? ctxCfg?.spinner;\n const bar = rawBar ?? ctxCfg?.bar;\n const time = rawTime ?? ctxCfg?.time;\n const eta = rawEta ?? ctxCfg?.eta;\n resolvedRenderer = rawRenderer ?? ctxCfg?.renderer ?? createTerminalProgress;\n resolvedOptions =\n spinner !== undefined || bar !== undefined || time !== undefined || eta !== undefined ? { spinner, bar, time, eta } : undefined;\n msgs = mergeMessages(resolveMessages(rawMessage), resolveMessages(ctxCfg?.message), rawMessage);\n }\n\n const teardown = () => {\n restoreOutput?.();\n indicator = undefined;\n restoreOutput = undefined;\n };\n\n return {\n validate(ctx, next) {\n resolve(ctx);\n indicator = resolvedRenderer!(msgs!.validation || msgs!.progress, resolvedOptions);\n\n const originalOutput = ctx.runtime.output;\n const originalError = ctx.runtime.error;\n ctx.runtime.output = (...args: unknown[]) => {\n indicator!.pause();\n originalOutput(...args);\n indicator!.resume();\n };\n ctx.runtime.error = (text: string) => {\n indicator!.pause();\n originalError(text);\n indicator!.resume();\n };\n restoreOutput = () => {\n ctx.runtime.output = originalOutput;\n ctx.runtime.error = originalError;\n };\n\n const onValidationFailure = (error: unknown) => {\n if (indicator) {\n cleanup(indicator, msgs!.success, msgs!.error, error, undefined, true);\n teardown();\n }\n };\n\n const checkResult = (result: any) => {\n if (result.argsResult?.issues) onValidationFailure(new Error('Validation failed'));\n return result;\n };\n\n let result: any;\n try {\n result = next();\n } catch (err) {\n onValidationFailure(err);\n throw err;\n }\n if (result instanceof Promise) {\n return result.then(checkResult, (err: unknown) => {\n onValidationFailure(err);\n throw err;\n });\n }\n return checkResult(result);\n },\n\n execute(_ctx, next) {\n // Transition from validation message to progress message\n if (indicator && msgs!.validation) indicator.update(msgs!.progress);\n\n const effectiveIndicator = indicator ?? noopIndicator;\n\n const onSuccess = (value: unknown) => {\n cleanup(effectiveIndicator, msgs!.success, msgs!.error, undefined, value, false);\n teardown();\n };\n const onError = (err: unknown) => {\n if (indicator) {\n cleanup(indicator, msgs!.success, msgs!.error, err, undefined, true);\n teardown();\n }\n throw err;\n };\n\n let result: any;\n try {\n result = next({ context: { progress: effectiveIndicator } });\n } catch (err) {\n onError(err);\n }\n if (result instanceof Promise) {\n return result.then(\n (r) => {\n if (r.result instanceof Promise) {\n return {\n result: r.result.then(\n (value: unknown) => {\n onSuccess(value);\n return value;\n },\n (err: unknown) => onError(err),\n ),\n };\n }\n onSuccess(r.result);\n return r;\n },\n (err: unknown) => onError(err),\n );\n }\n if (result!.result instanceof Promise) {\n return {\n result: result!.result.then(\n (value: unknown) => {\n onSuccess(value);\n return value;\n },\n (err: unknown) => onError(err),\n ),\n };\n }\n onSuccess(result!.result);\n return result;\n },\n\n shutdown(ctx) {\n // Safety net: if validate/execute cleanup paths were bypassed (e.g., outer interceptor\n // threw during execute before reaching this interceptor's execute handler), stop the indicator.\n if (indicator) {\n cleanup(indicator, msgs!.success, msgs!.error, ctx.error, ctx.result, !!ctx.error);\n teardown();\n }\n },\n };\n })\n .provides<{ progress: PadroneProgressIndicator }>();\n}\n\n// ---------------------------------------------------------------------------\n// Extension\n// ---------------------------------------------------------------------------\n\n/**\n * Extension that adds an auto-managed progress indicator to the command pipeline.\n *\n * - `string` — a single message used for all states.\n * - `PadroneProgressConfig` — separate messages for validation, progress, success, and error.\n *\n * The indicator is automatically started before validation, updated at each phase transition,\n * and stopped on success (`.succeed()`) or failure (`.fail()`).\n *\n * Provides `{ progress: PadroneProgressIndicator }` on the command context.\n * Access it in action handlers as `ctx.context.progress`.\n *\n * Uses the built-in terminal renderer by default. Pass a custom `renderer` for non-terminal\n * environments (web UIs, testing, etc).\n *\n * Usage:\n * ```ts\n * createPadrone('my-cli')\n * .command('sync', (c) =>\n * c.extend(padroneProgress('Syncing...'))\n * .action((_args, ctx) => {\n * ctx.context.progress.update('halfway');\n * })\n * )\n * ```\n */\nexport function padroneProgress<T extends CommandTypesBase>(config?: string | PadroneProgressConfig): (builder: T) => WithProgress<T> {\n return ((builder: AnyPadroneBuilder) => builder.intercept(progressInterceptor(config ?? 'Working...'))) as any;\n}\n","import { resolveAllCommands } from '../core/commands.ts';\nimport type { PadroneServePreferences } from '../feature/serve.ts';\nimport type { AnyPadroneBuilder, CommandTypesBase, PadroneCommand } from '../types/index.ts';\nimport type { PadroneSchema } from '../types/schema.ts';\nimport type { WithCommand } from '../util/type-utils.ts';\nimport { getRootCommand } from '../util/utils.ts';\nimport { passthroughSchema } from './utils.ts';\n\n// ── Types ────────────────────────────────────────────────────────────────\n\ntype ServeArgs = { port?: string; host?: string; basePath?: string };\n\ntype ServeCommand = PadroneCommand<'serve', '', PadroneSchema<ServeArgs>, void, [], [], true>;\n\nexport type WithServe<T> = WithCommand<T, 'serve', ServeCommand>;\n\n// ── Extension ────────────────────────────────────────────────────────────\n\n/**\n * Extension that adds the `serve` command for starting a REST HTTP server.\n *\n * Usage:\n * ```ts\n * createPadrone('my-cli').extend(padroneServe())\n * ```\n */\nexport function padroneServe(defaults?: PadroneServePreferences): <T extends CommandTypesBase>(builder: T) => WithServe<T> {\n return ((builder: AnyPadroneBuilder) =>\n builder.command('serve', (c) =>\n c\n .configure({ description: 'Start a REST HTTP server', hidden: true })\n .arguments(passthroughSchema({ port: 'string', host: 'string', 'base-path': 'string' }))\n .async()\n .action(async (args, ctx) => {\n const rootCommand = getRootCommand(ctx.command);\n resolveAllCommands(rootCommand);\n const { startServeServer } = await import('../feature/serve.ts');\n const port = args.port ? parseInt(args.port, 10) : undefined;\n const prefs: PadroneServePreferences = {\n ...defaults,\n port: port && !Number.isNaN(port) ? port : defaults?.port,\n host: args.host ?? defaults?.host,\n basePath: args['base-path'] ?? defaults?.basePath,\n };\n await startServeServer(ctx.program, rootCommand, ctx.program.eval, prefs);\n }),\n )) as any;\n}\n","import { defineInterceptor } from '../core/interceptors.ts';\nimport { thenMaybe } from '../core/results.ts';\nimport type { AnyPadroneBuilder, CommandTypesBase } from '../types/index.ts';\n\n// ── Helpers ─────────────────────────────────────────────────────────────\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${ms.toFixed(0)}ms`;\n if (ms < 60_000) return `${(ms / 1000).toFixed(2)}s`;\n const mins = Math.floor(ms / 60_000);\n const secs = ((ms % 60_000) / 1000).toFixed(2);\n return `${mins}m ${secs}s`;\n}\n\n// ── Interceptor ─────────────────────────────────────────────────────────\n\nconst timingMeta = { id: 'padrone:timing', name: 'padrone:timing', order: -1002 } as const;\n\nfunction createTimingInterceptor(enabledByDefault: boolean) {\n return defineInterceptor(timingMeta, () => {\n let enabled = enabledByDefault;\n let startTime = 0;\n\n return {\n parse(_ctx, next) {\n return thenMaybe(next(), (res) => {\n if ('timing' in res.rawArgs) {\n enabled = res.rawArgs.timing !== false;\n delete res.rawArgs.timing;\n }\n if ('time' in res.rawArgs) {\n enabled = res.rawArgs.time !== false;\n delete res.rawArgs.time;\n }\n return res;\n });\n },\n start(_ctx, next) {\n startTime = performance.now();\n return next();\n },\n shutdown(ctx, next) {\n return thenMaybe(next(), (res) => {\n if (enabled) {\n const elapsed = performance.now() - startTime;\n ctx.runtime.error(`\\nDone in ${formatDuration(elapsed)}`);\n }\n return res;\n });\n },\n };\n });\n}\n\n// ── Extension ───────────────────────────────────────────────────────────\n\nexport interface PadroneTimingOptions {\n /** Enable timing by default without requiring `--time` flag. Default: `false`. */\n enabled?: boolean;\n}\n\n/**\n * Extension that tracks command execution time.\n *\n * - `--time` / `--timing` → enables timing output\n * - `--no-time` / `--no-timing` → disables timing output\n *\n * Pass `{ enabled: true }` to enable timing by default (can be disabled via `--no-time`).\n *\n * Usage:\n * ```ts\n * // Opt-in via flag\n * createPadrone('my-cli').extend(padroneTiming())\n *\n * // Always on, opt-out via --no-time\n * createPadrone('my-cli').extend(padroneTiming({ enabled: true }))\n * ```\n */\nexport function padroneTiming(options?: PadroneTimingOptions): <T extends CommandTypesBase>(builder: T) => T {\n return ((builder: AnyPadroneBuilder) => builder.intercept(createTimingInterceptor(options?.enabled ?? false))) as any;\n}\n","import { defineInterceptor } from '#src/core/interceptors.ts';\nimport { thenMaybe } from '#src/core/results.ts';\nimport type { AnyPadroneBuilder, CommandTypesBase } from '#src/types/index.ts';\nimport type { WithInterceptor } from '#src/util/type-utils.ts';\n\n// ---------------------------------------------------------------------------\n// Types — minimal OTEL-compatible interfaces so we don't hard-depend on\n// `@opentelemetry/api`. Users pass their real Tracer / Span instances.\n// ---------------------------------------------------------------------------\n\n/** Minimal subset of OTEL `SpanStatusCode`. */\ntype SpanStatusCode = 0 | 1 | 2;\n\n/** Minimal subset of OTEL `SpanStatus`. */\ntype SpanStatus = { code: SpanStatusCode; message?: string };\n\n/** Minimal subset of OTEL `Span`. */\nexport interface OtelSpan {\n setAttribute(key: string, value: string | number | boolean): this;\n addEvent(name: string, attributes?: Record<string, string | number | boolean>): this;\n setStatus(status: SpanStatus): this;\n recordException(error: unknown): this;\n end(): void;\n spanContext(): { traceId: string; spanId: string };\n}\n\n/** Minimal subset of OTEL `Tracer`. */\nexport interface OtelTracer {\n startSpan(name: string): OtelSpan;\n}\n\n/** Minimal subset of OTEL `TracerProvider`. */\nexport interface OtelTracerProvider {\n getTracer(name: string, version?: string): OtelTracer;\n}\n\n/** Tracing handle injected into the command context. */\nexport type PadroneTracer = {\n /** The underlying OTEL tracer. */\n tracer: OtelTracer;\n /** Root span covering the full command execution. */\n rootSpan: OtelSpan;\n /** Run `fn` inside a child span that is automatically ended when `fn` returns (or rejects). */\n span: <T>(name: string, fn: (span: OtelSpan) => T) => T;\n};\n\n/** Configuration for the tracing extension. */\nexport type PadroneTracingConfig = {\n /** OTEL `TracerProvider`. Required — there is no global fallback. */\n provider: OtelTracerProvider;\n /** Service / tracer name. Defaults to the CLI program name. */\n serviceName?: string;\n};\n\n/** Builder/program type after applying `padroneTracing()`. Adds `{ tracing: PadroneTracer }` to the command context. */\nexport type WithTracing<T> = WithInterceptor<T, { tracing: PadroneTracer }>;\n\n// ---------------------------------------------------------------------------\n// Interceptor\n// ---------------------------------------------------------------------------\n\nconst OTEL_ERROR: SpanStatusCode = 2;\n\ntype ResolvedTracingConfig = { provider: OtelTracerProvider; serviceName: string | undefined };\n\nfunction tracingInterceptor(config: ResolvedTracingConfig) {\n return defineInterceptor({ id: 'padrone:tracing', name: 'padrone:tracing', order: -1 }, () => {\n let rootSpan: OtelSpan;\n let tracer: OtelTracer;\n\n return {\n start(ctx, next) {\n tracer = config.provider.getTracer(config.serviceName ?? ctx.command.name);\n return next();\n },\n\n execute(ctx, next) {\n rootSpan = tracer.startSpan(`cli ${ctx.command.name}`);\n\n const padroneTracer: PadroneTracer = {\n tracer,\n rootSpan,\n span(name, fn) {\n const child = tracer.startSpan(name);\n try {\n const result = fn(child);\n if (result != null && typeof (result as any).then === 'function') {\n return (result as any).then(\n (v: any) => {\n child.end();\n return v;\n },\n (err: unknown) => {\n child.recordException(err);\n child.setStatus({ code: OTEL_ERROR });\n child.end();\n throw err;\n },\n );\n }\n child.end();\n return result;\n } catch (err) {\n child.recordException(err);\n child.setStatus({ code: OTEL_ERROR });\n child.end();\n throw err;\n }\n },\n };\n\n return next({ context: { tracing: padroneTracer } });\n },\n\n error(ctx, next) {\n rootSpan?.recordException(ctx.error);\n rootSpan?.setStatus({ code: OTEL_ERROR });\n return next();\n },\n\n shutdown(_ctx, next) {\n return thenMaybe(next(), (res) => {\n rootSpan?.end();\n return res;\n });\n },\n };\n });\n}\n\n// ---------------------------------------------------------------------------\n// Extension\n// ---------------------------------------------------------------------------\n\n/**\n * Extension that adds OpenTelemetry tracing to command execution.\n *\n * Creates a root span for each command invocation and provides a `PadroneTracer`\n * on the command context for creating child spans in action handlers.\n *\n * When used with `padroneLogger()`, the logger automatically emits span events\n * for each log call — no extra configuration needed. The logger detects the\n * tracing context and bridges log output to span events.\n *\n * Uses minimal OTEL-compatible interfaces — pass any `TracerProvider` that\n * implements `getTracer()`. Works with `@opentelemetry/api` or compatible\n * libraries.\n *\n * Provides `{ tracing: PadroneTracer }` on the command context.\n * Access it in action handlers as `ctx.context.tracing`.\n *\n * Usage:\n * ```ts\n * import { trace } from '@opentelemetry/api';\n *\n * createPadrone('my-cli')\n * .extend(padroneTracing({ provider: trace.getTracerProvider() }))\n * .extend(padroneLogger())\n * .command('deploy', (c) =>\n * c.action((_args, ctx) => {\n * ctx.context.logger.info('deploying'); // also emits a span event\n * ctx.context.tracing.span('build', (span) => {\n * span.setAttribute('target', 'production');\n * });\n * })\n * )\n * ```\n */\nexport function padroneTracing<T extends CommandTypesBase>(config: PadroneTracingConfig): (builder: T) => WithTracing<T> {\n const resolved: ResolvedTracingConfig = {\n provider: config.provider,\n serviceName: config.serviceName,\n };\n return ((builder: AnyPadroneBuilder) => builder.intercept(tracingInterceptor(resolved))) as any;\n}\n","import { thenMaybe } from '#src/core/results.ts';\nimport { defineInterceptor } from '../core/interceptors.ts';\nimport type { UpdateCheckConfig } from '../feature/update-check.ts';\nimport type { AnyPadroneBuilder, CommandTypesBase } from '../types/index.ts';\nimport { getVersion } from '../util/utils.ts';\n\n// ── Interceptor ─────────────────────────────────────────────────────────\n\nfunction createUpdateCheckInterceptor(config: UpdateCheckConfig) {\n return defineInterceptor({ id: 'padrone:update-check', name: 'padrone:update-check', order: 1000 }, () => {\n let checkPromise: Promise<(() => void) | undefined> | undefined;\n let suppressed = false;\n\n return {\n start(ctx, next) {\n const rootCommand = ctx.command;\n const runtime = ctx.runtime;\n\n checkPromise = Promise.resolve(getVersion(rootCommand.version)).then((currentVersion) =>\n import('../feature/update-check.ts').then(({ createUpdateChecker }) =>\n createUpdateChecker(rootCommand.name, currentVersion, config, runtime),\n ),\n );\n\n return next();\n },\n parse(_ctx, next) {\n return thenMaybe(next(), (res) => {\n if ('update-check' in res.rawArgs) {\n if (res.rawArgs['update-check'] === false) suppressed = true;\n delete res.rawArgs['update-check'];\n }\n return res;\n });\n },\n shutdown(_ctx, next) {\n const result = next();\n if (suppressed || !checkPromise) return result;\n\n // Try to show notification synchronously if the check already resolved\n let resolved: (() => void) | undefined | null = null;\n checkPromise.then(\n (fn) => {\n resolved = fn;\n },\n () => {\n resolved = undefined;\n },\n );\n\n if (resolved !== null) {\n (resolved as (() => void) | undefined)?.();\n }\n\n return result;\n },\n };\n });\n}\n\n// ── Extension ────────────────────────────────────────────────────────────\n\n/**\n * Extension that adds background update checking:\n * - Checks for newer versions on npm (or custom registry) in the background\n * - Shows an update notification after command execution\n * - Respects `--no-update-check` flag to suppress\n *\n * Usage:\n * ```ts\n * createPadrone('my-cli')\n * .extend(padroneUpdateCheck({ packageName: 'my-cli' }))\n * ```\n */\nexport function padroneUpdateCheck(config: UpdateCheckConfig = {}): <T extends CommandTypesBase>(builder: T) => T {\n return ((builder: AnyPadroneBuilder) => builder.intercept(createUpdateCheckInterceptor(config))) as any;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["_fs","_path","initNodeModules","formatDuration"],"sources":["../src/core/results.ts","../src/core/interceptors.ts","../src/output/primitives.ts","../src/output/output-indicator.ts","../src/extension/auto-output.ts","../src/extension/color.ts","../src/core/parse.ts","../src/core/validate.ts","../src/extension/utils.ts","../src/extension/help.ts","../src/feature/interactive.ts","../src/extension/interactive.ts","../src/extension/repl.ts","../src/extension/signal.ts","../src/extension/stdin.ts","../src/extension/suggestions.ts","../src/extension/version.ts","../src/feature/wrap.ts","../src/core/exec.ts","../src/feature/repl-loop.ts","../src/core/program-methods.ts","../src/core/create.ts","../src/extension/completion.ts","../src/extension/config.ts","../src/util/dotenv.ts","../src/extension/env.ts","../src/extension/ink.ts","../src/extension/logger.ts","../src/extension/man.ts","../src/extension/mcp.ts","../src/extension/progress-renderer.ts","../src/extension/progress.ts","../src/extension/serve.ts","../src/extension/timing.ts","../src/extension/tracing.ts","../src/extension/update-check.ts"],"sourcesContent":["import type { AnyPadroneCommand, PadroneSchema } from '../types/index.ts';\nimport type { Thenable } from '../util/type-utils.ts';\nimport { getCommandRuntime } from './commands.ts';\n\n/**\n * Brands a schema as async, signaling that its `validate()` may return a Promise.\n * When an async-branded schema is passed to `.arguments()`, `.configFile()`, or `.env()`,\n * the command's `parse()` and `cli()` will return Promises.\n */\nexport function asyncSchema<T extends PadroneSchema>(schema: T): T & { '~async': true } {\n return Object.assign(schema, { '~async': true as const });\n}\n\nexport const noop = <TRes>() => undefined as TRes;\n\n/**\n * Maps over a value that may or may not be a Promise.\n * If the value is a Promise, chains with `.then()`. Otherwise, calls the function synchronously.\n * This preserves sync behavior for sync schemas and async behavior for async schemas.\n */\nexport function thenMaybe<T, U>(value: T | Promise<T>, fn: (v: T) => U | Promise<U>): U | Promise<U> {\n if (value instanceof Promise) return value.then(fn);\n return fn(value);\n}\n\n/**\n * Makes a sync result object thenable by adding `.then()`, `.catch()`, and `.finally()` methods.\n * If the value is already a Promise, returns it as-is.\n * This allows users to write `await program.cli()` or `program.cli().then(...)` regardless of sync/async.\n *\n * The `.then()` resolves with a plain copy (without thenable methods) to avoid infinite\n * recursive unwrapping by the Promise resolution algorithm.\n */\nexport function makeThenable<T>(value: T | Promise<T>): Thenable<T> {\n if (value instanceof Promise) return value as any;\n if (value !== null && typeof value === 'object' && !('then' in value)) {\n const toPlain = () => {\n const plain = { ...value } as any;\n delete plain.then;\n delete plain.catch;\n delete plain.finally;\n return plain as T;\n };\n // biome-ignore lint/suspicious/noThenProperty: intentional thenable shim for sync results\n (value as any).then = (onfulfilled?: (v: T) => any, onrejected?: (reason: any) => any) => {\n try {\n const result = onfulfilled ? onfulfilled(toPlain()) : toPlain();\n return Promise.resolve(result);\n } catch (err) {\n if (onrejected) return Promise.resolve(onrejected(err));\n return Promise.reject(err);\n }\n };\n (value as any).catch = (onrejected?: (reason: any) => any) => (value as any).then(undefined, onrejected);\n (value as any).finally = (onfinally?: () => void) =>\n (value as any).then(\n (v: any) => {\n onfinally?.();\n return v;\n },\n (err: any) => {\n onfinally?.();\n throw err;\n },\n );\n }\n return value as any;\n}\n\n/**\n * Wraps a Promise to include a `drain()` method at the top level.\n * This allows `await promise.drain()` without first awaiting the promise.\n * Since cli/eval never reject, this just delegates to the resolved result's `drain()`.\n */\nexport function withPromiseDrain<T extends Promise<any>>(promise: T): T & { drain: () => Promise<any> } {\n (promise as any).drain = async () => {\n const resolved = await promise;\n return resolved.drain();\n };\n return promise as any;\n}\n\nexport function isIterator(value: unknown): value is Iterator<unknown> {\n return typeof value === 'object' && value !== null && Symbol.iterator in value && typeof (value as any)[Symbol.iterator] === 'function';\n}\n\nexport function isAsyncIterator(value: unknown): value is AsyncIterator<unknown> {\n return (\n typeof value === 'object' &&\n value !== null &&\n Symbol.asyncIterator in value &&\n typeof (value as any)[Symbol.asyncIterator] === 'function'\n );\n}\n\n/**\n * Writes a command's return value to output, handling promises, iterators, and async iterators.\n * Values are passed directly to the output function without stringification —\n * runtimes like Node/Bun already format objects via console.log.\n * Returns void or a Promise depending on whether async consumption is needed.\n */\nexport function outputValue(value: unknown, output: (...args: unknown[]) => void): void | Promise<void> {\n if (value == null) return;\n\n // Async iterator — consume and output each yielded value\n if (isAsyncIterator(value)) {\n return (async () => {\n const iter = (value as any)[Symbol.asyncIterator]();\n while (true) {\n const { done, value: item } = await iter.next();\n if (done) break;\n if (item != null) output(item);\n }\n })();\n }\n\n // Sync iterator (but not a plain string/array which also have Symbol.iterator)\n if (typeof value !== 'string' && !Array.isArray(value) && isIterator(value)) {\n const iter = (value as any)[Symbol.iterator]();\n while (true) {\n const { done, value: item } = iter.next();\n if (done) break;\n if (item != null) output(item);\n }\n return;\n }\n\n // Promise — await then output\n if (value instanceof Promise) {\n return value.then((resolved) => outputValue(resolved, output));\n }\n\n // Pass value directly — runtime handles formatting\n output(value);\n}\n\n/**\n * Resolves a result value by unwrapping Promises and collecting iterables into arrays.\n * This is the runtime counterpart of the `Drained<T>` type.\n */\nexport async function drainValue(value: unknown): Promise<unknown> {\n // Unwrap promises first\n if (value instanceof Promise) {\n return drainValue(await value);\n }\n\n // Async iterator — collect into array\n if (isAsyncIterator(value)) {\n const items: unknown[] = [];\n const iter = (value as any)[Symbol.asyncIterator]();\n while (true) {\n const { done, value: item } = await iter.next();\n if (done) break;\n items.push(item);\n }\n return items;\n }\n\n // Sync iterator (but not string/array)\n if (typeof value !== 'string' && !Array.isArray(value) && isIterator(value)) {\n const items: unknown[] = [];\n const iter = (value as any)[Symbol.iterator]();\n while (true) {\n const { done, value: item } = iter.next();\n if (done) break;\n items.push(item);\n }\n return items;\n }\n\n return value;\n}\n\n/**\n * Attaches a `drain()` method to a command result object.\n * If the result has an `error` field, `drain()` returns `{ error }`.\n * Otherwise, resolves the result (unwrapping Promises, collecting iterables), catches errors,\n * and returns a discriminated union `{ value } | { error }` that never throws.\n */\nexport function withDrain<T extends Record<string, unknown>>(obj: T): T & { drain: () => Promise<any> } {\n (obj as any).drain = async () => {\n if ('error' in obj && obj.error !== undefined) {\n return { error: obj.error };\n }\n try {\n const value = await drainValue(obj.result);\n return { value };\n } catch (err) {\n return { error: err };\n }\n };\n return obj as any;\n}\n\n/**\n * Creates an error command result with a `drain()` that returns the error.\n */\nexport function errorResult(error: unknown, partial?: { command?: unknown; args?: unknown; argsResult?: unknown }) {\n return withDrain({\n error,\n result: undefined,\n command: partial?.command,\n args: partial?.args,\n argsResult: partial?.argsResult,\n });\n}\n\nexport function isAsyncBranded(schema: unknown): boolean {\n return !!schema && typeof schema === 'object' && '~async' in schema && (schema as any)['~async'] === true;\n}\n\nexport function hasInteractiveConfig(meta: unknown): boolean {\n if (!meta || typeof meta !== 'object') return false;\n const m = meta as Record<string, unknown>;\n return m.interactive === true || Array.isArray(m.interactive) || m.optionalInteractive === true || Array.isArray(m.optionalInteractive);\n}\n\nexport function warnIfUnexpectedAsync<T>(value: T, command: AnyPadroneCommand): T {\n const runtime = getCommandRuntime(command);\n if (runtime.env().NODE_ENV === 'production') return value;\n if (value instanceof Promise && !command.isAsync) {\n runtime.error(\n `[padrone] Command \"${command.path || command.name}\" returned a Promise from validation, ` +\n `but was not marked as async. Use \\`.async()\\` on the builder or \\`asyncSchema()\\` to brand your schema. ` +\n `Without this, TypeScript will infer a sync return type and the result will be a Promise at runtime.`,\n );\n }\n return value;\n}\n","import type {\n AnyPadroneCommand,\n AnyPadroneProgram,\n InterceptorDefBuilder,\n InterceptorErrorContext,\n InterceptorErrorResult,\n InterceptorFactory,\n InterceptorMeta,\n InterceptorPipelinePhase,\n InterceptorShutdownContext,\n InterceptorStartContext,\n PadroneInterceptorFn,\n RegisteredInterceptor,\n ResolvedInterceptor,\n} from '../types/index.ts';\nimport { thenMaybe } from './results.ts';\nimport type { ResolvedPadroneRuntime } from './runtime.ts';\n\n// ---------------------------------------------------------------------------\n// defineInterceptor — creates a single-value distributable interceptor\n// ---------------------------------------------------------------------------\n\nfunction buildInterceptorFn(meta: InterceptorMeta, factory: InterceptorFactory<any, any, any>): PadroneInterceptorFn<any, any, any> {\n Object.defineProperty(factory, 'name', { value: meta.name, configurable: true });\n if (meta.id !== undefined) (factory as any).id = meta.id;\n if (meta.order !== undefined) (factory as any).order = meta.order;\n if (meta.disabled !== undefined) (factory as any).disabled = meta.disabled;\n if (meta.inherit !== undefined) (factory as any).inherit = meta.inherit;\n (factory as any).provides = () => factory;\n (factory as any).requires = () => factory;\n return factory as PadroneInterceptorFn<any, any, any>;\n}\n\n/**\n * Creates a self-contained interceptor value by attaching static metadata to the factory function.\n * The returned value can be passed directly to `.intercept()` or exported from a package.\n *\n * Two-arg form — define metadata and factory in one call:\n * ```ts\n * export const myInterceptor = defineInterceptor(\n * { name: 'my-interceptor', order: 10 },\n * () => ({\n * execute(ctx, next) { return next(); },\n * }),\n * );\n * ```\n *\n * Single-arg form — chain `.requires<T>()` for typed context, then `.factory()`:\n * ```ts\n * export const myInterceptor = defineInterceptor({ name: 'with-db' })\n * .requires<{ db: DB }>()\n * .factory(() => ({\n * execute(ctx, next) {\n * ctx.context.db; // typed!\n * return next();\n * },\n * }));\n * ```\n */\nexport function defineInterceptor<TArgs = unknown, TResult = unknown>(\n meta: InterceptorMeta,\n factory: InterceptorFactory<TArgs, TResult>,\n): PadroneInterceptorFn<TArgs, TResult>;\nexport function defineInterceptor(meta: InterceptorMeta): InterceptorDefBuilder;\nexport function defineInterceptor(\n meta: InterceptorMeta,\n factory?: InterceptorFactory<any, any, any>,\n): PadroneInterceptorFn<any, any, any> | InterceptorDefBuilder {\n if (factory) return buildInterceptorFn(meta, factory);\n const builder: InterceptorDefBuilder = {\n requires: () => builder as any,\n factory: (f) => buildInterceptorFn(meta, f) as any,\n };\n return builder;\n}\n\n// ---------------------------------------------------------------------------\n// Registration normalization\n// ---------------------------------------------------------------------------\n\n/**\n * Normalizes an interceptor input (single-value form or two-arg form) into the internal\n * `RegisteredInterceptor` storage format.\n */\nexport function toRegisteredInterceptor(\n metaOrFn: InterceptorMeta | PadroneInterceptorFn<any, any, any>,\n factory?: InterceptorFactory<any, any, any>,\n): RegisteredInterceptor {\n if (typeof metaOrFn === 'function') {\n // Single-value form: PadroneInterceptorFn (factory with meta as own properties)\n return {\n meta: { name: metaOrFn.name, id: metaOrFn.id, order: metaOrFn.order, disabled: metaOrFn.disabled, inherit: metaOrFn.inherit },\n factory: metaOrFn,\n };\n }\n // Two-arg form: (meta, factory)\n return { meta: metaOrFn, factory: factory! };\n}\n\n// ---------------------------------------------------------------------------\n// Factory resolution\n// ---------------------------------------------------------------------------\n\n/**\n * Resolves registered interceptors by calling their factories and merging the resulting\n * phase handlers with the static metadata. Uses a cache to ensure each factory is called\n * at most once per execution (so root interceptor closures are shared across all phases).\n */\nexport function resolveRegisteredInterceptors(\n registered: RegisteredInterceptor[],\n cache: Map<RegisteredInterceptor, ResolvedInterceptor>,\n): ResolvedInterceptor[] {\n return registered.map((reg) => {\n let resolved = cache.get(reg);\n if (!resolved) {\n resolved = { ...reg.meta, ...reg.factory() };\n cache.set(reg, resolved);\n }\n return resolved;\n });\n}\n\n// ---------------------------------------------------------------------------\n// Interceptor chain runner\n// ---------------------------------------------------------------------------\n\n/**\n * Deduplicates interceptors by `id`. When multiple interceptors share the same `id`,\n * only the last one in the array is kept. Interceptors without an `id` are always kept.\n */\nfunction deduplicateInterceptors(interceptors: ResolvedInterceptor[]): ResolvedInterceptor[] {\n // Fast path: no ids at all\n if (!interceptors.some((p) => p.id)) return interceptors;\n\n // Find the last index for each id\n const lastIndex = new Map<string, number>();\n for (let i = 0; i < interceptors.length; i++) {\n const id = interceptors[i]!.id;\n if (id) lastIndex.set(id, i);\n }\n\n return interceptors.filter((p, i) => !p.id || lastIndex.get(p.id) === i);\n}\n\n/**\n * Runs an interceptor chain for a given phase using the onion/middleware pattern.\n * Interceptors are sorted by `order` (ascending, stable), then composed so that\n * the first interceptor in sorted order is the outermost wrapper.\n * If no interceptors handle this phase, `core` is called directly.\n *\n * Each interceptor's `next()` accepts optional partial overrides that are merged\n * into the context before passing to the next interceptor or core function.\n */\nexport function runInterceptorChain<TCtx extends object, TResult>(\n phase: 'start' | 'parse' | 'route' | 'validate' | 'execute' | 'error' | 'shutdown',\n interceptors: ResolvedInterceptor[],\n ctx: TCtx,\n core: (ctx: TCtx) => TResult | Promise<TResult>,\n): TResult | Promise<TResult> {\n // Deduplicate by id (last wins), then filter to enabled interceptors that have a handler for this phase\n const deduped = deduplicateInterceptors(interceptors);\n const phaseInterceptors = deduped.filter((p) => p[phase] && !p.disabled);\n if (phaseInterceptors.length === 0) return core(ctx);\n\n // Stable sort by order (lower = outermost). Equal order preserves registration order.\n phaseInterceptors.sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n\n // Build chain from inside out: last interceptor wraps core, first interceptor is outermost\n let next: (currentCtx: TCtx) => TResult | Promise<TResult> = core;\n for (let i = phaseInterceptors.length - 1; i >= 0; i--) {\n const handler = phaseInterceptors[i]![phase]! as unknown as (\n ctx: TCtx,\n next: (overrides?: Record<string, unknown>) => TResult | Promise<TResult>,\n ) => TResult | Promise<TResult>;\n const prevNext = next;\n next = (currentCtx: TCtx) =>\n handler(currentCtx, (overrides?: Record<string, unknown>) => {\n if (!overrides) return prevNext(currentCtx);\n // Auto-merge context: `next({ context: { user } })` merges into existing context\n // instead of replacing it, so interceptors can't accidentally drop context.\n if (overrides.context != null && typeof overrides.context === 'object') {\n overrides = { ...overrides, context: Object.assign({}, (currentCtx as Record<string, unknown>).context, overrides.context) };\n }\n return prevNext(Object.assign({}, currentCtx, overrides) as TCtx);\n });\n }\n\n return next(ctx);\n}\n\n/**\n * Wraps a pipeline with start → error → shutdown lifecycle hooks.\n * - `start` interceptors wrap the pipeline (onion pattern, root interceptors only).\n * - On error: `error` interceptors run (can transform/suppress the error).\n * - Always: `shutdown` interceptors run (success or failure).\n */\nexport function wrapWithLifecycle<T>(\n interceptors: ResolvedInterceptor[],\n command: AnyPadroneCommand,\n input: string | undefined,\n pipeline: (signal: AbortSignal, context: unknown) => T | Promise<T>,\n wrapErrorResult?: (result: unknown) => T,\n signal?: AbortSignal,\n context?: unknown,\n runtime?: ResolvedPadroneRuntime,\n program?: AnyPadroneProgram,\n caller: 'cli' | 'eval' | 'run' | 'repl' | 'serve' | 'mcp' | 'tool' = 'eval',\n pipelineState?: { phase: InterceptorPipelinePhase; rawArgs?: Record<string, unknown>; positionalArgs?: string[]; args?: unknown },\n): T | Promise<T> {\n const defaultSignal = typeof AbortSignal !== 'undefined' ? AbortSignal.abort() : (undefined as unknown as AbortSignal);\n const hasStart = interceptors.some((p) => p.start);\n const hasError = interceptors.some((p) => p.error);\n const hasShutdown = interceptors.some((p) => p.shutdown);\n\n const effectivePipelineState = pipelineState ?? { phase: 'start' as const };\n\n // Fast path: no lifecycle interceptors\n if (!hasStart && !hasError && !hasShutdown) return pipeline(signal ?? defaultSignal, context);\n // Mutable refs: start-phase interceptors can override signal and context (e.g., signal extension, auth),\n // and the overrides propagate to error/shutdown contexts.\n let effectiveSignal = signal ?? defaultSignal;\n let effectiveContext = context;\n\n const runShutdown = (error?: unknown, result?: unknown) => {\n if (!hasShutdown) return;\n const ctx: InterceptorShutdownContext = {\n command,\n input,\n error,\n result,\n signal: effectiveSignal,\n context: effectiveContext as object,\n runtime: runtime!,\n program: program!,\n caller,\n ...effectivePipelineState,\n };\n return runInterceptorChain('shutdown', interceptors, ctx, () => {});\n };\n\n const runError = (error: unknown): T | Promise<T> => {\n if (!hasError) {\n const s = runShutdown(error);\n if (s instanceof Promise)\n return s.then(() => {\n throw error;\n });\n throw error;\n }\n const ctx: InterceptorErrorContext = {\n command,\n input,\n error,\n signal: effectiveSignal,\n context: effectiveContext as object,\n runtime: runtime!,\n program: program!,\n caller,\n ...effectivePipelineState,\n };\n const errorResult = runInterceptorChain('error', interceptors, ctx, (): InterceptorErrorResult => ({ error }));\n return thenMaybe(errorResult, (er) => {\n if (er.error !== undefined) {\n const s = runShutdown(er.error);\n return thenMaybe(s as void | Promise<void>, () => {\n throw er.error;\n });\n }\n const wrapped = wrapErrorResult ? wrapErrorResult(er.result) : (er.result as T);\n const s = runShutdown(undefined, wrapped);\n return thenMaybe(s as void | Promise<void>, () => wrapped);\n });\n };\n\n const handleSuccess = (result: T): T | Promise<T> => {\n const s = runShutdown(undefined, result);\n if (s instanceof Promise) return s.then(() => result);\n return result;\n };\n\n const startCtx: InterceptorStartContext = {\n command,\n signal: effectiveSignal,\n context: effectiveContext as object,\n runtime: runtime!,\n program: program!,\n input,\n caller,\n };\n let result: T | Promise<T>;\n try {\n result = (\n hasStart\n ? runInterceptorChain('start', interceptors, startCtx, (ctx) => {\n // Capture overrides from start-phase interceptors so downstream phases see them.\n effectiveSignal = ctx.signal;\n effectiveContext = ctx.context;\n return pipeline(ctx.signal, ctx.context);\n })\n : pipeline(effectiveSignal, effectiveContext)\n ) as T | Promise<T>;\n } catch (e) {\n return runError(e);\n }\n\n if (result instanceof Promise) {\n return result.then(handleSuccess, runError);\n }\n\n return handleSuccess(result);\n}\n\n/**\n * Wraps a command-level pipeline (validate + execute) with error → shutdown lifecycle hooks.\n * Unlike `wrapWithLifecycle`, this has no `start` phase and uses the resolved command context.\n * Only interceptors exclusive to the command chain (not in root) should be passed here.\n */\nexport function wrapWithCommandLifecycle<T>(\n interceptors: ResolvedInterceptor[],\n command: AnyPadroneCommand,\n input: string | undefined,\n pipeline: () => T | Promise<T>,\n wrapErrorResult: ((result: unknown) => T) | undefined,\n signal: AbortSignal,\n context: unknown,\n runtime: ResolvedPadroneRuntime,\n program: AnyPadroneProgram,\n caller: 'cli' | 'eval' | 'run' | 'repl' | 'serve' | 'mcp' | 'tool',\n pipelineState: { phase: InterceptorPipelinePhase; rawArgs?: Record<string, unknown>; positionalArgs?: string[]; args?: unknown },\n): T | Promise<T> {\n const hasError = interceptors.some((p) => p.error);\n const hasShutdown = interceptors.some((p) => p.shutdown);\n\n if (!hasError && !hasShutdown) return pipeline();\n\n const runShutdown = (error?: unknown, result?: unknown) => {\n if (!hasShutdown) return;\n const ctx: InterceptorShutdownContext = {\n command,\n input,\n error,\n result,\n signal,\n context: context as object,\n runtime,\n program,\n caller,\n ...pipelineState,\n };\n return runInterceptorChain('shutdown', interceptors, ctx, () => {});\n };\n\n const runError = (error: unknown): T | Promise<T> => {\n if (!hasError) {\n const s = runShutdown(error);\n if (s instanceof Promise)\n return s.then(() => {\n throw error;\n });\n throw error;\n }\n const ctx: InterceptorErrorContext = {\n command,\n input,\n error,\n signal,\n context: context as object,\n runtime,\n program,\n caller,\n ...pipelineState,\n };\n const errorResult = runInterceptorChain('error', interceptors, ctx, (): InterceptorErrorResult => ({ error }));\n return thenMaybe(errorResult, (er) => {\n if (er.error !== undefined) {\n const s = runShutdown(er.error);\n return thenMaybe(s as void | Promise<void>, () => {\n throw er.error;\n });\n }\n const wrapped = wrapErrorResult ? wrapErrorResult(er.result) : (er.result as T);\n const s = runShutdown(undefined, wrapped);\n return thenMaybe(s as void | Promise<void>, () => wrapped);\n });\n };\n\n const handleSuccess = (result: T): T | Promise<T> => {\n const s = runShutdown(undefined, result);\n if (s instanceof Promise) return s.then(() => result);\n return result;\n };\n\n let result: T | Promise<T>;\n try {\n result = pipeline();\n } catch (e) {\n return runError(e);\n }\n\n if (result instanceof Promise) {\n return result.then(handleSuccess, runError);\n }\n\n return handleSuccess(result);\n}\n","import { escapeHtml, type OutputContext } from './styling.ts';\n\n// ── Table ───────────────────────────────────────────────────────────────\n\nexport type TableOptions = {\n /** Explicit column keys to display (default: infer from first row's keys). */\n columns?: string[];\n /** Column key → display header name mapping. */\n headers?: Record<string, string>;\n /** Column key → text alignment. */\n align?: Record<string, 'left' | 'right' | 'center'>;\n /** Maximum column width before truncation. */\n maxColumnWidth?: number;\n /** Show borders (default: true for ansi/text, false for others). */\n border?: boolean;\n};\n\nfunction stringifyCell(value: unknown): string {\n if (value === undefined || value === null) return '';\n if (typeof value === 'string') return value;\n if (typeof value === 'number' || typeof value === 'boolean') return String(value);\n return JSON.stringify(value);\n}\n\nfunction truncate(text: string, max: number): string {\n if (max <= 0 || text.length <= max) return text;\n return max <= 1 ? '…' : `${text.slice(0, max - 1)}…`;\n}\n\nfunction padCell(text: string, width: number, alignment: 'left' | 'right' | 'center' = 'left'): string {\n const pad = width - text.length;\n if (pad <= 0) return text;\n if (alignment === 'right') return ' '.repeat(pad) + text;\n if (alignment === 'center') {\n const left = Math.floor(pad / 2);\n return ' '.repeat(left) + text + ' '.repeat(pad - left);\n }\n return text + ' '.repeat(pad);\n}\n\nexport function renderTable(data: Record<string, unknown>[], options: TableOptions | undefined, ctx: OutputContext): string {\n if (data.length === 0) return '';\n if (ctx.format === 'json') return JSON.stringify(data, null, 2);\n\n const columns = options?.columns ?? Object.keys(data[0]!);\n if (columns.length === 0) return '';\n\n const headers = columns.map((col) => options?.headers?.[col] ?? col);\n const maxCol = options?.maxColumnWidth;\n\n const rows = data.map((row) =>\n columns.map((col) => {\n const text = stringifyCell(row[col]);\n return maxCol ? truncate(text, maxCol) : text;\n }),\n );\n\n const colWidths = columns.map((_, i) => {\n const headerWidth = headers[i]!.length;\n const maxCellWidth = rows.reduce((max, row) => Math.max(max, row[i]!.length), 0);\n return Math.max(headerWidth, maxCellWidth);\n });\n\n const getAlign = (i: number): 'left' | 'right' | 'center' => options?.align?.[columns[i]!] ?? 'left';\n\n if (ctx.format === 'markdown') return renderTableMarkdown(headers, rows, colWidths, getAlign);\n if (ctx.format === 'html') return renderTableHtml(columns, headers, rows, data, getAlign);\n return renderTableText(headers, rows, colWidths, getAlign, options?.border !== false, ctx);\n}\n\nfunction renderTableText(\n headers: string[],\n rows: string[][],\n colWidths: number[],\n getAlign: (i: number) => 'left' | 'right' | 'center',\n border: boolean,\n ctx: OutputContext,\n): string {\n const { styler } = ctx;\n const formatRow = (cells: string[], style?: (s: string) => string) =>\n cells.map((cell, i) => {\n const padded = padCell(cell, colWidths[i]!, getAlign(i));\n return style ? style(padded) : padded;\n });\n\n if (border) {\n const sep = ctx.styler.meta('─');\n const divider = colWidths.map((w) => sep.repeat(w + 2)).join(styler.meta('┼'));\n const row = (cells: string[]) => cells.map((c, i) => ` ${padCell(c, colWidths[i]!, getAlign(i))} `).join(styler.meta('│'));\n const headerRow = row(headers.map((h) => styler.label(h)));\n const dataRows = rows.map((r) => row(r.map((c) => styler.description(c))));\n return [headerRow, styler.meta('─') + divider + styler.meta('─'), ...dataRows].join('\\n');\n }\n\n const headerCells = formatRow(headers, styler.label);\n const dataCells = rows.map((r) => formatRow(r, styler.description));\n const gap = ' ';\n return [headerCells.join(gap), ...dataCells.map((r) => r.join(gap))].join('\\n');\n}\n\nfunction renderTableMarkdown(\n headers: string[],\n rows: string[][],\n colWidths: number[],\n getAlign: (i: number) => 'left' | 'right' | 'center',\n): string {\n const headerLine = `| ${headers.map((h, i) => padCell(h, colWidths[i]!, 'left')).join(' | ')} |`;\n const separatorLine =\n '| ' +\n colWidths\n .map((w, i) => {\n const a = getAlign(i);\n const dashes = '─'.repeat(Math.max(w, 3));\n if (a === 'center') return `:${dashes}:`;\n if (a === 'right') return `${dashes}:`;\n return dashes;\n })\n .join(' | ') +\n ' |';\n const dataLines = rows.map((r) => `| ${r.map((c, i) => padCell(c, colWidths[i]!, 'left')).join(' | ')} |`);\n return [headerLine, separatorLine, ...dataLines].join('\\n');\n}\n\nfunction renderTableHtml(\n columns: string[],\n headers: string[],\n _rows: string[][],\n data: Record<string, unknown>[],\n getAlign: (i: number) => 'left' | 'right' | 'center',\n): string {\n const ths = headers.map((h, i) => {\n const a = getAlign(i);\n const style = a !== 'left' ? ` style=\"text-align: ${a};\"` : '';\n return `<th${style}>${escapeHtml(h)}</th>`;\n });\n const trs = data.map(\n (row) =>\n '<tr>' +\n columns\n .map((col, i) => {\n const a = getAlign(i);\n const style = a !== 'left' ? ` style=\"text-align: ${a};\"` : '';\n return `<td${style}>${escapeHtml(stringifyCell(row[col]))}</td>`;\n })\n .join('') +\n '</tr>',\n );\n return `<table><thead><tr>${ths.join('')}</tr></thead><tbody>${trs.join('')}</tbody></table>`;\n}\n\n// ── Tree ────────────────────────────────────────────────────────────────\n\nexport type TreeNode = {\n label: string;\n children?: TreeNode[];\n};\n\nexport type TreeOptions = {\n /** Characters per indent level (default: 2). */\n indent?: number;\n /** Show tree guide lines (default: true for ansi/text). */\n guides?: boolean;\n};\n\nexport function renderTree(data: TreeNode | TreeNode[], options: TreeOptions | undefined, ctx: OutputContext): string {\n const nodes = Array.isArray(data) ? data : [data];\n if (nodes.length === 0) return '';\n if (ctx.format === 'json') return JSON.stringify(nodes, null, 2);\n if (ctx.format === 'markdown') return renderTreeMarkdown(nodes, 0);\n if (ctx.format === 'html') return renderTreeHtml(nodes);\n\n const guides = options?.guides !== false;\n return renderTreeText(nodes, '', guides, ctx).join('\\n');\n}\n\nfunction renderTreeText(nodes: TreeNode[], prefix: string, guides: boolean, ctx: OutputContext): string[] {\n const lines: string[] = [];\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i]!;\n const isLast = i === nodes.length - 1;\n if (guides) {\n const connector = isLast ? '└── ' : '├── ';\n const childPrefix = isLast ? ' ' : '│ ';\n lines.push(prefix + ctx.styler.meta(connector) + ctx.styler.label(node.label));\n if (node.children?.length) lines.push(...renderTreeText(node.children, prefix + ctx.styler.meta(childPrefix), guides, ctx));\n } else {\n const indent = prefix ? `${prefix} ` : '';\n lines.push(indent + ctx.styler.label(node.label));\n if (node.children?.length) lines.push(...renderTreeText(node.children, indent, guides, ctx));\n }\n }\n return lines;\n}\n\nfunction renderTreeMarkdown(nodes: TreeNode[], depth: number): string {\n return nodes\n .map((node) => {\n const indent = ' '.repeat(depth);\n const line = `${indent}- ${node.label}`;\n if (!node.children?.length) return line;\n return `${line}\\n${renderTreeMarkdown(node.children, depth + 1)}`;\n })\n .join('\\n');\n}\n\nfunction renderTreeHtml(nodes: TreeNode[]): string {\n const items = nodes\n .map((node) => {\n const label = escapeHtml(node.label);\n if (!node.children?.length) return `<li>${label}</li>`;\n return `<li>${label}${renderTreeHtml(node.children)}</li>`;\n })\n .join('');\n return `<ul>${items}</ul>`;\n}\n\n// ── List ────────────────────────────────────────────────────────────────\n\nexport type ListItem = string | { label: string; description?: string };\n\nexport type ListOptions = {\n /** Bullet character (default: '•' for ansi, '-' for text). */\n bullet?: string;\n /** Use numbered list instead of bullets. */\n numbered?: boolean;\n /** Indent level (default: 0). */\n indent?: number;\n};\n\nexport function renderList(data: ListItem[], options: ListOptions | undefined, ctx: OutputContext): string {\n if (data.length === 0) return '';\n if (ctx.format === 'json') {\n const normalized = data.map((item) => (typeof item === 'string' ? { label: item } : item));\n return JSON.stringify(normalized, null, 2);\n }\n if (ctx.format === 'markdown') return renderListMarkdown(data, options);\n if (ctx.format === 'html') return renderListHtml(data, options);\n return renderListText(data, options, ctx);\n}\n\nfunction renderListText(data: ListItem[], options: ListOptions | undefined, ctx: OutputContext): string {\n const { styler } = ctx;\n const numbered = options?.numbered ?? false;\n const bullet = options?.bullet ?? (ctx.format === 'ansi' ? '•' : '-');\n const baseIndent = ' '.repeat(options?.indent ?? 0);\n\n return data\n .map((item, i) => {\n const prefix = numbered ? `${i + 1}.` : bullet;\n const label = typeof item === 'string' ? item : item.label;\n const desc = typeof item === 'object' && item.description ? item.description : undefined;\n const line = `${baseIndent}${styler.meta(prefix)} ${styler.label(label)}`;\n if (!desc) return line;\n return `${line} ${styler.description(desc)}`;\n })\n .join('\\n');\n}\n\nfunction renderListMarkdown(data: ListItem[], options: ListOptions | undefined): string {\n const numbered = options?.numbered ?? false;\n return data\n .map((item, i) => {\n const prefix = numbered ? `${i + 1}.` : '-';\n const label = typeof item === 'string' ? item : item.label;\n const desc = typeof item === 'object' && item.description ? item.description : undefined;\n if (!desc) return `${prefix} ${label}`;\n return `${prefix} **${label}** — ${desc}`;\n })\n .join('\\n');\n}\n\nfunction renderListHtml(data: ListItem[], options: ListOptions | undefined): string {\n const tag = options?.numbered ? 'ol' : 'ul';\n const items = data\n .map((item) => {\n const label = typeof item === 'string' ? item : item.label;\n const desc = typeof item === 'object' && item.description ? item.description : undefined;\n if (!desc) return `<li>${escapeHtml(label)}</li>`;\n return `<li><strong>${escapeHtml(label)}</strong> — ${escapeHtml(desc)}</li>`;\n })\n .join('');\n return `<${tag}>${items}</${tag}>`;\n}\n\n// ── Key-Value ───────────────────────────────────────────────────────────\n\nexport type KeyValueOptions = {\n /** Separator between key and value (default: ': '). */\n separator?: string;\n /** Align values by padding keys to the same width. */\n align?: boolean;\n /** Key → display label mapping. */\n labels?: Record<string, string>;\n};\n\nexport function renderKeyValue(data: Record<string, unknown>, options: KeyValueOptions | undefined, ctx: OutputContext): string {\n const entries = Object.entries(data);\n if (entries.length === 0) return '';\n if (ctx.format === 'json') return JSON.stringify(data, null, 2);\n if (ctx.format === 'markdown') return renderKeyValueMarkdown(entries, options);\n if (ctx.format === 'html') return renderKeyValueHtml(entries, options);\n return renderKeyValueText(entries, options, ctx);\n}\n\nfunction getLabel(key: string, labels?: Record<string, string>): string {\n return labels?.[key] ?? key;\n}\n\nfunction renderKeyValueText(entries: [string, unknown][], options: KeyValueOptions | undefined, ctx: OutputContext): string {\n const { styler } = ctx;\n const sep = options?.separator ?? ': ';\n const shouldAlign = options?.align !== false;\n\n const displayLabels = entries.map(([k]) => getLabel(k, options?.labels));\n const maxWidth = shouldAlign ? Math.max(...displayLabels.map((l) => l.length)) : 0;\n\n return entries\n .map(([_key, value], i) => {\n const label = displayLabels[i]!;\n const paddedLabel = shouldAlign ? label + ' '.repeat(maxWidth - label.length) : label;\n return `${styler.label(paddedLabel)}${styler.meta(sep)}${styler.description(stringifyCell(value))}`;\n })\n .join('\\n');\n}\n\nfunction renderKeyValueMarkdown(entries: [string, unknown][], options: KeyValueOptions | undefined): string {\n return entries.map(([key, value]) => `- **${getLabel(key, options?.labels)}**: ${stringifyCell(value)}`).join('\\n');\n}\n\nfunction renderKeyValueHtml(entries: [string, unknown][], options: KeyValueOptions | undefined): string {\n const items = entries\n .map(([key, value]) => `<dt>${escapeHtml(getLabel(key, options?.labels))}</dt><dd>${escapeHtml(stringifyCell(value))}</dd>`)\n .join('');\n return `<dl>${items}</dl>`;\n}\n","import type { KeyValueOptions, ListItem, ListOptions, TableOptions, TreeNode, TreeOptions } from './primitives.ts';\nimport { renderKeyValue, renderList, renderTable, renderTree } from './primitives.ts';\nimport type { OutputContext } from './styling.ts';\n\n/**\n * Runtime output helper injected into action context as `ctx.context.output`.\n * Provides format-aware output primitives (table, tree, list, key-value).\n *\n * Each method renders data using the resolved format (ANSI, text, JSON, markdown, HTML)\n * and writes it to the runtime's output function.\n */\nexport type PadroneOutputIndicator = {\n /** Render data as a table. */\n table(data: Record<string, unknown>[], options?: TableOptions): void;\n /** Render data as a tree. */\n tree(data: TreeNode | TreeNode[], options?: TreeOptions): void;\n /** Render data as a list. */\n list(data: ListItem[], options?: ListOptions): void;\n /** Render data as aligned key-value pairs. */\n kv(data: Record<string, unknown>, options?: KeyValueOptions): void;\n /** Write raw output (same as runtime.output but sets the \"already called\" flag). */\n raw(...args: unknown[]): void;\n /** Whether any output method has been called. */\n readonly called: boolean;\n};\n\n/** Declarative output configuration for a command. */\nexport type OutputPrimitiveType = 'table' | 'tree' | 'list' | 'kv' | 'json';\nexport type OutputConfig =\n | OutputPrimitiveType\n | { type: OutputPrimitiveType; options?: TableOptions | TreeOptions | ListOptions | KeyValueOptions };\n\n/** Create an output indicator that renders through the given output function and format context. */\nexport function createOutputIndicator(outputFn: (...args: unknown[]) => void, ctx: OutputContext): PadroneOutputIndicator {\n let _called = false;\n\n const emit = (rendered: string) => {\n _called = true;\n outputFn(rendered);\n };\n\n return {\n table(data, options) {\n emit(renderTable(data, options, ctx));\n },\n tree(data, options) {\n emit(renderTree(data, options, ctx));\n },\n list(data, options) {\n emit(renderList(data, options, ctx));\n },\n kv(data, options) {\n emit(renderKeyValue(data, options, ctx));\n },\n raw(...args) {\n _called = true;\n outputFn(...args);\n },\n get called() {\n return _called;\n },\n };\n}\n\n/** Format a return value using a declarative output config. */\nexport function formatDeclarativeOutput(value: unknown, config: OutputConfig, ctx: OutputContext): string | undefined {\n const type = typeof config === 'string' ? config : config.type;\n const options = typeof config === 'object' ? config.options : undefined;\n\n switch (type) {\n case 'table':\n if (!Array.isArray(value)) return undefined;\n return renderTable(value as Record<string, unknown>[], options as TableOptions | undefined, ctx);\n case 'tree':\n return renderTree(value as TreeNode | TreeNode[], options as TreeOptions | undefined, ctx);\n case 'list':\n if (!Array.isArray(value)) return undefined;\n return renderList(value as ListItem[], options as ListOptions | undefined, ctx);\n case 'kv':\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return undefined;\n return renderKeyValue(value as Record<string, unknown>, options as KeyValueOptions | undefined, ctx);\n case 'json':\n return JSON.stringify(value, null, 2);\n default:\n return undefined;\n }\n}\n","import { defineInterceptor } from '../core/interceptors.ts';\nimport { isAsyncIterator, isIterator } from '../core/results.ts';\nimport type { OutputConfig } from '../output/output-indicator.ts';\nimport { createOutputIndicator, formatDeclarativeOutput } from '../output/output-indicator.ts';\nimport { resolveOutputFormat } from '../output/styling.ts';\nimport type {\n AnyPadroneBuilder,\n CommandTypesBase,\n InterceptorErrorContext,\n InterceptorErrorResult,\n InterceptorExecuteContext,\n InterceptorExecuteResult,\n} from '../types/index.ts';\n\n// ── Helpers ─────────────────────────────────────────────────────────────\n\n/**\n * Outputs each value and collects into a result.\n * For iterators: outputs each yielded value, returns collected array.\n * For promises: awaits, then recurses.\n * For other values: outputs directly, returns as-is.\n */\nfunction outputAndCollect(value: unknown, output: (...args: unknown[]) => void): unknown {\n if (value == null) return value;\n\n if (isAsyncIterator(value)) {\n return (async () => {\n const items: unknown[] = [];\n const iter = (value as any)[Symbol.asyncIterator]();\n while (true) {\n const { done, value: item } = await iter.next();\n if (done) break;\n items.push(item);\n if (item != null) output(item);\n }\n return items;\n })();\n }\n\n if (typeof value !== 'string' && !Array.isArray(value) && isIterator(value)) {\n const items: unknown[] = [];\n const iter = (value as any)[Symbol.iterator]();\n while (true) {\n const { done, value: item } = iter.next();\n if (done) break;\n items.push(item);\n if (item != null) output(item);\n }\n return items;\n }\n\n if (value instanceof Promise) {\n return value.then((resolved) => outputAndCollect(resolved, output));\n }\n\n output(value);\n return value;\n}\n\n// ── Interceptor ─────────────────────────────────────────────────────────\n\nconst autoOutputMeta = { id: 'padrone:auto-output', name: 'padrone:auto-output', order: -1100 } as const;\n\nfunction createAutoOutputInterceptor(outputConfig?: OutputConfig, errorOutput?: boolean) {\n return defineInterceptor(autoOutputMeta, () => ({\n error(ctx: InterceptorErrorContext, next: () => InterceptorErrorResult | Promise<InterceptorErrorResult>) {\n const handleResult = (er: InterceptorErrorResult): InterceptorErrorResult => {\n if (!er.error || errorOutput === false || ctx.caller !== 'cli' || ctx.phase !== 'execute') return er;\n const message = er.error instanceof Error ? er.error.message : String(er.error);\n ctx.runtime.error(message);\n return er;\n };\n\n const result = next();\n if (result instanceof Promise) return result.then(handleResult);\n return handleResult(result);\n },\n execute(ctx: InterceptorExecuteContext, next) {\n const outputCtx = resolveOutputFormat(ctx.runtime, ctx.caller);\n const indicator = createOutputIndicator(ctx.runtime.output, outputCtx);\n\n const handleResult = (e: InterceptorExecuteResult): InterceptorExecuteResult | Promise<InterceptorExecuteResult> => {\n // If the action already called output.*, skip auto-output\n if (indicator.called) return e;\n\n const autoOutput = (value: unknown): unknown => {\n if (value == null) return value;\n\n // Declarative output config: format the return value through the primitive\n if (outputConfig) {\n const rendered = formatDeclarativeOutput(value, outputConfig, outputCtx);\n if (rendered !== undefined) {\n ctx.runtime.output(rendered);\n return value;\n }\n }\n\n return outputAndCollect(value, ctx.runtime.output);\n };\n\n if (e.result instanceof Promise) {\n return { result: e.result.then(autoOutput) };\n }\n\n const collected = autoOutput(e.result);\n if (collected instanceof Promise) return collected.then((v) => ({ result: v }));\n return { result: collected };\n };\n\n const executedOrPromise = next({ context: { output: indicator } });\n if (executedOrPromise instanceof Promise) return executedOrPromise.then(handleResult);\n return handleResult(executedOrPromise);\n },\n }));\n}\n\n// ── Extension ───────────────────────────────────────────────────────────\n\nexport type PadroneAutoOutputOptions = {\n /** Disable auto-output entirely. */\n disabled?: boolean;\n /**\n * Declarative output format for the command's return value.\n * When set, auto-output formats the return value through the specified primitive\n * instead of passing it raw to `runtime.output`.\n * Ignored when the action calls `ctx.context.output.*` explicitly.\n *\n * ```ts\n * // Format return value as a table\n * c.extend(padroneAutoOutput({ output: 'table' }))\n *\n * // Format with options\n * c.extend(padroneAutoOutput({ output: { type: 'table', options: { border: false } } }))\n * ```\n */\n output?: OutputConfig;\n /**\n * Automatically print unhandled errors to stderr in CLI mode.\n * Skips errors already handled by other extensions (routing, validation, signal).\n * @default true\n */\n errorOutput?: boolean;\n};\n\n/**\n * Extension that automatically writes a command's return value to output after execution.\n *\n * - Values are passed directly to the runtime's `output` function (no stringification).\n * - Promises are awaited before output.\n * - Iterators and async iterators are consumed, outputting each yielded value as it arrives.\n * The result is replaced with the collected array so `drain()` still works.\n * - `undefined` and `null` results produce no output.\n *\n * Also injects `ctx.context.output` with format-aware output primitives (table, tree, list, kv).\n * When action handlers use these methods, auto-output skips to avoid double output.\n *\n * Included in the default extensions. Can also be applied per-command:\n * ```ts\n * createPadrone('my-cli')\n * .command('users', (c) =>\n * c.extend(padroneAutoOutput({ output: 'table' }))\n * .action(() => fetchUsers())\n * )\n * ```\n */\nexport function padroneAutoOutput(options?: PadroneAutoOutputOptions): <T extends CommandTypesBase>(builder: T) => T {\n const interceptor = options?.disabled\n ? defineInterceptor({ ...autoOutputMeta, disabled: true }, () => ({}))\n : createAutoOutputInterceptor(options?.output, options?.errorOutput);\n return ((builder: AnyPadroneBuilder) => builder.intercept(interceptor)) as any;\n}\n","import { thenMaybe } from '#src/core/results.ts';\nimport { defineInterceptor } from '../core/interceptors.ts';\nimport type { AnyPadroneBuilder, CommandTypesBase } from '../types/index.ts';\n\n// ── Interceptor ─────────────────────────────────────────────────────────\n\nconst colorInterceptor = defineInterceptor({ id: 'padrone:color', name: 'padrone:color', order: -1001 }, () => ({\n parse(ctx, next) {\n return thenMaybe(next(), (res) => {\n if ('color' in res.rawArgs) {\n const color = res.rawArgs.color;\n delete res.rawArgs.color;\n\n ctx.runtime.theme = color as any;\n }\n return res;\n });\n },\n}));\n\n// ── Extension ────────────────────────────────────────────────────────────\n\n/**\n * Extension that handles `--color` / `--no-color` flags:\n * - `--color` or `--color=true` → use default theme\n * - `--color=false` or `--no-color` → disable colors (text format)\n * - `--color=<theme>` → use the named theme\n *\n * Modifies the runtime's format and theme accordingly.\n *\n * Usage:\n * ```ts\n * createPadrone('my-cli').extend(padroneColor())\n * ```\n */\nexport function padroneColor(): <T extends CommandTypesBase>(builder: T) => T {\n return ((builder: AnyPadroneBuilder) => builder.intercept(colorInterceptor)) as any;\n}\n","type ParseParts = {\n /**\n * An alphanumeric term representing a command, subcommand, or positional argument.\n * Note that a term can be ambiguous until fully matched within the command hierarchy.\n * We cannot fully distinguish between a nested command or a positional argument until\n * the command structure is known.\n */\n term: {\n type: 'term';\n value: string;\n };\n /**\n * A positional argument provided to the command.\n * Unlike `term`, this is definitively an argument. This can be determined when\n * the argument is non-alphanumeric, like a path or a number.\n */\n arg: {\n type: 'arg';\n value: string;\n };\n /**\n * An arg provided to the command, prefixed with `--`.\n * If the arg has an `=` sign, the value after it is used as the arg's value.\n * Otherwise, the value is obtained from the next part or set to `true` if no value is provided.\n * The key is an array representing the path for nested args (e.g., `--user.id=123` becomes `['user', 'id']`).\n */\n named: {\n type: 'named';\n key: string[];\n value?: string | string[];\n negated?: boolean;\n };\n /**\n * An alias arg provided to the command, prefixed with `-`.\n * Which arg it maps to cannot be determined until the command structure is known.\n * Aliases cannot be nested, so the key is always a single-element array.\n */\n alias: {\n type: 'alias';\n key: string[];\n value?: string | string[];\n };\n};\n\ntype ParsePart = ParseParts[keyof ParseParts];\n\ntype QuoteChar = '\"' | \"'\" | '`';\n\n/**\n * Split a string by a delimiter, respecting quoted segments and optional bracket nesting.\n * Handles escape sequences within quotes (\\\\\" and \\\\\\\\).\n */\nfunction splitQuoteAware(input: string, delimiter: ' ' | ',', opts?: { brackets?: boolean; trim?: boolean }): string[] {\n const results: string[] = [];\n let current = '';\n let inQuote: QuoteChar | null = null;\n let bracketDepth = 0;\n let i = 0;\n\n while (i < input.length) {\n const char = input[i];\n\n if (inQuote) {\n if (char === '\\\\' && i + 1 < input.length) {\n const nextChar = input[i + 1];\n if (nextChar === inQuote || nextChar === '\\\\') {\n current += nextChar;\n i += 2;\n continue;\n }\n }\n if (char === inQuote) {\n inQuote = null;\n } else {\n current += char;\n }\n } else if (opts?.brackets && char === '[') {\n bracketDepth++;\n current += char;\n } else if (opts?.brackets && char === ']') {\n bracketDepth = Math.max(0, bracketDepth - 1);\n current += char;\n } else if (bracketDepth > 0) {\n current += char;\n } else if (char === '\"' || char === \"'\" || char === '`') {\n inQuote = char;\n } else if (char === delimiter || (delimiter === ' ' && char === '\\t')) {\n if (delimiter === ' ' ? current : true) {\n results.push(opts?.trim ? current.trim() : current);\n current = '';\n }\n } else {\n current += char;\n }\n i++;\n }\n\n if (delimiter === ' ' ? current : current || results.length > 0) {\n results.push(opts?.trim ? current.trim() : current);\n }\n\n return results;\n}\n\nexport function parseCliInputToParts(input: string): ParsePart[] {\n const parts = splitQuoteAware(input.trim(), ' ', { brackets: true });\n const result: ParsePart[] = [];\n\n // Index into `result` of the last part that can accept a pending value (-1 = none)\n let pendingIdx = -1;\n // Once a non-term positional arg appears, all subsequent bare values become args\n let allowTerm = true;\n let afterDoubleDash = false;\n\n for (const part of parts) {\n if (!part) continue;\n\n // Bare `--` separator: everything after is a literal positional arg\n if (part === '--' && !afterDoubleDash) {\n pendingIdx = -1;\n afterDoubleDash = true;\n allowTerm = false;\n continue;\n }\n\n if (afterDoubleDash) {\n result.push({ type: 'arg', value: part });\n continue;\n }\n\n const hadPending = pendingIdx;\n pendingIdx = -1;\n\n if (part.startsWith('--no-') && part.length > 5) {\n // Negated boolean arg (--no-verbose or --no-config.debug)\n const key = part.slice(5).split('.');\n result.push({ type: 'named', key, value: undefined, negated: true });\n } else if (part.startsWith('--')) {\n const [keyStr = '', value] = splitNamedArgValue(part.slice(2));\n const key = keyStr.split('.');\n result.push({ type: 'named', key, value });\n if (typeof value === 'undefined') pendingIdx = result.length - 1;\n } else if (part.startsWith('-') && part.length > 1 && !/^-\\d/.test(part)) {\n // Short flag(s) (but not negative numbers like -5)\n // Supports flag stacking: -abc → -a -b -c (last flag can take a value)\n const [keyStr = '', value] = splitNamedArgValue(part.slice(1));\n\n if (keyStr.length > 1 && typeof value === 'undefined') {\n // Flag stacking: -abc → -a, -b, -c (all set to true except last which can take next arg's value)\n for (let ci = 0; ci < keyStr.length - 1; ci++) {\n result.push({ type: 'alias', key: [keyStr[ci]!], value: undefined });\n }\n result.push({ type: 'alias', key: [keyStr[keyStr.length - 1]!], value: undefined });\n pendingIdx = result.length - 1;\n } else if (keyStr.length > 1 && typeof value !== 'undefined') {\n // -abc=val → -a, -b, -c=val (stacked with value on last)\n for (let ci = 0; ci < keyStr.length - 1; ci++) {\n result.push({ type: 'alias', key: [keyStr[ci]!], value: undefined });\n }\n result.push({ type: 'alias', key: [keyStr[keyStr.length - 1]!], value });\n } else {\n // Single char: -v or -v=value\n result.push({ type: 'alias', key: [keyStr], value });\n if (typeof value === 'undefined') pendingIdx = result.length - 1;\n }\n } else if (hadPending >= 0) {\n result[hadPending]!.value = part;\n } else if (/^[a-zA-Z0-9_-]+$/.test(part) && allowTerm) {\n result.push({ type: 'term', value: part });\n } else {\n result.push({ type: 'arg', value: part });\n allowTerm = false;\n }\n }\n return result;\n}\n\n/**\n * Split named arg key and value, handling quoted values after =.\n */\nfunction splitNamedArgValue(str: string): [string, string | string[] | undefined] {\n const eqIndex = str.indexOf('=');\n if (eqIndex === -1) return [str, undefined];\n\n const key = str.slice(0, eqIndex);\n let value = str.slice(eqIndex + 1);\n\n // Remove surrounding quotes from value if present\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\")) ||\n (value.startsWith('`') && value.endsWith('`'))\n ) {\n value = value.slice(1, -1);\n return [key, value];\n }\n\n // Handle array syntax: [a,b,c] -> ['a', 'b', 'c']\n if (value.startsWith('[') && value.endsWith(']')) {\n const inner = value.slice(1, -1);\n if (inner === '') return [key, []];\n return [key, splitQuoteAware(inner, ',', { trim: true })];\n }\n\n return [key, value];\n}\n\n/**\n * Sets a value at a nested path in an object.\n * For example: setNestedValue(obj, ['user', 'profile', 'name'], 'John')\n * Creates intermediate objects as needed.\n */\nexport function setNestedValue(obj: Record<string, unknown>, path: string[], value: unknown): void {\n let current: Record<string, unknown> = obj;\n\n for (let i = 0; i < path.length - 1; i++) {\n const part = path[i]!;\n if (!(part in current) || typeof current[part] !== 'object' || current[part] === null) {\n current[part] = {};\n }\n current = current[part] as Record<string, unknown>;\n }\n\n const lastPart = path[path.length - 1]!;\n current[lastPart] = value;\n}\n\n/**\n * Gets a value at a nested path in an object.\n * Returns undefined if the path doesn't exist.\n */\nexport function getNestedValue(obj: Record<string, unknown>, path: string[]): unknown {\n let current: unknown = obj;\n\n for (const part of path) {\n if (current === null || current === undefined || typeof current !== 'object') {\n return undefined;\n }\n current = (current as Record<string, unknown>)[part];\n }\n\n return current;\n}\n","import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport type { AnyPadroneCommand, InterceptorValidateResult } from '../types/index.ts';\nimport { coerceArgs, detectUnknownArgs, extractSchemaMetadata, getJsonSchema, parsePositionalConfig, preprocessArgs } from './args.ts';\nimport { getCommandRuntime } from './commands.ts';\nimport { getNestedValue, parseCliInputToParts, setNestedValue } from './parse.ts';\nimport { thenMaybe } from './results.ts';\n\n/**\n * Parses CLI input to find the command and extract raw arguments without validation.\n */\nexport function parseCommand(input: string | undefined, rootCommand: AnyPadroneCommand, findCommandByName: FindCommandFn) {\n input ??= getCommandRuntime(rootCommand).argv().join(' ') || undefined;\n if (!input) {\n const defaultCommand = findCommandByName('', rootCommand.commands);\n if (defaultCommand) {\n return { command: defaultCommand, rawArgs: {} as Record<string, unknown>, args: [] as string[], unmatchedTerms: [] as string[] };\n }\n return { command: rootCommand, rawArgs: {} as Record<string, unknown>, args: [] as string[], unmatchedTerms: [] as string[] };\n }\n\n const parts = parseCliInputToParts(input);\n\n const terms = parts.filter((p) => p.type === 'term').map((p) => p.value);\n const argTokens = parts.filter((p) => p.type === 'arg').map((p) => p.value);\n\n let curCommand: AnyPadroneCommand | undefined = rootCommand;\n let unmatchedTerms: string[] = [];\n\n if (terms[0] === rootCommand.name) terms.shift();\n\n for (let i = 0; i < terms.length; i++) {\n const term = terms[i] || '';\n const found = findCommandByName(term, curCommand.commands);\n\n if (found) {\n curCommand = found;\n } else {\n unmatchedTerms = terms.slice(i);\n argTokens.unshift(...unmatchedTerms);\n break;\n }\n }\n\n if (unmatchedTerms.length === 0 && curCommand.commands?.length) {\n const defaultCommand = findCommandByName('', curCommand.commands);\n if (defaultCommand) curCommand = defaultCommand;\n }\n\n if (!curCommand) return { command: rootCommand, rawArgs: {} as Record<string, unknown>, args: argTokens, unmatchedTerms };\n\n const argsMeta = curCommand.meta?.fields;\n const schemaMetadata = curCommand.argsSchema\n ? extractSchemaMetadata(curCommand.argsSchema, argsMeta, curCommand.meta?.autoAlias)\n : { flags: {}, aliases: {}, negatives: {}, customNegation: new Set<string>() };\n const { flags, aliases, negatives, customNegation } = schemaMetadata;\n\n const arrayArguments = new Set<string>();\n if (curCommand.argsSchema) {\n try {\n const jsonSchema = getJsonSchema(curCommand.argsSchema) as Record<string, any>;\n if (jsonSchema.type === 'object' && jsonSchema.properties) {\n for (const [key, prop] of Object.entries(jsonSchema.properties as Record<string, any>)) {\n if (prop?.type === 'array') arrayArguments.add(key);\n }\n }\n } catch {\n // Ignore schema parsing errors\n }\n }\n\n const argParts = parts.filter((p) => p.type === 'named' || p.type === 'alias');\n const rawArgs: Record<string, unknown> = {};\n\n for (const arg of argParts) {\n let key: string[];\n if (arg.type === 'alias' && arg.key.length === 1 && flags[arg.key[0]!]) {\n key = [flags[arg.key[0]!]!];\n } else if (arg.type === 'named' && arg.key.length === 1 && aliases[arg.key[0]!]) {\n key = [aliases[arg.key[0]!]!];\n } else if (arg.type === 'named' && arg.key.length === 1 && negatives[arg.key[0]!]) {\n // Negative keyword: --remote sets local to false\n setNestedValue(rawArgs, [negatives[arg.key[0]!]!], false);\n continue;\n } else {\n key = arg.key;\n }\n\n const rootKey = key[0]!;\n\n if (arg.type === 'named' && arg.negated) {\n // Skip --no- prefix negation for args with custom negation\n if (customNegation.has(rootKey)) {\n // Treat as unknown: put it back as `no-<key>` so detectUnknownArgs catches it\n setNestedValue(rawArgs, [`no-${key.join('.')}`], false);\n continue;\n }\n setNestedValue(rawArgs, key, false);\n continue;\n }\n\n const value = arg.value ?? true;\n\n if (arrayArguments.has(rootKey)) {\n const existing = getNestedValue(rawArgs, key);\n if (existing !== undefined) {\n if (Array.isArray(existing)) {\n if (Array.isArray(value)) existing.push(...value);\n else existing.push(value);\n } else {\n if (Array.isArray(value)) setNestedValue(rawArgs, key, [existing, ...value]);\n else setNestedValue(rawArgs, key, [existing, value]);\n }\n } else {\n setNestedValue(rawArgs, key, Array.isArray(value) ? value : [value]);\n }\n } else {\n const existing = getNestedValue(rawArgs, key);\n if (existing !== undefined) {\n if (Array.isArray(existing)) {\n if (Array.isArray(value)) existing.push(...value);\n else existing.push(value);\n } else {\n if (Array.isArray(value)) setNestedValue(rawArgs, key, [existing, ...value]);\n else setNestedValue(rawArgs, key, [existing, value]);\n }\n } else {\n setNestedValue(rawArgs, key, value);\n }\n }\n }\n\n return { command: curCommand, rawArgs, args: argTokens, unmatchedTerms };\n}\n\ntype FindCommandFn = (name: string, commands?: AnyPadroneCommand[]) => AnyPadroneCommand | undefined;\n\n/**\n * Preprocesses raw arguments: maps positional arguments and performs auto-coercion.\n * External data sources (stdin, env, config) are handled by extensions before this runs.\n */\nexport function buildCommandArgs(\n command: AnyPadroneCommand,\n rawArgs: Record<string, unknown>,\n positionalArgs: string[],\n): { args: Record<string, unknown>; issues?: StandardSchemaV1.Issue[] } {\n let preprocessedArgs = preprocessArgs(rawArgs, { flags: {}, aliases: {} });\n let issues: StandardSchemaV1.Issue[] | undefined;\n\n const positionalConfig = command.meta?.positional ? parsePositionalConfig(command.meta.positional) : [];\n\n if (positionalConfig.length > 0) {\n let argIndex = 0;\n for (let i = 0; i < positionalConfig.length; i++) {\n const { name, variadic } = positionalConfig[i]!;\n if (argIndex >= positionalArgs.length) break;\n\n // Detect ambiguity: same arg provided both positionally and as a named option\n if (name in preprocessedArgs) {\n issues ??= [];\n issues.push({ path: [name], message: `Ambiguous argument \"${name}\": provided both positionally and as a named option` });\n continue;\n }\n\n if (variadic) {\n const remainingPositionals = positionalConfig.slice(i + 1);\n const nonVariadicAfter = remainingPositionals.filter((p) => !p.variadic).length;\n const variadicEnd = positionalArgs.length - nonVariadicAfter;\n preprocessedArgs[name] = positionalArgs.slice(argIndex, variadicEnd);\n argIndex = variadicEnd;\n } else if (i === positionalConfig.length - 1 && positionalArgs.length > argIndex + 1) {\n preprocessedArgs[name] = positionalArgs.slice(argIndex).join(' ');\n argIndex = positionalArgs.length;\n } else {\n preprocessedArgs[name] = positionalArgs[argIndex];\n argIndex++;\n }\n }\n }\n\n if (command.argsSchema) {\n preprocessedArgs = coerceArgs(preprocessedArgs, command.argsSchema);\n }\n\n return { args: preprocessedArgs, issues };\n}\n\n/**\n * Detects unknown options in args that aren't defined in the schema.\n * Returns unknown key info with suggestions, or empty array if schema is loose.\n */\nexport function checkUnknownArgs(command: AnyPadroneCommand, preprocessedArgs: Record<string, unknown>): { key: string }[] {\n if (!command.argsSchema) {\n const unknowns: { key: string }[] = [];\n for (const key of Object.keys(preprocessedArgs)) {\n unknowns.push({ key });\n }\n return unknowns;\n }\n\n const argsMeta = command.meta?.fields;\n const { flags, aliases, negatives } = extractSchemaMetadata(command.argsSchema, argsMeta, command.meta?.autoAlias);\n\n return detectUnknownArgs(preprocessedArgs, command.argsSchema, flags, aliases, negatives);\n}\n\n/**\n * Validates preprocessed arguments against the command's schema.\n * First checks for unknown args (strict by default), then runs schema validation.\n * Returns sync or async result depending on the schema's validate method.\n */\nexport function validateCommandArgs(command: AnyPadroneCommand, preprocessedArgs: Record<string, unknown>) {\n const unknownArgs = checkUnknownArgs(command, preprocessedArgs);\n if (unknownArgs.length > 0) {\n const issues: StandardSchemaV1.Issue[] = unknownArgs.map(({ key }) => ({\n path: [key],\n message: `Unknown option: \"${key}\"`,\n }));\n return { args: undefined, argsResult: { issues } as any };\n }\n\n const argsParsed = command.argsSchema ? command.argsSchema['~standard'].validate(preprocessedArgs) : { value: {} };\n\n const buildResult = (parsed: StandardSchemaV1.Result<unknown>) => ({\n args: parsed.issues ? undefined : (parsed.value as any),\n argsResult: parsed as any,\n });\n\n return thenMaybe(argsParsed, buildResult);\n}\n\n/**\n * Returns the list of known option names from a command's schema (for fuzzy suggestion).\n */\nexport function getKnownOptionNames(command: AnyPadroneCommand): string[] {\n if (!command.argsSchema) return [];\n try {\n const js = getJsonSchema(command.argsSchema) as Record<string, any>;\n if (js.type === 'object' && js.properties) return Object.keys(js.properties);\n } catch {\n /* ignore */\n }\n return [];\n}\n\n/**\n * Formats validation issue messages for display.\n */\nexport function formatIssueMessages(issues: readonly StandardSchemaV1.Issue[]): string {\n return issues.map((i) => ` - ${i.path?.join('.') || 'root'}: ${i.message}`).join('\\n');\n}\n\n/**\n * Core validate function for parse() — preprocesses and validates CLI args.\n * Used by the parse program method (lighter weight than the full exec pipeline).\n * External data sources (stdin, env, config) are not resolved here — use eval() for that.\n */\nexport function coreValidateForParse(\n command: AnyPadroneCommand,\n rawArgs: Record<string, unknown>,\n positionalArgs: string[],\n): InterceptorValidateResult | Promise<InterceptorValidateResult> {\n const { args: preprocessedArgs, issues } = buildCommandArgs(command, rawArgs, positionalArgs);\n if (issues) return { args: undefined, argsResult: { issues } as any };\n const validated = validateCommandArgs(command, preprocessedArgs);\n return thenMaybe(validated, (v) => v as InterceptorValidateResult);\n}\n","import type { AnyPadroneCommand, PadroneSchema } from '../types/index.ts';\n\ntype SchemaShape = Record<string, 'string' | 'string[]' | 'boolean'>;\n\ntype InferPassthroughSchema<T extends SchemaShape> = {\n [K in keyof T]: T[K] extends 'string' ? string : T[K] extends 'string[]' ? string[] : T[K] extends 'boolean' ? boolean : never;\n};\n\n/** Minimal Standard Schema that passes through known fields, ignoring unknown ones. */\nexport function passthroughSchema<TShape extends SchemaShape>(fields: TShape): PadroneSchema<InferPassthroughSchema<TShape>> {\n return {\n '~standard': {\n version: 1 as const,\n vendor: 'padrone' as const,\n jsonSchema: {\n input: () => ({}),\n output: () => ({}),\n },\n validate: (value) => {\n const input = value && typeof value === 'object' ? (value as Record<string, unknown>) : {};\n const result: Record<string, unknown> = {};\n for (const [name, type] of Object.entries(fields)) {\n const v = input[name];\n if (v === undefined) continue;\n if (type === 'string[]') {\n if (Array.isArray(v)) result[name] = v.map(String);\n else if (typeof v === 'string') result[name] = [v];\n } else if (type === 'string') {\n if (typeof v === 'string') result[name] = v;\n else if (Array.isArray(v) && v.length > 0) result[name] = String(v[0]);\n } else if (type === 'boolean') {\n result[name] = v === true || v === 'true';\n }\n }\n return { value: result as InferPassthroughSchema<TShape> };\n },\n },\n };\n}\n\n/** Find a command by space-separated name in the command tree. */\nexport function findCommandInTree(name: string, rootCommand: AnyPadroneCommand): AnyPadroneCommand | undefined {\n const parts = name.split(' ').filter(Boolean);\n let current = rootCommand;\n for (const part of parts) {\n const found = current.commands?.find((c) => c.name === part || c.aliases?.includes(part));\n if (!found) return undefined;\n current = found;\n }\n return current;\n}\n","import { resolveAllCommands, resolveCommand } from '../core/commands.ts';\nimport { RoutingError, ValidationError } from '../core/errors.ts';\nimport { defineInterceptor } from '../core/interceptors.ts';\nimport { thenMaybe } from '../core/results.ts';\nimport { formatIssueMessages } from '../core/validate.ts';\nimport type { HelpDetail, HelpFormat } from '../output/formatter.ts';\nimport { generateHelp } from '../output/help.ts';\nimport type { AnyPadroneBuilder, AnyPadroneCommand, CommandTypesBase, PadroneCommand } from '../types/index.ts';\nimport type { PadroneSchema } from '../types/schema.ts';\nimport type { WithCommand } from '../util/type-utils.ts';\nimport { getRootCommand } from '../util/utils.ts';\nimport { findCommandInTree, passthroughSchema } from './utils.ts';\n\n// ── Types ────────────────────────────────────────────────────────────────\n\ntype HelpArgs = { command?: string[]; detail?: HelpDetail; format?: HelpFormat; all?: boolean };\n\nexport type HelpCommand = PadroneCommand<'help', '', PadroneSchema<HelpArgs>, string, [], ['h', ''], false>;\n\nexport type WithHelp<T> = WithCommand<T, 'help', HelpCommand>;\n\n// ── Interceptor ─────────────────────────────────────────────────────────\n\nconst helpInterceptor = defineInterceptor({ id: 'padrone:help', name: 'padrone:help', order: -1000 }, () => {\n let helpText: string | undefined;\n let showDefaultHelp = false;\n\n return {\n parse(ctx, next) {\n return thenMaybe(next(), (res) => {\n const hasHelpFlag = res.rawArgs.help || res.rawArgs.h;\n const reverseHelp = !hasHelpFlag && res.positionalArgs?.length > 0 && res.positionalArgs[res.positionalArgs.length - 1] === 'help';\n\n if (hasHelpFlag || reverseHelp) {\n delete res.rawArgs.help;\n delete res.rawArgs.h;\n\n const detail = res.rawArgs.detail as HelpDetail | undefined;\n const format = res.rawArgs.format as HelpFormat | undefined;\n const all = res.rawArgs.all as boolean | undefined;\n delete res.rawArgs.detail;\n delete res.rawArgs.format;\n delete res.rawArgs.all;\n delete res.rawArgs.d;\n delete res.rawArgs.f;\n\n const rootCommand = getRootCommand(res.command);\n resolveAllCommands(rootCommand);\n\n helpText = generateHelp(rootCommand, res.command, {\n detail,\n format: format ?? ctx.runtime.format,\n theme: ctx.runtime.theme,\n all,\n terminal: ctx.runtime.terminal,\n env: ctx.runtime.env(),\n });\n return res;\n }\n\n // Track whether the parsed command has no action (for default help in execute phase)\n if (helpText === undefined) {\n const { command } = res;\n const hasSubcommands = command.commands && command.commands.length > 0;\n const hasSchema = command.argsSchema != null;\n const hasUnmatchedTerms = res.positionalArgs?.length > 0 && !command.meta?.positional?.length;\n if (!command.action && (hasSubcommands || !hasSchema) && !hasUnmatchedTerms) {\n showDefaultHelp = true;\n }\n }\n\n return res;\n });\n },\n validate(_ctx, next) {\n if (helpText !== undefined) return { args: undefined as any, argsResult: { value: undefined } as any };\n return next();\n },\n execute(ctx, next) {\n if (helpText !== undefined) return { result: helpText };\n if (showDefaultHelp) {\n const rootCommand = getRootCommand(ctx.command);\n resolveAllCommands(rootCommand);\n return {\n result: generateHelp(rootCommand, ctx.command, {\n format: ctx.runtime.format,\n theme: ctx.runtime.theme,\n terminal: ctx.runtime.terminal,\n env: ctx.runtime.env(),\n }),\n };\n }\n return next();\n },\n error(ctx, next) {\n return thenMaybe(next(), (er) => {\n if (ctx.caller !== 'cli' || !er.error) return er;\n\n const rootCommand = getRootCommand(ctx.command);\n\n if (er.error instanceof RoutingError) {\n const targetPath = er.error.command;\n const targetCommand = targetPath ? findCommandInTree(targetPath, rootCommand) : undefined;\n const sourceCmd = targetCommand ?? rootCommand;\n\n ctx.runtime.error(er.error.message);\n\n if (er.error.suggestions.length > 0) {\n const visibleCommands = (sourceCmd.commands ?? []).filter((c: AnyPadroneCommand) => !c.hidden && c.name);\n if (visibleCommands.length > 0) {\n for (const cmd of visibleCommands) resolveCommand(cmd);\n const cmdList = visibleCommands.map((c: AnyPadroneCommand) => c.name).join(', ');\n ctx.runtime.output(`\\nAvailable commands: ${cmdList}`);\n }\n } else {\n resolveAllCommands(rootCommand);\n const helpText = generateHelp(rootCommand, sourceCmd, {\n format: ctx.runtime.format,\n theme: ctx.runtime.theme,\n terminal: ctx.runtime.terminal,\n env: ctx.runtime.env(),\n });\n ctx.runtime.error(helpText);\n }\n\n return er;\n }\n\n if (er.error instanceof ValidationError) {\n const targetPath = er.error.command;\n const targetCommand = targetPath ? findCommandInTree(targetPath, rootCommand) : undefined;\n const issueMessages = formatIssueMessages(er.error.issues);\n\n resolveAllCommands(rootCommand);\n const helpText = generateHelp(rootCommand, targetCommand ?? rootCommand, {\n format: ctx.runtime.format,\n theme: ctx.runtime.theme,\n terminal: ctx.runtime.terminal,\n env: ctx.runtime.env(),\n });\n ctx.runtime.error(`Validation error:\\n${issueMessages}`);\n ctx.runtime.error(helpText);\n\n return er;\n }\n\n return er;\n });\n },\n };\n});\n\n// ── Extension ────────────────────────────────────────────────────────────\n\n/**\n * Extension that adds help support:\n * - `help` command with aliases `h` and `` (empty = executes on root when no subcommand matches)\n * - `--help` / `-h` flags\n * - `<cmd> help` reverse syntax\n * - Default help display when a command has no action\n *\n * Usage:\n * ```ts\n * createPadrone('my-cli').extend(padroneHelp())\n * ```\n */\nexport function padroneHelp(): <T extends CommandTypesBase>(builder: T) => WithHelp<T> {\n return ((builder: AnyPadroneBuilder) =>\n builder\n .command(['help', 'h'], (c) =>\n c\n .configure({ description: 'Display help for a command', hidden: true })\n .arguments(passthroughSchema({ command: 'string[]', detail: 'string', format: 'string', all: 'boolean' }), {\n positional: ['...command'],\n })\n .action((args, ctx) => {\n const rootCommand = getRootCommand(ctx.command);\n resolveAllCommands(rootCommand);\n const commandName = args.command?.join(' ');\n const targetCommand = commandName ? findCommandInTree(commandName, rootCommand) : rootCommand;\n return generateHelp(rootCommand, targetCommand ?? rootCommand, {\n detail: args.detail as HelpDetail,\n format: (args.format as HelpFormat) ?? ctx.runtime.format,\n theme: ctx.runtime.theme,\n all: args.all,\n terminal: ctx.runtime.terminal,\n env: ctx.runtime.env(),\n });\n }),\n )\n .intercept(helpInterceptor)) as any;\n}\n","import { getJsonSchema } from '../core/args.ts';\nimport type { InteractivePromptConfig, ResolvedPadroneRuntime } from '../core/runtime.ts';\nimport type { AnyPadroneCommand } from '../types/index.ts';\n\n/**\n * Auto-detect the prompt type for a field based on its JSON schema property definition.\n */\nexport function detectPromptConfig(\n name: string,\n propSchema: Record<string, any> | undefined,\n description?: string,\n): InteractivePromptConfig {\n const message = description || propSchema?.description || name;\n\n if (!propSchema) return { name, message, type: 'input' };\n\n if (propSchema.type === 'boolean') {\n return { name, message, type: 'confirm', default: propSchema.default };\n }\n\n if (propSchema.enum) {\n return {\n name,\n message,\n type: 'select',\n choices: propSchema.enum.map((v: unknown) => ({ label: String(v), value: v })),\n default: propSchema.default,\n };\n }\n\n if (propSchema.type === 'array' && propSchema.items?.enum) {\n return {\n name,\n message,\n type: 'multiselect',\n choices: propSchema.items.enum.map((v: unknown) => ({ label: String(v), value: v })),\n default: propSchema.default,\n };\n }\n\n if (propSchema.format === 'password') {\n return { name, message, type: 'password', default: propSchema.default };\n }\n\n return { name, message, type: 'input', default: propSchema.default };\n}\n\n/**\n * Prompt a single field and validate it against the command's schema.\n * Re-prompts with a warning until the user provides a valid value.\n */\nasync function promptWithValidation(\n field: string,\n config: InteractivePromptConfig,\n currentData: Record<string, unknown>,\n command: AnyPadroneCommand,\n runtime: ResolvedPadroneRuntime,\n): Promise<unknown> {\n let promptConfig = config;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const value = await runtime.prompt!(promptConfig);\n\n if (!command.argsSchema) return value;\n\n // Validate the full object with the new value to catch field-level issues\n const testData = { ...currentData, [field]: value };\n const validated = await command.argsSchema['~standard'].validate(testData);\n\n if (!validated.issues) return value;\n\n // Only keep issues whose path starts with this field\n const fieldIssues = validated.issues.filter((issue: { path?: ReadonlyArray<PropertyKey> }) => {\n const rootKey = issue.path?.[0];\n return rootKey !== undefined && String(rootKey) === field;\n });\n\n if (fieldIssues.length === 0) return value;\n\n // Warn the user and re-prompt with the invalid value as default\n const messages = fieldIssues.map((i: { message: string }) => i.message).join('; ');\n runtime.error(`Invalid value for \"${field}\": ${messages}`);\n promptConfig = { ...config, default: value };\n }\n}\n\n/**\n * Prompt for missing interactive fields.\n * Runs after env/config preprocessing and before schema validation.\n *\n * When `force` is true, all configured interactive fields are prompted even if they already\n * have values. The current values are used as defaults in the prompts.\n */\nexport async function promptInteractiveFields(\n data: Record<string, unknown>,\n command: AnyPadroneCommand,\n runtime: ResolvedPadroneRuntime,\n force?: boolean,\n): Promise<Record<string, unknown>> {\n if (!runtime.prompt) return data;\n\n const meta = command.meta;\n const interactiveConfig = meta?.interactive;\n const optionalInteractiveConfig = meta?.optionalInteractive;\n if (!interactiveConfig && !optionalInteractiveConfig) return data;\n\n // Extract JSON schema properties for prompt type detection\n let jsonProperties: Record<string, any> = {};\n let requiredFields: Set<string> = new Set();\n if (command.argsSchema) {\n try {\n const jsonSchema = getJsonSchema(command.argsSchema) as Record<string, any>;\n if (jsonSchema.type === 'object' && jsonSchema.properties) {\n jsonProperties = jsonSchema.properties;\n }\n if (Array.isArray(jsonSchema.required)) {\n requiredFields = new Set(jsonSchema.required);\n }\n } catch {\n // Ignore schema parsing errors\n }\n }\n\n const fieldDescriptions: Record<string, string | undefined> = {};\n if (meta?.fields) {\n for (const [key, value] of Object.entries(meta.fields)) {\n if (value?.description) fieldDescriptions[key] = value.description;\n }\n }\n\n const result = { ...data };\n\n // Determine which required interactive fields to prompt\n let fieldsToPrompt: string[] = [];\n if (interactiveConfig === true) {\n if (force) {\n // When forced, prompt all required fields regardless of current value\n fieldsToPrompt = [...requiredFields];\n } else {\n // All required fields that are missing\n fieldsToPrompt = [...requiredFields].filter((name) => result[name] === undefined);\n }\n } else if (Array.isArray(interactiveConfig)) {\n if (force) {\n fieldsToPrompt = [...interactiveConfig];\n } else {\n fieldsToPrompt = interactiveConfig.filter((name) => result[name] === undefined);\n }\n }\n\n // Prompt each required interactive field with per-field validation\n for (const field of fieldsToPrompt) {\n const config = detectPromptConfig(field, jsonProperties[field], fieldDescriptions[field]);\n // When forced, use the current value as the default\n if (force && result[field] !== undefined) {\n config.default = result[field];\n }\n result[field] = await promptWithValidation(field, config, result, command, runtime);\n }\n\n // Determine optional interactive fields\n let optionalFields: string[] = [];\n if (optionalInteractiveConfig === true) {\n if (force) {\n // When forced, include all non-required fields (even those with values)\n const allKeys = Object.keys(jsonProperties);\n optionalFields = allKeys.filter((name) => !requiredFields.has(name));\n } else {\n // All non-required fields that are still missing\n const allKeys = Object.keys(jsonProperties);\n optionalFields = allKeys.filter((name) => !requiredFields.has(name) && result[name] === undefined);\n }\n } else if (Array.isArray(optionalInteractiveConfig)) {\n if (force) {\n optionalFields = [...optionalInteractiveConfig];\n } else {\n optionalFields = optionalInteractiveConfig.filter((name) => result[name] === undefined);\n }\n }\n\n // Show multiselect for optional fields, then prompt selected ones\n if (optionalFields.length > 0) {\n const selected = (await runtime.prompt({\n name: '_optionalFields',\n message: 'Would you also like to configure:',\n type: 'multiselect',\n choices: optionalFields.map((f) => {\n const label = fieldDescriptions[f] || jsonProperties[f]?.description || f;\n const currentValue = result[f];\n // When forced, show current value next to the label for fields that already have values\n const displayLabel = force && currentValue !== undefined ? `${label} (current: ${currentValue})` : label;\n return { label: displayLabel, value: f };\n }),\n })) as string[];\n\n if (Array.isArray(selected)) {\n for (const field of selected) {\n const config = detectPromptConfig(field, jsonProperties[field], fieldDescriptions[field]);\n // When forced, use the current value as the default\n if (force && result[field] !== undefined) {\n config.default = result[field];\n }\n result[field] = await promptWithValidation(field, config, result, command, runtime);\n }\n }\n }\n\n return result;\n}\n","import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { defineInterceptor } from '../core/interceptors.ts';\nimport { hasInteractiveConfig, thenMaybe } from '../core/results.ts';\nimport { buildCommandArgs, checkUnknownArgs } from '../core/validate.ts';\nimport { promptInteractiveFields } from '../feature/interactive.ts';\nimport type { AnyPadroneBuilder, CommandTypesBase, InterceptorValidateContext, InterceptorValidateResult } from '../types/index.ts';\n\n// ── Interceptor ─────────────────────────────────────────────────────────\n\nconst interactiveInterceptor = defineInterceptor({ id: 'padrone:interactive', name: 'padrone:interactive', order: -999 }, () => ({\n validate(ctx: InterceptorValidateContext, next) {\n // Extract --interactive / -i flags from rawArgs\n let flagInteractive: boolean | undefined;\n if (hasInteractiveConfig(ctx.command.meta)) {\n if (ctx.rawArgs.interactive !== undefined) {\n flagInteractive = ctx.rawArgs.interactive !== false && ctx.rawArgs.interactive !== 'false';\n delete ctx.rawArgs.interactive;\n }\n if (ctx.rawArgs.i !== undefined) {\n flagInteractive = ctx.rawArgs.i !== false && ctx.rawArgs.i !== 'false';\n delete ctx.rawArgs.i;\n }\n }\n\n // Resolve effective interactivity\n const { runtime, command } = ctx;\n const runtimeDefault: boolean | undefined =\n runtime.interactive === 'forced' ? true : runtime.interactive === 'disabled' ? false : undefined;\n const effectiveInteractive: boolean | undefined = flagInteractive ?? ctx.evalInteractive ?? runtimeDefault;\n const commandUsesStdin = !!command.meta?.stdin;\n const stdinIsPiped = commandUsesStdin && (runtime.stdin ? !runtime.stdin.isTTY : runtime.terminal?.isTTY !== true);\n const interactivitySuppressed =\n runtime.interactive === 'unsupported' || effectiveInteractive === false || (stdinIsPiped && effectiveInteractive !== true);\n const forceInteractive = !interactivitySuppressed && effectiveInteractive === true;\n\n const willPrompt = !interactivitySuppressed && runtime.prompt && hasInteractiveConfig(command.meta);\n if (!willPrompt) return next();\n\n // Preprocess args to determine what's missing\n const { args: preprocessedArgs, issues: positionalIssues } = buildCommandArgs(command, ctx.rawArgs, ctx.positionalArgs);\n if (positionalIssues) return { args: undefined, argsResult: { issues: positionalIssues } } as any;\n\n // Check for unknown args before prompting\n const unknowns = checkUnknownArgs(command, preprocessedArgs);\n if (unknowns.length > 0) {\n const issues: StandardSchemaV1.Issue[] = unknowns.map(({ key }) => ({\n path: [key],\n message: `Unknown option: \"${key}\"`,\n }));\n return { args: undefined, argsResult: { issues } } as any;\n }\n\n // Early-validate provided fields — fail fast on user-supplied errors before prompting\n const earlyValidateAndPrompt = (): InterceptorValidateResult | Promise<InterceptorValidateResult> => {\n if (command.argsSchema) {\n const providedKeys = new Set(Object.keys(preprocessedArgs).filter((k) => preprocessedArgs[k] !== undefined));\n const earlyCheck = command.argsSchema['~standard'].validate(preprocessedArgs);\n\n const checkForProvidedFieldErrors = (result: StandardSchemaV1.Result<unknown>): InterceptorValidateResult | undefined => {\n if (!result.issues) return undefined;\n const providedFieldIssues = result.issues.filter((issue: StandardSchemaV1.Issue) => {\n const rootKey = issue.path?.[0];\n return rootKey !== undefined && providedKeys.has(String(rootKey));\n });\n if (providedFieldIssues.length > 0) return { args: undefined, argsResult: { issues: providedFieldIssues } as any };\n return undefined;\n };\n\n const earlyResult = thenMaybe(earlyCheck, (result) => checkForProvidedFieldErrors(result) ?? undefined);\n if (earlyResult instanceof Promise) {\n return earlyResult.then((err) => (err ? err : doPrompt()));\n }\n if (earlyResult) return earlyResult;\n }\n\n return doPrompt();\n };\n\n // Prompt for missing fields, then pass filled args to downstream validation via next()\n const doPrompt = (): InterceptorValidateResult | Promise<InterceptorValidateResult> => {\n const afterInteractive = promptInteractiveFields(preprocessedArgs, command, runtime, forceInteractive || undefined);\n\n return thenMaybe(afterInteractive, (filledArgs) => {\n // Pass preprocessed+prompted args downstream with empty positionalArgs (already mapped)\n return next({ rawArgs: filledArgs, positionalArgs: [] });\n });\n };\n\n return earlyValidateAndPrompt();\n },\n}));\n\n// ── Extension ────────────────────────────────────────────────────────────\n\n/**\n * Extension that handles interactive prompting for missing arguments.\n * Extracts `--interactive` / `-i` flags, resolves effective interactivity,\n * and prompts for missing fields before passing filled args to validation.\n *\n * Usage:\n * ```ts\n * createPadrone('my-cli').extend(padroneInteractive())\n * ```\n */\nexport function padroneInteractive(): <T extends CommandTypesBase>(builder: T) => T {\n return ((builder: AnyPadroneBuilder) => builder.intercept(interactiveInterceptor)) as any;\n}\n","import { defineInterceptor } from '../core/interceptors.ts';\nimport { parseCliInputToParts } from '../core/parse.ts';\nimport { withDrain } from '../core/results.ts';\nimport type {\n AnyPadroneBuilder,\n AnyPadroneCommand,\n CommandTypesBase,\n InterceptorStartContext,\n PadroneCommand,\n PadroneReplPreferences,\n} from '../types/index.ts';\nimport type { PadroneSchema } from '../types/schema.ts';\nimport type { WithCommand } from '../util/type-utils.ts';\nimport { passthroughSchema } from './utils.ts';\n\n// ── Types ────────────────────────────────────────────────────────────────\n\ntype ReplArgs = { scope?: string };\n\ntype ReplCommand = PadroneCommand<'repl', '', PadroneSchema<ReplArgs>, void, [], [], true>;\n\nexport type WithRepl<T> = WithCommand<T, 'repl', ReplCommand>;\n\n// ── Extension ────────────────────────────────────────────────────────────\n\n/**\n * Extension that adds REPL support:\n * - `repl` command that starts an interactive REPL\n * - `--repl` flag that starts the REPL from any invocation\n *\n * Usage:\n * ```ts\n * createPadrone('my-cli').extend(padroneRepl())\n * ```\n */\nexport function padroneRepl(\n defaults?: PadroneReplPreferences & { disabled?: boolean },\n): <T extends CommandTypesBase>(builder: T) => WithRepl<T> {\n const disabled = defaults?.disabled;\n return ((builder: AnyPadroneBuilder) =>\n builder\n .command('repl', (c) =>\n c\n .configure({ description: 'Start an interactive REPL', hidden: true })\n .arguments(passthroughSchema({ scope: 'string' }), { positional: ['scope'] })\n .async()\n .action(async (args, ctx) => {\n const prefs: PadroneReplPreferences = { ...defaults, scope: args.scope ?? defaults?.scope };\n const repl = ctx.program.repl(prefs);\n const { value } = await repl.drain();\n return value;\n }),\n )\n .intercept(createReplInterceptor(defaults, disabled))) as any;\n}\n\nfunction createReplInterceptor(defaults?: PadroneReplPreferences, disabled?: boolean) {\n return defineInterceptor({ id: 'padrone:repl', name: 'padrone:repl', order: -1000, disabled }, () => ({\n start(ctx: InterceptorStartContext, next: () => unknown) {\n const replInfo = checkReplFlag(ctx.input, ctx.command);\n if (!replInfo) return next();\n\n const program = ctx.program;\n if (!program?.repl) return next();\n\n const prefs: PadroneReplPreferences = { ...defaults, scope: replInfo.scope ?? defaults?.scope };\n\n // Return a Promise so the pipeline awaits the REPL result\n return program\n .repl(prefs)\n .drain()\n .then((r: any) => withDrain({ command: ctx.command, args: undefined, result: r.value }));\n },\n }));\n}\n\n/** Check for --repl flag in input. */\nfunction checkReplFlag(input: string | undefined, rootCommand: AnyPadroneCommand): { scope?: string } | null {\n if (!input) return null;\n\n const parts = parseCliInputToParts(input);\n const terms = parts.filter((p) => p.type === 'term').map((p) => p.value);\n const args = parts.filter((p) => p.type === 'named');\n const keyIs = (key: string[], name: string) => key.length === 1 && key[0] === name;\n\n const hasReplFlag = args.some((p) => p.type === 'named' && keyIs(p.key, 'repl'));\n if (!hasReplFlag) return null;\n\n const normalizedTerms = [...terms];\n if (normalizedTerms[0] === rootCommand.name) normalizedTerms.shift();\n\n const scope = normalizedTerms.length > 0 ? normalizedTerms.join(' ') : undefined;\n return { scope };\n}\n","import { SignalError, signalExitCode } from '../core/errors.ts';\nimport { defineInterceptor } from '../core/interceptors.ts';\nimport { thenMaybe } from '../core/results.ts';\nimport type { PadroneSignal } from '../core/runtime.ts';\nimport type { AnyPadroneBuilder, CommandTypesBase } from '../types/index.ts';\n\n// ── Interceptor ─────────────────────────────────────────────────────────\n\nconst signalMeta = { id: 'padrone:signal', name: 'padrone:signal', order: -2000 } as const;\n\nconst signalInterceptor = defineInterceptor(signalMeta, () => {\n const abortController = new AbortController();\n let receivedSignal: PadroneSignal | undefined;\n let lastSigintTime = 0;\n let unsubscribe: (() => void) | undefined;\n const DOUBLE_SIGINT_MS = 2000;\n\n const cleanup = () => {\n unsubscribe?.();\n unsubscribe = undefined;\n };\n\n const attachSignalInfo = <T>(result: T): T => {\n if (receivedSignal && result && typeof result === 'object') {\n (result as any).signal = receivedSignal;\n (result as any).exitCode = signalExitCode(receivedSignal);\n }\n return result;\n };\n\n return {\n start(ctx, next) {\n const runtimeExit = ctx.runtime.exit;\n unsubscribe = ctx.runtime.onSignal?.((sig) => {\n if (abortController.signal.aborted) {\n if (sig === 'SIGINT') {\n const elapsed = Date.now() - lastSigintTime;\n if (elapsed > 0 && elapsed < DOUBLE_SIGINT_MS) {\n runtimeExit?.(signalExitCode(sig));\n }\n lastSigintTime = Date.now();\n }\n return;\n }\n if (sig === 'SIGINT') lastSigintTime = Date.now();\n receivedSignal = sig;\n abortController.abort(sig);\n });\n\n const result = next({ signal: abortController.signal });\n return thenMaybe(result, (r) => {\n cleanup();\n return attachSignalInfo(r);\n });\n },\n error(_ctx, next) {\n return thenMaybe(next(), (er) => {\n if (receivedSignal && er.error instanceof Error) {\n er.error = new SignalError(receivedSignal, { cause: er.error });\n }\n return er;\n });\n },\n shutdown(_ctx, next) {\n cleanup();\n return next();\n },\n };\n});\n\n// ── Extension ───────────────────────────────────────────────────────────\n\n/**\n * Extension that wires process signal handling (SIGINT, SIGTERM, SIGHUP) into the interceptor lifecycle.\n *\n * - Creates an `AbortController` whose signal is propagated to all downstream phases.\n * - Subscribes to `runtime.onSignal` to forward OS signals to the abort controller.\n * - Implements SIGINT double-tap: two SIGINTs within 2 seconds force-exits the process.\n * - Attaches `signal` and `exitCode` to results and errors when interrupted.\n * - Cleans up the signal subscription on completion or failure.\n *\n * Included in the default extensions. Runs at order `-2000` (outermost).\n */\nexport function padroneSignalHandling(options?: { disabled?: boolean }): <T extends CommandTypesBase>(builder: T) => T {\n const interceptor = options?.disabled ? defineInterceptor({ ...signalMeta, disabled: true }, () => ({})) : signalInterceptor;\n return ((builder: AnyPadroneBuilder) => builder.intercept(interceptor)) as any;\n}\n","import { applyValues, isArrayField, isAsyncStreamField } from '../core/args.ts';\nimport { resolveStdin, resolveStdinAlways } from '../core/default-runtime.ts';\nimport { defineInterceptor } from '../core/interceptors.ts';\nimport type { AnyPadroneBuilder, CommandTypesBase, InterceptorValidateContext } from '../types/index.ts';\nimport { createStdinStream } from '../util/stream.ts';\n\n// ── Interceptor ─────────────────────────────────────────────────────────\n\nconst stdinInterceptor = defineInterceptor({ id: 'padrone:stdin', name: 'padrone:stdin', order: -1001 }, () => ({\n validate(ctx: InterceptorValidateContext, next) {\n const stdinField = ctx.command.meta?.stdin;\n if (!stdinField) return next();\n\n // Skip if the field was already provided via CLI flags\n if (stdinField in ctx.rawArgs && ctx.rawArgs[stdinField] !== undefined) return next();\n\n const streamInfo = isAsyncStreamField(ctx.command.argsSchema, stdinField);\n if (streamInfo) {\n const stdinForStream = resolveStdinAlways(ctx.runtime as any);\n const mergedRawArgs = applyValues(ctx.rawArgs, { [stdinField]: createStdinStream(stdinForStream, streamInfo.itemSchema) });\n return next({ rawArgs: mergedRawArgs });\n }\n\n const stdin = resolveStdin(ctx.runtime as any);\n if (!stdin) return next();\n\n if (isArrayField(ctx.command.argsSchema, stdinField)) {\n return (async () => {\n const lines: string[] = [];\n for await (const line of stdin.lines()) {\n lines.push(line);\n }\n const mergedRawArgs = applyValues(ctx.rawArgs, { [stdinField]: lines });\n return next({ rawArgs: mergedRawArgs });\n })();\n }\n\n return stdin.text().then((text) => {\n if (!text) return next();\n const mergedRawArgs = applyValues(ctx.rawArgs, { [stdinField]: text });\n return next({ rawArgs: mergedRawArgs });\n });\n },\n}));\n\n// ── Extension ────────────────────────────────────────────────────────────\n\n/**\n * Extension that reads stdin data into the argument field specified by `meta.stdin`.\n * Included by default via `createPadrone()`.\n *\n * Read mode is inferred from the schema type:\n * - `string` field → reads all stdin as a single string\n * - `string[]` field → reads stdin line-by-line into an array\n * - `AsyncIterable` field → returns a stream for line-by-line async consumption\n *\n * Stdin is only read when piped (not a TTY) and the field wasn't already provided via CLI flags.\n */\nexport function padroneStdin(options?: { disabled?: boolean }): <T extends CommandTypesBase>(builder: T) => T {\n const interceptor = options?.disabled ? defineInterceptor({ ...stdinInterceptor, disabled: true }, () => ({})) : stdinInterceptor;\n return ((builder: AnyPadroneBuilder) => builder.intercept(interceptor)) as any;\n}\n","import { resolveCommand, suggestSimilar } from '../core/commands.ts';\nimport { RoutingError } from '../core/errors.ts';\nimport { defineInterceptor } from '../core/interceptors.ts';\nimport { thenMaybe } from '../core/results.ts';\nimport { getKnownOptionNames } from '../core/validate.ts';\nimport type { AnyPadroneBuilder, AnyPadroneCommand, CommandTypesBase } from '../types/index.ts';\n\nfunction formatSuggestions(names: string[], prefix = ''): string {\n if (names.length === 0) return '';\n const quoted = names.map((n) => `\"${prefix}${n}\"`);\n if (quoted.length === 1) return `Did you mean ${quoted[0]}?`;\n return `Did you mean ${quoted.slice(0, -1).join(', ')} or ${quoted.at(-1)}?`;\n}\n\nfunction findSourceCommand(commandPath: string | undefined, root: AnyPadroneCommand): AnyPadroneCommand {\n if (!commandPath || commandPath === root.name || commandPath === root.path) return root;\n const parts = commandPath.split(' ');\n let current = root;\n for (const part of parts) {\n const found = current.commands?.find((c) => {\n resolveCommand(c);\n return c.name === part || c.aliases?.includes(part);\n });\n if (found) current = found;\n else break;\n }\n return current;\n}\n\nfunction enrichRoutingError(err: unknown, rootCommand: AnyPadroneCommand): unknown {\n if (!(err instanceof RoutingError)) return err;\n\n const unknownMatch = err.message.match(/^Unknown command: (\\S+)/);\n const unexpectedMatch = err.message.match(/^Unexpected arguments for '[^']+': (\\S+)/);\n const term = unknownMatch?.[1] ?? unexpectedMatch?.[1];\n if (!term) return err;\n\n const sourceCmd = findSourceCommand(err.command, rootCommand);\n\n const candidateNames: string[] = [];\n if (sourceCmd.commands) {\n for (const cmd of sourceCmd.commands) {\n resolveCommand(cmd);\n if (!cmd.hidden) {\n candidateNames.push(cmd.name);\n if (cmd.aliases) candidateNames.push(...cmd.aliases);\n }\n }\n }\n\n const similar = suggestSimilar(term, candidateNames);\n const suggestionText = formatSuggestions(similar);\n if (!suggestionText) return err;\n\n const suggestions = [suggestionText];\n const enrichedMsg = `${err.message}\\n\\n ${suggestionText}`;\n return new RoutingError(enrichedMsg, { suggestions, command: err.command });\n}\n\nfunction enrichIssuesWithSuggestions(\n issues: readonly { path?: readonly unknown[]; message: string }[],\n knownOptions: () => string[],\n): typeof issues {\n return issues.map((i: any) => {\n // Handle direct unknown option detection (from checkUnknownArgs)\n const unknownMatch = i.message?.match(/^Unknown option: \"([^\"]+)\"$/);\n if (unknownMatch) {\n const similar = suggestSimilar(unknownMatch[1], knownOptions());\n if (similar.length) {\n const hint = formatSuggestions(similar, '--');\n return { ...i, message: `${i.message} ${hint}` };\n }\n return i;\n }\n\n // Handle Zod strict schema errors (Unrecognized key(s) in object: \"foo\")\n const keys: string[] | undefined = i.keys ?? i.message?.match(/[Uu]nrecognized key(?:s)?[^\"]*\"([^\"]+)\"/)?.slice(1);\n if (!keys?.length) return i;\n const hints = keys.flatMap((k: string) => {\n const similar = suggestSimilar(k, knownOptions());\n return similar.length ? [formatSuggestions(similar, '--')] : [];\n });\n if (!hints.length) return i;\n return { ...i, message: `${i.message} ${hints.join(' ')}` };\n });\n}\n\nconst suggestionsInterceptor = defineInterceptor({ id: 'padrone:suggestions', name: 'padrone:suggestions', order: -500 }, () => ({\n parse(ctx, next) {\n try {\n const result = next();\n if (result instanceof Promise) {\n return result.catch((err: unknown) => {\n throw enrichRoutingError(err, ctx.command);\n });\n }\n return result;\n } catch (err) {\n throw enrichRoutingError(err, ctx.command);\n }\n },\n validate(ctx, next) {\n const result = next();\n return thenMaybe(result, (v) => {\n if (!v.argsResult?.issues?.length) return v;\n const enriched = enrichIssuesWithSuggestions(v.argsResult.issues, () => getKnownOptionNames(ctx.command));\n return { ...v, argsResult: { ...v.argsResult, issues: enriched } } as typeof v;\n });\n },\n}));\n\nexport function padroneSuggestions(): <T extends CommandTypesBase>(builder: T) => T {\n return ((builder: AnyPadroneBuilder) => builder.intercept(suggestionsInterceptor)) as any;\n}\n","import { thenMaybe } from '#src/core/results.ts';\nimport { resolveCommand } from '../core/commands.ts';\nimport { defineInterceptor } from '../core/interceptors.ts';\nimport type { AnyPadroneBuilder, CommandTypesBase, PadroneCommand } from '../types/index.ts';\nimport type { PadroneSchema } from '../types/schema.ts';\nimport type { WithCommand } from '../util/type-utils.ts';\nimport { getRootCommand, getVersion } from '../util/utils.ts';\n\n// ── Types ────────────────────────────────────────────────────────────────\n\nexport type VersionCommand = PadroneCommand<'version', '', PadroneSchema<void>, string, [], [], false>;\n\nexport type WithVersion<T> = WithCommand<T, 'version', VersionCommand>;\n\n// ── Interceptor ─────────────────────────────────────────────────────────\n\nconst versionInterceptor = defineInterceptor({ id: 'padrone:version', name: 'padrone:version', order: -1000 }, () => ({\n parse(_ctx, next) {\n return thenMaybe(next(), (res) => {\n const hasVersionFlag = res.rawArgs.version || res.rawArgs.v || res.rawArgs.V;\n\n // Only show version for root command (no subcommand matched)\n if (hasVersionFlag && !res.command.parent) {\n delete res.rawArgs.version;\n delete res.rawArgs.v;\n delete res.rawArgs.V;\n\n // Route to the version command so its action handles the rest\n const versionCmd = res.command.commands?.find((c) => c.name === 'version');\n if (versionCmd) {\n resolveCommand(versionCmd);\n return { ...res, command: versionCmd, rawArgs: {}, positionalArgs: [] };\n }\n }\n\n return res;\n });\n },\n}));\n\n// ── Extension ────────────────────────────────────────────────────────────\n\n/**\n * Extension that adds version support:\n * - `version` command\n * - `--version` / `-v` / `-V` flags (root command only)\n *\n * Usage:\n * ```ts\n * createPadrone('my-cli').extend(padroneVersion())\n * ```\n */\nexport function padroneVersion(): <T extends CommandTypesBase>(builder: T) => WithVersion<T> {\n return ((builder: AnyPadroneBuilder) =>\n builder\n .command('version', (c) =>\n c.configure({ description: 'Display the version number', hidden: true }).action((_args, ctx) => {\n const rootCommand = getRootCommand(ctx.command);\n return getVersion(rootCommand.version);\n }),\n )\n .intercept(versionInterceptor)) as any;\n}\n","import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { ValidationError } from '../core/errors.ts';\nimport type { PadroneSchema } from '../types/index.ts';\nimport { concatBytes } from '../util/stream.ts';\n\n/**\n * Configuration for wrapping an external CLI tool.\n */\nexport type WrapConfig<TCommandArgs extends PadroneSchema = PadroneSchema, TWrapArgs extends PadroneSchema = TCommandArgs> = {\n /**\n * The command to execute (e.g., 'git', 'docker', 'npm').\n */\n command: string;\n /**\n * Optional fixed arguments that always precede the arguments (e.g., ['commit'] for 'git commit').\n */\n args?: string[];\n /**\n * Positional argument configuration for the external command.\n * If not provided, defaults to the wrapping command's positional configuration.\n */\n positional?: string[];\n /**\n * Whether to inherit stdio streams (stdin, stdout, stderr) from the parent process.\n * Default: true\n */\n inheritStdio?: boolean;\n /**\n * Optional schema that transforms command arguments to external CLI arguments.\n * The schema's input type should match the command arguments, and its output type defines\n * the arguments expected by the external command.\n * If not provided, command arguments are passed through as-is.\n */\n schema?: TWrapArgs | ((commandArguments: TCommandArgs) => TWrapArgs);\n};\n\n/**\n * Result from executing a wrapped CLI tool.\n */\nexport type WrapResult = {\n /**\n * The exit code of the process.\n */\n exitCode: number;\n /**\n * Standard output from the process (only if inheritStdio is false).\n */\n stdout?: string;\n /**\n * Standard error from the process (only if inheritStdio is false).\n */\n stderr?: string;\n /**\n * Whether the process exited successfully (exit code 0).\n */\n success: boolean;\n};\n\n/**\n * Converts parsed arguments to CLI arguments for an external command.\n */\nfunction argsToCliArgs(input: Record<string, unknown> | undefined, positional: readonly string[] = []): string[] {\n const args: string[] = [];\n\n // Handle undefined or null input\n if (!input) return args;\n\n const positionalValues: Record<string, unknown> = {};\n const regularArguments: Record<string, unknown> = {};\n\n // Separate positional and regular arguments\n for (const [key, value] of Object.entries(input)) {\n if (positional.includes(key) || positional.includes(`...${key}`)) {\n positionalValues[key] = value;\n } else {\n regularArguments[key] = value;\n }\n }\n\n // Add regular arguments first\n for (const [key, value] of Object.entries(regularArguments)) {\n if (value === undefined || value === null) continue;\n\n // Use the key as-is with -- prefix\n const flag = `--${key}`;\n\n if (typeof value === 'boolean') {\n if (value) args.push(flag);\n } else if (Array.isArray(value)) {\n // For arrays, add the flag multiple times\n for (const item of value) {\n args.push(flag, String(item));\n }\n } else {\n args.push(flag, String(value));\n }\n }\n\n // Add positional arguments in the specified order\n for (const posKey of positional) {\n const isVariadic = posKey.startsWith('...');\n const key = isVariadic ? posKey.slice(3) : posKey;\n const value = positionalValues[key];\n\n if (value === undefined || value === null) continue;\n\n if (isVariadic && Array.isArray(value)) {\n args.push(...value.map(String));\n } else {\n args.push(String(value));\n }\n }\n\n return args;\n}\n\n/**\n * Creates an action handler that wraps an external CLI tool.\n * @param config - Configuration for wrapping the external command (includes optional schema)\n * @param commandArguments - The command's arguments schema\n * @param commandPositional - Default positional config from the wrapping command\n */\nexport function createWrapHandler<TCommandArgs extends PadroneSchema, TWrapArgs extends PadroneSchema>(\n config: WrapConfig<TCommandArgs, TWrapArgs>,\n commandArguments: TCommandArgs,\n commandPositional?: readonly string[],\n): (args: StandardSchemaV1.InferOutput<TCommandArgs>) => Promise<WrapResult> {\n return async (args: StandardSchemaV1.InferOutput<TCommandArgs>): Promise<WrapResult> => {\n const { command, args: fixedArgs = [], inheritStdio = true, positional = commandPositional, schema: wrapSchema } = config;\n\n // Get the wrap schema (handle function or direct schema)\n const schema = wrapSchema ? (typeof wrapSchema === 'function' ? wrapSchema(commandArguments) : wrapSchema) : commandArguments;\n\n // Transform command arguments to external CLI arguments using the wrap schema\n const validationResult = schema['~standard'].validate(args);\n\n const processResult = (result: StandardSchemaV1.Result<unknown>) => {\n if (result.issues) {\n const issueMessages = result.issues\n .map((i: StandardSchemaV1.Issue) => ` - ${(i.path as (string | number)[] | undefined)?.join('.') || 'root'}: ${i.message}`)\n .join('\\n');\n throw new ValidationError(`Wrap schema validation failed:\\n${issueMessages}`, result.issues as any);\n }\n return result.value;\n };\n\n const externalArguments =\n validationResult instanceof Promise ? await validationResult.then(processResult) : processResult(validationResult);\n\n // Convert arguments to CLI arguments\n const regularArgs = argsToCliArgs(externalArguments as Record<string, unknown>, positional);\n\n // Combine fixed args and regular args\n const allArgs = [...fixedArgs, ...regularArgs];\n\n // Execute the external command\n const { spawn } = await import('node:child_process');\n\n return new Promise<WrapResult>((resolve, reject) => {\n const proc = spawn(command, allArgs, {\n stdio: inheritStdio ? 'inherit' : ['ignore', 'pipe', 'pipe'],\n });\n\n const stdoutChunks: Uint8Array[] = [];\n const stderrChunks: Uint8Array[] = [];\n\n if (!inheritStdio) {\n proc.stdout!.on('data', (chunk: Uint8Array) => stdoutChunks.push(chunk));\n proc.stderr!.on('data', (chunk: Uint8Array) => stderrChunks.push(chunk));\n }\n\n const decoder = new TextDecoder();\n proc.on('error', reject);\n proc.on('close', (code) => {\n const exitCode = code ?? 1;\n resolve({\n exitCode,\n stdout: inheritStdio ? undefined : decoder.decode(concatBytes(stdoutChunks)),\n stderr: inheritStdio ? undefined : decoder.decode(concatBytes(stderrChunks)),\n success: exitCode === 0,\n });\n });\n });\n };\n}\n","import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport type {\n AnyPadroneCommand,\n AnyPadroneProgram,\n InterceptorExecuteContext,\n InterceptorExecuteResult,\n InterceptorParseContext,\n InterceptorParseResult,\n InterceptorPipelinePhase,\n InterceptorRouteContext,\n InterceptorValidateContext,\n InterceptorValidateResult,\n PadroneActionContext,\n PadroneEvalPreferences,\n RegisteredInterceptor,\n ResolvedInterceptor,\n} from '../types/index.ts';\nimport { getCommandRuntime } from './commands.ts';\nimport { RoutingError, SignalError, ValidationError } from './errors.ts';\nimport { resolveRegisteredInterceptors, runInterceptorChain, wrapWithCommandLifecycle, wrapWithLifecycle } from './interceptors.ts';\nimport { errorResult, noop, thenMaybe, warnIfUnexpectedAsync, withDrain } from './results.ts';\nimport { buildCommandArgs, formatIssueMessages, validateCommandArgs } from './validate.ts';\n\nexport type ExecContext = {\n rootCommand: AnyPadroneCommand;\n builder: AnyPadroneProgram;\n parseCommandFn: (input: string | undefined) => {\n command: AnyPadroneCommand;\n rawArgs: Record<string, unknown>;\n args: string[];\n unmatchedTerms: string[];\n };\n collectInterceptorsFn: (cmd: AnyPadroneCommand) => RegisteredInterceptor[];\n};\n\n/**\n * Collects registered interceptors from the command's parent chain (root → ... → target).\n * Root/program interceptors come first (outermost), target command's interceptors last (innermost).\n */\nexport function collectInterceptors(cmd: AnyPadroneCommand, rootCommand: AnyPadroneCommand): RegisteredInterceptor[] {\n const chain: RegisteredInterceptor[][] = [];\n let current: AnyPadroneCommand | undefined = cmd;\n while (current) {\n const isTarget = current === cmd;\n if (!current.parent) {\n if (rootCommand.interceptors?.length) {\n const isRootTarget = cmd === rootCommand || !cmd.parent;\n chain.unshift(isRootTarget ? rootCommand.interceptors : rootCommand.interceptors.filter((i) => i.meta.inherit !== false));\n }\n } else {\n if (current.interceptors?.length) {\n chain.unshift(isTarget ? current.interceptors : current.interceptors.filter((i) => i.meta.inherit !== false));\n }\n }\n current = current.parent;\n }\n return chain.flat();\n}\n\n/** Wraps an error into a result, preserving any signal info from the pipeline. */\nexport function errorResultWithSignal(err: unknown) {\n const result = errorResult(err);\n if (err instanceof SignalError) {\n (result as any).signal = err.signal;\n (result as any).exitCode = err.exitCode;\n }\n return result;\n}\n\n/** Resolve context by walking the command parent chain and applying transforms from root to target. */\nfunction resolveContext(command: AnyPadroneCommand, initialContext: unknown): unknown {\n const chain: AnyPadroneCommand[] = [];\n let current: AnyPadroneCommand | undefined = command;\n while (current) {\n chain.unshift(current);\n current = current.parent;\n }\n let resolved = initialContext;\n for (const cmd of chain) {\n if (cmd.contextTransform) resolved = cmd.contextTransform(resolved);\n }\n return resolved;\n}\n\n/** Validate parse result — reject unmatched terms when the command doesn't accept positional args. */\nfunction validateParseResult(\n parseResult: { command: AnyPadroneCommand; rawArgs: Record<string, unknown>; args: string[]; unmatchedTerms: string[] },\n rootCommand: AnyPadroneCommand,\n): InterceptorParseResult {\n const { command, rawArgs, args, unmatchedTerms } = parseResult;\n\n if (unmatchedTerms.length > 0) {\n const hasPositionalConfig = command.meta?.positional && command.meta.positional.length > 0;\n if (!hasPositionalConfig) {\n const isRootCommand = command === rootCommand;\n const commandDisplayName = command.name || command.aliases?.[0] || command.path || '(default)';\n const errorMsg = isRootCommand\n ? `Unknown command: ${unmatchedTerms[0]}`\n : `Unexpected arguments for '${commandDisplayName}': ${unmatchedTerms.join(' ')}`;\n\n throw new RoutingError(errorMsg, { command: command.path || command.name });\n }\n }\n\n return { command, rawArgs, positionalArgs: args };\n}\n\n/** Handle validation issues based on error mode: throw (hard) or return result with issues (soft). */\nfunction handleValidationIssues(argsResult: StandardSchemaV1.FailureResult, command: AnyPadroneCommand, errorMode: 'soft' | 'hard') {\n if (errorMode === 'hard') {\n const issueMessages = formatIssueMessages(argsResult.issues);\n throw new ValidationError(`Validation error:\\n${issueMessages}`, argsResult.issues as any, {\n command: command.path || command.name,\n });\n }\n\n return withDrain({\n command: command as any,\n args: undefined,\n argsResult,\n result: undefined,\n });\n}\n\n/**\n * Core execution logic shared by eval() and cli().\n * errorMode controls validation error behavior:\n * - 'soft': return result with issues (eval behavior)\n * - 'hard': print error + help and throw (cli-without-input behavior)\n */\nexport function execCommand(\n resolvedInput: string | undefined,\n ctx: ExecContext,\n evalOptions?: PadroneEvalPreferences,\n errorMode: 'soft' | 'hard' = 'soft',\n caller: PadroneActionContext['caller'] = 'eval',\n) {\n const { rootCommand, parseCommandFn, collectInterceptorsFn } = ctx;\n const baseRuntime = getCommandRuntime(rootCommand);\n const runtime = evalOptions?.runtime\n ? Object.assign({}, baseRuntime, Object.fromEntries(Object.entries(evalOptions.runtime).filter(([, v]) => v !== undefined)))\n : baseRuntime;\n\n // Inert signal — the signal extension overrides this via next({ signal }) in the start phase.\n const inertSignal = new AbortController().signal;\n\n // Pipeline state accumulated as phases complete — propagated to error/shutdown contexts.\n const pipelineState: { phase: InterceptorPipelinePhase; rawArgs?: Record<string, unknown>; positionalArgs?: string[]; args?: unknown } = {\n phase: 'start',\n };\n\n const initialContext = evalOptions?.context;\n\n // Factory resolution cache — ensures each factory is called at most once per execution,\n // so root interceptor closures are shared when they appear in both root and command chains.\n const factoryCache = new Map<RegisteredInterceptor, ResolvedInterceptor>();\n const rootRegistered = rootCommand.interceptors ?? [];\n const rootInterceptors = resolveRegisteredInterceptors(rootRegistered, factoryCache);\n const rootInterceptorSet = new Set(rootInterceptors);\n\n const runPipeline = (signal: AbortSignal, pipelineContext: unknown) => {\n // ── Phase 1: Parse ──────────────────────────────────────────────────\n const parseCtx: InterceptorParseContext = {\n input: resolvedInput,\n command: rootCommand,\n signal,\n context: pipelineContext as object,\n runtime,\n program: ctx.builder,\n caller,\n };\n\n const coreParse = (parseCtx: InterceptorParseContext): InterceptorParseResult =>\n validateParseResult(parseCommandFn(parseCtx.input), rootCommand);\n\n const parsedOrPromise = runInterceptorChain('parse', rootInterceptors, parseCtx, coreParse);\n\n // ── Phases 2 & 3 chained after parse ────────────────────────────────\n const continueAfterParse = (parsed: InterceptorParseResult) => {\n const { command } = parsed;\n pipelineState.phase = 'parse';\n pipelineState.rawArgs = parsed.rawArgs;\n pipelineState.positionalArgs = parsed.positionalArgs;\n const commandInterceptors = resolveRegisteredInterceptors(collectInterceptorsFn(command), factoryCache);\n const commandOnlyInterceptors = commandInterceptors.filter((i) => !rootInterceptorSet.has(i));\n const context = resolveContext(command, pipelineContext);\n\n // ── Phase 2: Route ──────────────────────────────────────────────\n const routeCtx: InterceptorRouteContext = {\n ...parseCtx,\n command,\n rawArgs: parsed.rawArgs,\n positionalArgs: parsed.positionalArgs,\n context: context as object,\n };\n\n const routedOrPromise = runInterceptorChain('route', commandInterceptors, routeCtx, () => {});\n\n const continueAfterRoute = () => {\n pipelineState.phase = 'route';\n const runValidateAndExecute = () => {\n // ── Phase 3: Validate ───────────────────────────────────────────\n const validateCtx: InterceptorValidateContext = {\n ...parseCtx,\n command,\n rawArgs: parsed.rawArgs,\n positionalArgs: parsed.positionalArgs,\n context: context as object,\n evalInteractive: evalOptions?.interactive,\n };\n\n const coreValidate = (\n validateCtx: InterceptorValidateContext,\n ): InterceptorValidateResult | Promise<InterceptorValidateResult> => {\n const { args: preprocessedArgs, issues } = buildCommandArgs(\n validateCtx.command,\n validateCtx.rawArgs,\n validateCtx.positionalArgs,\n );\n if (issues) return { args: undefined, argsResult: { issues } as any };\n const validated = validateCommandArgs(validateCtx.command, preprocessedArgs);\n return thenMaybe(validated, (v) => v as InterceptorValidateResult);\n };\n\n const validatedOrPromise = runInterceptorChain('validate', commandInterceptors, validateCtx, coreValidate);\n\n // ── Phase 3: Execute (or handle validation errors) ──────────────\n const continueAfterValidate = (v: InterceptorValidateResult) => {\n pipelineState.phase = 'validate';\n pipelineState.args = v.args;\n if (v.argsResult?.issues) return handleValidationIssues(v.argsResult as StandardSchemaV1.FailureResult, command, errorMode);\n\n const executeCtx: InterceptorExecuteContext = {\n ...validateCtx,\n args: v.args,\n };\n\n const coreExecute = (executeCtx: InterceptorExecuteContext): InterceptorExecuteResult => {\n const handler = command.action ?? noop;\n const effectiveRuntime = executeCtx.runtime;\n const actionCtx: PadroneActionContext = {\n runtime: effectiveRuntime,\n command: executeCtx.command,\n program: ctx.builder as any,\n signal: executeCtx.signal,\n context: executeCtx.context,\n caller,\n };\n const result = handler(executeCtx.args as any, actionCtx);\n return { result };\n };\n\n pipelineState.phase = 'execute';\n const executedOrPromise = runInterceptorChain('execute', commandInterceptors, executeCtx, coreExecute);\n\n return thenMaybe(executedOrPromise, (e) => {\n const finalize = (result: unknown) =>\n withDrain({\n command: command as any,\n args: v.args,\n argsResult: v.argsResult,\n result,\n });\n\n if (e.result instanceof Promise) return e.result.then(finalize);\n return finalize(e.result);\n });\n };\n\n return thenMaybe(warnIfUnexpectedAsync(validatedOrPromise, command), continueAfterValidate) as any;\n };\n\n return wrapWithCommandLifecycle(\n commandOnlyInterceptors,\n command,\n resolvedInput,\n runValidateAndExecute,\n (result) => withDrain({ command: command as any, args: undefined, argsResult: undefined, result }),\n signal,\n context,\n runtime,\n ctx.builder,\n caller,\n pipelineState,\n );\n };\n\n return thenMaybe(routedOrPromise, continueAfterRoute) as any;\n };\n\n return thenMaybe(parsedOrPromise, continueAfterParse) as any;\n };\n\n return wrapWithLifecycle(\n rootInterceptors,\n rootCommand,\n resolvedInput,\n runPipeline,\n (result) => withDrain({ command: rootCommand, args: undefined, argsResult: undefined, result }),\n inertSignal,\n initialContext,\n runtime,\n ctx.builder,\n caller,\n pipelineState,\n ) as any;\n}\n","import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { buildReplCompleter, findCommandByName, getCommandRuntime } from '../core/commands.ts';\nimport { createTerminalReplSession } from '../core/default-runtime.ts';\nimport { REPL_SIGINT, type ReplSessionConfig } from '../core/runtime.ts';\nimport type { AnyPadroneCommand, PadroneEvalPreferences, PadroneReplPreferences } from '../types/index.ts';\nimport { getVersion } from '../util/utils.ts';\n\nexport type ReplDeps = {\n existingCommand: AnyPadroneCommand;\n evalCommand: (input: string, prefs?: PadroneEvalPreferences) => any;\n replActiveRef: { value: boolean };\n};\n\n/**\n * Creates a REPL async iterable for running commands interactively.\n */\nexport function createReplIterator(deps: ReplDeps, options?: PadroneReplPreferences): AsyncIterable<any> & { drain: () => Promise<any> } {\n const { existingCommand, evalCommand, replActiveRef } = deps;\n\n if (replActiveRef.value) {\n const runtime = getCommandRuntime(existingCommand);\n runtime.error('REPL is already running. Nested REPL sessions are not supported.');\n return (async function* () {})() as any;\n }\n\n const runtime = getCommandRuntime(existingCommand);\n\n const programName = existingCommand.name || 'padrone';\n const env = runtime.env();\n const useAnsi = runtime.format === 'ansi' || (runtime.format === 'auto' && !env.NO_COLOR && !env.CI && runtime.terminal?.isTTY === true);\n\n // Track command history for .history built-in\n const commandHistory: string[] = [];\n\n // Resolve the initial scope command from options.scope (command path like 'db' or 'db migrate')\n const resolveScope = (scope: string): AnyPadroneCommand[] => {\n const parts = scope.split(/\\s+/);\n const stack: AnyPadroneCommand[] = [];\n let current = existingCommand;\n for (const part of parts) {\n const found = findCommandByName(part, current.commands);\n if (!found) break;\n stack.push(found);\n current = found;\n }\n return stack;\n };\n\n async function* replIterator() {\n replActiveRef.value = true;\n const showGreeting = options?.greeting !== false;\n const showHint = options?.hint !== false;\n\n // Empty line before greeting/hint block\n if (showGreeting || showHint) runtime.output('');\n\n // Greeting: default shows program title (or name) + version, like \"Welcome to My App v1.0.0\"\n if (showGreeting) {\n if (options?.greeting) {\n runtime.output(options.greeting);\n } else {\n const displayName = existingCommand.title || programName;\n const version = existingCommand.version ? await getVersion(existingCommand.version) : undefined;\n const greeting = version ? `Welcome to ${displayName} v${version}` : `Welcome to ${displayName}`;\n runtime.output(greeting);\n }\n }\n\n // Hint: dimmed text below greeting\n if (showHint) {\n const hintText =\n (typeof options?.hint === 'string' ? options.hint : undefined) ?? 'Type \".help\" for more information, \".exit\" to quit.';\n runtime.output(useAnsi ? `\\x1b[2m${hintText}\\x1b[0m` : hintText);\n }\n\n // Empty line after greeting/hint block\n if (showGreeting || showHint) runtime.output('');\n\n // Scope stack for nested/contextual REPLs.\n // `cd <subcommand>` pushes, `cd ..`/`..` pops. The scope path is prepended to all eval input.\n const scopeStack: AnyPadroneCommand[] = options?.scope ? resolveScope(options.scope) : [];\n\n const getScopeCommand = () => (scopeStack.length ? scopeStack[scopeStack.length - 1]! : existingCommand);\n const getScopePath = () => scopeStack.map((c) => c.name).join(' ');\n\n const buildPrompt = () => {\n if (options?.prompt) return typeof options.prompt === 'function' ? options.prompt() : options.prompt;\n const scopePath = getScopePath();\n const label = scopePath ? `${programName}/${scopePath.replace(/ /g, '/')}` : programName;\n return useAnsi ? `\\x1b[1m${label}\\x1b[0m ❯ ` : `${label} ❯ `;\n };\n\n // Build completer scoped to the current command\n const buildScopedCompleter = () => {\n const scopeCmd = getScopeCommand();\n const inScope = scopeStack.length > 0;\n return buildReplCompleter(scopeCmd, { inScope });\n };\n\n // Build session config with completer\n const sessionConfig: ReplSessionConfig = { history: options?.history };\n if (options?.completion !== false) {\n sessionConfig.completer = buildScopedCompleter();\n }\n\n // If the runtime provides a custom readLine, use it (stateless, no history/completion).\n // Otherwise, create a persistent terminal session with history + tab completion.\n const session = runtime.readLine ? undefined : createTerminalReplSession(sessionConfig);\n const questionFn = session ? (prompt: string) => session.question(prompt) : runtime.readLine!;\n\n // Update the session's completer when scope changes\n const updateCompleter = () => {\n if (options?.completion === false) return;\n const completer = buildScopedCompleter();\n if (session) session.completer = completer;\n sessionConfig.completer = completer;\n };\n\n // Track last SIGINT time for double Ctrl+C to exit\n let lastSigintTime = 0;\n\n try {\n while (true) {\n const promptStr = buildPrompt();\n const input = await questionFn(promptStr);\n\n // EOF (Ctrl+D, closed connection)\n if (input === null) break;\n\n // Handle Ctrl+C (SIGINT sentinel from terminal session)\n if (input === REPL_SIGINT) {\n const now = Date.now();\n if (now - lastSigintTime < 2000) break; // Double Ctrl+C within 2s → exit\n lastSigintTime = now;\n runtime.output('(press Ctrl+C again to exit, or Ctrl+D)');\n continue;\n }\n\n const trimmed = input.trim();\n if (!trimmed) continue;\n\n // Reset SIGINT timer on any real input\n lastSigintTime = 0;\n\n // Track command history for .history\n commandHistory.push(trimmed);\n\n // Dot-prefixed built-in REPL commands\n if (trimmed === '.exit' || trimmed === '.quit') break;\n if (trimmed === '.clear') {\n runtime.output('\\x1B[2J\\x1B[H');\n continue;\n }\n if (trimmed === '.help') {\n const lines = [\n 'REPL Commands:',\n ' . Execute the current scoped command',\n ' .help Print this help message',\n ' .exit Exit the REPL',\n ' .clear Clear the screen',\n ' .history Show command history',\n ' .scope <cmd> Scope into a subcommand',\n ' .scope .. Go up one scope level',\n ];\n lines.push(\n '',\n 'Keybindings:',\n ' Ctrl+C Cancel current line (press twice to exit)',\n ' Ctrl+D Exit the REPL',\n ' Up/Down Navigate history',\n ' Tab Auto-complete',\n '',\n 'Type \"help\" to see available commands.',\n );\n runtime.output(lines.join('\\n'));\n continue;\n }\n if (trimmed === '.history') {\n // Show all previous entries (excluding the .history command itself)\n const entries = commandHistory.slice(0, -1);\n if (entries.length === 0) {\n runtime.output('No history.');\n } else {\n runtime.output(entries.map((entry, i) => `${i + 1} ${entry}`).join('\\n'));\n }\n continue;\n }\n\n // `.scope <subcommand>` — scope the REPL to a command subtree\n // `.scope ..` or `..` — go up one scope level\n if (trimmed.startsWith('.scope ') || trimmed === '.scope') {\n const target = trimmed.slice(6).trim();\n if (target === '..' || target === '') {\n if (scopeStack.length > 0) {\n scopeStack.pop();\n updateCompleter();\n }\n } else {\n const scopeCmd = getScopeCommand();\n const found = findCommandByName(target, scopeCmd.commands);\n if (found) {\n if (found.commands?.length) {\n scopeStack.push(found);\n updateCompleter();\n } else {\n runtime.error(`\"${target}\" has no subcommands to scope into.`);\n }\n } else {\n runtime.error(`Unknown command: ${target}`);\n }\n }\n continue;\n }\n\n // `..` shorthand for `.scope ..`\n if (trimmed === '..') {\n if (scopeStack.length > 0) {\n scopeStack.pop();\n updateCompleter();\n }\n continue;\n }\n\n // `.` (bare dot) — execute the current command (scoped or root)\n let evalInput = trimmed;\n if (trimmed === '.') {\n evalInput = '';\n }\n\n const prefix = options?.outputPrefix;\n const prefixLines = prefix\n ? (text: string) =>\n text\n .split('\\n')\n .map((l) => prefix + l)\n .join('\\n')\n : undefined;\n\n // Temporarily patch runtime on all commands so handler output gets prefixed.\n // Commands store parent refs from build time, so we patch each command directly.\n const savedRuntimes: { cmd: AnyPadroneCommand; runtime: typeof existingCommand.runtime }[] = [];\n if (prefixLines) {\n const prefixedRuntime = {\n ...existingCommand.runtime,\n output: (...args: unknown[]) => {\n const first = args[0];\n runtime.output(typeof first === 'string' ? prefixLines(first) : first, ...args.slice(1));\n },\n error: (text: string) => runtime.error(prefixLines(text)),\n };\n const patchAll = (cmd: AnyPadroneCommand) => {\n savedRuntimes.push({ cmd, runtime: cmd.runtime });\n cmd.runtime = prefixedRuntime;\n cmd.commands?.forEach(patchAll);\n };\n patchAll(existingCommand);\n }\n\n // Resolve before/after spacing from the shorthand or object form\n const sp = options?.spacing;\n const isSpacingObject = typeof sp === 'object' && sp !== null && !Array.isArray(sp);\n const spacingBefore = isSpacingObject ? sp.before : sp;\n const spacingAfter = isSpacingObject ? sp.after : sp;\n\n const emitSpacingLine = (value: boolean | string) => {\n if (typeof value === 'string') {\n const sep = value.length === 1 ? value.repeat(runtime.terminal?.columns ?? 80) : value;\n runtime.output(sep);\n } else if (value) {\n runtime.output('');\n }\n };\n const emitSpacing = (value: typeof spacingBefore) => {\n if (!value) return;\n if (Array.isArray(value)) {\n for (const line of value) emitSpacingLine(line);\n } else {\n emitSpacingLine(value);\n }\n };\n\n emitSpacing(spacingBefore);\n\n // Prepend scope path so evalCommand resolves relative to root\n const scopePath = getScopePath();\n const scopedInput = scopePath ? (evalInput ? `${scopePath} ${evalInput}` : scopePath) : evalInput;\n\n try {\n const replEvalPrefs: PadroneEvalPreferences | undefined = { caller: 'repl' };\n const result = await evalCommand(scopedInput, replEvalPrefs);\n if (result.error) {\n const msg = result.error instanceof Error ? result.error.message : String(result.error);\n runtime.error(prefixLines ? prefixLines(msg) : msg);\n } else if (result.argsResult?.issues) {\n const issueMessages = result.argsResult.issues\n .map((i: StandardSchemaV1.Issue) => ` - ${i.path?.join('.') || 'root'}: ${i.message}`)\n .join('\\n');\n const msg = `Validation error:\\n${issueMessages}`;\n runtime.error(prefixLines ? prefixLines(msg) : msg);\n }\n yield result as any;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n runtime.error(prefixLines ? prefixLines(msg) : msg);\n } finally {\n for (const { cmd, runtime: saved } of savedRuntimes) cmd.runtime = saved;\n emitSpacing(spacingAfter);\n }\n }\n } finally {\n replActiveRef.value = false;\n session?.close();\n }\n }\n\n const iterable = replIterator();\n (iterable as any).drain = async () => {\n try {\n const results: any[] = [];\n for await (const result of iterable) results.push(result);\n return { value: results };\n } catch (err) {\n return { error: err };\n }\n };\n return iterable as any;\n}\n","import type { Schema } from 'ai';\nimport type { ShellType } from '../feature/completion.ts';\nimport { createReplIterator } from '../feature/repl-loop.ts';\nimport { generateHelp } from '../output/help.ts';\nimport type {\n AnyPadroneCommand,\n AnyPadroneProgram,\n InterceptorExecuteContext,\n InterceptorExecuteResult,\n PadroneActionContext,\n PadroneAPI,\n PadroneReplPreferences,\n} from '../types/index.ts';\nimport { extractSchemaMetadata, parsePositionalConfig } from './args.ts';\nimport { findCommandByName, getCommandRuntime, resolveAllCommands } from './commands.ts';\nimport { RoutingError } from './errors.ts';\nimport type { ExecContext } from './exec.ts';\nimport { collectInterceptors, errorResultWithSignal, execCommand } from './exec.ts';\nimport { resolveRegisteredInterceptors, runInterceptorChain } from './interceptors.ts';\nimport { errorResult, makeThenable, thenMaybe, warnIfUnexpectedAsync, withDrain, withPromiseDrain } from './results.ts';\nimport { coreValidateForParse } from './validate.ts';\n\nexport function createProgramMethods(ctx: ExecContext, evalCommand: AnyPadroneProgram['eval']) {\n const { rootCommand } = ctx;\n\n // A never-aborted signal for contexts that don't need signal handling (parse, run).\n const inertSignal = new AbortController().signal;\n\n const stringify: AnyPadroneProgram['stringify'] = (command = '' as any, args) => {\n const commandObj = typeof command === 'string' ? findCommandByName(command, rootCommand.commands) : (command as AnyPadroneCommand);\n if (!commandObj) throw new RoutingError(`Command \"${command ?? ''}\" not found`);\n\n const parts: string[] = [];\n\n if (commandObj.path) parts.push(commandObj.path);\n\n const positionalConfig = commandObj.meta?.positional ? parsePositionalConfig(commandObj.meta.positional) : [];\n const positionalNames = new Set(positionalConfig.map((p) => p.name));\n\n // Build reverse map: arg name → first negative keyword (for stringify)\n const negativeKeyword: Record<string, string> = {};\n if (commandObj.argsSchema) {\n const { negatives } = extractSchemaMetadata(commandObj.argsSchema, commandObj.meta?.fields, commandObj.meta?.autoAlias);\n for (const [keyword, argName] of Object.entries(negatives)) {\n if (!(argName in negativeKeyword)) negativeKeyword[argName] = keyword;\n }\n }\n\n if (args && typeof args === 'object') {\n for (const { name, variadic } of positionalConfig) {\n const value = (args as Record<string, unknown>)[name];\n if (value === undefined) continue;\n\n if (variadic && Array.isArray(value)) {\n for (const v of value) {\n const vStr = String(v);\n if (vStr.includes(' ')) parts.push(`\"${vStr}\"`);\n else parts.push(vStr);\n }\n } else {\n const argStr = String(value);\n if (argStr.includes(' ')) parts.push(`\"${argStr}\"`);\n else parts.push(argStr);\n }\n }\n\n const stringifyValue = (key: string, value: unknown) => {\n if (value === undefined) return;\n\n if (typeof value === 'boolean') {\n if (value) parts.push(`--${key}`);\n else if (negativeKeyword[key]) parts.push(`--${negativeKeyword[key]}`);\n else parts.push(`--no-${key}`);\n } else if (Array.isArray(value)) {\n for (const v of value) {\n const vStr = String(v);\n if (vStr.includes(' ')) parts.push(`--${key}=\"${vStr}\"`);\n else parts.push(`--${key}=${vStr}`);\n }\n } else if (typeof value === 'object' && value !== null) {\n for (const [nestedKey, nestedValue] of Object.entries(value)) {\n stringifyValue(`${key}.${nestedKey}`, nestedValue);\n }\n } else if (typeof value === 'string') {\n if (value.includes(' ')) parts.push(`--${key}=\"${value}\"`);\n else parts.push(`--${key}=${value}`);\n } else {\n parts.push(`--${key}=${value}`);\n }\n };\n\n for (const [key, value] of Object.entries(args)) {\n if (value === undefined || positionalNames.has(key)) continue;\n stringifyValue(key, value);\n }\n }\n\n return parts.join(' ');\n };\n\n const resolveContext = (command: AnyPadroneCommand, initialContext: unknown): unknown => {\n const chain: AnyPadroneCommand[] = [];\n let current: AnyPadroneCommand | undefined = command;\n while (current) {\n chain.unshift(current);\n current = current.parent;\n }\n let resolved = initialContext;\n for (const cmd of chain) {\n if (cmd.contextTransform) resolved = cmd.contextTransform(resolved);\n }\n return resolved;\n };\n\n const run: AnyPadroneProgram['run'] = (command, args, prefs?: { context?: unknown }) => {\n try {\n const commandObj = typeof command === 'string' ? findCommandByName(command, rootCommand.commands) : (command as AnyPadroneCommand);\n if (!commandObj) throw new RoutingError(`Command \"${command ?? ''}\" not found`);\n if (!commandObj.action) throw new RoutingError(`Command \"${commandObj.path}\" has no action`, { command: commandObj.path });\n\n const resolvedCtx = resolveContext(commandObj, prefs?.context);\n const commandRuntime = getCommandRuntime(commandObj);\n const executeCtx: InterceptorExecuteContext = {\n command: commandObj,\n input: undefined,\n rawArgs: {},\n positionalArgs: [],\n args,\n signal: inertSignal,\n context: resolvedCtx as object,\n runtime: commandRuntime,\n program: ctx.builder as any,\n caller: 'run',\n };\n\n const coreExecute = (executeCtx: InterceptorExecuteContext): InterceptorExecuteResult => {\n const actionCtx: PadroneActionContext = {\n runtime: executeCtx.runtime,\n command: executeCtx.command,\n program: ctx.builder as any,\n signal: inertSignal,\n context: executeCtx.context,\n caller: 'run',\n };\n const result = commandObj.action!(executeCtx.args as any, actionCtx);\n return { result };\n };\n\n const commandInterceptors = resolveRegisteredInterceptors(collectInterceptors(commandObj, rootCommand), new Map());\n const executedOrPromise = runInterceptorChain('execute', commandInterceptors, executeCtx, coreExecute);\n\n const toResult = (e: InterceptorExecuteResult) => withDrain({ command: commandObj as any, args: args as any, result: e.result });\n\n if (executedOrPromise instanceof Promise) {\n return executedOrPromise.then(toResult).catch((err: unknown) => errorResult(err, { command: commandObj, args })) as any;\n }\n return toResult(executedOrPromise);\n } catch (err) {\n return errorResult(err) as any;\n }\n };\n\n const tool: AnyPadroneProgram['tool'] = () => {\n resolveAllCommands(rootCommand);\n const helpText = generateHelp(rootCommand, undefined, { format: 'text' });\n\n const description = `Run a command. Pass the full command string including arguments. Use \"help <command>\" for detailed usage.\\n\\n${helpText}`;\n\n return {\n type: 'function',\n name: rootCommand.name,\n strict: true,\n title: rootCommand.description,\n description,\n inputExamples: [{ input: { command: '<command> [positionals...] [arguments...]' } }],\n inputSchema: {\n [Symbol.for('vercel.ai.schema') as keyof Schema & symbol]: true,\n jsonSchema: {\n type: 'object',\n properties: { command: { type: 'string' } },\n additionalProperties: false,\n },\n _type: undefined as unknown as { command: string },\n validate: (value) => {\n const command = (value as any)?.command;\n if (typeof command === 'string') return { success: true, value: { command } };\n return { success: false, error: new Error('Expected an object with command property as string.') };\n },\n } satisfies Schema<{ command: string }> as Schema<{ command: string }>,\n needsApproval: async (input) => {\n const parsed = await parse(input.command);\n if (typeof parsed.command.needsApproval === 'function') return parsed.command.needsApproval(parsed.args);\n if (parsed.command.needsApproval != null) return !!parsed.command.needsApproval;\n return !!parsed.command.mutation;\n },\n execute: async (input) => {\n const output: string[] = [];\n const errors: string[] = [];\n const result = await evalCommand(input.command, {\n caller: 'tool',\n runtime: {\n output: (...args) => output.push(args.map(String).join(' ')),\n error: (text) => errors.push(text),\n interactive: 'unsupported',\n format: 'text',\n },\n });\n return { result: result.result, logs: output.join('\\n'), error: errors.join('\\n') };\n },\n };\n };\n\n const replActiveRef = { value: false };\n const replFn = (options?: PadroneReplPreferences) =>\n createReplIterator({ existingCommand: rootCommand, evalCommand, replActiveRef }, options);\n\n const cli: AnyPadroneProgram['cli'] = (cliOptions) => {\n try {\n const runtime = getCommandRuntime(rootCommand);\n const resolvedInput = (runtime.argv().join(' ') || undefined) as string | undefined;\n\n const result = execCommand(resolvedInput, ctx, cliOptions, 'hard', 'cli');\n\n if (result instanceof Promise) return withPromiseDrain(result.catch((err: unknown) => errorResultWithSignal(err))) as any;\n return makeThenable(result);\n } catch (err) {\n return makeThenable(errorResultWithSignal(err)) as any;\n }\n };\n\n const find: AnyPadroneProgram['find'] = (command) => {\n if (typeof command !== 'string') return findCommandByName(command.path, rootCommand.commands) as any;\n return findCommandByName(command, rootCommand.commands) as any;\n };\n\n const parse: AnyPadroneProgram['parse'] = (input) => {\n const { command, rawArgs, args } = ctx.parseCommandFn(input as string | undefined);\n\n const validatedOrPromise = coreValidateForParse(command, rawArgs, args);\n\n return makeThenable(\n warnIfUnexpectedAsync(\n thenMaybe(validatedOrPromise, (v: any) => ({ command: command as any, args: v.args, argsResult: v.argsResult })),\n command,\n ),\n ) as any;\n };\n\n const help: AnyPadroneProgram['help'] = (command, prefs) => {\n resolveAllCommands(rootCommand);\n const commandObj = !command\n ? rootCommand\n : typeof command === 'string'\n ? findCommandByName(command, rootCommand.commands)\n : (command as AnyPadroneCommand);\n if (!commandObj) throw new RoutingError(`Command \"${command ?? ''}\" not found`);\n const runtime = getCommandRuntime(rootCommand);\n return generateHelp(rootCommand, commandObj, {\n ...prefs,\n format: prefs?.format ?? runtime.format,\n theme: prefs?.theme ?? runtime.theme,\n terminal: prefs?.terminal ?? runtime.terminal,\n env: prefs?.env ?? runtime.env(),\n });\n };\n\n const api: AnyPadroneProgram['api'] = () => {\n resolveAllCommands(rootCommand);\n function buildApi(command: AnyPadroneCommand) {\n const runCommand = ((args) => run(command, args).result) as PadroneAPI<AnyPadroneCommand>;\n if (!command.commands) return runCommand;\n for (const cmd of command.commands) runCommand[cmd.name] = buildApi(cmd);\n return runCommand;\n }\n return buildApi(rootCommand);\n };\n\n const completion: AnyPadroneProgram['completion'] = async (shell) => {\n resolveAllCommands(rootCommand);\n const { generateCompletionOutput } = await import('../feature/completion.ts');\n return generateCompletionOutput(rootCommand, shell as ShellType | undefined);\n };\n\n const mcp: AnyPadroneProgram['mcp'] = async (prefs) => {\n resolveAllCommands(rootCommand);\n const { startMcpServer } = await import('../feature/mcp.ts');\n return startMcpServer(ctx.builder as any, rootCommand, evalCommand, prefs);\n };\n\n const serve: AnyPadroneProgram['serve'] = async (prefs) => {\n resolveAllCommands(rootCommand);\n const { startServeServer } = await import('../feature/serve.ts');\n return startServeServer(ctx.builder as any, rootCommand, evalCommand, prefs);\n };\n\n return {\n find,\n parse,\n stringify,\n run,\n eval: evalCommand,\n cli,\n tool,\n repl: replFn,\n api,\n help,\n completion,\n mcp,\n serve,\n };\n}\n","import { padroneAutoOutput } from '../extension/auto-output.ts';\nimport { padroneColor } from '../extension/color.ts';\nimport type { HelpCommand } from '../extension/help.ts';\nimport { padroneHelp } from '../extension/help.ts';\nimport { padroneInteractive } from '../extension/interactive.ts';\nimport { padroneRepl } from '../extension/repl.ts';\nimport { padroneSignalHandling } from '../extension/signal.ts';\nimport { padroneStdin } from '../extension/stdin.ts';\nimport { padroneSuggestions } from '../extension/suggestions.ts';\nimport type { VersionCommand } from '../extension/version.ts';\nimport { padroneVersion } from '../extension/version.ts';\nimport { createWrapHandler } from '../feature/wrap.ts';\nimport type {\n AnyPadroneCommand,\n AnyPadroneProgram,\n CommandTypesBase,\n DefineCommandBuilder,\n DefineCommandContext,\n InterceptorFactory,\n InterceptorMeta,\n PadroneBuilder,\n PadroneCommand,\n PadroneInterceptorFn,\n PadroneProgram,\n PadroneSchema,\n RegisteredInterceptor,\n} from '../types/index.ts';\nimport { commandSymbol, findCommandByName, lazyResolver, mergeCommands, repathCommandTree, resolveCommand } from './commands.ts';\nimport { RoutingError } from './errors.ts';\nimport type { ExecContext } from './exec.ts';\nimport { collectInterceptors, errorResultWithSignal, execCommand } from './exec.ts';\nimport { toRegisteredInterceptor } from './interceptors.ts';\nimport { createProgramMethods } from './program-methods.ts';\nimport { hasInteractiveConfig, isAsyncBranded, makeThenable, noop, withPromiseDrain } from './results.ts';\nimport { parseCommand } from './validate.ts';\n\nexport { buildReplCompleter } from './commands.ts';\nexport { asyncSchema } from './results.ts';\n\n/**\n * Options for configuring which built-in extensions are applied by default.\n */\nexport type PadroneBuiltins = {\n /** Enable `help` command, `--help` / `-h` flags, and default help display. Defaults to `true`. */\n help?: boolean;\n /** Enable `version` command and `--version` / `-v` / `-V` flags. Defaults to `true`. */\n version?: boolean;\n /** Enable `repl` command and `--repl` flag. Defaults to `true`. */\n repl?: boolean;\n /** Enable `--color` / `--no-color` flag support. Defaults to `true`. */\n color?: boolean;\n /** Enable \"Did you mean?\" suggestions for unknown commands and options. Defaults to `true`. */\n suggestions?: boolean;\n /** Enable signal handling (SIGINT, SIGTERM, SIGHUP). Defaults to `true`. */\n signal?: boolean;\n /** Enable automatic result output for `cli()`. Defaults to `true`. */\n autoOutput?: boolean;\n /** Enable stdin piping support. Defaults to `true`. */\n stdin?: boolean;\n /** Enable interactive prompting for missing arguments. Defaults to `true`. */\n interactive?: boolean;\n};\n\nexport type PadroneOptions = { builtins?: PadroneBuiltins };\n\n// biome-ignore lint/complexity/noBannedTypes: empty object signals \"all defaults enabled\"\ntype DefaultBuiltins = {};\n\ntype BuiltinCommands<B> = [...(B extends { help: false } ? [] : [HelpCommand]), ...(B extends { version: false } ? [] : [VersionCommand])];\n\nexport function createPadrone<TProgramName extends string, const TBuiltins extends PadroneBuiltins = DefaultBuiltins>(\n name: TProgramName,\n options?: { builtins?: TBuiltins },\n): PadroneProgram<TProgramName, '', '', PadroneSchema<void>, void, BuiltinCommands<TBuiltins>> {\n let builder: any = createPadroneBuilder({ name, path: '', commands: [] } as any);\n\n const b = options?.builtins;\n if (b?.help !== false) builder = builder.extend(padroneHelp());\n if (b?.version !== false) builder = builder.extend(padroneVersion());\n if (b?.repl !== false) builder = builder.extend(padroneRepl());\n if (b?.color !== false) builder = builder.extend(padroneColor());\n if (b?.suggestions !== false) builder = builder.extend(padroneSuggestions());\n if (b?.signal !== false) builder = builder.extend(padroneSignalHandling());\n if (b?.autoOutput !== false) builder = builder.extend(padroneAutoOutput());\n if (b?.stdin !== false) builder = builder.extend(padroneStdin());\n if (b?.interactive !== false) builder = builder.extend(padroneInteractive());\n\n return builder as any;\n}\n\nexport function createPadroneBuilder<TBuilder extends PadroneProgram = PadroneProgram>(\n inputCommand: AnyPadroneCommand,\n): TBuilder & { [commandSymbol]: AnyPadroneCommand } {\n // Re-parent direct subcommands so getCommandRuntime walks to the current root,\n // not a stale parent from before .runtime()/.configure()/etc.\n const existingCommand =\n inputCommand.commands?.length && inputCommand.commands.some((c) => c.parent && c.parent !== inputCommand)\n ? {\n ...inputCommand,\n commands: inputCommand.commands.map((c) => (c.parent && c.parent !== inputCommand ? { ...c, parent: inputCommand } : c)),\n }\n : inputCommand;\n\n const parseCommandFn = (input: string | undefined) => parseCommand(input, existingCommand, findCommandByName);\n const collectInterceptorsFn = (cmd: AnyPadroneCommand) => collectInterceptors(cmd, existingCommand);\n\n // Execution context shared by exec and program methods.\n // `builder` is assigned after the builder object is created (forward ref resolved at runtime only).\n const execCtx: ExecContext = {\n rootCommand: existingCommand,\n builder: undefined as any,\n parseCommandFn,\n collectInterceptorsFn,\n };\n\n const evalCommand: AnyPadroneProgram['eval'] = (input, evalOptions) => {\n try {\n const result = execCommand(input as string, execCtx, evalOptions, 'soft', evalOptions?.caller ?? 'eval');\n if (result instanceof Promise) return withPromiseDrain(result.catch((err: unknown) => errorResultWithSignal(err))) as any;\n return makeThenable(result);\n } catch (err) {\n return makeThenable(errorResultWithSignal(err)) as any;\n }\n };\n\n const programMethods = createProgramMethods(execCtx, evalCommand);\n\n const builder = {\n extend(extension: (builder: any) => any) {\n return extension(builder);\n },\n configure(config) {\n return createPadroneBuilder({ ...existingCommand, ...config }) as any;\n },\n runtime(runtimeConfig) {\n return createPadroneBuilder({ ...existingCommand, runtime: { ...existingCommand.runtime, ...runtimeConfig } }) as any;\n },\n async() {\n return createPadroneBuilder({ ...existingCommand, isAsync: true }) as any;\n },\n context(transform?: (ctx: unknown) => unknown) {\n if (!transform) return createPadroneBuilder({ ...existingCommand }) as any;\n const existing = existingCommand.contextTransform;\n const composed = existing ? (ctx: unknown) => transform(existing(ctx)) : transform;\n return createPadroneBuilder({ ...existingCommand, contextTransform: composed }) as any;\n },\n arguments(schema, meta) {\n const resolvedArgs = typeof schema === 'function' ? schema(existingCommand.argsSchema as any) : schema;\n const isAsync = existingCommand.isAsync || isAsyncBranded(resolvedArgs) || hasInteractiveConfig(meta);\n return createPadroneBuilder({ ...existingCommand, argsSchema: resolvedArgs, meta, isAsync }) as any;\n },\n action(handler = noop) {\n const baseHandler = existingCommand.action ?? noop;\n return createPadroneBuilder({\n ...existingCommand,\n action: (args: any, ctx: any) => (handler as any)(args, ctx, baseHandler),\n }) as any;\n },\n wrap(config) {\n const handler = createWrapHandler(config, existingCommand.argsSchema as any, existingCommand.meta?.positional);\n return createPadroneBuilder({ ...existingCommand, action: handler }) as any;\n },\n command(nameOrNames: string | readonly string[], builderFn?: (builder: any) => any) {\n const name = Array.isArray(nameOrNames) ? nameOrNames[0] : nameOrNames;\n const aliases = Array.isArray(nameOrNames) && nameOrNames.length > 1 ? (nameOrNames.slice(1) as string[]) : undefined;\n\n const existingSubcommand = existingCommand.commands?.find((c) => c.name === name) as AnyPadroneCommand | undefined;\n if (existingSubcommand) resolveCommand(existingSubcommand);\n\n const initialCommand: AnyPadroneCommand = existingSubcommand\n ? { ...existingSubcommand, aliases: aliases ?? existingSubcommand.aliases, parent: existingCommand }\n : ({\n name,\n path: existingCommand.path ? `${existingCommand.path} ${name}` : name,\n aliases,\n parent: existingCommand,\n '~types': {} as any,\n } satisfies PadroneCommand);\n\n if (builderFn) {\n const lazyCmd: AnyPadroneCommand = { ...initialCommand };\n (lazyCmd as any)[lazyResolver] = (target: AnyPadroneCommand) => {\n const savedParent = target.parent;\n const b = createPadroneBuilder(target);\n const commandObj = ((builderFn(b as any) as unknown as typeof b)?.[commandSymbol] as AnyPadroneCommand) ?? target;\n const mergedCommandObj = existingSubcommand ? mergeCommands(existingSubcommand, commandObj) : commandObj;\n Object.assign(target, mergedCommandObj);\n // Restore parent: mergeCommands copies the existing command's parent which may be stale\n // (e.g. when an extension is applied twice, the merged parent predates re-parenting).\n target.parent = savedParent;\n };\n\n const commands = existingCommand.commands || [];\n const existingIndex = commands.findIndex((c) => c.name === name);\n const updatedCommands =\n existingIndex >= 0\n ? [...commands.slice(0, existingIndex), lazyCmd, ...commands.slice(existingIndex + 1)]\n : [...commands, lazyCmd];\n\n return createPadroneBuilder({ ...existingCommand, commands: updatedCommands }) as any;\n }\n\n const commands = existingCommand.commands || [];\n const existingIndex = commands.findIndex((c) => c.name === name);\n const updatedCommands =\n existingIndex >= 0\n ? [...commands.slice(0, existingIndex), initialCommand, ...commands.slice(existingIndex + 1)]\n : [...commands, initialCommand];\n\n return createPadroneBuilder({ ...existingCommand, commands: updatedCommands }) as any;\n },\n\n mount(nameOrNames: string | readonly string[], program: unknown, options?: { context?: (ctx: unknown) => unknown }) {\n const name = Array.isArray(nameOrNames) ? nameOrNames[0] : nameOrNames;\n const aliases = Array.isArray(nameOrNames) && nameOrNames.length > 1 ? (nameOrNames.slice(1) as string[]) : undefined;\n\n const programCommand = (program as any)[commandSymbol] as AnyPadroneCommand | undefined;\n if (!programCommand) throw new RoutingError('Cannot mount: not a valid Padrone program');\n\n const remounted = repathCommandTree(programCommand, name, existingCommand.path || '', existingCommand);\n remounted.aliases = aliases;\n\n if (options?.context) {\n const existing = remounted.contextTransform;\n remounted.contextTransform = existing ? (ctx: unknown) => existing(options.context!(ctx)) : options.context;\n }\n\n const existingSubcommand = existingCommand.commands?.find((c) => c.name === name) as AnyPadroneCommand | undefined;\n const mergedCommandObj = existingSubcommand ? mergeCommands(existingSubcommand, remounted) : remounted;\n\n const commands = existingCommand.commands || [];\n const existingIndex = commands.findIndex((c) => c.name === name);\n const updatedCommands =\n existingIndex >= 0\n ? [...commands.slice(0, existingIndex), mergedCommandObj, ...commands.slice(existingIndex + 1)]\n : [...commands, mergedCommandObj];\n\n return createPadroneBuilder({ ...existingCommand, commands: updatedCommands }) as any;\n },\n\n intercept(metaOrFn: InterceptorMeta | PadroneInterceptorFn<any, any, any>, factory?: InterceptorFactory<any, any, any>) {\n const registered: RegisteredInterceptor = toRegisteredInterceptor(metaOrFn, factory);\n return createPadroneBuilder({\n ...existingCommand,\n interceptors: [...(existingCommand.interceptors ?? []), registered],\n }) as any;\n },\n\n ...programMethods,\n\n get info() {\n return {\n name: existingCommand.name,\n title: existingCommand.title,\n description: existingCommand.description,\n version: existingCommand.version,\n examples: existingCommand.examples,\n deprecated: existingCommand.deprecated,\n commands: (existingCommand.commands ?? []).map((c) => c.name),\n };\n },\n\n '~types': {} as any,\n\n [commandSymbol]: existingCommand,\n } satisfies AnyPadroneProgram & { [commandSymbol]: AnyPadroneCommand } as any;\n\n // Fix forward reference: execCtx.builder needs to reference the builder after it's created\n execCtx.builder = builder;\n\n return builder as TBuilder & { [commandSymbol]: AnyPadroneCommand };\n}\n\n/**\n * Identity helper that contextually types a command builder callback while preserving its full return type.\n * Use this when defining commands in separate files — the parent program retains exact type information\n * about the subcommand's args, result, and nested commands.\n *\n * The builder's context includes `DefineCommandContext` by default (optional `logger`, `tracing`, `progress`).\n * Override globally via module augmentation on `DefineCommandContext`, or per-command via `.requires()`.\n *\n * @example Direct form (most common)\n * ```ts\n * export const myCommand = defineCommand((c) =>\n * c.arguments(z.object({ name: z.string() }))\n * .action((args) => console.log(args.name))\n * );\n * ```\n *\n * @example With required interceptor context\n * ```ts\n * export const adminCommand = defineCommand()\n * .requires<{ adminDb: AdminDB }>()\n * .define((c) => c.action((_args, ctx) => ctx.context.adminDb.query(...)));\n * ```\n */\nexport function defineCommand<TContext = unknown, TOut extends CommandTypesBase = CommandTypesBase>(\n fn: (builder: PadroneBuilder<string, string, string, PadroneSchema<void>, void, [], any, false, TContext, DefineCommandContext>) => TOut,\n): typeof fn;\nexport function defineCommand(): DefineCommandBuilder;\nexport function defineCommand(fn?: any): any {\n if (fn) return fn;\n const builder: DefineCommandBuilder = {\n requires: () => builder as any,\n define: (f: any) => f,\n };\n return builder;\n}\n","import type { ShellType } from '#src/util/shell-utils.ts';\nimport { resolveAllCommands } from '../core/commands.ts';\nimport type { AnyPadroneBuilder, CommandTypesBase, PadroneCommand } from '../types/index.ts';\nimport type { PadroneSchema } from '../types/schema.ts';\nimport type { WithCommand } from '../util/type-utils.ts';\nimport { getRootCommand } from '../util/utils.ts';\nimport { passthroughSchema } from './utils.ts';\n\n// ── Types ────────────────────────────────────────────────────────────────\n\ntype CompletionArgs = { shell?: string; setup?: boolean };\n\ntype CompletionCommand = PadroneCommand<'completion', '', PadroneSchema<CompletionArgs>, string, [], [], true>;\n\nexport type WithCompletion<T> = WithCommand<T, 'completion', CompletionCommand>;\n\n// ── Extension ────────────────────────────────────────────────────────────\n\n/**\n * Extension that adds the `completion` command for shell completion script generation.\n *\n * Usage:\n * ```ts\n * createPadrone('my-cli').extend(padroneCompletion())\n * ```\n */\nexport function padroneCompletion(): <T extends CommandTypesBase>(builder: T) => WithCompletion<T> {\n return ((builder: AnyPadroneBuilder) =>\n builder.command('completion', (c) =>\n c\n .configure({ description: 'Generate shell completion scripts', hidden: true })\n .arguments(passthroughSchema({ shell: 'string', setup: 'boolean' }), { positional: ['shell'] })\n .async()\n .action(async (args, ctx) => {\n const rootCommand = getRootCommand(ctx.command);\n resolveAllCommands(rootCommand);\n const { detectShell, generateCompletionOutput, setupCompletions } = await import('../feature/completion.ts');\n const shell = args.shell as ShellType;\n const setup = args.setup;\n if (setup) {\n const resolvedShell = shell ?? (await detectShell());\n if (!resolvedShell) throw new Error('Could not detect shell. Specify one: completion bash --setup');\n const setupResult = await setupCompletions(rootCommand.name, resolvedShell);\n return `${setupResult.updated ? 'Updated' : 'Added'} ${rootCommand.name} completions in ${setupResult.file}`;\n }\n return generateCompletionOutput(rootCommand, shell);\n }),\n )) as any;\n}\n","import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { applyValues } from '../core/args.ts';\nimport { ConfigError } from '../core/errors.ts';\nimport { defineInterceptor } from '../core/interceptors.ts';\nimport { thenMaybe } from '../core/results.ts';\nimport type { AnyPadroneBuilder, CommandTypesBase, InterceptorValidateContext } from '../types/index.ts';\nimport type { WithAsync } from '../util/type-utils.ts';\nimport { getRootCommand } from '../util/utils.ts';\n\n// ── Types ────────────────────────────────────────────────────────────────\n\nexport type PadroneConfigOptions = {\n /** Config file names to auto-detect (e.g. `['config.json', '.myapprc']`). First found is used. */\n files?: string | string[];\n /** Schema to validate and transform config file data into the args shape. */\n schema?: StandardSchemaV1;\n /** Disable this extension. */\n disabled?: boolean;\n /** Whether to add `--config` / `-c` flag support. Defaults to `true`. */\n flag?: boolean;\n /** Whether subcommands inherit this interceptor. Defaults to `true`. */\n inherit?: boolean;\n /**\n * Search for config files in the user's platform-specific config directory.\n * - `true` — use the program name as the subdirectory (e.g. program `'myapp'` → `~/.config/myapp/`).\n * - `string` — use a custom app name as the subdirectory.\n * - `false` — disable (default).\n *\n * Directories searched (after cwd):\n * - **Linux**: `$XDG_CONFIG_HOME/<app>` or `~/.config/<app>`\n * - **macOS**: `~/Library/Application Support/<app>` (or `$XDG_CONFIG_HOME/<app>` when set)\n * - **Windows**: `%APPDATA%\\<app>`\n *\n * Config files found in cwd always take precedence over XDG paths.\n */\n xdg?: string | boolean;\n /**\n * Custom config loader. When provided, replaces the built-in file system loader.\n * Useful for testing or non-CLI environments.\n */\n loadConfig?: (\n files: string | string[],\n xdgAppName?: string,\n ) => Record<string, unknown> | undefined | Promise<Record<string, unknown> | undefined>;\n};\n\n// ── File system config loader ───────────────────────────────────────────\n\n// Lazily resolved Node.js modules — cached after first import to keep loadConfig sync after initialization.\nlet _fs: typeof import('node:fs') | undefined;\nlet _path: typeof import('node:path') | undefined;\n\nasync function initNodeModules(): Promise<void> {\n if (_fs && _path) return;\n _fs = await import('node:fs');\n _path = await import('node:path');\n}\n\n// Eagerly start caching node modules so loadConfig is sync by the time it's called.\ntry {\n if (typeof process !== 'undefined') initNodeModules();\n} catch {\n // Non-CLI environments (browser, edge) — ignore\n}\n\nfunction getUserConfigDir(path: typeof import('node:path'), appName: string): string | undefined {\n const platform = process.platform;\n\n // Respect XDG_CONFIG_HOME on all platforms when explicitly set\n const xdgHome = process.env.XDG_CONFIG_HOME;\n if (xdgHome) return path.join(xdgHome, appName);\n\n const home = process.env.HOME || process.env.USERPROFILE;\n if (!home) return undefined;\n\n if (platform === 'win32') {\n const appData = process.env.APPDATA;\n return appData ? path.join(appData, appName) : path.join(home, 'AppData', 'Roaming', appName);\n }\n if (platform === 'darwin') return path.join(home, 'Library', 'Application Support', appName);\n\n // Linux and other Unix — default XDG path\n return path.join(home, '.config', appName);\n}\n\nfunction resolveConfigPath(fs: any, path: any, cwd: string, files: string | string[], xdgAppName?: string): string | undefined {\n if (typeof files === 'string') {\n const abs = path.isAbsolute(files) ? files : path.resolve(cwd, files);\n if (!fs.existsSync(abs)) {\n console.error(`Config file not found: ${abs}`);\n return undefined;\n }\n return abs;\n }\n\n // Search in cwd first\n for (const candidate of files) {\n const abs = path.isAbsolute(candidate) ? candidate : path.resolve(cwd, candidate);\n if (fs.existsSync(abs)) return abs;\n }\n\n // Then search in the user config directory (XDG / platform-specific)\n if (xdgAppName) {\n const configDir = getUserConfigDir(path, xdgAppName);\n if (configDir) {\n for (const candidate of files) {\n const abs = path.join(configDir, candidate);\n if (fs.existsSync(abs)) return abs;\n }\n }\n }\n\n return undefined;\n}\n\nfunction loadConfigSync(\n fs: typeof import('node:fs'),\n path: typeof import('node:path'),\n files: string | string[],\n xdgAppName?: string,\n): Record<string, unknown> | undefined | Promise<Record<string, unknown> | undefined> {\n const cwd = process.cwd();\n const absolutePath = resolveConfigPath(fs, path, cwd, files, xdgAppName);\n if (!absolutePath) return undefined;\n\n const getContent = () => fs.readFileSync(absolutePath, 'utf-8');\n const ext = path.extname(absolutePath).toLowerCase();\n\n if (ext === '.yaml' || ext === '.yml') return Bun.YAML.parse(getContent()) as any;\n if (ext === '.toml') return Bun.TOML.parse(getContent()) as any;\n if (ext === '.jsonc') return Bun.JSONC.parse(getContent()) as any;\n if (ext === '.json') {\n if (Bun.JSONC) return Bun.JSONC.parse(getContent()) as any;\n try {\n return JSON.parse(getContent());\n } catch {\n return Bun.JSONC.parse(getContent()) as any;\n }\n }\n if (ext === '.js' || ext === '.cjs' || ext === '.mjs' || ext === '.ts' || ext === '.cts' || ext === '.mts') {\n return import(/* @vite-ignore */ absolutePath).then((mod) => mod.default ?? mod);\n }\n\n // Unknown extension — try JSON\n try {\n return JSON.parse(getContent());\n } catch {\n console.error(`Unable to parse config file: ${absolutePath}`);\n return undefined;\n }\n}\n\n/**\n * Built-in config file loader. Directly accesses the file system.\n * Returns `undefined` in non-CLI environments where `node:fs` is unavailable.\n */\nfunction loadConfig(\n files: string | string[],\n xdgAppName?: string,\n): Record<string, unknown> | undefined | Promise<Record<string, unknown> | undefined> {\n if (typeof process === 'undefined') return undefined;\n\n try {\n if (_fs && _path) return loadConfigSync(_fs, _path, files, xdgAppName);\n return initNodeModules().then(() => loadConfigSync(_fs!, _path!, files, xdgAppName));\n } catch {\n return undefined;\n }\n}\n\n// ── Extension ────────────────────────────────────────────────────────────\n\n/**\n * Extension that handles config file loading, validation, and merging into command arguments.\n *\n * Features:\n * - `--config` / `-c` flag for explicit config file path (can be disabled via `flag: false`)\n * - Auto-detection of config files from a list of candidate names\n * - Optional schema validation and transformation of config data\n * - Directly accesses the file system (gracefully no-ops in non-CLI environments)\n *\n * Config values have the lowest precedence (CLI > stdin > env > config).\n *\n * Not included in the default built-in extensions — must be explicitly added:\n * ```ts\n * createPadrone('my-cli')\n * .extend(padroneConfig({\n * files: ['config.json', '.myapprc'],\n * schema: z.object({ port: z.number(), host: z.string() }),\n * }))\n * ```\n */\nexport function padroneConfig(options?: PadroneConfigOptions): <T extends CommandTypesBase>(builder: T) => WithAsync<T> {\n if (options?.disabled) {\n const disabled = defineInterceptor({ id: 'padrone:config', name: 'padrone:config', order: -999, disabled: true }, () => ({}));\n return ((builder: AnyPadroneBuilder) => builder.intercept(disabled)) as any;\n }\n\n const configFiles = options?.files ? (Array.isArray(options.files) ? options.files : [options.files]) : undefined;\n const configSchema = options?.schema;\n const flagEnabled = options?.flag !== false;\n const inherit = options?.inherit;\n const xdgOption = options?.xdg;\n const configLoader = options?.loadConfig ?? loadConfig;\n\n const interceptor = defineInterceptor(\n { id: 'padrone:config', name: 'padrone:config', order: -999, ...(inherit === false && { inherit: false }) },\n () => ({\n validate(ctx: InterceptorValidateContext, next) {\n // Extract --config / -c from rawArgs\n let explicitConfigPath: string | undefined;\n if (flagEnabled) {\n explicitConfigPath = (ctx.rawArgs.config ?? ctx.rawArgs.c) as string | undefined;\n if (typeof explicitConfigPath === 'string') {\n delete ctx.rawArgs.config;\n delete ctx.rawArgs.c;\n }\n }\n\n // Skip entirely when there's nothing to load\n if (!explicitConfigPath && !configFiles) return next();\n\n // Resolve XDG app name: true → derive from root command name, string → use as-is\n let xdgAppName: string | undefined;\n if (typeof xdgOption === 'string') xdgAppName = xdgOption;\n else if (xdgOption === true) xdgAppName = getRootCommand(ctx.command).name;\n\n // Load config data: explicit --config flag takes priority, then auto-detect\n const configDataOrPromise = configLoader(explicitConfigPath ?? configFiles ?? [], xdgAppName);\n\n const applyConfig = (configData: Record<string, unknown> | undefined) => {\n if (!configData) return next();\n\n // Validate against schema if provided\n if (configSchema) {\n const validated = configSchema['~standard'].validate(configData);\n return thenMaybe(validated, (result) => {\n if (result.issues) {\n const issueMessages = result.issues\n .map((i: StandardSchemaV1.Issue) => ` - ${i.path?.join('.') || 'root'}: ${i.message}`)\n .join('\\n');\n throw new ConfigError(`Invalid config file:\\n${issueMessages}`, {\n command: ctx.command.path || ctx.command.name,\n });\n }\n const validatedData = result.value as Record<string, unknown>;\n const mergedRawArgs = applyValues(ctx.rawArgs, validatedData);\n return next({ rawArgs: mergedRawArgs });\n });\n }\n\n // No schema — pass through as-is\n const mergedRawArgs = applyValues(ctx.rawArgs, configData);\n return next({ rawArgs: mergedRawArgs });\n };\n\n return thenMaybe(configDataOrPromise, applyConfig);\n },\n }),\n );\n\n return ((builder: AnyPadroneBuilder) => builder.intercept(interceptor)) as any;\n}\n","// ── File resolution ─────────────────────────────────────────────────────\n\n/** Returns ordered list of `.env` file names to load (no fs access). */\nexport function resolveEnvFiles(modes: string[] = [], local = true, base = true): string[] {\n const files: string[] = [];\n if (base) {\n files.push('.env');\n if (local) files.push('.env.local');\n }\n for (const mode of modes) {\n files.push(`.env.${mode}`);\n if (local) files.push(`.env.${mode}.local`);\n }\n return files;\n}\n\n// ── Parser ──────────────────────────────────────────────────────────────\n\n/** Parse a `.env` file string into key-value pairs. */\nexport function parseEnvFile(content: string): Record<string, string> {\n const result: Record<string, string> = {};\n const lines = content.split('\\n');\n let i = 0;\n\n while (i < lines.length) {\n const line = lines[i]!.trim();\n i++;\n\n // Skip empty lines and comments\n if (!line || line.startsWith('#')) continue;\n\n // Strip optional `export ` prefix\n const stripped = line.startsWith('export ') ? line.slice(7) : line;\n\n const eqIndex = stripped.indexOf('=');\n if (eqIndex === -1) continue;\n\n const key = stripped.slice(0, eqIndex).trim();\n let raw = stripped.slice(eqIndex + 1);\n\n // Detect quoted values\n const trimmedRaw = raw.trimStart();\n const quote = trimmedRaw[0];\n\n if (quote === '\"' || quote === \"'\" || quote === '`') {\n let value = trimmedRaw.slice(1);\n\n // Check for closing quote on the same line\n const closeIndex = findClosingQuote(value, quote);\n if (closeIndex !== -1) {\n value = value.slice(0, closeIndex);\n } else {\n // Multiline: accumulate until closing quote\n while (i < lines.length) {\n const nextLine = lines[i]!;\n i++;\n const ci = findClosingQuote(nextLine, quote);\n if (ci !== -1) {\n value += `\\n${nextLine.slice(0, ci)}`;\n break;\n }\n value += `\\n${nextLine}`;\n }\n }\n\n if (quote === '\"') value = unescapeDoubleQuoted(value);\n result[key] = value;\n } else {\n // Unquoted: strip inline comments, trim\n const commentIndex = raw.indexOf(' #');\n if (commentIndex !== -1) raw = raw.slice(0, commentIndex);\n result[key] = raw.trim();\n }\n }\n\n return result;\n}\n\nfunction findClosingQuote(s: string, quote: string): number {\n let i = 0;\n while (i < s.length) {\n if (s[i] === '\\\\' && quote === '\"') {\n i += 2; // skip escaped char\n continue;\n }\n if (s[i] === quote) return i;\n i++;\n }\n return -1;\n}\n\nfunction unescapeDoubleQuoted(s: string): string {\n return s.replace(/\\\\n/g, '\\n').replace(/\\\\r/g, '\\r').replace(/\\\\t/g, '\\t').replace(/\\\\\"/g, '\"').replace(/\\\\\\\\/g, '\\\\');\n}\n\n// ── Variable expansion ──────────────────────────────────────────────────\n\n/**\n * Expand `$VAR`, `${VAR}`, `${VAR:-default}`, `${VAR-default}` in a string.\n * Escaped `\\$` produces a literal `$`. Undefined variables resolve to `\"\"`.\n */\nexport function expandVariables(value: string, env: Record<string, string | undefined>): string {\n let result = '';\n let i = 0;\n\n while (i < value.length) {\n if (value[i] === '\\\\' && value[i + 1] === '$') {\n result += '$';\n i += 2;\n continue;\n }\n\n if (value[i] === '$') {\n i++;\n if (i >= value.length) {\n result += '$';\n break;\n }\n\n if (value[i] === '{') {\n // ${VAR}, ${VAR:-default}, ${VAR-default}\n i++;\n const closeIdx = value.indexOf('}', i);\n if (closeIdx === -1) {\n result += `\\${${value.slice(i)}`;\n break;\n }\n\n const expr = value.slice(i, closeIdx);\n i = closeIdx + 1;\n\n const colonDashIdx = expr.indexOf(':-');\n const dashIdx = colonDashIdx === -1 ? expr.indexOf('-') : -1;\n\n if (colonDashIdx !== -1) {\n // ${VAR:-default} — use default if unset or empty\n const varName = expr.slice(0, colonDashIdx);\n const fallback = expr.slice(colonDashIdx + 2);\n const val = env[varName];\n result += val ? val : expandVariables(fallback, env);\n } else if (dashIdx !== -1) {\n // ${VAR-default} — use default only if unset\n const varName = expr.slice(0, dashIdx);\n const fallback = expr.slice(dashIdx + 1);\n const val = env[varName];\n result += val !== undefined ? val : expandVariables(fallback, env);\n } else {\n result += env[expr] ?? '';\n }\n } else {\n // $VAR — collect word chars\n let varName = '';\n while (i < value.length && /[\\w]/.test(value[i]!)) {\n varName += value[i];\n i++;\n }\n if (varName) {\n result += env[varName] ?? '';\n } else {\n result += '$';\n }\n }\n continue;\n }\n\n result += value[i];\n i++;\n }\n\n return result;\n}\n\n// ── File loading ────────────────────────────────────────────────────────\n\nexport type LoadEnvFilesOptions = {\n dir?: string;\n modes?: string[];\n local?: boolean;\n override?: boolean;\n base?: boolean;\n};\n\n/**\n * Load and merge `.env` files, returning the combined key-value map.\n * Variable expansion uses the merged file values + process env as lookup.\n *\n * Returns synchronously when `node:fs`/`node:path` are already cached (typical),\n * or a Promise on the very first call.\n */\nexport function loadEnvFiles(\n options: LoadEnvFilesOptions,\n processEnv: Record<string, string | undefined>,\n): Record<string, string> | Promise<Record<string, string>> {\n if (typeof process === 'undefined') return {};\n\n try {\n if (_fs && _path) return loadEnvFilesSync(_fs, _path, options, processEnv);\n return initNodeModules()\n .then(() => loadEnvFilesSync(_fs!, _path!, options, processEnv))\n .catch(() => ({}) as Record<string, string>);\n } catch {\n return {};\n }\n}\n\n// ── Internals ───────────────────────────────────────────────────────────\n\nlet _fs: typeof import('node:fs') | undefined;\nlet _path: typeof import('node:path') | undefined;\n\nasync function initNodeModules(): Promise<void> {\n if (_fs && _path) return;\n _fs = await import('node:fs');\n _path = await import('node:path');\n}\n\nif (typeof process !== 'undefined') initNodeModules();\n\nfunction loadEnvFilesSync(\n fs: typeof import('node:fs'),\n path: typeof import('node:path'),\n options: LoadEnvFilesOptions,\n processEnv: Record<string, string | undefined>,\n): Record<string, string> {\n const dir = options.dir ?? process.cwd();\n const fileNames = resolveEnvFiles(options.modes, options.local ?? true, options.base ?? true);\n const merged: Record<string, string> = {};\n\n for (const name of fileNames) {\n const filePath = path.resolve(dir, name);\n if (!fs.existsSync(filePath)) continue;\n const content = fs.readFileSync(filePath, 'utf-8');\n const parsed = parseEnvFile(content);\n Object.assign(merged, parsed);\n }\n\n // Expand variables: file values + processEnv as lookup (processEnv wins in lookup unless override)\n const lookup = options.override ? { ...processEnv, ...merged } : { ...merged, ...processEnv };\n for (const key of Object.keys(merged)) {\n merged[key] = expandVariables(merged[key]!, lookup);\n }\n\n return merged;\n}\n","import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { applyValues } from '../core/args.ts';\nimport { defineInterceptor } from '../core/interceptors.ts';\nimport { thenMaybe } from '../core/results.ts';\nimport type { AnyPadroneBuilder, CommandTypesBase, InterceptorValidateContext } from '../types/index.ts';\nimport type { LoadEnvFilesOptions } from '../util/dotenv.ts';\nimport { loadEnvFiles } from '../util/dotenv.ts';\nimport type { WithAsync } from '../util/type-utils.ts';\n\n// ── Types ────────────────────────────────────────────────────────────────\n\nexport type PadroneEnvOptions = {\n /** Env modes to load (e.g. `['production']`). Loads `.env.{mode}` files. */\n modes?: string[];\n /** Whether to load `.env.local` and `.env.{mode}.local` files. @default true */\n local?: boolean;\n /** Directory to search for `.env` files. @default process.cwd() */\n dir?: string;\n /** When `true`, file values override `process.env` values. @default false */\n override?: boolean;\n /** When `false`, the base `.env` (and `.env.local`) files are not loaded. @default true */\n base?: boolean;\n};\n\n// ── Helpers ──────────────────────────────────────────────────────────────\n\nfunction isSchema(value: unknown): value is StandardSchemaV1 {\n return value != null && typeof value === 'object' && '~standard' in value;\n}\n\n// ── Extension ────────────────────────────────────────────────────────────\n\n/**\n * Extension that reads environment variables, validates them against a schema,\n * and merges the transformed values into command arguments.\n *\n * Supports loading `.env` files with mode-based overrides and variable expansion.\n *\n * ```ts\n * // Schema only (reads process.env)\n * .extend(padroneEnv(\n * z.object({ PORT: z.string() }).transform(e => ({ port: Number(e.PORT) }))\n * ))\n *\n * // Schema + .env file loading\n * .extend(padroneEnv(\n * z.object({ PORT: z.string() }).transform(e => ({ port: Number(e.PORT) })),\n * { modes: ['production'] }\n * ))\n *\n * // .env file loading only (no schema validation)\n * .extend(padroneEnv({ modes: ['production'] }))\n * ```\n *\n * Env values have lower precedence than CLI args and stdin, but higher than config files.\n */\nexport function padroneEnv(schema: StandardSchemaV1): <T extends CommandTypesBase>(builder: T) => WithAsync<T>;\nexport function padroneEnv(schema: StandardSchemaV1, options: PadroneEnvOptions): <T extends CommandTypesBase>(builder: T) => WithAsync<T>;\nexport function padroneEnv(options: PadroneEnvOptions): <T extends CommandTypesBase>(builder: T) => WithAsync<T>;\nexport function padroneEnv(\n schemaOrOptions: StandardSchemaV1 | PadroneEnvOptions,\n maybeOptions?: PadroneEnvOptions,\n): <T extends CommandTypesBase>(builder: T) => WithAsync<T> {\n const schema = isSchema(schemaOrOptions) ? schemaOrOptions : undefined;\n const options = isSchema(schemaOrOptions) ? maybeOptions : schemaOrOptions;\n const hasFiles = options?.modes !== undefined;\n const fileOptions: LoadEnvFilesOptions | undefined = hasFiles ? options : undefined;\n const override = options?.override ?? false;\n\n const interceptor = defineInterceptor({ id: 'padrone:env', name: 'padrone:env', order: -1000 }, () => ({\n validate(ctx: InterceptorValidateContext, next) {\n const processEnv = ctx.runtime.env();\n\n const applyEnv = (envFromFiles: Record<string, string>) => {\n const rawEnv = override ? { ...processEnv, ...envFromFiles } : { ...envFromFiles, ...processEnv };\n\n if (schema) {\n const envValidated = schema['~standard'].validate(rawEnv);\n return thenMaybe(envValidated, (result) => {\n if (result.issues || !result.value) return next();\n return next({ rawArgs: applyValues(ctx.rawArgs, result.value as Record<string, unknown>) });\n });\n }\n\n // No schema — merge file env values directly into rawArgs\n if (Object.keys(envFromFiles).length > 0) {\n return next({ rawArgs: applyValues(ctx.rawArgs, envFromFiles) });\n }\n return next();\n };\n\n if (hasFiles) {\n const loaded = loadEnvFiles(fileOptions!, processEnv);\n return thenMaybe(loaded, applyEnv);\n }\n\n return applyEnv({});\n },\n }));\n\n return ((builder: AnyPadroneBuilder) => builder.intercept(interceptor)) as any;\n}\n","import { defineInterceptor } from '../core/interceptors.ts';\nimport type { AnyPadroneBuilder, CommandTypesBase } from '../types/index.ts';\nimport type { InterceptorExecuteResult } from '../types/interceptor.ts';\n\n// ── React element detection ─────────────────────────────────────────────\n\nconst reactElement = Symbol.for('react.element');\nconst reactTransitional = Symbol.for('react.transitional.element');\n\n/** Checks whether a value is a React element (JSX) by inspecting its `$$typeof` symbol. */\nexport function isReactElement(value: unknown): boolean {\n if (value === null || typeof value !== 'object') return false;\n const tag = (value as Record<string | symbol, unknown>).$$typeof;\n return tag === reactElement || tag === reactTransitional;\n}\n\n// ── Types ───────────────────────────────────────────────────────────────\n\nexport type InkOptions = {\n /** Whether to wait for the Ink app to unmount before resolving. Defaults to `true`. */\n waitUntilExit?: boolean;\n /** Options forwarded to Ink's `render()`. */\n render?: import('ink').RenderOptions;\n};\n\n// ── Interceptor ─────────────────────────────────────────────────────────\n\nconst inkMeta = { id: 'padrone:ink', name: 'padrone:ink', order: -1050 } as const;\n\nfunction createInkInterceptor(rawOptions?: InkOptions) {\n return defineInterceptor(inkMeta)\n .requires<{ inkConfig?: InkOptions }>()\n .factory(() => ({\n execute(ctx, next) {\n const ctxCfg = (ctx.context as Record<string, unknown> | undefined)?.inkConfig as InkOptions | undefined;\n const options: InkOptions = { ...ctxCfg, ...rawOptions };\n const { waitUntilExit = true } = options;\n\n const handleResult = async (e: InterceptorExecuteResult): Promise<InterceptorExecuteResult> => {\n let value = e.result;\n if (value instanceof Promise) value = await value;\n if (!isReactElement(value)) return e;\n\n const { render } = await import('ink');\n const instance = render(value as import('react').ReactElement, options.render);\n\n // Unmount on abort so Ink cleans up stdin/stdout\n const onAbort = () => instance.unmount();\n ctx.signal.addEventListener('abort', onAbort, { once: true });\n\n if (waitUntilExit) {\n try {\n await instance.waitUntilExit();\n } finally {\n ctx.signal.removeEventListener('abort', onAbort);\n }\n }\n\n // Return undefined so auto-output skips this result\n return { result: undefined };\n };\n\n const executedOrPromise = next();\n if (executedOrPromise instanceof Promise) return executedOrPromise.then(handleResult);\n return handleResult(executedOrPromise);\n },\n }));\n}\n\n// ── Extension ───────────────────────────────────────────────────────────\n\n/**\n * Extension that renders React (Ink) components returned from command actions.\n *\n * When a command's action returns a React element (JSX), this extension\n * renders it using Ink instead of passing it to the normal output path.\n *\n * Requires `ink` and `react` as peer dependencies.\n *\n * ```ts\n * import { createPadrone, padroneInk } from 'padrone';\n *\n * const program = createPadrone('my-tui')\n * .extend(padroneInk())\n * .command('dashboard', (c) =>\n * c.action(() => <Dashboard />)\n * );\n * ```\n */\nexport function padroneInk(options?: InkOptions): <T extends CommandTypesBase>(builder: T) => T {\n const interceptor = createInkInterceptor(options);\n return ((builder: AnyPadroneBuilder) => builder.intercept(interceptor)) as any;\n}\n","import { defineInterceptor } from '#src/core/interceptors.ts';\nimport { thenMaybe } from '#src/core/results.ts';\nimport type { ResolvedPadroneRuntime } from '#src/core/runtime.ts';\nimport type { AnyPadroneBuilder, CommandTypesBase } from '#src/types/index.ts';\nimport type { WithInterceptor } from '#src/util/type-utils.ts';\nimport type { PadroneTracer } from './tracing.ts';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Log level values ordered by severity. */\nexport type PadroneLogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'silent';\n\n/** Logger instance injected into the command context. */\nexport type PadroneLogger = {\n trace: (...args: unknown[]) => void;\n debug: (...args: unknown[]) => void;\n info: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void;\n error: (...args: unknown[]) => void;\n /** The current effective log level. */\n level: PadroneLogLevel;\n /** Create a child logger with a prefix label. */\n child: (label: string) => PadroneLogger;\n};\n\n/** Configuration for the logger extension. */\nexport type PadroneLoggerConfig = {\n /** Minimum log level to output. Defaults to `'info'`. */\n level?: PadroneLogLevel;\n /** Prefix prepended to every log message. */\n prefix?: string;\n /** Include timestamps in log output. Defaults to `false`. */\n timestamps?: boolean;\n};\n\n/** Builder/program type after applying `padroneLogger()`. Adds `{ logger: PadroneLogger }` to the command context. */\nexport type WithLogger<T> = WithInterceptor<T, { logger: PadroneLogger }>;\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nconst LEVEL_ORDER: Record<PadroneLogLevel, number> = { trace: 0, debug: 1, info: 2, warn: 3, error: 4, silent: 5 };\nconst LEVEL_LABELS: Record<Exclude<PadroneLogLevel, 'silent'>, string> = {\n trace: 'TRACE',\n debug: 'DEBUG',\n info: 'INFO',\n warn: 'WARN',\n error: 'ERROR',\n};\nconst VALID_LEVELS = new Set<string>(Object.keys(LEVEL_ORDER));\n\n/** Format specifier pattern: matches %s, %d, %i, %f, %o, %O, %j, %% */\nconst FORMAT_PATTERN = /%%|%[sdifjoO]/g;\n\n/**\n * Applies printf-style format specifiers to args, following the WHATWG Console Standard\n * and Node.js `util.format` conventions. Remaining args are appended space-separated.\n */\nfunction formatArgs(args: unknown[]): string {\n if (args.length === 0) return '';\n if (typeof args[0] !== 'string' || !FORMAT_PATTERN.test(args[0])) {\n return args.map((a) => (typeof a === 'string' ? a : JSON.stringify(a))).join(' ');\n }\n\n const template = args[0];\n let argIndex = 1;\n const result = template.replace(FORMAT_PATTERN, (token) => {\n if (token === '%%') return '%';\n if (argIndex >= args.length) return token;\n const val = args[argIndex++];\n switch (token) {\n case '%s':\n return String(val);\n case '%d':\n case '%i':\n return String(Math.trunc(Number(val)));\n case '%f':\n return String(Number(val));\n case '%j':\n try {\n return JSON.stringify(val);\n } catch {\n return '[Circular]';\n }\n case '%o':\n case '%O':\n return typeof val === 'string' ? val : JSON.stringify(val);\n default:\n return token;\n }\n });\n\n // Append remaining args that weren't consumed by specifiers\n const remaining = args.slice(argIndex);\n if (remaining.length === 0) return result;\n const tail = remaining.map((a) => (typeof a === 'string' ? a : JSON.stringify(a))).join(' ');\n return `${result} ${tail}`;\n}\n\nfunction resolveCliLevel(rawArgs: Record<string, unknown>): PadroneLogLevel | undefined {\n // --trace → trace level\n if ('trace' in rawArgs) {\n const t = rawArgs.trace;\n delete rawArgs.trace;\n if (t !== false) return 'trace';\n }\n // --verbose / --debug → debug level\n if ('verbose' in rawArgs) {\n const v = rawArgs.verbose;\n delete rawArgs.verbose;\n if (v !== false) return 'debug';\n }\n if ('debug' in rawArgs) {\n const d = rawArgs.debug;\n delete rawArgs.debug;\n if (d !== false) return 'debug';\n }\n // --silent / --quiet → suppress all output\n if ('silent' in rawArgs) {\n const s = rawArgs.silent;\n delete rawArgs.silent;\n if (s !== false) return 'silent';\n }\n if ('quiet' in rawArgs) {\n const q = rawArgs.quiet;\n delete rawArgs.quiet;\n if (q !== false) return 'silent';\n }\n // --log-level=<level> → explicit level (parser keeps kebab-case)\n if ('log-level' in rawArgs) {\n const val = rawArgs['log-level'];\n delete rawArgs['log-level'];\n if (typeof val === 'string' && VALID_LEVELS.has(val)) return val as PadroneLogLevel;\n }\n return undefined;\n}\n\nfunction createLogger(\n runtime: ResolvedPadroneRuntime,\n level: PadroneLogLevel,\n config: ResolvedLoggerConfig,\n tracing?: PadroneTracer,\n): PadroneLogger {\n const threshold = LEVEL_ORDER[level];\n\n function format(lvl: Exclude<PadroneLogLevel, 'silent'>, prefix: string, args: unknown[]): string {\n const parts: string[] = [];\n if (config.timestamps) parts.push(new Date().toISOString());\n parts.push(`[${LEVEL_LABELS[lvl]}]`);\n if (prefix) parts.push(prefix);\n parts.push(formatArgs(args));\n return parts.join(' ');\n }\n\n function makeLogger(prefix: string): PadroneLogger {\n const emit = (lvl: Exclude<PadroneLogLevel, 'silent'>, args: unknown[]) => {\n if (LEVEL_ORDER[lvl] < threshold) return;\n const message = format(lvl, prefix, args);\n tracing?.rootSpan.addEvent('log', {\n 'log.level': lvl,\n 'log.message': args.map((a) => (typeof a === 'string' ? a : JSON.stringify(a))).join(' '),\n });\n if (lvl === 'error' || lvl === 'warn') runtime.error(message);\n else runtime.output(message);\n };\n\n return {\n trace: (...args) => emit('trace', args),\n debug: (...args) => emit('debug', args),\n info: (...args) => emit('info', args),\n warn: (...args) => emit('warn', args),\n error: (...args) => emit('error', args),\n level,\n child: (label) => makeLogger(prefix ? `${prefix} [${label}]` : `[${label}]`),\n };\n }\n\n return makeLogger(config.prefix);\n}\n\n// ---------------------------------------------------------------------------\n// Interceptor\n// ---------------------------------------------------------------------------\n\ntype ResolvedLoggerConfig = { level: PadroneLogLevel; prefix: string; timestamps: boolean };\n\nfunction loggerInterceptor(rawConfig?: PadroneLoggerConfig) {\n return defineInterceptor({ id: 'padrone:logger', name: 'padrone:logger' })\n .requires<{ tracing?: PadroneTracer; loggerConfig?: PadroneLoggerConfig }>()\n .factory(() => {\n let cliLevel: PadroneLogLevel | undefined;\n\n return {\n parse(_ctx, next) {\n return thenMaybe(next(), (res) => {\n cliLevel = resolveCliLevel(res.rawArgs);\n return res;\n });\n },\n\n execute(ctx, next) {\n const ctxCfg = (ctx.context as Record<string, unknown> | undefined)?.loggerConfig as PadroneLoggerConfig | undefined;\n const resolved: ResolvedLoggerConfig = {\n level: cliLevel ?? rawConfig?.level ?? ctxCfg?.level ?? 'info',\n prefix: rawConfig?.prefix ?? '',\n timestamps: rawConfig?.timestamps ?? ctxCfg?.timestamps ?? false,\n };\n const logger = createLogger(ctx.runtime, resolved.level, resolved, ctx.context?.tracing);\n return next({ context: { logger } });\n },\n };\n });\n}\n\n// ---------------------------------------------------------------------------\n// Extension\n// ---------------------------------------------------------------------------\n\n/**\n * Extension that injects a structured logger into the command context.\n *\n * The logger respects a configurable log level threshold, supports prefixed\n * child loggers, and routes output through the runtime's `output`/`error`\n * functions so it works in any environment (terminal, test, web).\n *\n * Supports CLI flags for runtime level overrides:\n * - `--trace` → sets level to `trace`\n * - `--verbose` or `--debug` → sets level to `debug`\n * - `--silent` or `--quiet` → sets level to `silent`\n * - `--log-level=<level>` → sets an explicit level (`trace`, `debug`, `info`, `warn`, `error`, `silent`)\n *\n * CLI flags take precedence over the programmatic config.\n *\n * Provides `{ logger: PadroneLogger }` on the command context.\n * Access it in action handlers as `ctx.context.logger`.\n *\n * Usage:\n * ```ts\n * createPadrone('my-cli')\n * .extend(padroneLogger({ level: 'info' }))\n * .command('sync', (c) =>\n * c.action((_args, ctx) => {\n * ctx.context.logger.info('starting sync');\n * const db = ctx.context.logger.child('db');\n * db.debug('connecting...');\n * })\n * )\n * ```\n *\n * Then run:\n * ```sh\n * my-cli sync --verbose # debug level\n * my-cli sync --quiet # silent\n * my-cli sync --log-level=warn\n * ```\n */\nexport function padroneLogger<T extends CommandTypesBase>(config?: PadroneLoggerConfig): (builder: T) => WithLogger<T> {\n return ((builder: AnyPadroneBuilder) => builder.intercept(loggerInterceptor(config))) as any;\n}\n","import { resolveAllCommands } from '../core/commands.ts';\nimport type { AnyPadroneBuilder, CommandTypesBase, PadroneCommand } from '../types/index.ts';\nimport type { PadroneSchema } from '../types/schema.ts';\nimport type { WithCommand } from '../util/type-utils.ts';\nimport { getRootCommand } from '../util/utils.ts';\nimport { passthroughSchema } from './utils.ts';\n\n// ── Types ────────────────────────────────────────────────────────────────\n\ntype ManArgs = { setup?: boolean; remove?: boolean };\n\ntype ManCommand = PadroneCommand<'man', '', PadroneSchema<ManArgs>, string, [], [], true>;\n\nexport type WithMan<T> = WithCommand<T, 'man', ManCommand>;\n\n// ── Extension ────────────────────────────────────────────────────────────\n\n/**\n * Extension that adds the `man` command for man page generation.\n *\n * Usage:\n * ```ts\n * createPadrone('my-cli').extend(padroneMan())\n * ```\n */\nexport function padroneMan(): <T extends CommandTypesBase>(builder: T) => WithMan<T> {\n return ((builder: AnyPadroneBuilder) =>\n builder.command('man', (c) =>\n c\n .configure({ description: 'Generate man pages', hidden: true })\n .arguments(passthroughSchema({ setup: 'boolean', remove: 'boolean' }))\n .async()\n .action(async (args, ctx) => {\n const rootCommand = getRootCommand(ctx.command);\n resolveAllCommands(rootCommand);\n const { setupManPages, removeManPages, generateDocs } = await import('../docs/index.ts');\n if (args.setup) {\n const setupResult = await setupManPages(rootCommand);\n return `${setupResult.updated ? 'Updated' : 'Installed'} ${setupResult.written.length} man page(s) in ${setupResult.dir}`;\n }\n if (args.remove) {\n const removeResult = await removeManPages(rootCommand);\n return removeResult.removed.length > 0\n ? `Removed ${removeResult.removed.length} man page(s) from ${removeResult.dir}`\n : 'No man pages found to remove.';\n }\n const docsResult = generateDocs(rootCommand, { format: 'man' });\n return docsResult.pages[0]?.content ?? '';\n }),\n )) as any;\n}\n","import { resolveAllCommands } from '../core/commands.ts';\nimport type { PadroneMcpPreferences } from '../feature/mcp.ts';\nimport type { AnyPadroneBuilder, CommandTypesBase, PadroneCommand } from '../types/index.ts';\nimport type { PadroneSchema } from '../types/schema.ts';\nimport type { WithCommand } from '../util/type-utils.ts';\nimport { getRootCommand } from '../util/utils.ts';\nimport { passthroughSchema } from './utils.ts';\n\n// ── Types ────────────────────────────────────────────────────────────────\n\ntype McpArgs = { transport?: string; port?: string; host?: string; basePath?: string };\n\ntype McpCommand = PadroneCommand<'mcp', '', PadroneSchema<McpArgs>, void, [], [], true>;\n\nexport type WithMcp<T> = WithCommand<T, 'mcp', McpCommand>;\n\n// ── Extension ────────────────────────────────────────────────────────────\n\n/**\n * Extension that adds the `mcp` command for starting a Model Context Protocol server.\n *\n * Usage:\n * ```ts\n * createPadrone('my-cli').extend(padroneMcp())\n * ```\n */\nexport function padroneMcp(defaults?: PadroneMcpPreferences): <T extends CommandTypesBase>(builder: T) => WithMcp<T> {\n return ((builder: AnyPadroneBuilder) =>\n builder.command('mcp', (c) =>\n c\n .configure({ description: 'Start a Model Context Protocol server', hidden: true })\n .arguments(passthroughSchema({ transport: 'string', port: 'string', host: 'string', 'base-path': 'string' }), {\n positional: ['transport'],\n })\n .async()\n .action(async (args, ctx) => {\n const rootCommand = getRootCommand(ctx.command);\n resolveAllCommands(rootCommand);\n const { startMcpServer } = await import('../feature/mcp.ts');\n const transport = args.transport === 'stdio' || args.transport === 'http' ? args.transport : undefined;\n const port = args.port ? parseInt(args.port, 10) : undefined;\n const prefs: PadroneMcpPreferences = {\n ...defaults,\n transport: transport ?? defaults?.transport,\n port: port && !Number.isNaN(port) ? port : defaults?.port,\n host: args.host ?? defaults?.host,\n basePath: args['base-path'] ?? defaults?.basePath,\n };\n await startMcpServer(ctx.program, rootCommand, ctx.program.eval, prefs);\n }),\n )) as any;\n}\n","import type {\n PadroneBarConfig,\n PadroneProgressIndicator,\n PadroneProgressOptions,\n PadroneProgressShow,\n PadroneProgressUpdate,\n PadroneSpinnerConfig,\n PadroneSpinnerPreset,\n} from '../core/runtime.ts';\n\n// ---------------------------------------------------------------------------\n// Spinner presets & resolution\n// ---------------------------------------------------------------------------\n\nconst spinnerPresets: Record<PadroneSpinnerPreset, string[]> = {\n dots: ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'],\n line: ['-', '\\\\', '|', '/'],\n arc: ['◜', '◠', '◝', '◞', '◡', '◟'],\n bounce: ['⠁', '⠂', '⠄', '⡀', '⢀', '⠠', '⠐', '⠈'],\n};\n\ntype ResolvedSpinnerConfig = { frames: string[]; interval: number; show: PadroneProgressShow };\n\nfunction resolveSpinnerConfig(config?: PadroneSpinnerConfig): ResolvedSpinnerConfig {\n if (config === false) return { frames: [], interval: 80, show: 'never' };\n if (config === true) return { frames: spinnerPresets.dots, interval: 80, show: 'always' };\n if (typeof config === 'string') return { frames: spinnerPresets[config], interval: 80, show: 'auto' };\n if (typeof config === 'object') {\n return {\n frames: config.frames ?? spinnerPresets.dots,\n interval: config.interval ?? 80,\n show: config.show ?? 'auto',\n };\n }\n return { frames: spinnerPresets.dots, interval: 80, show: 'auto' };\n}\n\n// ---------------------------------------------------------------------------\n// Bar resolution & rendering\n// ---------------------------------------------------------------------------\n\ntype ResolvedBarConfig = {\n width: number;\n filled: string;\n empty: string;\n animation: 'bounce' | 'slide' | 'pulse';\n show: PadroneProgressShow;\n};\n\nconst defaultBarConfig: ResolvedBarConfig = { width: 20, filled: '█', empty: '░', animation: 'bounce', show: 'auto' };\n\nfunction resolveBarConfig(bar: boolean | PadroneBarConfig | undefined): ResolvedBarConfig | undefined {\n if (bar === false) return undefined;\n if (!bar) return { ...defaultBarConfig };\n if (bar === true) return { ...defaultBarConfig, show: 'always' };\n return {\n width: bar.width ?? 20,\n filled: bar.filled ?? '█',\n empty: bar.empty ?? '░',\n animation: bar.animation ?? 'bounce',\n show: bar.show ?? 'always',\n };\n}\n\nconst SEGMENT_RATIO = 0.25;\nconst pulseGradient = ['░', '▒', '▓', '█', '▓', '▒', '░'];\n\nfunction formatIndeterminate(cfg: ResolvedBarConfig, frame: number): string {\n const { width, filled, empty, animation } = cfg;\n const pad = ''.padStart(4);\n\n if (animation === 'pulse') {\n const idx = frame % pulseGradient.length;\n return `${pad} ${pulseGradient[idx]!.repeat(width)}`;\n }\n\n const seg = Math.max(2, Math.round(width * SEGMENT_RATIO));\n const travel = width - seg;\n\n if (animation === 'slide') {\n const offset = frame % (travel + 1);\n return `${pad} ${empty.repeat(offset)}${filled.repeat(seg)}${empty.repeat(travel - offset)}`;\n }\n\n // bounce (default)\n const cycle = travel * 2;\n const pos = frame % cycle;\n const offset = pos <= travel ? pos : cycle - pos;\n return `${pad} ${empty.repeat(offset)}${filled.repeat(seg)}${empty.repeat(width - offset - seg)}`;\n}\n\nfunction formatBar(progress: number | undefined, cfg: ResolvedBarConfig, frame: number): string {\n if (progress === undefined) return formatIndeterminate(cfg, frame);\n const { width, filled, empty } = cfg;\n const clamped = Math.max(0, Math.min(1, progress));\n const filledCount = Math.round(clamped * width);\n const pct = `${Math.round(clamped * 100)}%`.padStart(4);\n return `${pct} ${filled.repeat(filledCount)}${empty.repeat(width - filledCount)}`;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction parseUpdate(value: PadroneProgressUpdate): { message?: string; progress?: number; indeterminate?: boolean; time?: boolean } {\n if (typeof value === 'string') return { message: value };\n if (typeof value === 'number') return { progress: value };\n return value;\n}\n\nfunction formatDuration(ms: number): string {\n const totalSeconds = Math.floor(ms / 1000);\n const hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n if (hours > 0) return `${hours}:${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;\n return `${minutes}:${String(seconds).padStart(2, '0')}`;\n}\n\nfunction estimateEta(samples: { time: number; progress: number }[]): number | undefined {\n if (samples.length < 2) return undefined;\n const first = samples[0]!;\n const last = samples[samples.length - 1]!;\n const progressDelta = last.progress - first.progress;\n if (progressDelta <= 0) return undefined;\n const timeDelta = last.time - first.time;\n const rate = progressDelta / timeDelta;\n const remaining = 1 - last.progress;\n if (remaining <= 0) return 0;\n return remaining / rate;\n}\n\n// ---------------------------------------------------------------------------\n// Factory type\n// ---------------------------------------------------------------------------\n\n/** Factory function that creates a `PadroneProgressIndicator`. */\nexport type PadroneProgressRenderer = (message: string, options?: PadroneProgressOptions) => PadroneProgressIndicator;\n\n// ---------------------------------------------------------------------------\n// Default terminal renderer\n// ---------------------------------------------------------------------------\n\n/**\n * Creates a terminal progress indicator (spinner, bar, or both).\n * Returns a no-op indicator in non-TTY/CI environments.\n */\nexport function createTerminalProgress(message: string, options?: PadroneProgressOptions): PadroneProgressIndicator {\n const spinnerCfg = resolveSpinnerConfig(options?.spinner);\n const successIcon = options?.successIndicator ?? '✔';\n const errorIcon = options?.errorIndicator ?? '✖';\n const barCfg = resolveBarConfig(options?.bar);\n\n const formatFinal = (icon: string, msg: string) => (icon ? `${icon} ${msg}\\n` : `${msg}\\n`);\n\n if (typeof process === 'undefined' || !process.stderr?.isTTY) {\n return {\n update() {},\n succeed(msg, opts) {\n if (msg === null) return;\n const icon = opts?.indicator ?? successIcon;\n if (msg || message) process?.stderr?.write?.(formatFinal(icon, msg || message));\n },\n fail(msg, opts) {\n if (msg === null) return;\n const icon = opts?.indicator ?? errorIcon;\n if (msg || message) process?.stderr?.write?.(formatFinal(icon, msg || message));\n },\n stop() {},\n pause() {},\n resume() {},\n };\n }\n\n // biome-ignore lint/suspicious/noControlCharactersInRegex: ANSI escape stripping requires matching ESC\n const ansiPattern = /\\x1b\\[[0-9;]*m/g;\n\n if (spinnerCfg.show === 'never' && (!barCfg || barCfg.show === 'never') && !message) {\n return { update() {}, succeed() {}, fail() {}, stop() {}, pause() {}, resume() {} };\n }\n\n const showTime = options?.time ?? false;\n const showEta = options?.eta ?? false;\n\n let spinnerFrame = 0;\n let barFrame = 0;\n let text = message;\n let progress: number | undefined;\n let indeterminate = false;\n let stopped = false;\n let paused = false;\n let timeEnabled = showTime;\n let startTime = showTime ? Date.now() : 0;\n const etaSamples: { time: number; progress: number }[] = [];\n let etaMs: number | undefined;\n let etaCalculatedAt = 0;\n\n const writeStderr = process.stderr.write.bind(process.stderr);\n const writeStdout = process.stdout.write.bind(process.stdout);\n let prevLineCount = 0;\n\n const clearLines = () => {\n if (prevLineCount > 1) {\n // Move cursor up and clear each wrapped line above the current one\n for (let i = 1; i < prevLineCount; i++) writeStderr('\\x1b[1A\\x1b[2K');\n }\n writeStderr('\\x1b[2K\\r');\n prevLineCount = 0;\n };\n\n /** Count how many terminal rows `str` occupies, accounting for line wrapping. */\n const lineCount = (str: string): number => {\n const cols = process.stderr.columns || 80;\n // Strip ANSI escape sequences for accurate width measurement\n const visible = str.replace(ansiPattern, '');\n return Math.max(1, Math.ceil(visible.length / cols));\n };\n\n const render = () => {\n if (paused || stopped) return;\n\n const barVisible = barCfg && (barCfg.show === 'always' || (barCfg.show === 'auto' && (progress !== undefined || indeterminate)));\n const spinnerVisible = spinnerCfg.show === 'always' || (spinnerCfg.show === 'auto' && !barVisible);\n\n let line = '';\n if (barVisible) line += formatBar(progress, barCfg!, barFrame);\n const hasEta = showEta && progress !== undefined && progress < 1 && etaMs !== undefined;\n if (timeEnabled || hasEta) {\n const parts: string[] = [];\n if (timeEnabled) parts.push(`⏱ ${formatDuration(Date.now() - startTime)}`);\n if (hasEta) {\n const elapsed = Date.now() - etaCalculatedAt;\n parts.push(`ETA ${formatDuration(Math.max(0, etaMs! - elapsed))}`);\n }\n if (line) line += ' ';\n line += parts.join(' | ');\n }\n if (spinnerVisible) {\n if (line) line += ' ';\n line += frames[spinnerFrame] ?? '';\n }\n if (text) {\n if (line) line += ' ';\n line += text;\n }\n\n if (line) {\n clearLines();\n writeStderr(line);\n prevLineCount = lineCount(line);\n } else {\n clearLines();\n }\n };\n\n const { frames } = spinnerCfg;\n const needsAnimation = spinnerCfg.show !== 'never' || (barCfg && barCfg.show !== 'never');\n const tickInterval = barCfg && barCfg.show !== 'never' ? Math.min(80, spinnerCfg.interval) : spinnerCfg.interval;\n\n const timer = needsAnimation\n ? setInterval(() => {\n spinnerFrame = (spinnerFrame + 1) % (frames.length || 1);\n barFrame++;\n render();\n }, tickInterval)\n : undefined;\n\n // Prevent the spinner timer from keeping the process alive on uncaught errors\n if (timer && typeof timer === 'object' && 'unref' in timer) (timer as NodeJS.Timeout).unref();\n\n render();\n\n const clear = () => {\n if (stopped) return;\n stopped = true;\n paused = false;\n if (timer) clearInterval(timer);\n clearLines();\n };\n\n return {\n update(value) {\n if (stopped) return;\n const parsed = parseUpdate(value);\n if (parsed.message !== undefined) text = parsed.message;\n if (parsed.progress !== undefined) {\n progress = parsed.progress;\n if (showEta) {\n const now = Date.now();\n etaSamples.push({ time: now, progress: parsed.progress });\n const estimated = estimateEta(etaSamples);\n if (estimated !== undefined) {\n etaMs = estimated;\n etaCalculatedAt = now;\n }\n }\n }\n if (parsed.indeterminate !== undefined) {\n indeterminate = parsed.indeterminate;\n if (indeterminate) progress = undefined;\n }\n if (parsed.time !== undefined) {\n if (parsed.time && !timeEnabled) {\n timeEnabled = true;\n startTime = Date.now();\n } else if (!parsed.time) {\n timeEnabled = false;\n }\n }\n render();\n },\n succeed(msg, opts) {\n clear();\n if (msg === null) return;\n const finalMsg = msg ?? text;\n const icon = opts?.indicator ?? successIcon;\n if (finalMsg) writeStderr(formatFinal(icon, finalMsg));\n },\n fail(msg, opts) {\n clear();\n if (msg === null) return;\n const finalMsg = msg ?? text;\n const icon = opts?.indicator ?? errorIcon;\n if (finalMsg) writeStderr(formatFinal(icon, finalMsg));\n },\n stop() {\n clear();\n },\n pause() {\n if (stopped || paused) return;\n paused = true;\n clearLines();\n writeStdout('\\x1b[2K\\r');\n },\n resume() {\n if (stopped || !paused) return;\n paused = false;\n render();\n },\n };\n}\n","import { defineInterceptor } from '../core/interceptors.ts';\nimport type { PadroneBarConfig, PadroneProgressIndicator, PadroneProgressOptions, PadroneSpinnerConfig } from '../core/runtime.ts';\nimport type { AnyPadroneBuilder, CommandTypesBase } from '../types/index.ts';\nimport type { WithInterceptor } from '../util/type-utils.ts';\nimport type { PadroneProgressRenderer } from './progress-renderer.ts';\nimport { createTerminalProgress } from './progress-renderer.ts';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** A progress message value: a plain string, `null` to suppress, or an object with a message and custom indicator icon. */\nexport type PadroneProgressMessage = string | null | { message?: string | null; indicator?: string };\n\n/** Per-phase message configuration for progress indicators. */\nexport type PadroneProgressMessages<TRes = unknown> = {\n /** Message shown during async validation. Defaults to `''` (spinner only). */\n validation?: string;\n /** Message shown while the command's action is running. */\n progress?: string;\n /** Message shown when the command succeeds. `null` to suppress. Defaults to the `progress` message. */\n success?: PadroneProgressMessage | ((result: TRes) => PadroneProgressMessage);\n /** Message shown when the command fails. `null` to suppress. Defaults to the error message. */\n error?: PadroneProgressMessage | ((error: unknown) => PadroneProgressMessage);\n};\n\n/**\n * Progress indicator configuration with messages, visual options, and renderer.\n */\nexport type PadroneProgressConfig<TRes = unknown> = {\n /** Per-phase messages. A string sets the `progress` message; an object configures individual phases. */\n message?: string | PadroneProgressMessages<TRes>;\n /** Spinner configuration. Default `show` is `'auto'` (visible when bar is not shown). `true` forces spinner to always show (even alongside a bar). */\n spinner?: PadroneSpinnerConfig;\n /** Enable a progress bar. `true` for defaults (`show: 'always'`), or a `PadroneBarConfig` object. `false` to disable entirely. When omitted, bar defaults to `show: 'auto'`. */\n bar?: boolean | PadroneBarConfig;\n /** Show elapsed time since the indicator started. Can also be started on demand via `update({ time: true })`. */\n time?: boolean;\n /** Show estimated time remaining based on progress rate. Requires numeric `update()` calls. */\n eta?: boolean;\n /**\n * Custom renderer factory. Called to create the progress indicator.\n * Defaults to the built-in terminal renderer (`createTerminalProgress`).\n */\n renderer?: PadroneProgressRenderer;\n};\n\n/**\n * Shared progress defaults that can be provided via context instead of repeating\n * at each call site. Per-instance message fields are excluded — those always come\n * from the constructor argument.\n *\n * Provide via context as `{ progressConfig: PadroneProgressDefaults }`.\n */\nexport type PadroneProgressDefaults = Pick<PadroneProgressConfig, 'message' | 'spinner' | 'bar' | 'time' | 'eta' | 'renderer'>;\n\n/** Builder/program type after applying `padroneProgress()`. Adds `{ progress: PadroneProgressIndicator }` to the command context. */\nexport type WithProgress<T> = WithInterceptor<T, { progress: PadroneProgressIndicator }>;\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nconst noopIndicator: PadroneProgressIndicator = {\n update() {},\n succeed() {},\n fail() {},\n stop() {},\n pause() {},\n resume() {},\n};\n\nfunction resolveMessage(field: unknown, value: unknown, fallback?: string): { message: string | null | undefined; indicator?: string } {\n const raw = typeof field === 'function' ? (field as (v: unknown) => unknown)(value) : field;\n if (raw === undefined) return { message: fallback };\n if (raw === null || typeof raw === 'string') return { message: raw };\n if (typeof raw === 'object' && raw !== null) {\n const obj = raw as { message?: string | null; indicator?: string };\n return { message: obj.message, indicator: obj.indicator };\n }\n return { message: fallback };\n}\n\nfunction cleanup(\n indicator: PadroneProgressIndicator,\n successConfig: unknown,\n errorConfig: unknown,\n error: unknown,\n result: unknown,\n isError: boolean,\n) {\n if (isError) {\n const fallback = error instanceof Error ? error.message : String(error);\n const { message: errorMsg, indicator: errorIcon } = resolveMessage(errorConfig, error, fallback);\n indicator.fail(errorMsg, errorIcon !== undefined ? { indicator: errorIcon } : undefined);\n } else {\n const { message: successMsg, indicator: successIcon } = resolveMessage(successConfig, result);\n indicator.succeed(successMsg, successIcon !== undefined ? { indicator: successIcon } : undefined);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Interceptor\n// ---------------------------------------------------------------------------\n\nfunction resolveMessages(raw: string | PadroneProgressMessages | undefined): {\n progress: string;\n validation: string;\n success: unknown;\n error: unknown;\n} {\n if (!raw || typeof raw === 'string') {\n return { progress: raw || 'Working...', validation: '', success: undefined, error: undefined };\n }\n return {\n progress: raw.progress ?? 'Working...',\n validation: raw.validation ?? '',\n success: raw.success,\n error: raw.error,\n };\n}\n\nfunction mergeMessages(\n cmd: ReturnType<typeof resolveMessages>,\n ctx: ReturnType<typeof resolveMessages>,\n cmdRaw: string | PadroneProgressMessages | undefined,\n): ReturnType<typeof resolveMessages> {\n // String shorthand: all fields come from the string, no context fallback for individual fields\n if (typeof cmdRaw === 'string') return cmd;\n // Object: per-field fallback to context\n const obj = (typeof cmdRaw === 'object' ? cmdRaw : undefined) as PadroneProgressMessages | undefined;\n return {\n progress: obj?.progress !== undefined ? cmd.progress : (ctx.progress ?? cmd.progress),\n validation: obj?.validation !== undefined ? cmd.validation : ctx.validation || cmd.validation,\n success: obj?.success !== undefined ? cmd.success : (ctx.success ?? cmd.success),\n error: obj?.error !== undefined ? cmd.error : (ctx.error ?? cmd.error),\n };\n}\n\nfunction progressInterceptor(config: string | PadroneProgressConfig) {\n const isObj = typeof config === 'object';\n const rawMessage = typeof config === 'string' ? config : isObj ? config.message : undefined;\n // Raw constructor values — undefined means \"not set by caller\"\n const rawSpinner = isObj ? config.spinner : undefined;\n const rawBar = isObj ? config.bar : undefined;\n const rawRenderer = isObj ? config.renderer : undefined;\n const rawTime = isObj ? config.time : undefined;\n const rawEta = isObj ? config.eta : undefined;\n\n return defineInterceptor({ id: 'padrone:progress', name: 'padrone:progress' })\n .requires<{ progressConfig?: PadroneProgressDefaults }>()\n .factory(() => {\n let indicator: PadroneProgressIndicator | undefined;\n let restoreOutput: (() => void) | undefined;\n // Lazily resolved from context + constructor args\n let resolvedRenderer: PadroneProgressRenderer | undefined;\n let resolvedOptions: PadroneProgressOptions | undefined;\n let msgs: ReturnType<typeof resolveMessages> | undefined;\n\n function resolve(ctx: { context?: { progressConfig?: PadroneProgressDefaults } }) {\n if (resolvedRenderer) return;\n const ctxCfg = (ctx.context as Record<string, unknown> | undefined)?.progressConfig as PadroneProgressDefaults | undefined;\n const spinner = rawSpinner ?? ctxCfg?.spinner;\n const bar = rawBar ?? ctxCfg?.bar;\n const time = rawTime ?? ctxCfg?.time;\n const eta = rawEta ?? ctxCfg?.eta;\n resolvedRenderer = rawRenderer ?? ctxCfg?.renderer ?? createTerminalProgress;\n resolvedOptions =\n spinner !== undefined || bar !== undefined || time !== undefined || eta !== undefined ? { spinner, bar, time, eta } : undefined;\n msgs = mergeMessages(resolveMessages(rawMessage), resolveMessages(ctxCfg?.message), rawMessage);\n }\n\n const teardown = () => {\n restoreOutput?.();\n indicator = undefined;\n restoreOutput = undefined;\n };\n\n return {\n validate(ctx, next) {\n resolve(ctx);\n indicator = resolvedRenderer!(msgs!.validation || msgs!.progress, resolvedOptions);\n\n const originalOutput = ctx.runtime.output;\n const originalError = ctx.runtime.error;\n ctx.runtime.output = (...args: unknown[]) => {\n indicator!.pause();\n originalOutput(...args);\n indicator!.resume();\n };\n ctx.runtime.error = (text: string) => {\n indicator!.pause();\n originalError(text);\n indicator!.resume();\n };\n restoreOutput = () => {\n ctx.runtime.output = originalOutput;\n ctx.runtime.error = originalError;\n };\n\n const onValidationFailure = (error: unknown) => {\n if (indicator) {\n cleanup(indicator, msgs!.success, msgs!.error, error, undefined, true);\n teardown();\n }\n };\n\n const checkResult = (result: any) => {\n if (result.argsResult?.issues) onValidationFailure(new Error('Validation failed'));\n return result;\n };\n\n let result: any;\n try {\n result = next();\n } catch (err) {\n onValidationFailure(err);\n throw err;\n }\n if (result instanceof Promise) {\n return result.then(checkResult, (err: unknown) => {\n onValidationFailure(err);\n throw err;\n });\n }\n return checkResult(result);\n },\n\n execute(_ctx, next) {\n // Transition from validation message to progress message\n if (indicator && msgs!.validation) indicator.update(msgs!.progress);\n\n const effectiveIndicator = indicator ?? noopIndicator;\n\n const onSuccess = (value: unknown) => {\n cleanup(effectiveIndicator, msgs!.success, msgs!.error, undefined, value, false);\n teardown();\n };\n const onError = (err: unknown) => {\n if (indicator) {\n cleanup(indicator, msgs!.success, msgs!.error, err, undefined, true);\n teardown();\n }\n throw err;\n };\n\n let result: any;\n try {\n result = next({ context: { progress: effectiveIndicator } });\n } catch (err) {\n onError(err);\n }\n if (result instanceof Promise) {\n return result.then(\n (r) => {\n if (r.result instanceof Promise) {\n return {\n result: r.result.then(\n (value: unknown) => {\n onSuccess(value);\n return value;\n },\n (err: unknown) => onError(err),\n ),\n };\n }\n onSuccess(r.result);\n return r;\n },\n (err: unknown) => onError(err),\n );\n }\n if (result!.result instanceof Promise) {\n return {\n result: result!.result.then(\n (value: unknown) => {\n onSuccess(value);\n return value;\n },\n (err: unknown) => onError(err),\n ),\n };\n }\n onSuccess(result!.result);\n return result;\n },\n\n shutdown(ctx) {\n // Safety net: if validate/execute cleanup paths were bypassed (e.g., outer interceptor\n // threw during execute before reaching this interceptor's execute handler), stop the indicator.\n if (indicator) {\n cleanup(indicator, msgs!.success, msgs!.error, ctx.error, ctx.result, !!ctx.error);\n teardown();\n }\n },\n };\n })\n .provides<{ progress: PadroneProgressIndicator }>();\n}\n\n// ---------------------------------------------------------------------------\n// Extension\n// ---------------------------------------------------------------------------\n\n/**\n * Extension that adds an auto-managed progress indicator to the command pipeline.\n *\n * - `string` — a single message used for all states.\n * - `PadroneProgressConfig` — separate messages for validation, progress, success, and error.\n *\n * The indicator is automatically started before validation, updated at each phase transition,\n * and stopped on success (`.succeed()`) or failure (`.fail()`).\n *\n * Provides `{ progress: PadroneProgressIndicator }` on the command context.\n * Access it in action handlers as `ctx.context.progress`.\n *\n * Uses the built-in terminal renderer by default. Pass a custom `renderer` for non-terminal\n * environments (web UIs, testing, etc).\n *\n * Usage:\n * ```ts\n * createPadrone('my-cli')\n * .command('sync', (c) =>\n * c.extend(padroneProgress('Syncing...'))\n * .action((_args, ctx) => {\n * ctx.context.progress.update('halfway');\n * })\n * )\n * ```\n */\nexport function padroneProgress<T extends CommandTypesBase>(config?: string | PadroneProgressConfig): (builder: T) => WithProgress<T> {\n return ((builder: AnyPadroneBuilder) => builder.intercept(progressInterceptor(config ?? 'Working...'))) as any;\n}\n","import { resolveAllCommands } from '../core/commands.ts';\nimport type { PadroneServePreferences } from '../feature/serve.ts';\nimport type { AnyPadroneBuilder, CommandTypesBase, PadroneCommand } from '../types/index.ts';\nimport type { PadroneSchema } from '../types/schema.ts';\nimport type { WithCommand } from '../util/type-utils.ts';\nimport { getRootCommand } from '../util/utils.ts';\nimport { passthroughSchema } from './utils.ts';\n\n// ── Types ────────────────────────────────────────────────────────────────\n\ntype ServeArgs = { port?: string; host?: string; basePath?: string };\n\ntype ServeCommand = PadroneCommand<'serve', '', PadroneSchema<ServeArgs>, void, [], [], true>;\n\nexport type WithServe<T> = WithCommand<T, 'serve', ServeCommand>;\n\n// ── Extension ────────────────────────────────────────────────────────────\n\n/**\n * Extension that adds the `serve` command for starting a REST HTTP server.\n *\n * Usage:\n * ```ts\n * createPadrone('my-cli').extend(padroneServe())\n * ```\n */\nexport function padroneServe(defaults?: PadroneServePreferences): <T extends CommandTypesBase>(builder: T) => WithServe<T> {\n return ((builder: AnyPadroneBuilder) =>\n builder.command('serve', (c) =>\n c\n .configure({ description: 'Start a REST HTTP server', hidden: true })\n .arguments(passthroughSchema({ port: 'string', host: 'string', 'base-path': 'string' }))\n .async()\n .action(async (args, ctx) => {\n const rootCommand = getRootCommand(ctx.command);\n resolveAllCommands(rootCommand);\n const { startServeServer } = await import('../feature/serve.ts');\n const port = args.port ? parseInt(args.port, 10) : undefined;\n const prefs: PadroneServePreferences = {\n ...defaults,\n port: port && !Number.isNaN(port) ? port : defaults?.port,\n host: args.host ?? defaults?.host,\n basePath: args['base-path'] ?? defaults?.basePath,\n };\n await startServeServer(ctx.program, rootCommand, ctx.program.eval, prefs);\n }),\n )) as any;\n}\n","import { defineInterceptor } from '../core/interceptors.ts';\nimport { thenMaybe } from '../core/results.ts';\nimport type { AnyPadroneBuilder, CommandTypesBase } from '../types/index.ts';\n\n// ── Helpers ─────────────────────────────────────────────────────────────\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${ms.toFixed(0)}ms`;\n if (ms < 60_000) return `${(ms / 1000).toFixed(2)}s`;\n const mins = Math.floor(ms / 60_000);\n const secs = ((ms % 60_000) / 1000).toFixed(2);\n return `${mins}m ${secs}s`;\n}\n\n// ── Interceptor ─────────────────────────────────────────────────────────\n\nconst timingMeta = { id: 'padrone:timing', name: 'padrone:timing', order: -1002 } as const;\n\nfunction createTimingInterceptor(enabledByDefault: boolean) {\n return defineInterceptor(timingMeta, () => {\n let enabled = enabledByDefault;\n let startTime = 0;\n\n return {\n parse(_ctx, next) {\n return thenMaybe(next(), (res) => {\n if ('timing' in res.rawArgs) {\n enabled = res.rawArgs.timing !== false;\n delete res.rawArgs.timing;\n }\n if ('time' in res.rawArgs) {\n enabled = res.rawArgs.time !== false;\n delete res.rawArgs.time;\n }\n return res;\n });\n },\n start(_ctx, next) {\n startTime = performance.now();\n return next();\n },\n shutdown(ctx, next) {\n return thenMaybe(next(), (res) => {\n if (enabled) {\n const elapsed = performance.now() - startTime;\n ctx.runtime.error(`\\nDone in ${formatDuration(elapsed)}`);\n }\n return res;\n });\n },\n };\n });\n}\n\n// ── Extension ───────────────────────────────────────────────────────────\n\nexport interface PadroneTimingOptions {\n /** Enable timing by default without requiring `--time` flag. Default: `false`. */\n enabled?: boolean;\n}\n\n/**\n * Extension that tracks command execution time.\n *\n * - `--time` / `--timing` → enables timing output\n * - `--no-time` / `--no-timing` → disables timing output\n *\n * Pass `{ enabled: true }` to enable timing by default (can be disabled via `--no-time`).\n *\n * Usage:\n * ```ts\n * // Opt-in via flag\n * createPadrone('my-cli').extend(padroneTiming())\n *\n * // Always on, opt-out via --no-time\n * createPadrone('my-cli').extend(padroneTiming({ enabled: true }))\n * ```\n */\nexport function padroneTiming(options?: PadroneTimingOptions): <T extends CommandTypesBase>(builder: T) => T {\n return ((builder: AnyPadroneBuilder) => builder.intercept(createTimingInterceptor(options?.enabled ?? false))) as any;\n}\n","import { defineInterceptor } from '#src/core/interceptors.ts';\nimport { thenMaybe } from '#src/core/results.ts';\nimport type { AnyPadroneBuilder, CommandTypesBase } from '#src/types/index.ts';\nimport type { WithInterceptor } from '#src/util/type-utils.ts';\n\n// ---------------------------------------------------------------------------\n// Types — minimal OTEL-compatible interfaces so we don't hard-depend on\n// `@opentelemetry/api`. Users pass their real Tracer / Span instances.\n// ---------------------------------------------------------------------------\n\n/** Minimal subset of OTEL `SpanStatusCode`. */\ntype SpanStatusCode = 0 | 1 | 2;\n\n/** Minimal subset of OTEL `SpanStatus`. */\ntype SpanStatus = { code: SpanStatusCode; message?: string };\n\n/** Minimal subset of OTEL `Span`. */\nexport interface OtelSpan {\n setAttribute(key: string, value: string | number | boolean): this;\n addEvent(name: string, attributes?: Record<string, string | number | boolean>): this;\n setStatus(status: SpanStatus): this;\n recordException(error: unknown): this;\n end(): void;\n spanContext(): { traceId: string; spanId: string };\n}\n\n/** Minimal subset of OTEL `Tracer`. */\nexport interface OtelTracer {\n startSpan(name: string): OtelSpan;\n}\n\n/** Minimal subset of OTEL `TracerProvider`. */\nexport interface OtelTracerProvider {\n getTracer(name: string, version?: string): OtelTracer;\n}\n\n/** Tracing handle injected into the command context. */\nexport type PadroneTracer = {\n /** The underlying OTEL tracer. */\n tracer: OtelTracer;\n /** Root span covering the full command execution. */\n rootSpan: OtelSpan;\n /** Run `fn` inside a child span that is automatically ended when `fn` returns (or rejects). */\n span: <T>(name: string, fn: (span: OtelSpan) => T) => T;\n};\n\n/** Configuration for the tracing extension. */\nexport type PadroneTracingConfig = {\n /** OTEL `TracerProvider`. Required — there is no global fallback. */\n provider: OtelTracerProvider;\n /** Service / tracer name. Defaults to the CLI program name. */\n serviceName?: string;\n};\n\n/** Builder/program type after applying `padroneTracing()`. Adds `{ tracing: PadroneTracer }` to the command context. */\nexport type WithTracing<T> = WithInterceptor<T, { tracing: PadroneTracer }>;\n\n// ---------------------------------------------------------------------------\n// Interceptor\n// ---------------------------------------------------------------------------\n\nconst OTEL_ERROR: SpanStatusCode = 2;\n\ntype ResolvedTracingConfig = { provider: OtelTracerProvider; serviceName: string | undefined };\n\nfunction tracingInterceptor(config: ResolvedTracingConfig) {\n return defineInterceptor({ id: 'padrone:tracing', name: 'padrone:tracing', order: -1 }, () => {\n let rootSpan: OtelSpan;\n let tracer: OtelTracer;\n\n return {\n start(ctx, next) {\n tracer = config.provider.getTracer(config.serviceName ?? ctx.command.name);\n return next();\n },\n\n execute(ctx, next) {\n rootSpan = tracer.startSpan(`cli ${ctx.command.name}`);\n\n const padroneTracer: PadroneTracer = {\n tracer,\n rootSpan,\n span(name, fn) {\n const child = tracer.startSpan(name);\n try {\n const result = fn(child);\n if (result != null && typeof (result as any).then === 'function') {\n return (result as any).then(\n (v: any) => {\n child.end();\n return v;\n },\n (err: unknown) => {\n child.recordException(err);\n child.setStatus({ code: OTEL_ERROR });\n child.end();\n throw err;\n },\n );\n }\n child.end();\n return result;\n } catch (err) {\n child.recordException(err);\n child.setStatus({ code: OTEL_ERROR });\n child.end();\n throw err;\n }\n },\n };\n\n return next({ context: { tracing: padroneTracer } });\n },\n\n error(ctx, next) {\n rootSpan?.recordException(ctx.error);\n rootSpan?.setStatus({ code: OTEL_ERROR });\n return next();\n },\n\n shutdown(_ctx, next) {\n return thenMaybe(next(), (res) => {\n rootSpan?.end();\n return res;\n });\n },\n };\n });\n}\n\n// ---------------------------------------------------------------------------\n// Extension\n// ---------------------------------------------------------------------------\n\n/**\n * Extension that adds OpenTelemetry tracing to command execution.\n *\n * Creates a root span for each command invocation and provides a `PadroneTracer`\n * on the command context for creating child spans in action handlers.\n *\n * When used with `padroneLogger()`, the logger automatically emits span events\n * for each log call — no extra configuration needed. The logger detects the\n * tracing context and bridges log output to span events.\n *\n * Uses minimal OTEL-compatible interfaces — pass any `TracerProvider` that\n * implements `getTracer()`. Works with `@opentelemetry/api` or compatible\n * libraries.\n *\n * Provides `{ tracing: PadroneTracer }` on the command context.\n * Access it in action handlers as `ctx.context.tracing`.\n *\n * Usage:\n * ```ts\n * import { trace } from '@opentelemetry/api';\n *\n * createPadrone('my-cli')\n * .extend(padroneTracing({ provider: trace.getTracerProvider() }))\n * .extend(padroneLogger())\n * .command('deploy', (c) =>\n * c.action((_args, ctx) => {\n * ctx.context.logger.info('deploying'); // also emits a span event\n * ctx.context.tracing.span('build', (span) => {\n * span.setAttribute('target', 'production');\n * });\n * })\n * )\n * ```\n */\nexport function padroneTracing<T extends CommandTypesBase>(config: PadroneTracingConfig): (builder: T) => WithTracing<T> {\n const resolved: ResolvedTracingConfig = {\n provider: config.provider,\n serviceName: config.serviceName,\n };\n return ((builder: AnyPadroneBuilder) => builder.intercept(tracingInterceptor(resolved))) as any;\n}\n","import { thenMaybe } from '#src/core/results.ts';\nimport { defineInterceptor } from '../core/interceptors.ts';\nimport type { UpdateCheckConfig } from '../feature/update-check.ts';\nimport type { AnyPadroneBuilder, CommandTypesBase } from '../types/index.ts';\nimport { getVersion } from '../util/utils.ts';\n\n// ── Interceptor ─────────────────────────────────────────────────────────\n\nfunction createUpdateCheckInterceptor(config: UpdateCheckConfig) {\n return defineInterceptor({ id: 'padrone:update-check', name: 'padrone:update-check', order: 1000 }, () => {\n let checkPromise: Promise<(() => void) | undefined> | undefined;\n let suppressed = false;\n\n return {\n start(ctx, next) {\n const rootCommand = ctx.command;\n const runtime = ctx.runtime;\n\n checkPromise = Promise.resolve(getVersion(rootCommand.version)).then((currentVersion) =>\n import('../feature/update-check.ts').then(({ createUpdateChecker }) =>\n createUpdateChecker(rootCommand.name, currentVersion, config, runtime),\n ),\n );\n\n return next();\n },\n parse(_ctx, next) {\n return thenMaybe(next(), (res) => {\n if ('update-check' in res.rawArgs) {\n if (res.rawArgs['update-check'] === false) suppressed = true;\n delete res.rawArgs['update-check'];\n }\n return res;\n });\n },\n shutdown(_ctx, next) {\n const result = next();\n if (suppressed || !checkPromise) return result;\n\n // Try to show notification synchronously if the check already resolved\n let resolved: (() => void) | undefined | null = null;\n checkPromise.then(\n (fn) => {\n resolved = fn;\n },\n () => {\n resolved = undefined;\n },\n );\n\n if (resolved !== null) {\n (resolved as (() => void) | undefined)?.();\n }\n\n return result;\n },\n };\n });\n}\n\n// ── Extension ────────────────────────────────────────────────────────────\n\n/**\n * Extension that adds background update checking:\n * - Checks for newer versions on npm (or custom registry) in the background\n * - Shows an update notification after command execution\n * - Respects `--no-update-check` flag to suppress\n *\n * Usage:\n * ```ts\n * createPadrone('my-cli')\n * .extend(padroneUpdateCheck({ packageName: 'my-cli' }))\n * ```\n */\nexport function padroneUpdateCheck(config: UpdateCheckConfig = {}): <T extends CommandTypesBase>(builder: T) => T {\n return ((builder: AnyPadroneBuilder) => builder.intercept(createUpdateCheckInterceptor(config))) as any;\n}\n"],"mappings":"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"}