ckweb-cli 0.5.0 → 0.6.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -3
- package/dist/index.js +160 -36
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/env-resolver.ts","../src/index.ts","../src/lib/errors.ts","../src/commands/auth.ts","../src/lib/config.ts","../src/lib/api-client.ts","../src/lib/output.ts","../src/commands/youtube.ts","../src/commands/web.ts","../src/commands/seo.ts","../src/commands/orders.ts","../src/commands/referrals.ts","../src/commands/blog.ts","../src/commands/health.ts","../src/commands/account.ts","../src/commands/checkout.ts","../src/commands/github.ts","../src/commands/loyalty.ts","../src/commands/newsletter.ts","../src/commands/payout.ts","../src/commands/pricing.ts","../src/commands/refunds.ts","../src/commands/releases.ts","../src/commands/stats.ts","../src/commands/waitlist.ts","../src/commands/admin/admin-utils.ts","../src/commands/admin/admin-orders.ts","../src/commands/admin/admin-users.ts","../src/commands/admin/admin-referrals.ts","../src/commands/admin/admin-revenue.ts","../src/commands/admin/admin-payouts.ts","../src/commands/admin/admin-loyalty.ts","../src/commands/admin/admin-blog.ts","../src/commands/admin/admin-blog-categories.ts","../src/commands/admin/admin-blog-tags.ts","../src/commands/admin/admin-keys.ts","../src/commands/admin/admin-invites.ts","../src/commands/admin/admin-licenses.ts","../src/commands/admin/admin-admins.ts","../src/commands/admin/admin-discounts.ts","../src/commands/admin/admin-discount-groups.ts","../src/commands/admin/admin-tiers.ts","../src/commands/admin/index.ts"],"sourcesContent":["import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nexport const ENV_USER_KEY = \"CKWEB_API_KEY\";\nexport const ENV_ADMIN_KEY = \"CKWEB_ADMIN_API_KEY\";\nexport const ENV_BASE_URL = \"CKWEB_API_URL\";\n\n// Parsed .env.* values (populated by loadDotenvFiles()). Intentionally NOT written\n// into process.env — that way `process.env` keeps representing the OS-level tier\n// only, and the priority chain (OS > config > dotenv) stays observable.\nconst DOTENV_VALUES: Record<string, string> = {};\n\n// Standard precedence (first wins): .env.local overrides .env\nconst DOTENV_FILES = [\".env.local\", \".env\"];\n\n/** Minimal dotenv parser: KEY=VALUE, supports single/double quotes and # comments. */\nfunction parseDotenv(src: string): Record<string, string> {\n const out: Record<string, string> = {};\n for (const rawLine of src.split(/\\r?\\n/)) {\n const line = rawLine.trim();\n if (!line || line.startsWith(\"#\")) continue;\n const eq = line.indexOf(\"=\");\n if (eq <= 0) continue;\n const key = line.slice(0, eq).trim();\n let value = line.slice(eq + 1).trim();\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n } else {\n // strip inline comment for unquoted values\n const hash = value.indexOf(\" #\");\n if (hash >= 0) value = value.slice(0, hash).trim();\n }\n if (key) out[key] = value;\n }\n return out;\n}\n\n/** Load .env.* files from cwd (idempotent-ish — later calls re-read). */\nexport function loadDotenvFiles(cwd: string = process.cwd()): void {\n for (const file of DOTENV_FILES) {\n const full = path.join(cwd, file);\n if (!fs.existsSync(full)) continue;\n try {\n const parsed = parseDotenv(fs.readFileSync(full, \"utf8\"));\n for (const [k, v] of Object.entries(parsed)) {\n if (!(k in DOTENV_VALUES)) DOTENV_VALUES[k] = v;\n }\n } catch {\n // ignore unreadable .env files\n }\n }\n}\n\n/** Resolve env var with priority: OS-level > .env.* */\nexport function resolveEnv(name: string): string | undefined {\n return resolveOsEnv(name) ?? resolveDotenv(name);\n}\n\n/** OS-level only — reads `process.env` live (never contains dotenv values). */\nexport function resolveOsEnv(name: string): string | undefined {\n const v = process.env[name];\n return v !== undefined && v !== \"\" ? v : undefined;\n}\n\n/** Dotenv-file only — fallback tier. */\nexport function resolveDotenv(name: string): string | undefined {\n const v = DOTENV_VALUES[name];\n return v !== undefined && v !== \"\" ? v : undefined;\n}\n\n/** Test helper: clear parsed dotenv values. */\nexport function __resetDotenvForTests(): void {\n for (const k of Object.keys(DOTENV_VALUES)) delete DOTENV_VALUES[k];\n}\n","// Import env-resolver first so OS_ENV is snapshotted before anything else can\n// mutate process.env. Then load .env.* files into the fallback layer.\nimport { loadDotenvFiles } from \"./lib/env-resolver.js\";\nloadDotenvFiles();\n\nimport { Command } from \"commander\";\nimport { handleError } from \"./lib/errors.js\";\nimport { registerAuthCommand } from \"./commands/auth.js\";\nimport { registerYoutubeCommand } from \"./commands/youtube.js\";\nimport { registerWebCommand } from \"./commands/web.js\";\nimport { registerSeoCommand } from \"./commands/seo.js\";\nimport { registerOrdersCommand } from \"./commands/orders.js\";\nimport { registerReferralsCommand } from \"./commands/referrals.js\";\nimport { registerBlogCommand } from \"./commands/blog.js\";\nimport { registerHealthCommand } from \"./commands/health.js\";\nimport { registerAccountCommand } from \"./commands/account.js\";\nimport { registerCheckoutCommand } from \"./commands/checkout.js\";\nimport { registerGithubCommand } from \"./commands/github.js\";\nimport { registerLoyaltyCommand } from \"./commands/loyalty.js\";\nimport { registerNewsletterCommand } from \"./commands/newsletter.js\";\nimport { registerPayoutCommand } from \"./commands/payout.js\";\nimport { registerPricingCommand } from \"./commands/pricing.js\";\nimport { registerRefundsCommand } from \"./commands/refunds.js\";\nimport { registerReleasesCommand } from \"./commands/releases.js\";\nimport { registerStatsCommand } from \"./commands/stats.js\";\nimport { registerWaitlistCommand } from \"./commands/waitlist.js\";\nimport { registerAdminCommand } from \"./commands/admin/index.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"ckweb\")\n .description(\"CLI for interacting with ClaudeKit.cc API\")\n .version(__PKG_VERSION__);\n\n// Global output options\nprogram\n .option(\"--json\", \"Output as JSON\")\n .option(\"--table\", \"Output as table\")\n .option(\"--quiet\", \"Minimal output\");\n\n// Register all command groups\nregisterAuthCommand(program);\nregisterHealthCommand(program);\n\n// User commands\nregisterOrdersCommand(program);\nregisterReferralsCommand(program);\nregisterBlogCommand(program);\nregisterAccountCommand(program);\nregisterCheckoutCommand(program);\nregisterGithubCommand(program);\nregisterLoyaltyCommand(program);\nregisterNewsletterCommand(program);\nregisterPayoutCommand(program);\nregisterPricingCommand(program);\nregisterRefundsCommand(program);\nregisterReleasesCommand(program);\nregisterStatsCommand(program);\nregisterWaitlistCommand(program);\n\n// Proxy services (YouTube, Web, SEO)\nregisterYoutubeCommand(program);\nregisterWebCommand(program);\nregisterSeoCommand(program);\n\n// Admin commands\nregisterAdminCommand(program);\n\n// Print help if no command given\nprogram.addHelpCommand(true);\n\n// Parse and execute\ntry {\n await program.parseAsync(process.argv);\n} catch (err) {\n handleError(err);\n}\n","import chalk from \"chalk\";\n\n/** Base CLI error with exit code */\nexport class CliError extends Error {\n constructor(\n message: string,\n public exitCode: number = 1\n ) {\n super(message);\n this.name = \"CliError\";\n }\n}\n\n/** Authentication error — missing or invalid API key */\nexport class AuthError extends CliError {\n constructor(message: string = \"Authentication required. Run: ckweb auth login\") {\n super(message, 1);\n this.name = \"AuthError\";\n }\n}\n\n/** API response error — non-2xx HTTP status */\nexport class ApiError extends CliError {\n constructor(\n message: string,\n public statusCode: number,\n public code?: string\n ) {\n super(message, 1);\n this.name = \"ApiError\";\n }\n}\n\n/** Network error — connection failure, timeout */\nexport class NetworkError extends CliError {\n constructor(message: string = \"Network error. Check your connection.\") {\n super(message, 1);\n this.name = \"NetworkError\";\n }\n}\n\n/** Validate path parameter IDs to prevent path injection */\nexport function validateId(id: string, label = \"ID\"): void {\n if (!/^[\\w-]+$/.test(id)) {\n throw new CliError(`Invalid ${label}: \"${id}\"`);\n }\n}\n\n/** Handle error and exit with appropriate code */\nexport function handleError(err: unknown): never {\n if (err instanceof AuthError) {\n console.error(chalk.yellow(`Auth: ${err.message}`));\n process.exit(err.exitCode);\n }\n\n if (err instanceof ApiError) {\n console.error(chalk.red(`API Error (${err.statusCode}): ${err.message}`));\n if (err.code) console.error(chalk.dim(`Code: ${err.code}`));\n process.exit(err.exitCode);\n }\n\n if (err instanceof NetworkError) {\n console.error(chalk.red(`Network: ${err.message}`));\n process.exit(err.exitCode);\n }\n\n if (err instanceof CliError) {\n console.error(chalk.red(err.message));\n process.exit(err.exitCode);\n }\n\n // Unknown error\n const message = err instanceof Error ? err.message : String(err);\n console.error(chalk.red(`Error: ${message}`));\n process.exit(1);\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport * as readline from \"node:readline/promises\";\nimport { fetchApi } from \"../lib/api-client.js\";\nimport {\n getApiKey, setApiKey, clearApiKey,\n getAdminApiKey, setAdminApiKey, clearAdminApiKey,\n maskApiKey, getConfigPath,\n} from \"../lib/config.js\";\nimport { handleError, AuthError } from \"../lib/errors.js\";\nimport { printSuccess, printInfo, printWarn } from \"../lib/output.js\";\nimport {\n ENV_USER_KEY,\n ENV_ADMIN_KEY,\n resolveOsEnv,\n resolveDotenv,\n} from \"../lib/env-resolver.js\";\nimport type { ApiKeyValidation } from \"../types/index.js\";\n\n/** Ensure an API key is available (user or admin fallback); throw AuthError if not */\nexport function ensureAuth(): string {\n const key = getApiKey() ?? getAdminApiKey();\n if (!key) throw new AuthError();\n return key;\n}\n\n/** Ensure admin API key is stored; throw AuthError if not */\nexport function ensureAdminAuth(): string {\n const key = getAdminApiKey();\n if (!key) throw new AuthError(\"Admin authentication required. Run: ckweb auth login --admin\");\n return key;\n}\n\nasync function promptApiKey(isAdmin: boolean): Promise<string> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n try {\n const label = isAdmin ? \"admin API key\" : \"API key\";\n return (await rl.question(chalk.cyan(`Enter your ${label} (ck_live_...): `))).trim();\n } finally {\n rl.close();\n }\n}\n\nexport function registerAuthCommand(program: Command): void {\n const auth = program.command(\"auth\").description(\"Manage authentication\");\n\n auth\n .command(\"login\")\n .description(\"Authenticate with your ClaudeKit API key\")\n .option(\"--admin\", \"Login with admin API key\")\n .action(async function (this: Command) {\n try {\n const isAdmin = this.opts().admin === true;\n const envName = isAdmin ? ENV_ADMIN_KEY : ENV_USER_KEY;\n const envKey = resolveOsEnv(envName) ?? resolveDotenv(envName);\n\n // If a valid key is already resolvable from env, skip prompt + storage.\n if (envKey) {\n printInfo(`Found ${envName} in environment — skipping prompt.`);\n printInfo(\"Validating...\");\n try {\n const result = await fetchApi<ApiKeyValidation>(\"POST\", \"/keys/validate\", {\n adminAuth: isAdmin,\n });\n if (result.valid) {\n printSuccess(`Authenticated via env var. Key: ${maskApiKey(envKey)}`);\n printInfo(`Source: ${envName} (no config file written)`);\n } else {\n printWarn(result.error || \"Env-provided key is invalid.\");\n }\n } catch {\n throw new AuthError(\"Env-provided key failed validation.\");\n }\n return;\n }\n\n const key = await promptApiKey(isAdmin);\n\n if (!key) {\n printWarn(\"No API key provided.\");\n return;\n }\n\n printInfo(\"Validating API key...\");\n\n try {\n if (isAdmin) {\n setAdminApiKey(key);\n } else {\n setApiKey(key);\n }\n } catch {\n printWarn(\"Invalid key format. Expected: ck_live_<32+ base64url chars>\");\n return;\n }\n\n try {\n const result = await fetchApi<ApiKeyValidation>(\"POST\", \"/keys/validate\", {\n adminAuth: isAdmin,\n });\n\n if (result.valid) {\n printSuccess(`Authenticated! Key: ${maskApiKey(key)}`);\n printInfo(`Config saved to: ${getConfigPath()}`);\n } else {\n if (isAdmin) clearAdminApiKey(); else clearApiKey();\n printWarn(result.error || \"Invalid API key.\");\n }\n } catch {\n if (isAdmin) clearAdminApiKey(); else clearApiKey();\n throw new AuthError(\"API key validation failed. Check your key and try again.\");\n }\n } catch (err) {\n handleError(err);\n }\n });\n\n auth\n .command(\"validate\")\n .description(\"Validate API key (resolves from env var, stored config, or .env)\")\n .option(\"--admin\", \"Validate admin API key\")\n .action(async function (this: Command) {\n try {\n const isAdmin = this.opts().admin === true;\n const key = isAdmin ? ensureAdminAuth() : ensureAuth();\n printInfo(`Validating ${isAdmin ? \"admin \" : \"\"}key: ${maskApiKey(key)}`);\n\n const result = await fetchApi<ApiKeyValidation>(\"POST\", \"/keys/validate\", {\n adminAuth: isAdmin,\n });\n\n if (result.valid) {\n printSuccess(\"API key is valid.\");\n if (result.userId) console.log(chalk.dim(`User ID: ${result.userId}`));\n if (result.rateLimit) console.log(chalk.dim(`Rate limit: ${result.rateLimit} req/hour`));\n } else {\n printWarn(result.error || \"API key is invalid or expired.\");\n }\n } catch (err) {\n handleError(err);\n }\n });\n\n auth\n .command(\"logout\")\n .description(\"Remove stored API key\")\n .option(\"--admin\", \"Remove admin API key\")\n .option(\"--all\", \"Remove all stored keys\")\n .action(function (this: Command) {\n try {\n const opts = this.opts();\n\n if (opts.all) {\n clearApiKey();\n clearAdminApiKey();\n printSuccess(\"All API keys removed.\");\n return;\n }\n\n if (opts.admin) {\n if (!getAdminApiKey()) { printInfo(\"No admin API key stored.\"); return; }\n clearAdminApiKey();\n printSuccess(\"Admin API key removed.\");\n } else {\n if (!getApiKey()) { printInfo(\"No API key stored.\"); return; }\n clearApiKey();\n printSuccess(\"API key removed.\");\n }\n } catch (err) {\n handleError(err);\n }\n });\n\n auth\n .command(\"status\")\n .description(\"Show authentication status\")\n .action(() => {\n try {\n const userKey = getApiKey();\n const adminKey = getAdminApiKey();\n\n const userSource = resolveOsEnv(ENV_USER_KEY)\n ? `env:${ENV_USER_KEY}`\n : resolveDotenv(ENV_USER_KEY)\n ? `.env`\n : userKey\n ? \"config\"\n : null;\n const adminSource = resolveOsEnv(ENV_ADMIN_KEY)\n ? `env:${ENV_ADMIN_KEY}`\n : resolveDotenv(ENV_ADMIN_KEY)\n ? `.env`\n : adminKey\n ? \"config\"\n : null;\n\n console.log(chalk.bold(\"Authentication Status\"));\n console.log(\n ` User key: ${userKey ? chalk.green(maskApiKey(userKey)) : chalk.dim(\"not set\")}` +\n (userSource ? chalk.dim(` (from ${userSource})`) : \"\"),\n );\n console.log(\n ` Admin key: ${adminKey ? chalk.green(maskApiKey(adminKey)) : chalk.dim(\"not set\")}` +\n (adminSource ? chalk.dim(` (from ${adminSource})`) : \"\"),\n );\n console.log(chalk.dim(` Config: ${getConfigPath()}`));\n console.log(chalk.dim(` Resolution: OS env > stored config > .env.*`));\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import Conf from \"conf\";\nimport type { ConfigSchema } from \"../types/index.js\";\nimport {\n ENV_USER_KEY,\n ENV_ADMIN_KEY,\n ENV_BASE_URL,\n resolveOsEnv,\n resolveDotenv,\n} from \"./env-resolver.js\";\n\nconst DEFAULT_BASE_URL = \"https://claudekit.cc/api\";\n// Server issues both user and admin keys as `ck_live_<base64url 32+ chars>`.\n// Base64url allows `-` and `_` in addition to alphanumerics.\n// The user/admin distinction is a CLI storage slot, not a format difference.\nconst USER_KEY_PATTERN = /^ck_live_[a-zA-Z0-9_-]{32,}$/;\nconst ADMIN_KEY_PATTERN = /^ck_live_[a-zA-Z0-9_-]{32,}$/;\n\n/** Resolve key with priority: OS env > stored config > .env.* */\nfunction resolveKey(\n envName: string,\n pattern: RegExp,\n stored: () => string | undefined,\n): string | undefined {\n const os = resolveOsEnv(envName);\n if (os && pattern.test(os)) return os;\n const cfg = stored();\n if (cfg) return cfg;\n const dot = resolveDotenv(envName);\n if (dot && pattern.test(dot)) return dot;\n return undefined;\n}\n\nconst config = new Conf<ConfigSchema>({\n projectName: \"ckweb-cli\",\n schema: {\n apiKey: { type: \"string\" },\n adminApiKey: { type: \"string\" },\n baseUrl: { type: \"string\" },\n },\n});\n\n// --- User API Key ---\n\nexport function getApiKey(): string | undefined {\n return resolveKey(ENV_USER_KEY, USER_KEY_PATTERN, () => config.get(\"apiKey\"));\n}\n\nexport function setApiKey(key: string): void {\n if (!USER_KEY_PATTERN.test(key)) {\n throw new Error(\"Invalid API key format. Expected: ck_live_<32+ base64url chars>\");\n }\n config.set(\"apiKey\", key);\n}\n\nexport function clearApiKey(): void {\n config.delete(\"apiKey\");\n}\n\n// --- Admin API Key ---\n\nexport function getAdminApiKey(): string | undefined {\n return resolveKey(ENV_ADMIN_KEY, ADMIN_KEY_PATTERN, () => config.get(\"adminApiKey\"));\n}\n\nexport function setAdminApiKey(key: string): void {\n if (!ADMIN_KEY_PATTERN.test(key)) {\n throw new Error(\"Invalid admin API key format. Expected: ck_live_<32+ base64url chars>\");\n }\n config.set(\"adminApiKey\", key);\n}\n\nexport function clearAdminApiKey(): void {\n config.delete(\"adminApiKey\");\n}\n\n// --- Base URL ---\n\nexport function getBaseUrl(): string {\n return (\n resolveOsEnv(ENV_BASE_URL) ||\n config.get(\"baseUrl\") ||\n resolveDotenv(ENV_BASE_URL) ||\n DEFAULT_BASE_URL\n );\n}\n\nexport function setBaseUrl(url: string): void {\n config.set(\"baseUrl\", url);\n}\n\n// --- Utilities ---\n\nexport function maskApiKey(key: string): string {\n if (key.length < 12) return \"****\";\n return `${key.slice(0, 8)}****${key.slice(-4)}`;\n}\n\nexport function getConfigPath(): string {\n return config.path;\n}\n","import { getApiKey, getAdminApiKey, getBaseUrl } from \"./config.js\";\nimport { AuthError, ApiError, NetworkError } from \"./errors.js\";\n\nconst DEFAULT_TIMEOUT = 30_000;\n\n/**\n * Routes added in the current CLI release that may not yet be deployed on the\n * server side. A 404 on one of these surfaces a helpful \"endpoint not yet\n * deployed\" message instead of the generic ApiError.\n */\nconst RECENT_ROUTES: Array<RegExp> = [\n /^\\/admin\\/orders\\/stats$/,\n /^\\/admin\\/users\\/stats$/,\n /^\\/admin\\/discount-groups(\\/|$)/,\n /^\\/admin\\/discounts\\/sync-status$/,\n];\n\nfunction isRecentRoute(path: string): boolean {\n const normalized = path.startsWith(\"/\") ? path : `/${path}`;\n return RECENT_ROUTES.some((re) => re.test(normalized));\n}\n\ninterface FetchOptions {\n body?: unknown;\n params?: Record<string, string>;\n timeout?: number;\n /** Skip API key auth (for public endpoints) */\n noAuth?: boolean;\n /** Use admin API key instead of user key */\n adminAuth?: boolean;\n}\n\n/** Core API request function with auto-injected auth */\nexport async function fetchApi<T>(\n method: \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\",\n path: string,\n options: FetchOptions = {}\n): Promise<T> {\n const { body, params, timeout = DEFAULT_TIMEOUT, noAuth = false, adminAuth = false } = options;\n\n // Resolve API key based on auth mode\n let apiKey: string | undefined;\n if (!noAuth) {\n if (adminAuth) {\n apiKey = getAdminApiKey();\n if (!apiKey) {\n throw new AuthError(\"Admin authentication required. Run: ckweb auth login --admin\");\n }\n } else {\n apiKey = getApiKey() ?? getAdminApiKey();\n if (!apiKey) {\n throw new AuthError();\n }\n }\n }\n\n // Build URL — ensure baseUrl ends with / for correct path joining\n const baseUrl = getBaseUrl().replace(/\\/?$/, \"/\");\n const url = new URL(path.replace(/^\\//, \"\"), baseUrl);\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n url.searchParams.set(key, value);\n }\n }\n\n // Build headers\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n \"User-Agent\": `ckweb-cli/${__PKG_VERSION__}`,\n };\n if (apiKey) {\n headers[\"x-api-key\"] = apiKey;\n }\n\n // Timeout controller\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeout);\n\n try {\n const response = await fetch(url.toString(), {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timer);\n\n // Parse response body\n const contentType = response.headers.get(\"content-type\") || \"\";\n let data: unknown;\n\n if (contentType.includes(\"application/json\")) {\n data = await response.json();\n } else {\n data = await response.text();\n }\n\n // Handle HTTP errors\n if (!response.ok) {\n const errorBody = data as Record<string, unknown>;\n const message =\n (errorBody?.error as string) ||\n (errorBody?.message as string) ||\n `HTTP ${response.status}`;\n const code = errorBody?.code as string | undefined;\n\n if (response.status === 401 || response.status === 403) {\n throw new AuthError(message);\n }\n if (response.status === 404 && isRecentRoute(path)) {\n throw new ApiError(\n `${message} — this command may require a newer claudekit-web release; the endpoint ${path} is not yet deployed.`,\n response.status,\n code,\n );\n }\n throw new ApiError(message, response.status, code);\n }\n\n return data as T;\n } catch (err) {\n clearTimeout(timer);\n\n if (err instanceof AuthError || err instanceof ApiError) {\n throw err;\n }\n\n if (err instanceof DOMException && err.name === \"AbortError\") {\n throw new NetworkError(`Request timed out after ${timeout / 1000}s`);\n }\n\n if (err instanceof TypeError) {\n throw new NetworkError();\n }\n\n throw err;\n }\n}\n","import type { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport type { OutputOptions, TableColumn } from \"../types/index.js\";\n\n/** Extract output option flags from Commander command */\nexport function getOutputOpts(cmd: Command): OutputOptions {\n const opts = cmd.optsWithGlobals();\n return { json: opts.json, table: opts.table, quiet: opts.quiet };\n}\n\n/** Print data according to output mode flags */\nexport function formatOutput(\n data: unknown,\n options: OutputOptions,\n tableColumns?: TableColumn[]\n): void {\n if (options.quiet) {\n printQuiet(data);\n return;\n }\n\n if (options.json) {\n printJson(data);\n return;\n }\n\n // --table flag or auto-detect: table for arrays with columns\n if (Array.isArray(data) && tableColumns) {\n printTable(data, tableColumns);\n return;\n }\n\n // --table flag with object data: render as key-value table\n if (options.table && data && typeof data === \"object\" && !Array.isArray(data)) {\n const obj = data as Record<string, unknown>;\n const rows = Object.entries(obj).map(([key, value]) => ({\n key,\n value: typeof value === \"object\" ? JSON.stringify(value) : String(value ?? \"—\"),\n }));\n printTable(rows, [\n { key: \"key\", header: \"Field\", width: 20 },\n { key: \"value\", header: \"Value\", width: 50 },\n ]);\n return;\n }\n\n printJson(data);\n}\n\n/** Pretty-print JSON to stdout */\nexport function printJson(data: unknown): void {\n console.log(JSON.stringify(data, null, 2));\n}\n\n/** Print array data as aligned table */\nexport function printTable(\n rows: Record<string, unknown>[],\n columns: TableColumn[]\n): void {\n if (rows.length === 0) {\n console.log(chalk.dim(\"No results.\"));\n return;\n }\n\n // Calculate column widths\n const widths = columns.map((col) => {\n const headerLen = col.header.length;\n const maxDataLen = rows.reduce((max, row) => {\n const val = String(row[col.key] ?? \"\");\n return Math.max(max, val.length);\n }, 0);\n return col.width || Math.min(Math.max(headerLen, maxDataLen) + 2, 50);\n });\n\n // Print header\n const headerLine = columns\n .map((col, i) => col.header.padEnd(widths[i]))\n .join(\" \");\n console.log(chalk.bold(headerLine));\n console.log(chalk.dim(\"─\".repeat(headerLine.length)));\n\n // Print rows\n for (const row of rows) {\n const line = columns\n .map((col, i) => {\n const val = String(row[col.key] ?? \"—\");\n return val.length > widths[i]\n ? val.slice(0, widths[i] - 1) + \"…\"\n : val.padEnd(widths[i]);\n })\n .join(\" \");\n console.log(line);\n }\n\n console.log(chalk.dim(`\\n${rows.length} result(s)`));\n}\n\n/** Print minimal output — first meaningful value */\nexport function printQuiet(data: unknown): void {\n if (data === null || data === undefined) return;\n\n if (typeof data === \"string\" || typeof data === \"number\" || typeof data === \"boolean\") {\n console.log(String(data));\n return;\n }\n\n if (Array.isArray(data)) {\n console.log(String(data.length));\n return;\n }\n\n if (typeof data === \"object\") {\n // Print first key's value\n const obj = data as Record<string, unknown>;\n const firstKey = Object.keys(obj)[0];\n if (firstKey) {\n console.log(String(obj[firstKey]));\n }\n }\n}\n\n/** Print a success message */\nexport function printSuccess(message: string): void {\n console.log(chalk.green(`✓ ${message}`));\n}\n\n/** Print an info message */\nexport function printInfo(message: string): void {\n console.log(chalk.blue(`ℹ ${message}`));\n}\n\n/** Print a warning message */\nexport function printWarn(message: string): void {\n console.log(chalk.yellow(`⚠ ${message}`));\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../lib/api-client.js\";\nimport { handleError } from \"../lib/errors.js\";\nimport { ensureAuth } from \"./auth.js\";\nimport { formatOutput, getOutputOpts } from \"../lib/output.js\";\nimport type { TableColumn } from \"../types/index.js\";\n\nconst PROXY_BASE = \"/proxy/vidcap/v1/youtube\";\n\nconst SEARCH_COLUMNS: TableColumn[] = [\n { key: \"title\", header: \"Title\", width: 40 },\n { key: \"channel\", header: \"Channel\", width: 20 },\n { key: \"videoId\", header: \"Video ID\", width: 14 },\n];\n\nconst COMMENT_COLUMNS: TableColumn[] = [\n { key: \"author\", header: \"Author\", width: 20 },\n { key: \"text\", header: \"Comment\", width: 50 },\n { key: \"likes\", header: \"Likes\", width: 8 },\n];\n\n/** Helper: GET request to VidCap YouTube proxy */\nasync function youtubeGet<T>(endpoint: string, params: Record<string, string>): Promise<T> {\n return fetchApi<T>(\"GET\", `${PROXY_BASE}/${endpoint}`, { params });\n}\n\n\nexport function registerYoutubeCommand(program: Command): void {\n const yt = program.command(\"youtube\").alias(\"yt\").description(\"YouTube video tools (via VidCap)\");\n\n yt.command(\"info\")\n .argument(\"<url>\", \"YouTube video URL\")\n .description(\"Get video metadata\")\n .action(async function (this: Command, url: string) {\n try {\n ensureAuth();\n const data = await youtubeGet(\"info\", { url });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n yt.command(\"caption\")\n .argument(\"<url>\", \"YouTube video URL\")\n .description(\"Get video transcript/captions\")\n .option(\"-l, --locale <locale>\", \"Caption language\", \"en\")\n .option(\"-f, --format <format>\", \"Output format (json3/vtt/srt)\", \"vtt\")\n .action(async function (this: Command, url: string) {\n try {\n ensureAuth();\n const opts = this.opts();\n const data = await youtubeGet(\"caption\", {\n url,\n locale: opts.locale,\n ext: opts.format,\n });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n yt.command(\"summary\")\n .argument(\"<url>\", \"YouTube video URL\")\n .description(\"Get AI-generated video summary\")\n .option(\"-l, --locale <locale>\", \"Summary language\", \"en\")\n .action(async function (this: Command, url: string) {\n try {\n ensureAuth();\n const opts = this.opts();\n const data = await youtubeGet(\"summary\", { url, locale: opts.locale });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n yt.command(\"screenshot\")\n .argument(\"<url>\", \"YouTube video URL\")\n .description(\"Get video screenshot at timestamp\")\n .option(\"-t, --time <seconds>\", \"Timestamp in seconds\", \"0\")\n .action(async function (this: Command, url: string) {\n try {\n ensureAuth();\n const opts = this.opts();\n const data = await youtubeGet(\"screenshot\", { url, second: opts.time });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n yt.command(\"search\")\n .argument(\"<query>\", \"Search query\")\n .description(\"Search YouTube videos\")\n .option(\"-n, --max-results <count>\", \"Max results\", \"10\")\n .option(\"--order <order>\", \"Sort order (relevance/date/rating/viewCount)\", \"relevance\")\n .action(async function (this: Command, query: string) {\n try {\n ensureAuth();\n const opts = this.opts();\n const data = await youtubeGet<Record<string, unknown>[]>(\"search\", {\n query,\n maxResults: opts.maxResults,\n order: opts.order,\n });\n formatOutput(data, getOutputOpts(this), SEARCH_COLUMNS);\n } catch (err) {\n handleError(err);\n }\n });\n\n yt.command(\"comments\")\n .argument(\"<url>\", \"YouTube video URL\")\n .description(\"Get video comments\")\n .option(\"--order <order>\", \"Sort order (time/relevance)\", \"relevance\")\n .option(\"--replies\", \"Include replies\", false)\n .action(async function (this: Command, url: string) {\n try {\n ensureAuth();\n const opts = this.opts();\n const data = await youtubeGet<Record<string, unknown>[]>(\"comments\", {\n url,\n order: opts.order,\n includeReplies: String(opts.replies),\n });\n formatOutput(data, getOutputOpts(this), COMMENT_COLUMNS);\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { readFileSync } from \"node:fs\";\nimport { fetchApi } from \"../lib/api-client.js\";\nimport { handleError } from \"../lib/errors.js\";\nimport { ensureAuth } from \"./auth.js\";\nimport { formatOutput, getOutputOpts } from \"../lib/output.js\";\n\nconst PROXY_BASE = \"/proxy/reviewweb/v1\";\n\n/** Helper: POST request to ReviewWeb proxy */\nasync function webPost<T>(endpoint: string, body: Record<string, unknown>): Promise<T> {\n return fetchApi<T>(\"POST\", `${PROXY_BASE}/${endpoint}`, { body });\n}\n\n\nexport function registerWebCommand(program: Command): void {\n const web = program.command(\"web\").description(\"Website analysis tools (via ReviewWeb)\");\n\n web.command(\"review\")\n .argument(\"<url>\", \"Website URL to review\")\n .description(\"Comprehensive website analysis\")\n .action(async function (this: Command, url: string) {\n try {\n ensureAuth();\n const data = await webPost(\"review\", { url });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n web.command(\"scrape\")\n .argument(\"<url>\", \"URL to scrape\")\n .description(\"Extract HTML content from URL\")\n .action(async function (this: Command, url: string) {\n try {\n ensureAuth();\n const data = await webPost(\"scrape\", { url });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n web.command(\"extract\")\n .argument(\"<url>\", \"URL to extract data from\")\n .description(\"Extract structured data using AI\")\n .requiredOption(\"-i, --instructions <text>\", \"Extraction instructions\")\n .requiredOption(\"-t, --template <json>\", \"JSON template (string or @filepath)\")\n .action(async function (this: Command, url: string) {\n try {\n ensureAuth();\n const opts = this.opts();\n\n // Parse template: @filepath reads from file\n let jsonTemplate = opts.template;\n if (jsonTemplate.startsWith(\"@\")) {\n const filePath = jsonTemplate.slice(1);\n jsonTemplate = readFileSync(filePath, \"utf-8\");\n }\n\n // Validate JSON\n try {\n JSON.parse(jsonTemplate);\n } catch {\n console.error(\"Invalid JSON template. Provide valid JSON or @filepath.\");\n process.exit(1);\n }\n\n const data = await webPost(\"extract\", {\n url,\n instructions: opts.instructions,\n jsonTemplate,\n });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n web.command(\"convert\")\n .argument(\"<url>\", \"URL to convert\")\n .description(\"Convert webpage to Markdown\")\n .action(async function (this: Command, url: string) {\n try {\n ensureAuth();\n const data = await webPost(\"convert/markdown\", { url });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n web.command(\"summarize\")\n .argument(\"<url>\", \"URL to summarize\")\n .description(\"AI-generated page summary\")\n .action(async function (this: Command, url: string) {\n try {\n ensureAuth();\n const data = await webPost(\"summarize/url\", { url });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n web.command(\"screenshot\")\n .argument(\"<url>\", \"URL to screenshot\")\n .description(\"Capture webpage screenshot\")\n .action(async function (this: Command, url: string) {\n try {\n ensureAuth();\n const data = await webPost(\"screenshot\", { url });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../lib/api-client.js\";\nimport { handleError } from \"../lib/errors.js\";\nimport { ensureAuth } from \"./auth.js\";\nimport { formatOutput, getOutputOpts } from \"../lib/output.js\";\nimport type { TableColumn } from \"../types/index.js\";\n\nconst PROXY_BASE = \"/proxy/reviewweb/v1/seo-insights\";\n\nconst KEYWORD_COLUMNS: TableColumn[] = [\n { key: \"keyword\", header: \"Keyword\", width: 30 },\n { key: \"volume\", header: \"Volume\", width: 10 },\n { key: \"competition\", header: \"Competition\", width: 14 },\n];\n\n/** Helper: POST to SEO insights proxy */\nasync function seoPost<T>(endpoint: string, body: Record<string, unknown>): Promise<T> {\n return fetchApi<T>(\"POST\", `${PROXY_BASE}/${endpoint}`, { body });\n}\n\n\nexport function registerSeoCommand(program: Command): void {\n const seo = program.command(\"seo\").description(\"SEO analysis tools\");\n\n seo.command(\"keywords\")\n .argument(\"<keyword>\", \"Seed keyword\")\n .description(\"Get keyword ideas and search volume\")\n .option(\"--country <code>\", \"Country code\", \"us\")\n .action(async function (this: Command, keyword: string) {\n try {\n ensureAuth();\n const opts = this.opts();\n const data = await seoPost<Record<string, unknown>[]>(\"keyword-ideas\", {\n keyword,\n country: opts.country,\n });\n formatOutput(data, getOutputOpts(this), KEYWORD_COLUMNS);\n } catch (err) {\n handleError(err);\n }\n });\n\n seo.command(\"difficulty\")\n .argument(\"<keyword>\", \"Keyword to check\")\n .description(\"Check keyword ranking difficulty\")\n .option(\"--country <code>\", \"Country code\", \"us\")\n .action(async function (this: Command, keyword: string) {\n try {\n ensureAuth();\n const opts = this.opts();\n const data = await seoPost(\"keyword-difficulty\", {\n keyword,\n country: opts.country,\n });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n seo.command(\"traffic\")\n .argument(\"<domain>\", \"Domain or URL to check\")\n .description(\"Check traffic for a domain\")\n .option(\"--country <code>\", \"Country code\")\n .action(async function (this: Command, domain: string) {\n try {\n ensureAuth();\n const opts = this.opts();\n const body: Record<string, unknown> = { domainOrUrl: domain };\n if (opts.country) body.country = opts.country;\n const data = await seoPost(\"traffic\", body);\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n seo.command(\"backlinks\")\n .argument(\"<domain>\", \"Domain to check\")\n .description(\"Get backlink analysis\")\n .action(async function (this: Command, domain: string) {\n try {\n ensureAuth();\n const data = await seoPost(\"backlinks\", { domain });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../lib/api-client.js\";\nimport { handleError, validateId } from \"../lib/errors.js\";\nimport { formatOutput, getOutputOpts } from \"../lib/output.js\";\nimport type { Order, TableColumn } from \"../types/index.js\";\n\nconst ORDER_COLUMNS: TableColumn[] = [\n { key: \"id\", header: \"ID\", width: 12 },\n { key: \"productType\", header: \"Product\", width: 16 },\n { key: \"status\", header: \"Status\", width: 12 },\n { key: \"amount\", header: \"Amount\", width: 10 },\n { key: \"currency\", header: \"Currency\", width: 8 },\n { key: \"createdAt\", header: \"Created\", width: 22 },\n];\n\nexport function registerOrdersCommand(program: Command): void {\n const orders = program.command(\"orders\").description(\"Look up orders and purchases\");\n\n orders.command(\"get\")\n .argument(\"<id>\", \"Order ID\")\n .description(\"Get order details\")\n .action(async function (this: Command, id: string) {\n try {\n validateId(id, \"order ID\");\n const data = await fetchApi<Order>(\"GET\", `/orders/${id}`, { noAuth: true });\n formatOutput(data, getOutputOpts(this), ORDER_COLUMNS);\n } catch (err) {\n handleError(err);\n }\n });\n\n orders.command(\"status\")\n .argument(\"<id>\", \"Order ID\")\n .description(\"Check order status\")\n .action(async function (this: Command, id: string) {\n try {\n validateId(id, \"order ID\");\n const data = await fetchApi<{ status: string }>(\"GET\", `/orders/${id}/status`, { noAuth: true });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../lib/api-client.js\";\nimport { handleError } from \"../lib/errors.js\";\nimport { ensureAuth } from \"./auth.js\";\nimport { formatOutput, getOutputOpts, printSuccess } from \"../lib/output.js\";\nimport type { ReferralDashboard, PayoutRequest, TableColumn } from \"../types/index.js\";\n\nconst PAYOUT_COLUMNS: TableColumn[] = [\n { key: \"id\", header: \"ID\", width: 12 },\n { key: \"amount\", header: \"Amount\", width: 10 },\n { key: \"currency\", header: \"Currency\", width: 8 },\n { key: \"status\", header: \"Status\", width: 12 },\n { key: \"createdAt\", header: \"Created\", width: 22 },\n];\n\nexport function registerReferralsCommand(program: Command): void {\n const referrals = program.command(\"referrals\").description(\"Referral program management\");\n\n referrals.command(\"dashboard\")\n .description(\"View your referral dashboard\")\n .action(async function (this: Command) {\n try {\n ensureAuth();\n const data = await fetchApi<ReferralDashboard>(\"GET\", \"/referrals/dashboard\");\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n referrals.command(\"payout-history\")\n .description(\"View your payout request history\")\n .action(async function (this: Command) {\n try {\n ensureAuth();\n const data = await fetchApi<PayoutRequest[]>(\"GET\", \"/referrals/request-payout\");\n formatOutput(data, getOutputOpts(this), PAYOUT_COLUMNS);\n } catch (err) {\n handleError(err);\n }\n });\n\n referrals.command(\"request-payout\")\n .description(\"Request a referral payout\")\n .action(async function (this: Command) {\n try {\n ensureAuth();\n const data = await fetchApi<PayoutRequest>(\"POST\", \"/referrals/request-payout\");\n printSuccess(\"Payout requested.\");\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../lib/api-client.js\";\nimport { handleError, validateId } from \"../lib/errors.js\";\nimport { formatOutput, getOutputOpts } from \"../lib/output.js\";\nimport type { Article, TableColumn } from \"../types/index.js\";\n\nconst ARTICLE_COLUMNS: TableColumn[] = [\n { key: \"id\", header: \"ID\", width: 12 },\n { key: \"title\", header: \"Title\", width: 36 },\n { key: \"status\", header: \"Status\", width: 12 },\n { key: \"createdAt\", header: \"Created\", width: 22 },\n];\n\nexport function registerBlogCommand(program: Command): void {\n const blog = program.command(\"blog\").description(\"Browse blog articles\");\n\n blog.command(\"list\")\n .description(\"List blog articles\")\n .action(async function (this: Command) {\n try {\n const data = await fetchApi<Article[]>(\"GET\", \"/blog/articles\", { noAuth: true });\n formatOutput(data, getOutputOpts(this), ARTICLE_COLUMNS);\n } catch (err) {\n handleError(err);\n }\n });\n\n blog.command(\"get\")\n .argument(\"<id>\", \"Article ID\")\n .description(\"Get article details\")\n .action(async function (this: Command, id: string) {\n try {\n validateId(id, \"article ID\");\n const data = await fetchApi<Article>(\"GET\", `/blog/articles/${id}`, { noAuth: true });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { fetchApi } from \"../lib/api-client.js\";\nimport { handleError } from \"../lib/errors.js\";\nimport { formatOutput, getOutputOpts, printSuccess } from \"../lib/output.js\";\n\n\nexport function registerHealthCommand(program: Command): void {\n program\n .command(\"health\")\n .description(\"Check ClaudeKit.cc API health\")\n .action(async function (this: Command) {\n try {\n const data = await fetchApi<Record<string, unknown>>(\"GET\", \"/health\", { noAuth: true });\n const outputOpts = getOutputOpts(this);\n\n if (outputOpts.json || outputOpts.quiet) {\n formatOutput(data, outputOpts);\n } else {\n printSuccess(\"ClaudeKit.cc API is healthy.\");\n if (data.version) console.log(chalk.dim(`Version: ${data.version}`));\n if (data.uptime) console.log(chalk.dim(`Uptime: ${data.uptime}`));\n }\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport * as readline from \"node:readline/promises\";\nimport { fetchApi } from \"../lib/api-client.js\";\nimport { handleError } from \"../lib/errors.js\";\nimport { ensureAuth } from \"./auth.js\";\nimport { formatOutput, getOutputOpts, printSuccess, printWarn } from \"../lib/output.js\";\nimport type { AccountExport } from \"../types/index.js\";\n\nexport function registerAccountCommand(program: Command): void {\n const account = program.command(\"account\").description(\"Account management\");\n\n account\n .command(\"export-data\")\n .description(\"Export your personal data (GDPR)\")\n .action(async function (this: Command) {\n try {\n ensureAuth();\n const data = await fetchApi<AccountExport>(\"GET\", \"/gdpr/export-data\");\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n account\n .command(\"delete\")\n .description(\"Delete your account permanently (GDPR)\")\n .option(\"--reason <text>\", \"Reason for account deletion\")\n .action(async function (this: Command) {\n try {\n ensureAuth();\n const { reason } = this.opts();\n\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n const answer = await rl.question(\n 'This action is irreversible. Type \"DELETE_MY_ACCOUNT\" to confirm: '\n );\n rl.close();\n\n if (answer.trim() !== \"DELETE_MY_ACCOUNT\") {\n printWarn(\"Cancelled. Account was not deleted.\");\n return;\n }\n\n await fetchApi<unknown>(\"POST\", \"/gdpr/delete-account\", {\n body: { confirmation: \"DELETE_MY_ACCOUNT\", reason },\n });\n printSuccess(\"Account deletion request submitted.\");\n } catch (err) {\n handleError(err);\n }\n });\n\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../lib/api-client.js\";\nimport { handleError } from \"../lib/errors.js\";\nimport { formatOutput, getOutputOpts } from \"../lib/output.js\";\nimport type { CheckoutSession } from \"../types/index.js\";\n\nfunction addCheckoutOptions(cmd: Command): Command {\n return cmd\n .requiredOption(\"--email <email>\", \"Customer email\")\n .requiredOption(\"--product <type>\", \"Product type\")\n .option(\"--name <name>\", \"Customer name\")\n .option(\"--github <username>\", \"GitHub username\")\n .option(\"--referral <code>\", \"Referral code\")\n .option(\"--coupon <code>\", \"Coupon code\");\n}\n\nfunction buildCheckoutBody(opts: Record<string, string>): Record<string, string | undefined> {\n return {\n email: opts.email,\n name: opts.name,\n productType: opts.product,\n githubUsername: opts.github,\n referralCode: opts.referral,\n couponCode: opts.coupon,\n };\n}\n\nexport function registerCheckoutCommand(program: Command): void {\n const checkout = program.command(\"checkout\").description(\"Create payment checkout\");\n\n addCheckoutOptions(\n checkout.command(\"polar\").description(\"Create a Polar checkout session\")\n ).action(async function (this: Command) {\n try {\n const data = await fetchApi<CheckoutSession>(\"POST\", \"/checkout/polar\", {\n noAuth: true,\n body: buildCheckoutBody(this.opts()),\n });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n addCheckoutOptions(\n checkout.command(\"sepay\").description(\"Create a SePay checkout session\")\n ).action(async function (this: Command) {\n try {\n const data = await fetchApi<CheckoutSession>(\"POST\", \"/checkout/sepay\", {\n noAuth: true,\n body: buildCheckoutBody(this.opts()),\n });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport * as readline from \"node:readline/promises\";\nimport { fetchApi } from \"../lib/api-client.js\";\nimport { handleError } from \"../lib/errors.js\";\nimport { ensureAuth } from \"./auth.js\";\nimport { formatOutput, getOutputOpts, printSuccess, printWarn } from \"../lib/output.js\";\n\nexport function registerGithubCommand(program: Command): void {\n const github = program.command(\"github\").description(\"GitHub repository access\");\n\n github\n .command(\"invite\")\n .description(\"Grant GitHub repository access via license\")\n .requiredOption(\"--license <id>\", \"License ID\")\n .action(async function (this: Command) {\n try {\n ensureAuth();\n const { license } = this.opts();\n const data = await fetchApi<unknown>(\"POST\", \"/github/invite\", {\n body: { licenseId: license },\n });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n github\n .command(\"revoke\")\n .description(\"Revoke GitHub repository access via license\")\n .requiredOption(\"--license <id>\", \"License ID\")\n .action(async function (this: Command) {\n try {\n ensureAuth();\n const { license } = this.opts();\n\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n const answer = await rl.question(`Revoke GitHub access for license \"${license}\"? (y/N): `);\n rl.close();\n\n if (answer.toLowerCase() !== \"y\") {\n printWarn(\"Cancelled.\");\n return;\n }\n\n const data = await fetchApi<unknown>(\"POST\", \"/github/revoke\", {\n body: { licenseId: license },\n });\n formatOutput(data, getOutputOpts(this));\n printSuccess(\"GitHub access revoked.\");\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../lib/api-client.js\";\nimport { handleError } from \"../lib/errors.js\";\nimport { ensureAuth } from \"./auth.js\";\nimport { formatOutput, getOutputOpts } from \"../lib/output.js\";\nimport type { LoyaltyEligibility } from \"../types/index.js\";\n\nexport function registerLoyaltyCommand(program: Command): void {\n const loyalty = program.command(\"loyalty\").description(\"Loyalty program\");\n\n loyalty\n .command(\"eligibility\")\n .description(\"Check your loyalty program eligibility\")\n .action(async function (this: Command) {\n try {\n ensureAuth();\n const data = await fetchApi<LoyaltyEligibility>(\"GET\", \"/loyalty/eligibility\");\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../lib/api-client.js\";\nimport { handleError } from \"../lib/errors.js\";\nimport { formatOutput, getOutputOpts } from \"../lib/output.js\";\n\nexport function registerNewsletterCommand(program: Command): void {\n const newsletter = program.command(\"newsletter\").description(\"Newsletter subscription\");\n\n newsletter\n .command(\"subscribe\")\n .description(\"Subscribe an email to the newsletter\")\n .requiredOption(\"--email <email>\", \"Email address to subscribe\")\n .action(async function (this: Command) {\n try {\n const { email } = this.opts();\n const data = await fetchApi<unknown>(\"POST\", \"/newsletter/subscribe\", {\n noAuth: true,\n body: { email },\n });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n newsletter\n .command(\"unsubscribe\")\n .description(\"Unsubscribe from the newsletter using a token\")\n .requiredOption(\"--token <token>\", \"Unsubscribe token from email\")\n .action(async function (this: Command) {\n try {\n const { token } = this.opts();\n const data = await fetchApi<unknown>(\"POST\", \"/newsletter/unsubscribe\", {\n noAuth: true,\n body: { token },\n });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport * as readline from \"node:readline/promises\";\nimport { fetchApi } from \"../lib/api-client.js\";\nimport { handleError, CliError } from \"../lib/errors.js\";\nimport { ensureAuth } from \"./auth.js\";\nimport { formatOutput, getOutputOpts, printSuccess, printWarn } from \"../lib/output.js\";\nimport type { PayoutProfile, TableColumn } from \"../types/index.js\";\n\nconst PAYOUT_PROFILE_COLUMNS: TableColumn[] = [\n { key: \"id\", header: \"ID\", width: 36 },\n { key: \"paymentMethod\", header: \"Method\", width: 20 },\n { key: \"createdAt\", header: \"Created At\", width: 24 },\n];\n\nexport function registerPayoutCommand(program: Command): void {\n const payout = program.command(\"payout\").description(\"Payout profile management\");\n\n payout\n .command(\"profile\")\n .description(\"List your payout profiles\")\n .action(async function (this: Command) {\n try {\n ensureAuth();\n const data = await fetchApi<PayoutProfile[]>(\"GET\", \"/payout/profile\");\n formatOutput(data, getOutputOpts(this), PAYOUT_PROFILE_COLUMNS);\n } catch (err) {\n handleError(err);\n }\n });\n\n payout\n .command(\"create-profile\")\n .description(\"Create a new payout profile\")\n .requiredOption(\"--method <method>\", \"Payment method (e.g. bank_transfer, paypal)\")\n .requiredOption(\"--details <json>\", \"Payment details as JSON string\")\n .action(async function (this: Command) {\n try {\n ensureAuth();\n const { method, details } = this.opts();\n\n let paymentDetails: unknown;\n try {\n paymentDetails = JSON.parse(details);\n } catch {\n throw new CliError(\"--details must be valid JSON.\");\n }\n\n const data = await fetchApi<PayoutProfile>(\"POST\", \"/payout/profile\", {\n body: { paymentMethod: method, paymentDetails },\n });\n formatOutput(data, getOutputOpts(this));\n printSuccess(\"Payout profile created.\");\n } catch (err) {\n handleError(err);\n }\n });\n\n payout\n .command(\"delete-profile\")\n .description(\"Delete a payout profile\")\n .requiredOption(\"--id <id>\", \"Payout profile ID to delete\")\n .action(async function (this: Command) {\n try {\n ensureAuth();\n const { id } = this.opts();\n\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n const answer = await rl.question(`Delete payout profile \"${id}\"? (y/N): `);\n rl.close();\n\n if (answer.toLowerCase() !== \"y\") {\n printWarn(\"Cancelled.\");\n return;\n }\n\n await fetchApi<unknown>(\"DELETE\", \"/payout/profile\", { params: { id } });\n printSuccess(\"Payout profile deleted.\");\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../lib/api-client.js\";\nimport { handleError } from \"../lib/errors.js\";\nimport { formatOutput, getOutputOpts } from \"../lib/output.js\";\nimport type { EarlyAccessStatus } from \"../types/index.js\";\n\nexport function registerPricingCommand(program: Command): void {\n const pricing = program.command(\"pricing\").description(\"Pricing and promotions\");\n\n pricing\n .command(\"validate-discount <code>\")\n .description(\"Validate a discount code\")\n .action(async function (this: Command, code: string) {\n try {\n const data = await fetchApi<unknown>(\"POST\", \"/discounts/validate\", {\n noAuth: true,\n body: { code },\n });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n pricing\n .command(\"exchange-rate\")\n .description(\"Get current exchange rate\")\n .action(async function (this: Command) {\n try {\n const data = await fetchApi<unknown>(\"GET\", \"/exchange-rate\", { noAuth: true });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n pricing\n .command(\"early-access\")\n .description(\"Get early access promotion status\")\n .action(async function (this: Command) {\n try {\n const data = await fetchApi<EarlyAccessStatus>(\"GET\", \"/promotions/early-access\", {\n noAuth: true,\n });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport * as readline from \"node:readline/promises\";\nimport { fetchApi } from \"../lib/api-client.js\";\nimport { handleError, validateId, CliError } from \"../lib/errors.js\";\nimport { ensureAuth } from \"./auth.js\";\nimport { formatOutput, getOutputOpts, printSuccess, printWarn } from \"../lib/output.js\";\n\nexport function registerRefundsCommand(program: Command): void {\n const refunds = program.command(\"refunds\").description(\"Refund management\");\n\n refunds\n .command(\"request <orderId>\")\n .description(\"Request a refund for an order\")\n .requiredOption(\"--reason <text>\", \"Reason for refund request\")\n .option(\"--bank-details <json>\", \"Bank transfer details as JSON string\")\n .action(async function (this: Command, orderId: string) {\n try {\n ensureAuth();\n validateId(orderId, \"orderId\");\n const { reason, bankDetails } = this.opts();\n\n let bankTransferDetails: unknown;\n if (bankDetails) {\n try {\n bankTransferDetails = JSON.parse(bankDetails);\n } catch {\n throw new CliError(\"--bank-details must be valid JSON.\");\n }\n }\n\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n const answer = await rl.question(`Request refund for order \"${orderId}\"? (y/N): `);\n rl.close();\n\n if (answer.toLowerCase() !== \"y\") {\n printWarn(\"Cancelled.\");\n return;\n }\n\n const data = await fetchApi<unknown>(\"POST\", \"/refunds/request\", {\n body: { orderId, reason, bankTransferDetails },\n });\n formatOutput(data, getOutputOpts(this));\n printSuccess(\"Refund request submitted.\");\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../lib/api-client.js\";\nimport { handleError } from \"../lib/errors.js\";\nimport { formatOutput, getOutputOpts } from \"../lib/output.js\";\nimport type { Release, TableColumn } from \"../types/index.js\";\n\nconst RELEASE_COLUMNS: TableColumn[] = [\n { key: \"tagName\", header: \"Tag\", width: 20 },\n { key: \"name\", header: \"Name\", width: 40 },\n { key: \"publishedAt\", header: \"Published At\", width: 24 },\n];\n\nexport function registerReleasesCommand(program: Command): void {\n const releases = program.command(\"releases\").description(\"Product releases\");\n\n releases\n .command(\"list\")\n .description(\"List product releases\")\n .option(\"--tab <all|engineer|marketing>\", \"Release tab filter\", \"all\")\n .action(async function (this: Command) {\n try {\n const { tab } = this.opts();\n const data = await fetchApi<Release[]>(\"GET\", \"/releases\", {\n noAuth: true,\n params: { tab },\n });\n formatOutput(data, getOutputOpts(this), RELEASE_COLUMNS);\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../lib/api-client.js\";\nimport { handleError } from \"../lib/errors.js\";\nimport { formatOutput, getOutputOpts } from \"../lib/output.js\";\n\nexport function registerStatsCommand(program: Command): void {\n const stats = program.command(\"stats\").description(\"Platform statistics\");\n\n stats\n .command(\"users\")\n .description(\"Get platform user statistics\")\n .action(async function (this: Command) {\n try {\n const data = await fetchApi<unknown>(\"GET\", \"/stats/users\", { noAuth: true });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../lib/api-client.js\";\nimport { handleError } from \"../lib/errors.js\";\nimport { formatOutput, getOutputOpts } from \"../lib/output.js\";\n\nexport function registerWaitlistCommand(program: Command): void {\n const waitlist = program.command(\"waitlist\").description(\"Product waitlist\");\n\n waitlist\n .command(\"join\")\n .description(\"Join the marketing waitlist\")\n .requiredOption(\"--email <email>\", \"Email address to join with\")\n .action(async function (this: Command) {\n try {\n const { email } = this.opts();\n const data = await fetchApi<unknown>(\"POST\", \"/waitlist/marketing\", {\n noAuth: true,\n body: { email },\n });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import * as readline from \"node:readline/promises\";\n\n/** Shared confirmation prompt for admin destructive actions */\nexport async function confirm(message: string): Promise<boolean> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n try {\n const answer = await rl.question(`${message} [y/N] `);\n return answer.trim().toLowerCase() === \"y\";\n } finally {\n rl.close();\n }\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../../lib/api-client.js\";\nimport { handleError, validateId, CliError } from \"../../lib/errors.js\";\nimport { ensureAdminAuth } from \"../auth.js\";\nimport { formatOutput, getOutputOpts, printSuccess } from \"../../lib/output.js\";\nimport { confirm } from \"./admin-utils.js\";\nimport type { AdminOrderListItem, TableColumn } from \"../../types/index.js\";\n\nconst ORDER_COLUMNS: TableColumn[] = [\n { key: \"id\", header: \"ID\", width: 12 },\n { key: \"userEmail\", header: \"User Email\", width: 28 },\n { key: \"productType\", header: \"Product\", width: 16 },\n { key: \"amount\", header: \"Amount\", width: 10 },\n { key: \"currency\", header: \"Currency\", width: 8 },\n { key: \"status\", header: \"Status\", width: 12 },\n { key: \"paymentProvider\", header: \"Provider\", width: 12 },\n { key: \"createdAt\", header: \"Created\", width: 22 },\n];\n\nexport function registerAdminOrdersCommand(admin: Command): void {\n const orders = admin.command(\"orders\").description(\"Admin order management\");\n\n orders\n .command(\"list\")\n .description(\"List all orders\")\n .option(\"--provider <name>\", \"Filter by payment provider\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const params: Record<string, string> = {};\n if (opts.provider) params[\"provider\"] = opts.provider;\n const data = await fetchApi<AdminOrderListItem[]>(\"GET\", \"/admin/orders\", { adminAuth: true, params });\n formatOutput(data, getOutputOpts(this), ORDER_COLUMNS);\n } catch (err) { handleError(err); }\n });\n\n orders\n .command(\"search <query>\")\n .description(\"Search orders by query (id, user email, name)\")\n .option(\"--provider <name>\", \"Filter by payment provider\")\n .option(\"--limit <n>\", \"Number of results\", \"50\")\n .option(\"--offset <n>\", \"Offset for pagination\", \"0\")\n .action(async function (this: Command, query: string) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const limit = Number(opts.limit);\n const offset = Number(opts.offset);\n if (Number.isNaN(limit) || limit < 1) throw new CliError(\"--limit must be a positive integer\");\n if (Number.isNaN(offset) || offset < 0) throw new CliError(\"--offset must be a non-negative integer\");\n const params: Record<string, string> = { search: query, limit: String(limit), offset: String(offset) };\n if (opts.provider) params[\"provider\"] = opts.provider;\n const data = await fetchApi<unknown>(\"GET\", \"/admin/orders\", { adminAuth: true, params });\n formatOutput(data, getOutputOpts(this), ORDER_COLUMNS);\n } catch (err) { handleError(err); }\n });\n\n orders\n .command(\"get <id>\")\n .description(\"Get order details\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"order ID\");\n const data = await fetchApi<unknown>(\"GET\", `/admin/orders/${id}`, { adminAuth: true });\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n orders\n .command(\"complete <id>\")\n .description(\"Mark an order as complete\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"order ID\");\n const ok = await confirm(`Complete order ${id}?`);\n if (!ok) { console.log(\"Aborted.\"); return; }\n const data = await fetchApi<unknown>(\"POST\", `/admin/orders/${id}/complete`, { adminAuth: true });\n printSuccess(`Order ${id} marked complete.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n orders\n .command(\"refund <id>\")\n .description(\"Refund an order (revokes GitHub access)\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"order ID\");\n const ok = await confirm(`Refund order ${id}? WARNING: this will revoke GitHub access. Continue?`);\n if (!ok) { console.log(\"Aborted.\"); return; }\n const data = await fetchApi<unknown>(\"POST\", `/admin/orders/${id}/refund`, { adminAuth: true });\n printSuccess(`Order ${id} refunded.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n orders\n .command(\"refund-keep-access <id>\")\n .description(\"Refund an order but keep GitHub access\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"order ID\");\n const ok = await confirm(`Refund order ${id} (keep access)?`);\n if (!ok) { console.log(\"Aborted.\"); return; }\n const data = await fetchApi<unknown>(\"POST\", `/admin/orders/${id}/refund-keep-access`, { adminAuth: true });\n printSuccess(`Order ${id} refunded (access retained).`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n orders\n .command(\"switch-product <id>\")\n .description(\"Switch the product type of an order\")\n .requiredOption(\"--product <engineer_kit|marketing_kit>\", \"Target product type\")\n .option(\"--reason <text>\", \"Reason for the switch\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"order ID\");\n const { product, reason } = this.opts();\n if (![\"engineer_kit\", \"marketing_kit\"].includes(product)) {\n throw new CliError(\"--product must be one of: engineer_kit, marketing_kit\");\n }\n const ok = await confirm(`Switch order ${id} to product \"${product}\"?`);\n if (!ok) { console.log(\"Aborted.\"); return; }\n const body: Record<string, unknown> = { targetProductType: product };\n if (reason) body[\"reason\"] = reason;\n const data = await fetchApi<unknown>(\"POST\", `/admin/orders/${id}/switch-product`, { adminAuth: true, body });\n printSuccess(`Order ${id} product switched to ${product}.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n orders\n .command(\"resend-emails <id>\")\n .description(\"Resend emails for an order\")\n .requiredOption(\"--type <order|welcome|invoice|both>\", \"Email type to resend\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"order ID\");\n const { type } = this.opts();\n const data = await fetchApi<unknown>(\"POST\", `/admin/orders/${id}/resend-emails`, {\n adminAuth: true,\n body: { emailType: type },\n });\n printSuccess(`Emails (${type}) resent for order ${id}.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n orders\n .command(\"resend-github-invite <id>\")\n .description(\"Resend GitHub repo invite for a completed order\")\n .option(\"--variant <type>\", \"Override product variant (engineer_kit|marketing_kit|combo)\")\n .option(\"--github-username <name>\", \"Override GitHub username to invite\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"order ID\");\n const opts = this.opts();\n if (opts.variant && ![\"engineer_kit\", \"marketing_kit\", \"combo\"].includes(opts.variant)) {\n throw new CliError(`--variant must be one of engineer_kit, marketing_kit, combo`);\n }\n const body: Record<string, unknown> = {};\n if (opts.variant) body[\"variant\"] = opts.variant;\n if (opts.githubUsername) body[\"githubUsername\"] = opts.githubUsername;\n const data = await fetchApi<unknown>(\n \"POST\",\n `/admin/orders/${id}/resend-github-invite`,\n { adminAuth: true, body },\n );\n printSuccess(`GitHub invite resent for order ${id}.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n orders\n .command(\"export\")\n .description(\"Export orders as CSV\")\n .option(\"--start <date>\", \"Start date (ISO 8601)\")\n .option(\"--end <date>\", \"End date (ISO 8601)\")\n .option(\"--search <text>\", \"Search text\")\n .option(\"--provider <name>\", \"Filter by payment provider\")\n .option(\"--status <status>\", \"Filter by status\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const params: Record<string, string> = {};\n if (opts.start) params[\"startDate\"] = opts.start;\n if (opts.end) params[\"endDate\"] = opts.end;\n if (opts.search) params[\"search\"] = opts.search;\n if (opts.provider) params[\"provider\"] = opts.provider;\n if (opts.status) params[\"status\"] = opts.status;\n const csv = await fetchApi<string>(\"GET\", \"/admin/orders/export\", { adminAuth: true, params });\n console.log(typeof csv === \"string\" ? csv : JSON.stringify(csv));\n } catch (err) { handleError(err); }\n });\n\n orders\n .command(\"stats\")\n .description(\"Aggregate counts + revenue with optional filters\")\n .option(\"--start <date>\", \"Start date (ISO 8601)\")\n .option(\"--end <date>\", \"End date (ISO 8601)\")\n .option(\"--status <status>\", \"Order status filter\")\n .option(\"--provider <polar|sepay>\", \"Payment provider filter\")\n .option(\"--vat-requested\", \"Only count orders with VAT invoice requested\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n if (opts.provider && opts.provider !== \"polar\" && opts.provider !== \"sepay\") {\n throw new CliError(\"--provider must be 'polar' or 'sepay'\");\n }\n const params: Record<string, string> = {};\n if (opts.start) params[\"start\"] = opts.start;\n if (opts.end) params[\"end\"] = opts.end;\n if (opts.status) params[\"status\"] = opts.status;\n if (opts.provider) params[\"provider\"] = opts.provider;\n if (opts.vatRequested) params[\"vatRequested\"] = \"true\";\n const data = await fetchApi<unknown>(\"GET\", \"/admin/orders/stats\", { adminAuth: true, params });\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../../lib/api-client.js\";\nimport { handleError, validateId, CliError } from \"../../lib/errors.js\";\nimport { ensureAdminAuth } from \"../auth.js\";\nimport { formatOutput, getOutputOpts, printSuccess } from \"../../lib/output.js\";\nimport type { AdminUserDetail } from \"../../types/index.js\";\n\nexport function registerAdminUsersCommand(admin: Command): void {\n const users = admin.command(\"users\").description(\"Admin user management\");\n\n users\n .command(\"get <id>\")\n .description(\"Get user details\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"user ID\");\n const data = await fetchApi<AdminUserDetail>(\"GET\", `/admin/users/${id}`, { adminAuth: true });\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n users\n .command(\"update <id>\")\n .description(\"Update user name and/or email\")\n .option(\"--email <email>\", \"New email address\")\n .option(\"--name <name>\", \"New display name\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"user ID\");\n const opts = this.opts();\n if (opts.email === undefined && opts.name === undefined) {\n throw new CliError(\"At least one of --email or --name is required.\");\n }\n const body: Record<string, string> = {};\n if (opts.email !== undefined) body[\"email\"] = opts.email;\n if (opts.name !== undefined) body[\"name\"] = opts.name;\n const data = await fetchApi<unknown>(\"PATCH\", `/admin/users/${id}`, { adminAuth: true, body });\n printSuccess(`User ${id} updated.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n users\n .command(\"update-github <id>\")\n .description(\"Update GitHub username for a user\")\n .requiredOption(\"--username <name>\", \"New GitHub username\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"user ID\");\n const { username } = this.opts();\n const data = await fetchApi<unknown>(\"PATCH\", `/admin/users/${id}/github-username`, {\n adminAuth: true,\n body: { githubUsername: username },\n });\n printSuccess(`GitHub username updated for user ${id}.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n users\n .command(\"update-rates <id>\")\n .description(\"Update commission/discount rates for a user\")\n .option(\"--commission <rate>\", \"Commission rate (number)\")\n .option(\"--discount <rate>\", \"Discount rate (number)\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"user ID\");\n const opts = this.opts();\n if (opts.commission === undefined && opts.discount === undefined) {\n throw new CliError(\"At least one of --commission or --discount is required.\");\n }\n const body: Record<string, number | null> = {};\n if (opts.commission !== undefined) {\n const val = Number(opts.commission);\n if (Number.isNaN(val) || val < 0 || val > 100) throw new CliError(\"--commission must be a number between 0 and 100\");\n body[\"commissionRate\"] = val;\n }\n if (opts.discount !== undefined) {\n const val = Number(opts.discount);\n if (Number.isNaN(val) || val < 0 || val > 100) throw new CliError(\"--discount must be a number between 0 and 100\");\n body[\"discountRate\"] = val;\n }\n const data = await fetchApi<unknown>(\"PATCH\", `/admin/users/${id}/rates`, { adminAuth: true, body });\n printSuccess(`Rates updated for user ${id}.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n users\n .command(\"set-tier <id>\")\n .description(\"Set manual tier for a user (use 'none' to remove)\")\n .requiredOption(\"--tier <tierId>\", \"Tier ID or 'none' to remove\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"user ID\");\n const { tier } = this.opts();\n const data = await fetchApi<unknown>(\"PATCH\", `/admin/users/${id}/tier`, {\n adminAuth: true,\n body: { manualTierId: tier === \"none\" ? null : tier },\n });\n printSuccess(`Tier updated for user ${id}.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n users\n .command(\"export\")\n .description(\"Export users as CSV\")\n .option(\"--start <date>\", \"Start date (ISO 8601)\")\n .option(\"--end <date>\", \"End date (ISO 8601)\")\n .option(\"--search <text>\", \"Search text\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const params: Record<string, string> = {};\n if (opts.start) params[\"startDate\"] = opts.start;\n if (opts.end) params[\"endDate\"] = opts.end;\n if (opts.search) params[\"search\"] = opts.search;\n const csv = await fetchApi<string>(\"GET\", \"/admin/users/export\", { adminAuth: true, params });\n console.log(typeof csv === \"string\" ? csv : JSON.stringify(csv));\n } catch (err) { handleError(err); }\n });\n\n users\n .command(\"stats\")\n .description(\"Aggregate user metrics: signups, paying users, top spenders, tiers, GitHub-linked, referrers\")\n .option(\"--start <date>\", \"Start date (ISO 8601)\")\n .option(\"--end <date>\", \"End date (ISO 8601)\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const params: Record<string, string> = {};\n if (opts.start) params[\"start\"] = opts.start;\n if (opts.end) params[\"end\"] = opts.end;\n const data = await fetchApi<unknown>(\"GET\", \"/admin/users/stats\", { adminAuth: true, params });\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../../lib/api-client.js\";\nimport { handleError, validateId } from \"../../lib/errors.js\";\nimport { ensureAdminAuth } from \"../auth.js\";\nimport { formatOutput, getOutputOpts } from \"../../lib/output.js\";\nimport type { AdminReferralStats } from \"../../types/index.js\";\n\nexport function registerAdminReferralsCommand(admin: Command): void {\n const referrals = admin.command(\"referrals\").description(\"Admin referral management\");\n\n referrals\n .command(\"stats\")\n .description(\"Get referral statistics\")\n .option(\"--start <date>\", \"Start date (ISO 8601)\")\n .option(\"--end <date>\", \"End date (ISO 8601)\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const params: Record<string, string> = {};\n if (opts.start) params[\"startDate\"] = opts.start;\n if (opts.end) params[\"endDate\"] = opts.end;\n const data = await fetchApi<AdminReferralStats>(\"GET\", \"/admin/referrals/stats\", { adminAuth: true, params });\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n referrals\n .command(\"user-stats <userId>\")\n .description(\"Per-referrer detailed stats (profile + KPIs + payouts)\")\n .option(\"--start <date>\", \"Start date (ISO 8601)\")\n .option(\"--end <date>\", \"End date (ISO 8601)\")\n .action(async function (this: Command, userId: string) {\n try {\n ensureAdminAuth();\n validateId(userId, \"user ID\");\n const opts = this.opts();\n const params: Record<string, string> = {};\n if (opts.start) params[\"startDate\"] = opts.start;\n if (opts.end) params[\"endDate\"] = opts.end;\n const data = await fetchApi<unknown>(\n \"GET\",\n `/admin/referrals/${userId}/stats`,\n { adminAuth: true, params },\n );\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n referrals\n .command(\"tiers-stats\")\n .description(\"Get referral tier statistics\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const data = await fetchApi<unknown>(\"GET\", \"/admin/referrals/tiers/stats\", { adminAuth: true });\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n referrals\n .command(\"diagnose\")\n .description(\"Run referral diagnostics\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const data = await fetchApi<unknown>(\"GET\", \"/admin/referrals/diagnose\", { adminAuth: true });\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n referrals\n .command(\"export\")\n .description(\"Export referral data as CSV\")\n .option(\"--start <date>\", \"Start date (ISO 8601)\")\n .option(\"--end <date>\", \"End date (ISO 8601)\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const params: Record<string, string> = {};\n if (opts.start) params[\"startDate\"] = opts.start;\n if (opts.end) params[\"endDate\"] = opts.end;\n const csv = await fetchApi<string>(\"GET\", \"/admin/referrals/export\", { adminAuth: true, params });\n console.log(typeof csv === \"string\" ? csv : JSON.stringify(csv));\n } catch (err) { handleError(err); }\n });\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../../lib/api-client.js\";\nimport { handleError, validateId, CliError } from \"../../lib/errors.js\";\nimport { ensureAdminAuth } from \"../auth.js\";\nimport { formatOutput, getOutputOpts, printSuccess } from \"../../lib/output.js\";\nimport { confirm } from \"./admin-utils.js\";\nimport type { AdminRevenueStats } from \"../../types/index.js\";\n\nexport function registerAdminRevenueCommand(admin: Command): void {\n const revenue = admin.command(\"revenue\").description(\"Admin revenue reporting\");\n\n revenue\n .command(\"stats\")\n .description(\"Get revenue statistics\")\n .option(\"--start <date>\", \"Start date (ISO 8601)\")\n .option(\"--end <date>\", \"End date (ISO 8601)\")\n .option(\"--product <engineer_kit|marketing_kit|combo>\", \"Filter by product\")\n .option(\"--no-team\", \"Exclude team_* product variants (includeTeam=false)\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const params: Record<string, string> = {};\n if (opts.start) params[\"startDate\"] = opts.start;\n if (opts.end) params[\"endDate\"] = opts.end;\n if (opts.product) {\n if (![\"engineer_kit\", \"marketing_kit\", \"combo\"].includes(opts.product)) {\n throw new CliError(\"--product must be one of: engineer_kit, marketing_kit, combo\");\n }\n params[\"product\"] = opts.product;\n }\n // commander's --no-team sets opts.team = false; only forward when explicitly set\n if (opts.team === false) params[\"includeTeam\"] = \"false\";\n const data = await fetchApi<AdminRevenueStats>(\"GET\", \"/admin/revenue\", { adminAuth: true, params });\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n revenue\n .command(\"export\")\n .description(\"Export revenue data as CSV\")\n .option(\"--start <date>\", \"Start date (ISO 8601)\")\n .option(\"--end <date>\", \"End date (ISO 8601)\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const params: Record<string, string> = {};\n if (opts.start) params[\"startDate\"] = opts.start;\n if (opts.end) params[\"endDate\"] = opts.end;\n const csv = await fetchApi<string>(\"GET\", \"/admin/revenue/export\", { adminAuth: true, params });\n console.log(typeof csv === \"string\" ? csv : JSON.stringify(csv));\n } catch (err) { handleError(err); }\n });\n\n revenue\n .command(\"maintainer\")\n .description(\"Get maintainer revenue breakdown\")\n .requiredOption(\"--id <cke|ckm>\", \"Maintainer ID\")\n .option(\"--start <date>\", \"Start date (ISO 8601)\")\n .option(\"--end <date>\", \"End date (ISO 8601)\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const params: Record<string, string> = { id: opts.id };\n if (opts.start) params[\"startDate\"] = opts.start;\n if (opts.end) params[\"endDate\"] = opts.end;\n const data = await fetchApi<unknown>(\"GET\", \"/admin/revenue/maintainer\", { adminAuth: true, params });\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n revenue\n .command(\"costs\")\n .description(\"Get monthly costs\")\n .option(\"--month <YYYY-MM>\", \"Month in YYYY-MM format\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const params: Record<string, string> = {};\n if (opts.month) params[\"yearMonth\"] = opts.month;\n const data = await fetchApi<unknown>(\"GET\", \"/admin/revenue/monthly-costs\", { adminAuth: true, params });\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n revenue\n .command(\"add-cost\")\n .description(\"Add a monthly cost entry\")\n .requiredOption(\"--month <YYYY-MM>\", \"Month in YYYY-MM format\")\n .requiredOption(\"--category <name>\", \"Cost category\")\n .requiredOption(\"--description <text>\", \"Cost description\")\n .requiredOption(\"--amount <cents>\", \"Amount in cents\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const amount = Number(opts.amount);\n if (Number.isNaN(amount)) throw new CliError(\"--amount must be a valid number\");\n const data = await fetchApi<unknown>(\"POST\", \"/admin/revenue/monthly-costs\", {\n adminAuth: true,\n body: { yearMonth: opts.month, category: opts.category, description: opts.description, amount },\n });\n printSuccess(\"Monthly cost entry added.\");\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n revenue\n .command(\"update-cost <id>\")\n .description(\"Update a monthly cost entry\")\n .option(\"--month <YYYY-MM>\", \"Month in YYYY-MM format\")\n .option(\"--category <name>\", \"Cost category\")\n .option(\"--description <text>\", \"Cost description\")\n .option(\"--amount <cents>\", \"Amount in cents\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"cost ID\");\n const opts = this.opts();\n const body: Record<string, unknown> = {};\n if (opts.month) body[\"yearMonth\"] = opts.month;\n if (opts.category) body[\"category\"] = opts.category;\n if (opts.description) body[\"description\"] = opts.description;\n if (opts.amount !== undefined) {\n const amount = Number(opts.amount);\n if (Number.isNaN(amount)) throw new CliError(\"--amount must be a valid number\");\n body[\"amount\"] = amount;\n }\n const data = await fetchApi<unknown>(\"PUT\", `/admin/revenue/monthly-costs/${id}`, { adminAuth: true, body });\n printSuccess(`Cost entry ${id} updated.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n revenue\n .command(\"delete-cost <id>\")\n .description(\"Delete a monthly cost entry\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"cost ID\");\n const ok = await confirm(`Delete cost entry ${id}? This cannot be undone.`);\n if (!ok) { console.log(\"Aborted.\"); return; }\n await fetchApi<unknown>(\"DELETE\", `/admin/revenue/monthly-costs/${id}`, { adminAuth: true });\n printSuccess(`Cost entry ${id} deleted.`);\n } catch (err) { handleError(err); }\n });\n\n revenue\n .command(\"reports\")\n .description(\"Generate revenue reports\")\n .option(\"--maintainer <cke|ckm|all>\", \"Maintainer ID\")\n .option(\"--month <YYYY-MM>\", \"Month in YYYY-MM format\")\n .option(\"--skip-email\", \"Skip sending email\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const body: Record<string, unknown> = {};\n if (opts.maintainer) body[\"maintainerId\"] = opts.maintainer;\n if (opts.month) body[\"yearMonth\"] = opts.month;\n if (opts.skipEmail) body[\"skipEmail\"] = true;\n const data = await fetchApi<unknown>(\"POST\", \"/admin/revenue/reports\", { adminAuth: true, body });\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../../lib/api-client.js\";\nimport { handleError, validateId, CliError } from \"../../lib/errors.js\";\nimport { ensureAdminAuth } from \"../auth.js\";\nimport { formatOutput, getOutputOpts, printSuccess } from \"../../lib/output.js\";\nimport { confirm } from \"./admin-utils.js\";\nimport type { AdminPayoutRequestItem, TableColumn } from \"../../types/index.js\";\n\nconst PAYOUT_COLUMNS: TableColumn[] = [\n { key: \"id\", header: \"ID\", width: 12 },\n { key: \"userEmail\", header: \"User Email\", width: 28 },\n { key: \"amount\", header: \"Amount\", width: 10 },\n { key: \"currency\", header: \"Currency\", width: 8 },\n { key: \"status\", header: \"Status\", width: 12 },\n { key: \"paymentMethod\", header: \"Method\", width: 14 },\n { key: \"createdAt\", header: \"Created\", width: 22 },\n];\n\nexport function registerAdminPayoutsCommand(admin: Command): void {\n const payouts = admin.command(\"payouts\").description(\"Admin payout management\");\n\n payouts\n .command(\"list\")\n .description(\"List all payout requests\")\n .option(\"--search <text>\", \"Search by user email\")\n .option(\"--status <status>\", \"Filter by status\")\n .option(\"--limit <n>\", \"Page size (default 50, max 100)\")\n .option(\"--offset <n>\", \"Offset for pagination (default 0)\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const params: Record<string, string> = {};\n if (opts.search) params[\"search\"] = opts.search;\n if (opts.status) params[\"status\"] = opts.status;\n if (opts.limit !== undefined) params[\"limit\"] = String(opts.limit);\n if (opts.offset !== undefined) params[\"offset\"] = String(opts.offset);\n const data = await fetchApi<AdminPayoutRequestItem[]>(\"GET\", \"/admin/payout-requests\", { adminAuth: true, params });\n formatOutput(data, getOutputOpts(this), PAYOUT_COLUMNS);\n } catch (err) { handleError(err); }\n });\n\n payouts\n .command(\"update <id>\")\n .description(\"Approve, reject, or complete a payout request\")\n .requiredOption(\"--action <approve|reject|complete>\", \"Action to perform\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"payout request ID\");\n const { action } = this.opts();\n const validActions = [\"approve\", \"reject\", \"complete\"];\n if (!validActions.includes(action)) {\n throw new CliError(`--action must be one of: ${validActions.join(\", \")}`);\n }\n const ok = await confirm(`${action} payout request ${id}?`);\n if (!ok) { console.log(\"Aborted.\"); return; }\n const data = await fetchApi<unknown>(\"PATCH\", `/admin/payout-requests/${id}`, {\n adminAuth: true,\n body: { action },\n });\n printSuccess(`Payout request ${id} updated: ${action}.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n payouts\n .command(\"export\")\n .description(\"Export payouts as CSV\")\n .option(\"--start <date>\", \"Start date (ISO 8601)\")\n .option(\"--end <date>\", \"End date (ISO 8601)\")\n .option(\"--status <status>\", \"Filter by status\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const params: Record<string, string> = {};\n if (opts.start) params[\"startDate\"] = opts.start;\n if (opts.end) params[\"endDate\"] = opts.end;\n if (opts.status) params[\"status\"] = opts.status;\n const csv = await fetchApi<string>(\"GET\", \"/admin/payouts/export\", { adminAuth: true, params });\n console.log(typeof csv === \"string\" ? csv : JSON.stringify(csv));\n } catch (err) { handleError(err); }\n });\n\n payouts\n .command(\"export-detailed\")\n .description(\"Export detailed payouts as CSV\")\n .option(\"--status <status>\", \"Filter by status\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const params: Record<string, string> = {};\n if (opts.status) params[\"status\"] = opts.status;\n const csv = await fetchApi<string>(\"GET\", \"/admin/payouts/export-detailed\", { adminAuth: true, params });\n console.log(typeof csv === \"string\" ? csv : JSON.stringify(csv));\n } catch (err) { handleError(err); }\n });\n\n payouts\n .command(\"request-csv <id>\")\n .description(\"Export a payout request as CSV\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"payout request ID\");\n const csv = await fetchApi<string>(\"GET\", `/admin/payout-requests/${id}/export-csv`, { adminAuth: true });\n console.log(typeof csv === \"string\" ? csv : JSON.stringify(csv));\n } catch (err) { handleError(err); }\n });\n}\n","import { Command } from \"commander\";\nimport * as readline from \"node:readline/promises\";\nimport { fetchApi } from \"../../lib/api-client.js\";\nimport { handleError } from \"../../lib/errors.js\";\nimport { ensureAdminAuth } from \"../auth.js\";\nimport { formatOutput, getOutputOpts, printSuccess } from \"../../lib/output.js\";\nimport type { AdminLoyaltyStats } from \"../../types/index.js\";\n\nasync function confirm(message: string): Promise<boolean> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n try {\n const answer = await rl.question(`${message} [y/N] `);\n return answer.trim().toLowerCase() === \"y\";\n } finally {\n rl.close();\n }\n}\n\nexport function registerAdminLoyaltyCommand(admin: Command): void {\n const loyalty = admin.command(\"loyalty\").description(\"Admin loyalty program management\");\n\n loyalty\n .command(\"stats\")\n .description(\"Get loyalty program statistics\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const data = await fetchApi<AdminLoyaltyStats>(\"GET\", \"/admin/loyalty/stats\", {\n adminAuth: true,\n });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n loyalty\n .command(\"blast-email\")\n .description(\"Send loyalty blast email to eligible users\")\n .option(\"--test\", \"Run in test mode (no confirmation required)\")\n .option(\"--test-email <email>\", \"Send test email to this address\")\n .option(\"--batch-size <n>\", \"Number of emails per batch\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const isTest = opts.test === true;\n\n if (!isTest) {\n const ok = await confirm(\"Send loyalty blast email to all eligible users?\");\n if (!ok) { console.log(\"Aborted.\"); return; }\n }\n\n const body: Record<string, unknown> = { testMode: isTest };\n if (opts.testEmail) body[\"testEmail\"] = opts.testEmail;\n if (opts.batchSize) body[\"batchSize\"] = Number(opts.batchSize);\n\n const data = await fetchApi<unknown>(\"POST\", \"/admin/loyalty/blast-email\", {\n adminAuth: true,\n body,\n });\n printSuccess(\"Loyalty blast email queued.\");\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { readFileSync } from \"node:fs\";\nimport { fetchApi } from \"../../lib/api-client.js\";\nimport { handleError, validateId, CliError } from \"../../lib/errors.js\";\nimport { ensureAdminAuth } from \"../auth.js\";\nimport { formatOutput, getOutputOpts, printSuccess } from \"../../lib/output.js\";\nimport { confirm } from \"./admin-utils.js\";\nimport { registerAdminBlogCategoriesCommand } from \"./admin-blog-categories.js\";\nimport { registerAdminBlogTagsCommand } from \"./admin-blog-tags.js\";\nimport type { Article } from \"../../types/index.js\";\n\nfunction resolveContent(opts: Record<string, string>): string | undefined {\n if (opts.file) {\n try {\n return readFileSync(opts.file, \"utf-8\");\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new CliError(`Cannot read file \"${opts.file}\": ${msg}`);\n }\n }\n return opts.content;\n}\n\nconst ARTICLE_STATUSES = [\"draft\", \"scheduled\", \"published\", \"archived\"] as const;\n\nfunction applySchedulingFields(\n body: Record<string, unknown>,\n opts: { status?: string; scheduledFor?: string },\n): void {\n if (opts.status !== undefined) {\n if (!ARTICLE_STATUSES.includes(opts.status as typeof ARTICLE_STATUSES[number])) {\n throw new CliError(`--status must be one of: ${ARTICLE_STATUSES.join(\", \")}`);\n }\n body[\"status\"] = opts.status;\n }\n if (opts.scheduledFor !== undefined) {\n const d = new Date(opts.scheduledFor);\n if (Number.isNaN(d.getTime())) {\n throw new CliError(`--scheduled-for must be a valid ISO 8601 datetime (got \"${opts.scheduledFor}\")`);\n }\n // Reject contradictory combinations rather than relying on server recovery.\n if (opts.status && opts.status !== \"scheduled\" && opts.status !== \"draft\") {\n throw new CliError(\n `--scheduled-for cannot be combined with --status ${opts.status}; use --status scheduled (or omit --status).`,\n );\n }\n body[\"scheduledFor\"] = d.toISOString();\n }\n}\n\nexport function registerAdminBlogCommand(admin: Command): void {\n const blog = admin.command(\"blog\").description(\"Admin blog management\");\n registerAdminBlogCategoriesCommand(blog);\n\n registerAdminBlogTagsCommand(blog);\n\n blog\n .command(\"create\")\n .description(\"Create a new blog article\")\n .requiredOption(\"--title <title>\", \"Article title\")\n .option(\"--content <content>\", \"Article content (inline)\")\n .option(\"--file <filepath>\", \"Read content from file\")\n .option(\"--status <draft|scheduled|published|archived>\", \"Article status\")\n .option(\"--scheduled-for <iso-date>\", \"Publish at this ISO 8601 datetime\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const content = resolveContent(opts);\n const body: Record<string, unknown> = { title: opts.title, content };\n applySchedulingFields(body, { status: opts.status, scheduledFor: opts.scheduledFor });\n const data = await fetchApi<Article>(\"POST\", \"/blog/articles\", {\n adminAuth: true,\n body,\n });\n printSuccess(\"Article created.\");\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n blog\n .command(\"update <id>\")\n .description(\"Update an existing blog article\")\n .option(\"--title <title>\", \"New title\")\n .option(\"--content <content>\", \"New content (inline)\")\n .option(\"--file <filepath>\", \"Read new content from file\")\n .option(\"--status <draft|scheduled|published|archived>\", \"Article status\")\n .option(\"--scheduled-for <iso-date>\", \"Publish at this ISO 8601 datetime\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"article ID\");\n const opts = this.opts();\n const content = resolveContent(opts);\n const body: Record<string, unknown> = {};\n if (opts.title) body[\"title\"] = opts.title;\n if (content !== undefined) body[\"content\"] = content;\n applySchedulingFields(body, { status: opts.status, scheduledFor: opts.scheduledFor });\n\n const data = await fetchApi<Article>(\"PATCH\", `/blog/articles/${id}`, {\n adminAuth: true,\n body,\n });\n printSuccess(`Article ${id} updated.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n blog\n .command(\"delete <id>\")\n .description(\"Delete a blog article\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"article ID\");\n const ok = await confirm(`Delete article ${id}? This cannot be undone.`);\n if (!ok) { console.log(\"Aborted.\"); return; }\n\n await fetchApi<unknown>(\"DELETE\", `/blog/articles/${id}`, { adminAuth: true });\n printSuccess(`Article ${id} deleted.`);\n } catch (err) {\n handleError(err);\n }\n });\n\n blog\n .command(\"publish <id>\")\n .description(\"Publish a blog article\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"article ID\");\n const ok = await confirm(`Publish article ${id}?`);\n if (!ok) { console.log(\"Aborted.\"); return; }\n\n const data = await fetchApi<Article>(\"POST\", `/blog/articles/${id}/publish`, {\n adminAuth: true,\n });\n printSuccess(`Article ${id} published.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n blog\n .command(\"ai-generate\")\n .description(\"Generate a blog article using AI\")\n .requiredOption(\"--prompt <text>\", \"Generation prompt\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const { prompt } = this.opts();\n const data = await fetchApi<unknown>(\"POST\", \"/blog/ai/generate\", {\n adminAuth: true,\n body: { prompt },\n });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n blog\n .command(\"ai-transform\")\n .description(\"Transform text using AI\")\n .requiredOption(\"--text <text>\", \"Source text to transform\")\n .requiredOption(\"--instruction <text>\", \"Transformation instruction\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const { text, instruction } = this.opts();\n const data = await fetchApi<unknown>(\"POST\", \"/blog/ai/transform\", {\n adminAuth: true,\n body: { text, instruction },\n });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n blog\n .command(\"generate-metadata <id>\")\n .description(\"Generate SEO metadata for an article\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"article ID\");\n const data = await fetchApi<unknown>(\"POST\", \"/blog/generate-metadata\", {\n adminAuth: true,\n body: { articleId: id },\n });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n blog\n .command(\"upload-url\")\n .description(\"Get a presigned URL for blog asset upload\")\n .requiredOption(\"--filename <name>\", \"File name to upload\")\n .requiredOption(\"--content-type <type>\", \"MIME type of the file\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const data = await fetchApi<unknown>(\"POST\", \"/blog/upload/presigned-url\", {\n adminAuth: true,\n body: { filename: opts.filename, contentType: opts.contentType },\n });\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n blog\n .command(\"run-scheduler\")\n .description(\"Manually trigger the blog article scheduler\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const data = await fetchApi<unknown>(\"POST\", \"/blog/scheduler\", { adminAuth: true });\n printSuccess(\"Scheduler executed.\");\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n blog\n .command(\"export\")\n .description(\"Export blog articles as CSV\")\n .option(\"--start <date>\", \"Start date (ISO 8601)\")\n .option(\"--end <date>\", \"End date (ISO 8601)\")\n .option(\"--status <status>\", \"Filter by status\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const params: Record<string, string> = {};\n if (opts.start) params[\"startDate\"] = opts.start;\n if (opts.end) params[\"endDate\"] = opts.end;\n if (opts.status) params[\"status\"] = opts.status;\n const csv = await fetchApi<string>(\"GET\", \"/admin/blog/export\", { adminAuth: true, params });\n console.log(typeof csv === \"string\" ? csv : JSON.stringify(csv));\n } catch (err) { handleError(err); }\n });\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../../lib/api-client.js\";\nimport { handleError, validateId, CliError } from \"../../lib/errors.js\";\nimport { ensureAdminAuth } from \"../auth.js\";\nimport { formatOutput, getOutputOpts, printSuccess } from \"../../lib/output.js\";\nimport { confirm } from \"./admin-utils.js\";\n\ninterface Category {\n id: string;\n name: string;\n slug: string;\n description: string | null;\n parentId: string | null;\n createdAt: string;\n}\n\nconst CATEGORY_COLUMNS = [\n { key: \"id\", header: \"ID\", width: 36 },\n { key: \"name\", header: \"Name\", width: 24 },\n { key: \"slug\", header: \"Slug\", width: 24 },\n { key: \"parentId\", header: \"Parent\", width: 36 },\n];\n\nexport function registerAdminBlogCategoriesCommand(blog: Command): void {\n const categories = blog.command(\"categories\").description(\"Manage blog categories\");\n\n categories\n .command(\"list\")\n .description(\"List blog categories\")\n .option(\"--query <text>\", \"Filter by name or slug\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const params: Record<string, string> = {};\n if (opts.query) params[\"query\"] = opts.query;\n const data = await fetchApi<{ items: Category[] }>(\"GET\", \"/admin/blog/categories\", {\n adminAuth: true,\n params,\n });\n formatOutput(data.items, getOutputOpts(this), CATEGORY_COLUMNS);\n } catch (err) { handleError(err); }\n });\n\n categories\n .command(\"get <id>\")\n .description(\"Get a blog category by ID\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"category ID\");\n const data = await fetchApi<{ category: Category }>(\"GET\", `/admin/blog/categories/${id}`, {\n adminAuth: true,\n });\n formatOutput(data.category, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n categories\n .command(\"create\")\n .description(\"Create a blog category\")\n .requiredOption(\"--name <name>\", \"Category name\")\n .option(\"--slug <slug>\", \"Slug (auto-derived from name if omitted)\")\n .option(\"--description <text>\", \"Description\")\n .option(\"--parent <id>\", \"Parent category ID\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const body: Record<string, unknown> = { name: opts.name };\n if (opts.slug) body[\"slug\"] = opts.slug;\n if (opts.description) body[\"description\"] = opts.description;\n if (opts.parent) body[\"parentId\"] = opts.parent;\n const data = await fetchApi<{ category: Category }>(\"POST\", \"/admin/blog/categories\", {\n adminAuth: true,\n body,\n });\n printSuccess(`Category \"${data.category.name}\" created (${data.category.id}).`);\n formatOutput(data.category, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n categories\n .command(\"update <id>\")\n .description(\"Update a blog category\")\n .option(\"--name <name>\", \"New name\")\n .option(\"--slug <slug>\", \"New slug\")\n .option(\"--description <text>\", \"New description\")\n .option(\"--parent <id>\", \"New parent category ID ('none' to clear)\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"category ID\");\n const opts = this.opts();\n const body: Record<string, unknown> = {};\n if (opts.name !== undefined) body[\"name\"] = opts.name;\n if (opts.slug !== undefined) body[\"slug\"] = opts.slug;\n if (opts.description !== undefined) body[\"description\"] = opts.description;\n if (opts.parent !== undefined) body[\"parentId\"] = opts.parent === \"none\" ? null : opts.parent;\n if (Object.keys(body).length === 0) {\n throw new CliError(\"At least one field (--name, --slug, --description, --parent) is required.\");\n }\n const data = await fetchApi<{ category: Category }>(\"PATCH\", `/admin/blog/categories/${id}`, {\n adminAuth: true,\n body,\n });\n printSuccess(`Category ${id} updated.`);\n formatOutput(data.category, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n categories\n .command(\"delete <id>\")\n .description(\"Delete a blog category (refuses if articles or child categories reference it)\")\n .option(\"--force\", \"Disassociate articles before deleting (still refuses if children exist)\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"category ID\");\n const opts = this.opts();\n const ok = await confirm(`Delete category ${id}${opts.force ? \" (force)\" : \"\"}? This cannot be undone.`);\n if (!ok) { console.log(\"Aborted.\"); return; }\n const params: Record<string, string> = {};\n if (opts.force) params[\"force\"] = \"true\";\n const data = await fetchApi<unknown>(\"DELETE\", `/admin/blog/categories/${id}`, {\n adminAuth: true,\n params,\n });\n printSuccess(`Category ${id} deleted.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n // Article ↔ category association\n const articleCats = blog.command(\"article-categories\").description(\"Manage article-category associations\");\n\n articleCats\n .command(\"add\")\n .description(\"Attach a category to an article\")\n .requiredOption(\"--article <id>\", \"Article ID\")\n .requiredOption(\"--category <id>\", \"Category ID\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n validateId(opts.article, \"article ID\");\n validateId(opts.category, \"category ID\");\n const data = await fetchApi<{ attached: boolean; alreadyExisted: boolean }>(\n \"POST\",\n `/admin/blog/articles/${opts.article}/categories/${opts.category}`,\n { adminAuth: true },\n );\n if (data.alreadyExisted) {\n console.log(\"Association already exists.\");\n } else {\n printSuccess(`Category ${opts.category} attached to article ${opts.article}.`);\n }\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n articleCats\n .command(\"remove\")\n .description(\"Detach a category from an article\")\n .requiredOption(\"--article <id>\", \"Article ID\")\n .requiredOption(\"--category <id>\", \"Category ID\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n validateId(opts.article, \"article ID\");\n validateId(opts.category, \"category ID\");\n const data = await fetchApi<{ detached: boolean }>(\n \"DELETE\",\n `/admin/blog/articles/${opts.article}/categories/${opts.category}`,\n { adminAuth: true },\n );\n if (data.detached) {\n printSuccess(`Category ${opts.category} detached from article ${opts.article}.`);\n } else {\n console.log(\"No association existed.\");\n }\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../../lib/api-client.js\";\nimport { handleError, validateId, CliError } from \"../../lib/errors.js\";\nimport { ensureAdminAuth } from \"../auth.js\";\nimport { formatOutput, getOutputOpts, printSuccess } from \"../../lib/output.js\";\nimport { confirm } from \"./admin-utils.js\";\n\nexport function registerAdminBlogTagsCommand(blog: Command): void {\n blog\n .command(\"tags\")\n .description(\"List blog tags\")\n .option(\"--query <text>\", \"Search by name or slug\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const params: Record<string, string> = {};\n if (opts.query) params[\"query\"] = opts.query;\n const data = await fetchApi<unknown>(\"GET\", \"/admin/blog/tags\", { adminAuth: true, params });\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n blog\n .command(\"tag-get <id>\")\n .description(\"Get a blog tag by id\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"tag ID\");\n const data = await fetchApi<unknown>(\"GET\", `/admin/blog/tags/${id}`, { adminAuth: true });\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n blog\n .command(\"tag-create\")\n .description(\"Create a blog tag\")\n .requiredOption(\"--name <name>\", \"Tag name\")\n .option(\"--slug <slug>\", \"Tag slug (auto-generated if omitted)\")\n .option(\"--description <text>\", \"Tag description\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const body: Record<string, unknown> = { name: opts.name };\n if (opts.slug) body[\"slug\"] = opts.slug;\n if (opts.description) body[\"description\"] = opts.description;\n const data = await fetchApi<unknown>(\"POST\", \"/admin/blog/tags\", {\n adminAuth: true,\n body,\n });\n printSuccess(\"Tag created.\");\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n blog\n .command(\"tag-update <id>\")\n .description(\"Update a blog tag\")\n .option(\"--name <name>\", \"New name\")\n .option(\"--slug <slug>\", \"New slug\")\n .option(\"--description <text>\", \"New description\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"tag ID\");\n const opts = this.opts();\n const body: Record<string, unknown> = {};\n if (opts.name !== undefined) body[\"name\"] = opts.name;\n if (opts.slug !== undefined) body[\"slug\"] = opts.slug;\n if (opts.description !== undefined) body[\"description\"] = opts.description;\n if (Object.keys(body).length === 0) {\n throw new CliError(\"Provide at least one of --name, --slug, --description.\");\n }\n const data = await fetchApi<unknown>(\"PATCH\", `/admin/blog/tags/${id}`, {\n adminAuth: true,\n body,\n });\n printSuccess(`Tag ${id} updated.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n blog\n .command(\"tag-delete <id>\")\n .description(\"Delete a blog tag\")\n .option(\"--force\", \"Force delete even if articles are associated (detaches them)\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"tag ID\");\n const opts = this.opts();\n const ok = await confirm(`Delete tag ${id}${opts.force ? \" (force)\" : \"\"}? This cannot be undone.`);\n if (!ok) { console.log(\"Aborted.\"); return; }\n const params: Record<string, string> = {};\n if (opts.force) params[\"force\"] = \"true\";\n await fetchApi<unknown>(\"DELETE\", `/admin/blog/tags/${id}`, { adminAuth: true, params });\n printSuccess(`Tag ${id} deleted.`);\n } catch (err) { handleError(err); }\n });\n\n blog\n .command(\"article-tag-add <articleId> <tagId>\")\n .description(\"Attach a tag to an article\")\n .action(async function (this: Command, articleId: string, tagId: string) {\n try {\n ensureAdminAuth();\n validateId(articleId, \"article ID\");\n validateId(tagId, \"tag ID\");\n const data = await fetchApi<unknown>(\n \"POST\",\n `/admin/blog/articles/${articleId}/tags/${tagId}`,\n { adminAuth: true },\n );\n printSuccess(`Tag ${tagId} attached to article ${articleId}.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n blog\n .command(\"article-tag-remove <articleId> <tagId>\")\n .description(\"Detach a tag from an article\")\n .action(async function (this: Command, articleId: string, tagId: string) {\n try {\n ensureAdminAuth();\n validateId(articleId, \"article ID\");\n validateId(tagId, \"tag ID\");\n const data = await fetchApi<unknown>(\n \"DELETE\",\n `/admin/blog/articles/${articleId}/tags/${tagId}`,\n { adminAuth: true },\n );\n printSuccess(`Tag ${tagId} detached from article ${articleId}.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { fetchApi } from \"../../lib/api-client.js\";\nimport { handleError, validateId } from \"../../lib/errors.js\";\nimport { ensureAdminAuth } from \"../auth.js\";\nimport { formatOutput, getOutputOpts, printSuccess } from \"../../lib/output.js\";\nimport { confirm } from \"./admin-utils.js\";\nimport type { TableColumn } from \"../../types/index.js\";\n\nconst KEY_COLUMNS: TableColumn[] = [\n { key: \"id\", header: \"ID\", width: 12 },\n { key: \"name\", header: \"Name\", width: 20 },\n { key: \"scopes\", header: \"Scopes\", width: 30 },\n { key: \"createdAt\", header: \"Created\", width: 22 },\n];\n\nexport function registerAdminKeysCommand(admin: Command): void {\n const keys = admin.command(\"keys\").description(\"Admin API key management\");\n\n keys\n .command(\"list\")\n .description(\"List all API keys\")\n .option(\"--limit <n>\", \"Number of results\", \"50\")\n .option(\"--offset <n>\", \"Offset for pagination\", \"0\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const limit = Number(opts.limit);\n const offset = Number(opts.offset);\n if (Number.isNaN(limit) || limit < 1) throw new Error(\"--limit must be a positive number\");\n if (Number.isNaN(offset) || offset < 0) throw new Error(\"--offset must be a non-negative number\");\n\n const data = await fetchApi<unknown[]>(\"GET\", \"/admin/keys\", {\n adminAuth: true,\n params: { limit: String(limit), offset: String(offset) },\n });\n formatOutput(data, getOutputOpts(this), KEY_COLUMNS);\n } catch (err) {\n handleError(err);\n }\n });\n\n keys\n .command(\"search <query>\")\n .description(\"Search API keys by name or scope\")\n .option(\"--limit <n>\", \"Number of results\", \"50\")\n .option(\"--offset <n>\", \"Offset for pagination\", \"0\")\n .action(async function (this: Command, query: string) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const limit = Number(opts.limit);\n const offset = Number(opts.offset);\n if (Number.isNaN(limit) || limit < 1) throw new Error(\"--limit must be a positive number\");\n if (Number.isNaN(offset) || offset < 0) throw new Error(\"--offset must be a non-negative number\");\n const data = await fetchApi<unknown[]>(\"GET\", \"/admin/keys\", {\n adminAuth: true,\n params: { search: query, limit: String(limit), offset: String(offset) },\n });\n formatOutput(data, getOutputOpts(this), KEY_COLUMNS);\n } catch (err) { handleError(err); }\n });\n\n keys\n .command(\"create\")\n .description(\"Create a new API key\")\n .requiredOption(\"--name <name>\", \"Key name\")\n .requiredOption(\"--scopes <scopes>\", \"Comma-separated list of scopes\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const { name, scopes } = this.opts();\n const data = await fetchApi<unknown>(\"POST\", \"/admin/keys\", {\n adminAuth: true,\n body: { name, scopes: scopes.split(\",\").map((s: string) => s.trim()) },\n });\n printSuccess(`API key \"${name}\" created.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n keys\n .command(\"validate\")\n .description(\"Validate the current admin API key\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const data = await fetchApi<unknown>(\"POST\", \"/admin/keys/validate\", {\n adminAuth: true,\n });\n printSuccess(\"Admin API key is valid.\");\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n keys\n .command(\"revoke <id>\")\n .description(\"Revoke an API key\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"key ID\");\n\n const ok = await confirm(`Revoke API key ${id}?`);\n if (!ok) { console.log(\"Aborted.\"); return; }\n\n const data = await fetchApi<unknown>(\"POST\", `/admin/keys/${id}/revoke`, {\n adminAuth: true,\n });\n printSuccess(`API key ${id} revoked.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n keys\n .command(\"rotate <id>\")\n .description(\"Rotate an API key (generates a new key value)\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"key ID\");\n\n const ok = await confirm(`Rotate API key ${id}? The old key will be invalidated.`);\n if (!ok) { console.log(\"Aborted.\"); return; }\n\n const data = await fetchApi<{ key?: string }>(\"POST\", `/admin/keys/${id}/rotate`, {\n adminAuth: true,\n });\n printSuccess(`API key ${id} rotated.`);\n if (data && typeof data === \"object\" && \"key\" in data && data.key) {\n console.log(chalk.bold.green(`New key: ${data.key}`));\n console.log(chalk.yellow(\"Store this key securely — it will not be shown again.\"));\n } else {\n formatOutput(data, getOutputOpts(this));\n }\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../../lib/api-client.js\";\nimport { handleError, validateId, CliError } from \"../../lib/errors.js\";\nimport { ensureAdminAuth } from \"../auth.js\";\nimport { formatOutput, getOutputOpts, printSuccess } from \"../../lib/output.js\";\nimport { confirm } from \"./admin-utils.js\";\nimport type { TableColumn } from \"../../types/index.js\";\n\nconst INVITE_COLUMNS: TableColumn[] = [\n { key: \"id\", header: \"ID\", width: 12 },\n { key: \"email\", header: \"Email\", width: 28 },\n { key: \"status\", header: \"Status\", width: 10 },\n { key: \"createdAt\", header: \"Created\", width: 22 },\n];\n\nexport function registerAdminInvitesCommand(admin: Command): void {\n const invites = admin.command(\"invites\").description(\"Admin invite management\");\n\n invites\n .command(\"list\")\n .description(\"List all invites\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const data = await fetchApi<unknown[]>(\"GET\", \"/admin/invites\", {\n adminAuth: true,\n });\n formatOutput(data, getOutputOpts(this), INVITE_COLUMNS);\n } catch (err) {\n handleError(err);\n }\n });\n\n invites\n .command(\"search <query>\")\n .description(\"Search invites by email\")\n .option(\"--limit <n>\", \"Number of results\", \"50\")\n .option(\"--offset <n>\", \"Offset for pagination\", \"0\")\n .action(async function (this: Command, query: string) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const limit = Number(opts.limit);\n const offset = Number(opts.offset);\n if (Number.isNaN(limit) || limit < 1) throw new CliError(\"--limit must be a positive integer\");\n if (Number.isNaN(offset) || offset < 0) throw new CliError(\"--offset must be a non-negative integer\");\n const data = await fetchApi<unknown>(\"GET\", \"/admin/invites\", {\n adminAuth: true,\n params: { search: query, limit: String(limit), offset: String(offset) },\n });\n formatOutput(data, getOutputOpts(this), INVITE_COLUMNS);\n } catch (err) { handleError(err); }\n });\n\n invites\n .command(\"create\")\n .description(\"Create a new invite\")\n .requiredOption(\"--email <email>\", \"Email address to invite\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const { email } = this.opts();\n const data = await fetchApi<unknown>(\"POST\", \"/admin/invites\", {\n adminAuth: true,\n body: { email },\n });\n printSuccess(`Invite sent to ${email}.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n invites\n .command(\"get <id>\")\n .description(\"Get invite details\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"invite ID\");\n const data = await fetchApi<unknown>(\"GET\", `/admin/invites/${id}`, {\n adminAuth: true,\n });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n invites\n .command(\"delete <id>\")\n .description(\"Delete an invite\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"invite ID\");\n\n const ok = await confirm(`Delete invite ${id}?`);\n if (!ok) { console.log(\"Aborted.\"); return; }\n\n const data = await fetchApi<unknown>(\"DELETE\", `/admin/invites/${id}`, {\n adminAuth: true,\n });\n printSuccess(`Invite ${id} deleted.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n invites\n .command(\"resend <id>\")\n .description(\"Resend an invite email\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"invite ID\");\n\n const ok = await confirm(`Resend invite ${id}?`);\n if (!ok) { console.log(\"Aborted.\"); return; }\n\n const data = await fetchApi<unknown>(\"POST\", `/admin/invites/${id}/resend`, {\n adminAuth: true,\n });\n printSuccess(`Invite ${id} resent.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n invites\n .command(\"accept\")\n .description(\"Accept an invite (public endpoint)\")\n .requiredOption(\"--token <token>\", \"Invite token\")\n .option(\"--name <name>\", \"Display name (optional)\")\n .action(async function (this: Command) {\n try {\n const { token, name } = this.opts();\n const body: Record<string, string> = { token };\n if (name) body[\"name\"] = name;\n\n const data = await fetchApi<unknown>(\"POST\", \"/admin/invites/accept\", {\n noAuth: true,\n body,\n });\n printSuccess(\"Invite accepted.\");\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n invites\n .command(\"validate\")\n .description(\"Validate an invite token (public endpoint)\")\n .requiredOption(\"--token <token>\", \"Invite token\")\n .action(async function (this: Command) {\n try {\n const { token } = this.opts();\n const data = await fetchApi<unknown>(\"GET\", \"/admin/invites/validate\", {\n noAuth: true,\n params: { token },\n });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../../lib/api-client.js\";\nimport { handleError, validateId } from \"../../lib/errors.js\";\nimport { ensureAdminAuth } from \"../auth.js\";\nimport { formatOutput, getOutputOpts, printSuccess } from \"../../lib/output.js\";\nimport { confirm } from \"./admin-utils.js\";\n\nexport function registerAdminLicensesCommand(admin: Command): void {\n const licenses = admin.command(\"licenses\").description(\"Admin license management\");\n\n licenses\n .command(\"update-github <licenseId>\")\n .description(\"Change the GitHub username for a single license (admin override)\")\n .requiredOption(\"--username <name>\", \"New GitHub username\")\n .option(\"--skip-revoke\", \"Skip revoking the previous collaborator\", false)\n .action(async function (this: Command, licenseId: string) {\n try {\n ensureAdminAuth();\n validateId(licenseId, \"license ID\");\n const { username, skipRevoke } = this.opts();\n const ok = await confirm(\n `Change GitHub username on license ${licenseId} to \"${username}\"?${skipRevoke ? \" (skip revoke)\" : \"\"}`,\n );\n if (!ok) { console.log(\"Aborted.\"); return; }\n const body: Record<string, unknown> = { githubUsername: username };\n if (skipRevoke) body[\"skipRevoke\"] = true;\n const data = await fetchApi<unknown>(\"PATCH\", `/admin/licenses/${licenseId}/github-username`, {\n adminAuth: true,\n body,\n });\n printSuccess(`License ${licenseId} GitHub username updated to ${username}.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../../lib/api-client.js\";\nimport { handleError, validateId, CliError } from \"../../lib/errors.js\";\nimport { ensureAdminAuth } from \"../auth.js\";\nimport { formatOutput, getOutputOpts, printSuccess } from \"../../lib/output.js\";\nimport { confirm } from \"./admin-utils.js\";\n\nexport function registerAdminAdminsCommand(admin: Command): void {\n const admins = admin.command(\"admins\").description(\"Admin role management\");\n\n admins\n .command(\"list\")\n .description(\"List all admins\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const data = await fetchApi<unknown[]>(\"GET\", \"/admin/admins\", {\n adminAuth: true,\n });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n admins\n .command(\"search <query>\")\n .description(\"Search admins by email or name\")\n .option(\"--limit <n>\", \"Number of results\", \"50\")\n .option(\"--offset <n>\", \"Offset for pagination\", \"0\")\n .action(async function (this: Command, query: string) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const limit = Number(opts.limit);\n const offset = Number(opts.offset);\n if (Number.isNaN(limit) || limit < 1) throw new CliError(\"--limit must be a positive integer\");\n if (Number.isNaN(offset) || offset < 0) throw new CliError(\"--offset must be a non-negative integer\");\n const data = await fetchApi<unknown>(\"GET\", \"/admin/admins\", {\n adminAuth: true,\n params: { search: query, limit: String(limit), offset: String(offset) },\n });\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n admins\n .command(\"get <id>\")\n .description(\"Get admin details\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"admin ID\");\n const data = await fetchApi<unknown>(\"GET\", `/admin/admins/${id}`, {\n adminAuth: true,\n });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n admins\n .command(\"promote <id>\")\n .description(\"Promote a user to admin\")\n .option(\"--grant-all\", \"Grant all permissions\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"user ID\");\n const opts = this.opts();\n\n const ok = await confirm(`Promote user ${id} to admin?`);\n if (!ok) { console.log(\"Aborted.\"); return; }\n\n const data = await fetchApi<unknown>(\"POST\", `/admin/admins/${id}/promote`, {\n adminAuth: true,\n body: { grantAllPermissions: opts.grantAll || false },\n });\n printSuccess(`User ${id} promoted to admin.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n admins\n .command(\"demote <id>\")\n .description(\"Remove admin access from a user\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"admin ID\");\n\n const ok = await confirm(\n `Demote admin ${id}? WARNING: this removes all admin access.`\n );\n if (!ok) { console.log(\"Aborted.\"); return; }\n\n const data = await fetchApi<unknown>(\"DELETE\", `/admin/admins/${id}`, {\n adminAuth: true,\n });\n printSuccess(`Admin ${id} demoted.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n admins\n .command(\"permissions <id>\")\n .description(\"Update admin permissions\")\n .requiredOption(\"--permissions <json>\", \"JSON array of permission strings\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"admin ID\");\n const { permissions: permissionsJson } = this.opts();\n\n let permissions: unknown;\n try {\n permissions = JSON.parse(permissionsJson);\n } catch {\n throw new CliError(\"--permissions must be valid JSON (e.g. '[\\\"read\\\",\\\"write\\\"]')\");\n }\n\n if (!Array.isArray(permissions)) {\n throw new CliError(\"--permissions must be a JSON array\");\n }\n\n const data = await fetchApi<unknown>(\"PATCH\", `/admin/admins/${id}/permissions`, {\n adminAuth: true,\n body: { permissions },\n });\n printSuccess(`Permissions updated for admin ${id}.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../../lib/api-client.js\";\nimport { handleError, validateId, CliError } from \"../../lib/errors.js\";\nimport { ensureAdminAuth } from \"../auth.js\";\nimport { formatOutput, getOutputOpts, printSuccess } from \"../../lib/output.js\";\nimport { confirm } from \"./admin-utils.js\";\nimport type { TableColumn } from \"../../types/index.js\";\n\nconst DISCOUNT_COLUMNS: TableColumn[] = [\n { key: \"id\", header: \"ID\", width: 12 },\n { key: \"code\", header: \"Code\", width: 20 },\n { key: \"type\", header: \"Type\", width: 12 },\n { key: \"amount\", header: \"Amount\", width: 10 },\n { key: \"status\", header: \"Status\", width: 10 },\n { key: \"createdAt\", header: \"Created\", width: 22 },\n];\n\n/** Build a discount body from CLI opts, omitting undefined fields */\nfunction buildDiscountBody(opts: {\n code?: string;\n type?: string;\n amount?: string;\n basisPoints?: string;\n maxRedemptions?: string;\n starts?: string;\n ends?: string;\n}): Record<string, unknown> {\n const body: Record<string, unknown> = {};\n if (opts.code !== undefined) body[\"code\"] = opts.code;\n if (opts.type !== undefined) {\n if (opts.type !== \"percentage\" && opts.type !== \"fixed\") {\n throw new CliError(\"--type must be 'percentage' or 'fixed'\");\n }\n body[\"type\"] = opts.type;\n }\n if (opts.amount !== undefined) {\n const val = Number(opts.amount);\n if (Number.isNaN(val) || val < 0) throw new CliError(\"--amount must be a non-negative number (cents)\");\n body[\"amount\"] = val;\n }\n if (opts.basisPoints !== undefined) {\n const val = Number(opts.basisPoints);\n if (Number.isNaN(val) || val < 0) throw new CliError(\"--basis-points must be a non-negative number\");\n body[\"basisPoints\"] = val;\n }\n if (opts.maxRedemptions !== undefined) {\n const val = Number(opts.maxRedemptions);\n if (Number.isNaN(val) || val < 1) throw new CliError(\"--max-redemptions must be a positive integer\");\n body[\"maxRedemptions\"] = val;\n }\n if (opts.starts !== undefined) body[\"startsAt\"] = opts.starts;\n if (opts.ends !== undefined) body[\"endsAt\"] = opts.ends;\n return body;\n}\n\nexport function registerAdminDiscountsCommand(admin: Command): void {\n const discounts = admin.command(\"discounts\").description(\"Discount management\");\n\n discounts\n .command(\"list\")\n .description(\"List discounts\")\n .option(\"--query <search>\", \"Search query\")\n .option(\"--page <n>\", \"Page number\", \"1\")\n .option(\"--limit <n>\", \"Results per page\", \"50\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const page = Number(opts.page);\n const limit = Number(opts.limit);\n if (Number.isNaN(page) || page < 1) throw new CliError(\"--page must be a positive integer\");\n if (Number.isNaN(limit) || limit < 1) throw new CliError(\"--limit must be a positive integer\");\n\n const params: Record<string, string> = {\n page: String(page),\n limit: String(limit),\n };\n if (opts.query) params[\"search\"] = opts.query;\n\n const data = await fetchApi<unknown[]>(\"GET\", \"/admin/discounts\", {\n adminAuth: true,\n params,\n });\n formatOutput(data, getOutputOpts(this), DISCOUNT_COLUMNS);\n } catch (err) {\n handleError(err);\n }\n });\n\n discounts\n .command(\"search <query>\")\n .description(\"Search discounts by code or description\")\n .option(\"--page <n>\", \"Page number\", \"1\")\n .option(\"--limit <n>\", \"Results per page\", \"50\")\n .action(async function (this: Command, query: string) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const page = Number(opts.page);\n const limit = Number(opts.limit);\n if (Number.isNaN(page) || page < 1) throw new CliError(\"--page must be a positive integer\");\n if (Number.isNaN(limit) || limit < 1) throw new CliError(\"--limit must be a positive integer\");\n const params: Record<string, string> = {\n search: query,\n page: String(page),\n limit: String(limit),\n };\n const data = await fetchApi<unknown[]>(\"GET\", \"/admin/discounts\", { adminAuth: true, params });\n formatOutput(data, getOutputOpts(this), DISCOUNT_COLUMNS);\n } catch (err) { handleError(err); }\n });\n\n discounts\n .command(\"create\")\n .description(\"Create a discount code\")\n .requiredOption(\"--code <code>\", \"Discount code\")\n .requiredOption(\"--type <percentage|fixed>\", \"Discount type\")\n .option(\"--amount <n>\", \"Amount in cents (fixed type)\")\n .option(\"--basis-points <n>\", \"Basis points (percentage type)\")\n .option(\"--max-redemptions <n>\", \"Maximum number of redemptions\")\n .option(\"--starts <date>\", \"Start date (ISO 8601)\")\n .option(\"--ends <date>\", \"End date (ISO 8601)\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const body = buildDiscountBody(this.opts());\n const data = await fetchApi<unknown>(\"POST\", \"/admin/discounts\", {\n adminAuth: true,\n body,\n });\n printSuccess(`Discount \"${body[\"code\"]}\" created.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n discounts\n .command(\"update <id>\")\n .description(\"Update a discount code\")\n .option(\"--code <code>\", \"Discount code\")\n .option(\"--type <percentage|fixed>\", \"Discount type\")\n .option(\"--amount <n>\", \"Amount in cents (fixed type)\")\n .option(\"--basis-points <n>\", \"Basis points (percentage type)\")\n .option(\"--max-redemptions <n>\", \"Maximum number of redemptions\")\n .option(\"--starts <date>\", \"Start date (ISO 8601)\")\n .option(\"--ends <date>\", \"End date (ISO 8601)\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"discount ID\");\n const body = buildDiscountBody(this.opts());\n if (Object.keys(body).length === 0) {\n throw new CliError(\"At least one option must be provided to update.\");\n }\n const data = await fetchApi<unknown>(\"PATCH\", `/admin/discounts/${id}`, {\n adminAuth: true,\n body,\n });\n printSuccess(`Discount ${id} updated.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n discounts\n .command(\"delete <id>\")\n .description(\"Delete a discount code\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"discount ID\");\n\n const ok = await confirm(`Delete discount ${id}?`);\n if (!ok) { console.log(\"Aborted.\"); return; }\n\n const data = await fetchApi<unknown>(\"DELETE\", `/admin/discounts/${id}`, {\n adminAuth: true,\n });\n printSuccess(`Discount ${id} deleted.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n discounts\n .command(\"sync-status\")\n .description(\"Show Polar sync stats for all discounts\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const data = await fetchApi<unknown>(\"GET\", \"/admin/discounts/sync-status\", { adminAuth: true });\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n discounts\n .command(\"export\")\n .description(\"Export discounts as CSV\")\n .option(\"--start <date>\", \"Start date filter (ISO 8601)\")\n .option(\"--end <date>\", \"End date filter (ISO 8601)\")\n .option(\"--status <all|active|expired>\", \"Filter by status\", \"all\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const params: Record<string, string> = { status: opts.status };\n if (opts.start) params[\"startDate\"] = opts.start;\n if (opts.end) params[\"endDate\"] = opts.end;\n\n // api-client returns raw text for non-JSON responses\n const data = await fetchApi<string>(\"GET\", \"/admin/discounts/export\", {\n adminAuth: true,\n params,\n });\n console.log(data);\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../../lib/api-client.js\";\nimport { handleError, validateId, CliError } from \"../../lib/errors.js\";\nimport { ensureAdminAuth } from \"../auth.js\";\nimport { formatOutput, getOutputOpts, printSuccess } from \"../../lib/output.js\";\nimport { confirm } from \"./admin-utils.js\";\nimport type { TableColumn } from \"../../types/index.js\";\n\nconst GROUP_COLUMNS: TableColumn[] = [\n { key: \"id\", header: \"ID\", width: 12 },\n { key: \"name\", header: \"Name\", width: 24 },\n { key: \"prefix\", header: \"Prefix\", width: 12 },\n { key: \"type\", header: \"Type\", width: 12 },\n { key: \"codesGenerated\", header: \"Generated\", width: 10 },\n { key: \"codesUsed\", header: \"Used\", width: 8 },\n { key: \"createdAt\", header: \"Created\", width: 22 },\n];\n\nfunction buildGroupBody(opts: Record<string, string | undefined>): Record<string, unknown> {\n const body: Record<string, unknown> = {};\n if (opts.name !== undefined) body[\"name\"] = opts.name;\n if (opts.prefix !== undefined) body[\"prefix\"] = opts.prefix;\n if (opts.type !== undefined) {\n if (opts.type !== \"percentage\" && opts.type !== \"fixed\") {\n throw new CliError(\"--type must be 'percentage' or 'fixed'\");\n }\n body[\"type\"] = opts.type;\n }\n if (opts.amount !== undefined) {\n const v = Number(opts.amount);\n if (Number.isNaN(v) || v < 0) throw new CliError(\"--amount must be a non-negative number (cents)\");\n body[\"amount\"] = v;\n }\n if (opts.basisPoints !== undefined) {\n const v = Number(opts.basisPoints);\n if (Number.isNaN(v) || v < 0 || v > 10000) throw new CliError(\"--basis-points must be 0..10000\");\n body[\"basisPoints\"] = v;\n }\n if (opts.duration !== undefined) {\n if (![\"once\", \"repeating\", \"forever\"].includes(opts.duration)) {\n throw new CliError(\"--duration must be one of: once, repeating, forever\");\n }\n body[\"duration\"] = opts.duration;\n }\n if (opts.durationInMonths !== undefined) {\n const v = Number(opts.durationInMonths);\n if (Number.isNaN(v) || v < 1 || v > 24) throw new CliError(\"--duration-in-months must be 1..24\");\n body[\"durationInMonths\"] = v;\n }\n if (opts.maxRedemptionsPerCode !== undefined) {\n const v = Number(opts.maxRedemptionsPerCode);\n if (Number.isNaN(v) || v < 1) throw new CliError(\"--max-redemptions-per-code must be a positive integer\");\n body[\"maxRedemptionsPerCode\"] = v;\n }\n if (opts.starts !== undefined) body[\"startsAt\"] = opts.starts;\n if (opts.ends !== undefined) body[\"endsAt\"] = opts.ends;\n return body;\n}\n\nexport function registerAdminDiscountGroupsCommand(admin: Command): void {\n const groups = admin.command(\"discount-groups\").description(\"Discount group management\");\n\n groups\n .command(\"list\")\n .description(\"List discount groups\")\n .option(\"--query <text>\", \"Search by name or prefix\")\n .option(\"--page <n>\", \"Page number\", \"1\")\n .option(\"--limit <n>\", \"Page size\", \"50\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const params: Record<string, string> = { page: String(opts.page), limit: String(opts.limit) };\n if (opts.query) params[\"query\"] = opts.query;\n const data = await fetchApi<{ items: unknown[]; total: number }>(\"GET\", \"/admin/discount-groups\", {\n adminAuth: true,\n params,\n });\n formatOutput(data.items ?? data, getOutputOpts(this), GROUP_COLUMNS);\n } catch (err) { handleError(err); }\n });\n\n groups\n .command(\"get <id>\")\n .description(\"Get a discount group by ID\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"discount group ID\");\n const data = await fetchApi<unknown>(\"GET\", `/admin/discount-groups/${id}`, { adminAuth: true });\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n groups\n .command(\"create\")\n .description(\"Create a discount group template\")\n .requiredOption(\"--name <name>\", \"Group name\")\n .requiredOption(\"--prefix <prefix>\", \"Code prefix (3-20 chars, uppercased)\")\n .requiredOption(\"--type <percentage|fixed>\", \"Discount type\")\n .option(\"--amount <n>\", \"Amount in cents (fixed type)\")\n .option(\"--basis-points <n>\", \"Basis points (percentage type, 0..10000)\")\n .option(\"--duration <once|repeating|forever>\", \"Discount duration\")\n .option(\"--duration-in-months <n>\", \"Months for repeating duration (1..24)\")\n .option(\"--max-redemptions-per-code <n>\", \"Per-code redemption cap\")\n .option(\"--starts <date>\", \"Start date (ISO 8601)\")\n .option(\"--ends <date>\", \"End date (ISO 8601)\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const body = buildGroupBody(this.opts());\n const data = await fetchApi<{ group: { id: string } }>(\"POST\", \"/admin/discount-groups\", {\n adminAuth: true,\n body,\n });\n printSuccess(`Discount group created: ${data?.group?.id ?? \"\"}`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n groups\n .command(\"update <id>\")\n .description(\"Update a discount group (all fields optional)\")\n .option(\"--name <name>\", \"Group name\")\n .option(\"--prefix <prefix>\", \"Code prefix\")\n .option(\"--type <percentage|fixed>\", \"Discount type\")\n .option(\"--amount <n>\", \"Amount in cents\")\n .option(\"--basis-points <n>\", \"Basis points\")\n .option(\"--duration <once|repeating|forever>\", \"Discount duration\")\n .option(\"--duration-in-months <n>\", \"Months for repeating\")\n .option(\"--max-redemptions-per-code <n>\", \"Per-code redemption cap\")\n .option(\"--starts <date>\", \"Start date (ISO 8601)\")\n .option(\"--ends <date>\", \"End date (ISO 8601)\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"discount group ID\");\n const body = buildGroupBody(this.opts());\n if (Object.keys(body).length === 0) {\n throw new CliError(\"At least one option must be provided to update.\");\n }\n const data = await fetchApi<unknown>(\"PATCH\", `/admin/discount-groups/${id}`, {\n adminAuth: true,\n body,\n });\n printSuccess(`Discount group ${id} updated.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n groups\n .command(\"delete <id>\")\n .description(\"Delete a discount group (soft-deletes member codes)\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"discount group ID\");\n const ok = await confirm(`Delete discount group ${id}? This soft-deletes all member codes.`);\n if (!ok) { console.log(\"Aborted.\"); return; }\n const data = await fetchApi<unknown>(\"DELETE\", `/admin/discount-groups/${id}`, { adminAuth: true });\n printSuccess(`Discount group ${id} deleted.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../../lib/api-client.js\";\nimport { handleError } from \"../../lib/errors.js\";\nimport { ensureAdminAuth } from \"../auth.js\";\nimport { formatOutput, getOutputOpts } from \"../../lib/output.js\";\nimport type { TableColumn } from \"../../types/index.js\";\n\nconst TIER_COLUMNS: TableColumn[] = [\n { key: \"id\", header: \"ID\", width: 12 },\n { key: \"name\", header: \"Name\", width: 16 },\n { key: \"displayName\", header: \"Display Name\", width: 20 },\n { key: \"commissionRate\", header: \"Commission\", width: 10 },\n { key: \"badgeColor\", header: \"Badge Color\", width: 12 },\n];\n\nexport function registerAdminTiersCommand(admin: Command): void {\n const tiers = admin.command(\"tiers\").description(\"Tier management\");\n\n tiers\n .command(\"list\")\n .description(\"List manual referral tiers\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const data = await fetchApi<unknown[]>(\"GET\", \"/admin/tiers/manual\", {\n adminAuth: true,\n });\n formatOutput(data, getOutputOpts(this), TIER_COLUMNS);\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { registerAdminOrdersCommand } from \"./admin-orders.js\";\nimport { registerAdminUsersCommand } from \"./admin-users.js\";\nimport { registerAdminReferralsCommand } from \"./admin-referrals.js\";\nimport { registerAdminRevenueCommand } from \"./admin-revenue.js\";\nimport { registerAdminPayoutsCommand } from \"./admin-payouts.js\";\nimport { registerAdminLoyaltyCommand } from \"./admin-loyalty.js\";\nimport { registerAdminBlogCommand } from \"./admin-blog.js\";\nimport { registerAdminKeysCommand } from \"./admin-keys.js\";\nimport { registerAdminInvitesCommand } from \"./admin-invites.js\";\nimport { registerAdminLicensesCommand } from \"./admin-licenses.js\";\nimport { registerAdminAdminsCommand } from \"./admin-admins.js\";\nimport { registerAdminDiscountsCommand } from \"./admin-discounts.js\";\nimport { registerAdminDiscountGroupsCommand } from \"./admin-discount-groups.js\";\nimport { registerAdminTiersCommand } from \"./admin-tiers.js\";\n\nexport function registerAdminCommand(program: Command): void {\n const admin = program\n .command(\"admin\")\n .description(\"Admin operations (requires admin API key)\");\n\n registerAdminOrdersCommand(admin);\n registerAdminUsersCommand(admin);\n registerAdminReferralsCommand(admin);\n registerAdminRevenueCommand(admin);\n registerAdminPayoutsCommand(admin);\n registerAdminLoyaltyCommand(admin);\n registerAdminBlogCommand(admin);\n registerAdminKeysCommand(admin);\n registerAdminInvitesCommand(admin);\n registerAdminLicensesCommand(admin);\n registerAdminAdminsCommand(admin);\n registerAdminDiscountsCommand(admin);\n registerAdminDiscountGroupsCommand(admin);\n registerAdminTiersCommand(admin);\n}\n"],"mappings":"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","names":["chalk","path","chalk","chalk","program","program","readFileSync","PROXY_BASE","program","readFileSync","PROXY_BASE","program","program","program","program","chalk","program","chalk","readline","program","program","readline","program","program","program","readline","program","program","readline","program","program","program","program","readline","ORDER_COLUMNS","PAYOUT_COLUMNS","readline","confirm","readFileSync","readFileSync","chalk","chalk","program"]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/env-resolver.ts","../src/index.ts","../src/lib/errors.ts","../src/commands/auth.ts","../src/lib/config.ts","../src/lib/api-client.ts","../src/lib/output.ts","../src/commands/youtube.ts","../src/commands/web.ts","../src/commands/seo.ts","../src/commands/orders.ts","../src/commands/referrals.ts","../src/commands/blog.ts","../src/commands/health.ts","../src/commands/account.ts","../src/commands/checkout.ts","../src/commands/github.ts","../src/commands/loyalty.ts","../src/commands/newsletter.ts","../src/commands/payout.ts","../src/commands/pricing.ts","../src/commands/refunds.ts","../src/commands/releases.ts","../src/commands/stats.ts","../src/commands/waitlist.ts","../src/commands/admin/admin-orders.ts","../src/commands/admin/admin-utils.ts","../src/commands/admin/admin-users.ts","../src/commands/admin/admin-referrals.ts","../src/commands/admin/admin-revenue.ts","../src/commands/admin/admin-payouts.ts","../src/commands/admin/admin-loyalty.ts","../src/commands/admin/admin-blog.ts","../src/commands/admin/admin-blog-categories.ts","../src/commands/admin/admin-blog-tags.ts","../src/commands/admin/admin-keys.ts","../src/commands/admin/admin-invites.ts","../src/commands/admin/admin-licenses.ts","../src/commands/admin/admin-admins.ts","../src/commands/admin/admin-discounts.ts","../src/commands/admin/admin-discount-groups.ts","../src/commands/admin/admin-tiers.ts","../src/commands/admin/index.ts"],"sourcesContent":["import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nexport const ENV_USER_KEY = \"CKWEB_API_KEY\";\nexport const ENV_ADMIN_KEY = \"CKWEB_ADMIN_API_KEY\";\nexport const ENV_BASE_URL = \"CKWEB_API_URL\";\n\n// Parsed .env.* values (populated by loadDotenvFiles()). Intentionally NOT written\n// into process.env — that way `process.env` keeps representing the OS-level tier\n// only, and the priority chain (OS > config > dotenv) stays observable.\nconst DOTENV_VALUES: Record<string, string> = {};\n\n// Standard precedence (first wins): .env.local overrides .env\nconst DOTENV_FILES = [\".env.local\", \".env\"];\n\n/** Minimal dotenv parser: KEY=VALUE, supports single/double quotes and # comments. */\nfunction parseDotenv(src: string): Record<string, string> {\n const out: Record<string, string> = {};\n for (const rawLine of src.split(/\\r?\\n/)) {\n const line = rawLine.trim();\n if (!line || line.startsWith(\"#\")) continue;\n const eq = line.indexOf(\"=\");\n if (eq <= 0) continue;\n const key = line.slice(0, eq).trim();\n let value = line.slice(eq + 1).trim();\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n } else {\n // strip inline comment for unquoted values\n const hash = value.indexOf(\" #\");\n if (hash >= 0) value = value.slice(0, hash).trim();\n }\n if (key) out[key] = value;\n }\n return out;\n}\n\n/** Load .env.* files from cwd (idempotent-ish — later calls re-read). */\nexport function loadDotenvFiles(cwd: string = process.cwd()): void {\n for (const file of DOTENV_FILES) {\n const full = path.join(cwd, file);\n if (!fs.existsSync(full)) continue;\n try {\n const parsed = parseDotenv(fs.readFileSync(full, \"utf8\"));\n for (const [k, v] of Object.entries(parsed)) {\n if (!(k in DOTENV_VALUES)) DOTENV_VALUES[k] = v;\n }\n } catch {\n // ignore unreadable .env files\n }\n }\n}\n\n/** Resolve env var with priority: OS-level > .env.* */\nexport function resolveEnv(name: string): string | undefined {\n return resolveOsEnv(name) ?? resolveDotenv(name);\n}\n\n/** OS-level only — reads `process.env` live (never contains dotenv values). */\nexport function resolveOsEnv(name: string): string | undefined {\n const v = process.env[name];\n return v !== undefined && v !== \"\" ? v : undefined;\n}\n\n/** Dotenv-file only — fallback tier. */\nexport function resolveDotenv(name: string): string | undefined {\n const v = DOTENV_VALUES[name];\n return v !== undefined && v !== \"\" ? v : undefined;\n}\n\n/** Test helper: clear parsed dotenv values. */\nexport function __resetDotenvForTests(): void {\n for (const k of Object.keys(DOTENV_VALUES)) delete DOTENV_VALUES[k];\n}\n","// Import env-resolver first so OS_ENV is snapshotted before anything else can\n// mutate process.env. Then load .env.* files into the fallback layer.\nimport { loadDotenvFiles } from \"./lib/env-resolver.js\";\nloadDotenvFiles();\n\nimport { Command } from \"commander\";\nimport { handleError } from \"./lib/errors.js\";\nimport { registerAuthCommand } from \"./commands/auth.js\";\nimport { registerYoutubeCommand } from \"./commands/youtube.js\";\nimport { registerWebCommand } from \"./commands/web.js\";\nimport { registerSeoCommand } from \"./commands/seo.js\";\nimport { registerOrdersCommand } from \"./commands/orders.js\";\nimport { registerReferralsCommand } from \"./commands/referrals.js\";\nimport { registerBlogCommand } from \"./commands/blog.js\";\nimport { registerHealthCommand } from \"./commands/health.js\";\nimport { registerAccountCommand } from \"./commands/account.js\";\nimport { registerCheckoutCommand } from \"./commands/checkout.js\";\nimport { registerGithubCommand } from \"./commands/github.js\";\nimport { registerLoyaltyCommand } from \"./commands/loyalty.js\";\nimport { registerNewsletterCommand } from \"./commands/newsletter.js\";\nimport { registerPayoutCommand } from \"./commands/payout.js\";\nimport { registerPricingCommand } from \"./commands/pricing.js\";\nimport { registerRefundsCommand } from \"./commands/refunds.js\";\nimport { registerReleasesCommand } from \"./commands/releases.js\";\nimport { registerStatsCommand } from \"./commands/stats.js\";\nimport { registerWaitlistCommand } from \"./commands/waitlist.js\";\nimport { registerAdminCommand } from \"./commands/admin/index.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"ckweb\")\n .description(\"CLI for interacting with ClaudeKit.cc API\")\n .version(__PKG_VERSION__);\n\n// Global output options\nprogram\n .option(\"--json\", \"Output as JSON\")\n .option(\"--table\", \"Output as table\")\n .option(\"--quiet\", \"Minimal output\");\n\n// Register all command groups\nregisterAuthCommand(program);\nregisterHealthCommand(program);\n\n// User commands\nregisterOrdersCommand(program);\nregisterReferralsCommand(program);\nregisterBlogCommand(program);\nregisterAccountCommand(program);\nregisterCheckoutCommand(program);\nregisterGithubCommand(program);\nregisterLoyaltyCommand(program);\nregisterNewsletterCommand(program);\nregisterPayoutCommand(program);\nregisterPricingCommand(program);\nregisterRefundsCommand(program);\nregisterReleasesCommand(program);\nregisterStatsCommand(program);\nregisterWaitlistCommand(program);\n\n// Proxy services (YouTube, Web, SEO)\nregisterYoutubeCommand(program);\nregisterWebCommand(program);\nregisterSeoCommand(program);\n\n// Admin commands\nregisterAdminCommand(program);\n\n// Print help if no command given\nprogram.addHelpCommand(true);\n\n// Parse and execute\ntry {\n await program.parseAsync(process.argv);\n} catch (err) {\n handleError(err);\n}\n","import chalk from \"chalk\";\n\n/** Base CLI error with exit code */\nexport class CliError extends Error {\n constructor(\n message: string,\n public exitCode: number = 1\n ) {\n super(message);\n this.name = \"CliError\";\n }\n}\n\n/** Authentication error — missing or invalid API key */\nexport class AuthError extends CliError {\n constructor(message: string = \"Authentication required. Run: ckweb auth login\") {\n super(message, 1);\n this.name = \"AuthError\";\n }\n}\n\n/** API response error — non-2xx HTTP status */\nexport class ApiError extends CliError {\n constructor(\n message: string,\n public statusCode: number,\n public code?: string\n ) {\n super(message, 1);\n this.name = \"ApiError\";\n }\n}\n\n/** Network error — connection failure, timeout */\nexport class NetworkError extends CliError {\n constructor(message: string = \"Network error. Check your connection.\") {\n super(message, 1);\n this.name = \"NetworkError\";\n }\n}\n\n/** Validate path parameter IDs to prevent path injection */\nexport function validateId(id: string, label = \"ID\"): void {\n if (!/^[\\w-]+$/.test(id)) {\n throw new CliError(`Invalid ${label}: \"${id}\"`);\n }\n}\n\n/** Handle error and exit with appropriate code */\nexport function handleError(err: unknown): never {\n if (err instanceof AuthError) {\n console.error(chalk.yellow(`Auth: ${err.message}`));\n process.exit(err.exitCode);\n }\n\n if (err instanceof ApiError) {\n console.error(chalk.red(`API Error (${err.statusCode}): ${err.message}`));\n if (err.code) console.error(chalk.dim(`Code: ${err.code}`));\n process.exit(err.exitCode);\n }\n\n if (err instanceof NetworkError) {\n console.error(chalk.red(`Network: ${err.message}`));\n process.exit(err.exitCode);\n }\n\n if (err instanceof CliError) {\n console.error(chalk.red(err.message));\n process.exit(err.exitCode);\n }\n\n // Unknown error\n const message = err instanceof Error ? err.message : String(err);\n console.error(chalk.red(`Error: ${message}`));\n process.exit(1);\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport * as readline from \"node:readline/promises\";\nimport { fetchApi } from \"../lib/api-client.js\";\nimport {\n getApiKey, setApiKey, clearApiKey,\n getAdminApiKey, setAdminApiKey, clearAdminApiKey,\n maskApiKey, getConfigPath,\n} from \"../lib/config.js\";\nimport { handleError, AuthError } from \"../lib/errors.js\";\nimport { printSuccess, printInfo, printWarn } from \"../lib/output.js\";\nimport {\n ENV_USER_KEY,\n ENV_ADMIN_KEY,\n resolveOsEnv,\n resolveDotenv,\n} from \"../lib/env-resolver.js\";\nimport type { ApiKeyValidation } from \"../types/index.js\";\n\n/** Ensure an API key is available (user or admin fallback); throw AuthError if not */\nexport function ensureAuth(): string {\n const key = getApiKey() ?? getAdminApiKey();\n if (!key) throw new AuthError();\n return key;\n}\n\n/** Ensure admin API key is stored; throw AuthError if not */\nexport function ensureAdminAuth(): string {\n const key = getAdminApiKey();\n if (!key) throw new AuthError(\"Admin authentication required. Run: ckweb auth login --admin\");\n return key;\n}\n\nasync function promptApiKey(isAdmin: boolean): Promise<string> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n try {\n const label = isAdmin ? \"admin API key\" : \"API key\";\n return (await rl.question(chalk.cyan(`Enter your ${label} (ck_live_...): `))).trim();\n } finally {\n rl.close();\n }\n}\n\nexport function registerAuthCommand(program: Command): void {\n const auth = program.command(\"auth\").description(\"Manage authentication\");\n\n auth\n .command(\"login\")\n .description(\"Authenticate with your ClaudeKit API key\")\n .option(\"--admin\", \"Login with admin API key\")\n .action(async function (this: Command) {\n try {\n const isAdmin = this.opts().admin === true;\n const envName = isAdmin ? ENV_ADMIN_KEY : ENV_USER_KEY;\n const envKey = resolveOsEnv(envName) ?? resolveDotenv(envName);\n\n // If a valid key is already resolvable from env, skip prompt + storage.\n if (envKey) {\n printInfo(`Found ${envName} in environment — skipping prompt.`);\n printInfo(\"Validating...\");\n try {\n const result = await fetchApi<ApiKeyValidation>(\"POST\", \"/keys/validate\", {\n adminAuth: isAdmin,\n });\n if (result.valid) {\n printSuccess(`Authenticated via env var. Key: ${maskApiKey(envKey)}`);\n printInfo(`Source: ${envName} (no config file written)`);\n } else {\n printWarn(result.error || \"Env-provided key is invalid.\");\n }\n } catch {\n throw new AuthError(\"Env-provided key failed validation.\");\n }\n return;\n }\n\n const key = await promptApiKey(isAdmin);\n\n if (!key) {\n printWarn(\"No API key provided.\");\n return;\n }\n\n printInfo(\"Validating API key...\");\n\n try {\n if (isAdmin) {\n setAdminApiKey(key);\n } else {\n setApiKey(key);\n }\n } catch {\n printWarn(\"Invalid key format. Expected: ck_live_<32+ base64url chars>\");\n return;\n }\n\n try {\n const result = await fetchApi<ApiKeyValidation>(\"POST\", \"/keys/validate\", {\n adminAuth: isAdmin,\n });\n\n if (result.valid) {\n printSuccess(`Authenticated! Key: ${maskApiKey(key)}`);\n printInfo(`Config saved to: ${getConfigPath()}`);\n } else {\n if (isAdmin) clearAdminApiKey(); else clearApiKey();\n printWarn(result.error || \"Invalid API key.\");\n }\n } catch {\n if (isAdmin) clearAdminApiKey(); else clearApiKey();\n throw new AuthError(\"API key validation failed. Check your key and try again.\");\n }\n } catch (err) {\n handleError(err);\n }\n });\n\n auth\n .command(\"validate\")\n .description(\"Validate API key (resolves from env var, stored config, or .env)\")\n .option(\"--admin\", \"Validate admin API key\")\n .action(async function (this: Command) {\n try {\n const isAdmin = this.opts().admin === true;\n const key = isAdmin ? ensureAdminAuth() : ensureAuth();\n printInfo(`Validating ${isAdmin ? \"admin \" : \"\"}key: ${maskApiKey(key)}`);\n\n const result = await fetchApi<ApiKeyValidation>(\"POST\", \"/keys/validate\", {\n adminAuth: isAdmin,\n });\n\n if (result.valid) {\n printSuccess(\"API key is valid.\");\n if (result.userId) console.log(chalk.dim(`User ID: ${result.userId}`));\n if (result.rateLimit) console.log(chalk.dim(`Rate limit: ${result.rateLimit} req/hour`));\n } else {\n printWarn(result.error || \"API key is invalid or expired.\");\n }\n } catch (err) {\n handleError(err);\n }\n });\n\n auth\n .command(\"logout\")\n .description(\"Remove stored API key\")\n .option(\"--admin\", \"Remove admin API key\")\n .option(\"--all\", \"Remove all stored keys\")\n .action(function (this: Command) {\n try {\n const opts = this.opts();\n\n if (opts.all) {\n clearApiKey();\n clearAdminApiKey();\n printSuccess(\"All API keys removed.\");\n return;\n }\n\n if (opts.admin) {\n if (!getAdminApiKey()) { printInfo(\"No admin API key stored.\"); return; }\n clearAdminApiKey();\n printSuccess(\"Admin API key removed.\");\n } else {\n if (!getApiKey()) { printInfo(\"No API key stored.\"); return; }\n clearApiKey();\n printSuccess(\"API key removed.\");\n }\n } catch (err) {\n handleError(err);\n }\n });\n\n auth\n .command(\"status\")\n .description(\"Show authentication status\")\n .action(() => {\n try {\n const userKey = getApiKey();\n const adminKey = getAdminApiKey();\n\n const userSource = resolveOsEnv(ENV_USER_KEY)\n ? `env:${ENV_USER_KEY}`\n : resolveDotenv(ENV_USER_KEY)\n ? `.env`\n : userKey\n ? \"config\"\n : null;\n const adminSource = resolveOsEnv(ENV_ADMIN_KEY)\n ? `env:${ENV_ADMIN_KEY}`\n : resolveDotenv(ENV_ADMIN_KEY)\n ? `.env`\n : adminKey\n ? \"config\"\n : null;\n\n console.log(chalk.bold(\"Authentication Status\"));\n console.log(\n ` User key: ${userKey ? chalk.green(maskApiKey(userKey)) : chalk.dim(\"not set\")}` +\n (userSource ? chalk.dim(` (from ${userSource})`) : \"\"),\n );\n console.log(\n ` Admin key: ${adminKey ? chalk.green(maskApiKey(adminKey)) : chalk.dim(\"not set\")}` +\n (adminSource ? chalk.dim(` (from ${adminSource})`) : \"\"),\n );\n console.log(chalk.dim(` Config: ${getConfigPath()}`));\n console.log(chalk.dim(` Resolution: OS env > stored config > .env.*`));\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import Conf from \"conf\";\nimport type { ConfigSchema } from \"../types/index.js\";\nimport {\n ENV_USER_KEY,\n ENV_ADMIN_KEY,\n ENV_BASE_URL,\n resolveOsEnv,\n resolveDotenv,\n} from \"./env-resolver.js\";\n\nconst DEFAULT_BASE_URL = \"https://claudekit.cc/api\";\n// Server issues both user and admin keys as `ck_live_<base64url 32+ chars>`.\n// Base64url allows `-` and `_` in addition to alphanumerics.\n// The user/admin distinction is a CLI storage slot, not a format difference.\nconst USER_KEY_PATTERN = /^ck_live_[a-zA-Z0-9_-]{32,}$/;\nconst ADMIN_KEY_PATTERN = /^ck_live_[a-zA-Z0-9_-]{32,}$/;\n\n/** Resolve key with priority: OS env > stored config > .env.* */\nfunction resolveKey(\n envName: string,\n pattern: RegExp,\n stored: () => string | undefined,\n): string | undefined {\n const os = resolveOsEnv(envName);\n if (os && pattern.test(os)) return os;\n const cfg = stored();\n if (cfg) return cfg;\n const dot = resolveDotenv(envName);\n if (dot && pattern.test(dot)) return dot;\n return undefined;\n}\n\nconst config = new Conf<ConfigSchema>({\n projectName: \"ckweb-cli\",\n schema: {\n apiKey: { type: \"string\" },\n adminApiKey: { type: \"string\" },\n baseUrl: { type: \"string\" },\n },\n});\n\n// --- User API Key ---\n\nexport function getApiKey(): string | undefined {\n return resolveKey(ENV_USER_KEY, USER_KEY_PATTERN, () => config.get(\"apiKey\"));\n}\n\nexport function setApiKey(key: string): void {\n if (!USER_KEY_PATTERN.test(key)) {\n throw new Error(\"Invalid API key format. Expected: ck_live_<32+ base64url chars>\");\n }\n config.set(\"apiKey\", key);\n}\n\nexport function clearApiKey(): void {\n config.delete(\"apiKey\");\n}\n\n// --- Admin API Key ---\n\nexport function getAdminApiKey(): string | undefined {\n return resolveKey(ENV_ADMIN_KEY, ADMIN_KEY_PATTERN, () => config.get(\"adminApiKey\"));\n}\n\nexport function setAdminApiKey(key: string): void {\n if (!ADMIN_KEY_PATTERN.test(key)) {\n throw new Error(\"Invalid admin API key format. Expected: ck_live_<32+ base64url chars>\");\n }\n config.set(\"adminApiKey\", key);\n}\n\nexport function clearAdminApiKey(): void {\n config.delete(\"adminApiKey\");\n}\n\n// --- Base URL ---\n\nexport function getBaseUrl(): string {\n return (\n resolveOsEnv(ENV_BASE_URL) ||\n config.get(\"baseUrl\") ||\n resolveDotenv(ENV_BASE_URL) ||\n DEFAULT_BASE_URL\n );\n}\n\nexport function setBaseUrl(url: string): void {\n config.set(\"baseUrl\", url);\n}\n\n// --- Utilities ---\n\nexport function maskApiKey(key: string): string {\n if (key.length < 12) return \"****\";\n return `${key.slice(0, 8)}****${key.slice(-4)}`;\n}\n\nexport function getConfigPath(): string {\n return config.path;\n}\n","import { getApiKey, getAdminApiKey, getBaseUrl } from \"./config.js\";\nimport { AuthError, ApiError, NetworkError } from \"./errors.js\";\n\nconst DEFAULT_TIMEOUT = 30_000;\ntype HttpMethod = \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n\n/**\n * Routes added in the current CLI release that may not yet be deployed on the\n * server side. A 404 on one of these surfaces a helpful \"endpoint not yet\n * deployed\" message instead of the generic ApiError.\n */\nconst RECENT_ROUTES: Array<RegExp> = [\n /^\\/admin\\/orders\\/stats$/,\n /^\\/admin\\/users\\/stats$/,\n /^\\/admin\\/discount-groups(\\/|$)/,\n /^\\/admin\\/discounts\\/sync-status$/,\n];\n\nfunction isRecentRoute(path: string): boolean {\n const normalized = path.startsWith(\"/\") ? path : `/${path}`;\n return RECENT_ROUTES.some((re) => re.test(normalized));\n}\n\ninterface FetchOptions {\n body?: unknown;\n params?: Record<string, string>;\n timeout?: number;\n /** Skip API key auth (for public endpoints) */\n noAuth?: boolean;\n /** Use admin API key instead of user key */\n adminAuth?: boolean;\n}\n\nexport interface BinaryApiResponse {\n bytes: Uint8Array;\n headers: Headers;\n}\n\nfunction resolveApiKey(noAuth: boolean, adminAuth: boolean): string | undefined {\n let apiKey: string | undefined;\n if (!noAuth) {\n if (adminAuth) {\n apiKey = getAdminApiKey();\n if (!apiKey) {\n throw new AuthError(\"Admin authentication required. Run: ckweb auth login --admin\");\n }\n } else {\n apiKey = getApiKey() ?? getAdminApiKey();\n if (!apiKey) {\n throw new AuthError();\n }\n }\n }\n return apiKey;\n}\n\nfunction buildUrl(path: string, params?: Record<string, string>): URL {\n const baseUrl = getBaseUrl().replace(/\\/?$/, \"/\");\n const url = new URL(path.replace(/^\\//, \"\"), baseUrl);\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n url.searchParams.set(key, value);\n }\n }\n return url;\n}\n\nfunction buildHeaders(apiKey: string | undefined, hasBody: boolean): Record<string, string> {\n const headers: Record<string, string> = {\n \"User-Agent\": `ckweb-cli/${__PKG_VERSION__}`,\n };\n if (hasBody) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n if (apiKey) {\n headers[\"x-api-key\"] = apiKey;\n }\n return headers;\n}\n\nasync function parseResponseBody(response: Response): Promise<unknown> {\n const contentType = response.headers.get(\"content-type\") || \"\";\n if (contentType.includes(\"application/json\")) {\n return response.json();\n }\n return response.text();\n}\n\nfunction throwResponseError(response: Response, path: string, data: unknown): never {\n const errorBody = data && typeof data === \"object\" ? data as Record<string, unknown> : {};\n const message =\n (errorBody.error as string) ||\n (errorBody.message as string) ||\n (typeof data === \"string\" && data.trim() ? data : `HTTP ${response.status}`);\n const code = errorBody.code as string | undefined;\n\n if (response.status === 401 || response.status === 403) {\n throw new AuthError(message);\n }\n if (response.status === 404 && isRecentRoute(path)) {\n throw new ApiError(\n `${message} — this command may require a newer claudekit-web release; the endpoint ${path} is not yet deployed.`,\n response.status,\n code,\n );\n }\n throw new ApiError(message, response.status, code);\n}\n\nfunction createTimeout(timeout: number): { controller: AbortController; timer: ReturnType<typeof setTimeout> } {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeout);\n return { controller, timer };\n}\n\nfunction normalizeRequestError(err: unknown, timeout: number): never {\n if (err instanceof AuthError || err instanceof ApiError) {\n throw err;\n }\n\n if (err instanceof DOMException && err.name === \"AbortError\") {\n throw new NetworkError(`Request timed out after ${timeout / 1000}s`);\n }\n\n if (err instanceof TypeError) {\n throw new NetworkError();\n }\n\n throw err;\n}\n\n/** Core API request function with auto-injected auth */\nexport async function fetchApi<T>(\n method: HttpMethod,\n path: string,\n options: FetchOptions = {}\n): Promise<T> {\n const { body, params, timeout = DEFAULT_TIMEOUT, noAuth = false, adminAuth = false } = options;\n const apiKey = resolveApiKey(noAuth, adminAuth);\n const url = buildUrl(path, params);\n const headers = buildHeaders(apiKey, body !== undefined);\n const { controller, timer } = createTimeout(timeout);\n\n try {\n const response = await fetch(url.toString(), {\n method,\n headers,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timer);\n\n const data = await parseResponseBody(response);\n\n if (!response.ok) {\n throwResponseError(response, path, data);\n }\n\n return data as T;\n } catch (err) {\n clearTimeout(timer);\n normalizeRequestError(err, timeout);\n }\n}\n\n/** Binary API request function for downloads such as PDF exports. */\nexport async function fetchApiBinary(\n method: HttpMethod,\n path: string,\n options: FetchOptions = {}\n): Promise<BinaryApiResponse> {\n const { body, params, timeout = DEFAULT_TIMEOUT, noAuth = false, adminAuth = false } = options;\n const apiKey = resolveApiKey(noAuth, adminAuth);\n const url = buildUrl(path, params);\n const headers = buildHeaders(apiKey, body !== undefined);\n const { controller, timer } = createTimeout(timeout);\n\n try {\n const response = await fetch(url.toString(), {\n method,\n headers,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timer);\n\n if (!response.ok) {\n const data = await parseResponseBody(response);\n throwResponseError(response, path, data);\n }\n\n return {\n bytes: new Uint8Array(await response.arrayBuffer()),\n headers: response.headers,\n };\n } catch (err) {\n clearTimeout(timer);\n normalizeRequestError(err, timeout);\n }\n}\n","import type { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport type { OutputOptions, TableColumn } from \"../types/index.js\";\n\n/** Extract output option flags from Commander command */\nexport function getOutputOpts(cmd: Command): OutputOptions {\n const opts = cmd.optsWithGlobals();\n return { json: opts.json, table: opts.table, quiet: opts.quiet };\n}\n\n/** Print data according to output mode flags */\nexport function formatOutput(\n data: unknown,\n options: OutputOptions,\n tableColumns?: TableColumn[]\n): void {\n if (options.quiet) {\n printQuiet(data);\n return;\n }\n\n if (options.json) {\n printJson(data);\n return;\n }\n\n // --table flag or auto-detect: table for arrays with columns\n if (Array.isArray(data) && tableColumns) {\n printTable(data, tableColumns);\n return;\n }\n\n // --table flag with object data: render as key-value table\n if (options.table && data && typeof data === \"object\" && !Array.isArray(data)) {\n const obj = data as Record<string, unknown>;\n const rows = Object.entries(obj).map(([key, value]) => ({\n key,\n value: typeof value === \"object\" ? JSON.stringify(value) : String(value ?? \"—\"),\n }));\n printTable(rows, [\n { key: \"key\", header: \"Field\", width: 20 },\n { key: \"value\", header: \"Value\", width: 50 },\n ]);\n return;\n }\n\n printJson(data);\n}\n\n/** Pretty-print JSON to stdout */\nexport function printJson(data: unknown): void {\n console.log(JSON.stringify(data, null, 2));\n}\n\n/** Print array data as aligned table */\nexport function printTable(\n rows: Record<string, unknown>[],\n columns: TableColumn[]\n): void {\n if (rows.length === 0) {\n console.log(chalk.dim(\"No results.\"));\n return;\n }\n\n // Calculate column widths\n const widths = columns.map((col) => {\n const headerLen = col.header.length;\n const maxDataLen = rows.reduce((max, row) => {\n const val = String(row[col.key] ?? \"\");\n return Math.max(max, val.length);\n }, 0);\n return col.width || Math.min(Math.max(headerLen, maxDataLen) + 2, 50);\n });\n\n // Print header\n const headerLine = columns\n .map((col, i) => col.header.padEnd(widths[i]))\n .join(\" \");\n console.log(chalk.bold(headerLine));\n console.log(chalk.dim(\"─\".repeat(headerLine.length)));\n\n // Print rows\n for (const row of rows) {\n const line = columns\n .map((col, i) => {\n const val = String(row[col.key] ?? \"—\");\n return val.length > widths[i]\n ? val.slice(0, widths[i] - 1) + \"…\"\n : val.padEnd(widths[i]);\n })\n .join(\" \");\n console.log(line);\n }\n\n console.log(chalk.dim(`\\n${rows.length} result(s)`));\n}\n\n/** Print minimal output — first meaningful value */\nexport function printQuiet(data: unknown): void {\n if (data === null || data === undefined) return;\n\n if (typeof data === \"string\" || typeof data === \"number\" || typeof data === \"boolean\") {\n console.log(String(data));\n return;\n }\n\n if (Array.isArray(data)) {\n console.log(String(data.length));\n return;\n }\n\n if (typeof data === \"object\") {\n // Print first key's value\n const obj = data as Record<string, unknown>;\n const firstKey = Object.keys(obj)[0];\n if (firstKey) {\n console.log(String(obj[firstKey]));\n }\n }\n}\n\n/** Print a success message */\nexport function printSuccess(message: string): void {\n console.log(chalk.green(`✓ ${message}`));\n}\n\n/** Print an info message */\nexport function printInfo(message: string): void {\n console.log(chalk.blue(`ℹ ${message}`));\n}\n\n/** Print a warning message */\nexport function printWarn(message: string): void {\n console.log(chalk.yellow(`⚠ ${message}`));\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../lib/api-client.js\";\nimport { handleError } from \"../lib/errors.js\";\nimport { ensureAuth } from \"./auth.js\";\nimport { formatOutput, getOutputOpts } from \"../lib/output.js\";\nimport type { TableColumn } from \"../types/index.js\";\n\nconst PROXY_BASE = \"/proxy/vidcap/v1/youtube\";\n\nconst SEARCH_COLUMNS: TableColumn[] = [\n { key: \"title\", header: \"Title\", width: 40 },\n { key: \"channel\", header: \"Channel\", width: 20 },\n { key: \"videoId\", header: \"Video ID\", width: 14 },\n];\n\nconst COMMENT_COLUMNS: TableColumn[] = [\n { key: \"author\", header: \"Author\", width: 20 },\n { key: \"text\", header: \"Comment\", width: 50 },\n { key: \"likes\", header: \"Likes\", width: 8 },\n];\n\n/** Helper: GET request to VidCap YouTube proxy */\nasync function youtubeGet<T>(endpoint: string, params: Record<string, string>): Promise<T> {\n return fetchApi<T>(\"GET\", `${PROXY_BASE}/${endpoint}`, { params });\n}\n\n\nexport function registerYoutubeCommand(program: Command): void {\n const yt = program.command(\"youtube\").alias(\"yt\").description(\"YouTube video tools (via VidCap)\");\n\n yt.command(\"info\")\n .argument(\"<url>\", \"YouTube video URL\")\n .description(\"Get video metadata\")\n .action(async function (this: Command, url: string) {\n try {\n ensureAuth();\n const data = await youtubeGet(\"info\", { url });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n yt.command(\"caption\")\n .argument(\"<url>\", \"YouTube video URL\")\n .description(\"Get video transcript/captions\")\n .option(\"-l, --locale <locale>\", \"Caption language\", \"en\")\n .option(\"-f, --format <format>\", \"Output format (json3/vtt/srt)\", \"vtt\")\n .action(async function (this: Command, url: string) {\n try {\n ensureAuth();\n const opts = this.opts();\n const data = await youtubeGet(\"caption\", {\n url,\n locale: opts.locale,\n ext: opts.format,\n });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n yt.command(\"summary\")\n .argument(\"<url>\", \"YouTube video URL\")\n .description(\"Get AI-generated video summary\")\n .option(\"-l, --locale <locale>\", \"Summary language\", \"en\")\n .action(async function (this: Command, url: string) {\n try {\n ensureAuth();\n const opts = this.opts();\n const data = await youtubeGet(\"summary\", { url, locale: opts.locale });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n yt.command(\"screenshot\")\n .argument(\"<url>\", \"YouTube video URL\")\n .description(\"Get video screenshot at timestamp\")\n .option(\"-t, --time <seconds>\", \"Timestamp in seconds\", \"0\")\n .action(async function (this: Command, url: string) {\n try {\n ensureAuth();\n const opts = this.opts();\n const data = await youtubeGet(\"screenshot\", { url, second: opts.time });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n yt.command(\"search\")\n .argument(\"<query>\", \"Search query\")\n .description(\"Search YouTube videos\")\n .option(\"-n, --max-results <count>\", \"Max results\", \"10\")\n .option(\"--order <order>\", \"Sort order (relevance/date/rating/viewCount)\", \"relevance\")\n .action(async function (this: Command, query: string) {\n try {\n ensureAuth();\n const opts = this.opts();\n const data = await youtubeGet<Record<string, unknown>[]>(\"search\", {\n query,\n maxResults: opts.maxResults,\n order: opts.order,\n });\n formatOutput(data, getOutputOpts(this), SEARCH_COLUMNS);\n } catch (err) {\n handleError(err);\n }\n });\n\n yt.command(\"comments\")\n .argument(\"<url>\", \"YouTube video URL\")\n .description(\"Get video comments\")\n .option(\"--order <order>\", \"Sort order (time/relevance)\", \"relevance\")\n .option(\"--replies\", \"Include replies\", false)\n .action(async function (this: Command, url: string) {\n try {\n ensureAuth();\n const opts = this.opts();\n const data = await youtubeGet<Record<string, unknown>[]>(\"comments\", {\n url,\n order: opts.order,\n includeReplies: String(opts.replies),\n });\n formatOutput(data, getOutputOpts(this), COMMENT_COLUMNS);\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { readFileSync } from \"node:fs\";\nimport { fetchApi } from \"../lib/api-client.js\";\nimport { handleError } from \"../lib/errors.js\";\nimport { ensureAuth } from \"./auth.js\";\nimport { formatOutput, getOutputOpts } from \"../lib/output.js\";\n\nconst PROXY_BASE = \"/proxy/reviewweb/v1\";\n\n/** Helper: POST request to ReviewWeb proxy */\nasync function webPost<T>(endpoint: string, body: Record<string, unknown>): Promise<T> {\n return fetchApi<T>(\"POST\", `${PROXY_BASE}/${endpoint}`, { body });\n}\n\n\nexport function registerWebCommand(program: Command): void {\n const web = program.command(\"web\").description(\"Website analysis tools (via ReviewWeb)\");\n\n web.command(\"review\")\n .argument(\"<url>\", \"Website URL to review\")\n .description(\"Comprehensive website analysis\")\n .action(async function (this: Command, url: string) {\n try {\n ensureAuth();\n const data = await webPost(\"review\", { url });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n web.command(\"scrape\")\n .argument(\"<url>\", \"URL to scrape\")\n .description(\"Extract HTML content from URL\")\n .action(async function (this: Command, url: string) {\n try {\n ensureAuth();\n const data = await webPost(\"scrape\", { url });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n web.command(\"extract\")\n .argument(\"<url>\", \"URL to extract data from\")\n .description(\"Extract structured data using AI\")\n .requiredOption(\"-i, --instructions <text>\", \"Extraction instructions\")\n .requiredOption(\"-t, --template <json>\", \"JSON template (string or @filepath)\")\n .action(async function (this: Command, url: string) {\n try {\n ensureAuth();\n const opts = this.opts();\n\n // Parse template: @filepath reads from file\n let jsonTemplate = opts.template;\n if (jsonTemplate.startsWith(\"@\")) {\n const filePath = jsonTemplate.slice(1);\n jsonTemplate = readFileSync(filePath, \"utf-8\");\n }\n\n // Validate JSON\n try {\n JSON.parse(jsonTemplate);\n } catch {\n console.error(\"Invalid JSON template. Provide valid JSON or @filepath.\");\n process.exit(1);\n }\n\n const data = await webPost(\"extract\", {\n url,\n instructions: opts.instructions,\n jsonTemplate,\n });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n web.command(\"convert\")\n .argument(\"<url>\", \"URL to convert\")\n .description(\"Convert webpage to Markdown\")\n .action(async function (this: Command, url: string) {\n try {\n ensureAuth();\n const data = await webPost(\"convert/markdown\", { url });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n web.command(\"summarize\")\n .argument(\"<url>\", \"URL to summarize\")\n .description(\"AI-generated page summary\")\n .action(async function (this: Command, url: string) {\n try {\n ensureAuth();\n const data = await webPost(\"summarize/url\", { url });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n web.command(\"screenshot\")\n .argument(\"<url>\", \"URL to screenshot\")\n .description(\"Capture webpage screenshot\")\n .action(async function (this: Command, url: string) {\n try {\n ensureAuth();\n const data = await webPost(\"screenshot\", { url });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../lib/api-client.js\";\nimport { handleError } from \"../lib/errors.js\";\nimport { ensureAuth } from \"./auth.js\";\nimport { formatOutput, getOutputOpts } from \"../lib/output.js\";\nimport type { TableColumn } from \"../types/index.js\";\n\nconst PROXY_BASE = \"/proxy/reviewweb/v1/seo-insights\";\n\nconst KEYWORD_COLUMNS: TableColumn[] = [\n { key: \"keyword\", header: \"Keyword\", width: 30 },\n { key: \"volume\", header: \"Volume\", width: 10 },\n { key: \"competition\", header: \"Competition\", width: 14 },\n];\n\n/** Helper: POST to SEO insights proxy */\nasync function seoPost<T>(endpoint: string, body: Record<string, unknown>): Promise<T> {\n return fetchApi<T>(\"POST\", `${PROXY_BASE}/${endpoint}`, { body });\n}\n\n\nexport function registerSeoCommand(program: Command): void {\n const seo = program.command(\"seo\").description(\"SEO analysis tools\");\n\n seo.command(\"keywords\")\n .argument(\"<keyword>\", \"Seed keyword\")\n .description(\"Get keyword ideas and search volume\")\n .option(\"--country <code>\", \"Country code\", \"us\")\n .action(async function (this: Command, keyword: string) {\n try {\n ensureAuth();\n const opts = this.opts();\n const data = await seoPost<Record<string, unknown>[]>(\"keyword-ideas\", {\n keyword,\n country: opts.country,\n });\n formatOutput(data, getOutputOpts(this), KEYWORD_COLUMNS);\n } catch (err) {\n handleError(err);\n }\n });\n\n seo.command(\"difficulty\")\n .argument(\"<keyword>\", \"Keyword to check\")\n .description(\"Check keyword ranking difficulty\")\n .option(\"--country <code>\", \"Country code\", \"us\")\n .action(async function (this: Command, keyword: string) {\n try {\n ensureAuth();\n const opts = this.opts();\n const data = await seoPost(\"keyword-difficulty\", {\n keyword,\n country: opts.country,\n });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n seo.command(\"traffic\")\n .argument(\"<domain>\", \"Domain or URL to check\")\n .description(\"Check traffic for a domain\")\n .option(\"--country <code>\", \"Country code\")\n .action(async function (this: Command, domain: string) {\n try {\n ensureAuth();\n const opts = this.opts();\n const body: Record<string, unknown> = { domainOrUrl: domain };\n if (opts.country) body.country = opts.country;\n const data = await seoPost(\"traffic\", body);\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n seo.command(\"backlinks\")\n .argument(\"<domain>\", \"Domain to check\")\n .description(\"Get backlink analysis\")\n .action(async function (this: Command, domain: string) {\n try {\n ensureAuth();\n const data = await seoPost(\"backlinks\", { domain });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../lib/api-client.js\";\nimport { handleError, validateId } from \"../lib/errors.js\";\nimport { formatOutput, getOutputOpts } from \"../lib/output.js\";\nimport type { Order, TableColumn } from \"../types/index.js\";\n\nconst ORDER_COLUMNS: TableColumn[] = [\n { key: \"id\", header: \"ID\", width: 12 },\n { key: \"productType\", header: \"Product\", width: 16 },\n { key: \"status\", header: \"Status\", width: 12 },\n { key: \"amount\", header: \"Amount\", width: 10 },\n { key: \"currency\", header: \"Currency\", width: 8 },\n { key: \"createdAt\", header: \"Created\", width: 22 },\n];\n\nexport function registerOrdersCommand(program: Command): void {\n const orders = program.command(\"orders\").description(\"Look up orders and purchases\");\n\n orders.command(\"get\")\n .argument(\"<id>\", \"Order ID\")\n .description(\"Get order details\")\n .action(async function (this: Command, id: string) {\n try {\n validateId(id, \"order ID\");\n const data = await fetchApi<Order>(\"GET\", `/orders/${id}`, { noAuth: true });\n formatOutput(data, getOutputOpts(this), ORDER_COLUMNS);\n } catch (err) {\n handleError(err);\n }\n });\n\n orders.command(\"status\")\n .argument(\"<id>\", \"Order ID\")\n .description(\"Check order status\")\n .action(async function (this: Command, id: string) {\n try {\n validateId(id, \"order ID\");\n const data = await fetchApi<{ status: string }>(\"GET\", `/orders/${id}/status`, { noAuth: true });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../lib/api-client.js\";\nimport { handleError } from \"../lib/errors.js\";\nimport { ensureAuth } from \"./auth.js\";\nimport { formatOutput, getOutputOpts, printSuccess } from \"../lib/output.js\";\nimport type { ReferralDashboard, PayoutRequest, TableColumn } from \"../types/index.js\";\n\nconst PAYOUT_COLUMNS: TableColumn[] = [\n { key: \"id\", header: \"ID\", width: 12 },\n { key: \"amount\", header: \"Amount\", width: 10 },\n { key: \"currency\", header: \"Currency\", width: 8 },\n { key: \"status\", header: \"Status\", width: 12 },\n { key: \"createdAt\", header: \"Created\", width: 22 },\n];\n\nexport function registerReferralsCommand(program: Command): void {\n const referrals = program.command(\"referrals\").description(\"Referral program management\");\n\n referrals.command(\"dashboard\")\n .description(\"View your referral dashboard\")\n .action(async function (this: Command) {\n try {\n ensureAuth();\n const data = await fetchApi<ReferralDashboard>(\"GET\", \"/referrals/dashboard\");\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n referrals.command(\"payout-history\")\n .description(\"View your payout request history\")\n .action(async function (this: Command) {\n try {\n ensureAuth();\n const data = await fetchApi<PayoutRequest[]>(\"GET\", \"/referrals/request-payout\");\n formatOutput(data, getOutputOpts(this), PAYOUT_COLUMNS);\n } catch (err) {\n handleError(err);\n }\n });\n\n referrals.command(\"request-payout\")\n .description(\"Request a referral payout\")\n .action(async function (this: Command) {\n try {\n ensureAuth();\n const data = await fetchApi<PayoutRequest>(\"POST\", \"/referrals/request-payout\");\n printSuccess(\"Payout requested.\");\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../lib/api-client.js\";\nimport { handleError, validateId } from \"../lib/errors.js\";\nimport { formatOutput, getOutputOpts } from \"../lib/output.js\";\nimport type { Article, TableColumn } from \"../types/index.js\";\n\nconst ARTICLE_COLUMNS: TableColumn[] = [\n { key: \"id\", header: \"ID\", width: 12 },\n { key: \"title\", header: \"Title\", width: 36 },\n { key: \"status\", header: \"Status\", width: 12 },\n { key: \"createdAt\", header: \"Created\", width: 22 },\n];\n\nexport function registerBlogCommand(program: Command): void {\n const blog = program.command(\"blog\").description(\"Browse blog articles\");\n\n blog.command(\"list\")\n .description(\"List blog articles\")\n .action(async function (this: Command) {\n try {\n const data = await fetchApi<Article[]>(\"GET\", \"/blog/articles\", { noAuth: true });\n formatOutput(data, getOutputOpts(this), ARTICLE_COLUMNS);\n } catch (err) {\n handleError(err);\n }\n });\n\n blog.command(\"get\")\n .argument(\"<id>\", \"Article ID\")\n .description(\"Get article details\")\n .action(async function (this: Command, id: string) {\n try {\n validateId(id, \"article ID\");\n const data = await fetchApi<Article>(\"GET\", `/blog/articles/${id}`, { noAuth: true });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { fetchApi } from \"../lib/api-client.js\";\nimport { handleError } from \"../lib/errors.js\";\nimport { formatOutput, getOutputOpts, printSuccess } from \"../lib/output.js\";\n\n\nexport function registerHealthCommand(program: Command): void {\n program\n .command(\"health\")\n .description(\"Check ClaudeKit.cc API health\")\n .action(async function (this: Command) {\n try {\n const data = await fetchApi<Record<string, unknown>>(\"GET\", \"/health\", { noAuth: true });\n const outputOpts = getOutputOpts(this);\n\n if (outputOpts.json || outputOpts.quiet) {\n formatOutput(data, outputOpts);\n } else {\n printSuccess(\"ClaudeKit.cc API is healthy.\");\n if (data.version) console.log(chalk.dim(`Version: ${data.version}`));\n if (data.uptime) console.log(chalk.dim(`Uptime: ${data.uptime}`));\n }\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport * as readline from \"node:readline/promises\";\nimport { fetchApi } from \"../lib/api-client.js\";\nimport { handleError } from \"../lib/errors.js\";\nimport { ensureAuth } from \"./auth.js\";\nimport { formatOutput, getOutputOpts, printSuccess, printWarn } from \"../lib/output.js\";\nimport type { AccountExport } from \"../types/index.js\";\n\nexport function registerAccountCommand(program: Command): void {\n const account = program.command(\"account\").description(\"Account management\");\n\n account\n .command(\"export-data\")\n .description(\"Export your personal data (GDPR)\")\n .action(async function (this: Command) {\n try {\n ensureAuth();\n const data = await fetchApi<AccountExport>(\"GET\", \"/gdpr/export-data\");\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n account\n .command(\"delete\")\n .description(\"Delete your account permanently (GDPR)\")\n .option(\"--reason <text>\", \"Reason for account deletion\")\n .action(async function (this: Command) {\n try {\n ensureAuth();\n const { reason } = this.opts();\n\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n const answer = await rl.question(\n 'This action is irreversible. Type \"DELETE_MY_ACCOUNT\" to confirm: '\n );\n rl.close();\n\n if (answer.trim() !== \"DELETE_MY_ACCOUNT\") {\n printWarn(\"Cancelled. Account was not deleted.\");\n return;\n }\n\n await fetchApi<unknown>(\"POST\", \"/gdpr/delete-account\", {\n body: { confirmation: \"DELETE_MY_ACCOUNT\", reason },\n });\n printSuccess(\"Account deletion request submitted.\");\n } catch (err) {\n handleError(err);\n }\n });\n\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../lib/api-client.js\";\nimport { handleError } from \"../lib/errors.js\";\nimport { formatOutput, getOutputOpts } from \"../lib/output.js\";\nimport type { CheckoutSession } from \"../types/index.js\";\n\nfunction addCheckoutOptions(cmd: Command): Command {\n return cmd\n .requiredOption(\"--email <email>\", \"Customer email\")\n .requiredOption(\"--product <type>\", \"Product type\")\n .option(\"--name <name>\", \"Customer name\")\n .option(\"--github <username>\", \"GitHub username\")\n .option(\"--referral <code>\", \"Referral code\")\n .option(\"--coupon <code>\", \"Coupon code\");\n}\n\nfunction buildCheckoutBody(opts: Record<string, string>): Record<string, string | undefined> {\n return {\n email: opts.email,\n name: opts.name,\n productType: opts.product,\n githubUsername: opts.github,\n referralCode: opts.referral,\n couponCode: opts.coupon,\n };\n}\n\nexport function registerCheckoutCommand(program: Command): void {\n const checkout = program.command(\"checkout\").description(\"Create payment checkout\");\n\n addCheckoutOptions(\n checkout.command(\"polar\").description(\"Create a Polar checkout session\")\n ).action(async function (this: Command) {\n try {\n const data = await fetchApi<CheckoutSession>(\"POST\", \"/checkout/polar\", {\n noAuth: true,\n body: buildCheckoutBody(this.opts()),\n });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n addCheckoutOptions(\n checkout.command(\"sepay\").description(\"Create a SePay checkout session\")\n ).action(async function (this: Command) {\n try {\n const data = await fetchApi<CheckoutSession>(\"POST\", \"/checkout/sepay\", {\n noAuth: true,\n body: buildCheckoutBody(this.opts()),\n });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport * as readline from \"node:readline/promises\";\nimport { fetchApi } from \"../lib/api-client.js\";\nimport { handleError } from \"../lib/errors.js\";\nimport { ensureAuth } from \"./auth.js\";\nimport { formatOutput, getOutputOpts, printSuccess, printWarn } from \"../lib/output.js\";\n\nexport function registerGithubCommand(program: Command): void {\n const github = program.command(\"github\").description(\"GitHub repository access\");\n\n github\n .command(\"invite\")\n .description(\"Grant GitHub repository access via license\")\n .requiredOption(\"--license <id>\", \"License ID\")\n .action(async function (this: Command) {\n try {\n ensureAuth();\n const { license } = this.opts();\n const data = await fetchApi<unknown>(\"POST\", \"/github/invite\", {\n body: { licenseId: license },\n });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n github\n .command(\"revoke\")\n .description(\"Revoke GitHub repository access via license\")\n .requiredOption(\"--license <id>\", \"License ID\")\n .action(async function (this: Command) {\n try {\n ensureAuth();\n const { license } = this.opts();\n\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n const answer = await rl.question(`Revoke GitHub access for license \"${license}\"? (y/N): `);\n rl.close();\n\n if (answer.toLowerCase() !== \"y\") {\n printWarn(\"Cancelled.\");\n return;\n }\n\n const data = await fetchApi<unknown>(\"POST\", \"/github/revoke\", {\n body: { licenseId: license },\n });\n formatOutput(data, getOutputOpts(this));\n printSuccess(\"GitHub access revoked.\");\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../lib/api-client.js\";\nimport { handleError } from \"../lib/errors.js\";\nimport { ensureAuth } from \"./auth.js\";\nimport { formatOutput, getOutputOpts } from \"../lib/output.js\";\nimport type { LoyaltyEligibility } from \"../types/index.js\";\n\nexport function registerLoyaltyCommand(program: Command): void {\n const loyalty = program.command(\"loyalty\").description(\"Loyalty program\");\n\n loyalty\n .command(\"eligibility\")\n .description(\"Check your loyalty program eligibility\")\n .action(async function (this: Command) {\n try {\n ensureAuth();\n const data = await fetchApi<LoyaltyEligibility>(\"GET\", \"/loyalty/eligibility\");\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../lib/api-client.js\";\nimport { handleError } from \"../lib/errors.js\";\nimport { formatOutput, getOutputOpts } from \"../lib/output.js\";\n\nexport function registerNewsletterCommand(program: Command): void {\n const newsletter = program.command(\"newsletter\").description(\"Newsletter subscription\");\n\n newsletter\n .command(\"subscribe\")\n .description(\"Subscribe an email to the newsletter\")\n .requiredOption(\"--email <email>\", \"Email address to subscribe\")\n .action(async function (this: Command) {\n try {\n const { email } = this.opts();\n const data = await fetchApi<unknown>(\"POST\", \"/newsletter/subscribe\", {\n noAuth: true,\n body: { email },\n });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n newsletter\n .command(\"unsubscribe\")\n .description(\"Unsubscribe from the newsletter using a token\")\n .requiredOption(\"--token <token>\", \"Unsubscribe token from email\")\n .action(async function (this: Command) {\n try {\n const { token } = this.opts();\n const data = await fetchApi<unknown>(\"POST\", \"/newsletter/unsubscribe\", {\n noAuth: true,\n body: { token },\n });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport * as readline from \"node:readline/promises\";\nimport { fetchApi } from \"../lib/api-client.js\";\nimport { handleError, CliError } from \"../lib/errors.js\";\nimport { ensureAuth } from \"./auth.js\";\nimport { formatOutput, getOutputOpts, printSuccess, printWarn } from \"../lib/output.js\";\nimport type { PayoutProfile, TableColumn } from \"../types/index.js\";\n\nconst PAYOUT_PROFILE_COLUMNS: TableColumn[] = [\n { key: \"id\", header: \"ID\", width: 36 },\n { key: \"paymentMethod\", header: \"Method\", width: 20 },\n { key: \"createdAt\", header: \"Created At\", width: 24 },\n];\n\nexport function registerPayoutCommand(program: Command): void {\n const payout = program.command(\"payout\").description(\"Payout profile management\");\n\n payout\n .command(\"profile\")\n .description(\"List your payout profiles\")\n .action(async function (this: Command) {\n try {\n ensureAuth();\n const data = await fetchApi<PayoutProfile[]>(\"GET\", \"/payout/profile\");\n formatOutput(data, getOutputOpts(this), PAYOUT_PROFILE_COLUMNS);\n } catch (err) {\n handleError(err);\n }\n });\n\n payout\n .command(\"create-profile\")\n .description(\"Create a new payout profile\")\n .requiredOption(\"--method <method>\", \"Payment method (e.g. bank_transfer, paypal)\")\n .requiredOption(\"--details <json>\", \"Payment details as JSON string\")\n .action(async function (this: Command) {\n try {\n ensureAuth();\n const { method, details } = this.opts();\n\n let paymentDetails: unknown;\n try {\n paymentDetails = JSON.parse(details);\n } catch {\n throw new CliError(\"--details must be valid JSON.\");\n }\n\n const data = await fetchApi<PayoutProfile>(\"POST\", \"/payout/profile\", {\n body: { paymentMethod: method, paymentDetails },\n });\n formatOutput(data, getOutputOpts(this));\n printSuccess(\"Payout profile created.\");\n } catch (err) {\n handleError(err);\n }\n });\n\n payout\n .command(\"delete-profile\")\n .description(\"Delete a payout profile\")\n .requiredOption(\"--id <id>\", \"Payout profile ID to delete\")\n .action(async function (this: Command) {\n try {\n ensureAuth();\n const { id } = this.opts();\n\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n const answer = await rl.question(`Delete payout profile \"${id}\"? (y/N): `);\n rl.close();\n\n if (answer.toLowerCase() !== \"y\") {\n printWarn(\"Cancelled.\");\n return;\n }\n\n await fetchApi<unknown>(\"DELETE\", \"/payout/profile\", { params: { id } });\n printSuccess(\"Payout profile deleted.\");\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../lib/api-client.js\";\nimport { handleError } from \"../lib/errors.js\";\nimport { formatOutput, getOutputOpts } from \"../lib/output.js\";\nimport type { EarlyAccessStatus } from \"../types/index.js\";\n\nexport function registerPricingCommand(program: Command): void {\n const pricing = program.command(\"pricing\").description(\"Pricing and promotions\");\n\n pricing\n .command(\"validate-discount <code>\")\n .description(\"Validate a discount code\")\n .action(async function (this: Command, code: string) {\n try {\n const data = await fetchApi<unknown>(\"POST\", \"/discounts/validate\", {\n noAuth: true,\n body: { code },\n });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n pricing\n .command(\"exchange-rate\")\n .description(\"Get current exchange rate\")\n .action(async function (this: Command) {\n try {\n const data = await fetchApi<unknown>(\"GET\", \"/exchange-rate\", { noAuth: true });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n pricing\n .command(\"early-access\")\n .description(\"Get early access promotion status\")\n .action(async function (this: Command) {\n try {\n const data = await fetchApi<EarlyAccessStatus>(\"GET\", \"/promotions/early-access\", {\n noAuth: true,\n });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport * as readline from \"node:readline/promises\";\nimport { fetchApi } from \"../lib/api-client.js\";\nimport { handleError, validateId, CliError } from \"../lib/errors.js\";\nimport { ensureAuth } from \"./auth.js\";\nimport { formatOutput, getOutputOpts, printSuccess, printWarn } from \"../lib/output.js\";\n\nexport function registerRefundsCommand(program: Command): void {\n const refunds = program.command(\"refunds\").description(\"Refund management\");\n\n refunds\n .command(\"request <orderId>\")\n .description(\"Request a refund for an order\")\n .requiredOption(\"--reason <text>\", \"Reason for refund request\")\n .option(\"--bank-details <json>\", \"Bank transfer details as JSON string\")\n .action(async function (this: Command, orderId: string) {\n try {\n ensureAuth();\n validateId(orderId, \"orderId\");\n const { reason, bankDetails } = this.opts();\n\n let bankTransferDetails: unknown;\n if (bankDetails) {\n try {\n bankTransferDetails = JSON.parse(bankDetails);\n } catch {\n throw new CliError(\"--bank-details must be valid JSON.\");\n }\n }\n\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n const answer = await rl.question(`Request refund for order \"${orderId}\"? (y/N): `);\n rl.close();\n\n if (answer.toLowerCase() !== \"y\") {\n printWarn(\"Cancelled.\");\n return;\n }\n\n const data = await fetchApi<unknown>(\"POST\", \"/refunds/request\", {\n body: { orderId, reason, bankTransferDetails },\n });\n formatOutput(data, getOutputOpts(this));\n printSuccess(\"Refund request submitted.\");\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../lib/api-client.js\";\nimport { handleError } from \"../lib/errors.js\";\nimport { formatOutput, getOutputOpts } from \"../lib/output.js\";\nimport type { Release, TableColumn } from \"../types/index.js\";\n\nconst RELEASE_COLUMNS: TableColumn[] = [\n { key: \"tagName\", header: \"Tag\", width: 20 },\n { key: \"name\", header: \"Name\", width: 40 },\n { key: \"publishedAt\", header: \"Published At\", width: 24 },\n];\n\nexport function registerReleasesCommand(program: Command): void {\n const releases = program.command(\"releases\").description(\"Product releases\");\n\n releases\n .command(\"list\")\n .description(\"List product releases\")\n .option(\"--tab <all|engineer|marketing>\", \"Release tab filter\", \"all\")\n .action(async function (this: Command) {\n try {\n const { tab } = this.opts();\n const data = await fetchApi<Release[]>(\"GET\", \"/releases\", {\n noAuth: true,\n params: { tab },\n });\n formatOutput(data, getOutputOpts(this), RELEASE_COLUMNS);\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../lib/api-client.js\";\nimport { handleError } from \"../lib/errors.js\";\nimport { formatOutput, getOutputOpts } from \"../lib/output.js\";\n\nexport function registerStatsCommand(program: Command): void {\n const stats = program.command(\"stats\").description(\"Platform statistics\");\n\n stats\n .command(\"users\")\n .description(\"Get platform user statistics\")\n .action(async function (this: Command) {\n try {\n const data = await fetchApi<unknown>(\"GET\", \"/stats/users\", { noAuth: true });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../lib/api-client.js\";\nimport { handleError } from \"../lib/errors.js\";\nimport { formatOutput, getOutputOpts } from \"../lib/output.js\";\n\nexport function registerWaitlistCommand(program: Command): void {\n const waitlist = program.command(\"waitlist\").description(\"Product waitlist\");\n\n waitlist\n .command(\"join\")\n .description(\"Join the marketing waitlist\")\n .requiredOption(\"--email <email>\", \"Email address to join with\")\n .action(async function (this: Command) {\n try {\n const { email } = this.opts();\n const data = await fetchApi<unknown>(\"POST\", \"/waitlist/marketing\", {\n noAuth: true,\n body: { email },\n });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { dirname, resolve } from \"node:path\";\nimport { statSync, writeFileSync } from \"node:fs\";\nimport { fetchApi, fetchApiBinary } from \"../../lib/api-client.js\";\nimport { handleError, validateId, CliError } from \"../../lib/errors.js\";\nimport { ensureAdminAuth } from \"../auth.js\";\nimport { formatOutput, getOutputOpts, printSuccess } from \"../../lib/output.js\";\nimport { confirm } from \"./admin-utils.js\";\nimport type { AdminOrderListItem, TableColumn } from \"../../types/index.js\";\n\nconst ORDER_COLUMNS: TableColumn[] = [\n { key: \"id\", header: \"ID\", width: 12 },\n { key: \"userEmail\", header: \"User Email\", width: 28 },\n { key: \"productType\", header: \"Product\", width: 16 },\n { key: \"amount\", header: \"Amount\", width: 10 },\n { key: \"currency\", header: \"Currency\", width: 8 },\n { key: \"status\", header: \"Status\", width: 12 },\n { key: \"paymentProvider\", header: \"Provider\", width: 12 },\n { key: \"createdAt\", header: \"Created\", width: 22 },\n];\n\nfunction assertInvoiceOutputPath(output: string): string {\n const resolved = resolve(output);\n const parent = dirname(resolved);\n\n try {\n if (!statSync(parent).isDirectory()) {\n throw new CliError(`Output parent is not a directory: ${parent}`);\n }\n } catch (err) {\n const code = err && typeof err === \"object\" && \"code\" in err ? (err as { code?: string }).code : undefined;\n if (code === \"ENOENT\") {\n throw new CliError(`Output directory does not exist: ${parent}`);\n }\n if (err instanceof CliError) throw err;\n throw err;\n }\n\n try {\n const existing = statSync(resolved);\n if (existing.isDirectory()) {\n throw new CliError(`Output path is a directory: ${resolved}`);\n }\n throw new CliError(`Output file already exists: ${resolved}`);\n } catch (err) {\n const code = err && typeof err === \"object\" && \"code\" in err ? (err as { code?: string }).code : undefined;\n if (code === \"ENOENT\") {\n return resolved;\n }\n throw err;\n }\n}\n\nexport function registerAdminOrdersCommand(admin: Command): void {\n const orders = admin.command(\"orders\").description(\"Admin order management\");\n\n orders\n .command(\"list\")\n .description(\"List all orders\")\n .option(\"--provider <name>\", \"Filter by payment provider\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const params: Record<string, string> = {};\n if (opts.provider) params[\"provider\"] = opts.provider;\n const data = await fetchApi<AdminOrderListItem[]>(\"GET\", \"/admin/orders\", { adminAuth: true, params });\n formatOutput(data, getOutputOpts(this), ORDER_COLUMNS);\n } catch (err) { handleError(err); }\n });\n\n orders\n .command(\"search <query>\")\n .description(\"Search orders by query (id, user email, name)\")\n .option(\"--provider <name>\", \"Filter by payment provider\")\n .option(\"--limit <n>\", \"Number of results\", \"50\")\n .option(\"--offset <n>\", \"Offset for pagination\", \"0\")\n .action(async function (this: Command, query: string) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const limit = Number(opts.limit);\n const offset = Number(opts.offset);\n if (Number.isNaN(limit) || limit < 1) throw new CliError(\"--limit must be a positive integer\");\n if (Number.isNaN(offset) || offset < 0) throw new CliError(\"--offset must be a non-negative integer\");\n const params: Record<string, string> = { search: query, limit: String(limit), offset: String(offset) };\n if (opts.provider) params[\"provider\"] = opts.provider;\n const data = await fetchApi<unknown>(\"GET\", \"/admin/orders\", { adminAuth: true, params });\n formatOutput(data, getOutputOpts(this), ORDER_COLUMNS);\n } catch (err) { handleError(err); }\n });\n\n orders\n .command(\"get <id>\")\n .description(\"Get order details\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"order ID\");\n const data = await fetchApi<unknown>(\"GET\", `/admin/orders/${id}`, { adminAuth: true });\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n orders\n .command(\"invoice <id>\")\n .description(\"Download order invoice PDF\")\n .requiredOption(\"--output <file>\", \"Output PDF path\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"order ID\");\n const outputPath = assertInvoiceOutputPath(this.opts().output);\n const result = await fetchApiBinary(\"GET\", `/admin/orders/${id}/pdf`, { adminAuth: true });\n writeFileSync(outputPath, Buffer.from(result.bytes), { flag: \"wx\" });\n printSuccess(`Invoice saved to ${outputPath}`);\n } catch (err) { handleError(err); }\n });\n\n orders\n .command(\"complete <id>\")\n .description(\"Mark an order as complete\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"order ID\");\n const ok = await confirm(`Complete order ${id}?`);\n if (!ok) { console.log(\"Aborted.\"); return; }\n const data = await fetchApi<unknown>(\"POST\", `/admin/orders/${id}/complete`, { adminAuth: true });\n printSuccess(`Order ${id} marked complete.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n orders\n .command(\"refund <id>\")\n .description(\"Refund an order (revokes GitHub access)\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"order ID\");\n const ok = await confirm(`Refund order ${id}? WARNING: this will revoke GitHub access. Continue?`);\n if (!ok) { console.log(\"Aborted.\"); return; }\n const data = await fetchApi<unknown>(\"POST\", `/admin/orders/${id}/refund`, { adminAuth: true });\n printSuccess(`Order ${id} refunded.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n orders\n .command(\"refund-keep-access <id>\")\n .description(\"Refund an order but keep GitHub access\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"order ID\");\n const ok = await confirm(`Refund order ${id} (keep access)?`);\n if (!ok) { console.log(\"Aborted.\"); return; }\n const data = await fetchApi<unknown>(\"POST\", `/admin/orders/${id}/refund-keep-access`, { adminAuth: true });\n printSuccess(`Order ${id} refunded (access retained).`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n orders\n .command(\"switch-product <id>\")\n .description(\"Switch the product type of an order\")\n .requiredOption(\"--product <engineer_kit|marketing_kit>\", \"Target product type\")\n .option(\"--reason <text>\", \"Reason for the switch\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"order ID\");\n const { product, reason } = this.opts();\n if (![\"engineer_kit\", \"marketing_kit\"].includes(product)) {\n throw new CliError(\"--product must be one of: engineer_kit, marketing_kit\");\n }\n const ok = await confirm(`Switch order ${id} to product \"${product}\"?`);\n if (!ok) { console.log(\"Aborted.\"); return; }\n const body: Record<string, unknown> = { targetProductType: product };\n if (reason) body[\"reason\"] = reason;\n const data = await fetchApi<unknown>(\"POST\", `/admin/orders/${id}/switch-product`, { adminAuth: true, body });\n printSuccess(`Order ${id} product switched to ${product}.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n orders\n .command(\"resend-emails <id>\")\n .description(\"Resend emails for an order\")\n .requiredOption(\"--type <order|welcome|invoice|both>\", \"Email type to resend\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"order ID\");\n const { type } = this.opts();\n const data = await fetchApi<unknown>(\"POST\", `/admin/orders/${id}/resend-emails`, {\n adminAuth: true,\n body: { emailType: type },\n });\n printSuccess(`Emails (${type}) resent for order ${id}.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n orders\n .command(\"resend-github-invite <id>\")\n .description(\"Resend GitHub repo invite for a completed order\")\n .option(\"--variant <type>\", \"Override product variant (engineer_kit|marketing_kit|combo)\")\n .option(\"--github-username <name>\", \"Override GitHub username to invite\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"order ID\");\n const opts = this.opts();\n if (opts.variant && ![\"engineer_kit\", \"marketing_kit\", \"combo\"].includes(opts.variant)) {\n throw new CliError(`--variant must be one of engineer_kit, marketing_kit, combo`);\n }\n const body: Record<string, unknown> = {};\n if (opts.variant) body[\"variant\"] = opts.variant;\n if (opts.githubUsername) body[\"githubUsername\"] = opts.githubUsername;\n const data = await fetchApi<unknown>(\n \"POST\",\n `/admin/orders/${id}/resend-github-invite`,\n { adminAuth: true, body },\n );\n printSuccess(`GitHub invite resent for order ${id}.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n orders\n .command(\"export\")\n .description(\"Export orders as CSV\")\n .option(\"--start <date>\", \"Start date (ISO 8601)\")\n .option(\"--end <date>\", \"End date (ISO 8601)\")\n .option(\"--search <text>\", \"Search text\")\n .option(\"--provider <name>\", \"Filter by payment provider\")\n .option(\"--status <status>\", \"Filter by status\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const params: Record<string, string> = {};\n if (opts.start) params[\"startDate\"] = opts.start;\n if (opts.end) params[\"endDate\"] = opts.end;\n if (opts.search) params[\"search\"] = opts.search;\n if (opts.provider) params[\"provider\"] = opts.provider;\n if (opts.status) params[\"status\"] = opts.status;\n const csv = await fetchApi<string>(\"GET\", \"/admin/orders/export\", { adminAuth: true, params });\n console.log(typeof csv === \"string\" ? csv : JSON.stringify(csv));\n } catch (err) { handleError(err); }\n });\n\n orders\n .command(\"stats\")\n .description(\"Aggregate counts + revenue with optional filters\")\n .option(\"--start <date>\", \"Start date (ISO 8601)\")\n .option(\"--end <date>\", \"End date (ISO 8601)\")\n .option(\"--status <status>\", \"Order status filter\")\n .option(\"--provider <polar|sepay>\", \"Payment provider filter\")\n .option(\"--vat-requested\", \"Only count orders with VAT invoice requested\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n if (opts.provider && opts.provider !== \"polar\" && opts.provider !== \"sepay\") {\n throw new CliError(\"--provider must be 'polar' or 'sepay'\");\n }\n const params: Record<string, string> = {};\n if (opts.start) params[\"start\"] = opts.start;\n if (opts.end) params[\"end\"] = opts.end;\n if (opts.status) params[\"status\"] = opts.status;\n if (opts.provider) params[\"provider\"] = opts.provider;\n if (opts.vatRequested) params[\"vatRequested\"] = \"true\";\n const data = await fetchApi<unknown>(\"GET\", \"/admin/orders/stats\", { adminAuth: true, params });\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n}\n","import * as readline from \"node:readline/promises\";\n\n/** Shared confirmation prompt for admin destructive actions */\nexport async function confirm(message: string): Promise<boolean> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n try {\n const answer = await rl.question(`${message} [y/N] `);\n return answer.trim().toLowerCase() === \"y\";\n } finally {\n rl.close();\n }\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../../lib/api-client.js\";\nimport { handleError, validateId, CliError } from \"../../lib/errors.js\";\nimport { ensureAdminAuth } from \"../auth.js\";\nimport { formatOutput, getOutputOpts, printSuccess } from \"../../lib/output.js\";\nimport { confirm } from \"./admin-utils.js\";\nimport type { AdminUserDetail } from \"../../types/index.js\";\n\nexport function registerAdminUsersCommand(admin: Command): void {\n const users = admin.command(\"users\").description(\"Admin user management\");\n\n users\n .command(\"get <id>\")\n .description(\"Get user details\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"user ID\");\n const data = await fetchApi<AdminUserDetail>(\"GET\", `/admin/users/${id}`, { adminAuth: true });\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n users\n .command(\"update <id>\")\n .description(\"Update user name and/or email\")\n .option(\"--email <email>\", \"New email address\")\n .option(\"--name <name>\", \"New display name\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"user ID\");\n const opts = this.opts();\n if (opts.email === undefined && opts.name === undefined) {\n throw new CliError(\"At least one of --email or --name is required.\");\n }\n const body: Record<string, string> = {};\n if (opts.email !== undefined) body[\"email\"] = opts.email;\n if (opts.name !== undefined) body[\"name\"] = opts.name;\n const data = await fetchApi<unknown>(\"PATCH\", `/admin/users/${id}`, { adminAuth: true, body });\n printSuccess(`User ${id} updated.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n users\n .command(\"update-github <id>\")\n .description(\"Update GitHub username for a user\")\n .requiredOption(\"--username <name>\", \"New GitHub username\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"user ID\");\n const { username } = this.opts();\n const data = await fetchApi<unknown>(\"PATCH\", `/admin/users/${id}/github-username`, {\n adminAuth: true,\n body: { githubUsername: username },\n });\n printSuccess(`GitHub username updated for user ${id}.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n users\n .command(\"update-rates <id>\")\n .description(\"Update commission/discount rates for a user\")\n .option(\"--commission <rate>\", \"Commission rate (number)\")\n .option(\"--discount <rate>\", \"Discount rate (number)\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"user ID\");\n const opts = this.opts();\n if (opts.commission === undefined && opts.discount === undefined) {\n throw new CliError(\"At least one of --commission or --discount is required.\");\n }\n const body: Record<string, number | null> = {};\n if (opts.commission !== undefined) {\n const val = Number(opts.commission);\n if (Number.isNaN(val) || val < 0 || val > 100) throw new CliError(\"--commission must be a number between 0 and 100\");\n body[\"commissionRate\"] = val;\n }\n if (opts.discount !== undefined) {\n const val = Number(opts.discount);\n if (Number.isNaN(val) || val < 0 || val > 100) throw new CliError(\"--discount must be a number between 0 and 100\");\n body[\"discountRate\"] = val;\n }\n const data = await fetchApi<unknown>(\"PATCH\", `/admin/users/${id}/rates`, { adminAuth: true, body });\n printSuccess(`Rates updated for user ${id}.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n users\n .command(\"set-tier <id>\")\n .description(\"Set manual tier for a user (use 'none' to remove)\")\n .requiredOption(\"--tier <tierId>\", \"Tier ID or 'none' to remove\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"user ID\");\n const { tier } = this.opts();\n const data = await fetchApi<unknown>(\"PATCH\", `/admin/users/${id}/tier`, {\n adminAuth: true,\n body: { manualTierId: tier === \"none\" ? null : tier },\n });\n printSuccess(`Tier updated for user ${id}.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n users\n .command(\"delete-orphan <id>\")\n .description(\"Hard-delete a safe orphan user\")\n .requiredOption(\"--reason <text>\", \"Audit reason for deleting the orphan user\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"user ID\");\n const { reason } = this.opts();\n if (!reason || String(reason).trim().length === 0) {\n throw new CliError(\"--reason is required.\");\n }\n const ok = await confirm(`Hard-delete orphan user ${id}? This cannot be undone.`);\n if (!ok) { console.log(\"Aborted.\"); return; }\n const data = await fetchApi<unknown>(\"DELETE\", `/admin/users/${id}/orphan`, {\n adminAuth: true,\n body: { reason },\n });\n const outputOpts = getOutputOpts(this);\n if (outputOpts.json) {\n formatOutput(data, outputOpts);\n return;\n }\n printSuccess(`Orphan user ${id} deleted.`);\n } catch (err) { handleError(err); }\n });\n\n users\n .command(\"export\")\n .description(\"Export users as CSV\")\n .option(\"--start <date>\", \"Start date (ISO 8601)\")\n .option(\"--end <date>\", \"End date (ISO 8601)\")\n .option(\"--search <text>\", \"Search text\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const params: Record<string, string> = {};\n if (opts.start) params[\"startDate\"] = opts.start;\n if (opts.end) params[\"endDate\"] = opts.end;\n if (opts.search) params[\"search\"] = opts.search;\n const csv = await fetchApi<string>(\"GET\", \"/admin/users/export\", { adminAuth: true, params });\n console.log(typeof csv === \"string\" ? csv : JSON.stringify(csv));\n } catch (err) { handleError(err); }\n });\n\n users\n .command(\"stats\")\n .description(\"Aggregate user metrics: signups, paying users, top spenders, tiers, GitHub-linked, referrers\")\n .option(\"--start <date>\", \"Start date (ISO 8601)\")\n .option(\"--end <date>\", \"End date (ISO 8601)\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const params: Record<string, string> = {};\n if (opts.start) params[\"start\"] = opts.start;\n if (opts.end) params[\"end\"] = opts.end;\n const data = await fetchApi<unknown>(\"GET\", \"/admin/users/stats\", { adminAuth: true, params });\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../../lib/api-client.js\";\nimport { handleError, validateId } from \"../../lib/errors.js\";\nimport { ensureAdminAuth } from \"../auth.js\";\nimport { formatOutput, getOutputOpts } from \"../../lib/output.js\";\nimport type { AdminReferralStats } from \"../../types/index.js\";\n\nexport function registerAdminReferralsCommand(admin: Command): void {\n const referrals = admin.command(\"referrals\").description(\"Admin referral management\");\n\n referrals\n .command(\"stats\")\n .description(\"Get referral statistics\")\n .option(\"--start <date>\", \"Start date (ISO 8601)\")\n .option(\"--end <date>\", \"End date (ISO 8601)\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const params: Record<string, string> = {};\n if (opts.start) params[\"startDate\"] = opts.start;\n if (opts.end) params[\"endDate\"] = opts.end;\n const data = await fetchApi<AdminReferralStats>(\"GET\", \"/admin/referrals/stats\", { adminAuth: true, params });\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n referrals\n .command(\"user-stats <userId>\")\n .description(\"Per-referrer detailed stats (profile + KPIs + payouts)\")\n .option(\"--start <date>\", \"Start date (ISO 8601)\")\n .option(\"--end <date>\", \"End date (ISO 8601)\")\n .action(async function (this: Command, userId: string) {\n try {\n ensureAdminAuth();\n validateId(userId, \"user ID\");\n const opts = this.opts();\n const params: Record<string, string> = {};\n if (opts.start) params[\"startDate\"] = opts.start;\n if (opts.end) params[\"endDate\"] = opts.end;\n const data = await fetchApi<unknown>(\n \"GET\",\n `/admin/referrals/${userId}/stats`,\n { adminAuth: true, params },\n );\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n referrals\n .command(\"tiers-stats\")\n .description(\"Get referral tier statistics\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const data = await fetchApi<unknown>(\"GET\", \"/admin/referrals/tiers/stats\", { adminAuth: true });\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n referrals\n .command(\"diagnose\")\n .description(\"Run referral diagnostics\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const data = await fetchApi<unknown>(\"GET\", \"/admin/referrals/diagnose\", { adminAuth: true });\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n referrals\n .command(\"export\")\n .description(\"Export referral data as CSV\")\n .option(\"--start <date>\", \"Start date (ISO 8601)\")\n .option(\"--end <date>\", \"End date (ISO 8601)\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const params: Record<string, string> = {};\n if (opts.start) params[\"startDate\"] = opts.start;\n if (opts.end) params[\"endDate\"] = opts.end;\n const csv = await fetchApi<string>(\"GET\", \"/admin/referrals/export\", { adminAuth: true, params });\n console.log(typeof csv === \"string\" ? csv : JSON.stringify(csv));\n } catch (err) { handleError(err); }\n });\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../../lib/api-client.js\";\nimport { handleError, validateId, CliError } from \"../../lib/errors.js\";\nimport { ensureAdminAuth } from \"../auth.js\";\nimport { formatOutput, getOutputOpts, printSuccess } from \"../../lib/output.js\";\nimport { confirm } from \"./admin-utils.js\";\nimport type { AdminRevenueStats } from \"../../types/index.js\";\n\nexport function registerAdminRevenueCommand(admin: Command): void {\n const revenue = admin.command(\"revenue\").description(\"Admin revenue reporting\");\n\n revenue\n .command(\"stats\")\n .description(\"Get revenue statistics\")\n .option(\"--start <date>\", \"Start date (ISO 8601)\")\n .option(\"--end <date>\", \"End date (ISO 8601)\")\n .option(\"--product <engineer_kit|marketing_kit|combo>\", \"Filter by product\")\n .option(\"--no-team\", \"Exclude team_* product variants (includeTeam=false)\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const params: Record<string, string> = {};\n if (opts.start) params[\"startDate\"] = opts.start;\n if (opts.end) params[\"endDate\"] = opts.end;\n if (opts.product) {\n if (![\"engineer_kit\", \"marketing_kit\", \"combo\"].includes(opts.product)) {\n throw new CliError(\"--product must be one of: engineer_kit, marketing_kit, combo\");\n }\n params[\"product\"] = opts.product;\n }\n // commander's --no-team sets opts.team = false; only forward when explicitly set\n if (opts.team === false) params[\"includeTeam\"] = \"false\";\n const data = await fetchApi<AdminRevenueStats>(\"GET\", \"/admin/revenue\", { adminAuth: true, params });\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n revenue\n .command(\"export\")\n .description(\"Export revenue data as CSV\")\n .option(\"--start <date>\", \"Start date (ISO 8601)\")\n .option(\"--end <date>\", \"End date (ISO 8601)\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const params: Record<string, string> = {};\n if (opts.start) params[\"startDate\"] = opts.start;\n if (opts.end) params[\"endDate\"] = opts.end;\n const csv = await fetchApi<string>(\"GET\", \"/admin/revenue/export\", { adminAuth: true, params });\n console.log(typeof csv === \"string\" ? csv : JSON.stringify(csv));\n } catch (err) { handleError(err); }\n });\n\n revenue\n .command(\"maintainer\")\n .description(\"Get maintainer revenue breakdown\")\n .requiredOption(\"--id <cke|ckm>\", \"Maintainer ID\")\n .option(\"--start <date>\", \"Start date (ISO 8601)\")\n .option(\"--end <date>\", \"End date (ISO 8601)\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const params: Record<string, string> = { id: opts.id };\n if (opts.start) params[\"startDate\"] = opts.start;\n if (opts.end) params[\"endDate\"] = opts.end;\n const data = await fetchApi<unknown>(\"GET\", \"/admin/revenue/maintainer\", { adminAuth: true, params });\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n revenue\n .command(\"costs\")\n .description(\"Get monthly costs\")\n .option(\"--month <YYYY-MM>\", \"Month in YYYY-MM format\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const params: Record<string, string> = {};\n if (opts.month) params[\"yearMonth\"] = opts.month;\n const data = await fetchApi<unknown>(\"GET\", \"/admin/revenue/monthly-costs\", { adminAuth: true, params });\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n revenue\n .command(\"add-cost\")\n .description(\"Add a monthly cost entry\")\n .requiredOption(\"--month <YYYY-MM>\", \"Month in YYYY-MM format\")\n .requiredOption(\"--category <name>\", \"Cost category\")\n .requiredOption(\"--description <text>\", \"Cost description\")\n .requiredOption(\"--amount <cents>\", \"Amount in cents\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const amount = Number(opts.amount);\n if (Number.isNaN(amount)) throw new CliError(\"--amount must be a valid number\");\n const data = await fetchApi<unknown>(\"POST\", \"/admin/revenue/monthly-costs\", {\n adminAuth: true,\n body: { yearMonth: opts.month, category: opts.category, description: opts.description, amount },\n });\n printSuccess(\"Monthly cost entry added.\");\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n revenue\n .command(\"update-cost <id>\")\n .description(\"Update a monthly cost entry\")\n .option(\"--month <YYYY-MM>\", \"Month in YYYY-MM format\")\n .option(\"--category <name>\", \"Cost category\")\n .option(\"--description <text>\", \"Cost description\")\n .option(\"--amount <cents>\", \"Amount in cents\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"cost ID\");\n const opts = this.opts();\n const body: Record<string, unknown> = {};\n if (opts.month) body[\"yearMonth\"] = opts.month;\n if (opts.category) body[\"category\"] = opts.category;\n if (opts.description) body[\"description\"] = opts.description;\n if (opts.amount !== undefined) {\n const amount = Number(opts.amount);\n if (Number.isNaN(amount)) throw new CliError(\"--amount must be a valid number\");\n body[\"amount\"] = amount;\n }\n const data = await fetchApi<unknown>(\"PUT\", `/admin/revenue/monthly-costs/${id}`, { adminAuth: true, body });\n printSuccess(`Cost entry ${id} updated.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n revenue\n .command(\"delete-cost <id>\")\n .description(\"Delete a monthly cost entry\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"cost ID\");\n const ok = await confirm(`Delete cost entry ${id}? This cannot be undone.`);\n if (!ok) { console.log(\"Aborted.\"); return; }\n await fetchApi<unknown>(\"DELETE\", `/admin/revenue/monthly-costs/${id}`, { adminAuth: true });\n printSuccess(`Cost entry ${id} deleted.`);\n } catch (err) { handleError(err); }\n });\n\n revenue\n .command(\"reports\")\n .description(\"Generate revenue reports\")\n .option(\"--maintainer <cke|ckm|all>\", \"Maintainer ID\")\n .option(\"--month <YYYY-MM>\", \"Month in YYYY-MM format\")\n .option(\"--skip-email\", \"Skip sending email\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const body: Record<string, unknown> = {};\n if (opts.maintainer) body[\"maintainerId\"] = opts.maintainer;\n if (opts.month) body[\"yearMonth\"] = opts.month;\n if (opts.skipEmail) body[\"skipEmail\"] = true;\n const data = await fetchApi<unknown>(\"POST\", \"/admin/revenue/reports\", { adminAuth: true, body });\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../../lib/api-client.js\";\nimport { handleError, validateId, CliError } from \"../../lib/errors.js\";\nimport { ensureAdminAuth } from \"../auth.js\";\nimport { formatOutput, getOutputOpts, printSuccess } from \"../../lib/output.js\";\nimport { confirm } from \"./admin-utils.js\";\nimport type { AdminPayoutRequestItem, TableColumn } from \"../../types/index.js\";\n\nconst PAYOUT_COLUMNS: TableColumn[] = [\n { key: \"id\", header: \"ID\", width: 12 },\n { key: \"userEmail\", header: \"User Email\", width: 28 },\n { key: \"amount\", header: \"Amount\", width: 10 },\n { key: \"currency\", header: \"Currency\", width: 8 },\n { key: \"status\", header: \"Status\", width: 12 },\n { key: \"paymentMethod\", header: \"Method\", width: 14 },\n { key: \"createdAt\", header: \"Created\", width: 22 },\n];\n\nexport function registerAdminPayoutsCommand(admin: Command): void {\n const payouts = admin.command(\"payouts\").description(\"Admin payout management\");\n\n payouts\n .command(\"list\")\n .description(\"List all payout requests\")\n .option(\"--search <text>\", \"Search by user email\")\n .option(\"--status <status>\", \"Filter by status\")\n .option(\"--limit <n>\", \"Page size (default 50, max 100)\")\n .option(\"--offset <n>\", \"Offset for pagination (default 0)\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const params: Record<string, string> = {};\n if (opts.search) params[\"search\"] = opts.search;\n if (opts.status) params[\"status\"] = opts.status;\n if (opts.limit !== undefined) params[\"limit\"] = String(opts.limit);\n if (opts.offset !== undefined) params[\"offset\"] = String(opts.offset);\n const data = await fetchApi<AdminPayoutRequestItem[]>(\"GET\", \"/admin/payout-requests\", { adminAuth: true, params });\n formatOutput(data, getOutputOpts(this), PAYOUT_COLUMNS);\n } catch (err) { handleError(err); }\n });\n\n payouts\n .command(\"update <id>\")\n .description(\"Approve, reject, or complete a payout request\")\n .requiredOption(\"--action <approve|reject|complete>\", \"Action to perform\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"payout request ID\");\n const { action } = this.opts();\n const validActions = [\"approve\", \"reject\", \"complete\"];\n if (!validActions.includes(action)) {\n throw new CliError(`--action must be one of: ${validActions.join(\", \")}`);\n }\n const ok = await confirm(`${action} payout request ${id}?`);\n if (!ok) { console.log(\"Aborted.\"); return; }\n const data = await fetchApi<unknown>(\"PATCH\", `/admin/payout-requests/${id}`, {\n adminAuth: true,\n body: { action },\n });\n printSuccess(`Payout request ${id} updated: ${action}.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n payouts\n .command(\"export\")\n .description(\"Export payouts as CSV\")\n .option(\"--start <date>\", \"Start date (ISO 8601)\")\n .option(\"--end <date>\", \"End date (ISO 8601)\")\n .option(\"--status <status>\", \"Filter by status\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const params: Record<string, string> = {};\n if (opts.start) params[\"startDate\"] = opts.start;\n if (opts.end) params[\"endDate\"] = opts.end;\n if (opts.status) params[\"status\"] = opts.status;\n const csv = await fetchApi<string>(\"GET\", \"/admin/payouts/export\", { adminAuth: true, params });\n console.log(typeof csv === \"string\" ? csv : JSON.stringify(csv));\n } catch (err) { handleError(err); }\n });\n\n payouts\n .command(\"export-detailed\")\n .description(\"Export detailed payouts as CSV\")\n .option(\"--status <status>\", \"Filter by status\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const params: Record<string, string> = {};\n if (opts.status) params[\"status\"] = opts.status;\n const csv = await fetchApi<string>(\"GET\", \"/admin/payouts/export-detailed\", { adminAuth: true, params });\n console.log(typeof csv === \"string\" ? csv : JSON.stringify(csv));\n } catch (err) { handleError(err); }\n });\n\n payouts\n .command(\"request-csv <id>\")\n .description(\"Export a payout request as CSV\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"payout request ID\");\n const csv = await fetchApi<string>(\"GET\", `/admin/payout-requests/${id}/export-csv`, { adminAuth: true });\n console.log(typeof csv === \"string\" ? csv : JSON.stringify(csv));\n } catch (err) { handleError(err); }\n });\n}\n","import { Command } from \"commander\";\nimport * as readline from \"node:readline/promises\";\nimport { fetchApi } from \"../../lib/api-client.js\";\nimport { handleError } from \"../../lib/errors.js\";\nimport { ensureAdminAuth } from \"../auth.js\";\nimport { formatOutput, getOutputOpts, printSuccess } from \"../../lib/output.js\";\nimport type { AdminLoyaltyStats } from \"../../types/index.js\";\n\nasync function confirm(message: string): Promise<boolean> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n try {\n const answer = await rl.question(`${message} [y/N] `);\n return answer.trim().toLowerCase() === \"y\";\n } finally {\n rl.close();\n }\n}\n\nexport function registerAdminLoyaltyCommand(admin: Command): void {\n const loyalty = admin.command(\"loyalty\").description(\"Admin loyalty program management\");\n\n loyalty\n .command(\"stats\")\n .description(\"Get loyalty program statistics\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const data = await fetchApi<AdminLoyaltyStats>(\"GET\", \"/admin/loyalty/stats\", {\n adminAuth: true,\n });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n loyalty\n .command(\"blast-email\")\n .description(\"Send loyalty blast email to eligible users\")\n .option(\"--test\", \"Run in test mode (no confirmation required)\")\n .option(\"--test-email <email>\", \"Send test email to this address\")\n .option(\"--batch-size <n>\", \"Number of emails per batch\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const isTest = opts.test === true;\n\n if (!isTest) {\n const ok = await confirm(\"Send loyalty blast email to all eligible users?\");\n if (!ok) { console.log(\"Aborted.\"); return; }\n }\n\n const body: Record<string, unknown> = { testMode: isTest };\n if (opts.testEmail) body[\"testEmail\"] = opts.testEmail;\n if (opts.batchSize) body[\"batchSize\"] = Number(opts.batchSize);\n\n const data = await fetchApi<unknown>(\"POST\", \"/admin/loyalty/blast-email\", {\n adminAuth: true,\n body,\n });\n printSuccess(\"Loyalty blast email queued.\");\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { readFileSync } from \"node:fs\";\nimport { fetchApi } from \"../../lib/api-client.js\";\nimport { handleError, validateId, CliError } from \"../../lib/errors.js\";\nimport { ensureAdminAuth } from \"../auth.js\";\nimport { formatOutput, getOutputOpts, printSuccess } from \"../../lib/output.js\";\nimport { confirm } from \"./admin-utils.js\";\nimport { registerAdminBlogCategoriesCommand } from \"./admin-blog-categories.js\";\nimport { registerAdminBlogTagsCommand } from \"./admin-blog-tags.js\";\nimport type { Article } from \"../../types/index.js\";\n\nfunction resolveContent(opts: Record<string, string>): string | undefined {\n if (opts.file) {\n try {\n return readFileSync(opts.file, \"utf-8\");\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new CliError(`Cannot read file \"${opts.file}\": ${msg}`);\n }\n }\n return opts.content;\n}\n\nconst ARTICLE_STATUSES = [\"draft\", \"scheduled\", \"published\", \"archived\"] as const;\n\nfunction applySchedulingFields(\n body: Record<string, unknown>,\n opts: { status?: string; scheduledFor?: string },\n): void {\n if (opts.status !== undefined) {\n if (!ARTICLE_STATUSES.includes(opts.status as typeof ARTICLE_STATUSES[number])) {\n throw new CliError(`--status must be one of: ${ARTICLE_STATUSES.join(\", \")}`);\n }\n body[\"status\"] = opts.status;\n }\n if (opts.scheduledFor !== undefined) {\n const d = new Date(opts.scheduledFor);\n if (Number.isNaN(d.getTime())) {\n throw new CliError(`--scheduled-for must be a valid ISO 8601 datetime (got \"${opts.scheduledFor}\")`);\n }\n // Reject contradictory combinations rather than relying on server recovery.\n if (opts.status && opts.status !== \"scheduled\" && opts.status !== \"draft\") {\n throw new CliError(\n `--scheduled-for cannot be combined with --status ${opts.status}; use --status scheduled (or omit --status).`,\n );\n }\n body[\"scheduledFor\"] = d.toISOString();\n }\n}\n\nexport function registerAdminBlogCommand(admin: Command): void {\n const blog = admin.command(\"blog\").description(\"Admin blog management\");\n registerAdminBlogCategoriesCommand(blog);\n\n registerAdminBlogTagsCommand(blog);\n\n blog\n .command(\"create\")\n .description(\"Create a new blog article\")\n .requiredOption(\"--title <title>\", \"Article title\")\n .option(\"--content <content>\", \"Article content (inline)\")\n .option(\"--file <filepath>\", \"Read content from file\")\n .option(\"--status <draft|scheduled|published|archived>\", \"Article status\")\n .option(\"--scheduled-for <iso-date>\", \"Publish at this ISO 8601 datetime\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const content = resolveContent(opts);\n const body: Record<string, unknown> = { title: opts.title, content };\n applySchedulingFields(body, { status: opts.status, scheduledFor: opts.scheduledFor });\n const data = await fetchApi<Article>(\"POST\", \"/blog/articles\", {\n adminAuth: true,\n body,\n });\n printSuccess(\"Article created.\");\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n blog\n .command(\"update <id>\")\n .description(\"Update an existing blog article\")\n .option(\"--title <title>\", \"New title\")\n .option(\"--content <content>\", \"New content (inline)\")\n .option(\"--file <filepath>\", \"Read new content from file\")\n .option(\"--status <draft|scheduled|published|archived>\", \"Article status\")\n .option(\"--scheduled-for <iso-date>\", \"Publish at this ISO 8601 datetime\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"article ID\");\n const opts = this.opts();\n const content = resolveContent(opts);\n const body: Record<string, unknown> = {};\n if (opts.title) body[\"title\"] = opts.title;\n if (content !== undefined) body[\"content\"] = content;\n applySchedulingFields(body, { status: opts.status, scheduledFor: opts.scheduledFor });\n\n const data = await fetchApi<Article>(\"PATCH\", `/blog/articles/${id}`, {\n adminAuth: true,\n body,\n });\n printSuccess(`Article ${id} updated.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n blog\n .command(\"delete <id>\")\n .description(\"Delete a blog article\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"article ID\");\n const ok = await confirm(`Delete article ${id}? This cannot be undone.`);\n if (!ok) { console.log(\"Aborted.\"); return; }\n\n await fetchApi<unknown>(\"DELETE\", `/blog/articles/${id}`, { adminAuth: true });\n printSuccess(`Article ${id} deleted.`);\n } catch (err) {\n handleError(err);\n }\n });\n\n blog\n .command(\"publish <id>\")\n .description(\"Publish a blog article\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"article ID\");\n const ok = await confirm(`Publish article ${id}?`);\n if (!ok) { console.log(\"Aborted.\"); return; }\n\n const data = await fetchApi<Article>(\"POST\", `/blog/articles/${id}/publish`, {\n adminAuth: true,\n });\n printSuccess(`Article ${id} published.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n blog\n .command(\"ai-generate\")\n .description(\"Generate a blog article using AI\")\n .requiredOption(\"--prompt <text>\", \"Generation prompt\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const { prompt } = this.opts();\n const data = await fetchApi<unknown>(\"POST\", \"/blog/ai/generate\", {\n adminAuth: true,\n body: { prompt },\n });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n blog\n .command(\"ai-transform\")\n .description(\"Transform text using AI\")\n .requiredOption(\"--text <text>\", \"Source text to transform\")\n .requiredOption(\"--instruction <text>\", \"Transformation instruction\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const { text, instruction } = this.opts();\n const data = await fetchApi<unknown>(\"POST\", \"/blog/ai/transform\", {\n adminAuth: true,\n body: { text, instruction },\n });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n blog\n .command(\"generate-metadata <id>\")\n .description(\"Generate SEO metadata for an article\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"article ID\");\n const data = await fetchApi<unknown>(\"POST\", \"/blog/generate-metadata\", {\n adminAuth: true,\n body: { articleId: id },\n });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n blog\n .command(\"upload-url\")\n .description(\"Get a presigned URL for blog asset upload\")\n .requiredOption(\"--filename <name>\", \"File name to upload\")\n .requiredOption(\"--content-type <type>\", \"MIME type of the file\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const data = await fetchApi<unknown>(\"POST\", \"/blog/upload/presigned-url\", {\n adminAuth: true,\n body: { filename: opts.filename, contentType: opts.contentType },\n });\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n blog\n .command(\"run-scheduler\")\n .description(\"Manually trigger the blog article scheduler\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const data = await fetchApi<unknown>(\"POST\", \"/blog/scheduler\", { adminAuth: true });\n printSuccess(\"Scheduler executed.\");\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n blog\n .command(\"export\")\n .description(\"Export blog articles as CSV\")\n .option(\"--start <date>\", \"Start date (ISO 8601)\")\n .option(\"--end <date>\", \"End date (ISO 8601)\")\n .option(\"--status <status>\", \"Filter by status\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const params: Record<string, string> = {};\n if (opts.start) params[\"startDate\"] = opts.start;\n if (opts.end) params[\"endDate\"] = opts.end;\n if (opts.status) params[\"status\"] = opts.status;\n const csv = await fetchApi<string>(\"GET\", \"/admin/blog/export\", { adminAuth: true, params });\n console.log(typeof csv === \"string\" ? csv : JSON.stringify(csv));\n } catch (err) { handleError(err); }\n });\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../../lib/api-client.js\";\nimport { handleError, validateId, CliError } from \"../../lib/errors.js\";\nimport { ensureAdminAuth } from \"../auth.js\";\nimport { formatOutput, getOutputOpts, printSuccess } from \"../../lib/output.js\";\nimport { confirm } from \"./admin-utils.js\";\n\ninterface Category {\n id: string;\n name: string;\n slug: string;\n description: string | null;\n parentId: string | null;\n createdAt: string;\n}\n\nconst CATEGORY_COLUMNS = [\n { key: \"id\", header: \"ID\", width: 36 },\n { key: \"name\", header: \"Name\", width: 24 },\n { key: \"slug\", header: \"Slug\", width: 24 },\n { key: \"parentId\", header: \"Parent\", width: 36 },\n];\n\nexport function registerAdminBlogCategoriesCommand(blog: Command): void {\n const categories = blog.command(\"categories\").description(\"Manage blog categories\");\n\n categories\n .command(\"list\")\n .description(\"List blog categories\")\n .option(\"--query <text>\", \"Filter by name or slug\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const params: Record<string, string> = {};\n if (opts.query) params[\"query\"] = opts.query;\n const data = await fetchApi<{ items: Category[] }>(\"GET\", \"/admin/blog/categories\", {\n adminAuth: true,\n params,\n });\n formatOutput(data.items, getOutputOpts(this), CATEGORY_COLUMNS);\n } catch (err) { handleError(err); }\n });\n\n categories\n .command(\"get <id>\")\n .description(\"Get a blog category by ID\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"category ID\");\n const data = await fetchApi<{ category: Category }>(\"GET\", `/admin/blog/categories/${id}`, {\n adminAuth: true,\n });\n formatOutput(data.category, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n categories\n .command(\"create\")\n .description(\"Create a blog category\")\n .requiredOption(\"--name <name>\", \"Category name\")\n .option(\"--slug <slug>\", \"Slug (auto-derived from name if omitted)\")\n .option(\"--description <text>\", \"Description\")\n .option(\"--parent <id>\", \"Parent category ID\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const body: Record<string, unknown> = { name: opts.name };\n if (opts.slug) body[\"slug\"] = opts.slug;\n if (opts.description) body[\"description\"] = opts.description;\n if (opts.parent) body[\"parentId\"] = opts.parent;\n const data = await fetchApi<{ category: Category }>(\"POST\", \"/admin/blog/categories\", {\n adminAuth: true,\n body,\n });\n printSuccess(`Category \"${data.category.name}\" created (${data.category.id}).`);\n formatOutput(data.category, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n categories\n .command(\"update <id>\")\n .description(\"Update a blog category\")\n .option(\"--name <name>\", \"New name\")\n .option(\"--slug <slug>\", \"New slug\")\n .option(\"--description <text>\", \"New description\")\n .option(\"--parent <id>\", \"New parent category ID ('none' to clear)\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"category ID\");\n const opts = this.opts();\n const body: Record<string, unknown> = {};\n if (opts.name !== undefined) body[\"name\"] = opts.name;\n if (opts.slug !== undefined) body[\"slug\"] = opts.slug;\n if (opts.description !== undefined) body[\"description\"] = opts.description;\n if (opts.parent !== undefined) body[\"parentId\"] = opts.parent === \"none\" ? null : opts.parent;\n if (Object.keys(body).length === 0) {\n throw new CliError(\"At least one field (--name, --slug, --description, --parent) is required.\");\n }\n const data = await fetchApi<{ category: Category }>(\"PATCH\", `/admin/blog/categories/${id}`, {\n adminAuth: true,\n body,\n });\n printSuccess(`Category ${id} updated.`);\n formatOutput(data.category, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n categories\n .command(\"delete <id>\")\n .description(\"Delete a blog category (refuses if articles or child categories reference it)\")\n .option(\"--force\", \"Disassociate articles before deleting (still refuses if children exist)\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"category ID\");\n const opts = this.opts();\n const ok = await confirm(`Delete category ${id}${opts.force ? \" (force)\" : \"\"}? This cannot be undone.`);\n if (!ok) { console.log(\"Aborted.\"); return; }\n const params: Record<string, string> = {};\n if (opts.force) params[\"force\"] = \"true\";\n const data = await fetchApi<unknown>(\"DELETE\", `/admin/blog/categories/${id}`, {\n adminAuth: true,\n params,\n });\n printSuccess(`Category ${id} deleted.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n // Article ↔ category association\n const articleCats = blog.command(\"article-categories\").description(\"Manage article-category associations\");\n\n articleCats\n .command(\"add\")\n .description(\"Attach a category to an article\")\n .requiredOption(\"--article <id>\", \"Article ID\")\n .requiredOption(\"--category <id>\", \"Category ID\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n validateId(opts.article, \"article ID\");\n validateId(opts.category, \"category ID\");\n const data = await fetchApi<{ attached: boolean; alreadyExisted: boolean }>(\n \"POST\",\n `/admin/blog/articles/${opts.article}/categories/${opts.category}`,\n { adminAuth: true },\n );\n if (data.alreadyExisted) {\n console.log(\"Association already exists.\");\n } else {\n printSuccess(`Category ${opts.category} attached to article ${opts.article}.`);\n }\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n articleCats\n .command(\"remove\")\n .description(\"Detach a category from an article\")\n .requiredOption(\"--article <id>\", \"Article ID\")\n .requiredOption(\"--category <id>\", \"Category ID\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n validateId(opts.article, \"article ID\");\n validateId(opts.category, \"category ID\");\n const data = await fetchApi<{ detached: boolean }>(\n \"DELETE\",\n `/admin/blog/articles/${opts.article}/categories/${opts.category}`,\n { adminAuth: true },\n );\n if (data.detached) {\n printSuccess(`Category ${opts.category} detached from article ${opts.article}.`);\n } else {\n console.log(\"No association existed.\");\n }\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../../lib/api-client.js\";\nimport { handleError, validateId, CliError } from \"../../lib/errors.js\";\nimport { ensureAdminAuth } from \"../auth.js\";\nimport { formatOutput, getOutputOpts, printSuccess } from \"../../lib/output.js\";\nimport { confirm } from \"./admin-utils.js\";\n\nexport function registerAdminBlogTagsCommand(blog: Command): void {\n blog\n .command(\"tags\")\n .description(\"List blog tags\")\n .option(\"--query <text>\", \"Search by name or slug\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const params: Record<string, string> = {};\n if (opts.query) params[\"query\"] = opts.query;\n const data = await fetchApi<unknown>(\"GET\", \"/admin/blog/tags\", { adminAuth: true, params });\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n blog\n .command(\"tag-get <id>\")\n .description(\"Get a blog tag by id\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"tag ID\");\n const data = await fetchApi<unknown>(\"GET\", `/admin/blog/tags/${id}`, { adminAuth: true });\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n blog\n .command(\"tag-create\")\n .description(\"Create a blog tag\")\n .requiredOption(\"--name <name>\", \"Tag name\")\n .option(\"--slug <slug>\", \"Tag slug (auto-generated if omitted)\")\n .option(\"--description <text>\", \"Tag description\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const body: Record<string, unknown> = { name: opts.name };\n if (opts.slug) body[\"slug\"] = opts.slug;\n if (opts.description) body[\"description\"] = opts.description;\n const data = await fetchApi<unknown>(\"POST\", \"/admin/blog/tags\", {\n adminAuth: true,\n body,\n });\n printSuccess(\"Tag created.\");\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n blog\n .command(\"tag-update <id>\")\n .description(\"Update a blog tag\")\n .option(\"--name <name>\", \"New name\")\n .option(\"--slug <slug>\", \"New slug\")\n .option(\"--description <text>\", \"New description\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"tag ID\");\n const opts = this.opts();\n const body: Record<string, unknown> = {};\n if (opts.name !== undefined) body[\"name\"] = opts.name;\n if (opts.slug !== undefined) body[\"slug\"] = opts.slug;\n if (opts.description !== undefined) body[\"description\"] = opts.description;\n if (Object.keys(body).length === 0) {\n throw new CliError(\"Provide at least one of --name, --slug, --description.\");\n }\n const data = await fetchApi<unknown>(\"PATCH\", `/admin/blog/tags/${id}`, {\n adminAuth: true,\n body,\n });\n printSuccess(`Tag ${id} updated.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n blog\n .command(\"tag-delete <id>\")\n .description(\"Delete a blog tag\")\n .option(\"--force\", \"Force delete even if articles are associated (detaches them)\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"tag ID\");\n const opts = this.opts();\n const ok = await confirm(`Delete tag ${id}${opts.force ? \" (force)\" : \"\"}? This cannot be undone.`);\n if (!ok) { console.log(\"Aborted.\"); return; }\n const params: Record<string, string> = {};\n if (opts.force) params[\"force\"] = \"true\";\n await fetchApi<unknown>(\"DELETE\", `/admin/blog/tags/${id}`, { adminAuth: true, params });\n printSuccess(`Tag ${id} deleted.`);\n } catch (err) { handleError(err); }\n });\n\n blog\n .command(\"article-tag-add <articleId> <tagId>\")\n .description(\"Attach a tag to an article\")\n .action(async function (this: Command, articleId: string, tagId: string) {\n try {\n ensureAdminAuth();\n validateId(articleId, \"article ID\");\n validateId(tagId, \"tag ID\");\n const data = await fetchApi<unknown>(\n \"POST\",\n `/admin/blog/articles/${articleId}/tags/${tagId}`,\n { adminAuth: true },\n );\n printSuccess(`Tag ${tagId} attached to article ${articleId}.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n blog\n .command(\"article-tag-remove <articleId> <tagId>\")\n .description(\"Detach a tag from an article\")\n .action(async function (this: Command, articleId: string, tagId: string) {\n try {\n ensureAdminAuth();\n validateId(articleId, \"article ID\");\n validateId(tagId, \"tag ID\");\n const data = await fetchApi<unknown>(\n \"DELETE\",\n `/admin/blog/articles/${articleId}/tags/${tagId}`,\n { adminAuth: true },\n );\n printSuccess(`Tag ${tagId} detached from article ${articleId}.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { fetchApi } from \"../../lib/api-client.js\";\nimport { handleError, validateId } from \"../../lib/errors.js\";\nimport { ensureAdminAuth } from \"../auth.js\";\nimport { formatOutput, getOutputOpts, printSuccess } from \"../../lib/output.js\";\nimport { confirm } from \"./admin-utils.js\";\nimport type { TableColumn } from \"../../types/index.js\";\n\nconst KEY_COLUMNS: TableColumn[] = [\n { key: \"id\", header: \"ID\", width: 12 },\n { key: \"name\", header: \"Name\", width: 20 },\n { key: \"scopes\", header: \"Scopes\", width: 30 },\n { key: \"createdAt\", header: \"Created\", width: 22 },\n];\n\nexport function registerAdminKeysCommand(admin: Command): void {\n const keys = admin.command(\"keys\").description(\"Admin API key management\");\n\n keys\n .command(\"list\")\n .description(\"List all API keys\")\n .option(\"--limit <n>\", \"Number of results\", \"50\")\n .option(\"--offset <n>\", \"Offset for pagination\", \"0\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const limit = Number(opts.limit);\n const offset = Number(opts.offset);\n if (Number.isNaN(limit) || limit < 1) throw new Error(\"--limit must be a positive number\");\n if (Number.isNaN(offset) || offset < 0) throw new Error(\"--offset must be a non-negative number\");\n\n const data = await fetchApi<unknown[]>(\"GET\", \"/admin/keys\", {\n adminAuth: true,\n params: { limit: String(limit), offset: String(offset) },\n });\n formatOutput(data, getOutputOpts(this), KEY_COLUMNS);\n } catch (err) {\n handleError(err);\n }\n });\n\n keys\n .command(\"search <query>\")\n .description(\"Search API keys by name or scope\")\n .option(\"--limit <n>\", \"Number of results\", \"50\")\n .option(\"--offset <n>\", \"Offset for pagination\", \"0\")\n .action(async function (this: Command, query: string) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const limit = Number(opts.limit);\n const offset = Number(opts.offset);\n if (Number.isNaN(limit) || limit < 1) throw new Error(\"--limit must be a positive number\");\n if (Number.isNaN(offset) || offset < 0) throw new Error(\"--offset must be a non-negative number\");\n const data = await fetchApi<unknown[]>(\"GET\", \"/admin/keys\", {\n adminAuth: true,\n params: { search: query, limit: String(limit), offset: String(offset) },\n });\n formatOutput(data, getOutputOpts(this), KEY_COLUMNS);\n } catch (err) { handleError(err); }\n });\n\n keys\n .command(\"create\")\n .description(\"Create a new API key\")\n .requiredOption(\"--name <name>\", \"Key name\")\n .requiredOption(\"--scopes <scopes>\", \"Comma-separated list of scopes\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const { name, scopes } = this.opts();\n const data = await fetchApi<unknown>(\"POST\", \"/admin/keys\", {\n adminAuth: true,\n body: { name, scopes: scopes.split(\",\").map((s: string) => s.trim()) },\n });\n printSuccess(`API key \"${name}\" created.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n keys\n .command(\"validate\")\n .description(\"Validate the current admin API key\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const data = await fetchApi<unknown>(\"POST\", \"/admin/keys/validate\", {\n adminAuth: true,\n });\n printSuccess(\"Admin API key is valid.\");\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n keys\n .command(\"revoke <id>\")\n .description(\"Revoke an API key\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"key ID\");\n\n const ok = await confirm(`Revoke API key ${id}?`);\n if (!ok) { console.log(\"Aborted.\"); return; }\n\n const data = await fetchApi<unknown>(\"POST\", `/admin/keys/${id}/revoke`, {\n adminAuth: true,\n });\n printSuccess(`API key ${id} revoked.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n keys\n .command(\"rotate <id>\")\n .description(\"Rotate an API key (generates a new key value)\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"key ID\");\n\n const ok = await confirm(`Rotate API key ${id}? The old key will be invalidated.`);\n if (!ok) { console.log(\"Aborted.\"); return; }\n\n const data = await fetchApi<{ key?: string }>(\"POST\", `/admin/keys/${id}/rotate`, {\n adminAuth: true,\n });\n printSuccess(`API key ${id} rotated.`);\n if (data && typeof data === \"object\" && \"key\" in data && data.key) {\n console.log(chalk.bold.green(`New key: ${data.key}`));\n console.log(chalk.yellow(\"Store this key securely — it will not be shown again.\"));\n } else {\n formatOutput(data, getOutputOpts(this));\n }\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../../lib/api-client.js\";\nimport { handleError, validateId, CliError } from \"../../lib/errors.js\";\nimport { ensureAdminAuth } from \"../auth.js\";\nimport { formatOutput, getOutputOpts, printSuccess } from \"../../lib/output.js\";\nimport { confirm } from \"./admin-utils.js\";\nimport type { TableColumn } from \"../../types/index.js\";\n\nconst INVITE_COLUMNS: TableColumn[] = [\n { key: \"id\", header: \"ID\", width: 12 },\n { key: \"email\", header: \"Email\", width: 28 },\n { key: \"status\", header: \"Status\", width: 10 },\n { key: \"createdAt\", header: \"Created\", width: 22 },\n];\n\nexport function registerAdminInvitesCommand(admin: Command): void {\n const invites = admin.command(\"invites\").description(\"Admin invite management\");\n\n invites\n .command(\"list\")\n .description(\"List all invites\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const data = await fetchApi<unknown[]>(\"GET\", \"/admin/invites\", {\n adminAuth: true,\n });\n formatOutput(data, getOutputOpts(this), INVITE_COLUMNS);\n } catch (err) {\n handleError(err);\n }\n });\n\n invites\n .command(\"search <query>\")\n .description(\"Search invites by email\")\n .option(\"--limit <n>\", \"Number of results\", \"50\")\n .option(\"--offset <n>\", \"Offset for pagination\", \"0\")\n .action(async function (this: Command, query: string) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const limit = Number(opts.limit);\n const offset = Number(opts.offset);\n if (Number.isNaN(limit) || limit < 1) throw new CliError(\"--limit must be a positive integer\");\n if (Number.isNaN(offset) || offset < 0) throw new CliError(\"--offset must be a non-negative integer\");\n const data = await fetchApi<unknown>(\"GET\", \"/admin/invites\", {\n adminAuth: true,\n params: { search: query, limit: String(limit), offset: String(offset) },\n });\n formatOutput(data, getOutputOpts(this), INVITE_COLUMNS);\n } catch (err) { handleError(err); }\n });\n\n invites\n .command(\"create\")\n .description(\"Create a new invite\")\n .requiredOption(\"--email <email>\", \"Email address to invite\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const { email } = this.opts();\n const data = await fetchApi<unknown>(\"POST\", \"/admin/invites\", {\n adminAuth: true,\n body: { email },\n });\n printSuccess(`Invite sent to ${email}.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n invites\n .command(\"get <id>\")\n .description(\"Get invite details\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"invite ID\");\n const data = await fetchApi<unknown>(\"GET\", `/admin/invites/${id}`, {\n adminAuth: true,\n });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n invites\n .command(\"delete <id>\")\n .description(\"Delete an invite\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"invite ID\");\n\n const ok = await confirm(`Delete invite ${id}?`);\n if (!ok) { console.log(\"Aborted.\"); return; }\n\n const data = await fetchApi<unknown>(\"DELETE\", `/admin/invites/${id}`, {\n adminAuth: true,\n });\n printSuccess(`Invite ${id} deleted.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n invites\n .command(\"resend <id>\")\n .description(\"Resend an invite email\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"invite ID\");\n\n const ok = await confirm(`Resend invite ${id}?`);\n if (!ok) { console.log(\"Aborted.\"); return; }\n\n const data = await fetchApi<unknown>(\"POST\", `/admin/invites/${id}/resend`, {\n adminAuth: true,\n });\n printSuccess(`Invite ${id} resent.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n invites\n .command(\"accept\")\n .description(\"Accept an invite (public endpoint)\")\n .requiredOption(\"--token <token>\", \"Invite token\")\n .option(\"--name <name>\", \"Display name (optional)\")\n .action(async function (this: Command) {\n try {\n const { token, name } = this.opts();\n const body: Record<string, string> = { token };\n if (name) body[\"name\"] = name;\n\n const data = await fetchApi<unknown>(\"POST\", \"/admin/invites/accept\", {\n noAuth: true,\n body,\n });\n printSuccess(\"Invite accepted.\");\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n invites\n .command(\"validate\")\n .description(\"Validate an invite token (public endpoint)\")\n .requiredOption(\"--token <token>\", \"Invite token\")\n .action(async function (this: Command) {\n try {\n const { token } = this.opts();\n const data = await fetchApi<unknown>(\"GET\", \"/admin/invites/validate\", {\n noAuth: true,\n params: { token },\n });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../../lib/api-client.js\";\nimport { handleError, validateId } from \"../../lib/errors.js\";\nimport { ensureAdminAuth } from \"../auth.js\";\nimport { formatOutput, getOutputOpts, printSuccess } from \"../../lib/output.js\";\nimport { confirm } from \"./admin-utils.js\";\n\nexport function registerAdminLicensesCommand(admin: Command): void {\n const licenses = admin.command(\"licenses\").description(\"Admin license management\");\n\n licenses\n .command(\"update-github <licenseId>\")\n .description(\"Change the GitHub username for a single license (admin override)\")\n .requiredOption(\"--username <name>\", \"New GitHub username\")\n .option(\"--skip-revoke\", \"Skip revoking the previous collaborator\", false)\n .action(async function (this: Command, licenseId: string) {\n try {\n ensureAdminAuth();\n validateId(licenseId, \"license ID\");\n const { username, skipRevoke } = this.opts();\n const ok = await confirm(\n `Change GitHub username on license ${licenseId} to \"${username}\"?${skipRevoke ? \" (skip revoke)\" : \"\"}`,\n );\n if (!ok) { console.log(\"Aborted.\"); return; }\n const body: Record<string, unknown> = { githubUsername: username };\n if (skipRevoke) body[\"skipRevoke\"] = true;\n const data = await fetchApi<unknown>(\"PATCH\", `/admin/licenses/${licenseId}/github-username`, {\n adminAuth: true,\n body,\n });\n printSuccess(`License ${licenseId} GitHub username updated to ${username}.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../../lib/api-client.js\";\nimport { handleError, validateId, CliError } from \"../../lib/errors.js\";\nimport { ensureAdminAuth } from \"../auth.js\";\nimport { formatOutput, getOutputOpts, printSuccess } from \"../../lib/output.js\";\nimport { confirm } from \"./admin-utils.js\";\n\nexport function registerAdminAdminsCommand(admin: Command): void {\n const admins = admin.command(\"admins\").description(\"Admin role management\");\n\n admins\n .command(\"list\")\n .description(\"List all admins\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const data = await fetchApi<unknown[]>(\"GET\", \"/admin/admins\", {\n adminAuth: true,\n });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n admins\n .command(\"search <query>\")\n .description(\"Search admins by email or name\")\n .option(\"--limit <n>\", \"Number of results\", \"50\")\n .option(\"--offset <n>\", \"Offset for pagination\", \"0\")\n .action(async function (this: Command, query: string) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const limit = Number(opts.limit);\n const offset = Number(opts.offset);\n if (Number.isNaN(limit) || limit < 1) throw new CliError(\"--limit must be a positive integer\");\n if (Number.isNaN(offset) || offset < 0) throw new CliError(\"--offset must be a non-negative integer\");\n const data = await fetchApi<unknown>(\"GET\", \"/admin/admins\", {\n adminAuth: true,\n params: { search: query, limit: String(limit), offset: String(offset) },\n });\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n admins\n .command(\"get <id>\")\n .description(\"Get admin details\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"admin ID\");\n const data = await fetchApi<unknown>(\"GET\", `/admin/admins/${id}`, {\n adminAuth: true,\n });\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n admins\n .command(\"promote <id>\")\n .description(\"Promote a user to admin\")\n .option(\"--grant-all\", \"Grant all permissions\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"user ID\");\n const opts = this.opts();\n\n const ok = await confirm(`Promote user ${id} to admin?`);\n if (!ok) { console.log(\"Aborted.\"); return; }\n\n const data = await fetchApi<unknown>(\"POST\", `/admin/admins/${id}/promote`, {\n adminAuth: true,\n body: { grantAllPermissions: opts.grantAll || false },\n });\n printSuccess(`User ${id} promoted to admin.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n admins\n .command(\"demote <id>\")\n .description(\"Remove admin access from a user\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"admin ID\");\n\n const ok = await confirm(\n `Demote admin ${id}? WARNING: this removes all admin access.`\n );\n if (!ok) { console.log(\"Aborted.\"); return; }\n\n const data = await fetchApi<unknown>(\"DELETE\", `/admin/admins/${id}`, {\n adminAuth: true,\n });\n printSuccess(`Admin ${id} demoted.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n admins\n .command(\"permissions <id>\")\n .description(\"Update admin permissions\")\n .requiredOption(\"--permissions <json>\", \"JSON array of permission strings\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"admin ID\");\n const { permissions: permissionsJson } = this.opts();\n\n let permissions: unknown;\n try {\n permissions = JSON.parse(permissionsJson);\n } catch {\n throw new CliError(\"--permissions must be valid JSON (e.g. '[\\\"read\\\",\\\"write\\\"]')\");\n }\n\n if (!Array.isArray(permissions)) {\n throw new CliError(\"--permissions must be a JSON array\");\n }\n\n const data = await fetchApi<unknown>(\"PATCH\", `/admin/admins/${id}/permissions`, {\n adminAuth: true,\n body: { permissions },\n });\n printSuccess(`Permissions updated for admin ${id}.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../../lib/api-client.js\";\nimport { handleError, validateId, CliError } from \"../../lib/errors.js\";\nimport { ensureAdminAuth } from \"../auth.js\";\nimport { formatOutput, getOutputOpts, printSuccess } from \"../../lib/output.js\";\nimport { confirm } from \"./admin-utils.js\";\nimport type { TableColumn } from \"../../types/index.js\";\n\nconst DISCOUNT_COLUMNS: TableColumn[] = [\n { key: \"id\", header: \"ID\", width: 12 },\n { key: \"code\", header: \"Code\", width: 20 },\n { key: \"type\", header: \"Type\", width: 12 },\n { key: \"amount\", header: \"Amount\", width: 10 },\n { key: \"status\", header: \"Status\", width: 10 },\n { key: \"createdAt\", header: \"Created\", width: 22 },\n];\n\n/** Build a discount body from CLI opts, omitting undefined fields */\nfunction buildDiscountBody(opts: {\n code?: string;\n type?: string;\n amount?: string;\n basisPoints?: string;\n maxRedemptions?: string;\n starts?: string;\n ends?: string;\n}): Record<string, unknown> {\n const body: Record<string, unknown> = {};\n if (opts.code !== undefined) body[\"code\"] = opts.code;\n if (opts.type !== undefined) {\n if (opts.type !== \"percentage\" && opts.type !== \"fixed\") {\n throw new CliError(\"--type must be 'percentage' or 'fixed'\");\n }\n body[\"type\"] = opts.type;\n }\n if (opts.amount !== undefined) {\n const val = Number(opts.amount);\n if (Number.isNaN(val) || val < 0) throw new CliError(\"--amount must be a non-negative number (cents)\");\n body[\"amount\"] = val;\n }\n if (opts.basisPoints !== undefined) {\n const val = Number(opts.basisPoints);\n if (Number.isNaN(val) || val < 0) throw new CliError(\"--basis-points must be a non-negative number\");\n body[\"basisPoints\"] = val;\n }\n if (opts.maxRedemptions !== undefined) {\n const val = Number(opts.maxRedemptions);\n if (Number.isNaN(val) || val < 1) throw new CliError(\"--max-redemptions must be a positive integer\");\n body[\"maxRedemptions\"] = val;\n }\n if (opts.starts !== undefined) body[\"startsAt\"] = opts.starts;\n if (opts.ends !== undefined) body[\"endsAt\"] = opts.ends;\n return body;\n}\n\nexport function registerAdminDiscountsCommand(admin: Command): void {\n const discounts = admin.command(\"discounts\").description(\"Discount management\");\n\n discounts\n .command(\"list\")\n .description(\"List discounts\")\n .option(\"--query <search>\", \"Search query\")\n .option(\"--page <n>\", \"Page number\", \"1\")\n .option(\"--limit <n>\", \"Results per page\", \"50\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const page = Number(opts.page);\n const limit = Number(opts.limit);\n if (Number.isNaN(page) || page < 1) throw new CliError(\"--page must be a positive integer\");\n if (Number.isNaN(limit) || limit < 1) throw new CliError(\"--limit must be a positive integer\");\n\n const params: Record<string, string> = {\n page: String(page),\n limit: String(limit),\n };\n if (opts.query) params[\"search\"] = opts.query;\n\n const data = await fetchApi<unknown[]>(\"GET\", \"/admin/discounts\", {\n adminAuth: true,\n params,\n });\n formatOutput(data, getOutputOpts(this), DISCOUNT_COLUMNS);\n } catch (err) {\n handleError(err);\n }\n });\n\n discounts\n .command(\"search <query>\")\n .description(\"Search discounts by code or description\")\n .option(\"--page <n>\", \"Page number\", \"1\")\n .option(\"--limit <n>\", \"Results per page\", \"50\")\n .action(async function (this: Command, query: string) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const page = Number(opts.page);\n const limit = Number(opts.limit);\n if (Number.isNaN(page) || page < 1) throw new CliError(\"--page must be a positive integer\");\n if (Number.isNaN(limit) || limit < 1) throw new CliError(\"--limit must be a positive integer\");\n const params: Record<string, string> = {\n search: query,\n page: String(page),\n limit: String(limit),\n };\n const data = await fetchApi<unknown[]>(\"GET\", \"/admin/discounts\", { adminAuth: true, params });\n formatOutput(data, getOutputOpts(this), DISCOUNT_COLUMNS);\n } catch (err) { handleError(err); }\n });\n\n discounts\n .command(\"create\")\n .description(\"Create a discount code\")\n .requiredOption(\"--code <code>\", \"Discount code\")\n .requiredOption(\"--type <percentage|fixed>\", \"Discount type\")\n .option(\"--amount <n>\", \"Amount in cents (fixed type)\")\n .option(\"--basis-points <n>\", \"Basis points (percentage type)\")\n .option(\"--max-redemptions <n>\", \"Maximum number of redemptions\")\n .option(\"--starts <date>\", \"Start date (ISO 8601)\")\n .option(\"--ends <date>\", \"End date (ISO 8601)\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const body = buildDiscountBody(this.opts());\n const data = await fetchApi<unknown>(\"POST\", \"/admin/discounts\", {\n adminAuth: true,\n body,\n });\n printSuccess(`Discount \"${body[\"code\"]}\" created.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n discounts\n .command(\"update <id>\")\n .description(\"Update a discount code\")\n .option(\"--code <code>\", \"Discount code\")\n .option(\"--type <percentage|fixed>\", \"Discount type\")\n .option(\"--amount <n>\", \"Amount in cents (fixed type)\")\n .option(\"--basis-points <n>\", \"Basis points (percentage type)\")\n .option(\"--max-redemptions <n>\", \"Maximum number of redemptions\")\n .option(\"--starts <date>\", \"Start date (ISO 8601)\")\n .option(\"--ends <date>\", \"End date (ISO 8601)\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"discount ID\");\n const body = buildDiscountBody(this.opts());\n if (Object.keys(body).length === 0) {\n throw new CliError(\"At least one option must be provided to update.\");\n }\n const data = await fetchApi<unknown>(\"PATCH\", `/admin/discounts/${id}`, {\n adminAuth: true,\n body,\n });\n printSuccess(`Discount ${id} updated.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n discounts\n .command(\"delete <id>\")\n .description(\"Delete a discount code\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"discount ID\");\n\n const ok = await confirm(`Delete discount ${id}?`);\n if (!ok) { console.log(\"Aborted.\"); return; }\n\n const data = await fetchApi<unknown>(\"DELETE\", `/admin/discounts/${id}`, {\n adminAuth: true,\n });\n printSuccess(`Discount ${id} deleted.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) {\n handleError(err);\n }\n });\n\n discounts\n .command(\"sync-status\")\n .description(\"Show Polar sync stats for all discounts\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const data = await fetchApi<unknown>(\"GET\", \"/admin/discounts/sync-status\", { adminAuth: true });\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n discounts\n .command(\"export\")\n .description(\"Export discounts as CSV\")\n .option(\"--start <date>\", \"Start date filter (ISO 8601)\")\n .option(\"--end <date>\", \"End date filter (ISO 8601)\")\n .option(\"--status <all|active|expired>\", \"Filter by status\", \"all\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const params: Record<string, string> = { status: opts.status };\n if (opts.start) params[\"startDate\"] = opts.start;\n if (opts.end) params[\"endDate\"] = opts.end;\n\n // api-client returns raw text for non-JSON responses\n const data = await fetchApi<string>(\"GET\", \"/admin/discounts/export\", {\n adminAuth: true,\n params,\n });\n console.log(data);\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../../lib/api-client.js\";\nimport { handleError, validateId, CliError } from \"../../lib/errors.js\";\nimport { ensureAdminAuth } from \"../auth.js\";\nimport { formatOutput, getOutputOpts, printSuccess } from \"../../lib/output.js\";\nimport { confirm } from \"./admin-utils.js\";\nimport type { TableColumn } from \"../../types/index.js\";\n\nconst GROUP_COLUMNS: TableColumn[] = [\n { key: \"id\", header: \"ID\", width: 12 },\n { key: \"name\", header: \"Name\", width: 24 },\n { key: \"prefix\", header: \"Prefix\", width: 12 },\n { key: \"type\", header: \"Type\", width: 12 },\n { key: \"codesGenerated\", header: \"Generated\", width: 10 },\n { key: \"codesUsed\", header: \"Used\", width: 8 },\n { key: \"createdAt\", header: \"Created\", width: 22 },\n];\n\nfunction buildGroupBody(opts: Record<string, string | undefined>): Record<string, unknown> {\n const body: Record<string, unknown> = {};\n if (opts.name !== undefined) body[\"name\"] = opts.name;\n if (opts.prefix !== undefined) body[\"prefix\"] = opts.prefix;\n if (opts.type !== undefined) {\n if (opts.type !== \"percentage\" && opts.type !== \"fixed\") {\n throw new CliError(\"--type must be 'percentage' or 'fixed'\");\n }\n body[\"type\"] = opts.type;\n }\n if (opts.amount !== undefined) {\n const v = Number(opts.amount);\n if (Number.isNaN(v) || v < 0) throw new CliError(\"--amount must be a non-negative number (cents)\");\n body[\"amount\"] = v;\n }\n if (opts.basisPoints !== undefined) {\n const v = Number(opts.basisPoints);\n if (Number.isNaN(v) || v < 0 || v > 10000) throw new CliError(\"--basis-points must be 0..10000\");\n body[\"basisPoints\"] = v;\n }\n if (opts.duration !== undefined) {\n if (![\"once\", \"repeating\", \"forever\"].includes(opts.duration)) {\n throw new CliError(\"--duration must be one of: once, repeating, forever\");\n }\n body[\"duration\"] = opts.duration;\n }\n if (opts.durationInMonths !== undefined) {\n const v = Number(opts.durationInMonths);\n if (Number.isNaN(v) || v < 1 || v > 24) throw new CliError(\"--duration-in-months must be 1..24\");\n body[\"durationInMonths\"] = v;\n }\n if (opts.maxRedemptionsPerCode !== undefined) {\n const v = Number(opts.maxRedemptionsPerCode);\n if (Number.isNaN(v) || v < 1) throw new CliError(\"--max-redemptions-per-code must be a positive integer\");\n body[\"maxRedemptionsPerCode\"] = v;\n }\n if (opts.starts !== undefined) body[\"startsAt\"] = opts.starts;\n if (opts.ends !== undefined) body[\"endsAt\"] = opts.ends;\n return body;\n}\n\nexport function registerAdminDiscountGroupsCommand(admin: Command): void {\n const groups = admin.command(\"discount-groups\").description(\"Discount group management\");\n\n groups\n .command(\"list\")\n .description(\"List discount groups\")\n .option(\"--query <text>\", \"Search by name or prefix\")\n .option(\"--page <n>\", \"Page number\", \"1\")\n .option(\"--limit <n>\", \"Page size\", \"50\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const opts = this.opts();\n const params: Record<string, string> = { page: String(opts.page), limit: String(opts.limit) };\n if (opts.query) params[\"query\"] = opts.query;\n const data = await fetchApi<{ items: unknown[]; total: number }>(\"GET\", \"/admin/discount-groups\", {\n adminAuth: true,\n params,\n });\n formatOutput(data.items ?? data, getOutputOpts(this), GROUP_COLUMNS);\n } catch (err) { handleError(err); }\n });\n\n groups\n .command(\"get <id>\")\n .description(\"Get a discount group by ID\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"discount group ID\");\n const data = await fetchApi<unknown>(\"GET\", `/admin/discount-groups/${id}`, { adminAuth: true });\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n groups\n .command(\"create\")\n .description(\"Create a discount group template\")\n .requiredOption(\"--name <name>\", \"Group name\")\n .requiredOption(\"--prefix <prefix>\", \"Code prefix (3-20 chars, uppercased)\")\n .requiredOption(\"--type <percentage|fixed>\", \"Discount type\")\n .option(\"--amount <n>\", \"Amount in cents (fixed type)\")\n .option(\"--basis-points <n>\", \"Basis points (percentage type, 0..10000)\")\n .option(\"--duration <once|repeating|forever>\", \"Discount duration\")\n .option(\"--duration-in-months <n>\", \"Months for repeating duration (1..24)\")\n .option(\"--max-redemptions-per-code <n>\", \"Per-code redemption cap\")\n .option(\"--starts <date>\", \"Start date (ISO 8601)\")\n .option(\"--ends <date>\", \"End date (ISO 8601)\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const body = buildGroupBody(this.opts());\n const data = await fetchApi<{ group: { id: string } }>(\"POST\", \"/admin/discount-groups\", {\n adminAuth: true,\n body,\n });\n printSuccess(`Discount group created: ${data?.group?.id ?? \"\"}`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n groups\n .command(\"update <id>\")\n .description(\"Update a discount group (all fields optional)\")\n .option(\"--name <name>\", \"Group name\")\n .option(\"--prefix <prefix>\", \"Code prefix\")\n .option(\"--type <percentage|fixed>\", \"Discount type\")\n .option(\"--amount <n>\", \"Amount in cents\")\n .option(\"--basis-points <n>\", \"Basis points\")\n .option(\"--duration <once|repeating|forever>\", \"Discount duration\")\n .option(\"--duration-in-months <n>\", \"Months for repeating\")\n .option(\"--max-redemptions-per-code <n>\", \"Per-code redemption cap\")\n .option(\"--starts <date>\", \"Start date (ISO 8601)\")\n .option(\"--ends <date>\", \"End date (ISO 8601)\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"discount group ID\");\n const body = buildGroupBody(this.opts());\n if (Object.keys(body).length === 0) {\n throw new CliError(\"At least one option must be provided to update.\");\n }\n const data = await fetchApi<unknown>(\"PATCH\", `/admin/discount-groups/${id}`, {\n adminAuth: true,\n body,\n });\n printSuccess(`Discount group ${id} updated.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n\n groups\n .command(\"delete <id>\")\n .description(\"Delete a discount group (soft-deletes member codes)\")\n .action(async function (this: Command, id: string) {\n try {\n ensureAdminAuth();\n validateId(id, \"discount group ID\");\n const ok = await confirm(`Delete discount group ${id}? This soft-deletes all member codes.`);\n if (!ok) { console.log(\"Aborted.\"); return; }\n const data = await fetchApi<unknown>(\"DELETE\", `/admin/discount-groups/${id}`, { adminAuth: true });\n printSuccess(`Discount group ${id} deleted.`);\n formatOutput(data, getOutputOpts(this));\n } catch (err) { handleError(err); }\n });\n}\n","import { Command } from \"commander\";\nimport { fetchApi } from \"../../lib/api-client.js\";\nimport { handleError } from \"../../lib/errors.js\";\nimport { ensureAdminAuth } from \"../auth.js\";\nimport { formatOutput, getOutputOpts } from \"../../lib/output.js\";\nimport type { TableColumn } from \"../../types/index.js\";\n\nconst TIER_COLUMNS: TableColumn[] = [\n { key: \"id\", header: \"ID\", width: 12 },\n { key: \"name\", header: \"Name\", width: 16 },\n { key: \"displayName\", header: \"Display Name\", width: 20 },\n { key: \"commissionRate\", header: \"Commission\", width: 10 },\n { key: \"badgeColor\", header: \"Badge Color\", width: 12 },\n];\n\nexport function registerAdminTiersCommand(admin: Command): void {\n const tiers = admin.command(\"tiers\").description(\"Tier management\");\n\n tiers\n .command(\"list\")\n .description(\"List manual referral tiers\")\n .action(async function (this: Command) {\n try {\n ensureAdminAuth();\n const data = await fetchApi<unknown[]>(\"GET\", \"/admin/tiers/manual\", {\n adminAuth: true,\n });\n formatOutput(data, getOutputOpts(this), TIER_COLUMNS);\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { registerAdminOrdersCommand } from \"./admin-orders.js\";\nimport { registerAdminUsersCommand } from \"./admin-users.js\";\nimport { registerAdminReferralsCommand } from \"./admin-referrals.js\";\nimport { registerAdminRevenueCommand } from \"./admin-revenue.js\";\nimport { registerAdminPayoutsCommand } from \"./admin-payouts.js\";\nimport { registerAdminLoyaltyCommand } from \"./admin-loyalty.js\";\nimport { registerAdminBlogCommand } from \"./admin-blog.js\";\nimport { registerAdminKeysCommand } from \"./admin-keys.js\";\nimport { registerAdminInvitesCommand } from \"./admin-invites.js\";\nimport { registerAdminLicensesCommand } from \"./admin-licenses.js\";\nimport { registerAdminAdminsCommand } from \"./admin-admins.js\";\nimport { registerAdminDiscountsCommand } from \"./admin-discounts.js\";\nimport { registerAdminDiscountGroupsCommand } from \"./admin-discount-groups.js\";\nimport { registerAdminTiersCommand } from \"./admin-tiers.js\";\n\nexport function registerAdminCommand(program: Command): void {\n const admin = program\n .command(\"admin\")\n .description(\"Admin operations (requires admin API key)\");\n\n registerAdminOrdersCommand(admin);\n registerAdminUsersCommand(admin);\n registerAdminReferralsCommand(admin);\n registerAdminRevenueCommand(admin);\n registerAdminPayoutsCommand(admin);\n registerAdminLoyaltyCommand(admin);\n registerAdminBlogCommand(admin);\n registerAdminKeysCommand(admin);\n registerAdminInvitesCommand(admin);\n registerAdminLicensesCommand(admin);\n registerAdminAdminsCommand(admin);\n registerAdminDiscountsCommand(admin);\n registerAdminDiscountGroupsCommand(admin);\n registerAdminTiersCommand(admin);\n}\n"],"mappings":"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","names":["chalk","path","chalk","chalk","program","program","readFileSync","PROXY_BASE","program","readFileSync","PROXY_BASE","program","program","program","program","chalk","program","chalk","readline","program","program","readline","program","program","program","readline","program","program","readline","program","program","program","program","readline","ORDER_COLUMNS","PAYOUT_COLUMNS","readline","confirm","readFileSync","readFileSync","chalk","chalk","program"]}
|