padrone 1.1.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/CHANGELOG.md +97 -1
  2. package/LICENSE +1 -1
  3. package/README.md +60 -30
  4. package/dist/args-DFEI7_G_.mjs +197 -0
  5. package/dist/args-DFEI7_G_.mjs.map +1 -0
  6. package/dist/chunk-y_GBKt04.mjs +5 -0
  7. package/dist/codegen/index.d.mts +305 -0
  8. package/dist/codegen/index.d.mts.map +1 -0
  9. package/dist/codegen/index.mjs +1358 -0
  10. package/dist/codegen/index.mjs.map +1 -0
  11. package/dist/completion.d.mts +64 -0
  12. package/dist/completion.d.mts.map +1 -0
  13. package/dist/completion.mjs +417 -0
  14. package/dist/completion.mjs.map +1 -0
  15. package/dist/docs/index.d.mts +34 -0
  16. package/dist/docs/index.d.mts.map +1 -0
  17. package/dist/docs/index.mjs +405 -0
  18. package/dist/docs/index.mjs.map +1 -0
  19. package/dist/formatter-XroimS3Q.d.mts +83 -0
  20. package/dist/formatter-XroimS3Q.d.mts.map +1 -0
  21. package/dist/help-CgGP7hQU.mjs +1229 -0
  22. package/dist/help-CgGP7hQU.mjs.map +1 -0
  23. package/dist/index.d.mts +120 -546
  24. package/dist/index.d.mts.map +1 -1
  25. package/dist/index.mjs +1220 -1204
  26. package/dist/index.mjs.map +1 -1
  27. package/dist/test.d.mts +112 -0
  28. package/dist/test.d.mts.map +1 -0
  29. package/dist/test.mjs +138 -0
  30. package/dist/test.mjs.map +1 -0
  31. package/dist/types-BS7RP5Ls.d.mts +1059 -0
  32. package/dist/types-BS7RP5Ls.d.mts.map +1 -0
  33. package/dist/update-check-EbNDkzyV.mjs +146 -0
  34. package/dist/update-check-EbNDkzyV.mjs.map +1 -0
  35. package/package.json +61 -21
  36. package/src/args.ts +457 -0
  37. package/src/cli/completions.ts +29 -0
  38. package/src/cli/docs.ts +86 -0
  39. package/src/cli/doctor.ts +330 -0
  40. package/src/cli/index.ts +159 -0
  41. package/src/cli/init.ts +135 -0
  42. package/src/cli/link.ts +320 -0
  43. package/src/cli/wrap.ts +152 -0
  44. package/src/codegen/README.md +118 -0
  45. package/src/codegen/code-builder.ts +226 -0
  46. package/src/codegen/discovery.ts +232 -0
  47. package/src/codegen/file-emitter.ts +73 -0
  48. package/src/codegen/generators/barrel-file.ts +16 -0
  49. package/src/codegen/generators/command-file.ts +197 -0
  50. package/src/codegen/generators/command-tree.ts +124 -0
  51. package/src/codegen/index.ts +33 -0
  52. package/src/codegen/parsers/fish.ts +163 -0
  53. package/src/codegen/parsers/help.ts +378 -0
  54. package/src/codegen/parsers/merge.ts +158 -0
  55. package/src/codegen/parsers/zsh.ts +221 -0
  56. package/src/codegen/schema-to-code.ts +199 -0
  57. package/src/codegen/template.ts +69 -0
  58. package/src/codegen/types.ts +143 -0
  59. package/src/colorizer.ts +2 -2
  60. package/src/command-utils.ts +504 -0
  61. package/src/completion.ts +110 -97
  62. package/src/create.ts +1048 -308
  63. package/src/docs/index.ts +607 -0
  64. package/src/errors.ts +131 -0
  65. package/src/formatter.ts +195 -73
  66. package/src/help.ts +159 -58
  67. package/src/index.ts +12 -15
  68. package/src/interactive.ts +169 -0
  69. package/src/parse.ts +52 -21
  70. package/src/repl-loop.ts +317 -0
  71. package/src/runtime.ts +304 -0
  72. package/src/shell-utils.ts +83 -0
  73. package/src/test.ts +285 -0
  74. package/src/type-helpers.ts +10 -10
  75. package/src/type-utils.ts +124 -14
  76. package/src/types.ts +752 -154
  77. package/src/update-check.ts +244 -0
  78. package/src/wrap.ts +44 -40
  79. package/src/zod.d.ts +2 -2
  80. package/src/options.ts +0 -180
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/options.ts","../src/completion.ts","../src/colorizer.ts","../src/formatter.ts","../src/utils.ts","../src/help.ts","../src/parse.ts","../src/wrap.ts","../src/create.ts"],"sourcesContent":["import type { StandardJSONSchemaV1 } from '@standard-schema/spec';\n\nexport interface PadroneOptionsMeta {\n description?: string;\n alias?: string[] | string;\n deprecated?: boolean | string;\n hidden?: boolean;\n examples?: unknown[];\n}\n\ntype PositionalArgs<TObj> =\n TObj extends Record<string, any>\n ? {\n [K in keyof TObj]: TObj[K] extends Array<any> ? `...${K & string}` : K & string;\n }[keyof TObj]\n : string;\n\n/**\n * Meta configuration for options including positional arguments.\n * The `positional` array defines which options are positional arguments and their order.\n * Use '...name' prefix to indicate variadic (rest) arguments, matching JS/TS rest syntax.\n *\n * @example\n * ```ts\n * .arguments(schema, {\n * positional: ['source', '...files', 'dest'], // '...files' is variadic\n * })\n * ```\n */\nexport interface PadroneMeta<TObj = Record<string, any>> {\n /**\n * Array of option names that should be treated as positional arguments.\n * Order in array determines position. Use '...name' prefix for variadic args.\n * @example ['source', '...files', 'dest'] - 'files' captures multiple values\n */\n positional?: PositionalArgs<TObj>[];\n /**\n * Per-option metadata.\n */\n options?: { [K in keyof TObj]?: PadroneOptionsMeta };\n}\n\n/**\n * Parse positional configuration to extract names and variadic info.\n */\nexport function parsePositionalConfig(positional: string[]): { name: string; variadic: boolean }[] {\n return positional.map((p) => {\n const isVariadic = p.startsWith('...');\n const name = isVariadic ? p.slice(3) : p;\n return { name, variadic: isVariadic };\n });\n}\n\n/**\n * Result type for extractSchemaMetadata function.\n */\ninterface SchemaMetadataResult {\n aliases: Record<string, string>;\n}\n\n/**\n * Extract all option metadata from schema and meta in a single pass.\n * This consolidates aliases, env bindings, and config keys extraction.\n */\nexport function extractSchemaMetadata(\n schema: StandardJSONSchemaV1,\n meta?: Record<string, PadroneOptionsMeta | undefined>,\n): SchemaMetadataResult {\n const aliases: Record<string, string> = {};\n\n // Extract from meta object\n if (meta) {\n for (const [key, value] of Object.entries(meta)) {\n if (!value) continue;\n\n // Extract aliases\n if (value.alias) {\n const list = typeof value.alias === 'string' ? [value.alias] : value.alias;\n for (const aliasKey of list) {\n if (typeof aliasKey === 'string' && aliasKey && aliasKey !== key) {\n aliases[aliasKey] = key;\n }\n }\n }\n }\n }\n\n // Extract from JSON schema properties\n try {\n const jsonSchema = schema['~standard'].jsonSchema.input({ target: 'draft-2020-12' }) as Record<string, any>;\n if (jsonSchema.type === 'object' && jsonSchema.properties) {\n for (const [propertyName, propertySchema] of Object.entries(jsonSchema.properties as Record<string, any>)) {\n if (!propertySchema) continue;\n\n // Extract aliases from schema\n const propAlias = propertySchema.alias;\n if (propAlias) {\n const list = typeof propAlias === 'string' ? [propAlias] : propAlias;\n if (Array.isArray(list)) {\n for (const aliasKey of list) {\n if (typeof aliasKey === 'string' && aliasKey && aliasKey !== propertyName && !(aliasKey in aliases)) {\n aliases[aliasKey] = propertyName;\n }\n }\n }\n }\n }\n }\n } catch {\n // Ignore errors from JSON schema generation\n }\n\n return { aliases };\n}\n\nfunction preprocessAliases(data: Record<string, unknown>, aliases: Record<string, string>): Record<string, unknown> {\n const result = { ...data };\n\n for (const [aliasKey, fullOptionName] of Object.entries(aliases)) {\n if (aliasKey in data && aliasKey !== fullOptionName) {\n const aliasValue = data[aliasKey];\n // Prefer full option name if it exists\n if (!(fullOptionName in result)) result[fullOptionName] = aliasValue;\n delete result[aliasKey];\n }\n }\n\n return result;\n}\n\ninterface ParseOptionsContext {\n aliases?: Record<string, string>;\n envData?: Record<string, unknown>;\n configData?: Record<string, unknown>;\n}\n\n/**\n * Apply values directly to options.\n * CLI values take precedence over the provided values.\n */\nfunction applyValues(data: Record<string, unknown>, values: Record<string, unknown>): Record<string, unknown> {\n const result = { ...data };\n\n for (const [key, value] of Object.entries(values)) {\n // Only apply value if option wasn't already set\n if (key in result && result[key] !== undefined) continue;\n if (value !== undefined) {\n result[key] = value;\n }\n }\n\n return result;\n}\n\n/**\n * Combined preprocessing of options with all features.\n * Precedence order (highest to lowest): CLI args > env vars > config file\n */\nexport function preprocessOptions(data: Record<string, unknown>, ctx: ParseOptionsContext): Record<string, unknown> {\n let result = { ...data };\n\n // 1. Apply aliases first\n if (ctx.aliases && Object.keys(ctx.aliases).length > 0) {\n result = preprocessAliases(result, ctx.aliases);\n }\n\n // 2. Apply environment variables (higher precedence than config)\n // These only apply if CLI didn't set the option\n if (ctx.envData) {\n result = applyValues(result, ctx.envData);\n }\n\n // 3. Apply config file values (lowest precedence)\n // These only apply if neither CLI nor env set the option\n if (ctx.configData) {\n result = applyValues(result, ctx.configData);\n }\n\n return result;\n}\n","import { extractSchemaMetadata } from './options.ts';\nimport type { AnyPadroneCommand } from './types.ts';\n\nexport type ShellType = 'bash' | 'zsh' | 'fish' | 'powershell';\n\n/**\n * Detects the current shell from environment variables and process info.\n * @returns The detected shell type, or undefined if unknown\n */\nexport function detectShell(): ShellType | undefined {\n if (typeof process === 'undefined') return undefined;\n\n // Method 1: Check SHELL environment variable (most common)\n const shellEnv = process.env.SHELL || '';\n if (shellEnv.includes('zsh')) return 'zsh';\n if (shellEnv.includes('bash')) return 'bash';\n if (shellEnv.includes('fish')) return 'fish';\n\n // Method 2: Check Windows-specific shells\n if (process.env.PSModulePath || process.env.POWERSHELL_DISTRIBUTION_CHANNEL) {\n return 'powershell';\n }\n\n // Method 3: Check parent process on Unix-like systems\n try {\n const { execSync } = require('node:child_process');\n const ppid = process.ppid;\n if (ppid) {\n const processName = execSync(`ps -p ${ppid} -o comm=`, {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'ignore'],\n }).trim();\n\n if (processName.includes('zsh')) return 'zsh';\n if (processName.includes('bash')) return 'bash';\n if (processName.includes('fish')) return 'fish';\n }\n } catch {\n // Ignore errors (e.g., ps not available)\n }\n\n return undefined;\n}\n\n/**\n * Collects all commands from a program recursively.\n */\nfunction collectAllCommands(cmd: AnyPadroneCommand): AnyPadroneCommand[] {\n const result: AnyPadroneCommand[] = [];\n\n if (cmd.commands) {\n for (const subcmd of cmd.commands) {\n if (!subcmd.hidden) {\n result.push(subcmd);\n result.push(...collectAllCommands(subcmd));\n }\n }\n }\n\n return result;\n}\n\n/**\n * Extracts all option names from a command's schema.\n */\nfunction extractOptions(cmd: AnyPadroneCommand): { name: string; alias?: string; isBoolean: boolean }[] {\n const options: { name: string; alias?: string; isBoolean: boolean }[] = [];\n\n if (!cmd.options) return options;\n\n try {\n const optionsMeta = cmd.meta?.options;\n const { aliases } = extractSchemaMetadata(cmd.options, optionsMeta);\n\n // Reverse aliases map (alias -> option name)\n const aliasToOption: Record<string, string> = {};\n for (const [opt, alias] of Object.entries(aliases)) {\n aliasToOption[alias] = opt;\n }\n\n const jsonSchema = cmd.options['~standard'].jsonSchema.input({ target: 'draft-2020-12' }) as Record<string, any>;\n\n if (jsonSchema.type === 'object' && jsonSchema.properties) {\n for (const [key, prop] of Object.entries(jsonSchema.properties as Record<string, any>)) {\n const alias = Object.entries(aliases).find(([opt]) => opt === key)?.[1];\n options.push({\n name: key,\n alias: alias,\n isBoolean: prop?.type === 'boolean',\n });\n }\n }\n } catch {\n // Ignore schema parsing errors\n }\n\n return options;\n}\n\n/**\n * Generates a Bash completion script for the program.\n */\nexport function generateBashCompletion(program: AnyPadroneCommand): string {\n const programName = program.name;\n const commands = collectAllCommands(program);\n const commandNames = commands.map((c) => c.name).join(' ');\n\n // Collect all options from all commands\n const allOptions = new Set<string>();\n allOptions.add('--help');\n allOptions.add('--version');\n\n for (const cmd of [program, ...commands]) {\n for (const opt of extractOptions(cmd)) {\n allOptions.add(`--${opt.name}`);\n if (opt.alias) allOptions.add(`-${opt.alias}`);\n }\n }\n\n const optionsList = Array.from(allOptions).join(' ');\n\n return `###-begin-${programName}-completion-###\n#\n# ${programName} command completion script\n#\n# Installation: ${programName} completion >> ~/.bashrc (or ~/.zshrc)\n# Or, maybe: ${programName} completion > /usr/local/etc/bash_completion.d/${programName}\n#\n\nif type complete &>/dev/null; then\n _${programName}_completion() {\n local cur prev words cword\n if type _get_comp_words_by_ref &>/dev/null; then\n _get_comp_words_by_ref -n = -n @ -n : -w words -i cword\n else\n cword=\"$COMP_CWORD\"\n words=(\"\\${COMP_WORDS[@]}\")\n fi\n\n cur=\"\\${words[cword]}\"\n prev=\"\\${words[cword-1]}\"\n\n local commands=\"${commandNames}\"\n local options=\"${optionsList}\"\n\n # Complete options when current word starts with -\n if [[ \"$cur\" == -* ]]; then\n COMPREPLY=($(compgen -W \"$options\" -- \"$cur\"))\n return 0\n fi\n\n # Complete commands\n COMPREPLY=($(compgen -W \"$commands\" -- \"$cur\"))\n }\n complete -o bashdefault -o default -o nospace -F _${programName}_completion ${programName}\nelif type compdef &>/dev/null; then\n _${programName}_completion() {\n local si=$IFS\n local commands=\"${commandNames}\"\n local options=\"${optionsList}\"\n\n if [[ \"\\${words[CURRENT]}\" == -* ]]; then\n compadd -- \\${=options}\n else\n compadd -- \\${=commands}\n fi\n IFS=$si\n }\n compdef _${programName}_completion ${programName}\nelif type compctl &>/dev/null; then\n _${programName}_completion() {\n local commands=\"${commandNames}\"\n local options=\"${optionsList}\"\n\n if [[ \"\\${words[CURRENT]}\" == -* ]]; then\n reply=(\\${=options})\n else\n reply=(\\${=commands})\n fi\n }\n compctl -K _${programName}_completion ${programName}\nfi\n###-end-${programName}-completion-###`;\n}\n\n/**\n * Generates a Zsh completion script for the program.\n */\nexport function generateZshCompletion(program: AnyPadroneCommand): string {\n const programName = program.name;\n const commands = collectAllCommands(program);\n\n // Generate command completions with descriptions\n const commandCompletions = commands\n .map((cmd) => {\n const desc = cmd.description || cmd.title || '';\n const escapedDesc = desc.replace(/'/g, \"'\\\\''\").replace(/:/g, '\\\\:');\n return ` '${cmd.name}:${escapedDesc}'`;\n })\n .join('\\n');\n\n // Collect all options with descriptions\n const optionCompletions: string[] = [];\n optionCompletions.push(\" '--help[Show help information]'\");\n optionCompletions.push(\" '--version[Show version number]'\");\n\n const seenOptions = new Set<string>(['help', 'version']);\n\n for (const cmd of [program, ...commands]) {\n for (const opt of extractOptions(cmd)) {\n if (seenOptions.has(opt.name)) continue;\n seenOptions.add(opt.name);\n\n const desc = cmd.meta?.options?.[opt.name]?.description || '';\n const escapedDesc = desc.replace(/'/g, \"'\\\\''\").replace(/\\[/g, '\\\\[').replace(/\\]/g, '\\\\]');\n\n if (opt.alias) {\n optionCompletions.push(` {-${opt.alias},--${opt.name}}'[${escapedDesc}]'`);\n } else {\n optionCompletions.push(` '--${opt.name}[${escapedDesc}]'`);\n }\n }\n }\n\n return `#compdef ${programName}\n###-begin-${programName}-completion-###\n#\n# ${programName} command completion script for Zsh\n#\n# Installation: ${programName} completion >> ~/.zshrc\n# Or: ${programName} completion > ~/.zsh/completions/_${programName}\n#\n\n_${programName}() {\n local -a commands\n local -a options\n\n commands=(\n${commandCompletions}\n )\n\n options=(\n${optionCompletions.join('\\n')}\n )\n\n _arguments -s \\\\\n $options \\\\\n '1: :->command' \\\\\n '*::arg:->args'\n\n case \"$state\" in\n command)\n _describe 'command' commands\n ;;\n esac\n}\n\n_${programName}\n###-end-${programName}-completion-###`;\n}\n\n/**\n * Generates a Fish completion script for the program.\n */\nexport function generateFishCompletion(program: AnyPadroneCommand): string {\n const programName = program.name;\n const commands = collectAllCommands(program);\n\n const lines: string[] = [\n `###-begin-${programName}-completion-###`,\n '#',\n `# ${programName} command completion script for Fish`,\n '#',\n `# Installation: ${programName} completion > ~/.config/fish/completions/${programName}.fish`,\n '#',\n '',\n `# Clear existing completions`,\n `complete -c ${programName} -e`,\n '',\n '# Commands',\n ];\n\n for (const cmd of commands) {\n const desc = cmd.description || cmd.title || '';\n const escapedDesc = desc.replace(/'/g, \"\\\\'\");\n lines.push(`complete -c ${programName} -n \"__fish_use_subcommand\" -a \"${cmd.name}\" -d '${escapedDesc}'`);\n }\n\n lines.push('');\n lines.push('# Global options');\n lines.push(`complete -c ${programName} -l help -d 'Show help information'`);\n lines.push(`complete -c ${programName} -l version -d 'Show version number'`);\n\n const seenOptions = new Set<string>(['help', 'version']);\n\n for (const cmd of [program, ...commands]) {\n for (const opt of extractOptions(cmd)) {\n if (seenOptions.has(opt.name)) continue;\n seenOptions.add(opt.name);\n\n const desc = cmd.meta?.options?.[opt.name]?.description || '';\n const escapedDesc = desc.replace(/'/g, \"\\\\'\");\n\n if (opt.alias) {\n lines.push(`complete -c ${programName} -s ${opt.alias} -l ${opt.name} -d '${escapedDesc}'`);\n } else {\n lines.push(`complete -c ${programName} -l ${opt.name} -d '${escapedDesc}'`);\n }\n }\n }\n\n lines.push(`###-end-${programName}-completion-###`);\n\n return lines.join('\\n');\n}\n\n/**\n * Generates a PowerShell completion script for the program.\n */\nexport function generatePowerShellCompletion(program: AnyPadroneCommand): string {\n const programName = program.name;\n const commands = collectAllCommands(program);\n\n const commandNames = commands.map((c) => `'${c.name}'`).join(', ');\n\n return `###-begin-${programName}-completion-###\n#\n# ${programName} command completion script for PowerShell\n#\n# Installation: ${programName} completion >> $PROFILE\n#\n\nRegister-ArgumentCompleter -Native -CommandName ${programName} -ScriptBlock {\n param($wordToComplete, $commandAst, $cursorPosition)\n\n $commands = @(${commandNames})\n $options = @('--help', '--version')\n\n if ($wordToComplete -like '-*') {\n $options | Where-Object { $_ -like \"$wordToComplete*\" } | ForEach-Object {\n [System.Management.Automation.CompletionResult]::new($_, $_, 'ParameterValue', $_)\n }\n } else {\n $commands | Where-Object { $_ -like \"$wordToComplete*\" } | ForEach-Object {\n [System.Management.Automation.CompletionResult]::new($_, $_, 'ParameterValue', $_)\n }\n }\n}\n###-end-${programName}-completion-###`;\n}\n\n/**\n * Generates a completion script for the specified shell.\n */\nexport function generateCompletion(program: AnyPadroneCommand, shell: ShellType): string {\n switch (shell) {\n case 'bash':\n return generateBashCompletion(program);\n case 'zsh':\n return generateZshCompletion(program);\n case 'fish':\n return generateFishCompletion(program);\n case 'powershell':\n return generatePowerShellCompletion(program);\n default:\n throw new Error(`Unsupported shell: ${shell}`);\n }\n}\n\n/**\n * Gets the installation instructions for a shell completion script.\n */\nexport function getCompletionInstallInstructions(programName: string, shell: ShellType): string {\n switch (shell) {\n case 'bash':\n return `# Add to ~/.bashrc:\n${programName} completion bash >> ~/.bashrc\n\n# Or install system-wide:\n${programName} completion bash > /usr/local/etc/bash_completion.d/${programName}`;\n\n case 'zsh':\n return `# Add to ~/.zshrc:\n${programName} completion zsh >> ~/.zshrc\n\n# Or add to completions directory:\n${programName} completion zsh > ~/.zsh/completions/_${programName}`;\n\n case 'fish':\n return `# Install to Fish completions:\n${programName} completion fish > ~/.config/fish/completions/${programName}.fish`;\n\n case 'powershell':\n return `# Add to PowerShell profile:\n${programName} completion powershell >> $PROFILE`;\n\n default:\n return `# Run: ${programName} completion <shell>\n# Supported shells: bash, zsh, fish, powershell`;\n }\n}\n\n/**\n * Generates the completion output with automatic shell detection.\n * If shell is not specified, detects the current shell and provides instructions.\n */\nexport function generateCompletionOutput(program: AnyPadroneCommand, shell?: ShellType): string {\n const programName = program.name;\n\n if (shell) {\n return generateCompletion(program, shell);\n }\n\n // Auto-detect shell and provide instructions\n const detectedShell = detectShell();\n\n if (detectedShell) {\n const instructions = getCompletionInstallInstructions(programName, detectedShell);\n const script = generateCompletion(program, detectedShell);\n\n return `# Detected shell: ${detectedShell}\n#\n${instructions}\n#\n# Or evaluate directly (temporary, for current session only):\n# eval \"$(${programName} completion ${detectedShell})\"\n\n${script}`;\n }\n\n // Could not detect shell - provide usage info\n return `# Shell auto-detection failed.\n#\n# Usage: ${programName} completion <shell>\n#\n# Supported shells:\n# bash - Bash completion script\n# zsh - Zsh completion script\n# fish - Fish completion script\n# powershell - PowerShell completion script\n#\n# Example:\n# ${programName} completion bash >> ~/.bashrc\n# ${programName} completion zsh >> ~/.zshrc\n# ${programName} completion fish > ~/.config/fish/completions/${programName}.fish\n# ${programName} completion powershell >> $PROFILE`;\n}\n","// ANSI color codes\nconst colors = {\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n italic: '\\x1b[3m',\n underline: '\\x1b[4m',\n strikethrough: '\\x1b[9m',\n cyan: '\\x1b[36m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n gray: '\\x1b[90m',\n};\n\nexport type Colorizer = {\n command: (text: string) => string;\n option: (text: string) => string;\n type: (text: string) => string;\n description: (text: string) => string;\n label: (text: string) => string;\n meta: (text: string) => string;\n example: (text: string) => string;\n exampleValue: (text: string) => string;\n deprecated: (text: string) => string;\n};\n\nexport function createColorizer(): Colorizer {\n return {\n command: (text: string) => `${colors.cyan}${colors.bold}${text}${colors.reset}`,\n option: (text: string) => `${colors.green}${text}${colors.reset}`,\n type: (text: string) => `${colors.yellow}${text}${colors.reset}`,\n description: (text: string) => `${colors.dim}${text}${colors.reset}`,\n label: (text: string) => `${colors.bold}${text}${colors.reset}`,\n meta: (text: string) => `${colors.gray}${text}${colors.reset}`,\n example: (text: string) => `${colors.underline}${text}${colors.reset}`,\n exampleValue: (text: string) => `${colors.italic}${text}${colors.reset}`,\n deprecated: (text: string) => `${colors.strikethrough}${colors.gray}${text}${colors.reset}`,\n };\n}\n","import { createColorizer } from './colorizer.ts';\n\nexport type HelpFormat = 'text' | 'ansi' | 'console' | 'markdown' | 'html' | 'json';\nexport type HelpDetail = 'minimal' | 'standard' | 'full';\n\n// ============================================================================\n// Help Info Types (shared with help.ts)\n// ============================================================================\n\n/**\n * Information about a single positional argument.\n */\nexport type HelpArgumentInfo = {\n name: string;\n description?: string;\n optional: boolean;\n default?: unknown;\n type?: string;\n};\n\n/**\n * Information about a single option/flag.\n */\nexport type HelpOptionInfo = {\n name: string;\n description?: string;\n optional: boolean;\n default?: unknown;\n type?: string;\n enum?: string[];\n aliases?: string[];\n deprecated?: boolean | string;\n hidden?: boolean;\n examples?: unknown[];\n /** Environment variable(s) this option can be set from */\n env?: string | string[];\n /** Whether this option is an array type (shown as <type...>) */\n variadic?: boolean;\n /** Whether this option is a boolean (shown as --[no-]option) */\n negatable?: boolean;\n /** Config file key that maps to this option */\n configKey?: string;\n};\n\n/**\n * Information about a subcommand (minimal info for listing).\n */\nexport type HelpSubcommandInfo = {\n name: string;\n title?: string;\n description?: string;\n aliases?: string[];\n deprecated?: boolean | string;\n hidden?: boolean;\n};\n\n/**\n * Comprehensive JSON structure for help information.\n * This is the single source of truth that all formatters use.\n */\nexport type HelpInfo = {\n /** The full command name (e.g., \"cli serve\" or \"<root>\") */\n name: string;\n /** Short title for the command */\n title?: string;\n /** Command description */\n description?: string;\n /** Alternative names/aliases for this command */\n aliases?: string[];\n /** Whether the command is deprecated */\n deprecated?: boolean | string;\n /** Whether the command is hidden */\n hidden?: boolean;\n /** Usage string parts for flexible formatting */\n usage: {\n command: string;\n hasSubcommands: boolean;\n hasArguments: boolean;\n hasOptions: boolean;\n };\n /** List of subcommands */\n subcommands?: HelpSubcommandInfo[];\n /** Positional arguments */\n arguments?: HelpArgumentInfo[];\n /** Options/flags (only visible ones, hidden filtered out) */\n options?: HelpOptionInfo[];\n /** Full help info for nested commands (used in 'full' detail mode) */\n nestedCommands?: HelpInfo[];\n};\n\n// ============================================================================\n// Formatter Interface\n// ============================================================================\n\n/**\n * A formatter that takes the entire HelpInfo structure and produces formatted output.\n */\nexport type Formatter = {\n /** Format the entire help info structure into a string */\n format: (info: HelpInfo) => string;\n};\n\n// ============================================================================\n// Internal Styling Types\n// ============================================================================\n\n/**\n * Internal styling functions used by formatters.\n * These handle the visual styling of individual text elements.\n */\ntype Styler = {\n command: (text: string) => string;\n option: (text: string) => string;\n type: (text: string) => string;\n description: (text: string) => string;\n label: (text: string) => string;\n meta: (text: string) => string;\n example: (text: string) => string;\n exampleValue: (text: string) => string;\n deprecated: (text: string) => string;\n};\n\n/**\n * Layout configuration for formatters.\n */\ntype LayoutConfig = {\n newline: string;\n indent: (level: number) => string;\n join: (parts: string[]) => string;\n wrapDocument?: (content: string) => string;\n usageLabel: string;\n};\n\n// ============================================================================\n// Styler Factories\n// ============================================================================\n\nfunction createTextStyler(): Styler {\n return {\n command: (text) => text,\n option: (text) => text,\n type: (text) => text,\n description: (text) => text,\n label: (text) => text,\n meta: (text) => text,\n example: (text) => text,\n exampleValue: (text) => text,\n deprecated: (text) => text,\n };\n}\n\nfunction createAnsiStyler(): Styler {\n const colorizer = createColorizer();\n return {\n command: colorizer.command,\n option: colorizer.option,\n type: colorizer.type,\n description: colorizer.description,\n label: colorizer.label,\n meta: colorizer.meta,\n example: colorizer.example,\n exampleValue: colorizer.exampleValue,\n deprecated: colorizer.deprecated,\n };\n}\n\nfunction createConsoleStyler(): Styler {\n const colors = {\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n italic: '\\x1b[3m',\n underline: '\\x1b[4m',\n strikethrough: '\\x1b[9m',\n cyan: '\\x1b[36m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n gray: '\\x1b[90m',\n };\n return {\n command: (text) => `${colors.cyan}${colors.bold}${text}${colors.reset}`,\n option: (text) => `${colors.green}${text}${colors.reset}`,\n type: (text) => `${colors.yellow}${text}${colors.reset}`,\n description: (text) => `${colors.dim}${text}${colors.reset}`,\n label: (text) => `${colors.bold}${text}${colors.reset}`,\n meta: (text) => `${colors.gray}${text}${colors.reset}`,\n example: (text) => `${colors.underline}${text}${colors.reset}`,\n exampleValue: (text) => `${colors.italic}${text}${colors.reset}`,\n deprecated: (text) => `${colors.strikethrough}${colors.gray}${text}${colors.reset}`,\n };\n}\n\nfunction createMarkdownStyler(): Styler {\n return {\n command: (text) => `**${text}**`,\n option: (text) => `\\`${text}\\``,\n type: (text) => `\\`${text}\\``,\n description: (text) => text,\n label: (text) => `### ${text}`,\n meta: (text) => `*${text}*`,\n example: (text) => `**${text}**`,\n exampleValue: (text) => `\\`${text}\\``,\n deprecated: (text) => `~~${text}~~`,\n };\n}\n\nfunction escapeHtml(text: string): string {\n return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;').replace(/'/g, '&#039;');\n}\n\nfunction createHtmlStyler(): Styler {\n return {\n command: (text) => `<strong style=\"color: #00bcd4;\">${escapeHtml(text)}</strong>`,\n option: (text) => `<code style=\"color: #4caf50;\">${escapeHtml(text)}</code>`,\n type: (text) => `<code style=\"color: #ff9800;\">${escapeHtml(text)}</code>`,\n description: (text) => `<span style=\"color: #666;\">${escapeHtml(text)}</span>`,\n label: (text) => `<h3>${escapeHtml(text)}</h3>`,\n meta: (text) => `<span style=\"color: #999;\">${escapeHtml(text)}</span>`,\n example: (text) => `<strong style=\"text-decoration: underline;\">${escapeHtml(text)}</strong>`,\n exampleValue: (text) => `<em>${escapeHtml(text)}</em>`,\n deprecated: (text) => `<del style=\"color: #999;\">${escapeHtml(text)}</del>`,\n };\n}\n\n// ============================================================================\n// Layout Configurations\n// ============================================================================\n\nfunction createTextLayout(): LayoutConfig {\n return {\n newline: '\\n',\n indent: (level) => ' '.repeat(level),\n join: (parts) => parts.filter(Boolean).join(' '),\n usageLabel: 'Usage:',\n };\n}\n\nfunction createMarkdownLayout(): LayoutConfig {\n return {\n newline: '\\n\\n',\n indent: (level) => {\n if (level === 0) return '';\n if (level === 1) return ' ';\n return ' ';\n },\n join: (parts) => parts.filter(Boolean).join(' '),\n usageLabel: 'Usage:',\n };\n}\n\nfunction createHtmlLayout(): LayoutConfig {\n return {\n newline: '<br>',\n indent: (level) => '&nbsp;&nbsp;'.repeat(level),\n join: (parts) => parts.filter(Boolean).join(' '),\n wrapDocument: (content) => `<div style=\"font-family: monospace; line-height: 1.6;\">${content}</div>`,\n usageLabel: '<strong>Usage:</strong>',\n };\n}\n\n// ============================================================================\n// Generic Formatter Implementation\n// ============================================================================\n\n/**\n * Creates a formatter that uses the given styler and layout configuration.\n */\nfunction createGenericFormatter(styler: Styler, layout: LayoutConfig): Formatter {\n const { newline, indent, join, wrapDocument, usageLabel } = layout;\n\n function formatUsageSection(info: HelpInfo): string[] {\n const usageParts: string[] = [\n styler.command(info.usage.command),\n info.usage.hasSubcommands ? styler.meta('[command]') : '',\n info.usage.hasArguments ? styler.meta('[args...]') : '',\n info.usage.hasOptions ? styler.meta('[options]') : '',\n ];\n return [`${usageLabel} ${join(usageParts)}`];\n }\n\n function formatSubcommandsSection(info: HelpInfo): string[] {\n const lines: string[] = [];\n const subcommands = info.subcommands!;\n\n lines.push(styler.label('Commands:'));\n\n const maxNameLength = Math.max(\n ...subcommands.map((c) => {\n const aliases = c.aliases ? ` (${c.aliases.join(', ')})` : '';\n return (c.name + aliases).length;\n }),\n );\n for (const subCmd of subcommands) {\n const aliases = subCmd.aliases ? ` (${subCmd.aliases.join(', ')})` : '';\n const commandDisplay = subCmd.name + aliases;\n const padding = ' '.repeat(Math.max(0, maxNameLength - commandDisplay.length + 2));\n const isDeprecated = !!subCmd.deprecated;\n const commandName = isDeprecated ? styler.deprecated(commandDisplay) : styler.command(subCmd.name) + aliases;\n const lineParts: string[] = [commandName, padding];\n\n // Use title if available, otherwise use description\n const displayText = subCmd.title ?? subCmd.description;\n if (displayText) {\n lineParts.push(isDeprecated ? styler.deprecated(displayText) : styler.description(displayText));\n }\n if (isDeprecated) {\n const deprecatedMeta =\n typeof subCmd.deprecated === 'string' ? styler.meta(` (deprecated: ${subCmd.deprecated})`) : styler.meta(' (deprecated)');\n lineParts.push(deprecatedMeta);\n }\n lines.push(indent(1) + lineParts.join(''));\n }\n\n lines.push('');\n lines.push(styler.meta(`Run \"${info.name} [command] --help\" for more information on a command.`));\n\n return lines;\n }\n\n function formatArgumentsSection(info: HelpInfo): string[] {\n const lines: string[] = [];\n const args = info.arguments!;\n\n lines.push(styler.label('Arguments:'));\n\n for (const arg of args) {\n const parts: string[] = [styler.option(arg.name)];\n if (arg.optional) parts.push(styler.meta('(optional)'));\n if (arg.default !== undefined) parts.push(styler.meta(`(default: ${String(arg.default)})`));\n lines.push(indent(1) + join(parts));\n\n if (arg.description) {\n lines.push(indent(2) + styler.description(arg.description));\n }\n }\n\n return lines;\n }\n\n function formatOptionsSection(info: HelpInfo): string[] {\n const lines: string[] = [];\n const options = info.options!;\n\n lines.push(styler.label('Options:'));\n\n const maxNameLength = Math.max(...options.map((opt) => opt.name.length));\n\n for (const opt of options) {\n // Format option name: --[no-]option for booleans, --option otherwise\n const optionName = opt.negatable ? `--[no-]${opt.name}` : `--${opt.name}`;\n const aliasNames = opt.aliases && opt.aliases.length > 0 ? opt.aliases.map((a) => `-${a}`).join(', ') : '';\n const fullOptionName = aliasNames ? `${optionName}, ${aliasNames}` : optionName;\n const padding = ' '.repeat(Math.max(0, maxNameLength - opt.name.length + 2));\n const isDeprecated = !!opt.deprecated;\n const formattedOptionName = isDeprecated ? styler.deprecated(fullOptionName) : styler.option(fullOptionName);\n\n const parts: string[] = [formattedOptionName];\n if (opt.type) parts.push(styler.type(`<${opt.type}>`));\n if (opt.optional && !opt.deprecated) parts.push(styler.meta('(optional)'));\n if (opt.default !== undefined) parts.push(styler.meta(`(default: ${String(opt.default)})`));\n if (opt.enum) parts.push(styler.meta(`(choices: ${opt.enum.join(', ')})`));\n if (opt.variadic) parts.push(styler.meta('(repeatable)'));\n if (isDeprecated) {\n const deprecatedMeta =\n typeof opt.deprecated === 'string' ? styler.meta(`(deprecated: ${opt.deprecated})`) : styler.meta('(deprecated)');\n parts.push(deprecatedMeta);\n }\n\n const description = opt.description ? styler.description(opt.description) : '';\n lines.push(indent(1) + join(parts) + padding + description);\n\n // Environment variable line\n if (opt.env) {\n const envVars = typeof opt.env === 'string' ? [opt.env] : opt.env;\n const envParts: string[] = [styler.example('Env:'), styler.exampleValue(envVars.join(', '))];\n lines.push(indent(3) + join(envParts));\n }\n\n // Config key line\n if (opt.configKey) {\n const configParts: string[] = [styler.example('Config:'), styler.exampleValue(opt.configKey)];\n lines.push(indent(3) + join(configParts));\n }\n\n // Examples line\n if (opt.examples && opt.examples.length > 0) {\n const exampleValues = opt.examples.map((example) => (typeof example === 'string' ? example : JSON.stringify(example))).join(', ');\n const exampleParts: string[] = [styler.example('Example:'), styler.exampleValue(exampleValues)];\n lines.push(indent(3) + join(exampleParts));\n }\n }\n\n return lines;\n }\n\n return {\n format(info: HelpInfo): string {\n const lines: string[] = [];\n\n // Show deprecation warning at the top if command is deprecated\n if (info.deprecated) {\n const deprecationMessage =\n typeof info.deprecated === 'string' ? `⚠️ This command is deprecated: ${info.deprecated}` : '⚠️ This command is deprecated';\n lines.push(styler.deprecated(deprecationMessage));\n lines.push('');\n }\n\n // Usage section\n lines.push(...formatUsageSection(info));\n lines.push('');\n\n // Title section (if present, shows a short summary line)\n if (info.title) {\n lines.push(styler.label(info.title));\n lines.push('');\n }\n\n // Aliases section (if present)\n if (info.aliases && info.aliases.length > 0) {\n lines.push(styler.meta(`Aliases: ${info.aliases.join(', ')}`));\n lines.push('');\n }\n\n // Description section (if present)\n if (info.description) {\n lines.push(styler.description(info.description));\n lines.push('');\n }\n\n // Subcommands section\n if (info.subcommands && info.subcommands.length > 0) {\n lines.push(...formatSubcommandsSection(info));\n lines.push('');\n }\n\n // Arguments section\n if (info.arguments && info.arguments.length > 0) {\n lines.push(...formatArgumentsSection(info));\n lines.push('');\n }\n\n // Options section\n if (info.options && info.options.length > 0) {\n lines.push(...formatOptionsSection(info));\n lines.push('');\n }\n\n // Nested commands section (full detail mode)\n if (info.nestedCommands?.length) {\n lines.push(styler.label('Subcommand Details:'));\n lines.push('');\n for (const nestedCmd of info.nestedCommands) {\n lines.push(styler.meta('─'.repeat(60)));\n lines.push(this.format(nestedCmd));\n }\n }\n\n const result = lines.join(newline);\n return wrapDocument ? wrapDocument(result) : result;\n },\n };\n}\n\n// ============================================================================\n// JSON Formatter\n// ============================================================================\n\nfunction createJsonFormatter(): Formatter {\n return {\n format(info: HelpInfo): string {\n return JSON.stringify(info, null, 2);\n },\n };\n}\n\n// ============================================================================\n// Formatter Factory\n// ============================================================================\n\nfunction shouldUseAnsi(): boolean {\n if (typeof process === 'undefined') return false;\n if (process.env.NO_COLOR) return false;\n if (process.env.CI) return false;\n if (process.stdout && typeof process.stdout.isTTY === 'boolean') return process.stdout.isTTY;\n return false;\n}\n\n// ============================================================================\n// Minimal Formatter\n// ============================================================================\n\n/**\n * Creates a minimal formatter that outputs just a single-line usage string.\n */\nfunction createMinimalFormatter(): Formatter {\n return {\n format(info: HelpInfo): string {\n const parts: string[] = [info.usage.command];\n if (info.usage.hasSubcommands) parts.push('[command]');\n if (info.usage.hasArguments) parts.push('[args...]');\n if (info.usage.hasOptions) parts.push('[options]');\n return parts.join(' ');\n },\n };\n}\n\nexport function createFormatter(format: HelpFormat | 'auto', detail: HelpDetail = 'standard'): Formatter {\n if (detail === 'minimal') return createMinimalFormatter();\n if (format === 'json') return createJsonFormatter();\n if (format === 'ansi' || (format === 'auto' && shouldUseAnsi())) return createGenericFormatter(createAnsiStyler(), createTextLayout());\n if (format === 'console') return createGenericFormatter(createConsoleStyler(), createTextLayout());\n if (format === 'markdown') return createGenericFormatter(createMarkdownStyler(), createMarkdownLayout());\n if (format === 'html') return createGenericFormatter(createHtmlStyler(), createHtmlLayout());\n return createGenericFormatter(createTextStyler(), createTextLayout());\n}\n","import type { AnyPadroneCommand } from './types.ts';\n\nexport function getRootCommand(cmd: AnyPadroneCommand): AnyPadroneCommand {\n let current = cmd;\n while (current.parent) current = current.parent;\n return current;\n}\n\n/**\n * Attempts to get the version from various sources:\n * 1. Explicit version set on the command\n * 2. npm_package_version environment variable (set by npm/yarn/pnpm when running scripts)\n * 3. package.json in current or parent directories\n * @param explicitVersion - Version explicitly set via .version()\n * @returns The version string or '0.0.0' if not found\n */\nexport function getVersion(explicitVersion?: string): string {\n // 1. Use explicit version if provided\n if (explicitVersion) return explicitVersion;\n\n // 2. Check npm_package_version env var (set by npm/yarn/pnpm during script execution)\n if (typeof process !== 'undefined' && process.env?.npm_package_version) {\n return process.env.npm_package_version;\n }\n\n // 3. Try to read from package.json\n if (typeof process !== 'undefined') {\n try {\n const fs = require('node:fs');\n const path = require('node:path');\n let dir = process.cwd();\n\n // Walk up the directory tree looking for package.json\n for (let i = 0; i < 10; i++) {\n const pkgPath = path.join(dir, 'package.json');\n if (fs.existsSync(pkgPath)) {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n if (pkg.version) return pkg.version;\n }\n const parentDir = path.dirname(dir);\n if (parentDir === dir) break; // Reached root\n dir = parentDir;\n }\n } catch {\n // Ignore errors (e.g., fs not available in browser)\n }\n }\n\n return '0.0.0';\n}\n\n/**\n * Loads and parses a config file from the given path.\n * Supports JSON, JSONC (JSON with comments), and attempts to parse other formats.\n * @param configPath - Path to the config file\n * @returns Parsed config data or undefined if loading fails\n */\nexport function loadConfigFile(configPath: string): Record<string, unknown> | undefined {\n if (typeof process === 'undefined') return undefined;\n\n try {\n const fs = require('node:fs');\n const path = require('node:path');\n\n // Resolve to absolute path\n const absolutePath = path.isAbsolute(configPath) ? configPath : path.resolve(process.cwd(), configPath);\n\n if (!fs.existsSync(absolutePath)) {\n console.error(`Config file not found: ${absolutePath}`);\n return undefined;\n }\n\n const getContent = () => fs.readFileSync(absolutePath, 'utf-8');\n const ext = path.extname(absolutePath).toLowerCase();\n\n if (ext === '.yaml' || ext === '.yml') {\n return Bun.YAML.parse(getContent()) as any;\n }\n\n if (ext === '.toml') {\n return Bun.TOML.parse(getContent()) as any;\n }\n\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\n if (ext === '.jsonc') {\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 // For JS files, require them\n return require(absolutePath);\n }\n\n // For unknown extensions, try to parse as JSON\n try {\n return JSON.parse(getContent());\n } catch {\n console.error(`Unable to parse config file: ${absolutePath}`);\n return undefined;\n }\n } catch (error) {\n console.error(`Error loading config file: ${error}`);\n return undefined;\n }\n}\n\n/**\n * Searches for a config file from a list of possible file names.\n * Searches in the current working directory.\n * @param configFiles - Array of possible config file names to search for\n * @returns The path to the first found config file, or undefined if none found\n */\nexport function findConfigFile(configFiles: string[]): string | undefined {\n if (typeof process === 'undefined' || !configFiles?.length) return undefined;\n\n try {\n const fs = require('node:fs');\n const path = require('node:path');\n const cwd = process.cwd();\n\n for (const configFile of configFiles) {\n const configPath = path.isAbsolute(configFile) ? configFile : path.resolve(cwd, configFile);\n if (fs.existsSync(configPath)) {\n return configPath;\n }\n }\n } catch {\n // Ignore errors (e.g., fs not available in browser)\n }\n\n return undefined;\n}\n","import type { StandardJSONSchemaV1 } from '@standard-schema/spec';\nimport {\n createFormatter,\n type HelpArgumentInfo,\n type HelpDetail,\n type HelpFormat,\n type HelpInfo,\n type HelpOptionInfo,\n} from './formatter.ts';\nimport { extractSchemaMetadata, type PadroneMeta, parsePositionalConfig } from './options.ts';\nimport type { AnyPadroneCommand } from './types.ts';\nimport { getRootCommand } from './utils.ts';\n\nexport type HelpOptions = {\n format?: HelpFormat | 'auto';\n detail?: HelpDetail;\n};\n\n/**\n * Extract positional arguments info from schema based on meta.positional config.\n */\nfunction extractPositionalArgsInfo(\n schema: StandardJSONSchemaV1,\n meta?: PadroneMeta,\n): { args: HelpArgumentInfo[]; positionalNames: Set<string> } {\n const args: HelpArgumentInfo[] = [];\n const positionalNames = new Set<string>();\n\n if (!schema || !meta?.positional || meta.positional.length === 0) {\n return { args, positionalNames };\n }\n\n const positionalConfig = parsePositionalConfig(meta.positional);\n\n try {\n const jsonSchema = schema['~standard'].jsonSchema.input({ target: 'draft-2020-12' }) as Record<string, any>;\n\n if (jsonSchema.type === 'object' && jsonSchema.properties) {\n const properties = jsonSchema.properties as Record<string, any>;\n const required = (jsonSchema.required as string[]) || [];\n\n for (const { name, variadic } of positionalConfig) {\n const prop = properties[name];\n if (!prop) continue;\n\n positionalNames.add(name);\n const optMeta = meta.options?.[name];\n\n args.push({\n name: variadic ? `...${name}` : name,\n description: optMeta?.description ?? prop.description,\n optional: !required.includes(name),\n default: prop.default,\n type: variadic ? `array<${prop.items?.type || 'string'}>` : prop.type,\n });\n }\n }\n } catch {\n // Fallback to empty result if toJSONSchema fails\n }\n\n return { args, positionalNames };\n}\n\nfunction extractOptionsInfo(schema: StandardJSONSchemaV1, meta?: PadroneMeta, positionalNames?: Set<string>) {\n const result: HelpOptionInfo[] = [];\n if (!schema) return result;\n\n const vendor = schema['~standard'].vendor;\n if (!vendor.includes('zod')) return result;\n\n const optionsMeta = meta?.options;\n\n try {\n const jsonSchema = schema['~standard'].jsonSchema.input({ target: 'draft-2020-12' }) as Record<string, any>;\n\n // Handle object: z.object({ key: z.string(), ... })\n if (jsonSchema.type === 'object' && jsonSchema.properties) {\n const properties = jsonSchema.properties as Record<string, any>;\n const required = (jsonSchema.required as string[]) || [];\n const propertyNames = new Set(Object.keys(properties));\n\n // Helper to check if a negated version of an option exists\n const hasExplicitNegation = (key: string): boolean => {\n // Check for noVerbose style (camelCase)\n const camelNegated = `no${key.charAt(0).toUpperCase()}${key.slice(1)}`;\n if (propertyNames.has(camelNegated)) return true;\n // Check for no-verbose style (kebab-case, though rare in JS)\n const kebabNegated = `no-${key}`;\n if (propertyNames.has(kebabNegated)) return true;\n return false;\n };\n\n // Helper to check if this option is itself a negation of another option\n const isNegationOf = (key: string): boolean => {\n // Check for noVerbose -> verbose (camelCase)\n if (key.startsWith('no') && key.length > 2 && key[2] === key[2]?.toUpperCase()) {\n const positiveKey = key.charAt(2).toLowerCase() + key.slice(3);\n if (propertyNames.has(positiveKey)) return true;\n }\n // Check for no-verbose -> verbose (kebab-case)\n if (key.startsWith('no-')) {\n const positiveKey = key.slice(3);\n if (propertyNames.has(positiveKey)) return true;\n }\n return false;\n };\n\n for (const [key, prop] of Object.entries(properties)) {\n // Skip positional arguments - they are shown in arguments section\n if (positionalNames?.has(key)) continue;\n\n const isOptional = !required.includes(key);\n const enumValues = prop.enum as string[] | undefined;\n const optMeta = optionsMeta?.[key];\n const propType = prop.type as string;\n\n // Booleans are negatable unless there's an explicit noOption property\n // or this option is itself a negation of another option\n const isNegatable = propType === 'boolean' && !hasExplicitNegation(key) && !isNegationOf(key);\n\n result.push({\n name: key,\n description: optMeta?.description ?? prop.description,\n optional: isOptional,\n default: prop.default,\n type: propType,\n enum: enumValues,\n deprecated: optMeta?.deprecated ?? prop?.deprecated,\n hidden: optMeta?.hidden ?? prop?.hidden,\n examples: optMeta?.examples ?? prop?.examples,\n variadic: propType === 'array', // Arrays are always variadic\n negatable: isNegatable,\n });\n }\n }\n } catch {\n // Fallback to empty result if toJSONSchema fails\n }\n\n return result;\n}\n\n// ============================================================================\n// Core Help Info Builder\n// ============================================================================\n\n/**\n * Builds a comprehensive HelpInfo structure from a command.\n * This is the single source of truth that all formatters use.\n * @param cmd - The command to build help info for\n * @param detail - The level of detail ('minimal', 'standard', or 'full')\n */\nfunction getHelpInfo(cmd: AnyPadroneCommand, detail: HelpOptions['detail'] = 'standard'): HelpInfo {\n const rootCmd = getRootCommand(cmd);\n const commandName = cmd.path || cmd.name || 'program';\n\n // Extract positional args from options schema based on meta.positional\n const { args: positionalArgs, positionalNames } = cmd.options\n ? extractPositionalArgsInfo(cmd.options, cmd.meta)\n : { args: [], positionalNames: new Set<string>() };\n\n const hasArguments = positionalArgs.length > 0;\n\n const helpInfo: HelpInfo = {\n name: commandName,\n title: cmd.title,\n description: cmd.description,\n aliases: cmd.aliases,\n deprecated: cmd.deprecated,\n hidden: cmd.hidden,\n usage: {\n command: rootCmd === cmd ? commandName : `${rootCmd.name} ${commandName}`,\n hasSubcommands: !!(cmd.commands && cmd.commands.length > 0),\n hasArguments,\n hasOptions: !!cmd.options,\n },\n };\n\n // Build subcommands info (filter out hidden commands unless showing full detail)\n if (cmd.commands && cmd.commands.length > 0) {\n const visibleCommands = detail === 'full' ? cmd.commands : cmd.commands.filter((c) => !c.hidden);\n helpInfo.subcommands = visibleCommands.map((c) => {\n return {\n name: c.name,\n title: c.title,\n description: c.description,\n aliases: c.aliases,\n deprecated: c.deprecated,\n hidden: c.hidden,\n };\n });\n\n // In 'full' detail mode, recursively build help for all nested commands\n if (detail === 'full') {\n helpInfo.nestedCommands = visibleCommands.map((c) => getHelpInfo(c, 'full'));\n }\n }\n\n // Build arguments info from positional options\n if (hasArguments) {\n helpInfo.arguments = positionalArgs;\n }\n\n // Build options info with aliases (excluding positional args)\n if (cmd.options) {\n const optionsInfo = extractOptionsInfo(cmd.options, cmd.meta, positionalNames);\n const optMap: Record<string, HelpOptionInfo> = Object.fromEntries(optionsInfo.map((opt) => [opt.name, opt]));\n\n // Merge aliases into options\n const { aliases } = extractSchemaMetadata(cmd.options, cmd.meta?.options);\n for (const [alias, name] of Object.entries(aliases)) {\n const opt = optMap[name];\n if (!opt) continue;\n opt.aliases = [...(opt.aliases || []), alias];\n }\n\n // Filter out hidden options\n const visibleOptions = optionsInfo.filter((opt) => !opt.hidden);\n if (visibleOptions.length > 0) {\n helpInfo.options = visibleOptions;\n }\n }\n\n return helpInfo;\n}\n\n// ============================================================================\n// Main Entry Point\n// ============================================================================\n\nexport function generateHelp(rootCommand: AnyPadroneCommand, commandObj: AnyPadroneCommand = rootCommand, options?: HelpOptions): string {\n const helpInfo = getHelpInfo(commandObj, options?.detail);\n const formatter = createFormatter(options?.format ?? 'auto', options?.detail);\n return formatter.format(helpInfo);\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 option provided to the command, prefixed with `--`.\n * If the option has an `=` sign, the value after it is used as the option'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 options (e.g., `--user.id=123` becomes `['user', 'id']`).\n */\n option: {\n type: 'option';\n key: string[];\n value?: string | string[];\n negated?: boolean;\n };\n /**\n * An alias option provided to the command, prefixed with `-`.\n * Which option 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\n/**\n * Tokenizes input string respecting quoted strings and bracket arrays.\n * Supports single quotes, double quotes, backticks, and square brackets.\n */\nfunction tokenizeInput(input: string): string[] {\n const tokens: string[] = [];\n let current = '';\n let inQuote: '\"' | \"'\" | '`' | 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 // Check for escape sequences within quotes\n if (char === '\\\\' && i + 1 < input.length) {\n const nextChar = input[i + 1];\n // Handle escape sequences\n if (nextChar === inQuote || nextChar === '\\\\') {\n current += nextChar;\n i += 2;\n continue;\n }\n }\n\n if (char === inQuote) {\n // End of quoted string\n inQuote = null;\n } else {\n current += char;\n }\n } else if (char === '[') {\n bracketDepth++;\n current += char;\n } else if (char === ']') {\n bracketDepth = Math.max(0, bracketDepth - 1);\n current += char;\n } else if (bracketDepth > 0) {\n // Inside brackets - include everything including spaces\n current += char;\n } else if (char === '\"' || char === \"'\" || char === '`') {\n // Start of quoted string\n inQuote = char;\n } else if (char === ' ' || char === '\\t') {\n // Whitespace outside quotes and brackets - end current token\n if (current) {\n tokens.push(current);\n current = '';\n }\n } else {\n current += char;\n }\n i++;\n }\n\n // Add the last token if any\n if (current) {\n tokens.push(current);\n }\n\n return tokens;\n}\n\nexport function parseCliInputToParts(input: string): ParsePart[] {\n const parts = tokenizeInput(input.trim());\n const result: ParsePart[] = [];\n\n let pendingValue: ParseParts['option'] | ParseParts['alias'] | undefined;\n let allowTerm = true;\n\n for (const part of parts) {\n if (!part) continue;\n const wasPending = pendingValue;\n pendingValue = undefined;\n\n if (part.startsWith('--no-') && part.length > 5) {\n // Negated boolean option (--no-verbose or --no-config.debug)\n const keyStr = part.slice(5);\n const key = keyStr.split('.');\n const p = { type: 'option' as const, key, value: undefined, negated: true };\n result.push(p);\n } else if (part.startsWith('--')) {\n const [keyStr = '', value] = splitOptionValue(part.slice(2));\n const key = keyStr.split('.');\n\n const p = { type: 'option' as const, key, value };\n if (typeof value === 'undefined') pendingValue = p;\n result.push(p);\n } else if (part.startsWith('-') && part.length > 1 && !/^-\\d/.test(part)) {\n // Short option (but not negative numbers like -5)\n // Aliases cannot be nested, so key is always a single-element array\n const [keyStr = '', value] = splitOptionValue(part.slice(1));\n const key = [keyStr];\n\n const p = { type: 'alias' as const, key, value };\n if (typeof value === 'undefined') pendingValue = p;\n result.push(p);\n } else if (wasPending) {\n wasPending.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 option key and value, handling quoted values after =.\n */\nfunction splitOptionValue(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 const items = parseArrayItems(inner);\n return [key, items];\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\n/**\n * Parse comma-separated items, respecting quotes within items.\n */\nfunction parseArrayItems(input: string): string[] {\n const items: string[] = [];\n let current = '';\n let inQuote: '\"' | \"'\" | '`' | null = null;\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 && input[i + 1] === inQuote) {\n current += input[i + 1];\n i += 2;\n continue;\n }\n if (char === inQuote) {\n inQuote = null;\n } else {\n current += char;\n }\n } else if (char === '\"' || char === \"'\" || char === '`') {\n inQuote = char;\n } else if (char === ',') {\n items.push(current.trim());\n current = '';\n } else {\n current += char;\n }\n i++;\n }\n\n // Add the last item\n if (current || items.length > 0) {\n items.push(current.trim());\n }\n\n return items;\n}\n","import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport type { PadroneSchema } from './types.ts';\n\n/**\n * Configuration options for wrapping an external CLI tool.\n */\nexport type WrapConfig<TCommandOpts extends PadroneSchema = PadroneSchema, TWrapOpts extends PadroneSchema = TCommandOpts> = {\n /**\n * The command to execute (e.g., 'git', 'docker', 'npm').\n */\n command: string;\n /**\n * Optional fixed arguments that always precede the options (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 options to external CLI arguments.\n * The schema's input type should match the command options, and its output type defines\n * the arguments expected by the external command.\n * If not provided, command options are passed through as-is.\n */\n schema?: TWrapOpts | ((commandOptions: TCommandOpts) => TWrapOpts);\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 options to CLI arguments for an external command.\n */\nfunction optionsToArgs(options: Record<string, unknown> | undefined, positional: string[] = []): string[] {\n const args: string[] = [];\n\n // Handle undefined or null options\n if (!options) return args;\n\n const positionalValues: Record<string, unknown> = {};\n const regularOptions: Record<string, unknown> = {};\n\n // Separate positional and regular options\n for (const [key, value] of Object.entries(options)) {\n if (positional.includes(key) || positional.includes(`...${key}`)) {\n positionalValues[key] = value;\n } else {\n regularOptions[key] = value;\n }\n }\n\n // Add regular options first\n for (const [key, value] of Object.entries(regularOptions)) {\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 commandOptions - The command's options schema\n * @param commandPositional - Default positional config from the wrapping command\n */\nexport function createWrapHandler<TCommandOpts extends PadroneSchema, TWrapOpts extends PadroneSchema>(\n config: WrapConfig<TCommandOpts, TWrapOpts>,\n commandOptions: TCommandOpts,\n commandPositional?: string[],\n): (options: StandardSchemaV1.InferOutput<TCommandOpts>) => Promise<WrapResult> {\n return async (options: StandardSchemaV1.InferOutput<TCommandOpts>): 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(commandOptions) : wrapSchema) : commandOptions;\n\n // Transform command options to external CLI options using the wrap schema\n const result = schema['~standard'].validate(options);\n if (result instanceof Promise) {\n throw new Error('Async validation is not supported. Wrap schema validate() must return a synchronous result.');\n }\n if (result.issues) {\n const issueMessages = result.issues\n .map((i) => ` - ${(i.path as (string | number)[] | undefined)?.join('.') || 'root'}: ${i.message}`)\n .join('\\n');\n throw new Error(`Wrap schema validation failed:\\n${issueMessages}`);\n }\n const externalOptions = result.value;\n\n // Convert options to CLI arguments\n const optionArgs = optionsToArgs(externalOptions as Record<string, unknown>, positional);\n\n // Combine fixed args and option args\n const allArgs = [...fixedArgs, ...optionArgs];\n\n // Execute the external command\n const proc = Bun.spawn([command, ...allArgs], {\n stdout: inheritStdio ? 'inherit' : 'pipe',\n stderr: inheritStdio ? 'inherit' : 'pipe',\n stdin: inheritStdio ? 'inherit' : 'ignore',\n });\n\n const exitCode = await proc.exited;\n\n let stdout: string | undefined;\n let stderr: string | undefined;\n\n if (!inheritStdio) {\n if (proc.stdout) {\n const stdoutBuffer = await new Response(proc.stdout).arrayBuffer();\n stdout = new TextDecoder().decode(stdoutBuffer);\n }\n if (proc.stderr) {\n const stderrBuffer = await new Response(proc.stderr).arrayBuffer();\n stderr = new TextDecoder().decode(stderrBuffer);\n }\n }\n\n return {\n exitCode,\n stdout,\n stderr,\n success: exitCode === 0,\n };\n };\n}\n","import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport type { Schema } from 'ai';\nimport { generateCompletionOutput, type ShellType } from './completion.ts';\nimport { generateHelp } from './help.ts';\nimport { extractSchemaMetadata, parsePositionalConfig, preprocessOptions } from './options.ts';\nimport { getNestedValue, parseCliInputToParts, setNestedValue } from './parse.ts';\nimport type { AnyPadroneCommand, AnyPadroneProgram, PadroneAPI, PadroneCommand, PadroneProgram } from './types.ts';\nimport { findConfigFile, getVersion, loadConfigFile } from './utils.ts';\nimport { createWrapHandler } from './wrap.ts';\n\nconst commandSymbol = Symbol('padrone_command');\n\nconst noop = <TRes>() => undefined as TRes;\n\nexport function createPadrone<TProgramName extends string>(name: TProgramName): PadroneProgram<TProgramName, '', ''> {\n return createPadroneBuilder({ name, path: '', commands: [] } as any) as unknown as PadroneProgram<TProgramName, '', ''>;\n}\n\nexport function createPadroneBuilder<TBuilder extends PadroneProgram = PadroneProgram>(\n existingCommand: AnyPadroneCommand,\n): TBuilder & { [commandSymbol]: AnyPadroneCommand } {\n function findCommandByName(name: string, commands?: AnyPadroneCommand[]): AnyPadroneCommand | undefined {\n if (!commands) return undefined;\n\n const foundByName = commands.find((cmd) => cmd.name === name);\n if (foundByName) return foundByName;\n\n // Check for aliases\n const foundByAlias = commands.find((cmd) => cmd.aliases?.includes(name));\n if (foundByAlias) return foundByAlias;\n\n for (const cmd of commands) {\n if (cmd.commands && name.startsWith(`${cmd.name} `)) {\n const subCommandName = name.slice(cmd.name.length + 1);\n const subCommand = findCommandByName(subCommandName, cmd.commands);\n if (subCommand) return subCommand;\n }\n // Check aliases for nested commands\n if (cmd.commands && cmd.aliases) {\n for (const alias of cmd.aliases) {\n if (name.startsWith(`${alias} `)) {\n const subCommandName = name.slice(alias.length + 1);\n const subCommand = findCommandByName(subCommandName, cmd.commands);\n if (subCommand) return subCommand;\n }\n }\n }\n }\n return undefined;\n }\n\n const find: AnyPadroneProgram['find'] = (command) => {\n if (typeof command !== 'string') return findCommandByName(command.path, existingCommand.commands) as any;\n return findCommandByName(command, existingCommand.commands) as any;\n };\n\n /**\n * Parses CLI input to find the command and extract raw options without validation.\n */\n const parseCommand = (input: string | undefined) => {\n input ??= typeof process !== 'undefined' ? (process.argv.slice(2).join(' ') as any) : undefined;\n if (!input) return { command: existingCommand, rawOptions: {} as Record<string, unknown>, args: [] as string[] };\n\n const parts = parseCliInputToParts(input);\n\n const terms = parts.filter((p) => p.type === 'term').map((p) => p.value);\n const args = parts.filter((p) => p.type === 'arg').map((p) => p.value);\n\n let curCommand: AnyPadroneCommand | undefined = existingCommand;\n\n // If the first term is the program name, skip it\n if (terms[0] === existingCommand.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 args.unshift(...terms.slice(i));\n break;\n }\n }\n\n if (!curCommand) return { command: existingCommand, rawOptions: {} as Record<string, unknown>, args };\n\n // Extract option metadata from the nested options object in meta\n const optionsMeta = curCommand.meta?.options;\n const schemaMetadata = curCommand.options ? extractSchemaMetadata(curCommand.options, optionsMeta) : { aliases: {} };\n const { aliases } = schemaMetadata;\n\n // Get array options from schema (arrays are always variadic)\n const arrayOptions = new Set<string>();\n if (curCommand.options) {\n try {\n const jsonSchema = curCommand.options['~standard'].jsonSchema.input({ target: 'draft-2020-12' }) 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') arrayOptions.add(key);\n }\n }\n } catch {\n // Ignore schema parsing errors\n }\n }\n\n const opts = parts.filter((p) => p.type === 'option' || p.type === 'alias');\n const rawOptions: Record<string, unknown> = {};\n\n for (const opt of opts) {\n // For aliases, resolve to the full key name (aliases map single char to full key name)\n // opt.key is now a string[] - for aliases it's always single element like ['v']\n const key: string[] = opt.type === 'alias' && opt.key.length === 1 && aliases[opt.key[0]!] ? [aliases[opt.key[0]!]!] : opt.key;\n\n const rootKey = key[0]!;\n\n // Handle negated boolean options (--no-verbose)\n if (opt.type === 'option' && opt.negated) {\n setNestedValue(rawOptions, key, false);\n continue;\n }\n\n const value = opt.value ?? true;\n\n // Handle array options - accumulate values into arrays (arrays are always variadic)\n if (arrayOptions.has(rootKey)) {\n const existing = getNestedValue(rawOptions, key);\n if (existing !== undefined) {\n if (Array.isArray(existing)) {\n if (Array.isArray(value)) {\n existing.push(...value);\n } else {\n existing.push(value);\n }\n } else {\n if (Array.isArray(value)) {\n setNestedValue(rawOptions, key, [existing, ...value]);\n } else {\n setNestedValue(rawOptions, key, [existing, value]);\n }\n }\n } else {\n setNestedValue(rawOptions, key, Array.isArray(value) ? value : [value]);\n }\n } else {\n setNestedValue(rawOptions, key, value);\n }\n }\n\n return { command: curCommand, rawOptions, args };\n };\n\n /**\n * Validates raw options against the command's schema and applies preprocessing.\n */\n const validateOptions = (\n command: AnyPadroneCommand,\n rawOptions: Record<string, unknown>,\n args: string[],\n parseOptions?: { envData?: Record<string, unknown>; configData?: Record<string, unknown> },\n ) => {\n // Apply preprocessing (env and config bindings)\n const preprocessedOptions = preprocessOptions(rawOptions, {\n aliases: {}, // Already resolved aliases in parseCommand\n envData: parseOptions?.envData,\n configData: parseOptions?.configData,\n });\n\n // Parse positional configuration\n const positionalConfig = command.meta?.positional ? parsePositionalConfig(command.meta.positional) : [];\n\n // Map positional arguments to their named options\n if (positionalConfig.length > 0) {\n let argIndex = 0;\n for (const { name, variadic } of positionalConfig) {\n if (argIndex >= args.length) break;\n\n if (variadic) {\n // Collect remaining args (but leave room for non-variadic args after)\n const remainingPositionals = positionalConfig.slice(positionalConfig.indexOf({ name, variadic }) + 1);\n const nonVariadicAfter = remainingPositionals.filter((p) => !p.variadic).length;\n const variadicEnd = args.length - nonVariadicAfter;\n preprocessedOptions[name] = args.slice(argIndex, variadicEnd);\n argIndex = variadicEnd;\n } else {\n preprocessedOptions[name] = args[argIndex];\n argIndex++;\n }\n }\n }\n\n const optionsParsed = command.options ? command.options['~standard'].validate(preprocessedOptions) : { value: preprocessedOptions };\n\n if (optionsParsed instanceof Promise) {\n throw new Error('Async validation is not supported. Schema validate() must return a synchronous result.');\n }\n\n // Return undefined for options when there's no schema and no meaningful options\n const hasOptions = command.options || Object.keys(preprocessedOptions).length > 0;\n\n return {\n options: optionsParsed.issues ? undefined : hasOptions ? (optionsParsed.value as any) : undefined,\n optionsResult: optionsParsed as any,\n };\n };\n\n const parse: AnyPadroneProgram['parse'] = (input, parseOptions) => {\n const { command, rawOptions, args } = parseCommand(input);\n\n // Resolve env schema: command's own envSchema > inherited from parent/root\n const resolveEnvSchema = (cmd: AnyPadroneCommand): AnyPadroneCommand['envSchema'] => {\n if (cmd.envSchema !== undefined) return cmd.envSchema;\n if (cmd.parent) return resolveEnvSchema(cmd.parent);\n return undefined;\n };\n const envSchema = resolveEnvSchema(command);\n\n // Validate env vars against schema if provided\n let envData: Record<string, unknown> | undefined = parseOptions?.envData;\n if (envSchema && !envData) {\n const rawEnv = parseOptions?.env ?? (typeof process !== 'undefined' ? process.env : {});\n const envValidated = envSchema['~standard'].validate(rawEnv);\n if (envValidated instanceof Promise) {\n throw new Error('Async validation is not supported. Env schema validate() must return a synchronous result.');\n }\n // For env vars, we don't throw on validation errors - just use the transformed value if valid\n if (!envValidated.issues) {\n envData = envValidated.value as unknown as Record<string, unknown>;\n }\n }\n\n const { options, optionsResult } = validateOptions(command, rawOptions, args, {\n envData,\n configData: parseOptions?.configData,\n });\n\n return {\n command: command as any,\n options,\n optionsResult,\n };\n };\n\n const stringify: AnyPadroneProgram['stringify'] = (command = '' as any, options) => {\n const commandObj = typeof command === 'string' ? findCommandByName(command, existingCommand.commands) : (command as AnyPadroneCommand);\n if (!commandObj) throw new Error(`Command \"${command ?? ''}\" not found`);\n\n const parts: string[] = [];\n\n if (commandObj.path) parts.push(commandObj.path);\n\n // Get positional config to determine which options are positional\n const positionalConfig = commandObj.meta?.positional ? parsePositionalConfig(commandObj.meta.positional) : [];\n const positionalNames = new Set(positionalConfig.map((p) => p.name));\n\n // Output positional arguments first in order\n if (options && typeof options === 'object') {\n for (const { name, variadic } of positionalConfig) {\n const value = (options 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 // Helper to stringify a value with a given key prefix\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 parts.push(`--no-${key}`);\n } else if (Array.isArray(value)) {\n // Handle variadic options - output each value separately\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 // Handle nested objects - convert to dot notation\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 // Output remaining options (non-positional)\n for (const [key, value] of Object.entries(options)) {\n if (value === undefined || positionalNames.has(key)) continue;\n stringifyValue(key, value);\n }\n }\n\n return parts.join(' ');\n };\n\n type DetailLevel = 'minimal' | 'standard' | 'full';\n type FormatLevel = 'text' | 'ansi' | 'console' | 'markdown' | 'html' | 'json' | 'auto';\n\n /**\n * Check if help, version, or completion flags/commands are present in the input.\n * Returns the appropriate action to take, or null if normal execution should proceed.\n */\n const checkBuiltinCommands = (\n input: string | undefined,\n ):\n | { type: 'help'; command?: AnyPadroneCommand; detail?: DetailLevel; format?: FormatLevel }\n | { type: 'version' }\n | { type: 'completion'; shell?: ShellType }\n | 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 opts = parts.filter((p) => p.type === 'option' || p.type === 'alias');\n\n // Helper to check if a key array matches a single key string\n const keyIs = (key: string[], name: string) => key.length === 1 && key[0] === name;\n\n // Check for --help, -h flags (these take precedence over commands)\n const hasHelpFlag = opts.some((p) => (p.type === 'option' && keyIs(p.key, 'help')) || (p.type === 'alias' && keyIs(p.key, 'h')));\n\n // Extract detail level from --detail=<level> or -d <level>\n const getDetailLevel = (): DetailLevel | undefined => {\n for (const opt of opts) {\n if (opt.type === 'option' && keyIs(opt.key, 'detail') && typeof opt.value === 'string') {\n if (opt.value === 'minimal' || opt.value === 'standard' || opt.value === 'full') {\n return opt.value;\n }\n }\n if (opt.type === 'alias' && keyIs(opt.key, 'd') && typeof opt.value === 'string') {\n if (opt.value === 'minimal' || opt.value === 'standard' || opt.value === 'full') {\n return opt.value;\n }\n }\n }\n return undefined;\n };\n const detail = getDetailLevel();\n\n // Extract format from --format=<value> or -f <value>\n const getFormat = (): FormatLevel | undefined => {\n const validFormats: FormatLevel[] = ['text', 'ansi', 'console', 'markdown', 'html', 'json', 'auto'];\n for (const opt of opts) {\n if (opt.type === 'option' && keyIs(opt.key, 'format') && typeof opt.value === 'string') {\n if (validFormats.includes(opt.value as FormatLevel)) {\n return opt.value as FormatLevel;\n }\n }\n if (opt.type === 'alias' && keyIs(opt.key, 'f') && typeof opt.value === 'string') {\n if (validFormats.includes(opt.value as FormatLevel)) {\n return opt.value as FormatLevel;\n }\n }\n }\n return undefined;\n };\n const format = getFormat();\n\n // Check for --version, -v, -V flags\n const hasVersionFlag = opts.some(\n (p) => (p.type === 'option' && keyIs(p.key, 'version')) || (p.type === 'alias' && (keyIs(p.key, 'v') || keyIs(p.key, 'V'))),\n );\n\n // If the first term is the program name, skip it\n const normalizedTerms = [...terms];\n if (normalizedTerms[0] === existingCommand.name) normalizedTerms.shift();\n\n // Check if user has defined 'help', 'version', or 'completion' commands (they take precedence)\n const userHelpCommand = findCommandByName('help', existingCommand.commands);\n const userVersionCommand = findCommandByName('version', existingCommand.commands);\n const userCompletionCommand = findCommandByName('completion', existingCommand.commands);\n\n // Check for 'help' command (only if user hasn't defined one)\n if (!userHelpCommand && normalizedTerms[0] === 'help') {\n // help <command> - get help for specific command\n const commandName = normalizedTerms.slice(1).join(' ');\n const targetCommand = commandName ? findCommandByName(commandName, existingCommand.commands) : undefined;\n return { type: 'help', command: targetCommand, detail, format };\n }\n\n // Check for 'version' command (only if user hasn't defined one)\n if (!userVersionCommand && normalizedTerms[0] === 'version') {\n return { type: 'version' };\n }\n\n // Check for 'completion' command (only if user hasn't defined one)\n if (!userCompletionCommand && normalizedTerms[0] === 'completion') {\n const shellArg = normalizedTerms[1] as ShellType | undefined;\n const validShells: ShellType[] = ['bash', 'zsh', 'fish', 'powershell'];\n const shell = shellArg && validShells.includes(shellArg) ? shellArg : undefined;\n return { type: 'completion', shell };\n }\n\n // Handle help flag - find the command being requested\n if (hasHelpFlag) {\n // Filter out help-related terms and flags to find the target command\n const commandTerms = normalizedTerms.filter((t) => t !== 'help');\n const commandName = commandTerms.join(' ');\n const targetCommand = commandName ? findCommandByName(commandName, existingCommand.commands) : undefined;\n return { type: 'help', command: targetCommand, detail, format };\n }\n\n // Handle version flag (only for root command, i.e., no subcommand terms)\n if (hasVersionFlag && normalizedTerms.length === 0) {\n return { type: 'version' };\n }\n\n return null;\n };\n\n /**\n * Extract the config file path from --config=<path> or -c <path> flags.\n */\n const extractConfigPath = (input: string | undefined): string | undefined => {\n if (!input) return undefined;\n\n const parts = parseCliInputToParts(input);\n const opts = parts.filter((p) => p.type === 'option' || p.type === 'alias');\n\n for (const opt of opts) {\n if (opt.type === 'option' && opt.key.length === 1 && opt.key[0] === 'config' && typeof opt.value === 'string') {\n return opt.value;\n }\n if (opt.type === 'alias' && opt.key.length === 1 && opt.key[0] === 'c' && typeof opt.value === 'string') {\n return opt.value;\n }\n }\n return undefined;\n };\n\n const cli: AnyPadroneProgram['cli'] = (input, cliOptions) => {\n // Resolve input from process.argv if not provided\n const resolvedInput = input ?? (typeof process !== 'undefined' ? (process.argv.slice(2).join(' ') as any) : undefined);\n\n // Check for built-in help/version/completion commands and flags\n const builtin = checkBuiltinCommands(resolvedInput);\n\n if (builtin) {\n if (builtin.type === 'help') {\n const helpText = generateHelp(existingCommand, builtin.command ?? existingCommand, {\n detail: builtin.detail,\n format: builtin.format,\n });\n console.log(helpText);\n return {\n command: existingCommand,\n args: undefined,\n options: undefined,\n result: helpText,\n } as any;\n }\n\n if (builtin.type === 'version') {\n const version = getVersion(existingCommand.version);\n console.log(version);\n return {\n command: existingCommand,\n options: undefined,\n result: version,\n } as any;\n }\n\n if (builtin.type === 'completion') {\n const completionScript = generateCompletionOutput(existingCommand, builtin.shell);\n console.log(completionScript);\n return {\n command: existingCommand,\n options: undefined,\n result: completionScript,\n } as any;\n }\n }\n\n // Parse the command first (without validating options)\n const { command, rawOptions, args } = parseCommand(resolvedInput);\n\n // Extract config file path from --config or -c flag\n const configPath = extractConfigPath(resolvedInput);\n\n // Resolve config files: command's own configFiles > inherited from parent/root\n // undefined = inherit, empty array = no config files (explicit opt-out)\n const resolveConfigFiles = (cmd: AnyPadroneCommand): string[] | undefined => {\n if (cmd.configFiles !== undefined) return cmd.configFiles;\n if (cmd.parent) return resolveConfigFiles(cmd.parent);\n return undefined;\n };\n const effectiveConfigFiles = resolveConfigFiles(command);\n\n // Resolve config schema: command's own config > inherited from parent/root\n const resolveConfigSchema = (cmd: AnyPadroneCommand): AnyPadroneCommand['config'] => {\n if (cmd.config !== undefined) return cmd.config;\n if (cmd.parent) return resolveConfigSchema(cmd.parent);\n return undefined;\n };\n const configSchema = resolveConfigSchema(command);\n\n // Resolve env schema: command's own envSchema > inherited from parent/root\n const resolveEnvSchema = (cmd: AnyPadroneCommand): AnyPadroneCommand['envSchema'] => {\n if (cmd.envSchema !== undefined) return cmd.envSchema;\n if (cmd.parent) return resolveEnvSchema(cmd.parent);\n return undefined;\n };\n const envSchema = resolveEnvSchema(command);\n\n // Determine config data: explicit --config flag > auto-discovered config > provided configData\n let configData = cliOptions?.configData;\n if (configPath) {\n // Explicit config path takes precedence\n configData = loadConfigFile(configPath);\n } else if (effectiveConfigFiles?.length) {\n // Search for config files if configFiles is configured (inherited or own)\n const foundConfigPath = findConfigFile(effectiveConfigFiles);\n if (foundConfigPath) {\n configData = loadConfigFile(foundConfigPath) ?? configData;\n }\n }\n\n // Validate config data against schema if provided\n if (configData && configSchema) {\n const configValidated = configSchema['~standard'].validate(configData);\n if (configValidated instanceof Promise) {\n throw new Error('Async validation is not supported. Config schema validate() must return a synchronous result.');\n }\n if (configValidated.issues) {\n const issueMessages = configValidated.issues.map((i) => ` - ${i.path?.join('.') || 'root'}: ${i.message}`).join('\\n');\n throw new Error(`Invalid config file:\\n${issueMessages}`);\n }\n configData = configValidated.value as unknown as Record<string, unknown>;\n }\n\n // Validate env vars against schema if provided\n let envData: Record<string, unknown> | undefined = cliOptions?.envData;\n if (envSchema) {\n const rawEnv = cliOptions?.env ?? (typeof process !== 'undefined' ? process.env : {});\n const envValidated = envSchema['~standard'].validate(rawEnv);\n if (envValidated instanceof Promise) {\n throw new Error('Async validation is not supported. Env schema validate() must return a synchronous result.');\n }\n // For env vars, we don't throw on validation errors - just use the transformed value if valid\n // This is because the schema may use .optional() or .default() for missing env vars\n if (!envValidated.issues) {\n envData = envValidated.value as unknown as Record<string, unknown>;\n }\n }\n\n // Validate options with env and config data\n const { options, optionsResult } = validateOptions(command, rawOptions, args, {\n envData,\n configData,\n });\n\n // Handle validation failures\n if (optionsResult?.issues) {\n const issueMessages = optionsResult.issues\n .map((i: StandardSchemaV1.Issue) => ` - ${i.path?.join('.') || 'root'}: ${i.message}`)\n .join('\\n');\n\n if (input === undefined) {\n // Called without explicit input (using process.argv): print error + help and throw\n const helpText = generateHelp(existingCommand, command, { format: 'text' });\n console.error(`Validation error:\\n${issueMessages}`);\n console.error(helpText);\n throw new Error(`Validation error:\\n${issueMessages}`);\n }\n\n // Called with explicit input: return result with issues, skip the action\n return {\n command: command as any,\n options: undefined,\n optionsResult,\n result: undefined,\n } as any;\n }\n\n const res = run(command, options) as any;\n return {\n ...res,\n optionsResult,\n };\n };\n\n const run: AnyPadroneProgram['run'] = (command, options) => {\n const commandObj = typeof command === 'string' ? findCommandByName(command, existingCommand.commands) : (command as AnyPadroneCommand);\n if (!commandObj) throw new Error(`Command \"${command ?? ''}\" not found`);\n if (!commandObj.handler) throw new Error(`Command \"${commandObj.path}\" has no handler`);\n\n const result = commandObj.handler(options as any);\n\n return {\n command: commandObj as any,\n options: options as any,\n result,\n };\n };\n\n const tool: AnyPadroneProgram['tool'] = () => {\n const helpText = generateHelp(existingCommand, undefined, { format: 'text', detail: 'full' });\n\n const description = `\\n\nThis is a CLI tool created with Padrone. You can run any of the defined commands described in the help text below. If you need assistance, refer to the documentation or use the help command.\n\n<help_output>\n${helpText}\n</help_output>\n`;\n\n return {\n type: 'function',\n name: existingCommand.name,\n strict: true,\n title: existingCommand.description,\n description,\n inputExamples: [{ input: { command: '<command> [args...] [options...]' } }],\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: (input) => {\n const { command, options } = parse(input.command);\n if (typeof command.needsApproval === 'function') return command.needsApproval(options);\n return !!command.needsApproval;\n },\n execute: (input) => {\n return cli(input.command).result;\n },\n };\n };\n\n return {\n configure(config) {\n return createPadroneBuilder({ ...existingCommand, ...config }) as any;\n },\n arguments(options, meta) {\n // If options is a function, call it with parent's options as base\n const resolvedOptions = typeof options === 'function' ? options(existingCommand.options as any) : options;\n return createPadroneBuilder({ ...existingCommand, options: resolvedOptions, meta }) as any;\n },\n configFile(file, schema) {\n const configFiles = file === undefined ? undefined : Array.isArray(file) ? file : [file];\n const resolvedConfig = typeof schema === 'function' ? schema(existingCommand.options) : (schema ?? existingCommand.options);\n return createPadroneBuilder({ ...existingCommand, configFiles, config: resolvedConfig as any }) as any;\n },\n env(schema) {\n const resolvedEnv = typeof schema === 'function' ? schema(existingCommand.options) : schema;\n return createPadroneBuilder({ ...existingCommand, envSchema: resolvedEnv as any }) as any;\n },\n action(handler = noop) {\n return createPadroneBuilder({ ...existingCommand, handler }) as any;\n },\n wrap(config) {\n const handler = createWrapHandler(config, existingCommand.options as any, existingCommand.meta?.positional);\n return createPadroneBuilder({ ...existingCommand, handler }) as any;\n },\n command(nameOrNames, builderFn) {\n // Extract name and aliases from the input\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 initialCommand = {\n name,\n path: existingCommand.path ? `${existingCommand.path} ${name}` : name,\n aliases,\n parent: existingCommand,\n '~types': {} as any,\n } satisfies PadroneCommand;\n const builder = createPadroneBuilder(initialCommand);\n\n const commandObj =\n ((builderFn?.(builder as any) as unknown as typeof builder)?.[commandSymbol] as AnyPadroneCommand) ?? initialCommand;\n return createPadroneBuilder({ ...existingCommand, commands: [...(existingCommand.commands || []), commandObj] }) as any;\n },\n\n run,\n find,\n parse,\n stringify,\n cli,\n tool,\n\n api() {\n function buildApi(command: AnyPadroneCommand) {\n const runCommand = ((options) => run(command, options).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\n return buildApi(existingCommand);\n },\n\n help(command, options) {\n const commandObj = !command\n ? existingCommand\n : typeof command === 'string'\n ? findCommandByName(command, existingCommand.commands)\n : (command as AnyPadroneCommand);\n if (!commandObj) throw new Error(`Command \"${command ?? ''}\" not found`);\n return generateHelp(existingCommand, commandObj, options);\n },\n\n completion(shell) {\n return generateCompletionOutput(existingCommand, shell as ShellType | undefined);\n },\n\n '~types': {} as any,\n\n [commandSymbol]: existingCommand,\n } satisfies AnyPadroneProgram & { [commandSymbol]: AnyPadroneCommand } as any;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/errors.ts","../src/interactive.ts","../src/parse.ts","../src/repl-loop.ts","../src/wrap.ts","../src/create.ts"],"sourcesContent":["/**\n * Structured error hierarchy for Padrone CLI framework.\n *\n * All Padrone errors extend `PadroneError`, which carries an exit code,\n * optional suggestions, and context about which command/phase produced the error.\n * This allows callers to distinguish user errors (bad input) from bugs (unexpected throws)\n * and to present formatted, actionable error messages.\n */\n\nexport type PadroneErrorOptions = {\n /** Process exit code. Defaults to 1. */\n exitCode?: number;\n /** Actionable suggestions shown to the user (e.g. \"Use --env production\"). */\n suggestions?: string[];\n /** The command path that produced the error (e.g. \"deploy staging\"). */\n command?: string;\n /** The phase where the error occurred. */\n phase?: 'parse' | 'validate' | 'execute' | 'config';\n /** Original cause for error chaining. */\n cause?: unknown;\n};\n\n/**\n * Base error class for all Padrone errors.\n * Carries structured metadata for user-friendly formatting and programmatic handling.\n *\n * @example\n * ```ts\n * throw new PadroneError('Something went wrong', {\n * exitCode: 1,\n * suggestions: ['Try --help for usage information'],\n * });\n * ```\n */\nexport class PadroneError extends Error {\n readonly exitCode: number;\n readonly suggestions: string[];\n readonly command?: string;\n readonly phase?: 'parse' | 'validate' | 'execute' | 'config';\n\n constructor(message: string, options?: PadroneErrorOptions) {\n super(message, options?.cause ? { cause: options.cause } : undefined);\n this.name = 'PadroneError';\n this.exitCode = options?.exitCode ?? 1;\n this.suggestions = options?.suggestions ?? [];\n this.command = options?.command;\n this.phase = options?.phase;\n }\n\n /**\n * Returns a serializable representation of the error,\n * suitable for non-terminal runtimes (web UIs, APIs, etc.).\n */\n toJSON(): {\n name: string;\n message: string;\n exitCode: number;\n suggestions: string[];\n command?: string;\n phase?: string;\n } {\n return {\n name: this.name,\n message: this.message,\n exitCode: this.exitCode,\n suggestions: this.suggestions,\n command: this.command,\n phase: this.phase,\n };\n }\n}\n\n/**\n * Thrown when command routing fails — unknown command, unexpected arguments, etc.\n */\nexport class RoutingError extends PadroneError {\n constructor(message: string, options?: PadroneErrorOptions) {\n super(message, { phase: 'parse', ...options });\n this.name = 'RoutingError';\n }\n}\n\n/**\n * Thrown when argument or schema validation fails.\n * Carries the structured issues from the schema validator.\n */\nexport class ValidationError extends PadroneError {\n readonly issues: readonly { path?: PropertyKey[]; message: string }[];\n\n constructor(message: string, issues: readonly { path?: PropertyKey[]; message: string }[], options?: PadroneErrorOptions) {\n super(message, { phase: 'validate', ...options });\n this.name = 'ValidationError';\n this.issues = issues;\n }\n\n override toJSON() {\n return {\n ...super.toJSON(),\n issues: this.issues.map((i) => ({ path: i.path?.map(String), message: i.message })),\n };\n }\n}\n\n/**\n * Thrown when config file loading or validation fails.\n */\nexport class ConfigError extends PadroneError {\n constructor(message: string, options?: PadroneErrorOptions) {\n super(message, { phase: 'config', ...options });\n this.name = 'ConfigError';\n }\n}\n\n/**\n * Thrown from user action handlers to surface structured errors with exit codes and suggestions.\n * This is the primary error class users should throw from their command actions.\n *\n * @example\n * ```ts\n * throw new ActionError('Missing environment', {\n * exitCode: 1,\n * suggestions: ['Use --env production or --env staging'],\n * });\n * ```\n */\nexport class ActionError extends PadroneError {\n constructor(message: string, options?: PadroneErrorOptions) {\n super(message, { phase: 'execute', ...options });\n this.name = 'ActionError';\n }\n}\n","import type { InteractivePromptConfig, ResolvedPadroneRuntime } from './runtime.ts';\nimport type { AnyPadroneCommand } from './types.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 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 = command.argsSchema['~standard'].jsonSchema.input({ target: 'draft-2020-12' }) 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\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 runtime.prompt(config);\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 runtime.prompt(config);\n }\n }\n }\n\n return result;\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\n/**\n * Tokenizes input string respecting quoted strings and bracket arrays.\n * Supports single quotes, double quotes, backticks, and square brackets.\n */\nfunction tokenizeInput(input: string): string[] {\n const tokens: string[] = [];\n let current = '';\n let inQuote: '\"' | \"'\" | '`' | 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 // Check for escape sequences within quotes\n if (char === '\\\\' && i + 1 < input.length) {\n const nextChar = input[i + 1];\n // Handle escape sequences\n if (nextChar === inQuote || nextChar === '\\\\') {\n current += nextChar;\n i += 2;\n continue;\n }\n }\n\n if (char === inQuote) {\n // End of quoted string\n inQuote = null;\n } else {\n current += char;\n }\n } else if (char === '[') {\n bracketDepth++;\n current += char;\n } else if (char === ']') {\n bracketDepth = Math.max(0, bracketDepth - 1);\n current += char;\n } else if (bracketDepth > 0) {\n // Inside brackets - include everything including spaces\n current += char;\n } else if (char === '\"' || char === \"'\" || char === '`') {\n // Start of quoted string\n inQuote = char;\n } else if (char === ' ' || char === '\\t') {\n // Whitespace outside quotes and brackets - end current token\n if (current) {\n tokens.push(current);\n current = '';\n }\n } else {\n current += char;\n }\n i++;\n }\n\n // Add the last token if any\n if (current) {\n tokens.push(current);\n }\n\n return tokens;\n}\n\nexport function parseCliInputToParts(input: string): ParsePart[] {\n const parts = tokenizeInput(input.trim());\n const result: ParsePart[] = [];\n\n let pendingValue: ParseParts['named'] | ParseParts['alias'] | undefined;\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 if (pendingValue) pendingValue = undefined;\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 wasPending = pendingValue;\n pendingValue = undefined;\n\n if (part.startsWith('--no-') && part.length > 5) {\n // Negated boolean arg (--no-verbose or --no-config.debug)\n const keyStr = part.slice(5);\n const key = keyStr.split('.');\n const p = { type: 'named' as const, key, value: undefined, negated: true };\n result.push(p);\n } else if (part.startsWith('--')) {\n const [keyStr = '', value] = splitNamedArgValue(part.slice(2));\n const key = keyStr.split('.');\n\n const p = { type: 'named' as const, key, value };\n if (typeof value === 'undefined') pendingValue = p;\n result.push(p);\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' as const, key: [keyStr[ci]!], value: undefined });\n }\n const lastFlag = { type: 'alias' as const, key: [keyStr[keyStr.length - 1]!], value: undefined as string | string[] | undefined };\n pendingValue = lastFlag;\n result.push(lastFlag);\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' as const, key: [keyStr[ci]!], value: undefined });\n }\n result.push({ type: 'alias' as const, key: [keyStr[keyStr.length - 1]!], value });\n } else {\n // Single char: -v or -v=value\n const p = { type: 'alias' as const, key: [keyStr], value };\n if (typeof value === 'undefined') pendingValue = p;\n result.push(p);\n }\n } else if (wasPending) {\n wasPending.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 const items = parseArrayItems(inner);\n return [key, items];\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\n/**\n * Parse comma-separated items, respecting quotes within items.\n */\nfunction parseArrayItems(input: string): string[] {\n const items: string[] = [];\n let current = '';\n let inQuote: '\"' | \"'\" | '`' | null = null;\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 && input[i + 1] === inQuote) {\n current += input[i + 1];\n i += 2;\n continue;\n }\n if (char === inQuote) {\n inQuote = null;\n } else {\n current += char;\n }\n } else if (char === '\"' || char === \"'\" || char === '`') {\n inQuote = char;\n } else if (char === ',') {\n items.push(current.trim());\n current = '';\n } else {\n current += char;\n }\n i++;\n }\n\n // Add the last item\n if (current || items.length > 0) {\n items.push(current.trim());\n }\n\n return items;\n}\n","import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { buildReplCompleter, findCommandByName, getCommandRuntime } from './command-utils.ts';\nimport { createTerminalReplSession, REPL_SIGINT, type ReplSessionConfig } from './runtime.ts';\nimport type { AnyPadroneCommand, PadroneEvalPreferences, PadroneReplPreferences } from './types.ts';\nimport { getVersion } from './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> {\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 useAnsi =\n runtime.format === 'ansi' ||\n (runtime.format === 'auto' && typeof process !== 'undefined' && !process.env.NO_COLOR && !process.env.CI && process.stdout?.isTTY);\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 ? 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 =\n value.length === 1\n ? value.repeat(typeof process !== 'undefined' && process.stdout?.columns ? process.stdout.columns : 80)\n : 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 = options?.autoOutput === false ? { autoOutput: false } : undefined;\n const result = await evalCommand(scopedInput, replEvalPrefs);\n 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 return replIterator() as any;\n}\n","import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { ValidationError } from './errors.ts';\nimport type { PadroneSchema } from './types.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: 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?: 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 proc = Bun.spawn([command, ...allArgs], {\n stdout: inheritStdio ? 'inherit' : 'pipe',\n stderr: inheritStdio ? 'inherit' : 'pipe',\n stdin: inheritStdio ? 'inherit' : 'ignore',\n });\n\n const exitCode = await proc.exited;\n\n let stdout: string | undefined;\n let stderr: string | undefined;\n\n if (!inheritStdio) {\n if (proc.stdout) {\n const stdoutBuffer = await new Response(proc.stdout).arrayBuffer();\n stdout = new TextDecoder().decode(stdoutBuffer);\n }\n if (proc.stderr) {\n const stderrBuffer = await new Response(proc.stderr).arrayBuffer();\n stderr = new TextDecoder().decode(stderrBuffer);\n }\n }\n\n return {\n exitCode,\n stdout,\n stderr,\n success: exitCode === 0,\n };\n };\n}\n","import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport type { Schema } from 'ai';\nimport { coerceArgs, detectUnknownArgs, extractSchemaMetadata, parsePositionalConfig, parseStdinConfig, preprocessArgs } from './args.ts';\nimport {\n commandSymbol,\n findCommandByName,\n getCommandRuntime,\n hasInteractiveConfig,\n isAsyncBranded,\n mergeCommands,\n noop,\n outputValue,\n repathCommandTree,\n runPluginChain,\n suggestSimilar,\n thenMaybe,\n warnIfUnexpectedAsync,\n wrapWithLifecycle,\n} from './command-utils.ts';\nimport type { ShellType } from './completion.ts';\nimport { ConfigError, RoutingError, ValidationError } from './errors.ts';\nimport { generateHelp } from './help.ts';\nimport { promptInteractiveFields } from './interactive.ts';\nimport { getNestedValue, parseCliInputToParts, setNestedValue } from './parse.ts';\nimport { createReplIterator } from './repl-loop.ts';\nimport { resolveStdin } from './runtime.ts';\nimport type {\n AnyPadroneCommand,\n AnyPadroneProgram,\n PadroneActionContext,\n PadroneAPI,\n PadroneCommand,\n PadroneEvalPreferences,\n PadronePlugin,\n PadroneProgram,\n PadroneReplPreferences,\n PluginExecuteContext,\n PluginExecuteResult,\n PluginParseContext,\n PluginParseResult,\n PluginValidateContext,\n PluginValidateResult,\n} from './types.ts';\nimport { getVersion } from './utils.ts';\nimport { createWrapHandler } from './wrap.ts';\n\nexport { asyncSchema, buildReplCompleter } from './command-utils.ts';\n\nexport function createPadrone<TProgramName extends string>(name: TProgramName): PadroneProgram<TProgramName, '', ''> {\n return createPadroneBuilder({ name, path: '', commands: [] } as any) as unknown as PadroneProgram<TProgramName, '', ''>;\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 /** Creates the action context passed to command handlers. References `builder` which is defined later but only called at runtime. */\n const createActionContext = (cmd: AnyPadroneCommand): PadroneActionContext => ({\n runtime: getCommandRuntime(cmd),\n command: cmd,\n program: builder as any,\n });\n\n const find: AnyPadroneProgram['find'] = (command) => {\n if (typeof command !== 'string') return findCommandByName(command.path, existingCommand.commands) as any;\n return findCommandByName(command, existingCommand.commands) as any;\n };\n\n /**\n * Parses CLI input to find the command and extract raw arguments without validation.\n */\n const parseCommand = (input: string | undefined) => {\n input ??= getCommandRuntime(existingCommand).argv().join(' ') || undefined;\n if (!input) {\n // No input: check for default '' command\n const defaultCommand = findCommandByName('', existingCommand.commands);\n if (defaultCommand) {\n return { command: defaultCommand, rawArgs: {} as Record<string, unknown>, args: [] as string[], unmatchedTerms: [] as string[] };\n }\n return { command: existingCommand, 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 args = parts.filter((p) => p.type === 'arg').map((p) => p.value);\n\n let curCommand: AnyPadroneCommand | undefined = existingCommand;\n let unmatchedTerms: string[] = [];\n\n // If the first term is the program name, skip it\n if (terms[0] === existingCommand.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 args.unshift(...unmatchedTerms);\n break;\n }\n }\n\n // If no unmatched terms remain, check for a default '' subcommand.\n // This handles both the root level (no input) and nested commands (e.g., \"advanced\" with a '' subcommand).\n if (unmatchedTerms.length === 0 && curCommand.commands?.length) {\n const defaultCommand = findCommandByName('', curCommand.commands);\n if (defaultCommand) {\n curCommand = defaultCommand;\n }\n }\n\n if (!curCommand) return { command: existingCommand, rawArgs: {} as Record<string, unknown>, args, unmatchedTerms };\n\n // Extract argument metadata from the nested arguments object in meta\n const argsMeta = curCommand.meta?.fields;\n const schemaMetadata = curCommand.argsSchema\n ? extractSchemaMetadata(curCommand.argsSchema, argsMeta, curCommand.meta?.autoAlias)\n : { flags: {}, aliases: {} };\n const { flags, aliases } = schemaMetadata;\n\n // Get array arguments from schema (arrays are always variadic)\n const arrayArguments = new Set<string>();\n if (curCommand.argsSchema) {\n try {\n const jsonSchema = curCommand.argsSchema['~standard'].jsonSchema.input({ target: 'draft-2020-12' }) 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 // Resolve flags (single-char, from alias parts: -v) and aliases (multi-char, from named parts: --dry-run)\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 {\n key = arg.key;\n }\n\n const rootKey = key[0]!;\n\n // Handle negated boolean arguments (--no-verbose)\n if (arg.type === 'named' && arg.negated) {\n setNestedValue(rawArgs, key, false);\n continue;\n }\n\n const value = arg.value ?? true;\n\n // Handle array arguments - accumulate values into arrays (arrays are always variadic)\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)) {\n existing.push(...value);\n } else {\n existing.push(value);\n }\n } else {\n if (Array.isArray(value)) {\n setNestedValue(rawArgs, key, [existing, ...value]);\n } else {\n setNestedValue(rawArgs, key, [existing, value]);\n }\n }\n } else {\n setNestedValue(rawArgs, key, Array.isArray(value) ? value : [value]);\n }\n } else {\n setNestedValue(rawArgs, key, value);\n }\n }\n\n return { command: curCommand, rawArgs, args, unmatchedTerms };\n };\n\n /**\n * Preprocesses raw arguments: applies env/config values and maps positional arguments.\n * Also performs auto-coercion (string→number/boolean) and unknown arg detection.\n */\n const buildCommandArgs = (\n command: AnyPadroneCommand,\n rawArgs: Record<string, unknown>,\n args: string[],\n context?: { stdinData?: Record<string, unknown>; envData?: Record<string, unknown>; configData?: Record<string, unknown> },\n ): Record<string, unknown> => {\n // Apply preprocessing (stdin, env, and config bindings)\n let preprocessedArgs = preprocessArgs(rawArgs, {\n flags: {}, // Already resolved in parseCommand\n aliases: {}, // Already resolved in parseCommand\n stdinData: context?.stdinData,\n envData: context?.envData,\n configData: context?.configData,\n });\n\n // Parse positional configuration\n const positionalConfig = command.meta?.positional ? parsePositionalConfig(command.meta.positional) : [];\n\n // Map positional arguments to their named arguments\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 >= args.length) break;\n\n if (variadic) {\n // Collect remaining args (but leave room for non-variadic args after)\n const remainingPositionals = positionalConfig.slice(i + 1);\n const nonVariadicAfter = remainingPositionals.filter((p) => !p.variadic).length;\n const variadicEnd = args.length - nonVariadicAfter;\n preprocessedArgs[name] = args.slice(argIndex, variadicEnd);\n argIndex = variadicEnd;\n } else if (i === positionalConfig.length - 1 && args.length > argIndex + 1) {\n // Last non-variadic positional: join all remaining tokens (e.g. `-- Hello world` → \"Hello world\")\n preprocessedArgs[name] = args.slice(argIndex).join(' ');\n argIndex = args.length;\n } else {\n preprocessedArgs[name] = args[argIndex];\n argIndex++;\n }\n }\n }\n\n // Auto-coerce CLI string values to match schema types (string→number, string→boolean)\n if (command.argsSchema) {\n preprocessedArgs = coerceArgs(preprocessedArgs, command.argsSchema);\n }\n\n return preprocessedArgs;\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 */\n const checkUnknownArgs = (\n command: AnyPadroneCommand,\n preprocessedArgs: Record<string, unknown>,\n ): { key: string; suggestion: string }[] => {\n if (!command.argsSchema) return [];\n\n const argsMeta = command.meta?.fields;\n const { flags, aliases } = extractSchemaMetadata(command.argsSchema, argsMeta, command.meta?.autoAlias);\n\n return detectUnknownArgs(preprocessedArgs, command.argsSchema, flags, aliases, suggestSimilar);\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 */\n const validateCommandArgs = (command: AnyPadroneCommand, preprocessedArgs: Record<string, unknown>) => {\n // Check for unknown args before schema validation (strict by default)\n const unknownArgs = checkUnknownArgs(command, preprocessedArgs);\n if (unknownArgs.length > 0) {\n const issues: StandardSchemaV1.Issue[] = unknownArgs.map(({ key, suggestion }) => ({\n path: [key],\n message: suggestion ? `Unknown option: \"${key}\". ${suggestion}` : `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: preprocessedArgs };\n\n // Return undefined for args when there's no schema and no meaningful args\n const hasArgs = command.argsSchema || Object.keys(preprocessedArgs).length > 0;\n\n const buildResult = (parsed: StandardSchemaV1.Result<unknown>) => ({\n args: parsed.issues ? undefined : hasArgs ? (parsed.value as any) : undefined,\n argsResult: parsed as any,\n });\n\n return thenMaybe(argsParsed, buildResult);\n };\n\n /**\n * Preprocesses and validates raw arguments against the command's schema.\n * Returns sync or async result depending on the schema's validate method.\n */\n const validateArgs = (\n command: AnyPadroneCommand,\n rawArgs: Record<string, unknown>,\n args: string[],\n context?: { stdinData?: Record<string, unknown>; envData?: Record<string, unknown>; configData?: Record<string, unknown> },\n ) => {\n const preprocessedArgs = buildCommandArgs(command, rawArgs, args, context);\n return validateCommandArgs(command, preprocessedArgs);\n };\n\n const parse: AnyPadroneProgram['parse'] = (input) => {\n const state: Record<string, unknown> = {};\n\n // Parse phase (with plugins)\n const parseCtx: PluginParseContext = { input: input as string | undefined, command: existingCommand, state };\n const coreParse = (): PluginParseResult => {\n const { command, rawArgs, args } = parseCommand(parseCtx.input);\n return { command, rawArgs, positionalArgs: args };\n };\n\n // Parse phase: root plugins only\n const rootPlugins = existingCommand.plugins ?? [];\n const parsedOrPromise = runPluginChain('parse', rootPlugins, parseCtx, coreParse);\n\n const continueAfterParse = (parsed: PluginParseResult) => {\n const { command } = parsed;\n\n // Validate phase: collected from parent chain\n const commandPlugins = collectPlugins(command);\n const validateCtx: PluginValidateContext = {\n command,\n rawArgs: parsed.rawArgs,\n positionalArgs: parsed.positionalArgs,\n state,\n };\n\n const coreValidate = (): PluginValidateResult | Promise<PluginValidateResult> => {\n // Resolve env schema: command's own envSchema > inherited from parent/root\n const resolveEnvSchema = (cmd: AnyPadroneCommand): AnyPadroneCommand['envSchema'] => {\n if (cmd.envSchema !== undefined) return cmd.envSchema;\n if (cmd.parent) return resolveEnvSchema(cmd.parent);\n return undefined;\n };\n const envSchema = resolveEnvSchema(command);\n\n const readStdinForParse = (): Record<string, unknown> | Promise<Record<string, unknown>> => {\n const stdinConfig = command.meta?.stdin;\n if (!stdinConfig) return {};\n\n const { field, as } = parseStdinConfig(stdinConfig);\n\n // Skip if the field was already provided via CLI flags\n if (field in validateCtx.rawArgs && validateCtx.rawArgs[field] !== undefined) return {};\n\n const runtime = getCommandRuntime(existingCommand);\n const stdin = resolveStdin(runtime as any);\n if (!stdin) return {};\n\n if (as === 'lines') {\n return (async () => {\n const lines: string[] = [];\n for await (const line of stdin.lines()) {\n lines.push(line);\n }\n return { [field]: lines };\n })();\n }\n return stdin.text().then((text) => (text ? { [field]: text } : {}));\n };\n\n const finalize = (\n envData: Record<string, unknown> | undefined,\n stdinData: Record<string, unknown> | undefined,\n ): PluginValidateResult | Promise<PluginValidateResult> => {\n const validated = validateArgs(command, validateCtx.rawArgs, validateCtx.positionalArgs, { stdinData, envData });\n return thenMaybe(validated, (v) => v as PluginValidateResult);\n };\n\n let envData: Record<string, unknown> | undefined;\n const afterEnv = (envResult: Record<string, unknown> | undefined) => {\n const stdinDataOrPromise = readStdinForParse();\n return thenMaybe(stdinDataOrPromise, (stdinData) => {\n const hasStdinData = Object.keys(stdinData).length > 0;\n return finalize(envResult, hasStdinData ? stdinData : undefined);\n });\n };\n\n if (envSchema) {\n const runtime = getCommandRuntime(existingCommand);\n const rawEnv = runtime.env();\n const envValidated = envSchema['~standard'].validate(rawEnv);\n\n return thenMaybe(envValidated, (result) => {\n if (!result.issues) {\n envData = result.value as unknown as Record<string, unknown>;\n }\n return afterEnv(envData);\n });\n }\n\n return afterEnv(envData);\n };\n\n const validatedOrPromise = runPluginChain('validate', commandPlugins, validateCtx, coreValidate);\n\n return warnIfUnexpectedAsync(\n thenMaybe(validatedOrPromise, (v) => ({\n command: command as any,\n args: v.args,\n argsResult: v.argsResult,\n })),\n command,\n );\n };\n\n return thenMaybe(parsedOrPromise, continueAfterParse) as any;\n };\n\n const stringify: AnyPadroneProgram['stringify'] = (command = '' as any, args) => {\n const commandObj = typeof command === 'string' ? findCommandByName(command, existingCommand.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 // Get positional config to determine which args are positional\n const positionalConfig = commandObj.meta?.positional ? parsePositionalConfig(commandObj.meta.positional) : [];\n const positionalNames = new Set(positionalConfig.map((p) => p.name));\n\n // Output positional arguments first in order\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 // Helper to stringify a value with a given key prefix\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 parts.push(`--no-${key}`);\n } else if (Array.isArray(value)) {\n // Handle variadic arguments - output each value separately\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 // Handle nested objects - convert to dot notation\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 // Output remaining arguments (non-positional)\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 type DetailLevel = 'minimal' | 'standard' | 'full';\n type FormatLevel = 'text' | 'ansi' | 'console' | 'markdown' | 'html' | 'json' | 'auto';\n\n /**\n * Check if help, version, or completion flags/commands are present in the input.\n * Returns the appropriate action to take, or null if normal execution should proceed.\n */\n const checkBuiltinCommands = (\n input: string | undefined,\n ):\n | { type: 'help'; command?: AnyPadroneCommand; detail?: DetailLevel; format?: FormatLevel }\n | { type: 'version' }\n | { type: 'completion'; shell?: ShellType; setup?: boolean }\n | { type: 'repl'; scope?: string }\n | 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' || p.type === 'alias');\n\n // Helper to check if a key array matches a single key string\n const keyIs = (key: string[], name: string) => key.length === 1 && key[0] === name;\n\n // Check for --help, -h flags (these take precedence over commands)\n const hasHelpFlag = args.some((p) => (p.type === 'named' && keyIs(p.key, 'help')) || (p.type === 'alias' && keyIs(p.key, 'h')));\n\n // Extract detail level from --detail=<level> or -d <level>\n const getDetailLevel = (): DetailLevel | undefined => {\n for (const arg of args) {\n if (arg.type === 'named' && keyIs(arg.key, 'detail') && typeof arg.value === 'string') {\n if (arg.value === 'minimal' || arg.value === 'standard' || arg.value === 'full') {\n return arg.value;\n }\n }\n if (arg.type === 'alias' && keyIs(arg.key, 'd') && typeof arg.value === 'string') {\n if (arg.value === 'minimal' || arg.value === 'standard' || arg.value === 'full') {\n return arg.value;\n }\n }\n }\n return undefined;\n };\n const detail = getDetailLevel();\n\n // Extract format from --format=<value> or -f <value>\n const getFormat = (): FormatLevel | undefined => {\n const validFormats: FormatLevel[] = ['text', 'ansi', 'console', 'markdown', 'html', 'json', 'auto'];\n for (const arg of args) {\n if (arg.type === 'named' && keyIs(arg.key, 'format') && typeof arg.value === 'string') {\n if (validFormats.includes(arg.value as FormatLevel)) {\n return arg.value as FormatLevel;\n }\n }\n if (arg.type === 'alias' && keyIs(arg.key, 'f') && typeof arg.value === 'string') {\n if (validFormats.includes(arg.value as FormatLevel)) {\n return arg.value as FormatLevel;\n }\n }\n }\n return undefined;\n };\n const format = getFormat();\n\n // Check for --version, -v, -V flags\n const hasVersionFlag = args.some(\n (p) => (p.type === 'named' && keyIs(p.key, 'version')) || (p.type === 'alias' && (keyIs(p.key, 'v') || keyIs(p.key, 'V'))),\n );\n\n // If the first term is the program name, skip it\n const normalizedTerms = [...terms];\n if (normalizedTerms[0] === existingCommand.name) normalizedTerms.shift();\n\n // Check if user has defined 'help', 'version', or 'completion' commands (they take precedence)\n const userHelpCommand = findCommandByName('help', existingCommand.commands);\n const userVersionCommand = findCommandByName('version', existingCommand.commands);\n const userCompletionCommand = findCommandByName('completion', existingCommand.commands);\n\n // Check for 'help' command (only if user hasn't defined one)\n // Supports both 'help <command>' and '<command> help' forms\n if (!userHelpCommand && normalizedTerms[0] === 'help') {\n // help <command> - get help for specific command\n const commandName = normalizedTerms.slice(1).join(' ');\n const targetCommand = commandName ? findCommandByName(commandName, existingCommand.commands) : undefined;\n return { type: 'help', command: targetCommand, detail, format };\n }\n if (!userHelpCommand && normalizedTerms.length > 0 && normalizedTerms[normalizedTerms.length - 1] === 'help') {\n // <command> help - get help for specific command (trailing form)\n const commandTerms = normalizedTerms.slice(0, -1);\n // Walk the command tree to find the deepest matching command\n let targetCommand: AnyPadroneCommand | undefined;\n let current = existingCommand;\n for (const term of commandTerms) {\n const found = findCommandByName(term, current.commands);\n if (found) {\n targetCommand = found;\n current = found;\n } else {\n break;\n }\n }\n return { type: 'help', command: targetCommand, detail, format };\n }\n\n // Check for 'version' command (only if user hasn't defined one)\n if (!userVersionCommand && normalizedTerms[0] === 'version') {\n return { type: 'version' };\n }\n\n // Check for 'completion' command (only if user hasn't defined one)\n if (!userCompletionCommand && normalizedTerms[0] === 'completion') {\n const shellArg = normalizedTerms[1] as ShellType | undefined;\n const validShells: ShellType[] = ['bash', 'zsh', 'fish', 'powershell'];\n const shell = shellArg && validShells.includes(shellArg) ? shellArg : undefined;\n const setup = args.some((p) => p.type === 'named' && keyIs(p.key, 'setup'));\n return { type: 'completion', shell, setup };\n }\n\n // Handle help flag - find the command being requested\n if (hasHelpFlag) {\n // Filter out help-related terms and flags to find the target command\n const commandTerms = normalizedTerms.filter((t) => t !== 'help');\n const commandName = commandTerms.join(' ');\n const targetCommand = commandName ? findCommandByName(commandName, existingCommand.commands) : undefined;\n return { type: 'help', command: targetCommand, detail, format };\n }\n\n // Handle version flag (only for root command, i.e., no subcommand terms)\n if (hasVersionFlag && normalizedTerms.length === 0) {\n return { type: 'version' };\n }\n\n // Check for --repl flag\n const hasReplFlag = args.some((p) => p.type === 'named' && keyIs(p.key, 'repl'));\n if (hasReplFlag) {\n const scope = normalizedTerms.length > 0 ? normalizedTerms.join(' ') : undefined;\n return { type: 'repl', scope };\n }\n\n return null;\n };\n\n /**\n * Extract the config file path from --config=<path> or -c <path> flags.\n */\n const extractConfigPath = (input: string | undefined): string | undefined => {\n if (!input) return undefined;\n\n const parts = parseCliInputToParts(input);\n const args = parts.filter((p) => p.type === 'named' || p.type === 'alias');\n\n for (const arg of args) {\n if (arg.type === 'named' && arg.key.length === 1 && arg.key[0] === 'config' && typeof arg.value === 'string') {\n return arg.value;\n }\n if (arg.type === 'alias' && arg.key.length === 1 && arg.key[0] === 'c' && typeof arg.value === 'string') {\n return arg.value;\n }\n }\n return undefined;\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 */\n const execCommand = (resolvedInput: string | undefined, evalOptions?: PadroneEvalPreferences, errorMode: 'soft' | 'hard' = 'soft') => {\n const baseRuntime = getCommandRuntime(existingCommand);\n const runtime = evalOptions?.runtime\n ? Object.assign({}, baseRuntime, Object.fromEntries(Object.entries(evalOptions.runtime).filter(([, v]) => v !== undefined)))\n : baseRuntime;\n\n // Check for built-in help/version/completion commands and flags (bypass plugins)\n const builtin = checkBuiltinCommands(resolvedInput);\n\n if (builtin) {\n if (builtin.type === 'help') {\n const helpText = generateHelp(existingCommand, builtin.command ?? existingCommand, {\n detail: builtin.detail,\n format: builtin.format ?? runtime.format,\n });\n runtime.output(helpText);\n return {\n command: existingCommand,\n args: undefined,\n result: helpText,\n } as any;\n }\n\n if (builtin.type === 'version') {\n const version = getVersion(existingCommand.version);\n runtime.output(version);\n return {\n command: existingCommand,\n args: undefined,\n result: version,\n } as any;\n }\n\n if (builtin.type === 'completion') {\n return import('./completion.ts').then(({ detectShell, generateCompletionOutput, setupCompletions }) => {\n if (builtin.setup) {\n const shell = builtin.shell ?? detectShell();\n if (!shell) {\n throw new Error('Could not detect shell. Specify one: completion bash --setup');\n }\n const result = setupCompletions(existingCommand.name, shell);\n const message = `${result.updated ? 'Updated' : 'Added'} ${existingCommand.name} completions in ${result.file}`;\n runtime.output(message);\n return {\n command: existingCommand,\n args: undefined,\n result: message,\n };\n }\n const completionScript = generateCompletionOutput(existingCommand, builtin.shell);\n runtime.output(completionScript);\n return {\n command: existingCommand,\n args: undefined,\n result: completionScript,\n };\n }) as any;\n }\n }\n\n // Shared plugin state for this execution\n const state: Record<string, unknown> = {};\n const rootPlugins = existingCommand.plugins ?? [];\n\n const runPipeline = () => {\n // ── Phase 1: Parse ──────────────────────────────────────────────────\n const parseCtx: PluginParseContext = { input: resolvedInput, command: existingCommand, state };\n\n const coreParse = (): PluginParseResult => {\n const { command, rawArgs, args, unmatchedTerms } = parseCommand(parseCtx.input);\n\n // Default help: command with no action → show its help when there's nothing to execute.\n const hasSubcommands = command.commands && command.commands.length > 0;\n const hasSchema = command.argsSchema != null;\n if (!command.action && (hasSubcommands || !hasSchema) && unmatchedTerms.length === 0) {\n const helpText = generateHelp(existingCommand, command, { format: runtime.format });\n runtime.output(helpText);\n return {\n command: command,\n rawArgs: { '~help': helpText } as Record<string, unknown>,\n positionalArgs: [],\n };\n }\n\n // Reject unmatched terms when the matched command doesn't accept positional args\n if (unmatchedTerms.length > 0) {\n const hasPositionalConfig = command.meta?.positional && command.meta.positional.length > 0;\n if (!hasPositionalConfig) {\n const isRootCommand = command === existingCommand;\n const commandDisplayName = command.name || command.aliases?.[0] || command.path || '(default)';\n\n // Collect candidate names for fuzzy suggestion\n const candidateNames: string[] = [];\n if (isRootCommand && existingCommand.commands) {\n for (const cmd of existingCommand.commands) {\n if (!cmd.hidden) {\n candidateNames.push(cmd.name);\n if (cmd.aliases) candidateNames.push(...cmd.aliases);\n }\n }\n } else if (command.commands) {\n for (const cmd of command.commands) {\n if (!cmd.hidden) {\n candidateNames.push(cmd.name);\n if (cmd.aliases) candidateNames.push(...cmd.aliases);\n }\n }\n }\n\n const suggestion = suggestSimilar(unmatchedTerms[0]!, candidateNames);\n const suggestions = suggestion ? [suggestion] : [];\n const baseMsg = isRootCommand\n ? `Unknown command: ${unmatchedTerms[0]}`\n : `Unexpected arguments for '${commandDisplayName}': ${unmatchedTerms.join(' ')}`;\n const errorMsg = suggestions.length ? `${baseMsg}\\n\\n ${suggestions[0]}` : baseMsg;\n\n if (errorMode === 'hard') {\n runtime.error(errorMsg);\n // When we have a suggestion, show a compact single-line \"Available commands\" note\n // instead of the full help text to avoid overwhelming the user\n if (suggestions.length > 0) {\n const targetCmd = isRootCommand ? existingCommand : command;\n const visibleCommands = (targetCmd.commands ?? []).filter((c) => !c.hidden && c.name);\n if (visibleCommands.length > 0) {\n const cmdList = visibleCommands.map((c) => c.name).join(', ');\n runtime.output(`\\nAvailable commands: ${cmdList}`);\n }\n } else {\n const helpText = generateHelp(existingCommand, isRootCommand ? existingCommand : command, { format: runtime.format });\n runtime.error(helpText);\n }\n throw new RoutingError(errorMsg, { suggestions, command: command.path || command.name });\n }\n\n // Soft mode: throw too — this is a routing error, not a validation issue\n throw new RoutingError(errorMsg, { suggestions, command: command.path || command.name });\n }\n }\n\n return { command, rawArgs, positionalArgs: args };\n };\n\n // Parse phase: root plugins only\n const parsedOrPromise = runPluginChain('parse', rootPlugins, parseCtx, coreParse);\n\n // ── Phases 2 & 3 chained after parse ────────────────────────────────\n const continueAfterParse = (parsed: PluginParseResult) => {\n const { command } = parsed;\n // Validate/execute: collected from parent chain\n const commandPlugins = collectPlugins(command);\n\n // Short-circuit: parse returned a help result\n if (parsed.rawArgs['~help']) {\n return {\n command: command,\n args: undefined,\n result: parsed.rawArgs['~help'],\n } as any;\n }\n\n // ── Phase 2: Validate ───────────────────────────────────────────\n const validateCtx: PluginValidateContext = {\n command,\n rawArgs: parsed.rawArgs,\n positionalArgs: parsed.positionalArgs,\n state,\n };\n\n const coreValidate = (): PluginValidateResult | Promise<PluginValidateResult> => {\n // Determine interactivity\n let flagInteractive: boolean | undefined;\n if (hasInteractiveConfig(command.meta)) {\n if (validateCtx.rawArgs.interactive !== undefined) {\n flagInteractive = validateCtx.rawArgs.interactive !== false && validateCtx.rawArgs.interactive !== 'false';\n delete validateCtx.rawArgs.interactive;\n }\n if (validateCtx.rawArgs.i !== undefined) {\n flagInteractive = validateCtx.rawArgs.i !== false && validateCtx.rawArgs.i !== 'false';\n delete validateCtx.rawArgs.i;\n }\n }\n\n const runtimeDefault: boolean | undefined =\n runtime.interactive === 'forced' ? true : runtime.interactive === 'disabled' ? false : undefined;\n const effectiveInteractive: boolean | undefined = flagInteractive ?? evalOptions?.interactive ?? runtimeDefault;\n // Suppress interactive prompts when the command reads stdin — prompts share stdin which is already consumed/closed.\n const commandUsesStdin = !!command.meta?.stdin;\n const stdinIsPiped =\n commandUsesStdin && (runtime.stdin ? !runtime.stdin.isTTY : typeof process !== 'undefined' && process.stdin?.isTTY !== true);\n const interactivitySuppressed =\n runtime.interactive === 'unsupported' || effectiveInteractive === false || (stdinIsPiped && effectiveInteractive !== true);\n const forceInteractive = !interactivitySuppressed && effectiveInteractive === true;\n\n // Extract config file path from --config or -c flag\n const configPath = extractConfigPath(parseCtx.input);\n\n // Resolve config files: command's own configFiles > inherited from parent/root\n const resolveConfigFiles = (cmd: AnyPadroneCommand): string[] | undefined => {\n if (cmd.configFiles !== undefined) return cmd.configFiles;\n if (cmd.parent) return resolveConfigFiles(cmd.parent);\n return undefined;\n };\n const effectiveConfigFiles = resolveConfigFiles(command);\n\n // Resolve config schema: command's own configSchema > inherited from parent/root\n const resolveConfigSchema = (cmd: AnyPadroneCommand): AnyPadroneCommand['configSchema'] => {\n if (cmd.configSchema !== undefined) return cmd.configSchema;\n if (cmd.parent) return resolveConfigSchema(cmd.parent);\n return undefined;\n };\n const configSchema = resolveConfigSchema(command);\n\n // Resolve env schema: command's own envSchema > inherited from parent/root\n const resolveEnvSchema = (cmd: AnyPadroneCommand): AnyPadroneCommand['envSchema'] => {\n if (cmd.envSchema !== undefined) return cmd.envSchema;\n if (cmd.parent) return resolveEnvSchema(cmd.parent);\n return undefined;\n };\n const envSchema = resolveEnvSchema(command);\n\n // Determine config data: explicit --config flag > auto-discovered config\n let configData: Record<string, unknown> | undefined;\n if (configPath) {\n configData = runtime.loadConfigFile(configPath);\n } else if (effectiveConfigFiles?.length) {\n const foundConfigPath = runtime.findFile(effectiveConfigFiles);\n if (foundConfigPath) {\n configData = runtime.loadConfigFile(foundConfigPath) ?? configData;\n }\n }\n\n // Step 1: Validate config data against schema if provided\n const validateConfig = (): Record<string, unknown> | undefined | Promise<Record<string, unknown> | undefined> => {\n if (configData && configSchema) {\n const configValidated = configSchema['~standard'].validate(configData);\n return thenMaybe(configValidated, (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: command.path || command.name,\n });\n }\n return result.value as unknown as Record<string, unknown>;\n });\n }\n return configData;\n };\n\n // Step 2: Validate env vars\n const validateEnv = (): Record<string, unknown> | undefined | Promise<Record<string, unknown> | undefined> => {\n let envData: Record<string, unknown> | undefined;\n if (envSchema) {\n const rawEnv = runtime.env();\n const envValidated = envSchema['~standard'].validate(rawEnv);\n return thenMaybe(envValidated, (result) => {\n if (!result.issues) {\n envData = result.value as unknown as Record<string, unknown>;\n }\n return envData;\n });\n }\n return envData;\n };\n\n // Step 3: Read stdin if configured and not already provided via CLI\n const readStdin = (): Record<string, unknown> | Promise<Record<string, unknown>> => {\n const stdinConfig = command.meta?.stdin;\n if (!stdinConfig) return {};\n\n const { field, as } = parseStdinConfig(stdinConfig);\n\n // Skip if the field was already provided via CLI flags (highest precedence)\n if (field in validateCtx.rawArgs && validateCtx.rawArgs[field] !== undefined) return {};\n\n // Resolve stdin: use runtime's custom stdin, or default if piped.\n // Returns undefined when stdin is a TTY or unavailable.\n const stdin = resolveStdin(runtime as any);\n if (!stdin) return {};\n\n if (as === 'lines') {\n return (async () => {\n const lines: string[] = [];\n for await (const line of stdin.lines()) {\n lines.push(line);\n }\n return { [field]: lines };\n })();\n }\n\n // Default: read all as text\n return stdin.text().then((text) => {\n // Don't inject empty stdin\n if (!text) return {};\n return { [field]: text };\n });\n };\n\n // Step 4: Preprocess, interactive prompt, and validate\n const finalizeValidation = (\n validatedConfigData: Record<string, unknown> | undefined,\n envData: Record<string, unknown> | undefined,\n stdinData: Record<string, unknown> | undefined,\n ): PluginValidateResult | Promise<PluginValidateResult> => {\n const preprocessedArgs = buildCommandArgs(command, validateCtx.rawArgs, validateCtx.positionalArgs, {\n stdinData,\n envData,\n configData: validatedConfigData,\n });\n\n // Early validation: check provided args for errors before prompting.\n // This catches unknown options and invalid values on explicitly-provided fields\n // so the user isn't asked interactive questions for a doomed command.\n const willPrompt = !interactivitySuppressed && runtime.prompt && hasInteractiveConfig(command.meta);\n if (willPrompt) {\n const unknowns = checkUnknownArgs(command, preprocessedArgs);\n if (unknowns.length > 0) {\n const issues: StandardSchemaV1.Issue[] = unknowns.map(({ key, suggestion }) => ({\n path: [key],\n message: suggestion ? `Unknown option: \"${key}\". ${suggestion}` : `Unknown option: \"${key}\"`,\n }));\n return { args: undefined, argsResult: { issues } as any };\n }\n\n // Run schema validation on what we have so far (before prompting fills missing fields).\n // Only fail on issues for fields the user explicitly provided — skip issues for\n // missing/undefined fields since those will be filled by interactive prompts.\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 const checkForProvidedFieldErrors = (result: StandardSchemaV1.Result<unknown>): PluginValidateResult | undefined => {\n if (!result.issues) return undefined;\n // Only keep issues whose path starts with a key the user actually provided\n const providedFieldIssues = result.issues.filter((issue) => {\n const rootKey = issue.path?.[0];\n return rootKey !== undefined && providedKeys.has(String(rootKey));\n });\n if (providedFieldIssues.length > 0) {\n return { args: undefined, argsResult: { issues: providedFieldIssues } as any };\n }\n return undefined;\n };\n const earlyResult = thenMaybe(earlyCheck, (result) => {\n const errors = checkForProvidedFieldErrors(result);\n if (errors) return errors;\n return undefined;\n });\n if (earlyResult instanceof Promise) {\n return earlyResult.then((err) => {\n if (err) return err;\n return continueWithPrompt(preprocessedArgs);\n });\n }\n if (earlyResult) return earlyResult;\n }\n }\n\n return continueWithPrompt(preprocessedArgs);\n };\n\n const continueWithPrompt = (preprocessedArgs: Record<string, unknown>): PluginValidateResult | Promise<PluginValidateResult> => {\n const willPrompt = !interactivitySuppressed && runtime.prompt && hasInteractiveConfig(command.meta);\n const afterInteractive = willPrompt\n ? promptInteractiveFields(preprocessedArgs, command, runtime, forceInteractive || undefined)\n : preprocessedArgs;\n\n return thenMaybe(afterInteractive, (filledArgs) => {\n const validated = validateCommandArgs(command, filledArgs);\n return thenMaybe(validated, (v) => v as PluginValidateResult);\n });\n };\n\n // Chain: config → env → stdin → validate\n const validatedConfig = validateConfig();\n return thenMaybe(validatedConfig, (cfgData) => {\n const validatedEnv = validateEnv();\n return thenMaybe(validatedEnv, (envData) => {\n const stdinDataOrPromise = readStdin();\n return thenMaybe(stdinDataOrPromise, (stdinData) => {\n const hasStdinData = Object.keys(stdinData).length > 0;\n return finalizeValidation(cfgData, envData, hasStdinData ? stdinData : undefined);\n });\n });\n });\n };\n\n const validatedOrPromise = runPluginChain('validate', commandPlugins, validateCtx, coreValidate);\n\n // ── Phase 3: Execute (or handle validation errors) ──────────────\n const continueAfterValidate = (v: PluginValidateResult) => {\n // Handle validation failures\n if (v.argsResult?.issues) {\n // Collect known option names for fuzzy suggestion on unknown keys\n let knownOptions: string[] | undefined;\n const getKnownOptions = () => {\n if (knownOptions) return knownOptions;\n knownOptions = [];\n if (command.argsSchema) {\n try {\n const js = command.argsSchema['~standard'].jsonSchema.input({ target: 'draft-2020-12' }) as Record<string, any>;\n if (js.type === 'object' && js.properties) knownOptions = Object.keys(js.properties);\n } catch {\n /* ignore */\n }\n }\n return knownOptions;\n };\n\n const issueMessages = v.argsResult.issues\n .map((i: StandardSchemaV1.Issue) => {\n const base = ` - ${i.path?.join('.') || 'root'}: ${i.message}`;\n // Try to suggest for unrecognized key errors\n const issueAny = i as any;\n const unrecognizedKeys: string[] | undefined =\n issueAny.keys ?? i.message?.match(/[Uu]nrecognized key(?:s)?[^\"]*\"([^\"]+)\"/)?.slice(1);\n if (unrecognizedKeys?.length) {\n const hints = unrecognizedKeys.map((k: string) => suggestSimilar(k, getKnownOptions())).filter(Boolean);\n if (hints.length) return `${base}\\n ${hints.join('\\n ')}`;\n }\n return base;\n })\n .join('\\n');\n\n if (errorMode === 'hard') {\n const helpText = generateHelp(existingCommand, command, { format: runtime.format });\n runtime.error(`Validation error:\\n${issueMessages}`);\n runtime.error(helpText);\n throw new ValidationError(`Validation error:\\n${issueMessages}`, v.argsResult.issues as any, {\n suggestions: v.argsResult.issues.flatMap((i: any) => {\n const keys: string[] | undefined = i.keys ?? i.message?.match(/[Uu]nrecognized key(?:s)?[^\"]*\"([^\"]+)\"/)?.slice(1);\n if (!keys?.length) return [];\n return keys.map((k: string) => suggestSimilar(k, getKnownOptions())).filter(Boolean);\n }),\n command: command.path || command.name,\n });\n }\n\n // Soft mode: return result with issues, skip the action\n return {\n command: command as any,\n args: undefined,\n argsResult: v.argsResult,\n result: undefined,\n };\n }\n\n const executeCtx: PluginExecuteContext = {\n command,\n args: v.args,\n state,\n };\n\n const coreExecute = (): PluginExecuteResult => {\n const handler = command.action ?? noop;\n const ctx = evalOptions?.runtime ? { ...createActionContext(command), runtime } : createActionContext(command);\n const result = handler(executeCtx.args as any, ctx);\n return { result };\n };\n\n const executedOrPromise = runPluginChain('execute', commandPlugins, executeCtx, coreExecute);\n\n return thenMaybe(executedOrPromise, (e) => {\n const commandResult = {\n command: command as any,\n args: v.args,\n argsResult: v.argsResult,\n result: e.result,\n };\n\n if (command.autoOutput ?? evalOptions?.autoOutput ?? true) {\n const outputOrPromise = outputValue(e.result, runtime.output);\n if (outputOrPromise instanceof Promise) {\n return outputOrPromise.then(() => commandResult);\n }\n }\n\n return commandResult;\n });\n };\n\n return warnIfUnexpectedAsync(thenMaybe(validatedOrPromise, continueAfterValidate), command) as any;\n };\n\n return thenMaybe(parsedOrPromise, continueAfterParse) as any;\n };\n\n return wrapWithLifecycle(rootPlugins, existingCommand, state, resolvedInput, runPipeline, (result) => ({\n command: existingCommand,\n args: undefined,\n argsResult: undefined,\n result,\n })) as any;\n };\n\n const evalCommand: AnyPadroneProgram['eval'] = (input, evalOptions) => {\n return execCommand(input as string, evalOptions, 'soft');\n };\n\n /**\n * Collects plugins from the command's parent chain (root → ... → target).\n * Root/program plugins come first (outermost), target command's plugins last (innermost).\n *\n * The `programRoot` parameter provides the current program command, because\n * subcommands' `.parent` references may be stale (builders are immutable — each\n * method returns a new builder, so a subcommand's parent was captured before\n * `.use()` was called on the program). We substitute `programRoot` for the\n * top of the chain to ensure program-level plugins are always included.\n */\n const collectPlugins = (cmd: AnyPadroneCommand): PadronePlugin[] => {\n const chain: PadronePlugin[][] = [];\n let current: AnyPadroneCommand | undefined = cmd;\n while (current) {\n // If this is the root (no parent), use existingCommand's plugins instead\n // to pick up plugins added after subcommands were defined.\n if (!current.parent) {\n if (existingCommand.plugins?.length) chain.unshift(existingCommand.plugins);\n } else {\n if (current.plugins?.length) chain.unshift(current.plugins);\n }\n current = current.parent;\n }\n return chain.flat();\n };\n\n // Forward declaration — assigned by the repl method in the return object, used by cli() for --repl.\n let replFn: (options?: PadroneReplPreferences) => AsyncIterable<any>;\n const replActiveRef = { value: false };\n\n const cli: AnyPadroneProgram['cli'] = (cliOptions) => {\n const runtime = getCommandRuntime(existingCommand);\n const resolvedInput = (runtime.argv().join(' ') || undefined) as string | undefined;\n\n // Check for --repl flag before normal execution\n if (cliOptions?.repl !== false) {\n const builtin = checkBuiltinCommands(resolvedInput);\n if (builtin?.type === 'repl') {\n const replPrefs: PadroneReplPreferences = {\n ...(typeof cliOptions?.repl === 'object' ? cliOptions.repl : {}),\n scope: builtin.scope,\n autoOutput: (typeof cliOptions?.repl === 'object' ? cliOptions.repl.autoOutput : undefined) ?? cliOptions?.autoOutput,\n };\n const drainRepl = async () => {\n for await (const _ of replFn(replPrefs)) {\n // Results are handled by command actions\n }\n return { command: existingCommand, args: undefined, result: undefined } as any;\n };\n return drainRepl() as any;\n }\n }\n\n // Start background update check (non-blocking)\n let updateCheckPromise: Promise<(() => void) | undefined> | undefined;\n if (existingCommand.updateCheck) {\n // Respect --no-update-check flag\n const hasNoUpdateCheckFlag =\n resolvedInput &&\n parseCliInputToParts(resolvedInput).some((p) => p.type === 'named' && p.key.length === 1 && p.key[0] === 'no-update-check');\n if (!hasNoUpdateCheckFlag) {\n const currentVersion = getVersion(existingCommand.version);\n updateCheckPromise = import('./update-check.ts').then(({ createUpdateChecker }) =>\n createUpdateChecker(existingCommand.name, currentVersion, existingCommand.updateCheck!, runtime),\n );\n }\n }\n\n const result = execCommand(resolvedInput, cliOptions, 'hard');\n\n // Show update notification after command output\n if (updateCheckPromise) {\n if (result instanceof Promise) {\n return result.then(async (r) => {\n const showUpdateNotification = await updateCheckPromise;\n showUpdateNotification?.();\n return r;\n }) as any;\n }\n // For sync results, schedule notification for next tick (non-blocking)\n updateCheckPromise.then((show) => show?.());\n }\n\n return result;\n };\n\n const run: AnyPadroneProgram['run'] = (command, args) => {\n const commandObj = typeof command === 'string' ? findCommandByName(command, existingCommand.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 state: Record<string, unknown> = {};\n const executeCtx: PluginExecuteContext = { command: commandObj, args, state };\n\n const coreExecute = (): PluginExecuteResult => {\n const result = commandObj.action!(executeCtx.args as any, createActionContext(commandObj));\n return { result };\n };\n\n const commandObjPlugins = collectPlugins(commandObj);\n const executedOrPromise = runPluginChain('execute', commandObjPlugins, executeCtx, coreExecute);\n\n const toResult = (e: PluginExecuteResult) => ({\n command: commandObj as any,\n args: args as any,\n result: e.result,\n });\n\n if (executedOrPromise instanceof Promise) {\n return executedOrPromise.then(toResult) as any;\n }\n return toResult(executedOrPromise);\n };\n\n const tool: AnyPadroneProgram['tool'] = () => {\n const helpText = generateHelp(existingCommand, 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: existingCommand.name,\n strict: true,\n title: existingCommand.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 return !!parsed.command.needsApproval;\n },\n execute: async (input) => {\n const output: string[] = [];\n const errors: string[] = [];\n const result = await evalCommand(input.command, {\n autoOutput: false,\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 builder = {\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 arguments(schema, meta) {\n // If schema is a function, call it with parent's arguments as base\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 configFile(file, schema) {\n const configFiles = file === undefined ? undefined : Array.isArray(file) ? file : [file];\n const resolvedConfig = typeof schema === 'function' ? schema(existingCommand.argsSchema) : (schema ?? existingCommand.argsSchema);\n const isAsync = existingCommand.isAsync || isAsyncBranded(resolvedConfig);\n return createPadroneBuilder({ ...existingCommand, configFiles, configSchema: resolvedConfig as any, isAsync }) as any;\n },\n env(schema) {\n const resolvedEnv = typeof schema === 'function' ? schema(existingCommand.argsSchema) : schema;\n const isAsync = existingCommand.isAsync || isAsyncBranded(resolvedEnv);\n return createPadroneBuilder({ ...existingCommand, envSchema: resolvedEnv as any, 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, builderFn) {\n // Extract name and aliases from the input\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 // Check if a command with this name already exists (override case)\n const existingSubcommand = existingCommand.commands?.find((c) => c.name === name) as AnyPadroneCommand | undefined;\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 const builder = createPadroneBuilder(initialCommand);\n\n const commandObj =\n ((builderFn?.(builder as any) as unknown as typeof builder)?.[commandSymbol] as AnyPadroneCommand) ?? initialCommand;\n\n // Merge subcommands when overriding: existing subcommands that aren't replaced are kept\n const mergedCommandObj = existingSubcommand ? mergeCommands(existingSubcommand, commandObj) : commandObj;\n\n // Replace existing command or append new one\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 mount(nameOrNames, program) {\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 // Extract the underlying command from the program\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 // Re-path the command tree under the new name\n const remounted = repathCommandTree(programCommand, name, existingCommand.path || '', existingCommand);\n remounted.aliases = aliases;\n\n // Merge with existing command if one with the same name exists\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 use(plugin: PadronePlugin) {\n return createPadroneBuilder({\n ...existingCommand,\n plugins: [...(existingCommand.plugins ?? []), plugin],\n }) as any;\n },\n\n updateCheck(config = {}) {\n return createPadroneBuilder({ ...existingCommand, updateCheck: config }) as any;\n },\n\n run,\n find,\n parse,\n stringify,\n eval: evalCommand,\n cli,\n tool,\n\n repl: (replFn = (options?: PadroneReplPreferences) => {\n return createReplIterator({ existingCommand, evalCommand, replActiveRef }, options);\n }),\n\n api() {\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\n return buildApi(existingCommand);\n },\n\n help(command, prefs) {\n const commandObj = !command\n ? existingCommand\n : typeof command === 'string'\n ? findCommandByName(command, existingCommand.commands)\n : (command as AnyPadroneCommand);\n if (!commandObj) throw new RoutingError(`Command \"${command ?? ''}\" not found`);\n const runtime = getCommandRuntime(existingCommand);\n return generateHelp(existingCommand, commandObj, { ...prefs, format: prefs?.format ?? runtime.format });\n },\n\n async completion(shell) {\n const { generateCompletionOutput } = await import('./completion.ts');\n return generateCompletionOutput(existingCommand, shell as ShellType | undefined);\n },\n\n '~types': {} as any,\n\n [commandSymbol]: existingCommand,\n } satisfies AnyPadroneProgram & { [commandSymbol]: AnyPadroneCommand } as any;\n return builder as TBuilder & { [commandSymbol]: AnyPadroneCommand };\n}\n"],"mappings":"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"}