{"version":3,"file":"index.mjs","names":[],"sources":["../../src/docs/index.ts"],"sourcesContent":["import { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { dirname, join, resolve } from 'node:path';\nimport { getCommand } from '../core/commands.ts';\nimport type { HelpArgumentInfo, HelpInfo, HelpPositionalInfo, HelpSubcommandInfo } from '../output/formatter.ts';\nimport { getHelpInfo } from '../output/help.ts';\nimport type { AnyPadroneCommand } from '../types/index.ts';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type DocsFormat = 'markdown' | 'html' | 'man' | 'json';\n\nexport type DocsOptions = {\n  /** Output format. Defaults to 'markdown'. */\n  format?: DocsFormat;\n  /** Output directory. If not set, docs are returned but not written. */\n  output?: string;\n  /** Include hidden commands and options. Defaults to false. */\n  includeHidden?: boolean;\n  /** Frontmatter generator for markdown files (VitePress, Starlight, etc.). */\n  frontmatter?: (info: HelpInfo, depth: number) => Record<string, unknown>;\n  /** Whether to overwrite existing files. Defaults to true. */\n  overwrite?: boolean;\n  /** Print what would be written without writing. */\n  dryRun?: boolean;\n};\n\nexport type DocsPage = {\n  /** File path relative to output directory (e.g., \"deploy.md\", \"index.md\"). */\n  path: string;\n  /** Generated content for this page. */\n  content: string;\n  /** The command name this page documents. */\n  command: string;\n};\n\nexport type DocsResult = {\n  /** All generated pages. */\n  pages: DocsPage[];\n  /** Files that were written (empty if no output dir). */\n  written: string[];\n  /** Files that were skipped (already exist, no overwrite). */\n  skipped: string[];\n  /** Files that failed to write. */\n  errors: { file: string; error: Error }[];\n};\n\n// ============================================================================\n// Help Info Collection\n// ============================================================================\n\nfunction collectAllHelpInfo(cmd: AnyPadroneCommand, includeHidden: boolean): HelpInfo[] {\n  const info = getHelpInfo(cmd, 'standard');\n  const result: HelpInfo[] = [info];\n\n  if (cmd.commands) {\n    for (const sub of cmd.commands) {\n      if (!includeHidden && sub.hidden) continue;\n      result.push(...collectAllHelpInfo(sub, includeHidden));\n    }\n  }\n\n  return result;\n}\n\n// ============================================================================\n// Markdown Generator\n// ============================================================================\n\nfunction generateFrontmatter(data: Record<string, unknown>): string {\n  const lines: string[] = ['---'];\n  for (const [key, value] of Object.entries(data)) {\n    if (typeof value === 'string') {\n      lines.push(`${key}: \"${value.replace(/\"/g, '\\\\\"')}\"`);\n    } else if (typeof value === 'number' || typeof value === 'boolean') {\n      lines.push(`${key}: ${value}`);\n    } else if (Array.isArray(value)) {\n      lines.push(`${key}:`);\n      for (const item of value) {\n        lines.push(`  - \"${String(item).replace(/\"/g, '\\\\\"')}\"`);\n      }\n    }\n  }\n  lines.push('---');\n  return lines.join('\\n');\n}\n\nfunction formatMarkdownPositional(arg: HelpPositionalInfo): string {\n  const parts: string[] = [];\n  parts.push(`- \\`${arg.name}\\``);\n  if (arg.type) parts.push(`*(${arg.type})*`);\n  if (arg.optional) parts.push('*(optional)*');\n  if (arg.default !== undefined) parts.push(`— default: \\`${String(arg.default)}\\``);\n  if (arg.description) parts.push(`— ${arg.description}`);\n  return parts.join(' ');\n}\n\nfunction formatMarkdownArgument(arg: HelpArgumentInfo): string[] {\n  const lines: string[] = [];\n\n  const flagName = `--${arg.name}`;\n  const flagStr = arg.flags?.length ? `${arg.flags.map((f) => `-${f}`).join(', ')}, ` : '';\n  const aliasStr = arg.aliases?.length ? `${arg.aliases.map((a) => `--${a}`).join(', ')}, ` : '';\n  const header = `#### \\`${flagStr}${aliasStr}${flagName}\\``;\n  lines.push(header);\n  lines.push('');\n\n  if (arg.description) {\n    lines.push(arg.description);\n    lines.push('');\n  }\n\n  const meta: string[] = [];\n  if (arg.type && arg.type !== 'boolean') meta.push(`**Type:** \\`${arg.type}\\``);\n  if (!arg.optional) meta.push('**Required**');\n  if (arg.default !== undefined) meta.push(`**Default:** \\`${String(arg.default)}\\``);\n  if (arg.enum) meta.push(`**Choices:** ${arg.enum.map((v) => `\\`${v}\\``).join(', ')}`);\n  if (arg.variadic) meta.push('**Repeatable**');\n  if (arg.deprecated) {\n    const msg = typeof arg.deprecated === 'string' ? arg.deprecated : '';\n    meta.push(`**Deprecated**${msg ? `: ${msg}` : ''}`);\n  }\n\n  if (meta.length > 0) {\n    lines.push(meta.join(' | '));\n    lines.push('');\n  }\n\n  if (arg.env) {\n    const envVars = typeof arg.env === 'string' ? [arg.env] : arg.env;\n    lines.push(`**Environment:** ${envVars.map((v) => `\\`${v}\\``).join(', ')}`);\n    lines.push('');\n  }\n\n  if (arg.configKey) {\n    lines.push(`**Config key:** \\`${arg.configKey}\\``);\n    lines.push('');\n  }\n\n  if (arg.examples?.length) {\n    lines.push(`**Examples:** ${arg.examples.map((e) => `\\`${typeof e === 'string' ? e : JSON.stringify(e)}\\``).join(', ')}`);\n    lines.push('');\n  }\n\n  return lines;\n}\n\nfunction formatMarkdownSubcommand(sub: HelpSubcommandInfo): string {\n  const parts: string[] = [];\n  const suffix = sub.hasSubcommands ? ' ...' : '';\n  parts.push(`| \\`${sub.name}${suffix}\\``);\n\n  const aliases = sub.aliases?.filter((a) => a !== '[default]');\n  parts.push(`| ${aliases?.length ? aliases.map((a) => `\\`${a}\\``).join(', ') : ''}`);\n\n  const desc = sub.title ?? sub.description ?? '';\n  parts.push(`| ${desc}`);\n  parts.push('|');\n\n  return parts.join(' ');\n}\n\nfunction generateMarkdownPage(info: HelpInfo, depth: number, frontmatterFn?: DocsOptions['frontmatter']): string {\n  const lines: string[] = [];\n\n  if (frontmatterFn) {\n    const fm = frontmatterFn(info, depth);\n    if (Object.keys(fm).length > 0) {\n      lines.push(generateFrontmatter(fm));\n      lines.push('');\n    }\n  }\n\n  // Title\n  const displayName = info.name === '<root>' || !info.name ? 'CLI Reference' : info.name;\n  lines.push(`# ${displayName}`);\n  lines.push('');\n\n  // Deprecation warning\n  if (info.deprecated) {\n    const msg = typeof info.deprecated === 'string' ? info.deprecated : 'This command is deprecated.';\n    lines.push(`> **Deprecated:** ${msg}`);\n    lines.push('');\n  }\n\n  // Description\n  if (info.title) {\n    lines.push(`> ${info.title}`);\n    lines.push('');\n  }\n  if (info.description) {\n    lines.push(info.description);\n    lines.push('');\n  }\n\n  // Aliases\n  if (info.aliases?.length) {\n    const realAliases = info.aliases.filter((a) => a !== '[default]');\n    if (realAliases.length > 0) {\n      lines.push(`**Aliases:** ${realAliases.map((a) => `\\`${a}\\``).join(', ')}`);\n      lines.push('');\n    }\n  }\n\n  // Usage\n  const usageParts: string[] = [info.usage.command];\n  if (info.usage.hasSubcommands) usageParts.push('[command]');\n  if (info.positionals?.length) {\n    for (const arg of info.positionals) {\n      usageParts.push(arg.optional ? `[${arg.name}]` : `<${arg.name}>`);\n    }\n  }\n  if (info.usage.hasArguments) usageParts.push('[options]');\n\n  lines.push('## Usage');\n  lines.push('');\n  lines.push('```');\n  lines.push(usageParts.join(' '));\n  lines.push('```');\n  lines.push('');\n\n  // Examples\n  if (info.examples?.length) {\n    lines.push('## Examples');\n    lines.push('');\n    lines.push('```');\n    for (const ex of info.examples) {\n      lines.push(`$ ${ex}`);\n    }\n    lines.push('```');\n    lines.push('');\n  }\n\n  // Subcommands\n  if (info.subcommands?.length) {\n    const visibleSubs = info.subcommands.filter((s) => !s.hidden);\n    if (visibleSubs.length > 0) {\n      lines.push('## Commands');\n      lines.push('');\n      lines.push('| Command | Aliases | Description |');\n      lines.push('| --- | --- | --- |');\n      for (const sub of visibleSubs) {\n        lines.push(formatMarkdownSubcommand(sub));\n      }\n      lines.push('');\n    }\n  }\n\n  // Positional arguments\n  if (info.positionals?.length) {\n    lines.push('## Arguments');\n    lines.push('');\n    for (const arg of info.positionals) {\n      lines.push(formatMarkdownPositional(arg));\n    }\n    lines.push('');\n  }\n\n  // Options\n  if (info.arguments?.length) {\n    lines.push('## Options');\n    lines.push('');\n    for (const arg of info.arguments) {\n      lines.push(...formatMarkdownArgument(arg));\n    }\n  }\n\n  return `${lines.join('\\n').trimEnd()}\\n`;\n}\n\n// ============================================================================\n// HTML Generator\n// ============================================================================\n\nfunction escapeHtml(text: string): string {\n  return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n}\n\nfunction generateHtmlPage(info: HelpInfo, depth: number): string {\n  const displayName = info.name === '<root>' || !info.name ? 'CLI Reference' : escapeHtml(info.name);\n\n  const sections: string[] = [];\n\n  // Header\n  sections.push(`<article class=\"padrone-docs-page\" data-command=\"${escapeHtml(info.name)}\" data-depth=\"${depth}\">`);\n  sections.push(`  <h1>${displayName}</h1>`);\n\n  if (info.deprecated) {\n    const msg = typeof info.deprecated === 'string' ? escapeHtml(info.deprecated) : 'This command is deprecated.';\n    sections.push(`  <div class=\"deprecated-warning\"><strong>Deprecated:</strong> ${msg}</div>`);\n  }\n\n  if (info.title) {\n    sections.push(`  <p class=\"command-title\">${escapeHtml(info.title)}</p>`);\n  }\n  if (info.description) {\n    sections.push(`  <p class=\"command-description\">${escapeHtml(info.description)}</p>`);\n  }\n\n  // Aliases\n  if (info.aliases?.length) {\n    const realAliases = info.aliases.filter((a) => a !== '[default]');\n    if (realAliases.length > 0) {\n      sections.push(`  <p><strong>Aliases:</strong> ${realAliases.map((a) => `<code>${escapeHtml(a)}</code>`).join(', ')}</p>`);\n    }\n  }\n\n  // Usage\n  const usageParts: string[] = [info.usage.command];\n  if (info.usage.hasSubcommands) usageParts.push('[command]');\n  if (info.positionals?.length) {\n    for (const arg of info.positionals) {\n      usageParts.push(arg.optional ? `[${arg.name}]` : `<${arg.name}>`);\n    }\n  }\n  if (info.usage.hasArguments) usageParts.push('[options]');\n\n  sections.push('  <h2>Usage</h2>');\n  sections.push(`  <pre><code>${escapeHtml(usageParts.join(' '))}</code></pre>`);\n\n  // Examples\n  if (info.examples?.length) {\n    sections.push('  <h2>Examples</h2>');\n    sections.push(`  <pre><code>${info.examples.map((ex) => `$ ${escapeHtml(ex)}`).join('\\n')}</code></pre>`);\n  }\n\n  // Subcommands\n  if (info.subcommands?.length) {\n    const visibleSubs = info.subcommands.filter((s) => !s.hidden);\n    if (visibleSubs.length > 0) {\n      sections.push('  <h2>Commands</h2>');\n      sections.push('  <table>');\n      sections.push('    <thead><tr><th>Command</th><th>Aliases</th><th>Description</th></tr></thead>');\n      sections.push('    <tbody>');\n      for (const sub of visibleSubs) {\n        const aliases = sub.aliases?.filter((a) => a !== '[default]');\n        const desc = sub.title ?? sub.description ?? '';\n        const suffix = sub.hasSubcommands ? ' ...' : '';\n        sections.push(\n          `      <tr><td><code>${escapeHtml(sub.name + suffix)}</code></td><td>${aliases?.length ? aliases.map((a) => `<code>${escapeHtml(a)}</code>`).join(', ') : ''}</td><td>${escapeHtml(desc)}</td></tr>`,\n        );\n      }\n      sections.push('    </tbody>');\n      sections.push('  </table>');\n    }\n  }\n\n  // Positional arguments\n  if (info.positionals?.length) {\n    sections.push('  <h2>Arguments</h2>');\n    sections.push('  <dl>');\n    for (const arg of info.positionals) {\n      sections.push(\n        `    <dt><code>${escapeHtml(arg.name)}</code>${arg.type ? ` <span class=\"type\">${escapeHtml(arg.type)}</span>` : ''}${arg.optional ? ' <em>(optional)</em>' : ''}</dt>`,\n      );\n      if (arg.description) sections.push(`    <dd>${escapeHtml(arg.description)}</dd>`);\n      if (arg.default !== undefined) sections.push(`    <dd>Default: <code>${escapeHtml(String(arg.default))}</code></dd>`);\n    }\n    sections.push('  </dl>');\n  }\n\n  // Options\n  if (info.arguments?.length) {\n    sections.push('  <h2>Options</h2>');\n    sections.push('  <dl>');\n    for (const arg of info.arguments) {\n      const flagName = `--${arg.name}`;\n      const flagStr = arg.flags?.length ? `${arg.flags.map((f) => `-${f}`).join(', ')}, ` : '';\n      const aliasStr = arg.aliases?.length ? `${arg.aliases.map((a) => `--${a}`).join(', ')}, ` : '';\n      const typeSpan = arg.type && arg.type !== 'boolean' ? ` <span class=\"type\">${escapeHtml(arg.type)}</span>` : '';\n      sections.push(`    <dt><code>${escapeHtml(flagStr + aliasStr + flagName)}</code>${typeSpan}</dt>`);\n      if (arg.description) sections.push(`    <dd>${escapeHtml(arg.description)}</dd>`);\n\n      const meta: string[] = [];\n      if (!arg.optional) meta.push('Required');\n      if (arg.default !== undefined) meta.push(`Default: <code>${escapeHtml(String(arg.default))}</code>`);\n      if (arg.enum) meta.push(`Choices: ${arg.enum.map((v) => `<code>${escapeHtml(v)}</code>`).join(', ')}`);\n      if (arg.variadic) meta.push('Repeatable');\n      if (arg.deprecated) {\n        const msg = typeof arg.deprecated === 'string' ? escapeHtml(arg.deprecated) : '';\n        meta.push(`Deprecated${msg ? `: ${msg}` : ''}`);\n      }\n      if (meta.length > 0) sections.push(`    <dd class=\"meta\">${meta.join(' · ')}</dd>`);\n\n      if (arg.env) {\n        const envVars = typeof arg.env === 'string' ? [arg.env] : arg.env;\n        sections.push(`    <dd>Environment: ${envVars.map((v) => `<code>${escapeHtml(v)}</code>`).join(', ')}</dd>`);\n      }\n      if (arg.configKey) {\n        sections.push(`    <dd>Config key: <code>${escapeHtml(arg.configKey)}</code></dd>`);\n      }\n    }\n    sections.push('  </dl>');\n  }\n\n  sections.push('</article>');\n  return `${sections.join('\\n')}\\n`;\n}\n\n// ============================================================================\n// Man Page Generator (experimental)\n// ============================================================================\n\nfunction escapeMan(text: string): string {\n  return text.replace(/\\\\/g, '\\\\\\\\').replace(/-/g, '\\\\-').replace(/'/g, '\\\\(aq');\n}\n\nfunction generateManPage(info: HelpInfo, _depth: number, programName: string): string {\n  const commandName = info.name === '<root>' || !info.name ? programName : info.name;\n  const manName = commandName.replace(/\\s+/g, '-');\n  const lines: string[] = [];\n\n  lines.push(`.TH \"${escapeMan(manName.toUpperCase())}\" \"1\" \"\" \"\" \"\"`);\n\n  // NAME\n  lines.push('.SH NAME');\n  const desc = info.title ?? info.description ?? '';\n  lines.push(`${escapeMan(manName)}${desc ? ` \\\\- ${escapeMan(desc)}` : ''}`);\n\n  // SYNOPSIS\n  lines.push('.SH SYNOPSIS');\n  const usageParts: string[] = [`\\\\fB${escapeMan(commandName)}\\\\fR`];\n  if (info.usage.hasSubcommands) usageParts.push('[\\\\fIcommand\\\\fR]');\n  if (info.positionals?.length) {\n    for (const arg of info.positionals) {\n      usageParts.push(arg.optional ? `[\\\\fI${escapeMan(arg.name)}\\\\fR]` : `\\\\fI${escapeMan(arg.name)}\\\\fR`);\n    }\n  }\n  if (info.usage.hasArguments) usageParts.push('[\\\\fIoptions\\\\fR]');\n  lines.push(usageParts.join(' '));\n\n  // DESCRIPTION\n  if (info.description) {\n    lines.push('.SH DESCRIPTION');\n    lines.push(escapeMan(info.description));\n  }\n\n  // EXAMPLES\n  if (info.examples?.length) {\n    lines.push('.SH EXAMPLES');\n    for (const ex of info.examples) {\n      lines.push('.PP');\n      lines.push(`.nf\\n$ ${escapeMan(ex)}\\n.fi`);\n    }\n  }\n\n  // COMMANDS\n  if (info.subcommands?.length) {\n    const visibleSubs = info.subcommands.filter((s) => !s.hidden);\n    if (visibleSubs.length > 0) {\n      lines.push('.SH COMMANDS');\n      for (const sub of visibleSubs) {\n        const suffix = sub.hasSubcommands ? ' ...' : '';\n        lines.push(`.TP`);\n        lines.push(`\\\\fB${escapeMan(sub.name + suffix)}\\\\fR`);\n        const subDesc = sub.title ?? sub.description;\n        if (subDesc) lines.push(escapeMan(subDesc));\n      }\n    }\n  }\n\n  // ARGUMENTS\n  if (info.positionals?.length) {\n    lines.push('.SH ARGUMENTS');\n    for (const arg of info.positionals) {\n      lines.push('.TP');\n      lines.push(`\\\\fI${escapeMan(arg.name)}\\\\fR`);\n      const parts: string[] = [];\n      if (arg.description) parts.push(escapeMan(arg.description));\n      if (arg.optional) parts.push('(optional)');\n      if (arg.default !== undefined) parts.push(`Default: ${escapeMan(String(arg.default))}`);\n      if (parts.length > 0) lines.push(parts.join('. '));\n    }\n  }\n\n  // OPTIONS\n  if (info.arguments?.length) {\n    lines.push('.SH OPTIONS');\n    for (const arg of info.arguments) {\n      const flagName = `\\\\-\\\\-${escapeMan(arg.name)}`;\n      const flagStr = arg.flags?.length ? `${arg.flags.map((f) => `\\\\-${escapeMan(f)}`).join(', ')}, ` : '';\n      const aliasStr = arg.aliases?.length ? `${arg.aliases.map((a) => `\\\\-\\\\-${escapeMan(a)}`).join(', ')}, ` : '';\n      lines.push('.TP');\n      lines.push(`\\\\fB${flagStr}${aliasStr}${flagName}\\\\fR${arg.type ? ` \\\\fI${escapeMan(arg.type)}\\\\fR` : ''}`);\n      const parts: string[] = [];\n      if (arg.description) parts.push(escapeMan(arg.description));\n      if (arg.default !== undefined) parts.push(`Default: ${escapeMan(String(arg.default))}`);\n      if (arg.enum) parts.push(`Choices: ${arg.enum.map((v) => escapeMan(v)).join(', ')}`);\n      if (parts.length > 0) lines.push(parts.join('. '));\n\n      if (arg.env) {\n        const envVars = typeof arg.env === 'string' ? [arg.env] : arg.env;\n        lines.push(`.br`);\n        lines.push(`Environment: ${envVars.map((v) => escapeMan(v)).join(', ')}`);\n      }\n    }\n  }\n\n  return `${lines.join('\\n')}\\n`;\n}\n\n// ============================================================================\n// Page Path Helpers\n// ============================================================================\n\nfunction commandToPath(info: HelpInfo, ext: string, isRoot: boolean): string {\n  if (isRoot) return `index${ext}`;\n  // Split on whitespace and replace empty segments (from empty-name default commands) with \"_default\"\n  const segments = info.name.split(/\\s+/).map((s) => s || '_default');\n  return segments.join('/') + ext;\n}\n\n// ============================================================================\n// Index Page Generators\n// ============================================================================\n\nfunction generateMarkdownIndex(rootInfo: HelpInfo, allInfos: HelpInfo[]): string {\n  const lines: string[] = [];\n  lines.push(`# ${rootInfo.title ?? rootInfo.name ?? 'CLI'} Reference`);\n  lines.push('');\n\n  if (rootInfo.description) {\n    lines.push(rootInfo.description);\n    lines.push('');\n  }\n\n  if (allInfos.length > 1) {\n    lines.push('## Commands');\n    lines.push('');\n    for (const info of allInfos) {\n      const path = commandToPath(info, '.md', info === rootInfo);\n      const name = info === rootInfo ? info.name || 'root' : info.name;\n      const desc = info.title ?? info.description ?? '';\n      lines.push(`- [${name}](${path})${desc ? ` — ${desc}` : ''}`);\n    }\n    lines.push('');\n  }\n\n  return `${lines.join('\\n').trimEnd()}\\n`;\n}\n\n// ============================================================================\n// Main Entry Point\n// ============================================================================\n\n/**\n * Generate documentation for a Padrone CLI program or command tree.\n * Accepts either a PadroneProgram (from createPadrone()) or a raw AnyPadroneCommand.\n */\nexport function generateDocs(program: object, options: DocsOptions = {}): DocsResult {\n  const { format = 'markdown', output, includeHidden = false, frontmatter, overwrite = true, dryRun = false } = options;\n\n  const cmd = getCommand(program);\n  const allInfos = collectAllHelpInfo(cmd, includeHidden);\n  const rootInfo = allInfos[0]!;\n  const programName = cmd.name || 'program';\n\n  const pages: DocsPage[] = [];\n\n  const ext = format === 'markdown' ? '.md' : format === 'html' ? '.html' : format === 'man' ? '.1' : '.json';\n\n  for (let i = 0; i < allInfos.length; i++) {\n    const info = allInfos[i]!;\n    const isRoot = i === 0;\n    const depth = isRoot ? 0 : info.name.split(/\\s+/).length;\n    const path = commandToPath(info, ext, isRoot);\n\n    let content: string;\n    switch (format) {\n      case 'markdown':\n        content = generateMarkdownPage(info, depth, frontmatter);\n        break;\n      case 'html':\n        content = generateHtmlPage(info, depth);\n        break;\n      case 'man':\n        content = generateManPage(info, depth, programName);\n        break;\n      case 'json':\n        content = `${JSON.stringify(info, null, 2)}\\n`;\n        break;\n    }\n\n    pages.push({ path, content, command: info.name });\n  }\n\n  // Generate index page for markdown (when there are subcommands)\n  if (format === 'markdown' && allInfos.length > 1) {\n    // Replace the root page with a combined index\n    const rootPage = pages[0]!;\n    rootPage.content = generateMarkdownIndex(rootInfo, allInfos);\n  }\n\n  const result: DocsResult = { pages, written: [], skipped: [], errors: [] };\n\n  // Write to disk if output dir specified\n  if (output) {\n    const outDir = resolve(output);\n\n    for (const page of pages) {\n      const fullPath = join(outDir, page.path);\n\n      try {\n        if (existsSync(fullPath) && !overwrite) {\n          result.skipped.push(page.path);\n          continue;\n        }\n\n        if (dryRun) {\n          result.written.push(page.path);\n          continue;\n        }\n\n        const dir = dirname(fullPath);\n        mkdirSync(dir, { recursive: true });\n        writeFileSync(fullPath, page.content, 'utf-8');\n        result.written.push(page.path);\n      } catch (err) {\n        result.errors.push({\n          file: page.path,\n          error: err instanceof Error ? err : new Error(String(err)),\n        });\n      }\n    }\n  }\n\n  return result;\n}\n\n// ============================================================================\n// Man Page Installation\n// ============================================================================\n\nexport type SetupManPagesResult = {\n  /** Directory where man pages were written. */\n  dir: string;\n  /** Man page files that were written. */\n  written: string[];\n  /** Whether existing pages were overwritten (true) or newly created (false). */\n  updated: boolean;\n};\n\n/**\n * Returns the local man page directory for the given section.\n * Uses `~/.local/share/man/man<section>` (XDG convention).\n */\nasync function getManPageDir(section = 1): Promise<string> {\n  const { homedir } = await import('node:os');\n  return join(process.env.XDG_DATA_HOME || join(homedir(), '.local', 'share'), 'man', `man${section}`);\n}\n\n/**\n * Converts a command name to a man page filename.\n * \"myapp\" → \"myapp.1\", \"myapp deploy\" → \"myapp-deploy.1\"\n */\nfunction manPageFilename(commandName: string, section = 1): string {\n  return `${commandName.replace(/\\s+/g, '-')}.${section}`;\n}\n\n/**\n * Installs man pages for a Padrone CLI program into the local man directory.\n * Generates man pages for all commands and writes them to `~/.local/share/man/man1/`.\n *\n * After installation, `man <program>` and `man <program>-<subcommand>` should work\n * (assuming `~/.local/share/man` is in `MANPATH` or `manpath` picks it up).\n */\nexport async function setupManPages(program: object): Promise<SetupManPagesResult> {\n  const cmd = getCommand(program);\n  const allInfos = collectAllHelpInfo(cmd, false);\n  const programName = cmd.name || 'program';\n  const manDir = await getManPageDir(1);\n\n  mkdirSync(manDir, { recursive: true });\n\n  const written: string[] = [];\n  let updated = false;\n\n  for (let i = 0; i < allInfos.length; i++) {\n    const info = allInfos[i]!;\n    const depth = i === 0 ? 0 : info.name.split(/\\s+/).length;\n    const commandName = info.name === '<root>' || !info.name ? programName : info.name;\n    const filename = manPageFilename(commandName);\n    const fullPath = join(manDir, filename);\n\n    if (existsSync(fullPath)) updated = true;\n\n    const content = generateManPage(info, depth, programName);\n    writeFileSync(fullPath, content, 'utf-8');\n    written.push(filename);\n  }\n\n  return { dir: manDir, written, updated };\n}\n\n/**\n * Removes installed man pages for a Padrone CLI program.\n */\nexport async function removeManPages(program: object): Promise<{ dir: string; removed: string[] }> {\n  const { unlinkSync } = await import('node:fs');\n  const cmd = getCommand(program);\n  const allInfos = collectAllHelpInfo(cmd, false);\n  const programName = cmd.name || 'program';\n  const manDir = await getManPageDir(1);\n  const removed: string[] = [];\n\n  for (let i = 0; i < allInfos.length; i++) {\n    const info = allInfos[i]!;\n    const commandName = info.name === '<root>' || !info.name ? programName : info.name;\n    const filename = manPageFilename(commandName);\n    const fullPath = join(manDir, filename);\n\n    if (existsSync(fullPath)) {\n      unlinkSync(fullPath);\n      removed.push(filename);\n    }\n  }\n\n  return { dir: manDir, removed };\n}\n"],"mappings":"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"}