{"version":3,"file":"cli.mjs","names":[],"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { realpathSync } from \"node:fs\"\nimport { fileURLToPath } from \"node:url\"\n\nimport {\n  DEFAULT_MODEL,\n  type PublisherSelection,\n  type RetryOptions,\n  retryReleaseAnnouncement,\n} from \"./retry\"\n\nconst publisherSelections: ReadonlySet<string> = new Set<PublisherSelection>([\n  \"both\",\n  \"discord\",\n  \"slack\",\n])\n\nfunction isPublisherSelection(value: string): value is PublisherSelection {\n  return publisherSelections.has(value)\n}\n\nfunction readValue(args: string[], index: number, flag: string) {\n  const value = args[index + 1]\n  if (!value || value.startsWith(\"--\")) {\n    throw new Error(`Missing value for ${flag}`)\n  }\n\n  return value\n}\n\nfunction readBoolean(value: string | undefined) {\n  switch (value) {\n    case undefined:\n    case \"true\":\n      return true\n    case \"false\":\n      return false\n    default:\n      throw new Error(`Expected boolean value, received ${value}`)\n  }\n}\n\nfunction readOptionalValue(args: string[], index: number) {\n  const value = args[index + 1]\n  if (!value || value.startsWith(\"--\")) return undefined\n  return value\n}\n\nfunction realpathOrOriginal(path: string) {\n  try {\n    return realpathSync(path)\n  } catch {\n    return path\n  }\n}\n\nexport function isCliEntrypoint(argvPath = process.argv[1], moduleUrl = import.meta.url) {\n  if (!argvPath) return false\n\n  return realpathOrOriginal(argvPath) === fileURLToPath(moduleUrl)\n}\n\nfunction printRetryHelp() {\n  console.info(`Usage: ai-changelog retry [options]\n\nOptions:\n  --version <version>          Release version, for example 1.0.1\n  --tag <tag>                  Release tag, for example v1.0.1\n  --branch <branch>            Branch name to show in notification metadata\n  --publisher <target>         both, slack, or discord (default: both)\n  --dry-run [true|false]       Generate payloads without posting\n  --gateway-api-key <key>      Override AI_GATEWAY_API_KEY\n  --discord-webhook-url <url>  Override AI_CHANGELOG_DISCORD_WEBHOOK\n  --slack-webhook-url <url>    Override AI_CHANGELOG_SLACK_WEBHOOK\n  --model <model>              AI Gateway model (default: ${DEFAULT_MODEL})\n  --prompt <prompt>            Override the system prompt\n  --include-path <path>        Include git path; repeat or comma-separate\n  --exclude-path <path>        Exclude git path; repeat or comma-separate\n  --help                       Show this help\n`)\n}\n\nexport function parseRetryArgs(args: string[]): RetryOptions {\n  const parsed: RetryOptions = {\n    branchName: \"\",\n    publisher: \"both\",\n    model: DEFAULT_MODEL,\n  }\n\n  for (let index = 0; index < args.length; index += 1) {\n    const arg = args[index]\n\n    switch (arg) {\n      case \"--version\":\n        parsed.version = readValue(args, index, arg)\n        index += 1\n        break\n      case \"--tag\":\n        parsed.tag = readValue(args, index, arg)\n        index += 1\n        break\n      case \"--branch\":\n        parsed.branchName = readValue(args, index, arg)\n        index += 1\n        break\n      case \"--publisher\": {\n        const publisher = readValue(args, index, arg)\n        if (!isPublisherSelection(publisher)) {\n          throw new Error(\"--publisher must be one of both, slack, or discord\")\n        }\n        parsed.publisher = publisher\n        index += 1\n        break\n      }\n      case \"--dry-run\": {\n        const value = readOptionalValue(args, index)\n        parsed.dryRun = readBoolean(value)\n        if (value) index += 1\n        break\n      }\n      case \"--gateway-api-key\":\n        parsed.gatewayApiKey = readValue(args, index, arg)\n        index += 1\n        break\n      case \"--discord-webhook-url\":\n        parsed.discordWebhookUrl = readValue(args, index, arg)\n        index += 1\n        break\n      case \"--slack-webhook-url\":\n        parsed.slackWebhookUrl = readValue(args, index, arg)\n        index += 1\n        break\n      case \"--model\":\n        parsed.model = readValue(args, index, arg)\n        index += 1\n        break\n      case \"--prompt\":\n        parsed.prompt = readValue(args, index, arg)\n        index += 1\n        break\n      case \"--include-path\":\n        parsed.includePaths = [...(parsed.includePaths ?? []), readValue(args, index, arg)]\n        index += 1\n        break\n      case \"--exclude-path\":\n        parsed.excludePaths = [...(parsed.excludePaths ?? []), readValue(args, index, arg)]\n        index += 1\n        break\n      case \"--help\":\n        printRetryHelp()\n        throw new Error(\"__HELP__\")\n      default:\n        throw new Error(`Unknown option ${arg}`)\n    }\n  }\n\n  if (parsed.version && parsed.tag) {\n    throw new Error(\"Use either --version or --tag, not both\")\n  }\n\n  if (!parsed.branchName.trim()) {\n    throw new Error(\"Missing required --branch\")\n  }\n\n  return parsed\n}\n\nasync function main() {\n  const [command, ...args] = process.argv.slice(2)\n\n  if (command !== \"retry\") {\n    console.error(\"Usage: ai-changelog retry [options]\")\n    process.exitCode = 1\n    return\n  }\n\n  try {\n    const options = parseRetryArgs(args)\n    await retryReleaseAnnouncement({\n      options,\n      logger: console,\n    })\n  } catch (error) {\n    if (error instanceof Error && error.message === \"__HELP__\") return\n    console.error(error instanceof Error ? error.message : String(error))\n    process.exitCode = 1\n  }\n}\n\nif (isCliEntrypoint()) {\n  await main()\n}\n"],"mappings":"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"}