{"version":3,"file":"help.mjs","names":[],"sources":["../../../src/codegen/parsers/help.ts"],"sourcesContent":["import type { CommandMeta, FieldMeta } from '../types.ts';\n\ninterface ParseHelpOptions {\n  /** Name to use for the root command if not detected from the help text */\n  name?: string;\n}\n\ntype Section = 'none' | 'usage' | 'commands' | 'options' | 'arguments' | 'positional' | 'aliases' | 'skip';\n\n/**\n * Parse --help text output into CommandMeta.\n * Handles common styles: GNU coreutils, Go cobra, Python argparse, Node commander/yargs, gh CLI.\n */\nexport function parseHelpOutput(text: string, options?: ParseHelpOptions): CommandMeta {\n  const lines = text.split('\\n');\n  const result: CommandMeta = {\n    name: options?.name || '',\n    arguments: [],\n    positionals: [],\n    subcommands: [],\n  };\n\n  let section: Section = 'none';\n\n  // Try to extract name from USAGE line\n  // Matches: \"Usage: mycli\", \"USAGE\\n  gh <command>\", \"Usage:\\n  myapp deploy [flags]\"\n  const usageMatch = text.match(/^[Uu](?:SAGE|sage):?\\s*(\\S+)/m) || text.match(/^USAGE\\n\\s+(\\S+)/m);\n  if (usageMatch && !result.name) {\n    result.name = usageMatch[1]!;\n  }\n\n  // Extract description from lines before first section header\n  const descriptionLines: string[] = [];\n  for (const line of lines) {\n    const trimmed = line.trim();\n    if (!trimmed) {\n      if (descriptionLines.length > 0) break;\n      continue;\n    }\n    if (isSectionHeader(trimmed)) break;\n    if (descriptionLines.length === 0 || descriptionLines.length > 0) {\n      descriptionLines.push(trimmed);\n    }\n  }\n  if (descriptionLines.length > 0) {\n    result.description = descriptionLines.join(' ');\n  }\n\n  for (let i = 0; i < lines.length; i++) {\n    const line = lines[i]!;\n    const trimmed = line.trim();\n\n    if (!trimmed) continue;\n\n    // Detect section headers\n    const sectionType = detectSection(trimmed);\n    if (sectionType) {\n      section = sectionType;\n      continue;\n    }\n\n    // Parse content based on current section\n    switch (section) {\n      case 'commands': {\n        const cmd = parseCommandLine(line);\n        if (cmd) {\n          result.subcommands!.push(cmd);\n        }\n        break;\n      }\n      case 'options': {\n        const field = parseOptionLine(line);\n        if (field) {\n          result.arguments!.push(field);\n        }\n        break;\n      }\n      case 'arguments':\n      case 'positional': {\n        const field = parsePositionalLine(line);\n        if (field) {\n          result.positionals!.push(field);\n        }\n        break;\n      }\n      case 'aliases': {\n        const aliasMatch = trimmed.match(/^\\S+(?:\\s+\\S+)*$/);\n        if (aliasMatch) {\n          // Extract alias from lines like \"gh pr ls\" — the last word is the alias name\n          const parts = trimmed.split(/\\s+/);\n          if (parts.length >= 2) {\n            const alias = parts[parts.length - 1]!;\n            if (!result.aliases) result.aliases = [];\n            result.aliases.push(alias);\n          }\n        }\n        break;\n      }\n      // 'skip', 'usage', 'none' — do nothing\n    }\n  }\n\n  // Clean up empty arrays\n  if (result.arguments!.length === 0) delete result.arguments;\n  if (result.positionals!.length === 0) delete result.positionals;\n  if (result.subcommands!.length === 0) delete result.subcommands;\n  if (result.aliases?.length === 0) delete result.aliases;\n\n  return result;\n}\n\nfunction isSectionHeader(line: string): boolean {\n  // \"USAGE\", \"FLAGS\", \"CORE COMMANDS\", \"Options:\", \"Available Commands:\"\n  return /^[A-Z][A-Za-z\\s]*:?\\s*$/i.test(line) || /^[A-Z][A-Z\\s]+$/i.test(line);\n}\n\nfunction detectSection(line: string): Section | null {\n  const lower = line.toLowerCase().replace(/:$/, '').trim();\n\n  // Commands: \"commands\", \"available commands\", \"subcommands\",\n  // and gh-style: \"core commands\", \"general commands\", \"additional commands\", etc.\n  // Match anything ending in \"commands\" or \"subcommands\", but NOT \"alias commands\"\n  if (/^(?:available\\s+)?(?:commands|subcommands)$/.test(lower)) return 'commands';\n  if (/^(?:\\w+\\s+)*commands$/.test(lower) && !/alias/.test(lower)) return 'commands';\n\n  // Options/Flags: \"options\", \"flags\", \"global options\", \"inherited flags\"\n  if (/^(?:global\\s+|inherited\\s+)?(?:options|flags)$/.test(lower)) return 'options';\n\n  // Positional arguments\n  if (/^(?:positional\\s+)?(?:arguments|args|positionals)$/.test(lower)) return 'positional';\n\n  // Aliases section\n  if (/^alias(?:es)?(?:\\s+commands)?$/.test(lower)) return 'aliases';\n\n  // Usage section\n  if (lower === 'usage') return 'usage';\n\n  // Sections to skip entirely\n  if (/^(?:help\\s+topics|examples?|learn\\s+more|json\\s+fields|see\\s+also|notes?)$/.test(lower)) return 'skip';\n\n  return null;\n}\n\nfunction parseCommandLine(line: string): CommandMeta | null {\n  // Pattern: \"  command-name:    Description text\" (gh-style with colon)\n  const colonMatch = line.match(/^\\s{2,}([\\w][\\w-]*):?\\s{2,}(.+)$/);\n  if (colonMatch) {\n    const name = colonMatch[1]!.replace(/:$/, '');\n    return {\n      name,\n      description: colonMatch[2]!.trim(),\n    };\n  }\n\n  // Pattern: \"  command-name\"  (no description)\n  const nameOnly = line.match(/^\\s{2,}([\\w][\\w-]*):?\\s*$/);\n  if (nameOnly) {\n    return { name: nameOnly[1]!.replace(/:$/, '') };\n  }\n\n  return null;\n}\n\nfunction parseOptionLine(line: string): FieldMeta | null {\n  // Try cobra-style first: \"  -s, --flag type    Description\" or \"      --flag type    Description\"\n  // The type hint can be a bare word (string, int) or a complex placeholder ([HOST/]OWNER/REPO)\n  // but NOT angle-bracket values like <string> (those fall through to GNU pattern)\n  const cobraMatch = line.match(/^\\s{2,}(?:(-\\w),\\s+)?(-{1,2}[\\w-]+)(?:\\s+([^\\s<>]+))?\\s{2,}(.+)$/);\n\n  if (cobraMatch) {\n    const shortFlag = cobraMatch[1];\n    const longFlag = cobraMatch[2]!;\n    const typeHint = cobraMatch[3];\n    const description = cobraMatch[4]?.trim();\n\n    const name = normalizeOptionName(longFlag);\n    const aliases = shortFlag ? [normalizeAlias(shortFlag)] : undefined;\n\n    const { type, ambiguous } = resolveType(typeHint);\n\n    const { defaultValue, resolvedType } = extractDefault(description, type, ambiguous);\n    const { enumValues, resolvedType: finalType } = extractEnum(description, resolvedType);\n\n    return reconcileField({\n      name,\n      type: finalType,\n      description,\n      required: type === 'boolean' ? undefined : true,\n      aliases,\n      default: defaultValue,\n      enumValues,\n      ambiguous: ambiguous || undefined,\n    });\n  }\n\n  // GNU/argparse-style: \"  -s, --long-name <value>    Description\"\n  //                      \"  --long-name=<value>        Description\"\n  const gnuMatch = line.match(/^\\s{2,}(?:(-\\w),?\\s+)?(-{1,2}[\\w-]+)(?:\\s*[=\\s]\\s*(?:<([^>]+)>|\\[([^\\]]+)\\]|(\\w+)))?\\s{2,}(.+)$/);\n\n  if (gnuMatch) {\n    const shortFlag = gnuMatch[1];\n    const longFlag = gnuMatch[2]!;\n    const valueName = gnuMatch[3] || gnuMatch[4] || gnuMatch[5];\n    const description = gnuMatch[6]?.trim();\n\n    const name = normalizeOptionName(longFlag);\n    const aliases = shortFlag ? [normalizeAlias(shortFlag)] : undefined;\n\n    const { type, ambiguous } = resolveType(valueName);\n\n    const { defaultValue, resolvedType } = extractDefault(description, type, ambiguous);\n    const { enumValues, resolvedType: finalType } = extractEnum(description, resolvedType);\n\n    // [value] means optional, <value> means required\n    const required = !gnuMatch[4];\n\n    return reconcileField({\n      name,\n      type: finalType,\n      description,\n      required: finalType === 'boolean' ? undefined : required,\n      aliases,\n      default: defaultValue,\n      enumValues,\n      ambiguous: ambiguous || undefined,\n    });\n  }\n\n  // Simplest pattern: \"  --name    Description\"\n  const simple = line.match(/^\\s{2,}(-{1,2}[\\w-]+)\\s{2,}(.+)$/);\n  if (simple) {\n    const name = normalizeOptionName(simple[1]!);\n    return {\n      name,\n      type: 'boolean',\n      description: simple[2]!.trim(),\n    };\n  }\n\n  return null;\n}\n\n/**\n * Resolve a type hint string to a FieldMeta type.\n */\nfunction resolveType(hint: string | undefined): { type: FieldMeta['type']; ambiguous: boolean } {\n  if (!hint) return { type: 'boolean', ambiguous: false };\n\n  const lower = hint.toLowerCase();\n\n  if (/^(num|number|int|integer|port|count|float|duration)$/.test(lower)) {\n    return { type: 'number', ambiguous: false };\n  }\n  if (/^(str|string|text|name|path|file|dir|url|host|query|expression|template)$/.test(lower)) {\n    return { type: 'string', ambiguous: false };\n  }\n  if (/^(bool|boolean)$/.test(lower)) {\n    return { type: 'boolean', ambiguous: false };\n  }\n  if (/^(strings|fields)$/.test(lower)) {\n    return { type: 'array', ambiguous: false };\n  }\n\n  // Unknown type hint — default to string but mark ambiguous\n  return { type: 'string', ambiguous: true };\n}\n\n/**\n * Extract default value from description text.\n */\nfunction extractDefault(\n  description: string | undefined,\n  type: FieldMeta['type'],\n  ambiguous: boolean,\n): { defaultValue: unknown; resolvedType: FieldMeta['type'] } {\n  let resolvedType = type;\n  let defaultValue: unknown;\n\n  const defaultMatch = description?.match(/\\(default[:\\s]+([^)]+)\\)/i) || description?.match(/\\[default[:\\s]+([^\\]]+)\\]/i);\n  if (defaultMatch) {\n    const raw = defaultMatch[1]!.trim();\n    if (raw === 'true' || raw === 'false') {\n      defaultValue = raw === 'true';\n      resolvedType = 'boolean';\n    } else if (/^\\d+$/.test(raw)) {\n      defaultValue = parseInt(raw, 10);\n      if (resolvedType === 'string' && !ambiguous) resolvedType = 'number';\n    } else if (/^\\d+\\.\\d+$/.test(raw)) {\n      defaultValue = parseFloat(raw);\n      if (resolvedType === 'string' && !ambiguous) resolvedType = 'number';\n    } else {\n      defaultValue = raw.replace(/^[\"']|[\"']$/g, '');\n    }\n  }\n\n  return { defaultValue, resolvedType };\n}\n\n/**\n * Extract enum values from description text.\n */\nfunction extractEnum(\n  description: string | undefined,\n  type: FieldMeta['type'],\n): { enumValues: string[] | undefined; resolvedType: FieldMeta['type'] } {\n  // Explicit choices: (choices: a, b, c) or (one of: a|b|c)\n  const choiceMatch = description?.match(/\\((?:one of|choices?)[:\\s]+([^)]+)\\)/i);\n  if (choiceMatch) {\n    const values = choiceMatch[1]!.split(/[,|]/).map((v) => v.trim().replace(/^[\"']|[\"']$/g, ''));\n    return { enumValues: values, resolvedType: 'enum' };\n  }\n\n  // Inline enum in description: {open|closed|merged|all} (gh-style)\n  const inlineMatch = description?.match(/\\{(\\w+(?:\\|[\\w-]+)+)\\}/);\n  if (inlineMatch) {\n    const values = inlineMatch[1]!.split('|');\n    return { enumValues: values, resolvedType: 'enum' };\n  }\n\n  return { enumValues: undefined, resolvedType: type };\n}\n\n/**\n * Fix up a parsed field for edge cases:\n * - Enum default not in the listed values → add it\n * - Default value type doesn't match declared type → reset to type default + mark ambiguous\n */\nfunction reconcileField(field: FieldMeta): FieldMeta {\n  // If enum has a default that isn't in the value list, add it\n  if (field.type === 'enum' && field.enumValues && field.default !== undefined) {\n    const defStr = String(field.default);\n    if (!field.enumValues.includes(defStr)) {\n      field.enumValues = [...field.enumValues, defStr];\n    }\n  }\n\n  // If the default value doesn't match the declared type, reset + mark ambiguous\n  if (field.default !== undefined) {\n    if (field.type === 'boolean' && typeof field.default !== 'boolean') {\n      field.default = false;\n      field.ambiguous = true;\n    } else if (field.type === 'number' && typeof field.default !== 'number') {\n      field.default = 0;\n      field.ambiguous = true;\n    }\n  }\n\n  return field;\n}\n\nfunction parsePositionalLine(line: string): FieldMeta | null {\n  // Pattern: \"  <name>    Description\"\n  // Pattern: \"  name      Description\"\n  const match = line.match(/^\\s{2,}<?(\\w[\\w-]*)>?\\s{2,}(.+)$/);\n  if (!match) return null;\n\n  return {\n    name: match[1]!,\n    type: 'string',\n    description: match[2]!.trim(),\n    positional: true,\n    ambiguous: true,\n  };\n}\n\n/**\n * Strip leading dashes from a flag name, preserving kebab-case.\n */\nfunction normalizeOptionName(flag: string): string {\n  return flag.replace(/^-+/, '');\n}\n\n/**\n * Strip leading dash from a short alias flag (e.g. '-v' → 'v').\n */\nfunction normalizeAlias(alias: string): string {\n  return alias.replace(/^-/, '');\n}\n"],"mappings":"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"}