politty 0.4.9 → 0.4.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"completion-BADAzqT9.cjs","names":["extractOptions","extractFields","resolveSubCommandMeta","optionValueCases","positionalBlock","availableOptionLines","generateSubHandler","resolveSubCommandMeta","extractFields","resolveSubCommandMeta","z","arg","escapeDesc","optionValueCases","positionalBlock","availableOptionLines","valueCompletionBlock","generateSubHandler","z","arg"],"sources":["../src/core/command.ts","../src/completion/value-completion-resolver.ts","../src/completion/extractor.ts","../src/completion/bash.ts","../src/completion/dynamic/candidate-generator.ts","../src/completion/dynamic/context-parser.ts","../src/completion/dynamic/shell-formatter.ts","../src/completion/dynamic/complete-command.ts","../src/completion/fish.ts","../src/completion/zsh.ts","../src/completion/index.ts"],"sourcesContent":["import { z } from \"zod\";\nimport type {\n ArgsSchema,\n Command,\n Example,\n GlobalArgs,\n IsEmpty,\n NonRunnableCommand,\n RunnableCommand,\n SubCommandsRecord,\n} from \"../types.js\";\n\n/**\n * Infer args type from schema, defaults to empty object if undefined\n */\ntype InferArgs<TArgsSchema> = TArgsSchema extends z.ZodType\n ? z.infer<TArgsSchema>\n : Record<string, never>;\n\n/**\n * Merge local args with global args.\n * No-op when TGlobalArgs is empty (default GlobalArgs not extended).\n */\nexport type MergedArgs<TLocalArgs, TGlobalArgs> =\n IsEmpty<TGlobalArgs> extends true ? TLocalArgs : TLocalArgs & TGlobalArgs;\n\n/**\n * Resolve merged args from schema and global args type\n */\ntype ResolvedArgs<TArgsSchema, TGlobalArgs> = MergedArgs<InferArgs<TArgsSchema>, TGlobalArgs>;\n\n/**\n * Config for defining a command\n * @template TArgsSchema - The Zod schema type for arguments\n * @template TResult - The return type of run function (void if no run)\n * @template TGlobalArgs - Global args type (from declaration merging or factory)\n */\ninterface DefineCommandConfig<TArgsSchema extends ArgsSchema | undefined, TResult, TGlobalArgs> {\n name: string;\n description?: string;\n args?: TArgsSchema;\n subCommands?: SubCommandsRecord;\n setup?: (context: { args: ResolvedArgs<TArgsSchema, TGlobalArgs> }) => void | Promise<void>;\n run?: (args: ResolvedArgs<TArgsSchema, TGlobalArgs>) => TResult;\n cleanup?: (context: {\n args: ResolvedArgs<TArgsSchema, TGlobalArgs>;\n error?: Error | undefined;\n }) => void | Promise<void>;\n notes?: string;\n examples?: Example[];\n}\n\n/**\n * Config with run function (runnable command)\n */\nexport interface RunnableConfig<\n TArgsSchema extends ArgsSchema | undefined,\n TResult,\n TGlobalArgs,\n> extends DefineCommandConfig<TArgsSchema, TResult, TGlobalArgs> {\n run: (args: ResolvedArgs<TArgsSchema, TGlobalArgs>) => TResult;\n}\n\n/**\n * Config without run function (non-runnable command)\n */\nexport interface NonRunnableConfig<\n TArgsSchema extends ArgsSchema | undefined,\n TGlobalArgs,\n> extends Omit<DefineCommandConfig<TArgsSchema, void, TGlobalArgs>, \"run\"> {\n run?: undefined;\n}\n\n/**\n * Define a CLI command with type-safe arguments\n *\n * @param config - Command configuration\n * @returns A defined command with preserved type information\n *\n * @example\n * ```ts\n * import { z } from \"zod\";\n * import { arg, defineCommand } from \"politty\";\n *\n * const command = defineCommand({\n * name: \"greet\",\n * args: z.object({\n * name: arg(z.string(), { description: \"Name to greet\", positional: true }),\n * loud: arg(z.boolean().default(false), { alias: \"l\", description: \"Use uppercase\" }),\n * }),\n * run: (args) => {\n * const greeting = `Hello, ${args.name}!`;\n * console.log(args.loud ? greeting.toUpperCase() : greeting);\n * },\n * });\n *\n * // Type of command.argsSchema is preserved as z.ZodObject<...>\n * // Type of command.run is (args: { name: string; loud: boolean }) => void\n * ```\n *\n * @example\n * ```ts\n * // With discriminated union for subcommand-like behavior\n * const command = defineCommand({\n * name: \"resource\",\n * args: z.discriminatedUnion(\"action\", [\n * z.object({\n * action: z.literal(\"create\"),\n * name: arg(z.string(), { description: \"Resource name\" }),\n * }),\n * z.object({\n * action: z.literal(\"delete\"),\n * id: arg(z.coerce.number(), { description: \"Resource ID\" }),\n * }),\n * ]),\n * run: (args) => {\n * if (args.action === \"create\") {\n * console.log(`Creating ${args.name}`);\n * } else {\n * console.log(`Deleting ${args.id}`);\n * }\n * },\n * });\n * ```\n */\n// Overload 1: with run function - returns RunnableCommand with preserved schema type\nexport function defineCommand<\n TArgsSchema extends ArgsSchema | undefined = undefined,\n TResult = void,\n TGlobalArgs = GlobalArgs,\n>(\n config: RunnableConfig<TArgsSchema, TResult, TGlobalArgs>,\n): RunnableCommand<TArgsSchema, ResolvedArgs<TArgsSchema, TGlobalArgs>, TResult>;\n\n// Overload 2: without run function - returns NonRunnableCommand with preserved schema type\nexport function defineCommand<\n TArgsSchema extends ArgsSchema | undefined = undefined,\n TGlobalArgs = GlobalArgs,\n>(\n config: NonRunnableConfig<TArgsSchema, TGlobalArgs>,\n): NonRunnableCommand<TArgsSchema, ResolvedArgs<TArgsSchema, TGlobalArgs>>;\n\n// Implementation\nexport function defineCommand<\n TArgsSchema extends ArgsSchema | undefined = undefined,\n TResult = void,\n TGlobalArgs = GlobalArgs,\n>(\n config:\n | RunnableConfig<TArgsSchema, TResult, TGlobalArgs>\n | NonRunnableConfig<TArgsSchema, TGlobalArgs>,\n): Command<TArgsSchema, ResolvedArgs<TArgsSchema, TGlobalArgs>, TResult> {\n return {\n name: config.name,\n description: config.description,\n args: config.args as TArgsSchema,\n subCommands: config.subCommands,\n setup: config.setup,\n run: config.run,\n cleanup: config.cleanup,\n notes: config.notes,\n examples: config.examples,\n } as Command<TArgsSchema, ResolvedArgs<TArgsSchema, TGlobalArgs>, TResult>;\n}\n\n/**\n * Create a typed defineCommand factory with pre-bound global args type.\n * This is the recommended pattern for type-safe global options.\n *\n * @example\n * ```ts\n * // global-args.ts\n * type GlobalArgsType = { verbose: boolean; config?: string };\n * export const defineAppCommand = createDefineCommand<GlobalArgsType>();\n *\n * // commands/build.ts\n * export const buildCommand = defineAppCommand({\n * name: \"build\",\n * args: z.object({ output: arg(z.string().default(\"dist\")) }),\n * run: (args) => {\n * args.verbose; // typed via GlobalArgsType\n * args.output; // typed via local args\n * },\n * });\n * ```\n */\nexport function createDefineCommand<TGlobalArgs>(): {\n <TArgsSchema extends ArgsSchema | undefined = undefined, TResult = void>(\n config: RunnableConfig<TArgsSchema, TResult, TGlobalArgs>,\n ): RunnableCommand<TArgsSchema, ResolvedArgs<TArgsSchema, TGlobalArgs>, TResult>;\n <TArgsSchema extends ArgsSchema | undefined = undefined>(\n config: NonRunnableConfig<TArgsSchema, TGlobalArgs>,\n ): NonRunnableCommand<TArgsSchema, ResolvedArgs<TArgsSchema, TGlobalArgs>>;\n} {\n return defineCommand as ReturnType<typeof createDefineCommand<TGlobalArgs>>;\n}\n","/**\n * Shared value completion resolver\n *\n * Resolves value completion metadata from field information.\n * Used by both the static extractor and the dynamic context parser.\n */\n\nimport type { ValueCompletion } from \"./types.js\";\n\n/**\n * Minimal field interface needed for resolving value completion.\n * Both ResolvedFieldMeta and inline context-parser types satisfy this.\n */\nexport interface ValueCompletionField {\n completion?:\n | ({\n type?: string;\n custom?: { choices?: string[]; shellCommand?: string };\n } & ({ extensions?: string[]; matcher?: never } | { matcher?: string[]; extensions?: never }))\n | undefined;\n enumValues?: string[] | undefined;\n}\n\n/**\n * Resolve value completion from field metadata\n *\n * Priority:\n * 1. Explicit custom completion (choices or shellCommand)\n * 2. Explicit completion type (file, directory, none)\n * 3. Auto-detected enum values from schema\n */\nexport function resolveValueCompletion(field: ValueCompletionField): ValueCompletion | undefined {\n const meta = field.completion;\n\n // Priority 1: Explicit custom completion\n if (meta?.custom) {\n if (meta.custom.choices && meta.custom.choices.length > 0) {\n return { type: \"choices\", choices: meta.custom.choices };\n }\n if (meta.custom.shellCommand) {\n return { type: \"command\", shellCommand: meta.custom.shellCommand };\n }\n }\n\n // Priority 2: Explicit completion type\n if (meta?.type) {\n if (meta.type === \"file\") {\n if (meta.matcher) return { type: \"file\", matcher: meta.matcher };\n if (meta.extensions) return { type: \"file\", extensions: meta.extensions };\n return { type: \"file\" };\n }\n if (meta.type === \"directory\") {\n return { type: \"directory\" };\n }\n if (meta.type === \"none\") {\n return { type: \"none\" };\n }\n }\n\n // Priority 3: Auto-detect from enum schema\n if (field.enumValues && field.enumValues.length > 0) {\n return { type: \"choices\", choices: field.enumValues };\n }\n\n return undefined;\n}\n","/**\n * Extract completion data from commands\n */\n\nimport { extractFields, type ResolvedFieldMeta } from \"../core/schema-extractor.js\";\nimport { resolveSubCommandMeta } from \"../lazy.js\";\nimport type { AnyCommand, ArgsSchema } from \"../types.js\";\nimport type {\n CompletableOption,\n CompletablePositional,\n CompletableSubcommand,\n CompletionData,\n} from \"./types.js\";\nimport { resolveValueCompletion } from \"./value-completion-resolver.js\";\n\n/**\n * Sanitize a name for use as a shell function/variable identifier.\n * Replaces any character that is not alphanumeric or underscore with underscore.\n *\n * Note: This is not injective -- distinct names may produce the same output\n * (e.g., \"foo-bar\" and \"foo_bar\" both become \"foo_bar\"). When used for nested\n * path encoding (`path.map(sanitize).join(\"_\")`), cross-level collisions are\n * theoretically possible (e.g., \"foo-bar:baz\" vs \"foo:bar-baz\") but extremely\n * unlikely in real CLI designs. If collision-safety is needed, sanitize must be\n * replaced with an injective encoding.\n */\nexport function sanitize(name: string): string {\n return name.replace(/[^a-zA-Z0-9_]/g, \"_\");\n}\n\n/**\n * Filter subcommands to only visible (non-internal) ones.\n * Internal subcommands start with \"__\" and are hidden from completion/help.\n */\nexport function getVisibleSubs(subs: CompletableSubcommand[]): CompletableSubcommand[] {\n return subs.filter((s) => !s.name.startsWith(\"__\"));\n}\n\n/**\n * Convert a resolved field to a completable option\n */\nfunction fieldToOption(field: ResolvedFieldMeta): CompletableOption {\n return {\n name: field.name,\n cliName: field.cliName,\n alias: field.alias,\n description: field.description,\n // Booleans are flags that don't require a value\n takesValue: field.type !== \"boolean\",\n valueType: field.type,\n required: field.required,\n valueCompletion: resolveValueCompletion(field),\n };\n}\n\n/**\n * Extract options from a command's args schema\n */\nfunction extractOptions(command: AnyCommand): CompletableOption[] {\n if (!command.args) {\n return [];\n }\n\n const extracted = extractFields(command.args);\n return extracted.fields\n .filter((field) => !field.positional) // Only include flags/options, not positionals\n .map(fieldToOption);\n}\n\n/**\n * Extract positional arguments from a command\n */\nexport function extractPositionals(command: AnyCommand): ResolvedFieldMeta[] {\n if (!command.args) {\n return [];\n }\n\n const extracted = extractFields(command.args);\n return extracted.fields.filter((field) => field.positional);\n}\n\n/**\n * Extract completable positional arguments from a command\n */\nfunction extractCompletablePositionals(command: AnyCommand): CompletablePositional[] {\n if (!command.args) {\n return [];\n }\n\n const extracted = extractFields(command.args);\n return extracted.fields\n .filter((field) => field.positional)\n .map((field, index) => ({\n name: field.name,\n cliName: field.cliName,\n position: index,\n description: field.description,\n required: field.required,\n variadic: field.type === \"array\",\n valueCompletion: resolveValueCompletion(field),\n }));\n}\n\n/**\n * Extract a completable subcommand from a command\n */\nfunction extractSubcommand(name: string, command: AnyCommand): CompletableSubcommand {\n const subcommands: CompletableSubcommand[] = [];\n\n // Extract subcommands recursively (only sync subcommands for now)\n if (command.subCommands) {\n for (const [subName, subCommand] of Object.entries(command.subCommands)) {\n const resolved = resolveSubCommandMeta(subCommand);\n if (resolved) {\n subcommands.push(extractSubcommand(subName, resolved));\n } else {\n // Legacy async subcommands: placeholder only\n subcommands.push({\n name: subName,\n description: \"(lazy loaded)\",\n subcommands: [],\n options: [],\n positionals: [],\n });\n }\n }\n }\n\n return {\n name,\n description: command.description,\n subcommands,\n options: extractOptions(command),\n positionals: extractCompletablePositionals(command),\n };\n}\n\n/** Join parent and child with a separator, omitting separator when parent is empty. */\nfunction joinPrefix(parent: string, child: string, sep: string): string {\n return parent ? `${parent}${sep}${child}` : child;\n}\n\n/**\n * Collect opt-takes-value case entries for a subcommand tree.\n * Used by bash and zsh generators (identical case syntax: `path:--opt) return 0 ;;`).\n * parentPath is a colon-delimited path (e.g., \"\" for root, \"workspace:user\" for nested).\n */\nexport function optTakesValueEntries(sub: CompletableSubcommand, parentPath: string): string[] {\n const lines: string[] = [];\n for (const opt of sub.options) {\n if (opt.takesValue) {\n const patterns: string[] = [`${parentPath}:--${opt.cliName}`];\n if (opt.alias) patterns.push(`${parentPath}:-${opt.alias}`);\n lines.push(` ${patterns.join(\"|\")}) return 0 ;;`);\n }\n }\n for (const child of getVisibleSubs(sub.subcommands)) {\n lines.push(...optTakesValueEntries(child, joinPrefix(parentPath, child.name, \":\")));\n }\n return lines;\n}\n\n/**\n * Route entry for subcommand dispatch.\n * - pathStr: colon-delimited path (e.g., \"config:user:get\")\n * - funcSuffix: sanitized function suffix (e.g., \"config_user_get\")\n * - lookupPattern: \"parentPath:childName\" for is_subcmd matching (e.g., \"config:user:get\", or \":config\" for root-level)\n */\nexport interface RouteEntry {\n pathStr: string;\n funcSuffix: string;\n lookupPattern: string;\n}\n\n/**\n * Recursively collect all subcommand route entries.\n * Returns entries used by all shell generators for both dispatch routing\n * and subcommand lookup (is_subcmd) tables.\n */\nexport function collectRouteEntries(\n sub: CompletableSubcommand,\n parentPath = \"\",\n parentFunc = \"\",\n): RouteEntry[] {\n const entries: RouteEntry[] = [];\n for (const child of getVisibleSubs(sub.subcommands)) {\n const pathStr = joinPrefix(parentPath, child.name, \":\");\n const funcSuffix = joinPrefix(parentFunc, sanitize(child.name), \"_\");\n entries.push(...collectRouteEntries(child, pathStr, funcSuffix));\n entries.push({\n pathStr,\n funcSuffix,\n lookupPattern: `${parentPath}:${child.name}`,\n });\n }\n return entries;\n}\n\n/**\n * Generate is_subcmd case/switch body lines (bash/zsh case syntax).\n * Returns lines for the case statement body only (caller wraps in function).\n */\nexport function isSubcmdCaseLines(routeEntries: RouteEntry[]): string[] {\n return routeEntries.map((r) => ` ${r.lookupPattern}) return 0 ;;`);\n}\n\n/**\n * Recursively merge global options into a subcommand and all its descendants.\n * Avoids duplicates by checking existing option names.\n */\nfunction propagateGlobalOptions(\n sub: CompletableSubcommand,\n globalOptions: CompletableOption[],\n): void {\n const existingNames = new Set(sub.options.map((o) => o.name));\n const newOpts = globalOptions.filter((o) => !existingNames.has(o.name));\n sub.options = [...sub.options, ...newOpts];\n for (const child of sub.subcommands) {\n propagateGlobalOptions(child, globalOptions);\n }\n}\n\n/**\n * Extract completion data from a command tree\n *\n * @param command - The root command\n * @param programName - Program name for completion scripts\n * @param globalArgsSchema - Optional global args schema. When provided, global options\n * are derived from this schema instead of the root command's options.\n */\nexport function extractCompletionData(\n command: AnyCommand,\n programName: string,\n globalArgsSchema?: ArgsSchema,\n): CompletionData {\n const rootSubcommand = extractSubcommand(programName, command);\n\n // When globalArgsSchema is provided, derive global options from it\n // and merge them into all subcommands so shell generators include them at every level\n let globalOptions: CompletableOption[];\n if (globalArgsSchema) {\n const globalExtracted = extractFields(globalArgsSchema);\n globalOptions = globalExtracted.fields.filter((field) => !field.positional).map(fieldToOption);\n // Merge global options into all subcommands recursively\n propagateGlobalOptions(rootSubcommand, globalOptions);\n } else {\n // Default: global options are the options defined on the root command\n globalOptions = rootSubcommand.options;\n }\n\n return {\n command: rootSubcommand,\n programName,\n globalOptions,\n };\n}\n","/**\n * Bash completion script generator (static)\n *\n * Generates a self-contained bash completion script that embeds all\n * completion metadata. No Node.js process is spawned on TAB.\n */\n\nimport type { AnyCommand } from \"../types.js\";\nimport {\n collectRouteEntries,\n extractCompletionData,\n getVisibleSubs,\n isSubcmdCaseLines,\n optTakesValueEntries,\n sanitize,\n} from \"./extractor.js\";\nimport type {\n CompletableOption,\n CompletablePositional,\n CompletableSubcommand,\n CompletionOptions,\n CompletionResult,\n ValueCompletion,\n} from \"./types.js\";\n\n/** Escape a string for use inside bash double-quotes */\nfunction escapeBashDQ(s: string): string {\n return s.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"').replace(/\\$/g, \"\\\\$\").replace(/`/g, \"\\\\`\");\n}\n\n/**\n * Generate bash value completion code for a ValueCompletion spec.\n * Returns an array of bash lines.\n */\nfunction bashValueLines(vc: ValueCompletion | undefined, inline: boolean): string[] {\n if (!vc) return [];\n\n switch (vc.type) {\n case \"choices\": {\n const items = vc.choices!.map((c) => `\"${escapeBashDQ(c)}\"`).join(\" \");\n if (inline) {\n return [\n `local -a _choices=(${items})`,\n `COMPREPLY=()`,\n `local _c; for _c in \"\\${_choices[@]}\"; do [[ \"$_c\" == \"$_cur\"* ]] && COMPREPLY+=(\"\\${_inline_prefix}\\${_c}\"); done`,\n `compopt -o nospace`,\n `compopt +o default 2>/dev/null`,\n ];\n }\n return [\n `local -a _choices=(${items})`,\n `COMPREPLY=()`,\n `local _c; for _c in \"\\${_choices[@]}\"; do [[ \"$_c\" == \"$_cur\"* ]] && COMPREPLY+=(\"$_c\"); done`,\n `compopt +o default 2>/dev/null`,\n ];\n }\n case \"file\": {\n if (vc.matcher?.length) {\n const checks = vc.matcher.map((p) => `[[ \"\\${_f##*/}\" == ${p} ]]`).join(\" || \");\n return bashFileFilter(checks, inline);\n }\n if (vc.extensions?.length) {\n const checks = vc.extensions.map((ext) => `[[ \"$_f\" == *\".${ext}\" ]]`).join(\" || \");\n return bashFileFilter(checks, inline);\n }\n if (inline) {\n return [\n `local -a _entries=($(compgen -f -- \"$_cur\"))`,\n `COMPREPLY=(\"\\${_entries[@]/#/$_inline_prefix}\")`,\n `compopt -o filenames`,\n ];\n }\n return [`COMPREPLY=($(compgen -f -- \"$_cur\"))`, `compopt -o filenames`];\n }\n case \"directory\": {\n if (inline) {\n return [\n `local -a _dirs=($(compgen -d -- \"$_cur\"))`,\n `COMPREPLY=(\"\\${_dirs[@]/#/$_inline_prefix}\")`,\n `compopt -o filenames`,\n ];\n }\n return [`COMPREPLY=($(compgen -d -- \"$_cur\"))`, `compopt -o filenames`];\n }\n case \"command\": {\n const cmd = vc.shellCommand!;\n if (inline) {\n return [`COMPREPLY=($(compgen -P \"$_inline_prefix\" -W \"$(${cmd})\" -- \"$_cur\"))`];\n }\n return [`COMPREPLY=($(compgen -W \"$(${cmd})\" -- \"$_cur\"))`];\n }\n case \"none\":\n return [`compopt +o default 2>/dev/null`];\n }\n}\n\nfunction bashFileFilter(checks: string, inline: boolean): string[] {\n const prefix = inline ? `\"\\${_inline_prefix}$_f\"` : `\"$_f\"`;\n return [\n `local -a _all_entries=($(compgen -f -- \"$_cur\"))`,\n `for _f in \"\\${_all_entries[@]}\"; do`,\n ` if [[ -d \"$_f\" ]]; then`,\n ` COMPREPLY+=(${prefix})`,\n ` elif ${checks}; then`,\n ` COMPREPLY+=(${prefix})`,\n ` fi`,\n `done`,\n `compopt -o filenames`,\n `compopt +o default 2>/dev/null`,\n ];\n}\n\n/** Collect value-taking option patterns for case matching */\nfunction optionValueCases(options: CompletableOption[], inline: boolean): string[] {\n const lines: string[] = [];\n for (const opt of options) {\n if (!opt.takesValue || !opt.valueCompletion) continue;\n const valLines = bashValueLines(opt.valueCompletion, inline);\n if (valLines.length === 0) continue;\n\n const patterns: string[] = [`--${opt.cliName}`];\n if (opt.alias) patterns.push(`-${opt.alias}`);\n const patternStr = patterns.join(\"|\");\n\n lines.push(` ${patternStr})`);\n for (const vl of valLines) {\n lines.push(` ${vl}`);\n }\n lines.push(` return ;;`);\n }\n return lines;\n}\n\n/** Generate positional completion block */\nfunction positionalBlock(positionals: CompletablePositional[]): string[] {\n if (positionals.length === 0) return [];\n const lines: string[] = [];\n lines.push(` case \"$_pos_count\" in`);\n\n for (const pos of positionals) {\n if (pos.variadic) {\n // Variadic: use * to match any position from this index onward\n lines.push(` ${pos.position}|*)`);\n } else {\n lines.push(` ${pos.position})`);\n }\n for (const vl of bashValueLines(pos.valueCompletion, false)) {\n lines.push(` ${vl}`);\n }\n lines.push(` ;;`);\n }\n\n lines.push(` esac`);\n return lines;\n}\n\n/** Generate prev/inline value completion blocks for options */\nfunction valueCompletionBlocks(options: CompletableOption[]): string[] {\n if (!options.some((o) => o.takesValue && o.valueCompletion)) return [];\n\n const lines: string[] = [];\n const prevCases = optionValueCases(options, false);\n if (prevCases.length > 0) {\n lines.push(` if [[ -z \"$_inline_prefix\" ]]; then`);\n lines.push(` case \"$_prev\" in`);\n lines.push(...prevCases);\n lines.push(` esac`);\n lines.push(` fi`);\n }\n const inlineCases = optionValueCases(options, true);\n if (inlineCases.length > 0) {\n lines.push(` if [[ -n \"$_inline_prefix\" ]]; then`);\n lines.push(` case \"\\${_inline_prefix%=}\" in`);\n lines.push(...inlineCases);\n lines.push(` esac`);\n lines.push(` fi`);\n }\n return lines;\n}\n\n/** Generate available-options list lines */\nfunction availableOptionLines(options: CompletableOption[], fn: string): string[] {\n const lines: string[] = [];\n for (const opt of options) {\n if (opt.valueType === \"array\") {\n // Array options can be specified multiple times — always keep available\n lines.push(` _avail+=(--${opt.cliName})`);\n } else {\n const patterns: string[] = [`\"--${opt.cliName}\"`];\n if (opt.alias) patterns.push(`\"-${opt.alias}\"`);\n lines.push(` __${fn}_not_used ${patterns.join(\" \")} && _avail+=(--${opt.cliName})`);\n }\n }\n lines.push(` __${fn}_not_used \"--help\" && _avail+=(--help)`);\n return lines;\n}\n\n/**\n * Generate a per-subcommand completion function.\n * Recursively generates functions for nested subcommands.\n */\nfunction generateSubHandler(sub: CompletableSubcommand, fn: string, path: string[]): string[] {\n const fullPath = [...path, sub.name];\n const funcName = `__${fn}_complete_${fullPath.map(sanitize).join(\"_\")}`;\n const visibleSubs = getVisibleSubs(sub.subcommands);\n\n const lines: string[] = [];\n\n // Recursively generate handlers for child subcommands\n for (const child of visibleSubs) {\n lines.push(...generateSubHandler(child, fn, fullPath));\n }\n\n lines.push(`${funcName}() {`);\n\n // 1. Option value completion (prev is value-taking option)\n lines.push(...valueCompletionBlocks(sub.options));\n\n // Fallback: value-taking option without explicit completion → default file completion\n const fullPathStr = fullPath.join(\":\");\n lines.push(\n ` if [[ -z \"$_inline_prefix\" ]] && __${fn}_opt_takes_value \"${fullPathStr}\" \"$_prev\"; then return; fi`,\n );\n lines.push(\n ` if [[ -n \"$_inline_prefix\" ]] && __${fn}_opt_takes_value \"${fullPathStr}\" \"\\${_inline_prefix%=}\"; then return; fi`,\n );\n\n // 2. After -- separator\n if (sub.positionals.length > 0) {\n lines.push(` if (( _after_dd )); then`);\n lines.push(...positionalBlock(sub.positionals).map((l) => ` ${l}`));\n lines.push(` return`);\n lines.push(` fi`);\n } else {\n lines.push(` if (( _after_dd )); then return; fi`);\n }\n\n // 3. Option name completion\n lines.push(` if [[ \"$_cur\" == -* ]]; then`);\n lines.push(` local -a _avail=()`);\n lines.push(...availableOptionLines(sub.options, fn));\n lines.push(` COMPREPLY=($(compgen -W \"\\${_avail[*]}\" -- \"$_cur\"))`);\n lines.push(` compopt +o default 2>/dev/null`);\n lines.push(` return`);\n lines.push(` fi`);\n\n // 4. Subcommand or positional completion\n if (visibleSubs.length > 0) {\n const subNames = visibleSubs.map((s) => s.name).join(\" \");\n lines.push(` COMPREPLY=($(compgen -W \"${subNames}\" -- \"$_cur\"))`);\n lines.push(` compopt +o default 2>/dev/null`);\n } else if (sub.positionals.length > 0) {\n lines.push(...positionalBlock(sub.positionals));\n }\n\n lines.push(`}`);\n lines.push(``);\n return lines;\n}\n\nexport function generateBashCompletion(\n command: AnyCommand,\n options: CompletionOptions,\n): CompletionResult {\n const { programName } = options;\n const data = extractCompletionData(command, programName, options.globalArgsSchema);\n const fn = sanitize(programName);\n const root = data.command;\n const visibleSubs = getVisibleSubs(root.subcommands);\n\n const lines: string[] = [];\n lines.push(`# Bash completion for ${programName}`);\n lines.push(`# Generated by politty`);\n lines.push(``);\n\n // Helper: check if option is already used\n lines.push(`__${fn}_not_used() {`);\n lines.push(` for _u in \"\\${_used_opts[@]}\"; do`);\n lines.push(` for _chk in \"$@\"; do`);\n lines.push(` [[ \"$_u\" == \"$_chk\" ]] && return 1`);\n lines.push(` done`);\n lines.push(` done`);\n lines.push(` return 0`);\n lines.push(`}`);\n lines.push(``);\n\n // Helper: check if option takes a value\n lines.push(`__${fn}_opt_takes_value() {`);\n lines.push(` case \"$1:$2\" in`);\n lines.push(...optTakesValueEntries(root, \"\"));\n lines.push(` esac`);\n lines.push(` return 1`);\n lines.push(`}`);\n lines.push(``);\n\n // Collect all nested subcommand routes (used for both is_subcmd and dispatch)\n const routeEntries = collectRouteEntries(root);\n\n // Helper: check if a word is a known subcommand at the current path level\n if (routeEntries.length > 0) {\n lines.push(`__${fn}_is_subcmd() {`);\n lines.push(` case \"$1:$2\" in`);\n lines.push(...isSubcmdCaseLines(routeEntries));\n lines.push(` esac`);\n lines.push(` return 1`);\n lines.push(`}`);\n lines.push(``);\n }\n\n // Per-subcommand completion functions\n for (const sub of visibleSubs) {\n lines.push(...generateSubHandler(sub, fn, []));\n }\n\n // Root handler\n lines.push(`__${fn}_complete_root() {`);\n lines.push(...valueCompletionBlocks(root.options));\n // Fallback: value-taking option without explicit completion → default file completion\n lines.push(\n ` if [[ -z \"$_inline_prefix\" ]] && __${fn}_opt_takes_value \"\" \"$_prev\"; then return; fi`,\n );\n lines.push(\n ` if [[ -n \"$_inline_prefix\" ]] && __${fn}_opt_takes_value \"\" \"\\${_inline_prefix%=}\"; then return; fi`,\n );\n if (root.positionals.length > 0) {\n lines.push(` if (( _after_dd )); then`);\n lines.push(...positionalBlock(root.positionals).map((l) => ` ${l}`));\n lines.push(` return`);\n lines.push(` fi`);\n } else {\n lines.push(` if (( _after_dd )); then return; fi`);\n }\n lines.push(` if [[ \"$_cur\" == -* ]]; then`);\n lines.push(` local -a _avail=()`);\n lines.push(...availableOptionLines(root.options, fn));\n lines.push(` COMPREPLY=($(compgen -W \"\\${_avail[*]}\" -- \"$_cur\"))`);\n lines.push(` compopt +o default 2>/dev/null`);\n if (visibleSubs.length > 0) {\n lines.push(` else`);\n const subNames = visibleSubs.map((s) => s.name).join(\" \");\n lines.push(` COMPREPLY=($(compgen -W \"${subNames}\" -- \"$_cur\"))`);\n lines.push(` compopt +o default 2>/dev/null`);\n } else if (root.positionals.length > 0) {\n lines.push(` else`);\n lines.push(...positionalBlock(root.positionals).map((l) => ` ${l}`));\n }\n lines.push(` fi`);\n lines.push(`}`);\n lines.push(``);\n\n // Main completion function -- subcommand dispatch routing\n const subRouting = routeEntries\n .map((r) => ` ${r.pathStr}) __${fn}_complete_${r.funcSuffix} ;;`)\n .join(\"\\n\");\n\n lines.push(`_${fn}_completions() {`);\n lines.push(` COMPREPLY=()`);\n lines.push(``);\n lines.push(` # Rejoin words split by '=' in COMP_WORDBREAKS`);\n lines.push(` local -a _words=()`);\n lines.push(` local _i=1`);\n lines.push(` while (( _i <= COMP_CWORD )); do`);\n lines.push(` if [[ \"\\${COMP_WORDS[_i]}\" == \"=\" && \\${#_words[@]} -gt 0 ]]; then`);\n lines.push(` _words[\\${#_words[@]}-1]+=\"=\\${COMP_WORDS[_i+1]:-}\"`);\n lines.push(` (( _i += 2 ))`);\n lines.push(` else`);\n lines.push(` _words+=(\"\\${COMP_WORDS[_i]}\")`);\n lines.push(` (( _i++ ))`);\n lines.push(` fi`);\n lines.push(` done`);\n lines.push(``);\n lines.push(` local _cur=\"\"`);\n lines.push(` (( \\${#_words[@]} > 0 )) && _cur=\"\\${_words[\\${#_words[@]}-1]}\"`);\n lines.push(``);\n lines.push(` local _inline_prefix=\"\"`);\n lines.push(` if [[ \"$_cur\" == --*=* ]]; then`);\n lines.push(` _inline_prefix=\"\\${_cur%%=*}=\"`);\n lines.push(` _cur=\"\\${_cur#*=}\"`);\n lines.push(` fi`);\n lines.push(``);\n lines.push(` local _prev=\"\"`);\n lines.push(` (( \\${#_words[@]} > 1 )) && _prev=\"\\${_words[\\${#_words[@]}-2]}\"`);\n lines.push(``);\n lines.push(` local _subcmd=\"\" _after_dd=0 _pos_count=0 _skip_next=0`);\n lines.push(` local -a _used_opts=()`);\n lines.push(``);\n lines.push(` local _j=0`);\n lines.push(` while (( _j < \\${#_words[@]} - 1 )); do`);\n lines.push(` local _w=\"\\${_words[_j]}\"`);\n lines.push(` if (( _skip_next )); then _skip_next=0; (( _j++ )); continue; fi`);\n lines.push(` if [[ \"$_w\" == \"--\" ]]; then _after_dd=1; (( _j++ )); continue; fi`);\n lines.push(` if (( _after_dd )); then (( _pos_count++ )); (( _j++ )); continue; fi`);\n lines.push(\n ` if [[ \"$_w\" == --*=* ]]; then _used_opts+=(\"\\${_w%%=*}\"); (( _j++ )); continue; fi`,\n );\n lines.push(` if [[ \"$_w\" == -* ]]; then`);\n lines.push(` _used_opts+=(\"$_w\")`);\n lines.push(` __${fn}_opt_takes_value \"$_subcmd\" \"$_w\" && _skip_next=1`);\n lines.push(` (( _j++ )); continue`);\n lines.push(` fi`);\n if (routeEntries.length > 0) {\n lines.push(\n ` if __${fn}_is_subcmd \"$_subcmd\" \"$_w\"; then _subcmd=\"\\${_subcmd:+\\${_subcmd}:}$_w\"; _used_opts=(); _pos_count=0; else (( _pos_count++ )); fi`,\n );\n } else {\n lines.push(` (( _pos_count++ ))`);\n }\n lines.push(` (( _j++ ))`);\n lines.push(` done`);\n lines.push(``);\n lines.push(` case \"$_subcmd\" in`);\n lines.push(subRouting);\n lines.push(` *) __${fn}_complete_root ;;`);\n lines.push(` esac`);\n lines.push(`}`);\n lines.push(``);\n lines.push(`complete -o default -F _${fn}_completions ${programName}`);\n lines.push(``);\n\n return {\n script: lines.join(\"\\n\"),\n shell: \"bash\",\n installInstructions: `# To enable completions, add the following to your ~/.bashrc:\n\n# Option 1: Source directly\neval \"$(${programName} completion bash)\"\n\n# Option 2: Save to a file\n${programName} completion bash > ~/.local/share/bash-completion/completions/${programName}\n\n# Then reload your shell or run:\nsource ~/.bashrc`,\n };\n}\n","/**\n * Generate completion candidates based on context\n */\n\nimport { execSync } from \"node:child_process\";\nimport { resolveSubCommandMeta } from \"../../lazy.js\";\nimport type { ValueCompletion } from \"../types.js\";\nimport type { CompletionContext } from \"./context-parser.js\";\n\n/**\n * Completion directive flags (bitwise)\n */\nexport const CompletionDirective = {\n /** Default completion behavior */\n Default: 0,\n /** Don't add space after completion */\n NoSpace: 1,\n /** Don't offer file completion (even if no other completions) */\n NoFileCompletion: 2,\n /** Filter completions using current word as prefix */\n FilterPrefix: 4,\n /** Keep the order of completions */\n KeepOrder: 8,\n /** Trigger file completion */\n FileCompletion: 16,\n /** Trigger directory completion */\n DirectoryCompletion: 32,\n /** Error occurred during completion */\n Error: 64,\n} as const;\n\n/**\n * A completion candidate\n */\nexport interface CompletionCandidate {\n /** The completion value */\n value: string;\n /** Optional description */\n description?: string | undefined;\n /** Type hint for display purposes */\n type?: \"option\" | \"subcommand\" | \"value\" | \"file\" | \"directory\";\n}\n\n/**\n * Result of candidate generation\n */\nexport interface CandidateResult {\n /** Completion candidates */\n candidates: CompletionCandidate[];\n /** Directive flags for shell behavior */\n directive: number;\n /** File extensions for shell-native filtering (e.g., [\"json\", \"yaml\"]) */\n fileExtensions?: string[] | undefined;\n /** Glob patterns for shell-native file matching (e.g., [\".env.*\"]) */\n fileMatchers?: string[] | undefined;\n}\n\n/**\n * Generate completion candidates based on context\n */\nexport function generateCandidates(context: CompletionContext): CandidateResult {\n const candidates: CompletionCandidate[] = [];\n let directive = CompletionDirective.Default;\n\n switch (context.completionType) {\n case \"subcommand\":\n return generateSubcommandCandidates(context);\n\n case \"option-name\":\n return generateOptionNameCandidates(context);\n\n case \"option-value\":\n return generateOptionValueCandidates(context);\n\n case \"positional\":\n return generatePositionalCandidates(context);\n\n default:\n return { candidates, directive };\n }\n}\n\n/**\n * Execute a shell command and return results as candidates\n */\nfunction executeShellCommand(command: string): CompletionCandidate[] {\n try {\n const output = execSync(command, { encoding: \"utf-8\", timeout: 5000 });\n return output\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n .map((line) => ({ value: line, type: \"value\" as const }));\n } catch {\n return [];\n }\n}\n\n/**\n * Result of resolving value candidates\n */\ntype ValueResolutionResult = Pick<CandidateResult, \"directive\" | \"fileExtensions\" | \"fileMatchers\">;\n\n/**\n * Resolve value completion, executing shell commands and file lookups in JS\n */\nfunction resolveValueCandidates(\n vc: ValueCompletion,\n candidates: CompletionCandidate[],\n _currentWord: string,\n description?: string,\n): ValueResolutionResult {\n let directive = CompletionDirective.FilterPrefix;\n let fileExtensions: string[] | undefined;\n let fileMatchers: string[] | undefined;\n\n switch (vc.type) {\n case \"choices\":\n if (vc.choices) {\n for (const choice of vc.choices) {\n candidates.push({\n value: choice,\n description,\n type: \"value\",\n });\n }\n }\n directive |= CompletionDirective.NoFileCompletion;\n break;\n\n case \"file\":\n if (vc.matcher && vc.matcher.length > 0) {\n // Delegate to shell with glob matcher metadata\n fileMatchers = vc.matcher.filter((m) => m.trim().length > 0);\n if (fileMatchers.length === 0) {\n fileMatchers = undefined;\n directive |= CompletionDirective.FileCompletion;\n }\n } else if (vc.extensions && vc.extensions.length > 0) {\n // Delegate to shell with extension filter metadata\n fileExtensions = Array.from(\n new Set(\n vc.extensions\n .map((ext) => ext.trim().replace(/^\\./, \"\"))\n .filter((ext) => ext.length > 0),\n ),\n );\n if (fileExtensions.length === 0) {\n // All extensions were invalid → treat as unfiltered file completion\n fileExtensions = undefined;\n directive |= CompletionDirective.FileCompletion;\n }\n } else {\n // No extensions or matchers: let shell handle native file completion\n directive |= CompletionDirective.FileCompletion;\n }\n break;\n\n case \"directory\":\n directive |= CompletionDirective.DirectoryCompletion;\n break;\n\n case \"command\":\n // Execute shell command in JS and add results as candidates\n if (vc.shellCommand) {\n candidates.push(...executeShellCommand(vc.shellCommand));\n }\n directive |= CompletionDirective.NoFileCompletion;\n break;\n\n case \"none\":\n directive |= CompletionDirective.NoFileCompletion;\n break;\n }\n\n return { directive, fileExtensions, fileMatchers };\n}\n\n/**\n * Generate subcommand candidates\n */\nfunction generateSubcommandCandidates(context: CompletionContext): CandidateResult {\n const candidates: CompletionCandidate[] = [];\n let directive = CompletionDirective.FilterPrefix;\n\n // Add subcommands\n for (const name of context.subcommands) {\n const sub = context.currentCommand.subCommands?.[name];\n const description = sub ? resolveSubCommandMeta(sub)?.description : undefined;\n\n candidates.push({\n value: name,\n description,\n type: \"subcommand\",\n });\n }\n\n // Add options when no subcommands exist, or when typing an option prefix\n if (candidates.length === 0 || context.currentWord.startsWith(\"-\")) {\n const optionResult = generateOptionNameCandidates(context);\n candidates.push(...optionResult.candidates);\n }\n\n return { candidates, directive };\n}\n\n/**\n * Generate option name candidates\n */\nfunction generateOptionNameCandidates(context: CompletionContext): CandidateResult {\n const candidates: CompletionCandidate[] = [];\n const directive = CompletionDirective.FilterPrefix;\n\n // Filter out already used options\n const availableOptions = context.options.filter((opt) => {\n // Array options can be specified multiple times, so keep them available.\n if (opt.valueType === \"array\") {\n return true;\n }\n\n return !context.usedOptions.has(opt.cliName) && !context.usedOptions.has(opt.alias || \"\");\n });\n\n for (const opt of availableOptions) {\n candidates.push({\n value: `--${opt.cliName}`,\n description: opt.description,\n type: \"option\",\n });\n }\n\n // Add help option if not already used\n if (!context.usedOptions.has(\"help\")) {\n candidates.push({\n value: \"--help\",\n description: \"Show help information\",\n type: \"option\",\n });\n }\n\n return { candidates, directive };\n}\n\n/**\n * Generate option value candidates\n */\nfunction generateOptionValueCandidates(context: CompletionContext): CandidateResult {\n const candidates: CompletionCandidate[] = [];\n\n if (!context.targetOption) {\n return { candidates, directive: CompletionDirective.FilterPrefix };\n }\n\n const vc = context.targetOption.valueCompletion;\n if (!vc) {\n return { candidates, directive: CompletionDirective.FilterPrefix };\n }\n\n return { candidates, ...resolveValueCandidates(vc, candidates, context.currentWord) };\n}\n\n/**\n * Generate positional argument candidates\n */\nfunction generatePositionalCandidates(context: CompletionContext): CandidateResult {\n const candidates: CompletionCandidate[] = [];\n\n // Get the positional at current index, clamping to last (variadic) positional\n const positionalIndex = context.positionalIndex ?? 0;\n const positional =\n context.positionals[positionalIndex] ??\n (context.positionals.at(-1)?.variadic ? context.positionals.at(-1) : undefined);\n\n if (!positional) {\n return { candidates, directive: CompletionDirective.FilterPrefix };\n }\n\n const vc = positional.valueCompletion;\n if (!vc) {\n return { candidates, directive: CompletionDirective.FilterPrefix };\n }\n\n return {\n candidates,\n ...resolveValueCandidates(vc, candidates, context.currentWord, positional.description),\n };\n}\n","/**\n * Parse completion context from partial command line\n */\n\nimport { extractFields } from \"../../core/schema-extractor.js\";\nimport { resolveSubCommandMeta } from \"../../lazy.js\";\nimport type { AnyCommand } from \"../../types.js\";\nimport type { CompletableOption, CompletablePositional } from \"../types.js\";\nimport { resolveValueCompletion } from \"../value-completion-resolver.js\";\n\n/**\n * Completion type indicates what kind of completion is expected\n */\nexport type CompletionType =\n | \"subcommand\" // Completing a subcommand name\n | \"option-name\" // Completing an option name (--xxx, -x)\n | \"option-value\" // Completing an option's value\n | \"positional\"; // Completing a positional argument\n\n/**\n * Context for completion at current cursor position\n */\nexport interface CompletionContext {\n /** Subcommand path from root (e.g., [\"plugin\", \"add\"]) */\n subcommandPath: string[];\n /** The resolved command at current path */\n currentCommand: AnyCommand;\n /** Current word being typed (may be partial) */\n currentWord: string;\n /** Previous word (useful for option value detection) */\n previousWord: string;\n /** What type of completion is expected */\n completionType: CompletionType;\n /** Target option when completing option value */\n targetOption?: CompletableOption | undefined;\n /** Positional index when completing positional argument */\n positionalIndex?: number | undefined;\n /** Available options for current command */\n options: CompletableOption[];\n /** Available subcommands */\n subcommands: string[];\n /** Available positionals */\n positionals: CompletablePositional[];\n /** Options already used (to avoid duplicates) */\n usedOptions: Set<string>;\n /** Number of positional arguments already provided */\n providedPositionalCount: number;\n}\n\n/**\n * Extract options from a command\n */\nfunction extractOptions(command: AnyCommand): CompletableOption[] {\n if (!command.args) {\n return [];\n }\n\n const extracted = extractFields(command.args);\n return extracted.fields\n .filter((field) => !field.positional)\n .map((field) => ({\n name: field.name,\n cliName: field.cliName,\n alias: field.alias,\n description: field.description,\n takesValue: field.type !== \"boolean\",\n valueType: field.type,\n required: field.required,\n valueCompletion: resolveValueCompletion(field),\n }));\n}\n\n/**\n * Extract positionals from a command\n */\nfunction extractPositionalsForContext(command: AnyCommand): CompletablePositional[] {\n if (!command.args) {\n return [];\n }\n\n const extracted = extractFields(command.args);\n return extracted.fields\n .filter((field) => field.positional)\n .map((field, index) => ({\n name: field.name,\n cliName: field.cliName,\n position: index,\n description: field.description,\n required: field.required,\n variadic: field.type === \"array\",\n valueCompletion: resolveValueCompletion(field),\n }));\n}\n\n/**\n * Get subcommand names from a command\n */\nfunction getSubcommandNames(command: AnyCommand): string[] {\n if (!command.subCommands) {\n return [];\n }\n // Filter out internal subcommands (e.g., __complete)\n return Object.keys(command.subCommands).filter((name) => !name.startsWith(\"__\"));\n}\n\n/**\n * Resolve subcommand by name\n */\nfunction resolveSubcommand(command: AnyCommand, name: string): AnyCommand | null {\n if (!command.subCommands) {\n return null;\n }\n\n const sub = command.subCommands[name];\n if (!sub) {\n return null;\n }\n\n return resolveSubCommandMeta(sub);\n}\n\n/**\n * Check if a word is an option (starts with - or --)\n */\nfunction isOption(word: string): boolean {\n return word.startsWith(\"-\");\n}\n\n/**\n * Parse option name from word (e.g., \"--foo=bar\" -> \"foo\", \"-v\" -> \"v\")\n */\nfunction parseOptionName(word: string): string {\n if (word.startsWith(\"--\")) {\n const withoutPrefix = word.slice(2);\n const eqIndex = withoutPrefix.indexOf(\"=\");\n return eqIndex >= 0 ? withoutPrefix.slice(0, eqIndex) : withoutPrefix;\n }\n if (word.startsWith(\"-\")) {\n return word.slice(1, 2); // First char after -\n }\n return word;\n}\n\n/**\n * Check if option has inline value (e.g., \"--foo=bar\")\n */\nfunction hasInlineValue(word: string): boolean {\n return word.includes(\"=\");\n}\n\n/**\n * Find option by name or alias\n */\nfunction findOption(\n options: CompletableOption[],\n nameOrAlias: string,\n): CompletableOption | undefined {\n return options.find((opt) => opt.cliName === nameOrAlias || opt.alias === nameOrAlias);\n}\n\n/**\n * Parse completion context from command line arguments\n *\n * @param argv - Arguments after the program name (e.g., [\"build\", \"--fo\"])\n * @param rootCommand - The root command\n * @returns Completion context\n */\nexport function parseCompletionContext(argv: string[], rootCommand: AnyCommand): CompletionContext {\n // Initialize with root command\n let currentCommand = rootCommand;\n const subcommandPath: string[] = [];\n\n // Track used options and positional count\n const usedOptions = new Set<string>();\n let positionalCount = 0;\n\n // Process arguments to resolve subcommands and track state\n let i = 0;\n let options = extractOptions(currentCommand);\n let afterDoubleDash = false;\n\n // Traverse subcommands\n while (i < argv.length - 1) {\n const word = argv[i]!;\n\n // \"--\" marks the end of option parsing\n if (!afterDoubleDash && word === \"--\") {\n afterDoubleDash = true;\n i++;\n continue;\n }\n\n // Skip options and their values (before \"--\")\n if (!afterDoubleDash && isOption(word)) {\n const optName = parseOptionName(word);\n const opt = findOption(options, optName);\n\n if (opt) {\n usedOptions.add(opt.cliName);\n if (opt.alias) usedOptions.add(opt.alias);\n\n // Skip next word if option takes value and doesn't have inline value\n if (opt.takesValue && !hasInlineValue(word)) {\n i++;\n }\n }\n i++;\n continue;\n }\n\n // Check if this is a subcommand (before \"--\")\n const subcommand = afterDoubleDash ? null : resolveSubcommand(currentCommand, word);\n if (subcommand) {\n subcommandPath.push(word);\n currentCommand = subcommand;\n options = extractOptions(currentCommand);\n usedOptions.clear(); // Reset for new subcommand\n positionalCount = 0;\n i++;\n continue;\n }\n\n // Otherwise it's a positional argument\n positionalCount++;\n i++;\n }\n\n // Get current and previous word\n const currentWord: string = argv[argv.length - 1] ?? \"\";\n const previousWord: string = argv[argv.length - 2] ?? \"\";\n\n // Extract data for current command\n const positionals = extractPositionalsForContext(currentCommand);\n const subcommands = getSubcommandNames(currentCommand);\n\n // Determine completion type\n let completionType: CompletionType;\n let targetOption: CompletableOption | undefined;\n let positionalIndex: number | undefined;\n\n // Case 1: Previous word is an option that takes a value\n if (!afterDoubleDash && previousWord && isOption(previousWord) && !hasInlineValue(previousWord)) {\n const optName = parseOptionName(previousWord);\n const opt = findOption(options, optName);\n if (opt && opt.takesValue) {\n completionType = \"option-value\";\n targetOption = opt;\n } else if (currentWord.startsWith(\"-\")) {\n // Previous word is boolean flag, current word starts with - → option name\n completionType = \"option-name\";\n } else {\n completionType = determineDefaultCompletionType(\n currentWord,\n subcommands,\n positionals,\n positionalCount,\n );\n if (completionType === \"positional\") {\n positionalIndex = positionalCount;\n }\n }\n }\n // Case 2: Current word is an option with inline value (--foo=)\n else if (!afterDoubleDash && currentWord.startsWith(\"--\") && hasInlineValue(currentWord)) {\n const optName = parseOptionName(currentWord);\n const opt = findOption(options, optName);\n if (opt && opt.takesValue) {\n completionType = \"option-value\";\n targetOption = opt;\n } else {\n completionType = \"option-name\";\n }\n }\n // Case 3: Current word starts with - (completing option name)\n else if (!afterDoubleDash && currentWord.startsWith(\"-\")) {\n completionType = \"option-name\";\n }\n // Case 4: Determine based on available subcommands and positionals\n else {\n completionType = determineDefaultCompletionType(\n currentWord,\n subcommands,\n positionals,\n positionalCount,\n afterDoubleDash,\n );\n if (completionType === \"positional\") {\n positionalIndex = positionalCount;\n }\n }\n\n return {\n subcommandPath,\n currentCommand,\n currentWord,\n previousWord,\n completionType,\n targetOption,\n positionalIndex,\n options,\n subcommands,\n positionals,\n usedOptions,\n providedPositionalCount: positionalCount,\n };\n}\n\n/**\n * Determine default completion type when not completing an option\n */\nfunction determineDefaultCompletionType(\n currentWord: string,\n subcommands: string[],\n positionals: CompletablePositional[],\n positionalCount: number,\n afterDoubleDash?: boolean,\n): CompletionType {\n // After --, everything is positional — never suggest subcommands or options\n if (afterDoubleDash) {\n return \"positional\";\n }\n\n // If there are subcommands and current word might match one, suggest subcommands\n if (subcommands.length > 0) {\n // Check if any subcommand starts with current word\n const matchingSubcommands = subcommands.filter((s) => s.startsWith(currentWord));\n if (matchingSubcommands.length > 0 || currentWord === \"\") {\n return \"subcommand\";\n }\n }\n\n // If there are positionals to complete\n if (positionalCount < positionals.length) {\n return \"positional\";\n }\n\n // If the last positional is variadic (array), continue with positional\n if (positionals.length > 0 && positionals[positionals.length - 1]!.variadic) {\n return \"positional\";\n }\n\n // Default to subcommand (will show options too)\n return \"subcommand\";\n}\n","/**\n * Shell-specific output formatter for completion candidates\n *\n * Formats completion candidates into shell-native output so that\n * shell scripts can consume them with minimal parsing logic.\n */\n\nimport type { ShellType } from \"../types.js\";\nimport {\n CompletionDirective,\n type CandidateResult,\n type CompletionCandidate,\n} from \"./candidate-generator.js\";\n\n/**\n * Options for shell-specific formatting\n */\nexport interface ShellFormatOptions {\n /** Target shell type */\n shell: ShellType;\n /** Current word being completed (used for prefix filtering) */\n currentWord: string;\n /** For bash: the prefix before '=' in --opt=value completions */\n inlinePrefix?: string | undefined;\n}\n\n/**\n * Format completion candidates for the specified shell\n *\n * @returns Shell-ready output string (lines separated by newline, last line is :directive)\n */\nexport function formatForShell(result: CandidateResult, options: ShellFormatOptions): string {\n switch (options.shell) {\n case \"bash\":\n return formatForBash(result, options);\n case \"zsh\":\n return formatForZsh(result, options);\n case \"fish\":\n return formatForFish(result, options);\n }\n}\n\n/**\n * Check if the FilterPrefix directive is set\n */\nfunction shouldFilterPrefix(directive: number): boolean {\n return (directive & CompletionDirective.FilterPrefix) !== 0;\n}\n\n/**\n * Filter candidates by prefix\n */\nfunction filterByPrefix(candidates: CompletionCandidate[], prefix: string): CompletionCandidate[] {\n if (!prefix) return candidates;\n return candidates.filter((c) => c.value.startsWith(prefix));\n}\n\n/**\n * Append extension metadata and directive to output lines\n */\nfunction appendMetadata(lines: string[], result: CandidateResult): void {\n if (result.fileExtensions && result.fileExtensions.length > 0) {\n lines.push(`@ext:${result.fileExtensions.join(\",\")}`);\n }\n if (result.fileMatchers && result.fileMatchers.length > 0) {\n lines.push(`@matcher:${result.fileMatchers.join(\",\")}`);\n }\n lines.push(`:${result.directive}`);\n}\n\n/**\n * Format for bash\n *\n * - Pre-filters candidates by currentWord prefix (replaces compgen -W)\n * - Handles --opt=value inline values by prepending prefix\n * - Outputs plain values only (no descriptions - bash COMPREPLY doesn't support them)\n * - Last line: :directive\n */\nfunction formatForBash(result: CandidateResult, options: ShellFormatOptions): string {\n let { candidates } = result;\n\n if (shouldFilterPrefix(result.directive)) {\n candidates = filterByPrefix(candidates, options.currentWord);\n }\n\n const lines: string[] = candidates.map((c) => {\n if (options.inlinePrefix) {\n return `${options.inlinePrefix}${c.value}`;\n }\n return c.value;\n });\n\n appendMetadata(lines, result);\n return lines.join(\"\\n\");\n}\n\n/**\n * Format for zsh\n *\n * - Outputs value:description pairs for _describe\n * - Colons in values/descriptions are escaped with backslash\n * - Last line: :directive\n */\nfunction formatForZsh(result: CandidateResult, _options: ShellFormatOptions): string {\n const lines: string[] = result.candidates.map((c) => {\n const escapedValue = c.value.replace(/:/g, \"\\\\:\");\n if (c.description) {\n const escapedDesc = c.description.replace(/:/g, \"\\\\:\");\n return `${escapedValue}:${escapedDesc}`;\n }\n return escapedValue;\n });\n\n appendMetadata(lines, result);\n return lines.join(\"\\n\");\n}\n\n/**\n * Format for fish\n *\n * - Outputs value\\tdescription pairs\n * - Last line: :directive\n */\nfunction formatForFish(result: CandidateResult, _options: ShellFormatOptions): string {\n const lines: string[] = result.candidates.map((c) => {\n if (c.description) {\n return `${c.value}\\t${c.description}`;\n }\n return c.value;\n });\n\n appendMetadata(lines, result);\n return lines.join(\"\\n\");\n}\n","/**\n * Dynamic completion command implementation\n *\n * This creates a hidden `__complete` command that outputs completion candidates\n * for shell scripts to consume. Usage:\n *\n * mycli __complete --shell bash -- build --fo\n * mycli __complete --shell zsh -- plugin add\n *\n * Output format depends on the target shell:\n * bash: plain values (pre-filtered by prefix), last line :directive\n * zsh: value:description pairs, last line :directive\n * fish: value\\tdescription pairs, last line :directive\n */\n\nimport { z } from \"zod\";\nimport { arg } from \"../../core/arg-registry.js\";\nimport { defineCommand } from \"../../core/command.js\";\nimport type { AnyCommand, Command } from \"../../types.js\";\nimport { generateCandidates } from \"./candidate-generator.js\";\nimport { parseCompletionContext } from \"./context-parser.js\";\nimport { formatForShell } from \"./shell-formatter.js\";\n\n/**\n * Detect inline option-value prefix (e.g., \"--format=\" from \"--format=json\")\n */\nfunction detectInlinePrefix(currentWord: string): string | undefined {\n if (currentWord.startsWith(\"--\") && currentWord.includes(\"=\")) {\n return currentWord.slice(0, currentWord.indexOf(\"=\") + 1);\n }\n return undefined;\n}\n\n/**\n * Schema for the __complete command\n */\nconst completeArgsSchema = z.object({\n shell: arg(z.enum([\"bash\", \"zsh\", \"fish\"]), {\n description: \"Target shell for output formatting\",\n }),\n // The arguments to complete are passed after --\n args: arg(z.array(z.string()).default([]), {\n positional: true,\n description: \"Arguments to complete\",\n variadic: true,\n }),\n});\n\ntype CompleteArgs = z.infer<typeof completeArgsSchema>;\n\n/**\n * Create the dynamic completion command\n *\n * @param rootCommand - The root command to generate completions for\n * @param programName - The program name (optional, defaults to rootCommand.name)\n * @returns A command that outputs completion candidates\n */\nexport function createDynamicCompleteCommand(\n rootCommand: AnyCommand,\n _programName?: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): Command<typeof completeArgsSchema, CompleteArgs, any> {\n return defineCommand({\n name: \"__complete\",\n // No description - this is a hidden command\n args: completeArgsSchema,\n run(args) {\n // Parse the completion context\n const context = parseCompletionContext(args.args, rootCommand);\n\n // Generate candidates (shellCommand/file extensions resolved in JS)\n const result = generateCandidates(context);\n\n // Detect bash inline option-value prefix\n const inlinePrefix = detectInlinePrefix(context.currentWord);\n\n // Format for the target shell\n const output = formatForShell(result, {\n shell: args.shell,\n currentWord: inlinePrefix\n ? context.currentWord.slice(inlinePrefix.length)\n : context.currentWord,\n inlinePrefix,\n });\n\n console.log(output);\n },\n });\n}\n\n/**\n * Check if a command tree contains the __complete command\n */\nexport function hasCompleteCommand(command: AnyCommand): boolean {\n return Boolean(command.subCommands?.[\"__complete\"]);\n}\n","/**\n * Fish completion script generator (static)\n *\n * Generates a self-contained fish completion script that embeds all\n * completion metadata. No Node.js process is spawned on TAB.\n */\n\nimport type { AnyCommand } from \"../types.js\";\nimport {\n collectRouteEntries,\n extractCompletionData,\n getVisibleSubs,\n sanitize,\n} from \"./extractor.js\";\nimport type {\n CompletableOption,\n CompletablePositional,\n CompletableSubcommand,\n CompletionOptions,\n CompletionResult,\n ValueCompletion,\n} from \"./types.js\";\n\n/** Escape shell-special characters for fish double-quoted strings */\nfunction escapeDesc(s: string): string {\n return s.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"').replace(/\\$/g, \"\\\\$\");\n}\n\n/**\n * Generate fish value completion lines for a ValueCompletion spec.\n * Each line outputs candidates via echo (tab-separated value\\tdescription).\n */\nfunction fishValueLines(vc: ValueCompletion | undefined): string[] {\n if (!vc) return [];\n switch (vc.type) {\n case \"choices\":\n return vc.choices!.map((c) => `echo \"${escapeDesc(c)}\"`);\n case \"file\": {\n if (vc.matcher?.length) {\n return fishMatcherLines(vc.matcher);\n }\n if (vc.extensions?.length) {\n return fishExtensionLines(vc.extensions);\n }\n return [`__fish_complete_path \"$_cur\"`];\n }\n case \"directory\":\n return [`__fish_complete_directories \"$_cur\"`];\n case \"command\":\n return [`for _v in (${vc.shellCommand!})`, ` echo \"$_v\"`, `end`];\n case \"none\":\n return [];\n }\n}\n\n/** Generate fish matcher-filtered file completion */\nfunction fishMatcherLines(patterns: string[]): string[] {\n return [\n `__fish_complete_directories \"$_cur\"`,\n // Extract directory prefix from $_cur for correct subdirectory matching\n `set -l _dir \"\"`,\n `if string match -q '*/*' \"$_cur\"`,\n ` set _dir (string replace -r '[^/]*$' '' \"$_cur\")`,\n `end`,\n ...patterns.flatMap((p) => [\n `for _f in \"$_dir\"${p}`,\n ` test -f \"$_f\"; and string match -q \"$_cur*\" \"$_f\"; and echo \"$_f\"`,\n `end`,\n ]),\n ];\n}\n\n/** Generate fish extension-filtered file completion */\nfunction fishExtensionLines(extensions: string[]): string[] {\n const lines: string[] = [];\n lines.push(`__fish_complete_directories \"$_cur\"`);\n for (const ext of extensions) {\n lines.push(`for _f in \"$_cur\"*.${ext}`);\n lines.push(` test -f \"$_f\"; and echo \"$_f\"`);\n lines.push(`end`);\n }\n return lines;\n}\n\n/** Generate option-value switch cases for fish */\nfunction optionValueCases(options: CompletableOption[]): string[] {\n const lines: string[] = [];\n for (const opt of options) {\n if (!opt.takesValue || !opt.valueCompletion) continue;\n const valLines = fishValueLines(opt.valueCompletion);\n if (valLines.length === 0) continue;\n\n const conditions: string[] = [`test \"$_prev\" = \"--${opt.cliName}\"`];\n if (opt.alias) {\n conditions.push(`test \"$_prev\" = \"-${opt.alias}\"`);\n }\n const cond = conditions.join(\"; or \");\n\n lines.push(` if ${cond}`);\n for (const vl of valLines) {\n lines.push(` ${vl}`);\n }\n lines.push(` return`);\n lines.push(` end`);\n }\n return lines;\n}\n\n/** Generate positional completion block for fish */\nfunction positionalBlock(positionals: CompletablePositional[]): string[] {\n if (positionals.length === 0) return [];\n const lines: string[] = [];\n for (const pos of positionals) {\n const valLines = fishValueLines(pos.valueCompletion);\n if (valLines.length === 0) continue;\n\n if (pos.variadic) {\n lines.push(` if test $_pos_count -ge ${pos.position}`);\n } else {\n lines.push(` if test $_pos_count -eq ${pos.position}`);\n }\n for (const vl of valLines) {\n lines.push(` ${vl}`);\n }\n lines.push(` return`);\n lines.push(` end`);\n }\n return lines;\n}\n\n/** Generate available-option echo lines for fish */\nfunction availableOptionLines(options: CompletableOption[], fn: string): string[] {\n const lines: string[] = [];\n for (const opt of options) {\n const desc = escapeDesc(opt.description ?? \"\");\n if (opt.valueType === \"array\") {\n lines.push(` echo \"--${opt.cliName}\\t${desc}\"`);\n } else {\n const checks: string[] = [`\"--${opt.cliName}\"`];\n if (opt.alias) checks.push(`\"-${opt.alias}\"`);\n lines.push(\n ` __${fn}_not_used ${checks.join(\" \")}; and echo \"--${opt.cliName}\\t${desc}\"`,\n );\n }\n }\n lines.push(` __${fn}_not_used \"--help\"; and echo \"--help\\tShow help\"`);\n return lines;\n}\n\n/** Generate value-option completion block if any value-taking options exist */\nfunction valueCompletionBlock(options: CompletableOption[]): string[] {\n if (!options.some((o) => o.takesValue && o.valueCompletion)) return [];\n return optionValueCases(options);\n}\n\n/**\n * Generate a per-subcommand completion function for fish.\n * Recursively generates functions for nested subcommands.\n */\nfunction generateSubHandler(sub: CompletableSubcommand, fn: string, path: string[]): string[] {\n const fullPath = [...path, sub.name];\n const funcName = `__${fn}_complete_${fullPath.map(sanitize).join(\"_\")}`;\n const visibleSubs = getVisibleSubs(sub.subcommands);\n\n const lines: string[] = [];\n\n // Recursively generate handlers for child subcommands\n for (const child of visibleSubs) {\n lines.push(...generateSubHandler(child, fn, fullPath));\n }\n\n lines.push(`function ${funcName} --no-scope-shadowing`);\n\n // 1. Option value completion\n lines.push(...valueCompletionBlock(sub.options));\n // Fallback: value-taking option without explicit completion → default file completion\n const fullPathStr = fullPath.join(\":\");\n lines.push(` if __${fn}_opt_takes_value \"${fullPathStr}\" \"$_prev\"; return; end`);\n\n // 2. After -- separator\n if (sub.positionals.length > 0) {\n lines.push(` if test $_after_dd -eq 1`);\n lines.push(...positionalBlock(sub.positionals).map((l) => ` ${l}`));\n lines.push(` return`);\n lines.push(` end`);\n } else {\n lines.push(` if test $_after_dd -eq 1; return; end`);\n }\n\n // 3. Option name completion\n lines.push(` if string match -q -- '-*' \"$_cur\"`);\n lines.push(...availableOptionLines(sub.options, fn));\n lines.push(` return`);\n lines.push(` end`);\n\n // 4. Subcommand or positional completion\n if (visibleSubs.length > 0) {\n for (const s of visibleSubs) {\n const desc = escapeDesc(s.description ?? \"\");\n lines.push(` echo \"${s.name}\\t${desc}\"`);\n }\n } else if (sub.positionals.length > 0) {\n lines.push(...positionalBlock(sub.positionals));\n }\n\n lines.push(`end`);\n lines.push(``);\n return lines;\n}\n\n/** Generate opt-takes-value entries for fish switch cases */\nfunction optTakesValueCases(sub: CompletableSubcommand, parentPath: string): string[] {\n const lines: string[] = [];\n for (const opt of sub.options) {\n if (opt.takesValue) {\n const patterns: string[] = [`\"${parentPath}:--${opt.cliName}\"`];\n if (opt.alias) patterns.push(`\"${parentPath}:-${opt.alias}\"`);\n lines.push(` case ${patterns.join(\" \")}`);\n lines.push(` return 0`);\n }\n }\n for (const child of getVisibleSubs(sub.subcommands)) {\n const childPath = parentPath ? `${parentPath}:${child.name}` : child.name;\n lines.push(...optTakesValueCases(child, childPath));\n }\n return lines;\n}\n\nexport function generateFishCompletion(\n command: AnyCommand,\n options: CompletionOptions,\n): CompletionResult {\n const { programName } = options;\n const data = extractCompletionData(command, programName, options.globalArgsSchema);\n const fn = sanitize(programName);\n const root = data.command;\n const visibleSubs = getVisibleSubs(root.subcommands);\n\n const lines: string[] = [];\n lines.push(`# Fish completion for ${programName}`);\n lines.push(`# Generated by politty`);\n lines.push(``);\n\n // Helper: check if option is already used\n lines.push(`function __${fn}_not_used --no-scope-shadowing`);\n lines.push(` for _chk in $argv`);\n lines.push(` if contains -- \"$_chk\" $_used_opts`);\n lines.push(` return 1`);\n lines.push(` end`);\n lines.push(` end`);\n lines.push(` return 0`);\n lines.push(`end`);\n lines.push(``);\n\n // Helper: check if option takes a value\n lines.push(`function __${fn}_opt_takes_value`);\n lines.push(` switch \"$argv[1]:$argv[2]\"`);\n lines.push(...optTakesValueCases(root, \"\"));\n lines.push(` end`);\n lines.push(` return 1`);\n lines.push(`end`);\n lines.push(``);\n\n // Collect all nested subcommand routes (used for both is_subcmd and dispatch)\n const routeEntries = collectRouteEntries(root);\n\n // Helper: check if a word is a known subcommand at the current path level\n if (routeEntries.length > 0) {\n lines.push(`function __${fn}_is_subcmd`);\n lines.push(` switch \"$argv[1]:$argv[2]\"`);\n for (const r of routeEntries) {\n lines.push(` case \"${r.lookupPattern}\"`);\n lines.push(` return 0`);\n }\n lines.push(` end`);\n lines.push(` return 1`);\n lines.push(`end`);\n lines.push(``);\n }\n\n // Per-subcommand completion functions\n for (const sub of visibleSubs) {\n lines.push(...generateSubHandler(sub, fn, []));\n }\n\n // Root handler\n // NOTE: Inline --opt=value completion is not yet supported in fish; only\n // separate-word value completion (--opt <value>) is handled. Bash supports\n // inline via _inline_prefix parsing.\n lines.push(`function __${fn}_complete_root --no-scope-shadowing`);\n lines.push(...valueCompletionBlock(root.options));\n // Fallback: value-taking option without explicit completion → default file completion\n lines.push(` if __${fn}_opt_takes_value \"\" \"$_prev\"; return; end`);\n if (root.positionals.length > 0) {\n lines.push(` if test $_after_dd -eq 1`);\n lines.push(...positionalBlock(root.positionals).map((l) => ` ${l}`));\n lines.push(` return`);\n lines.push(` end`);\n } else {\n lines.push(` if test $_after_dd -eq 1; return; end`);\n }\n lines.push(` if string match -q -- '-*' \"$_cur\"`);\n lines.push(...availableOptionLines(root.options, fn));\n if (visibleSubs.length > 0) {\n lines.push(` else`);\n for (const s of visibleSubs) {\n const desc = escapeDesc(s.description ?? \"\");\n lines.push(` echo \"${s.name}\\t${desc}\"`);\n }\n } else if (root.positionals.length > 0) {\n lines.push(` else`);\n lines.push(...positionalBlock(root.positionals));\n }\n lines.push(` end`);\n lines.push(`end`);\n lines.push(``);\n\n // Main completion function\n lines.push(`function __fish_${fn}_complete`);\n lines.push(` set -l _args (commandline -opc)`);\n lines.push(` set -e _args[1]`);\n lines.push(``);\n lines.push(` set -l _ct (commandline -ct)`);\n lines.push(` if test (count $_ct) -eq 0`);\n lines.push(` set -a _args \"\"`);\n lines.push(` else`);\n lines.push(` set -a _args $_ct`);\n lines.push(` end`);\n lines.push(``);\n lines.push(` set -l _cur \"\"`);\n lines.push(` if test (count $_args) -gt 0`);\n lines.push(` set _cur \"$_args[-1]\"`);\n lines.push(` end`);\n lines.push(``);\n lines.push(` set -l _prev \"\"`);\n lines.push(` if test (count $_args) -gt 1`);\n lines.push(` set _prev \"$_args[-2]\"`);\n lines.push(` end`);\n lines.push(``);\n lines.push(\n ` set -l _subcmd \"\" ; set -l _after_dd 0 ; set -l _pos_count 0 ; set -l _skip_next 0`,\n );\n lines.push(` set -l _used_opts`);\n lines.push(``);\n lines.push(` set -l _j 1`);\n lines.push(` set -l _limit (math (count $_args) - 1)`);\n lines.push(` while test $_j -le $_limit`);\n lines.push(` set -l _w \"$_args[$_j]\"`);\n lines.push(\n ` if test $_skip_next -eq 1; set _skip_next 0; set _j (math $_j + 1); continue; end`,\n );\n lines.push(` if test \"$_w\" = \"--\"; set _after_dd 1; set _j (math $_j + 1); continue; end`);\n lines.push(\n ` if test $_after_dd -eq 1; set _pos_count (math $_pos_count + 1); set _j (math $_j + 1); continue; end`,\n );\n lines.push(\n ` if string match -q -- '--*=*' \"$_w\"; set -a _used_opts (string replace -r '=.*' '' -- \"$_w\"); set _j (math $_j + 1); continue; end`,\n );\n lines.push(` if string match -q -- '-*' \"$_w\"`);\n lines.push(` set -a _used_opts \"$_w\"`);\n lines.push(` __${fn}_opt_takes_value \"$_subcmd\" \"$_w\"; and set _skip_next 1`);\n lines.push(` set _j (math $_j + 1); continue`);\n lines.push(` end`);\n if (routeEntries.length > 0) {\n lines.push(\n ` if __${fn}_is_subcmd \"$_subcmd\" \"$_w\"; test -n \"$_subcmd\"; and set _subcmd \"$_subcmd:$_w\"; or set _subcmd \"$_w\"; set _used_opts; set _pos_count 0; else; set _pos_count (math $_pos_count + 1); end`,\n );\n } else {\n lines.push(` set _pos_count (math $_pos_count + 1)`);\n }\n lines.push(` set _j (math $_j + 1)`);\n lines.push(` end`);\n lines.push(``);\n\n // Route to subcommand handler (all nested paths)\n lines.push(` switch \"$_subcmd\"`);\n for (const r of routeEntries) {\n lines.push(` case \"${r.pathStr}\"; __${fn}_complete_${r.funcSuffix}`);\n }\n lines.push(` case '*'; __${fn}_complete_root`);\n lines.push(` end`);\n lines.push(`end`);\n lines.push(``);\n\n // Register completion\n lines.push(`# Clear existing completions`);\n lines.push(`complete -e -c ${programName}`);\n lines.push(``);\n lines.push(`# Register completion`);\n lines.push(`complete -c ${programName} -f -a '(__fish_${fn}_complete)'`);\n lines.push(``);\n\n return {\n script: lines.join(\"\\n\"),\n shell: \"fish\",\n installInstructions: `# To enable completions, run one of the following:\n\n# Option 1: Source directly\n${programName} completion fish | source\n\n# Option 2: Save to the fish completions directory\n${programName} completion fish > ~/.config/fish/completions/${programName}.fish\n\n# The completion will be available immediately in new shell sessions.\n# To use in the current session, run:\nsource ~/.config/fish/completions/${programName}.fish`,\n };\n}\n","/**\n * Zsh completion script generator (static)\n *\n * Generates a self-contained zsh completion script that embeds all\n * completion metadata. No Node.js process is spawned on TAB.\n */\n\nimport type { AnyCommand } from \"../types.js\";\nimport {\n collectRouteEntries,\n extractCompletionData,\n getVisibleSubs,\n isSubcmdCaseLines,\n optTakesValueEntries,\n sanitize,\n} from \"./extractor.js\";\nimport type {\n CompletableOption,\n CompletablePositional,\n CompletableSubcommand,\n CompletionOptions,\n CompletionResult,\n ValueCompletion,\n} from \"./types.js\";\n\nfunction escapeDesc(s: string): string {\n return s\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/\"/g, '\\\\\"')\n .replace(/\\$/g, \"\\\\$\")\n .replace(/`/g, \"\\\\`\")\n .replace(/:/g, \"\\\\:\");\n}\n\n/**\n * Generate zsh value completion lines for a ValueCompletion spec.\n * Uses `_vals` array (must be declared in the calling function scope).\n */\nfunction zshValueLines(vc: ValueCompletion | undefined, fn: string): string[] {\n if (!vc) return [];\n switch (vc.type) {\n case \"choices\": {\n const items = vc.choices!.map((c) => `\"${escapeDesc(c)}\"`).join(\" \");\n return [`_vals=(${items})`, `__${fn}_cdescribe 'completions' _vals`];\n }\n case \"file\": {\n if (vc.matcher?.length) {\n return vc.matcher.map((p) => `_files -g \"${p}\"`);\n }\n if (vc.extensions?.length) {\n return vc.extensions.map((ext) => `_files -g \"*.${ext}\"`);\n }\n return [`_files`];\n }\n case \"directory\":\n return [`_files -/`];\n case \"command\":\n return [`_vals=(\"\\${(@f)$(${vc.shellCommand!})}\")`, `__${fn}_cdescribe 'completions' _vals`];\n case \"none\":\n return [];\n }\n}\n\n/** Generate option-value case branches */\nfunction optionValueCases(options: CompletableOption[], fn: string): string[] {\n const lines: string[] = [];\n for (const opt of options) {\n if (!opt.takesValue || !opt.valueCompletion) continue;\n const valLines = zshValueLines(opt.valueCompletion, fn);\n if (valLines.length === 0) continue;\n\n const patterns: string[] = [`--${opt.cliName}`];\n if (opt.alias) patterns.push(`-${opt.alias}`);\n\n lines.push(` ${patterns.join(\"|\")})`);\n for (const vl of valLines) {\n lines.push(` ${vl}`);\n }\n lines.push(` return 0 ;;`);\n }\n return lines;\n}\n\n/** Generate positional completion block */\nfunction positionalBlock(positionals: CompletablePositional[], fn: string): string[] {\n if (positionals.length === 0) return [];\n const lines: string[] = [];\n lines.push(` case \"$_pos_count\" in`);\n for (const pos of positionals) {\n if (pos.variadic) {\n lines.push(` ${pos.position}|*)`);\n } else {\n lines.push(` ${pos.position})`);\n }\n const valLines = zshValueLines(pos.valueCompletion, fn);\n for (const vl of valLines) {\n lines.push(` ${vl}`);\n }\n lines.push(` ;;`);\n }\n lines.push(` esac`);\n return lines;\n}\n\n/** Generate prev-word value completion case block */\nfunction valueCompletionBlock(options: CompletableOption[], fn: string): string[] {\n if (!options.some((o) => o.takesValue && o.valueCompletion)) return [];\n\n const prevCases = optionValueCases(options, fn);\n if (prevCases.length === 0) return [];\n\n return [` case \"\\${words[CURRENT-1]}\" in`, ...prevCases, ` esac`];\n}\n\n/** Generate available-options list lines */\nfunction availableOptionLines(options: CompletableOption[], fn: string): string[] {\n const lines: string[] = [];\n for (const opt of options) {\n const desc = opt.description ? `:${escapeDesc(opt.description)}` : \"\";\n if (opt.valueType === \"array\") {\n lines.push(` _opts+=(\"--${opt.cliName}${desc}\")`);\n } else {\n const patterns: string[] = [`\"--${opt.cliName}\"`];\n if (opt.alias) patterns.push(`\"-${opt.alias}\"`);\n lines.push(\n ` __${fn}_not_used ${patterns.join(\" \")} && _opts+=(\"--${opt.cliName}${desc}\")`,\n );\n }\n }\n lines.push(` __${fn}_not_used \"--help\" && _opts+=(\"--help:Show help\")`);\n return lines;\n}\n\n/**\n * Generate a per-subcommand completion function.\n * Recursively generates functions for nested subcommands.\n */\nfunction generateSubHandler(sub: CompletableSubcommand, fn: string, path: string[]): string[] {\n const fullPath = [...path, sub.name];\n const funcName = `__${fn}_complete_${fullPath.map(sanitize).join(\"_\")}`;\n const visibleSubs = getVisibleSubs(sub.subcommands);\n\n const lines: string[] = [];\n\n // Recursively generate handlers for child subcommands\n for (const child of visibleSubs) {\n lines.push(...generateSubHandler(child, fn, fullPath));\n }\n\n lines.push(`${funcName}() {`);\n lines.push(` local -a _vals=()`);\n\n // 1. Option value completion (prev word is value-taking option)\n lines.push(...valueCompletionBlock(sub.options, fn));\n // Fallback: value-taking option without explicit completion → default file completion\n const fullPathStr = fullPath.join(\":\");\n lines.push(\n ` if __${fn}_opt_takes_value \"${fullPathStr}\" \"\\${words[CURRENT-1]}\"; then return 0; fi`,\n );\n\n // 2. After -- separator\n if (sub.positionals.length > 0) {\n lines.push(` if (( _after_dd )); then`);\n lines.push(...positionalBlock(sub.positionals, fn).map((l) => ` ${l}`));\n lines.push(` return 0`);\n lines.push(` fi`);\n } else {\n lines.push(` if (( _after_dd )); then return 0; fi`);\n }\n\n // 3. Option name completion\n lines.push(` if [[ \"\\${words[CURRENT]}\" == -* ]]; then`);\n lines.push(` local -a _opts=()`);\n lines.push(...availableOptionLines(sub.options, fn));\n lines.push(` __${fn}_cdescribe 'options' _opts`);\n lines.push(` return 0`);\n lines.push(` fi`);\n\n // 4. Subcommand or positional completion\n if (visibleSubs.length > 0) {\n const subItems = visibleSubs\n .map((s) => {\n const desc = s.description ? `:${escapeDesc(s.description)}` : \"\";\n return `\"${s.name}${desc}\"`;\n })\n .join(\" \");\n lines.push(` local -a _subs=(${subItems})`);\n lines.push(` __${fn}_cdescribe 'subcommands' _subs`);\n } else if (sub.positionals.length > 0) {\n lines.push(...positionalBlock(sub.positionals, fn));\n }\n\n lines.push(`}`);\n lines.push(``);\n return lines;\n}\n\nexport function generateZshCompletion(\n command: AnyCommand,\n options: CompletionOptions,\n): CompletionResult {\n const { programName } = options;\n const data = extractCompletionData(command, programName, options.globalArgsSchema);\n const fn = sanitize(programName);\n const root = data.command;\n const visibleSubs = getVisibleSubs(root.subcommands);\n\n const lines: string[] = [];\n lines.push(`#compdef ${programName}`);\n lines.push(``);\n lines.push(`# Zsh completion for ${programName}`);\n lines.push(`# Generated by politty`);\n lines.push(``);\n\n // Helper: check if option is already used\n lines.push(`__${fn}_not_used() {`);\n lines.push(` local _u _chk`);\n lines.push(` for _u in \"\\${_used_opts[@]}\"; do`);\n lines.push(` for _chk in \"$@\"; do`);\n lines.push(` [[ \"$_u\" == \"$_chk\" ]] && return 1`);\n lines.push(` done`);\n lines.push(` done`);\n lines.push(` return 0`);\n lines.push(`}`);\n lines.push(``);\n\n // Helper: _describe with compadd fallback\n // _describe may fail to add matches when prefix starts with - (zsh tag system limitation)\n lines.push(`__${fn}_cdescribe() {`);\n lines.push(` _describe \"$@\" 2>/dev/null && return 0`);\n lines.push(` shift`);\n lines.push(` local -a _cd_vals=(\"\\${(@)\\${(P)1}%%:*}\")`);\n lines.push(` compadd -a _cd_vals 2>/dev/null`);\n lines.push(` return 0`);\n lines.push(`}`);\n lines.push(``);\n\n // Helper: check if option takes a value\n lines.push(`__${fn}_opt_takes_value() {`);\n lines.push(` case \"$1:$2\" in`);\n lines.push(...optTakesValueEntries(root, \"\"));\n lines.push(` esac`);\n lines.push(` return 1`);\n lines.push(`}`);\n lines.push(``);\n\n // Collect all nested subcommand routes (used for both is_subcmd and dispatch)\n const routeEntries = collectRouteEntries(root);\n\n // Helper: check if a word is a known subcommand at the current path level\n if (routeEntries.length > 0) {\n lines.push(`__${fn}_is_subcmd() {`);\n lines.push(` case \"$1:$2\" in`);\n lines.push(...isSubcmdCaseLines(routeEntries));\n lines.push(` esac`);\n lines.push(` return 1`);\n lines.push(`}`);\n lines.push(``);\n }\n\n // Per-subcommand completion functions\n for (const sub of visibleSubs) {\n lines.push(...generateSubHandler(sub, fn, []));\n }\n\n // Root handler\n // NOTE: Inline --opt=value completion is not yet supported in zsh; only\n // separate-word value completion (--opt <value>) is handled. Bash supports\n // inline via _inline_prefix parsing.\n lines.push(`__${fn}_complete_root() {`);\n lines.push(` local -a _vals=()`);\n lines.push(...valueCompletionBlock(root.options, fn));\n // Fallback: value-taking option without explicit completion → default file completion\n lines.push(` if __${fn}_opt_takes_value \"\" \"\\${words[CURRENT-1]}\"; then return 0; fi`);\n if (root.positionals.length > 0) {\n lines.push(` if (( _after_dd )); then`);\n lines.push(...positionalBlock(root.positionals, fn).map((l) => ` ${l}`));\n lines.push(` return 0`);\n lines.push(` fi`);\n } else {\n lines.push(` if (( _after_dd )); then return 0; fi`);\n }\n lines.push(` if [[ \"\\${words[CURRENT]}\" == -* ]]; then`);\n lines.push(` local -a _opts=()`);\n lines.push(...availableOptionLines(root.options, fn));\n lines.push(` __${fn}_cdescribe 'options' _opts`);\n if (visibleSubs.length > 0) {\n lines.push(` else`);\n const subItems = visibleSubs\n .map((s) => {\n const desc = s.description ? `:${escapeDesc(s.description)}` : \"\";\n return `\"${s.name}${desc}\"`;\n })\n .join(\" \");\n lines.push(` local -a _subs=(${subItems})`);\n lines.push(` __${fn}_cdescribe 'subcommands' _subs`);\n } else if (root.positionals.length > 0) {\n lines.push(` else`);\n lines.push(...positionalBlock(root.positionals, fn).map((l) => ` ${l}`));\n }\n lines.push(` fi`);\n lines.push(`}`);\n lines.push(``);\n\n // Main completion function -- subcommand dispatch routing\n const subRouting = routeEntries\n .map((r) => ` ${r.pathStr}) __${fn}_complete_${r.funcSuffix} ;;`)\n .join(\"\\n\");\n\n lines.push(`_${fn}() {`);\n lines.push(` (( CURRENT )) || CURRENT=\\${#words}`);\n lines.push(``);\n lines.push(` local _subcmd=\"\" _after_dd=0 _pos_count=0 _skip_next=0`);\n lines.push(` local -a _used_opts=()`);\n lines.push(``);\n lines.push(` local _j=2`);\n lines.push(` while (( _j < CURRENT )); do`);\n lines.push(` local _w=\"\\${words[_j]}\"`);\n lines.push(` if (( _skip_next )); then _skip_next=0; (( _j++ )); continue; fi`);\n lines.push(` if [[ \"$_w\" == \"--\" ]]; then _after_dd=1; (( _j++ )); continue; fi`);\n lines.push(` if (( _after_dd )); then (( _pos_count++ )); (( _j++ )); continue; fi`);\n lines.push(\n ` if [[ \"$_w\" == --*=* ]]; then _used_opts+=(\"\\${_w%%=*}\"); (( _j++ )); continue; fi`,\n );\n lines.push(` if [[ \"$_w\" == -* ]]; then`);\n lines.push(` _used_opts+=(\"$_w\")`);\n lines.push(` __${fn}_opt_takes_value \"$_subcmd\" \"$_w\" && _skip_next=1`);\n lines.push(` (( _j++ )); continue`);\n lines.push(` fi`);\n if (routeEntries.length > 0) {\n lines.push(\n ` if __${fn}_is_subcmd \"$_subcmd\" \"$_w\"; then _subcmd=\"\\${_subcmd:+\\${_subcmd}:}$_w\"; _used_opts=(); _pos_count=0; else (( _pos_count++ )); fi`,\n );\n } else {\n lines.push(` (( _pos_count++ ))`);\n }\n lines.push(` (( _j++ ))`);\n lines.push(` done`);\n lines.push(``);\n lines.push(` case \"$_subcmd\" in`);\n lines.push(subRouting);\n lines.push(` *) __${fn}_complete_root ;;`);\n lines.push(` esac`);\n lines.push(`}`);\n lines.push(``);\n lines.push(\n `zstyle ':completion:*:*:${programName}:*' file-patterns '%p:globbed-files *(-/):directories'`,\n );\n lines.push(``);\n lines.push(`compdef _${fn} ${programName}`);\n lines.push(``);\n\n return {\n script: lines.join(\"\\n\"),\n shell: \"zsh\",\n installInstructions: `# To enable completions, add the following to your ~/.zshrc:\n\n# Option 1: Source directly (add before compinit)\neval \"$(${programName} completion zsh)\"\n\n# Option 2: Save to a file in your fpath\n${programName} completion zsh > ~/.zsh/completions/_${programName}\n\n# Make sure your fpath includes the completions directory:\n# fpath=(~/.zsh/completions $fpath)\n# autoload -Uz compinit && compinit\n\n# Then reload your shell or run:\nsource ~/.zshrc`,\n };\n}\n","/**\n * Shell completion generation module\n *\n * Provides utilities to generate shell completion scripts for bash, zsh, and fish.\n *\n * @example\n * ```typescript\n * import { generateCompletion, createCompletionCommand } from \"politty/completion\";\n *\n * // Generate completion script directly\n * const result = generateCompletion(myCommand, {\n * shell: \"bash\",\n * programName: \"mycli\"\n * });\n * console.log(result.script);\n *\n * // Or add a completion subcommand to your CLI\n * const mainCommand = withCompletionCommand(\n * defineCommand({\n * name: \"mycli\",\n * subCommands: { ... },\n * }),\n * );\n * ```\n */\n\nimport { z } from \"zod\";\nimport { arg } from \"../core/arg-registry.js\";\nimport { defineCommand } from \"../core/command.js\";\nimport type { AnyCommand, ArgsSchema, Command } from \"../types.js\";\nimport { generateBashCompletion } from \"./bash.js\";\nimport { createDynamicCompleteCommand } from \"./dynamic/index.js\";\nimport { generateFishCompletion } from \"./fish.js\";\nimport type { CompletionOptions, CompletionResult, ShellType } from \"./types.js\";\nimport { generateZshCompletion } from \"./zsh.js\";\n\n// Re-export dynamic completion\nexport {\n CompletionDirective,\n createDynamicCompleteCommand,\n formatForShell,\n generateCandidates,\n hasCompleteCommand,\n parseCompletionContext,\n type CandidateResult,\n type CompletionCandidate,\n type CompletionContext,\n type CompletionType,\n type ShellFormatOptions,\n} from \"./dynamic/index.js\";\n// Re-export extractor\nexport { extractCompletionData, extractPositionals } from \"./extractor.js\";\n// Re-export types\nexport type {\n CompletableOption,\n CompletableSubcommand,\n CompletionData,\n CompletionGenerator,\n CompletionOptions,\n CompletionResult,\n ShellType,\n} from \"./types.js\";\n// Re-export value completion resolver\nexport { resolveValueCompletion, type ValueCompletionField } from \"./value-completion-resolver.js\";\n\n/**\n * Generate completion script for the specified shell\n */\nexport function generateCompletion(\n command: AnyCommand,\n options: CompletionOptions,\n): CompletionResult {\n switch (options.shell) {\n case \"bash\":\n return generateBashCompletion(command, options);\n case \"zsh\":\n return generateZshCompletion(command, options);\n case \"fish\":\n return generateFishCompletion(command, options);\n default:\n throw new Error(`Unsupported shell: ${options.shell}`);\n }\n}\n\n/**\n * Get the list of supported shells\n */\nexport function getSupportedShells(): ShellType[] {\n return [\"bash\", \"zsh\", \"fish\"];\n}\n\n/**\n * Detect the current shell from environment\n */\nexport function detectShell(): ShellType | null {\n const shell = process.env.SHELL || \"\";\n const shellName = shell.split(\"/\").pop()?.toLowerCase() || \"\";\n\n if (shellName.includes(\"bash\")) {\n return \"bash\";\n }\n if (shellName.includes(\"zsh\")) {\n return \"zsh\";\n }\n if (shellName.includes(\"fish\")) {\n return \"fish\";\n }\n\n return null;\n}\n\n/**\n * Schema for the completion command arguments\n */\nconst completionArgsSchema = z.object({\n shell: arg(\n z\n .enum([\"bash\", \"zsh\", \"fish\"])\n .optional()\n .describe(\"Shell type (auto-detected if not specified)\"),\n {\n positional: true,\n description: \"Shell type (bash, zsh, or fish)\",\n placeholder: \"SHELL\",\n },\n ),\n instructions: arg(z.boolean().default(false), {\n alias: \"i\",\n description: \"Show installation instructions\",\n }),\n});\n\ntype CompletionArgs = z.infer<typeof completionArgsSchema>;\n\n/**\n * Create a completion subcommand for your CLI\n *\n * This creates a ready-to-use subcommand that generates completion scripts.\n *\n * @example\n * ```typescript\n * const mainCommand = defineCommand({\n * name: \"mycli\",\n * subCommands: {\n * completion: createCompletionCommand(mainCommand)\n * }\n * });\n * ```\n */\nexport function createCompletionCommand(\n rootCommand: AnyCommand,\n programName?: string,\n globalArgsSchema?: ArgsSchema,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): Command<typeof completionArgsSchema, CompletionArgs, any> {\n const resolvedProgramName = programName ?? rootCommand.name;\n\n if (!rootCommand.subCommands?.__complete) {\n rootCommand.subCommands = {\n ...rootCommand.subCommands,\n __complete: createDynamicCompleteCommand(rootCommand, resolvedProgramName),\n };\n }\n\n return defineCommand({\n name: \"completion\",\n description: \"Generate shell completion script\",\n args: completionArgsSchema,\n run(args) {\n // Detect shell if not specified\n const shellType = args.shell || detectShell();\n\n if (!shellType) {\n console.error(\"Could not detect shell type. Please specify one of: bash, zsh, fish\");\n process.exitCode = 1;\n return;\n }\n\n const result = generateCompletion(rootCommand, {\n shell: shellType,\n programName: resolvedProgramName,\n includeDescriptions: true,\n ...(globalArgsSchema !== undefined && { globalArgsSchema }),\n });\n\n if (args.instructions) {\n console.log(result.installInstructions);\n } else {\n console.log(result.script);\n }\n },\n });\n}\n\n/**\n * Options for withCompletionCommand\n */\nexport interface WithCompletionOptions {\n /** Override the program name (defaults to command.name) */\n programName?: string;\n /** Global args schema for deriving global options in completion */\n globalArgsSchema?: ArgsSchema;\n}\n\n/**\n * Wrap a command with a completion subcommand\n *\n * This avoids circular references that occur when a command references itself\n * in its subCommands (e.g., for completion generation).\n *\n * @param command - The command to wrap\n * @param options - Options including programName\n * @returns A new command with the completion subcommand added\n *\n * @example\n * ```typescript\n * const mainCommand = withCompletionCommand(\n * defineCommand({\n * name: \"mycli\",\n * subCommands: { ... },\n * }),\n * );\n * ```\n */\nexport function withCompletionCommand<T extends AnyCommand>(\n command: T,\n options?: string | WithCompletionOptions,\n): T {\n // Support both string (programName) and options object for backwards compatibility\n const opts: WithCompletionOptions =\n typeof options === \"string\" ? { programName: options } : (options ?? {});\n\n const { programName, globalArgsSchema } = opts;\n\n const wrappedCommand = {\n ...command,\n } as T;\n\n wrappedCommand.subCommands = {\n ...command.subCommands,\n completion: createCompletionCommand(wrappedCommand, programName, globalArgsSchema),\n // Note: __complete (dynamic completion) does not yet receive globalArgsSchema.\n // Static completion scripts (bash/zsh/fish) already include global options.\n __complete: createDynamicCompleteCommand(wrappedCommand, programName),\n };\n\n return wrappedCommand;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"completion-BADAzqT9.cjs","names":["extractOptions","extractFields","resolveSubCommandMeta","optionValueCases","positionalBlock","availableOptionLines","generateSubHandler","resolveSubCommandMeta","extractFields","resolveSubCommandMeta","z","arg","escapeDesc","optionValueCases","positionalBlock","availableOptionLines","valueCompletionBlock","generateSubHandler","z","arg"],"sources":["../src/core/command.ts","../src/completion/value-completion-resolver.ts","../src/completion/extractor.ts","../src/completion/bash.ts","../src/completion/dynamic/candidate-generator.ts","../src/completion/dynamic/context-parser.ts","../src/completion/dynamic/shell-formatter.ts","../src/completion/dynamic/complete-command.ts","../src/completion/fish.ts","../src/completion/zsh.ts","../src/completion/index.ts"],"sourcesContent":["import { z } from \"zod\";\nimport type {\n ArgsSchema,\n Command,\n Example,\n GlobalArgs,\n IsEmpty,\n NonRunnableCommand,\n RunnableCommand,\n SubCommandsRecord,\n} from \"../types.js\";\nimport type { WithCaseVariants } from \"./case-types.js\";\n\n/**\n * Infer args type from schema, defaults to empty object if undefined.\n * Wraps with WithCaseVariants so both camelCase and kebab-case access is typed.\n */\ntype InferArgs<TArgsSchema> = TArgsSchema extends z.ZodType\n ? WithCaseVariants<z.infer<TArgsSchema>>\n : Record<string, never>;\n\n/**\n * Merge local args with global args.\n * No-op when TGlobalArgs is empty (default GlobalArgs not extended).\n * Wraps TGlobalArgs with WithCaseVariants for dual-case access.\n */\nexport type MergedArgs<TLocalArgs, TGlobalArgs> =\n IsEmpty<TGlobalArgs> extends true ? TLocalArgs : TLocalArgs & WithCaseVariants<TGlobalArgs>;\n\n/**\n * Resolve merged args from schema and global args type\n */\ntype ResolvedArgs<TArgsSchema, TGlobalArgs> = MergedArgs<InferArgs<TArgsSchema>, TGlobalArgs>;\n\n/**\n * Config for defining a command\n * @template TArgsSchema - The Zod schema type for arguments\n * @template TResult - The return type of run function (void if no run)\n * @template TGlobalArgs - Global args type (from declaration merging or factory)\n */\ninterface DefineCommandConfig<TArgsSchema extends ArgsSchema | undefined, TResult, TGlobalArgs> {\n name: string;\n description?: string;\n args?: TArgsSchema;\n subCommands?: SubCommandsRecord;\n setup?: (context: { args: ResolvedArgs<TArgsSchema, TGlobalArgs> }) => void | Promise<void>;\n run?: (args: ResolvedArgs<TArgsSchema, TGlobalArgs>) => TResult;\n cleanup?: (context: {\n args: ResolvedArgs<TArgsSchema, TGlobalArgs>;\n error?: Error | undefined;\n }) => void | Promise<void>;\n notes?: string;\n examples?: Example[];\n}\n\n/**\n * Config with run function (runnable command)\n */\nexport interface RunnableConfig<\n TArgsSchema extends ArgsSchema | undefined,\n TResult,\n TGlobalArgs,\n> extends DefineCommandConfig<TArgsSchema, TResult, TGlobalArgs> {\n run: (args: ResolvedArgs<TArgsSchema, TGlobalArgs>) => TResult;\n}\n\n/**\n * Config without run function (non-runnable command)\n */\nexport interface NonRunnableConfig<\n TArgsSchema extends ArgsSchema | undefined,\n TGlobalArgs,\n> extends Omit<DefineCommandConfig<TArgsSchema, void, TGlobalArgs>, \"run\"> {\n run?: undefined;\n}\n\n/**\n * Define a CLI command with type-safe arguments\n *\n * @param config - Command configuration\n * @returns A defined command with preserved type information\n *\n * @example\n * ```ts\n * import { z } from \"zod\";\n * import { arg, defineCommand } from \"politty\";\n *\n * const command = defineCommand({\n * name: \"greet\",\n * args: z.object({\n * name: arg(z.string(), { description: \"Name to greet\", positional: true }),\n * loud: arg(z.boolean().default(false), { alias: \"l\", description: \"Use uppercase\" }),\n * }),\n * run: (args) => {\n * const greeting = `Hello, ${args.name}!`;\n * console.log(args.loud ? greeting.toUpperCase() : greeting);\n * },\n * });\n *\n * // Type of command.argsSchema is preserved as z.ZodObject<...>\n * // Type of command.run is (args: { name: string; loud: boolean }) => void\n * ```\n *\n * @example\n * ```ts\n * // With discriminated union for subcommand-like behavior\n * const command = defineCommand({\n * name: \"resource\",\n * args: z.discriminatedUnion(\"action\", [\n * z.object({\n * action: z.literal(\"create\"),\n * name: arg(z.string(), { description: \"Resource name\" }),\n * }),\n * z.object({\n * action: z.literal(\"delete\"),\n * id: arg(z.coerce.number(), { description: \"Resource ID\" }),\n * }),\n * ]),\n * run: (args) => {\n * if (args.action === \"create\") {\n * console.log(`Creating ${args.name}`);\n * } else {\n * console.log(`Deleting ${args.id}`);\n * }\n * },\n * });\n * ```\n */\n// Overload 1: with run function - returns RunnableCommand with preserved schema type\nexport function defineCommand<\n TArgsSchema extends ArgsSchema | undefined = undefined,\n TResult = void,\n TGlobalArgs = GlobalArgs,\n>(\n config: RunnableConfig<TArgsSchema, TResult, TGlobalArgs>,\n): RunnableCommand<TArgsSchema, ResolvedArgs<TArgsSchema, TGlobalArgs>, TResult>;\n\n// Overload 2: without run function - returns NonRunnableCommand with preserved schema type\nexport function defineCommand<\n TArgsSchema extends ArgsSchema | undefined = undefined,\n TGlobalArgs = GlobalArgs,\n>(\n config: NonRunnableConfig<TArgsSchema, TGlobalArgs>,\n): NonRunnableCommand<TArgsSchema, ResolvedArgs<TArgsSchema, TGlobalArgs>>;\n\n// Implementation\nexport function defineCommand<\n TArgsSchema extends ArgsSchema | undefined = undefined,\n TResult = void,\n TGlobalArgs = GlobalArgs,\n>(\n config:\n | RunnableConfig<TArgsSchema, TResult, TGlobalArgs>\n | NonRunnableConfig<TArgsSchema, TGlobalArgs>,\n): Command<TArgsSchema, ResolvedArgs<TArgsSchema, TGlobalArgs>, TResult> {\n return {\n name: config.name,\n description: config.description,\n args: config.args as TArgsSchema,\n subCommands: config.subCommands,\n setup: config.setup,\n run: config.run,\n cleanup: config.cleanup,\n notes: config.notes,\n examples: config.examples,\n } as Command<TArgsSchema, ResolvedArgs<TArgsSchema, TGlobalArgs>, TResult>;\n}\n\n/**\n * Create a typed defineCommand factory with pre-bound global args type.\n * This is the recommended pattern for type-safe global options.\n *\n * @example\n * ```ts\n * // global-args.ts\n * type GlobalArgsType = { verbose: boolean; config?: string };\n * export const defineAppCommand = createDefineCommand<GlobalArgsType>();\n *\n * // commands/build.ts\n * export const buildCommand = defineAppCommand({\n * name: \"build\",\n * args: z.object({ output: arg(z.string().default(\"dist\")) }),\n * run: (args) => {\n * args.verbose; // typed via GlobalArgsType\n * args.output; // typed via local args\n * },\n * });\n * ```\n */\nexport function createDefineCommand<TGlobalArgs>(): {\n <TArgsSchema extends ArgsSchema | undefined = undefined, TResult = void>(\n config: RunnableConfig<TArgsSchema, TResult, TGlobalArgs>,\n ): RunnableCommand<TArgsSchema, ResolvedArgs<TArgsSchema, TGlobalArgs>, TResult>;\n <TArgsSchema extends ArgsSchema | undefined = undefined>(\n config: NonRunnableConfig<TArgsSchema, TGlobalArgs>,\n ): NonRunnableCommand<TArgsSchema, ResolvedArgs<TArgsSchema, TGlobalArgs>>;\n} {\n return defineCommand as ReturnType<typeof createDefineCommand<TGlobalArgs>>;\n}\n","/**\n * Shared value completion resolver\n *\n * Resolves value completion metadata from field information.\n * Used by both the static extractor and the dynamic context parser.\n */\n\nimport type { ValueCompletion } from \"./types.js\";\n\n/**\n * Minimal field interface needed for resolving value completion.\n * Both ResolvedFieldMeta and inline context-parser types satisfy this.\n */\nexport interface ValueCompletionField {\n completion?:\n | ({\n type?: string;\n custom?: { choices?: string[]; shellCommand?: string };\n } & ({ extensions?: string[]; matcher?: never } | { matcher?: string[]; extensions?: never }))\n | undefined;\n enumValues?: string[] | undefined;\n}\n\n/**\n * Resolve value completion from field metadata\n *\n * Priority:\n * 1. Explicit custom completion (choices or shellCommand)\n * 2. Explicit completion type (file, directory, none)\n * 3. Auto-detected enum values from schema\n */\nexport function resolveValueCompletion(field: ValueCompletionField): ValueCompletion | undefined {\n const meta = field.completion;\n\n // Priority 1: Explicit custom completion\n if (meta?.custom) {\n if (meta.custom.choices && meta.custom.choices.length > 0) {\n return { type: \"choices\", choices: meta.custom.choices };\n }\n if (meta.custom.shellCommand) {\n return { type: \"command\", shellCommand: meta.custom.shellCommand };\n }\n }\n\n // Priority 2: Explicit completion type\n if (meta?.type) {\n if (meta.type === \"file\") {\n if (meta.matcher) return { type: \"file\", matcher: meta.matcher };\n if (meta.extensions) return { type: \"file\", extensions: meta.extensions };\n return { type: \"file\" };\n }\n if (meta.type === \"directory\") {\n return { type: \"directory\" };\n }\n if (meta.type === \"none\") {\n return { type: \"none\" };\n }\n }\n\n // Priority 3: Auto-detect from enum schema\n if (field.enumValues && field.enumValues.length > 0) {\n return { type: \"choices\", choices: field.enumValues };\n }\n\n return undefined;\n}\n","/**\n * Extract completion data from commands\n */\n\nimport { extractFields, type ResolvedFieldMeta } from \"../core/schema-extractor.js\";\nimport { resolveSubCommandMeta } from \"../lazy.js\";\nimport type { AnyCommand, ArgsSchema } from \"../types.js\";\nimport type {\n CompletableOption,\n CompletablePositional,\n CompletableSubcommand,\n CompletionData,\n} from \"./types.js\";\nimport { resolveValueCompletion } from \"./value-completion-resolver.js\";\n\n/**\n * Sanitize a name for use as a shell function/variable identifier.\n * Replaces any character that is not alphanumeric or underscore with underscore.\n *\n * Note: This is not injective -- distinct names may produce the same output\n * (e.g., \"foo-bar\" and \"foo_bar\" both become \"foo_bar\"). When used for nested\n * path encoding (`path.map(sanitize).join(\"_\")`), cross-level collisions are\n * theoretically possible (e.g., \"foo-bar:baz\" vs \"foo:bar-baz\") but extremely\n * unlikely in real CLI designs. If collision-safety is needed, sanitize must be\n * replaced with an injective encoding.\n */\nexport function sanitize(name: string): string {\n return name.replace(/[^a-zA-Z0-9_]/g, \"_\");\n}\n\n/**\n * Filter subcommands to only visible (non-internal) ones.\n * Internal subcommands start with \"__\" and are hidden from completion/help.\n */\nexport function getVisibleSubs(subs: CompletableSubcommand[]): CompletableSubcommand[] {\n return subs.filter((s) => !s.name.startsWith(\"__\"));\n}\n\n/**\n * Convert a resolved field to a completable option\n */\nfunction fieldToOption(field: ResolvedFieldMeta): CompletableOption {\n return {\n name: field.name,\n cliName: field.cliName,\n alias: field.alias,\n description: field.description,\n // Booleans are flags that don't require a value\n takesValue: field.type !== \"boolean\",\n valueType: field.type,\n required: field.required,\n valueCompletion: resolveValueCompletion(field),\n };\n}\n\n/**\n * Extract options from a command's args schema\n */\nfunction extractOptions(command: AnyCommand): CompletableOption[] {\n if (!command.args) {\n return [];\n }\n\n const extracted = extractFields(command.args);\n return extracted.fields\n .filter((field) => !field.positional) // Only include flags/options, not positionals\n .map(fieldToOption);\n}\n\n/**\n * Extract positional arguments from a command\n */\nexport function extractPositionals(command: AnyCommand): ResolvedFieldMeta[] {\n if (!command.args) {\n return [];\n }\n\n const extracted = extractFields(command.args);\n return extracted.fields.filter((field) => field.positional);\n}\n\n/**\n * Extract completable positional arguments from a command\n */\nfunction extractCompletablePositionals(command: AnyCommand): CompletablePositional[] {\n if (!command.args) {\n return [];\n }\n\n const extracted = extractFields(command.args);\n return extracted.fields\n .filter((field) => field.positional)\n .map((field, index) => ({\n name: field.name,\n cliName: field.cliName,\n position: index,\n description: field.description,\n required: field.required,\n variadic: field.type === \"array\",\n valueCompletion: resolveValueCompletion(field),\n }));\n}\n\n/**\n * Extract a completable subcommand from a command\n */\nfunction extractSubcommand(name: string, command: AnyCommand): CompletableSubcommand {\n const subcommands: CompletableSubcommand[] = [];\n\n // Extract subcommands recursively (only sync subcommands for now)\n if (command.subCommands) {\n for (const [subName, subCommand] of Object.entries(command.subCommands)) {\n const resolved = resolveSubCommandMeta(subCommand);\n if (resolved) {\n subcommands.push(extractSubcommand(subName, resolved));\n } else {\n // Legacy async subcommands: placeholder only\n subcommands.push({\n name: subName,\n description: \"(lazy loaded)\",\n subcommands: [],\n options: [],\n positionals: [],\n });\n }\n }\n }\n\n return {\n name,\n description: command.description,\n subcommands,\n options: extractOptions(command),\n positionals: extractCompletablePositionals(command),\n };\n}\n\n/** Join parent and child with a separator, omitting separator when parent is empty. */\nfunction joinPrefix(parent: string, child: string, sep: string): string {\n return parent ? `${parent}${sep}${child}` : child;\n}\n\n/**\n * Collect opt-takes-value case entries for a subcommand tree.\n * Used by bash and zsh generators (identical case syntax: `path:--opt) return 0 ;;`).\n * parentPath is a colon-delimited path (e.g., \"\" for root, \"workspace:user\" for nested).\n */\nexport function optTakesValueEntries(sub: CompletableSubcommand, parentPath: string): string[] {\n const lines: string[] = [];\n for (const opt of sub.options) {\n if (opt.takesValue) {\n const patterns: string[] = [`${parentPath}:--${opt.cliName}`];\n if (opt.alias) patterns.push(`${parentPath}:-${opt.alias}`);\n lines.push(` ${patterns.join(\"|\")}) return 0 ;;`);\n }\n }\n for (const child of getVisibleSubs(sub.subcommands)) {\n lines.push(...optTakesValueEntries(child, joinPrefix(parentPath, child.name, \":\")));\n }\n return lines;\n}\n\n/**\n * Route entry for subcommand dispatch.\n * - pathStr: colon-delimited path (e.g., \"config:user:get\")\n * - funcSuffix: sanitized function suffix (e.g., \"config_user_get\")\n * - lookupPattern: \"parentPath:childName\" for is_subcmd matching (e.g., \"config:user:get\", or \":config\" for root-level)\n */\nexport interface RouteEntry {\n pathStr: string;\n funcSuffix: string;\n lookupPattern: string;\n}\n\n/**\n * Recursively collect all subcommand route entries.\n * Returns entries used by all shell generators for both dispatch routing\n * and subcommand lookup (is_subcmd) tables.\n */\nexport function collectRouteEntries(\n sub: CompletableSubcommand,\n parentPath = \"\",\n parentFunc = \"\",\n): RouteEntry[] {\n const entries: RouteEntry[] = [];\n for (const child of getVisibleSubs(sub.subcommands)) {\n const pathStr = joinPrefix(parentPath, child.name, \":\");\n const funcSuffix = joinPrefix(parentFunc, sanitize(child.name), \"_\");\n entries.push(...collectRouteEntries(child, pathStr, funcSuffix));\n entries.push({\n pathStr,\n funcSuffix,\n lookupPattern: `${parentPath}:${child.name}`,\n });\n }\n return entries;\n}\n\n/**\n * Generate is_subcmd case/switch body lines (bash/zsh case syntax).\n * Returns lines for the case statement body only (caller wraps in function).\n */\nexport function isSubcmdCaseLines(routeEntries: RouteEntry[]): string[] {\n return routeEntries.map((r) => ` ${r.lookupPattern}) return 0 ;;`);\n}\n\n/**\n * Recursively merge global options into a subcommand and all its descendants.\n * Avoids duplicates by checking existing option names.\n */\nfunction propagateGlobalOptions(\n sub: CompletableSubcommand,\n globalOptions: CompletableOption[],\n): void {\n const existingNames = new Set(sub.options.map((o) => o.name));\n const newOpts = globalOptions.filter((o) => !existingNames.has(o.name));\n sub.options = [...sub.options, ...newOpts];\n for (const child of sub.subcommands) {\n propagateGlobalOptions(child, globalOptions);\n }\n}\n\n/**\n * Extract completion data from a command tree\n *\n * @param command - The root command\n * @param programName - Program name for completion scripts\n * @param globalArgsSchema - Optional global args schema. When provided, global options\n * are derived from this schema instead of the root command's options.\n */\nexport function extractCompletionData(\n command: AnyCommand,\n programName: string,\n globalArgsSchema?: ArgsSchema,\n): CompletionData {\n const rootSubcommand = extractSubcommand(programName, command);\n\n // When globalArgsSchema is provided, derive global options from it\n // and merge them into all subcommands so shell generators include them at every level\n let globalOptions: CompletableOption[];\n if (globalArgsSchema) {\n const globalExtracted = extractFields(globalArgsSchema);\n globalOptions = globalExtracted.fields.filter((field) => !field.positional).map(fieldToOption);\n // Merge global options into all subcommands recursively\n propagateGlobalOptions(rootSubcommand, globalOptions);\n } else {\n // Default: global options are the options defined on the root command\n globalOptions = rootSubcommand.options;\n }\n\n return {\n command: rootSubcommand,\n programName,\n globalOptions,\n };\n}\n","/**\n * Bash completion script generator (static)\n *\n * Generates a self-contained bash completion script that embeds all\n * completion metadata. No Node.js process is spawned on TAB.\n */\n\nimport type { AnyCommand } from \"../types.js\";\nimport {\n collectRouteEntries,\n extractCompletionData,\n getVisibleSubs,\n isSubcmdCaseLines,\n optTakesValueEntries,\n sanitize,\n} from \"./extractor.js\";\nimport type {\n CompletableOption,\n CompletablePositional,\n CompletableSubcommand,\n CompletionOptions,\n CompletionResult,\n ValueCompletion,\n} from \"./types.js\";\n\n/** Escape a string for use inside bash double-quotes */\nfunction escapeBashDQ(s: string): string {\n return s.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"').replace(/\\$/g, \"\\\\$\").replace(/`/g, \"\\\\`\");\n}\n\n/**\n * Generate bash value completion code for a ValueCompletion spec.\n * Returns an array of bash lines.\n */\nfunction bashValueLines(vc: ValueCompletion | undefined, inline: boolean): string[] {\n if (!vc) return [];\n\n switch (vc.type) {\n case \"choices\": {\n const items = vc.choices!.map((c) => `\"${escapeBashDQ(c)}\"`).join(\" \");\n if (inline) {\n return [\n `local -a _choices=(${items})`,\n `COMPREPLY=()`,\n `local _c; for _c in \"\\${_choices[@]}\"; do [[ \"$_c\" == \"$_cur\"* ]] && COMPREPLY+=(\"\\${_inline_prefix}\\${_c}\"); done`,\n `compopt -o nospace`,\n `compopt +o default 2>/dev/null`,\n ];\n }\n return [\n `local -a _choices=(${items})`,\n `COMPREPLY=()`,\n `local _c; for _c in \"\\${_choices[@]}\"; do [[ \"$_c\" == \"$_cur\"* ]] && COMPREPLY+=(\"$_c\"); done`,\n `compopt +o default 2>/dev/null`,\n ];\n }\n case \"file\": {\n if (vc.matcher?.length) {\n const checks = vc.matcher.map((p) => `[[ \"\\${_f##*/}\" == ${p} ]]`).join(\" || \");\n return bashFileFilter(checks, inline);\n }\n if (vc.extensions?.length) {\n const checks = vc.extensions.map((ext) => `[[ \"$_f\" == *\".${ext}\" ]]`).join(\" || \");\n return bashFileFilter(checks, inline);\n }\n if (inline) {\n return [\n `local -a _entries=($(compgen -f -- \"$_cur\"))`,\n `COMPREPLY=(\"\\${_entries[@]/#/$_inline_prefix}\")`,\n `compopt -o filenames`,\n ];\n }\n return [`COMPREPLY=($(compgen -f -- \"$_cur\"))`, `compopt -o filenames`];\n }\n case \"directory\": {\n if (inline) {\n return [\n `local -a _dirs=($(compgen -d -- \"$_cur\"))`,\n `COMPREPLY=(\"\\${_dirs[@]/#/$_inline_prefix}\")`,\n `compopt -o filenames`,\n ];\n }\n return [`COMPREPLY=($(compgen -d -- \"$_cur\"))`, `compopt -o filenames`];\n }\n case \"command\": {\n const cmd = vc.shellCommand!;\n if (inline) {\n return [`COMPREPLY=($(compgen -P \"$_inline_prefix\" -W \"$(${cmd})\" -- \"$_cur\"))`];\n }\n return [`COMPREPLY=($(compgen -W \"$(${cmd})\" -- \"$_cur\"))`];\n }\n case \"none\":\n return [`compopt +o default 2>/dev/null`];\n }\n}\n\nfunction bashFileFilter(checks: string, inline: boolean): string[] {\n const prefix = inline ? `\"\\${_inline_prefix}$_f\"` : `\"$_f\"`;\n return [\n `local -a _all_entries=($(compgen -f -- \"$_cur\"))`,\n `for _f in \"\\${_all_entries[@]}\"; do`,\n ` if [[ -d \"$_f\" ]]; then`,\n ` COMPREPLY+=(${prefix})`,\n ` elif ${checks}; then`,\n ` COMPREPLY+=(${prefix})`,\n ` fi`,\n `done`,\n `compopt -o filenames`,\n `compopt +o default 2>/dev/null`,\n ];\n}\n\n/** Collect value-taking option patterns for case matching */\nfunction optionValueCases(options: CompletableOption[], inline: boolean): string[] {\n const lines: string[] = [];\n for (const opt of options) {\n if (!opt.takesValue || !opt.valueCompletion) continue;\n const valLines = bashValueLines(opt.valueCompletion, inline);\n if (valLines.length === 0) continue;\n\n const patterns: string[] = [`--${opt.cliName}`];\n if (opt.alias) patterns.push(`-${opt.alias}`);\n const patternStr = patterns.join(\"|\");\n\n lines.push(` ${patternStr})`);\n for (const vl of valLines) {\n lines.push(` ${vl}`);\n }\n lines.push(` return ;;`);\n }\n return lines;\n}\n\n/** Generate positional completion block */\nfunction positionalBlock(positionals: CompletablePositional[]): string[] {\n if (positionals.length === 0) return [];\n const lines: string[] = [];\n lines.push(` case \"$_pos_count\" in`);\n\n for (const pos of positionals) {\n if (pos.variadic) {\n // Variadic: use * to match any position from this index onward\n lines.push(` ${pos.position}|*)`);\n } else {\n lines.push(` ${pos.position})`);\n }\n for (const vl of bashValueLines(pos.valueCompletion, false)) {\n lines.push(` ${vl}`);\n }\n lines.push(` ;;`);\n }\n\n lines.push(` esac`);\n return lines;\n}\n\n/** Generate prev/inline value completion blocks for options */\nfunction valueCompletionBlocks(options: CompletableOption[]): string[] {\n if (!options.some((o) => o.takesValue && o.valueCompletion)) return [];\n\n const lines: string[] = [];\n const prevCases = optionValueCases(options, false);\n if (prevCases.length > 0) {\n lines.push(` if [[ -z \"$_inline_prefix\" ]]; then`);\n lines.push(` case \"$_prev\" in`);\n lines.push(...prevCases);\n lines.push(` esac`);\n lines.push(` fi`);\n }\n const inlineCases = optionValueCases(options, true);\n if (inlineCases.length > 0) {\n lines.push(` if [[ -n \"$_inline_prefix\" ]]; then`);\n lines.push(` case \"\\${_inline_prefix%=}\" in`);\n lines.push(...inlineCases);\n lines.push(` esac`);\n lines.push(` fi`);\n }\n return lines;\n}\n\n/** Generate available-options list lines */\nfunction availableOptionLines(options: CompletableOption[], fn: string): string[] {\n const lines: string[] = [];\n for (const opt of options) {\n if (opt.valueType === \"array\") {\n // Array options can be specified multiple times — always keep available\n lines.push(` _avail+=(--${opt.cliName})`);\n } else {\n const patterns: string[] = [`\"--${opt.cliName}\"`];\n if (opt.alias) patterns.push(`\"-${opt.alias}\"`);\n lines.push(` __${fn}_not_used ${patterns.join(\" \")} && _avail+=(--${opt.cliName})`);\n }\n }\n lines.push(` __${fn}_not_used \"--help\" && _avail+=(--help)`);\n return lines;\n}\n\n/**\n * Generate a per-subcommand completion function.\n * Recursively generates functions for nested subcommands.\n */\nfunction generateSubHandler(sub: CompletableSubcommand, fn: string, path: string[]): string[] {\n const fullPath = [...path, sub.name];\n const funcName = `__${fn}_complete_${fullPath.map(sanitize).join(\"_\")}`;\n const visibleSubs = getVisibleSubs(sub.subcommands);\n\n const lines: string[] = [];\n\n // Recursively generate handlers for child subcommands\n for (const child of visibleSubs) {\n lines.push(...generateSubHandler(child, fn, fullPath));\n }\n\n lines.push(`${funcName}() {`);\n\n // 1. Option value completion (prev is value-taking option)\n lines.push(...valueCompletionBlocks(sub.options));\n\n // Fallback: value-taking option without explicit completion → default file completion\n const fullPathStr = fullPath.join(\":\");\n lines.push(\n ` if [[ -z \"$_inline_prefix\" ]] && __${fn}_opt_takes_value \"${fullPathStr}\" \"$_prev\"; then return; fi`,\n );\n lines.push(\n ` if [[ -n \"$_inline_prefix\" ]] && __${fn}_opt_takes_value \"${fullPathStr}\" \"\\${_inline_prefix%=}\"; then return; fi`,\n );\n\n // 2. After -- separator\n if (sub.positionals.length > 0) {\n lines.push(` if (( _after_dd )); then`);\n lines.push(...positionalBlock(sub.positionals).map((l) => ` ${l}`));\n lines.push(` return`);\n lines.push(` fi`);\n } else {\n lines.push(` if (( _after_dd )); then return; fi`);\n }\n\n // 3. Option name completion\n lines.push(` if [[ \"$_cur\" == -* ]]; then`);\n lines.push(` local -a _avail=()`);\n lines.push(...availableOptionLines(sub.options, fn));\n lines.push(` COMPREPLY=($(compgen -W \"\\${_avail[*]}\" -- \"$_cur\"))`);\n lines.push(` compopt +o default 2>/dev/null`);\n lines.push(` return`);\n lines.push(` fi`);\n\n // 4. Subcommand or positional completion\n if (visibleSubs.length > 0) {\n const subNames = visibleSubs.map((s) => s.name).join(\" \");\n lines.push(` COMPREPLY=($(compgen -W \"${subNames}\" -- \"$_cur\"))`);\n lines.push(` compopt +o default 2>/dev/null`);\n } else if (sub.positionals.length > 0) {\n lines.push(...positionalBlock(sub.positionals));\n }\n\n lines.push(`}`);\n lines.push(``);\n return lines;\n}\n\nexport function generateBashCompletion(\n command: AnyCommand,\n options: CompletionOptions,\n): CompletionResult {\n const { programName } = options;\n const data = extractCompletionData(command, programName, options.globalArgsSchema);\n const fn = sanitize(programName);\n const root = data.command;\n const visibleSubs = getVisibleSubs(root.subcommands);\n\n const lines: string[] = [];\n lines.push(`# Bash completion for ${programName}`);\n lines.push(`# Generated by politty`);\n lines.push(``);\n\n // Helper: check if option is already used\n lines.push(`__${fn}_not_used() {`);\n lines.push(` for _u in \"\\${_used_opts[@]}\"; do`);\n lines.push(` for _chk in \"$@\"; do`);\n lines.push(` [[ \"$_u\" == \"$_chk\" ]] && return 1`);\n lines.push(` done`);\n lines.push(` done`);\n lines.push(` return 0`);\n lines.push(`}`);\n lines.push(``);\n\n // Helper: check if option takes a value\n lines.push(`__${fn}_opt_takes_value() {`);\n lines.push(` case \"$1:$2\" in`);\n lines.push(...optTakesValueEntries(root, \"\"));\n lines.push(` esac`);\n lines.push(` return 1`);\n lines.push(`}`);\n lines.push(``);\n\n // Collect all nested subcommand routes (used for both is_subcmd and dispatch)\n const routeEntries = collectRouteEntries(root);\n\n // Helper: check if a word is a known subcommand at the current path level\n if (routeEntries.length > 0) {\n lines.push(`__${fn}_is_subcmd() {`);\n lines.push(` case \"$1:$2\" in`);\n lines.push(...isSubcmdCaseLines(routeEntries));\n lines.push(` esac`);\n lines.push(` return 1`);\n lines.push(`}`);\n lines.push(``);\n }\n\n // Per-subcommand completion functions\n for (const sub of visibleSubs) {\n lines.push(...generateSubHandler(sub, fn, []));\n }\n\n // Root handler\n lines.push(`__${fn}_complete_root() {`);\n lines.push(...valueCompletionBlocks(root.options));\n // Fallback: value-taking option without explicit completion → default file completion\n lines.push(\n ` if [[ -z \"$_inline_prefix\" ]] && __${fn}_opt_takes_value \"\" \"$_prev\"; then return; fi`,\n );\n lines.push(\n ` if [[ -n \"$_inline_prefix\" ]] && __${fn}_opt_takes_value \"\" \"\\${_inline_prefix%=}\"; then return; fi`,\n );\n if (root.positionals.length > 0) {\n lines.push(` if (( _after_dd )); then`);\n lines.push(...positionalBlock(root.positionals).map((l) => ` ${l}`));\n lines.push(` return`);\n lines.push(` fi`);\n } else {\n lines.push(` if (( _after_dd )); then return; fi`);\n }\n lines.push(` if [[ \"$_cur\" == -* ]]; then`);\n lines.push(` local -a _avail=()`);\n lines.push(...availableOptionLines(root.options, fn));\n lines.push(` COMPREPLY=($(compgen -W \"\\${_avail[*]}\" -- \"$_cur\"))`);\n lines.push(` compopt +o default 2>/dev/null`);\n if (visibleSubs.length > 0) {\n lines.push(` else`);\n const subNames = visibleSubs.map((s) => s.name).join(\" \");\n lines.push(` COMPREPLY=($(compgen -W \"${subNames}\" -- \"$_cur\"))`);\n lines.push(` compopt +o default 2>/dev/null`);\n } else if (root.positionals.length > 0) {\n lines.push(` else`);\n lines.push(...positionalBlock(root.positionals).map((l) => ` ${l}`));\n }\n lines.push(` fi`);\n lines.push(`}`);\n lines.push(``);\n\n // Main completion function -- subcommand dispatch routing\n const subRouting = routeEntries\n .map((r) => ` ${r.pathStr}) __${fn}_complete_${r.funcSuffix} ;;`)\n .join(\"\\n\");\n\n lines.push(`_${fn}_completions() {`);\n lines.push(` COMPREPLY=()`);\n lines.push(``);\n lines.push(` # Rejoin words split by '=' in COMP_WORDBREAKS`);\n lines.push(` local -a _words=()`);\n lines.push(` local _i=1`);\n lines.push(` while (( _i <= COMP_CWORD )); do`);\n lines.push(` if [[ \"\\${COMP_WORDS[_i]}\" == \"=\" && \\${#_words[@]} -gt 0 ]]; then`);\n lines.push(` _words[\\${#_words[@]}-1]+=\"=\\${COMP_WORDS[_i+1]:-}\"`);\n lines.push(` (( _i += 2 ))`);\n lines.push(` else`);\n lines.push(` _words+=(\"\\${COMP_WORDS[_i]}\")`);\n lines.push(` (( _i++ ))`);\n lines.push(` fi`);\n lines.push(` done`);\n lines.push(``);\n lines.push(` local _cur=\"\"`);\n lines.push(` (( \\${#_words[@]} > 0 )) && _cur=\"\\${_words[\\${#_words[@]}-1]}\"`);\n lines.push(``);\n lines.push(` local _inline_prefix=\"\"`);\n lines.push(` if [[ \"$_cur\" == --*=* ]]; then`);\n lines.push(` _inline_prefix=\"\\${_cur%%=*}=\"`);\n lines.push(` _cur=\"\\${_cur#*=}\"`);\n lines.push(` fi`);\n lines.push(``);\n lines.push(` local _prev=\"\"`);\n lines.push(` (( \\${#_words[@]} > 1 )) && _prev=\"\\${_words[\\${#_words[@]}-2]}\"`);\n lines.push(``);\n lines.push(` local _subcmd=\"\" _after_dd=0 _pos_count=0 _skip_next=0`);\n lines.push(` local -a _used_opts=()`);\n lines.push(``);\n lines.push(` local _j=0`);\n lines.push(` while (( _j < \\${#_words[@]} - 1 )); do`);\n lines.push(` local _w=\"\\${_words[_j]}\"`);\n lines.push(` if (( _skip_next )); then _skip_next=0; (( _j++ )); continue; fi`);\n lines.push(` if [[ \"$_w\" == \"--\" ]]; then _after_dd=1; (( _j++ )); continue; fi`);\n lines.push(` if (( _after_dd )); then (( _pos_count++ )); (( _j++ )); continue; fi`);\n lines.push(\n ` if [[ \"$_w\" == --*=* ]]; then _used_opts+=(\"\\${_w%%=*}\"); (( _j++ )); continue; fi`,\n );\n lines.push(` if [[ \"$_w\" == -* ]]; then`);\n lines.push(` _used_opts+=(\"$_w\")`);\n lines.push(` __${fn}_opt_takes_value \"$_subcmd\" \"$_w\" && _skip_next=1`);\n lines.push(` (( _j++ )); continue`);\n lines.push(` fi`);\n if (routeEntries.length > 0) {\n lines.push(\n ` if __${fn}_is_subcmd \"$_subcmd\" \"$_w\"; then _subcmd=\"\\${_subcmd:+\\${_subcmd}:}$_w\"; _used_opts=(); _pos_count=0; else (( _pos_count++ )); fi`,\n );\n } else {\n lines.push(` (( _pos_count++ ))`);\n }\n lines.push(` (( _j++ ))`);\n lines.push(` done`);\n lines.push(``);\n lines.push(` case \"$_subcmd\" in`);\n lines.push(subRouting);\n lines.push(` *) __${fn}_complete_root ;;`);\n lines.push(` esac`);\n lines.push(`}`);\n lines.push(``);\n lines.push(`complete -o default -F _${fn}_completions ${programName}`);\n lines.push(``);\n\n return {\n script: lines.join(\"\\n\"),\n shell: \"bash\",\n installInstructions: `# To enable completions, add the following to your ~/.bashrc:\n\n# Option 1: Source directly\neval \"$(${programName} completion bash)\"\n\n# Option 2: Save to a file\n${programName} completion bash > ~/.local/share/bash-completion/completions/${programName}\n\n# Then reload your shell or run:\nsource ~/.bashrc`,\n };\n}\n","/**\n * Generate completion candidates based on context\n */\n\nimport { execSync } from \"node:child_process\";\nimport { resolveSubCommandMeta } from \"../../lazy.js\";\nimport type { ValueCompletion } from \"../types.js\";\nimport type { CompletionContext } from \"./context-parser.js\";\n\n/**\n * Completion directive flags (bitwise)\n */\nexport const CompletionDirective = {\n /** Default completion behavior */\n Default: 0,\n /** Don't add space after completion */\n NoSpace: 1,\n /** Don't offer file completion (even if no other completions) */\n NoFileCompletion: 2,\n /** Filter completions using current word as prefix */\n FilterPrefix: 4,\n /** Keep the order of completions */\n KeepOrder: 8,\n /** Trigger file completion */\n FileCompletion: 16,\n /** Trigger directory completion */\n DirectoryCompletion: 32,\n /** Error occurred during completion */\n Error: 64,\n} as const;\n\n/**\n * A completion candidate\n */\nexport interface CompletionCandidate {\n /** The completion value */\n value: string;\n /** Optional description */\n description?: string | undefined;\n /** Type hint for display purposes */\n type?: \"option\" | \"subcommand\" | \"value\" | \"file\" | \"directory\";\n}\n\n/**\n * Result of candidate generation\n */\nexport interface CandidateResult {\n /** Completion candidates */\n candidates: CompletionCandidate[];\n /** Directive flags for shell behavior */\n directive: number;\n /** File extensions for shell-native filtering (e.g., [\"json\", \"yaml\"]) */\n fileExtensions?: string[] | undefined;\n /** Glob patterns for shell-native file matching (e.g., [\".env.*\"]) */\n fileMatchers?: string[] | undefined;\n}\n\n/**\n * Generate completion candidates based on context\n */\nexport function generateCandidates(context: CompletionContext): CandidateResult {\n const candidates: CompletionCandidate[] = [];\n let directive = CompletionDirective.Default;\n\n switch (context.completionType) {\n case \"subcommand\":\n return generateSubcommandCandidates(context);\n\n case \"option-name\":\n return generateOptionNameCandidates(context);\n\n case \"option-value\":\n return generateOptionValueCandidates(context);\n\n case \"positional\":\n return generatePositionalCandidates(context);\n\n default:\n return { candidates, directive };\n }\n}\n\n/**\n * Execute a shell command and return results as candidates\n */\nfunction executeShellCommand(command: string): CompletionCandidate[] {\n try {\n const output = execSync(command, { encoding: \"utf-8\", timeout: 5000 });\n return output\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n .map((line) => ({ value: line, type: \"value\" as const }));\n } catch {\n return [];\n }\n}\n\n/**\n * Result of resolving value candidates\n */\ntype ValueResolutionResult = Pick<CandidateResult, \"directive\" | \"fileExtensions\" | \"fileMatchers\">;\n\n/**\n * Resolve value completion, executing shell commands and file lookups in JS\n */\nfunction resolveValueCandidates(\n vc: ValueCompletion,\n candidates: CompletionCandidate[],\n _currentWord: string,\n description?: string,\n): ValueResolutionResult {\n let directive = CompletionDirective.FilterPrefix;\n let fileExtensions: string[] | undefined;\n let fileMatchers: string[] | undefined;\n\n switch (vc.type) {\n case \"choices\":\n if (vc.choices) {\n for (const choice of vc.choices) {\n candidates.push({\n value: choice,\n description,\n type: \"value\",\n });\n }\n }\n directive |= CompletionDirective.NoFileCompletion;\n break;\n\n case \"file\":\n if (vc.matcher && vc.matcher.length > 0) {\n // Delegate to shell with glob matcher metadata\n fileMatchers = vc.matcher.filter((m) => m.trim().length > 0);\n if (fileMatchers.length === 0) {\n fileMatchers = undefined;\n directive |= CompletionDirective.FileCompletion;\n }\n } else if (vc.extensions && vc.extensions.length > 0) {\n // Delegate to shell with extension filter metadata\n fileExtensions = Array.from(\n new Set(\n vc.extensions\n .map((ext) => ext.trim().replace(/^\\./, \"\"))\n .filter((ext) => ext.length > 0),\n ),\n );\n if (fileExtensions.length === 0) {\n // All extensions were invalid → treat as unfiltered file completion\n fileExtensions = undefined;\n directive |= CompletionDirective.FileCompletion;\n }\n } else {\n // No extensions or matchers: let shell handle native file completion\n directive |= CompletionDirective.FileCompletion;\n }\n break;\n\n case \"directory\":\n directive |= CompletionDirective.DirectoryCompletion;\n break;\n\n case \"command\":\n // Execute shell command in JS and add results as candidates\n if (vc.shellCommand) {\n candidates.push(...executeShellCommand(vc.shellCommand));\n }\n directive |= CompletionDirective.NoFileCompletion;\n break;\n\n case \"none\":\n directive |= CompletionDirective.NoFileCompletion;\n break;\n }\n\n return { directive, fileExtensions, fileMatchers };\n}\n\n/**\n * Generate subcommand candidates\n */\nfunction generateSubcommandCandidates(context: CompletionContext): CandidateResult {\n const candidates: CompletionCandidate[] = [];\n let directive = CompletionDirective.FilterPrefix;\n\n // Add subcommands\n for (const name of context.subcommands) {\n const sub = context.currentCommand.subCommands?.[name];\n const description = sub ? resolveSubCommandMeta(sub)?.description : undefined;\n\n candidates.push({\n value: name,\n description,\n type: \"subcommand\",\n });\n }\n\n // Add options when no subcommands exist, or when typing an option prefix\n if (candidates.length === 0 || context.currentWord.startsWith(\"-\")) {\n const optionResult = generateOptionNameCandidates(context);\n candidates.push(...optionResult.candidates);\n }\n\n return { candidates, directive };\n}\n\n/**\n * Generate option name candidates\n */\nfunction generateOptionNameCandidates(context: CompletionContext): CandidateResult {\n const candidates: CompletionCandidate[] = [];\n const directive = CompletionDirective.FilterPrefix;\n\n // Filter out already used options\n const availableOptions = context.options.filter((opt) => {\n // Array options can be specified multiple times, so keep them available.\n if (opt.valueType === \"array\") {\n return true;\n }\n\n return !context.usedOptions.has(opt.cliName) && !context.usedOptions.has(opt.alias || \"\");\n });\n\n for (const opt of availableOptions) {\n candidates.push({\n value: `--${opt.cliName}`,\n description: opt.description,\n type: \"option\",\n });\n }\n\n // Add help option if not already used\n if (!context.usedOptions.has(\"help\")) {\n candidates.push({\n value: \"--help\",\n description: \"Show help information\",\n type: \"option\",\n });\n }\n\n return { candidates, directive };\n}\n\n/**\n * Generate option value candidates\n */\nfunction generateOptionValueCandidates(context: CompletionContext): CandidateResult {\n const candidates: CompletionCandidate[] = [];\n\n if (!context.targetOption) {\n return { candidates, directive: CompletionDirective.FilterPrefix };\n }\n\n const vc = context.targetOption.valueCompletion;\n if (!vc) {\n return { candidates, directive: CompletionDirective.FilterPrefix };\n }\n\n return { candidates, ...resolveValueCandidates(vc, candidates, context.currentWord) };\n}\n\n/**\n * Generate positional argument candidates\n */\nfunction generatePositionalCandidates(context: CompletionContext): CandidateResult {\n const candidates: CompletionCandidate[] = [];\n\n // Get the positional at current index, clamping to last (variadic) positional\n const positionalIndex = context.positionalIndex ?? 0;\n const positional =\n context.positionals[positionalIndex] ??\n (context.positionals.at(-1)?.variadic ? context.positionals.at(-1) : undefined);\n\n if (!positional) {\n return { candidates, directive: CompletionDirective.FilterPrefix };\n }\n\n const vc = positional.valueCompletion;\n if (!vc) {\n return { candidates, directive: CompletionDirective.FilterPrefix };\n }\n\n return {\n candidates,\n ...resolveValueCandidates(vc, candidates, context.currentWord, positional.description),\n };\n}\n","/**\n * Parse completion context from partial command line\n */\n\nimport { extractFields } from \"../../core/schema-extractor.js\";\nimport { resolveSubCommandMeta } from \"../../lazy.js\";\nimport type { AnyCommand } from \"../../types.js\";\nimport type { CompletableOption, CompletablePositional } from \"../types.js\";\nimport { resolveValueCompletion } from \"../value-completion-resolver.js\";\n\n/**\n * Completion type indicates what kind of completion is expected\n */\nexport type CompletionType =\n | \"subcommand\" // Completing a subcommand name\n | \"option-name\" // Completing an option name (--xxx, -x)\n | \"option-value\" // Completing an option's value\n | \"positional\"; // Completing a positional argument\n\n/**\n * Context for completion at current cursor position\n */\nexport interface CompletionContext {\n /** Subcommand path from root (e.g., [\"plugin\", \"add\"]) */\n subcommandPath: string[];\n /** The resolved command at current path */\n currentCommand: AnyCommand;\n /** Current word being typed (may be partial) */\n currentWord: string;\n /** Previous word (useful for option value detection) */\n previousWord: string;\n /** What type of completion is expected */\n completionType: CompletionType;\n /** Target option when completing option value */\n targetOption?: CompletableOption | undefined;\n /** Positional index when completing positional argument */\n positionalIndex?: number | undefined;\n /** Available options for current command */\n options: CompletableOption[];\n /** Available subcommands */\n subcommands: string[];\n /** Available positionals */\n positionals: CompletablePositional[];\n /** Options already used (to avoid duplicates) */\n usedOptions: Set<string>;\n /** Number of positional arguments already provided */\n providedPositionalCount: number;\n}\n\n/**\n * Extract options from a command\n */\nfunction extractOptions(command: AnyCommand): CompletableOption[] {\n if (!command.args) {\n return [];\n }\n\n const extracted = extractFields(command.args);\n return extracted.fields\n .filter((field) => !field.positional)\n .map((field) => ({\n name: field.name,\n cliName: field.cliName,\n alias: field.alias,\n description: field.description,\n takesValue: field.type !== \"boolean\",\n valueType: field.type,\n required: field.required,\n valueCompletion: resolveValueCompletion(field),\n }));\n}\n\n/**\n * Extract positionals from a command\n */\nfunction extractPositionalsForContext(command: AnyCommand): CompletablePositional[] {\n if (!command.args) {\n return [];\n }\n\n const extracted = extractFields(command.args);\n return extracted.fields\n .filter((field) => field.positional)\n .map((field, index) => ({\n name: field.name,\n cliName: field.cliName,\n position: index,\n description: field.description,\n required: field.required,\n variadic: field.type === \"array\",\n valueCompletion: resolveValueCompletion(field),\n }));\n}\n\n/**\n * Get subcommand names from a command\n */\nfunction getSubcommandNames(command: AnyCommand): string[] {\n if (!command.subCommands) {\n return [];\n }\n // Filter out internal subcommands (e.g., __complete)\n return Object.keys(command.subCommands).filter((name) => !name.startsWith(\"__\"));\n}\n\n/**\n * Resolve subcommand by name\n */\nfunction resolveSubcommand(command: AnyCommand, name: string): AnyCommand | null {\n if (!command.subCommands) {\n return null;\n }\n\n const sub = command.subCommands[name];\n if (!sub) {\n return null;\n }\n\n return resolveSubCommandMeta(sub);\n}\n\n/**\n * Check if a word is an option (starts with - or --)\n */\nfunction isOption(word: string): boolean {\n return word.startsWith(\"-\");\n}\n\n/**\n * Parse option name from word (e.g., \"--foo=bar\" -> \"foo\", \"-v\" -> \"v\")\n */\nfunction parseOptionName(word: string): string {\n if (word.startsWith(\"--\")) {\n const withoutPrefix = word.slice(2);\n const eqIndex = withoutPrefix.indexOf(\"=\");\n return eqIndex >= 0 ? withoutPrefix.slice(0, eqIndex) : withoutPrefix;\n }\n if (word.startsWith(\"-\")) {\n return word.slice(1, 2); // First char after -\n }\n return word;\n}\n\n/**\n * Check if option has inline value (e.g., \"--foo=bar\")\n */\nfunction hasInlineValue(word: string): boolean {\n return word.includes(\"=\");\n}\n\n/**\n * Find option by name or alias\n */\nfunction findOption(\n options: CompletableOption[],\n nameOrAlias: string,\n): CompletableOption | undefined {\n return options.find((opt) => opt.cliName === nameOrAlias || opt.alias === nameOrAlias);\n}\n\n/**\n * Parse completion context from command line arguments\n *\n * @param argv - Arguments after the program name (e.g., [\"build\", \"--fo\"])\n * @param rootCommand - The root command\n * @returns Completion context\n */\nexport function parseCompletionContext(argv: string[], rootCommand: AnyCommand): CompletionContext {\n // Initialize with root command\n let currentCommand = rootCommand;\n const subcommandPath: string[] = [];\n\n // Track used options and positional count\n const usedOptions = new Set<string>();\n let positionalCount = 0;\n\n // Process arguments to resolve subcommands and track state\n let i = 0;\n let options = extractOptions(currentCommand);\n let afterDoubleDash = false;\n\n // Traverse subcommands\n while (i < argv.length - 1) {\n const word = argv[i]!;\n\n // \"--\" marks the end of option parsing\n if (!afterDoubleDash && word === \"--\") {\n afterDoubleDash = true;\n i++;\n continue;\n }\n\n // Skip options and their values (before \"--\")\n if (!afterDoubleDash && isOption(word)) {\n const optName = parseOptionName(word);\n const opt = findOption(options, optName);\n\n if (opt) {\n usedOptions.add(opt.cliName);\n if (opt.alias) usedOptions.add(opt.alias);\n\n // Skip next word if option takes value and doesn't have inline value\n if (opt.takesValue && !hasInlineValue(word)) {\n i++;\n }\n }\n i++;\n continue;\n }\n\n // Check if this is a subcommand (before \"--\")\n const subcommand = afterDoubleDash ? null : resolveSubcommand(currentCommand, word);\n if (subcommand) {\n subcommandPath.push(word);\n currentCommand = subcommand;\n options = extractOptions(currentCommand);\n usedOptions.clear(); // Reset for new subcommand\n positionalCount = 0;\n i++;\n continue;\n }\n\n // Otherwise it's a positional argument\n positionalCount++;\n i++;\n }\n\n // Get current and previous word\n const currentWord: string = argv[argv.length - 1] ?? \"\";\n const previousWord: string = argv[argv.length - 2] ?? \"\";\n\n // Extract data for current command\n const positionals = extractPositionalsForContext(currentCommand);\n const subcommands = getSubcommandNames(currentCommand);\n\n // Determine completion type\n let completionType: CompletionType;\n let targetOption: CompletableOption | undefined;\n let positionalIndex: number | undefined;\n\n // Case 1: Previous word is an option that takes a value\n if (!afterDoubleDash && previousWord && isOption(previousWord) && !hasInlineValue(previousWord)) {\n const optName = parseOptionName(previousWord);\n const opt = findOption(options, optName);\n if (opt && opt.takesValue) {\n completionType = \"option-value\";\n targetOption = opt;\n } else if (currentWord.startsWith(\"-\")) {\n // Previous word is boolean flag, current word starts with - → option name\n completionType = \"option-name\";\n } else {\n completionType = determineDefaultCompletionType(\n currentWord,\n subcommands,\n positionals,\n positionalCount,\n );\n if (completionType === \"positional\") {\n positionalIndex = positionalCount;\n }\n }\n }\n // Case 2: Current word is an option with inline value (--foo=)\n else if (!afterDoubleDash && currentWord.startsWith(\"--\") && hasInlineValue(currentWord)) {\n const optName = parseOptionName(currentWord);\n const opt = findOption(options, optName);\n if (opt && opt.takesValue) {\n completionType = \"option-value\";\n targetOption = opt;\n } else {\n completionType = \"option-name\";\n }\n }\n // Case 3: Current word starts with - (completing option name)\n else if (!afterDoubleDash && currentWord.startsWith(\"-\")) {\n completionType = \"option-name\";\n }\n // Case 4: Determine based on available subcommands and positionals\n else {\n completionType = determineDefaultCompletionType(\n currentWord,\n subcommands,\n positionals,\n positionalCount,\n afterDoubleDash,\n );\n if (completionType === \"positional\") {\n positionalIndex = positionalCount;\n }\n }\n\n return {\n subcommandPath,\n currentCommand,\n currentWord,\n previousWord,\n completionType,\n targetOption,\n positionalIndex,\n options,\n subcommands,\n positionals,\n usedOptions,\n providedPositionalCount: positionalCount,\n };\n}\n\n/**\n * Determine default completion type when not completing an option\n */\nfunction determineDefaultCompletionType(\n currentWord: string,\n subcommands: string[],\n positionals: CompletablePositional[],\n positionalCount: number,\n afterDoubleDash?: boolean,\n): CompletionType {\n // After --, everything is positional — never suggest subcommands or options\n if (afterDoubleDash) {\n return \"positional\";\n }\n\n // If there are subcommands and current word might match one, suggest subcommands\n if (subcommands.length > 0) {\n // Check if any subcommand starts with current word\n const matchingSubcommands = subcommands.filter((s) => s.startsWith(currentWord));\n if (matchingSubcommands.length > 0 || currentWord === \"\") {\n return \"subcommand\";\n }\n }\n\n // If there are positionals to complete\n if (positionalCount < positionals.length) {\n return \"positional\";\n }\n\n // If the last positional is variadic (array), continue with positional\n if (positionals.length > 0 && positionals[positionals.length - 1]!.variadic) {\n return \"positional\";\n }\n\n // Default to subcommand (will show options too)\n return \"subcommand\";\n}\n","/**\n * Shell-specific output formatter for completion candidates\n *\n * Formats completion candidates into shell-native output so that\n * shell scripts can consume them with minimal parsing logic.\n */\n\nimport type { ShellType } from \"../types.js\";\nimport {\n CompletionDirective,\n type CandidateResult,\n type CompletionCandidate,\n} from \"./candidate-generator.js\";\n\n/**\n * Options for shell-specific formatting\n */\nexport interface ShellFormatOptions {\n /** Target shell type */\n shell: ShellType;\n /** Current word being completed (used for prefix filtering) */\n currentWord: string;\n /** For bash: the prefix before '=' in --opt=value completions */\n inlinePrefix?: string | undefined;\n}\n\n/**\n * Format completion candidates for the specified shell\n *\n * @returns Shell-ready output string (lines separated by newline, last line is :directive)\n */\nexport function formatForShell(result: CandidateResult, options: ShellFormatOptions): string {\n switch (options.shell) {\n case \"bash\":\n return formatForBash(result, options);\n case \"zsh\":\n return formatForZsh(result, options);\n case \"fish\":\n return formatForFish(result, options);\n }\n}\n\n/**\n * Check if the FilterPrefix directive is set\n */\nfunction shouldFilterPrefix(directive: number): boolean {\n return (directive & CompletionDirective.FilterPrefix) !== 0;\n}\n\n/**\n * Filter candidates by prefix\n */\nfunction filterByPrefix(candidates: CompletionCandidate[], prefix: string): CompletionCandidate[] {\n if (!prefix) return candidates;\n return candidates.filter((c) => c.value.startsWith(prefix));\n}\n\n/**\n * Append extension metadata and directive to output lines\n */\nfunction appendMetadata(lines: string[], result: CandidateResult): void {\n if (result.fileExtensions && result.fileExtensions.length > 0) {\n lines.push(`@ext:${result.fileExtensions.join(\",\")}`);\n }\n if (result.fileMatchers && result.fileMatchers.length > 0) {\n lines.push(`@matcher:${result.fileMatchers.join(\",\")}`);\n }\n lines.push(`:${result.directive}`);\n}\n\n/**\n * Format for bash\n *\n * - Pre-filters candidates by currentWord prefix (replaces compgen -W)\n * - Handles --opt=value inline values by prepending prefix\n * - Outputs plain values only (no descriptions - bash COMPREPLY doesn't support them)\n * - Last line: :directive\n */\nfunction formatForBash(result: CandidateResult, options: ShellFormatOptions): string {\n let { candidates } = result;\n\n if (shouldFilterPrefix(result.directive)) {\n candidates = filterByPrefix(candidates, options.currentWord);\n }\n\n const lines: string[] = candidates.map((c) => {\n if (options.inlinePrefix) {\n return `${options.inlinePrefix}${c.value}`;\n }\n return c.value;\n });\n\n appendMetadata(lines, result);\n return lines.join(\"\\n\");\n}\n\n/**\n * Format for zsh\n *\n * - Outputs value:description pairs for _describe\n * - Colons in values/descriptions are escaped with backslash\n * - Last line: :directive\n */\nfunction formatForZsh(result: CandidateResult, _options: ShellFormatOptions): string {\n const lines: string[] = result.candidates.map((c) => {\n const escapedValue = c.value.replace(/:/g, \"\\\\:\");\n if (c.description) {\n const escapedDesc = c.description.replace(/:/g, \"\\\\:\");\n return `${escapedValue}:${escapedDesc}`;\n }\n return escapedValue;\n });\n\n appendMetadata(lines, result);\n return lines.join(\"\\n\");\n}\n\n/**\n * Format for fish\n *\n * - Outputs value\\tdescription pairs\n * - Last line: :directive\n */\nfunction formatForFish(result: CandidateResult, _options: ShellFormatOptions): string {\n const lines: string[] = result.candidates.map((c) => {\n if (c.description) {\n return `${c.value}\\t${c.description}`;\n }\n return c.value;\n });\n\n appendMetadata(lines, result);\n return lines.join(\"\\n\");\n}\n","/**\n * Dynamic completion command implementation\n *\n * This creates a hidden `__complete` command that outputs completion candidates\n * for shell scripts to consume. Usage:\n *\n * mycli __complete --shell bash -- build --fo\n * mycli __complete --shell zsh -- plugin add\n *\n * Output format depends on the target shell:\n * bash: plain values (pre-filtered by prefix), last line :directive\n * zsh: value:description pairs, last line :directive\n * fish: value\\tdescription pairs, last line :directive\n */\n\nimport { z } from \"zod\";\nimport { arg } from \"../../core/arg-registry.js\";\nimport { defineCommand } from \"../../core/command.js\";\nimport type { AnyCommand, Command } from \"../../types.js\";\nimport { generateCandidates } from \"./candidate-generator.js\";\nimport { parseCompletionContext } from \"./context-parser.js\";\nimport { formatForShell } from \"./shell-formatter.js\";\n\n/**\n * Detect inline option-value prefix (e.g., \"--format=\" from \"--format=json\")\n */\nfunction detectInlinePrefix(currentWord: string): string | undefined {\n if (currentWord.startsWith(\"--\") && currentWord.includes(\"=\")) {\n return currentWord.slice(0, currentWord.indexOf(\"=\") + 1);\n }\n return undefined;\n}\n\n/**\n * Schema for the __complete command\n */\nconst completeArgsSchema = z.object({\n shell: arg(z.enum([\"bash\", \"zsh\", \"fish\"]), {\n description: \"Target shell for output formatting\",\n }),\n // The arguments to complete are passed after --\n args: arg(z.array(z.string()).default([]), {\n positional: true,\n description: \"Arguments to complete\",\n variadic: true,\n }),\n});\n\ntype CompleteArgs = z.infer<typeof completeArgsSchema>;\n\n/**\n * Create the dynamic completion command\n *\n * @param rootCommand - The root command to generate completions for\n * @param programName - The program name (optional, defaults to rootCommand.name)\n * @returns A command that outputs completion candidates\n */\nexport function createDynamicCompleteCommand(\n rootCommand: AnyCommand,\n _programName?: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): Command<typeof completeArgsSchema, CompleteArgs, any> {\n return defineCommand({\n name: \"__complete\",\n // No description - this is a hidden command\n args: completeArgsSchema,\n run(args) {\n // Parse the completion context\n const context = parseCompletionContext(args.args, rootCommand);\n\n // Generate candidates (shellCommand/file extensions resolved in JS)\n const result = generateCandidates(context);\n\n // Detect bash inline option-value prefix\n const inlinePrefix = detectInlinePrefix(context.currentWord);\n\n // Format for the target shell\n const output = formatForShell(result, {\n shell: args.shell,\n currentWord: inlinePrefix\n ? context.currentWord.slice(inlinePrefix.length)\n : context.currentWord,\n inlinePrefix,\n });\n\n console.log(output);\n },\n });\n}\n\n/**\n * Check if a command tree contains the __complete command\n */\nexport function hasCompleteCommand(command: AnyCommand): boolean {\n return Boolean(command.subCommands?.[\"__complete\"]);\n}\n","/**\n * Fish completion script generator (static)\n *\n * Generates a self-contained fish completion script that embeds all\n * completion metadata. No Node.js process is spawned on TAB.\n */\n\nimport type { AnyCommand } from \"../types.js\";\nimport {\n collectRouteEntries,\n extractCompletionData,\n getVisibleSubs,\n sanitize,\n} from \"./extractor.js\";\nimport type {\n CompletableOption,\n CompletablePositional,\n CompletableSubcommand,\n CompletionOptions,\n CompletionResult,\n ValueCompletion,\n} from \"./types.js\";\n\n/** Escape shell-special characters for fish double-quoted strings */\nfunction escapeDesc(s: string): string {\n return s.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"').replace(/\\$/g, \"\\\\$\");\n}\n\n/**\n * Generate fish value completion lines for a ValueCompletion spec.\n * Each line outputs candidates via echo (tab-separated value\\tdescription).\n */\nfunction fishValueLines(vc: ValueCompletion | undefined): string[] {\n if (!vc) return [];\n switch (vc.type) {\n case \"choices\":\n return vc.choices!.map((c) => `echo \"${escapeDesc(c)}\"`);\n case \"file\": {\n if (vc.matcher?.length) {\n return fishMatcherLines(vc.matcher);\n }\n if (vc.extensions?.length) {\n return fishExtensionLines(vc.extensions);\n }\n return [`__fish_complete_path \"$_cur\"`];\n }\n case \"directory\":\n return [`__fish_complete_directories \"$_cur\"`];\n case \"command\":\n return [`for _v in (${vc.shellCommand!})`, ` echo \"$_v\"`, `end`];\n case \"none\":\n return [];\n }\n}\n\n/** Generate fish matcher-filtered file completion */\nfunction fishMatcherLines(patterns: string[]): string[] {\n return [\n `__fish_complete_directories \"$_cur\"`,\n // Extract directory prefix from $_cur for correct subdirectory matching\n `set -l _dir \"\"`,\n `if string match -q '*/*' \"$_cur\"`,\n ` set _dir (string replace -r '[^/]*$' '' \"$_cur\")`,\n `end`,\n ...patterns.flatMap((p) => [\n `for _f in \"$_dir\"${p}`,\n ` test -f \"$_f\"; and string match -q \"$_cur*\" \"$_f\"; and echo \"$_f\"`,\n `end`,\n ]),\n ];\n}\n\n/** Generate fish extension-filtered file completion */\nfunction fishExtensionLines(extensions: string[]): string[] {\n const lines: string[] = [];\n lines.push(`__fish_complete_directories \"$_cur\"`);\n for (const ext of extensions) {\n lines.push(`for _f in \"$_cur\"*.${ext}`);\n lines.push(` test -f \"$_f\"; and echo \"$_f\"`);\n lines.push(`end`);\n }\n return lines;\n}\n\n/** Generate option-value switch cases for fish */\nfunction optionValueCases(options: CompletableOption[]): string[] {\n const lines: string[] = [];\n for (const opt of options) {\n if (!opt.takesValue || !opt.valueCompletion) continue;\n const valLines = fishValueLines(opt.valueCompletion);\n if (valLines.length === 0) continue;\n\n const conditions: string[] = [`test \"$_prev\" = \"--${opt.cliName}\"`];\n if (opt.alias) {\n conditions.push(`test \"$_prev\" = \"-${opt.alias}\"`);\n }\n const cond = conditions.join(\"; or \");\n\n lines.push(` if ${cond}`);\n for (const vl of valLines) {\n lines.push(` ${vl}`);\n }\n lines.push(` return`);\n lines.push(` end`);\n }\n return lines;\n}\n\n/** Generate positional completion block for fish */\nfunction positionalBlock(positionals: CompletablePositional[]): string[] {\n if (positionals.length === 0) return [];\n const lines: string[] = [];\n for (const pos of positionals) {\n const valLines = fishValueLines(pos.valueCompletion);\n if (valLines.length === 0) continue;\n\n if (pos.variadic) {\n lines.push(` if test $_pos_count -ge ${pos.position}`);\n } else {\n lines.push(` if test $_pos_count -eq ${pos.position}`);\n }\n for (const vl of valLines) {\n lines.push(` ${vl}`);\n }\n lines.push(` return`);\n lines.push(` end`);\n }\n return lines;\n}\n\n/** Generate available-option echo lines for fish */\nfunction availableOptionLines(options: CompletableOption[], fn: string): string[] {\n const lines: string[] = [];\n for (const opt of options) {\n const desc = escapeDesc(opt.description ?? \"\");\n if (opt.valueType === \"array\") {\n lines.push(` echo \"--${opt.cliName}\\t${desc}\"`);\n } else {\n const checks: string[] = [`\"--${opt.cliName}\"`];\n if (opt.alias) checks.push(`\"-${opt.alias}\"`);\n lines.push(\n ` __${fn}_not_used ${checks.join(\" \")}; and echo \"--${opt.cliName}\\t${desc}\"`,\n );\n }\n }\n lines.push(` __${fn}_not_used \"--help\"; and echo \"--help\\tShow help\"`);\n return lines;\n}\n\n/** Generate value-option completion block if any value-taking options exist */\nfunction valueCompletionBlock(options: CompletableOption[]): string[] {\n if (!options.some((o) => o.takesValue && o.valueCompletion)) return [];\n return optionValueCases(options);\n}\n\n/**\n * Generate a per-subcommand completion function for fish.\n * Recursively generates functions for nested subcommands.\n */\nfunction generateSubHandler(sub: CompletableSubcommand, fn: string, path: string[]): string[] {\n const fullPath = [...path, sub.name];\n const funcName = `__${fn}_complete_${fullPath.map(sanitize).join(\"_\")}`;\n const visibleSubs = getVisibleSubs(sub.subcommands);\n\n const lines: string[] = [];\n\n // Recursively generate handlers for child subcommands\n for (const child of visibleSubs) {\n lines.push(...generateSubHandler(child, fn, fullPath));\n }\n\n lines.push(`function ${funcName} --no-scope-shadowing`);\n\n // 1. Option value completion\n lines.push(...valueCompletionBlock(sub.options));\n // Fallback: value-taking option without explicit completion → default file completion\n const fullPathStr = fullPath.join(\":\");\n lines.push(` if __${fn}_opt_takes_value \"${fullPathStr}\" \"$_prev\"; return; end`);\n\n // 2. After -- separator\n if (sub.positionals.length > 0) {\n lines.push(` if test $_after_dd -eq 1`);\n lines.push(...positionalBlock(sub.positionals).map((l) => ` ${l}`));\n lines.push(` return`);\n lines.push(` end`);\n } else {\n lines.push(` if test $_after_dd -eq 1; return; end`);\n }\n\n // 3. Option name completion\n lines.push(` if string match -q -- '-*' \"$_cur\"`);\n lines.push(...availableOptionLines(sub.options, fn));\n lines.push(` return`);\n lines.push(` end`);\n\n // 4. Subcommand or positional completion\n if (visibleSubs.length > 0) {\n for (const s of visibleSubs) {\n const desc = escapeDesc(s.description ?? \"\");\n lines.push(` echo \"${s.name}\\t${desc}\"`);\n }\n } else if (sub.positionals.length > 0) {\n lines.push(...positionalBlock(sub.positionals));\n }\n\n lines.push(`end`);\n lines.push(``);\n return lines;\n}\n\n/** Generate opt-takes-value entries for fish switch cases */\nfunction optTakesValueCases(sub: CompletableSubcommand, parentPath: string): string[] {\n const lines: string[] = [];\n for (const opt of sub.options) {\n if (opt.takesValue) {\n const patterns: string[] = [`\"${parentPath}:--${opt.cliName}\"`];\n if (opt.alias) patterns.push(`\"${parentPath}:-${opt.alias}\"`);\n lines.push(` case ${patterns.join(\" \")}`);\n lines.push(` return 0`);\n }\n }\n for (const child of getVisibleSubs(sub.subcommands)) {\n const childPath = parentPath ? `${parentPath}:${child.name}` : child.name;\n lines.push(...optTakesValueCases(child, childPath));\n }\n return lines;\n}\n\nexport function generateFishCompletion(\n command: AnyCommand,\n options: CompletionOptions,\n): CompletionResult {\n const { programName } = options;\n const data = extractCompletionData(command, programName, options.globalArgsSchema);\n const fn = sanitize(programName);\n const root = data.command;\n const visibleSubs = getVisibleSubs(root.subcommands);\n\n const lines: string[] = [];\n lines.push(`# Fish completion for ${programName}`);\n lines.push(`# Generated by politty`);\n lines.push(``);\n\n // Helper: check if option is already used\n lines.push(`function __${fn}_not_used --no-scope-shadowing`);\n lines.push(` for _chk in $argv`);\n lines.push(` if contains -- \"$_chk\" $_used_opts`);\n lines.push(` return 1`);\n lines.push(` end`);\n lines.push(` end`);\n lines.push(` return 0`);\n lines.push(`end`);\n lines.push(``);\n\n // Helper: check if option takes a value\n lines.push(`function __${fn}_opt_takes_value`);\n lines.push(` switch \"$argv[1]:$argv[2]\"`);\n lines.push(...optTakesValueCases(root, \"\"));\n lines.push(` end`);\n lines.push(` return 1`);\n lines.push(`end`);\n lines.push(``);\n\n // Collect all nested subcommand routes (used for both is_subcmd and dispatch)\n const routeEntries = collectRouteEntries(root);\n\n // Helper: check if a word is a known subcommand at the current path level\n if (routeEntries.length > 0) {\n lines.push(`function __${fn}_is_subcmd`);\n lines.push(` switch \"$argv[1]:$argv[2]\"`);\n for (const r of routeEntries) {\n lines.push(` case \"${r.lookupPattern}\"`);\n lines.push(` return 0`);\n }\n lines.push(` end`);\n lines.push(` return 1`);\n lines.push(`end`);\n lines.push(``);\n }\n\n // Per-subcommand completion functions\n for (const sub of visibleSubs) {\n lines.push(...generateSubHandler(sub, fn, []));\n }\n\n // Root handler\n // NOTE: Inline --opt=value completion is not yet supported in fish; only\n // separate-word value completion (--opt <value>) is handled. Bash supports\n // inline via _inline_prefix parsing.\n lines.push(`function __${fn}_complete_root --no-scope-shadowing`);\n lines.push(...valueCompletionBlock(root.options));\n // Fallback: value-taking option without explicit completion → default file completion\n lines.push(` if __${fn}_opt_takes_value \"\" \"$_prev\"; return; end`);\n if (root.positionals.length > 0) {\n lines.push(` if test $_after_dd -eq 1`);\n lines.push(...positionalBlock(root.positionals).map((l) => ` ${l}`));\n lines.push(` return`);\n lines.push(` end`);\n } else {\n lines.push(` if test $_after_dd -eq 1; return; end`);\n }\n lines.push(` if string match -q -- '-*' \"$_cur\"`);\n lines.push(...availableOptionLines(root.options, fn));\n if (visibleSubs.length > 0) {\n lines.push(` else`);\n for (const s of visibleSubs) {\n const desc = escapeDesc(s.description ?? \"\");\n lines.push(` echo \"${s.name}\\t${desc}\"`);\n }\n } else if (root.positionals.length > 0) {\n lines.push(` else`);\n lines.push(...positionalBlock(root.positionals));\n }\n lines.push(` end`);\n lines.push(`end`);\n lines.push(``);\n\n // Main completion function\n lines.push(`function __fish_${fn}_complete`);\n lines.push(` set -l _args (commandline -opc)`);\n lines.push(` set -e _args[1]`);\n lines.push(``);\n lines.push(` set -l _ct (commandline -ct)`);\n lines.push(` if test (count $_ct) -eq 0`);\n lines.push(` set -a _args \"\"`);\n lines.push(` else`);\n lines.push(` set -a _args $_ct`);\n lines.push(` end`);\n lines.push(``);\n lines.push(` set -l _cur \"\"`);\n lines.push(` if test (count $_args) -gt 0`);\n lines.push(` set _cur \"$_args[-1]\"`);\n lines.push(` end`);\n lines.push(``);\n lines.push(` set -l _prev \"\"`);\n lines.push(` if test (count $_args) -gt 1`);\n lines.push(` set _prev \"$_args[-2]\"`);\n lines.push(` end`);\n lines.push(``);\n lines.push(\n ` set -l _subcmd \"\" ; set -l _after_dd 0 ; set -l _pos_count 0 ; set -l _skip_next 0`,\n );\n lines.push(` set -l _used_opts`);\n lines.push(``);\n lines.push(` set -l _j 1`);\n lines.push(` set -l _limit (math (count $_args) - 1)`);\n lines.push(` while test $_j -le $_limit`);\n lines.push(` set -l _w \"$_args[$_j]\"`);\n lines.push(\n ` if test $_skip_next -eq 1; set _skip_next 0; set _j (math $_j + 1); continue; end`,\n );\n lines.push(` if test \"$_w\" = \"--\"; set _after_dd 1; set _j (math $_j + 1); continue; end`);\n lines.push(\n ` if test $_after_dd -eq 1; set _pos_count (math $_pos_count + 1); set _j (math $_j + 1); continue; end`,\n );\n lines.push(\n ` if string match -q -- '--*=*' \"$_w\"; set -a _used_opts (string replace -r '=.*' '' -- \"$_w\"); set _j (math $_j + 1); continue; end`,\n );\n lines.push(` if string match -q -- '-*' \"$_w\"`);\n lines.push(` set -a _used_opts \"$_w\"`);\n lines.push(` __${fn}_opt_takes_value \"$_subcmd\" \"$_w\"; and set _skip_next 1`);\n lines.push(` set _j (math $_j + 1); continue`);\n lines.push(` end`);\n if (routeEntries.length > 0) {\n lines.push(\n ` if __${fn}_is_subcmd \"$_subcmd\" \"$_w\"; test -n \"$_subcmd\"; and set _subcmd \"$_subcmd:$_w\"; or set _subcmd \"$_w\"; set _used_opts; set _pos_count 0; else; set _pos_count (math $_pos_count + 1); end`,\n );\n } else {\n lines.push(` set _pos_count (math $_pos_count + 1)`);\n }\n lines.push(` set _j (math $_j + 1)`);\n lines.push(` end`);\n lines.push(``);\n\n // Route to subcommand handler (all nested paths)\n lines.push(` switch \"$_subcmd\"`);\n for (const r of routeEntries) {\n lines.push(` case \"${r.pathStr}\"; __${fn}_complete_${r.funcSuffix}`);\n }\n lines.push(` case '*'; __${fn}_complete_root`);\n lines.push(` end`);\n lines.push(`end`);\n lines.push(``);\n\n // Register completion\n lines.push(`# Clear existing completions`);\n lines.push(`complete -e -c ${programName}`);\n lines.push(``);\n lines.push(`# Register completion`);\n lines.push(`complete -c ${programName} -f -a '(__fish_${fn}_complete)'`);\n lines.push(``);\n\n return {\n script: lines.join(\"\\n\"),\n shell: \"fish\",\n installInstructions: `# To enable completions, run one of the following:\n\n# Option 1: Source directly\n${programName} completion fish | source\n\n# Option 2: Save to the fish completions directory\n${programName} completion fish > ~/.config/fish/completions/${programName}.fish\n\n# The completion will be available immediately in new shell sessions.\n# To use in the current session, run:\nsource ~/.config/fish/completions/${programName}.fish`,\n };\n}\n","/**\n * Zsh completion script generator (static)\n *\n * Generates a self-contained zsh completion script that embeds all\n * completion metadata. No Node.js process is spawned on TAB.\n */\n\nimport type { AnyCommand } from \"../types.js\";\nimport {\n collectRouteEntries,\n extractCompletionData,\n getVisibleSubs,\n isSubcmdCaseLines,\n optTakesValueEntries,\n sanitize,\n} from \"./extractor.js\";\nimport type {\n CompletableOption,\n CompletablePositional,\n CompletableSubcommand,\n CompletionOptions,\n CompletionResult,\n ValueCompletion,\n} from \"./types.js\";\n\nfunction escapeDesc(s: string): string {\n return s\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/\"/g, '\\\\\"')\n .replace(/\\$/g, \"\\\\$\")\n .replace(/`/g, \"\\\\`\")\n .replace(/:/g, \"\\\\:\");\n}\n\n/**\n * Generate zsh value completion lines for a ValueCompletion spec.\n * Uses `_vals` array (must be declared in the calling function scope).\n */\nfunction zshValueLines(vc: ValueCompletion | undefined, fn: string): string[] {\n if (!vc) return [];\n switch (vc.type) {\n case \"choices\": {\n const items = vc.choices!.map((c) => `\"${escapeDesc(c)}\"`).join(\" \");\n return [`_vals=(${items})`, `__${fn}_cdescribe 'completions' _vals`];\n }\n case \"file\": {\n if (vc.matcher?.length) {\n return vc.matcher.map((p) => `_files -g \"${p}\"`);\n }\n if (vc.extensions?.length) {\n return vc.extensions.map((ext) => `_files -g \"*.${ext}\"`);\n }\n return [`_files`];\n }\n case \"directory\":\n return [`_files -/`];\n case \"command\":\n return [`_vals=(\"\\${(@f)$(${vc.shellCommand!})}\")`, `__${fn}_cdescribe 'completions' _vals`];\n case \"none\":\n return [];\n }\n}\n\n/** Generate option-value case branches */\nfunction optionValueCases(options: CompletableOption[], fn: string): string[] {\n const lines: string[] = [];\n for (const opt of options) {\n if (!opt.takesValue || !opt.valueCompletion) continue;\n const valLines = zshValueLines(opt.valueCompletion, fn);\n if (valLines.length === 0) continue;\n\n const patterns: string[] = [`--${opt.cliName}`];\n if (opt.alias) patterns.push(`-${opt.alias}`);\n\n lines.push(` ${patterns.join(\"|\")})`);\n for (const vl of valLines) {\n lines.push(` ${vl}`);\n }\n lines.push(` return 0 ;;`);\n }\n return lines;\n}\n\n/** Generate positional completion block */\nfunction positionalBlock(positionals: CompletablePositional[], fn: string): string[] {\n if (positionals.length === 0) return [];\n const lines: string[] = [];\n lines.push(` case \"$_pos_count\" in`);\n for (const pos of positionals) {\n if (pos.variadic) {\n lines.push(` ${pos.position}|*)`);\n } else {\n lines.push(` ${pos.position})`);\n }\n const valLines = zshValueLines(pos.valueCompletion, fn);\n for (const vl of valLines) {\n lines.push(` ${vl}`);\n }\n lines.push(` ;;`);\n }\n lines.push(` esac`);\n return lines;\n}\n\n/** Generate prev-word value completion case block */\nfunction valueCompletionBlock(options: CompletableOption[], fn: string): string[] {\n if (!options.some((o) => o.takesValue && o.valueCompletion)) return [];\n\n const prevCases = optionValueCases(options, fn);\n if (prevCases.length === 0) return [];\n\n return [` case \"\\${words[CURRENT-1]}\" in`, ...prevCases, ` esac`];\n}\n\n/** Generate available-options list lines */\nfunction availableOptionLines(options: CompletableOption[], fn: string): string[] {\n const lines: string[] = [];\n for (const opt of options) {\n const desc = opt.description ? `:${escapeDesc(opt.description)}` : \"\";\n if (opt.valueType === \"array\") {\n lines.push(` _opts+=(\"--${opt.cliName}${desc}\")`);\n } else {\n const patterns: string[] = [`\"--${opt.cliName}\"`];\n if (opt.alias) patterns.push(`\"-${opt.alias}\"`);\n lines.push(\n ` __${fn}_not_used ${patterns.join(\" \")} && _opts+=(\"--${opt.cliName}${desc}\")`,\n );\n }\n }\n lines.push(` __${fn}_not_used \"--help\" && _opts+=(\"--help:Show help\")`);\n return lines;\n}\n\n/**\n * Generate a per-subcommand completion function.\n * Recursively generates functions for nested subcommands.\n */\nfunction generateSubHandler(sub: CompletableSubcommand, fn: string, path: string[]): string[] {\n const fullPath = [...path, sub.name];\n const funcName = `__${fn}_complete_${fullPath.map(sanitize).join(\"_\")}`;\n const visibleSubs = getVisibleSubs(sub.subcommands);\n\n const lines: string[] = [];\n\n // Recursively generate handlers for child subcommands\n for (const child of visibleSubs) {\n lines.push(...generateSubHandler(child, fn, fullPath));\n }\n\n lines.push(`${funcName}() {`);\n lines.push(` local -a _vals=()`);\n\n // 1. Option value completion (prev word is value-taking option)\n lines.push(...valueCompletionBlock(sub.options, fn));\n // Fallback: value-taking option without explicit completion → default file completion\n const fullPathStr = fullPath.join(\":\");\n lines.push(\n ` if __${fn}_opt_takes_value \"${fullPathStr}\" \"\\${words[CURRENT-1]}\"; then return 0; fi`,\n );\n\n // 2. After -- separator\n if (sub.positionals.length > 0) {\n lines.push(` if (( _after_dd )); then`);\n lines.push(...positionalBlock(sub.positionals, fn).map((l) => ` ${l}`));\n lines.push(` return 0`);\n lines.push(` fi`);\n } else {\n lines.push(` if (( _after_dd )); then return 0; fi`);\n }\n\n // 3. Option name completion\n lines.push(` if [[ \"\\${words[CURRENT]}\" == -* ]]; then`);\n lines.push(` local -a _opts=()`);\n lines.push(...availableOptionLines(sub.options, fn));\n lines.push(` __${fn}_cdescribe 'options' _opts`);\n lines.push(` return 0`);\n lines.push(` fi`);\n\n // 4. Subcommand or positional completion\n if (visibleSubs.length > 0) {\n const subItems = visibleSubs\n .map((s) => {\n const desc = s.description ? `:${escapeDesc(s.description)}` : \"\";\n return `\"${s.name}${desc}\"`;\n })\n .join(\" \");\n lines.push(` local -a _subs=(${subItems})`);\n lines.push(` __${fn}_cdescribe 'subcommands' _subs`);\n } else if (sub.positionals.length > 0) {\n lines.push(...positionalBlock(sub.positionals, fn));\n }\n\n lines.push(`}`);\n lines.push(``);\n return lines;\n}\n\nexport function generateZshCompletion(\n command: AnyCommand,\n options: CompletionOptions,\n): CompletionResult {\n const { programName } = options;\n const data = extractCompletionData(command, programName, options.globalArgsSchema);\n const fn = sanitize(programName);\n const root = data.command;\n const visibleSubs = getVisibleSubs(root.subcommands);\n\n const lines: string[] = [];\n lines.push(`#compdef ${programName}`);\n lines.push(``);\n lines.push(`# Zsh completion for ${programName}`);\n lines.push(`# Generated by politty`);\n lines.push(``);\n\n // Helper: check if option is already used\n lines.push(`__${fn}_not_used() {`);\n lines.push(` local _u _chk`);\n lines.push(` for _u in \"\\${_used_opts[@]}\"; do`);\n lines.push(` for _chk in \"$@\"; do`);\n lines.push(` [[ \"$_u\" == \"$_chk\" ]] && return 1`);\n lines.push(` done`);\n lines.push(` done`);\n lines.push(` return 0`);\n lines.push(`}`);\n lines.push(``);\n\n // Helper: _describe with compadd fallback\n // _describe may fail to add matches when prefix starts with - (zsh tag system limitation)\n lines.push(`__${fn}_cdescribe() {`);\n lines.push(` _describe \"$@\" 2>/dev/null && return 0`);\n lines.push(` shift`);\n lines.push(` local -a _cd_vals=(\"\\${(@)\\${(P)1}%%:*}\")`);\n lines.push(` compadd -a _cd_vals 2>/dev/null`);\n lines.push(` return 0`);\n lines.push(`}`);\n lines.push(``);\n\n // Helper: check if option takes a value\n lines.push(`__${fn}_opt_takes_value() {`);\n lines.push(` case \"$1:$2\" in`);\n lines.push(...optTakesValueEntries(root, \"\"));\n lines.push(` esac`);\n lines.push(` return 1`);\n lines.push(`}`);\n lines.push(``);\n\n // Collect all nested subcommand routes (used for both is_subcmd and dispatch)\n const routeEntries = collectRouteEntries(root);\n\n // Helper: check if a word is a known subcommand at the current path level\n if (routeEntries.length > 0) {\n lines.push(`__${fn}_is_subcmd() {`);\n lines.push(` case \"$1:$2\" in`);\n lines.push(...isSubcmdCaseLines(routeEntries));\n lines.push(` esac`);\n lines.push(` return 1`);\n lines.push(`}`);\n lines.push(``);\n }\n\n // Per-subcommand completion functions\n for (const sub of visibleSubs) {\n lines.push(...generateSubHandler(sub, fn, []));\n }\n\n // Root handler\n // NOTE: Inline --opt=value completion is not yet supported in zsh; only\n // separate-word value completion (--opt <value>) is handled. Bash supports\n // inline via _inline_prefix parsing.\n lines.push(`__${fn}_complete_root() {`);\n lines.push(` local -a _vals=()`);\n lines.push(...valueCompletionBlock(root.options, fn));\n // Fallback: value-taking option without explicit completion → default file completion\n lines.push(` if __${fn}_opt_takes_value \"\" \"\\${words[CURRENT-1]}\"; then return 0; fi`);\n if (root.positionals.length > 0) {\n lines.push(` if (( _after_dd )); then`);\n lines.push(...positionalBlock(root.positionals, fn).map((l) => ` ${l}`));\n lines.push(` return 0`);\n lines.push(` fi`);\n } else {\n lines.push(` if (( _after_dd )); then return 0; fi`);\n }\n lines.push(` if [[ \"\\${words[CURRENT]}\" == -* ]]; then`);\n lines.push(` local -a _opts=()`);\n lines.push(...availableOptionLines(root.options, fn));\n lines.push(` __${fn}_cdescribe 'options' _opts`);\n if (visibleSubs.length > 0) {\n lines.push(` else`);\n const subItems = visibleSubs\n .map((s) => {\n const desc = s.description ? `:${escapeDesc(s.description)}` : \"\";\n return `\"${s.name}${desc}\"`;\n })\n .join(\" \");\n lines.push(` local -a _subs=(${subItems})`);\n lines.push(` __${fn}_cdescribe 'subcommands' _subs`);\n } else if (root.positionals.length > 0) {\n lines.push(` else`);\n lines.push(...positionalBlock(root.positionals, fn).map((l) => ` ${l}`));\n }\n lines.push(` fi`);\n lines.push(`}`);\n lines.push(``);\n\n // Main completion function -- subcommand dispatch routing\n const subRouting = routeEntries\n .map((r) => ` ${r.pathStr}) __${fn}_complete_${r.funcSuffix} ;;`)\n .join(\"\\n\");\n\n lines.push(`_${fn}() {`);\n lines.push(` (( CURRENT )) || CURRENT=\\${#words}`);\n lines.push(``);\n lines.push(` local _subcmd=\"\" _after_dd=0 _pos_count=0 _skip_next=0`);\n lines.push(` local -a _used_opts=()`);\n lines.push(``);\n lines.push(` local _j=2`);\n lines.push(` while (( _j < CURRENT )); do`);\n lines.push(` local _w=\"\\${words[_j]}\"`);\n lines.push(` if (( _skip_next )); then _skip_next=0; (( _j++ )); continue; fi`);\n lines.push(` if [[ \"$_w\" == \"--\" ]]; then _after_dd=1; (( _j++ )); continue; fi`);\n lines.push(` if (( _after_dd )); then (( _pos_count++ )); (( _j++ )); continue; fi`);\n lines.push(\n ` if [[ \"$_w\" == --*=* ]]; then _used_opts+=(\"\\${_w%%=*}\"); (( _j++ )); continue; fi`,\n );\n lines.push(` if [[ \"$_w\" == -* ]]; then`);\n lines.push(` _used_opts+=(\"$_w\")`);\n lines.push(` __${fn}_opt_takes_value \"$_subcmd\" \"$_w\" && _skip_next=1`);\n lines.push(` (( _j++ )); continue`);\n lines.push(` fi`);\n if (routeEntries.length > 0) {\n lines.push(\n ` if __${fn}_is_subcmd \"$_subcmd\" \"$_w\"; then _subcmd=\"\\${_subcmd:+\\${_subcmd}:}$_w\"; _used_opts=(); _pos_count=0; else (( _pos_count++ )); fi`,\n );\n } else {\n lines.push(` (( _pos_count++ ))`);\n }\n lines.push(` (( _j++ ))`);\n lines.push(` done`);\n lines.push(``);\n lines.push(` case \"$_subcmd\" in`);\n lines.push(subRouting);\n lines.push(` *) __${fn}_complete_root ;;`);\n lines.push(` esac`);\n lines.push(`}`);\n lines.push(``);\n lines.push(\n `zstyle ':completion:*:*:${programName}:*' file-patterns '%p:globbed-files *(-/):directories'`,\n );\n lines.push(``);\n lines.push(`compdef _${fn} ${programName}`);\n lines.push(``);\n\n return {\n script: lines.join(\"\\n\"),\n shell: \"zsh\",\n installInstructions: `# To enable completions, add the following to your ~/.zshrc:\n\n# Option 1: Source directly (add before compinit)\neval \"$(${programName} completion zsh)\"\n\n# Option 2: Save to a file in your fpath\n${programName} completion zsh > ~/.zsh/completions/_${programName}\n\n# Make sure your fpath includes the completions directory:\n# fpath=(~/.zsh/completions $fpath)\n# autoload -Uz compinit && compinit\n\n# Then reload your shell or run:\nsource ~/.zshrc`,\n };\n}\n","/**\n * Shell completion generation module\n *\n * Provides utilities to generate shell completion scripts for bash, zsh, and fish.\n *\n * @example\n * ```typescript\n * import { generateCompletion, createCompletionCommand } from \"politty/completion\";\n *\n * // Generate completion script directly\n * const result = generateCompletion(myCommand, {\n * shell: \"bash\",\n * programName: \"mycli\"\n * });\n * console.log(result.script);\n *\n * // Or add a completion subcommand to your CLI\n * const mainCommand = withCompletionCommand(\n * defineCommand({\n * name: \"mycli\",\n * subCommands: { ... },\n * }),\n * );\n * ```\n */\n\nimport { z } from \"zod\";\nimport { arg } from \"../core/arg-registry.js\";\nimport { defineCommand } from \"../core/command.js\";\nimport type { AnyCommand, ArgsSchema, Command } from \"../types.js\";\nimport { generateBashCompletion } from \"./bash.js\";\nimport { createDynamicCompleteCommand } from \"./dynamic/index.js\";\nimport { generateFishCompletion } from \"./fish.js\";\nimport type { CompletionOptions, CompletionResult, ShellType } from \"./types.js\";\nimport { generateZshCompletion } from \"./zsh.js\";\n\n// Re-export dynamic completion\nexport {\n CompletionDirective,\n createDynamicCompleteCommand,\n formatForShell,\n generateCandidates,\n hasCompleteCommand,\n parseCompletionContext,\n type CandidateResult,\n type CompletionCandidate,\n type CompletionContext,\n type CompletionType,\n type ShellFormatOptions,\n} from \"./dynamic/index.js\";\n// Re-export extractor\nexport { extractCompletionData, extractPositionals } from \"./extractor.js\";\n// Re-export types\nexport type {\n CompletableOption,\n CompletableSubcommand,\n CompletionData,\n CompletionGenerator,\n CompletionOptions,\n CompletionResult,\n ShellType,\n} from \"./types.js\";\n// Re-export value completion resolver\nexport { resolveValueCompletion, type ValueCompletionField } from \"./value-completion-resolver.js\";\n\n/**\n * Generate completion script for the specified shell\n */\nexport function generateCompletion(\n command: AnyCommand,\n options: CompletionOptions,\n): CompletionResult {\n switch (options.shell) {\n case \"bash\":\n return generateBashCompletion(command, options);\n case \"zsh\":\n return generateZshCompletion(command, options);\n case \"fish\":\n return generateFishCompletion(command, options);\n default:\n throw new Error(`Unsupported shell: ${options.shell}`);\n }\n}\n\n/**\n * Get the list of supported shells\n */\nexport function getSupportedShells(): ShellType[] {\n return [\"bash\", \"zsh\", \"fish\"];\n}\n\n/**\n * Detect the current shell from environment\n */\nexport function detectShell(): ShellType | null {\n const shell = process.env.SHELL || \"\";\n const shellName = shell.split(\"/\").pop()?.toLowerCase() || \"\";\n\n if (shellName.includes(\"bash\")) {\n return \"bash\";\n }\n if (shellName.includes(\"zsh\")) {\n return \"zsh\";\n }\n if (shellName.includes(\"fish\")) {\n return \"fish\";\n }\n\n return null;\n}\n\n/**\n * Schema for the completion command arguments\n */\nconst completionArgsSchema = z.object({\n shell: arg(\n z\n .enum([\"bash\", \"zsh\", \"fish\"])\n .optional()\n .describe(\"Shell type (auto-detected if not specified)\"),\n {\n positional: true,\n description: \"Shell type (bash, zsh, or fish)\",\n placeholder: \"SHELL\",\n },\n ),\n instructions: arg(z.boolean().default(false), {\n alias: \"i\",\n description: \"Show installation instructions\",\n }),\n});\n\ntype CompletionArgs = z.infer<typeof completionArgsSchema>;\n\n/**\n * Create a completion subcommand for your CLI\n *\n * This creates a ready-to-use subcommand that generates completion scripts.\n *\n * @example\n * ```typescript\n * const mainCommand = defineCommand({\n * name: \"mycli\",\n * subCommands: {\n * completion: createCompletionCommand(mainCommand)\n * }\n * });\n * ```\n */\nexport function createCompletionCommand(\n rootCommand: AnyCommand,\n programName?: string,\n globalArgsSchema?: ArgsSchema,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): Command<typeof completionArgsSchema, CompletionArgs, any> {\n const resolvedProgramName = programName ?? rootCommand.name;\n\n if (!rootCommand.subCommands?.__complete) {\n rootCommand.subCommands = {\n ...rootCommand.subCommands,\n __complete: createDynamicCompleteCommand(rootCommand, resolvedProgramName),\n };\n }\n\n return defineCommand({\n name: \"completion\",\n description: \"Generate shell completion script\",\n args: completionArgsSchema,\n run(args) {\n // Detect shell if not specified\n const shellType = args.shell || detectShell();\n\n if (!shellType) {\n console.error(\"Could not detect shell type. Please specify one of: bash, zsh, fish\");\n process.exitCode = 1;\n return;\n }\n\n const result = generateCompletion(rootCommand, {\n shell: shellType,\n programName: resolvedProgramName,\n includeDescriptions: true,\n ...(globalArgsSchema !== undefined && { globalArgsSchema }),\n });\n\n if (args.instructions) {\n console.log(result.installInstructions);\n } else {\n console.log(result.script);\n }\n },\n });\n}\n\n/**\n * Options for withCompletionCommand\n */\nexport interface WithCompletionOptions {\n /** Override the program name (defaults to command.name) */\n programName?: string;\n /** Global args schema for deriving global options in completion */\n globalArgsSchema?: ArgsSchema;\n}\n\n/**\n * Wrap a command with a completion subcommand\n *\n * This avoids circular references that occur when a command references itself\n * in its subCommands (e.g., for completion generation).\n *\n * @param command - The command to wrap\n * @param options - Options including programName\n * @returns A new command with the completion subcommand added\n *\n * @example\n * ```typescript\n * const mainCommand = withCompletionCommand(\n * defineCommand({\n * name: \"mycli\",\n * subCommands: { ... },\n * }),\n * );\n * ```\n */\nexport function withCompletionCommand<T extends AnyCommand>(\n command: T,\n options?: string | WithCompletionOptions,\n): T {\n // Support both string (programName) and options object for backwards compatibility\n const opts: WithCompletionOptions =\n typeof options === \"string\" ? { programName: options } : (options ?? {});\n\n const { programName, globalArgsSchema } = opts;\n\n const wrappedCommand = {\n ...command,\n } as T;\n\n wrappedCommand.subCommands = {\n ...command.subCommands,\n completion: createCompletionCommand(wrappedCommand, programName, globalArgsSchema),\n // Note: __complete (dynamic completion) does not yet receive globalArgsSchema.\n // Static completion scripts (bash/zsh/fish) already include global options.\n __complete: createDynamicCompleteCommand(wrappedCommand, programName),\n };\n\n return wrappedCommand;\n}\n"],"mappings":"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"}