@01.software/cli 0.10.0 → 0.10.1

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/lib/client.ts","../src/lib/credentials.ts","../src/lib/output.ts","../src/lib/admin-error.ts","../src/lib/i18n.ts","../src/commands/crud.ts","../src/lib/parse.ts","../src/commands/order.ts","../src/commands/return.ts","../src/commands/cart.ts","../src/commands/stock.ts","../src/commands/transaction.ts","../src/commands/auth.ts","../src/commands/schema.ts","../src/commands/mcp.ts"],"sourcesContent":["import { createRequire } from 'node:module'\nimport { Command } from 'commander'\nimport { resolveClient } from './lib/client.js'\nimport { exitWithError } from './lib/output.js'\nimport { setLocale, type Locale } from './lib/i18n.js'\nimport { registerCrudCommands } from './commands/crud.js'\nimport { registerOrderCommands } from './commands/order.js'\nimport { registerReturnCommands } from './commands/return.js'\nimport { registerCartCommands } from './commands/cart.js'\nimport { registerStockCommands } from './commands/stock.js'\nimport { registerTransactionCommands } from './commands/transaction.js'\nimport { registerAuthCommands } from './commands/auth.js'\nimport { registerSchemaCommands } from './commands/schema.js'\nimport { registerMcpCommands } from './commands/mcp.js'\n\nconst require = createRequire(import.meta.url)\nconst { version } = require('../package.json') as { version: string }\n\nconst program = new Command()\n\nprogram\n .name('01')\n .description('CLI for the 01.software platform')\n .version(version)\n .option('--api-key <key>', 'API key (sk01_... or pat01_... token)')\n .option('--format <format>', 'Output format: json, table, or ndjson')\n .option('--lang <locale>', 'Force locale (ko or en)')\n\nconst getFormat = () =>\n (program.opts().format ?? process.env.OUTPUT_FORMAT ?? 'json') as string\n\n// Surface the explicit `--lang` flag (when supplied) so the i18n table\n// detection in `lib/i18n.ts` honours it before falling back to LC_ALL/LANG.\n// Also pin OUTPUT_FORMAT into the env so `exitWithError(e)` calls inside\n// command bodies pick up the format without threading it through every\n// call site.\nprogram.hook('preAction', () => {\n const lang = program.opts().lang as string | undefined\n if (lang === 'ko' || lang === 'en') setLocale(lang as Locale)\n process.env.OUTPUT_FORMAT = getFormat()\n})\n\nprocess.on('unhandledRejection', (err) => {\n exitWithError(err, { format: getFormat() })\n})\n\nconst getClient = () =>\n resolveClient(program.opts().apiKey as string | undefined)\n\nregisterCrudCommands(program, getClient, getFormat)\nregisterOrderCommands(program, getClient, getFormat)\nregisterReturnCommands(program, getClient, getFormat)\nregisterCartCommands(program, getClient, getFormat)\nregisterStockCommands(program, getClient, getFormat)\nregisterTransactionCommands(program, getClient, getFormat)\nregisterSchemaCommands(program, getClient, getFormat)\nregisterMcpCommands(program)\nregisterAuthCommands(program)\n\nprogram.parse()\n","import {\n CollectionClient,\n ServerCommerceClient,\n} from '@01.software/sdk'\nimport { loadCredentials, loadLocalCredentials } from './credentials.js'\nimport { exitWithError } from './output.js'\nimport { t } from './i18n.js'\n\nexport interface ResolvedClient {\n collections: CollectionClient\n commerce: ServerCommerceClient\n publishableKey: string\n secretKey: string\n}\n\n/**\n * Accepted opaque bearer token prefixes.\n * - `sk01_` = tenant-level API key (created in Console > Settings > API Keys)\n * - `pat01_` = user-level Personal Access Token\n * Hex HMAC secrets from the pre-2026-04 auth system are rejected.\n */\nfunction isValidBearerToken(secret: string): boolean {\n return secret.startsWith('sk01_') || secret.startsWith('pat01_')\n}\n\n/**\n * Resolve credentials in priority order:\n * 1. `--api-key <token>` flag (overrides secretKey only; publishableKey still\n * comes from env/credentials)\n * 2. `SOFTWARE_PUBLISHABLE_KEY` + `SOFTWARE_SECRET_KEY` env vars\n * 3. Local project credentials (`./01software/credentials.json`)\n * 4. Global user credentials (`~/.01software/credentials.json`)\n */\nexport function resolveClient(apiKeyFlag?: string): ResolvedClient {\n let publishableKey: string | undefined = process.env.SOFTWARE_PUBLISHABLE_KEY\n let secretKey: string | undefined =\n apiKeyFlag ?? process.env.SOFTWARE_SECRET_KEY\n\n if (!publishableKey || !secretKey) {\n const local = loadLocalCredentials()\n if (local) {\n publishableKey = publishableKey ?? local.publishableKey\n secretKey = secretKey ?? local.secretKey\n }\n }\n\n if (!publishableKey || !secretKey) {\n const stored = loadCredentials()\n if (stored) {\n publishableKey = publishableKey ?? stored.publishableKey\n secretKey = secretKey ?? stored.secretKey\n }\n }\n\n if (!publishableKey || !secretKey) {\n exitWithError({\n type: 'permission',\n code: 'credential_invalid',\n detail: {\n message: t('AuthenticationRequired'),\n steps: [\n t('RunLoginToAuthenticate'),\n t('PassApiKey'),\n t('SetEnvVars'),\n ],\n },\n })\n }\n\n if (!isValidBearerToken(secretKey)) {\n exitWithError({\n type: 'permission',\n code: 'credential_invalid',\n detail: {\n message: t('InvalidApiKeyFormat'),\n suggestion: t('RetiredHexCredentialsRejected'),\n },\n })\n }\n\n const serverOptions = { publishableKey, secretKey }\n\n return {\n collections: new CollectionClient(\n publishableKey,\n secretKey,\n undefined,\n undefined,\n undefined,\n ),\n commerce: new ServerCommerceClient(serverOptions),\n publishableKey,\n secretKey,\n }\n}\n","import {\n existsSync,\n mkdirSync,\n readFileSync,\n writeFileSync,\n unlinkSync,\n appendFileSync,\n} from 'node:fs'\nimport { join } from 'node:path'\nimport { homedir } from 'node:os'\n\nexport interface StoredCredentials {\n publishableKey: string\n /** Opaque bearer token — tenant API key (sk01_...) or PAT (pat01_...) */\n secretKey: string\n tenantId?: string\n tenantName: string\n storedAt: string\n}\n\nexport interface TenantInfo {\n id: string\n name: string\n}\n\nconst DIR_NAME = '.01software'\nconst FILE_NAME = 'credentials.json'\nconst TENANTS_FILE = 'tenants.json'\n\n// ---------------------------------------------------------------------------\n// Global credentials (~/.01software/credentials.json)\n// ---------------------------------------------------------------------------\n\nexport function getCredentialsPath(): string {\n return join(homedir(), DIR_NAME, FILE_NAME)\n}\n\nexport function loadCredentials(): StoredCredentials | null {\n return loadCredentialsFrom(getCredentialsPath())\n}\n\nexport function saveCredentials(\n creds: Omit<StoredCredentials, 'storedAt'>,\n): void {\n const dir = join(homedir(), DIR_NAME)\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true, mode: 0o700 })\n }\n\n const filePath = getCredentialsPath()\n const data: StoredCredentials = {\n ...creds,\n storedAt: new Date().toISOString(),\n }\n writeFileSync(filePath, JSON.stringify(data, null, 2), {\n encoding: 'utf-8',\n mode: 0o600,\n })\n}\n\nexport function deleteCredentials(): boolean {\n const filePath = getCredentialsPath()\n if (!existsSync(filePath)) return false\n\n unlinkSync(filePath)\n return true\n}\n\n// ---------------------------------------------------------------------------\n// Local credentials (./01software/credentials.json)\n// ---------------------------------------------------------------------------\n\nexport function getLocalCredentialsPath(): string {\n return join(process.cwd(), DIR_NAME, FILE_NAME)\n}\n\nexport function loadLocalCredentials(): StoredCredentials | null {\n return loadCredentialsFrom(getLocalCredentialsPath())\n}\n\nexport function saveLocalCredentials(\n creds: Omit<StoredCredentials, 'storedAt'>,\n): void {\n const dir = join(process.cwd(), DIR_NAME)\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true, mode: 0o700 })\n }\n\n const filePath = getLocalCredentialsPath()\n const data: StoredCredentials = {\n ...creds,\n storedAt: new Date().toISOString(),\n }\n writeFileSync(filePath, JSON.stringify(data, null, 2), {\n encoding: 'utf-8',\n mode: 0o600,\n })\n\n // Ensure .01software/ is in .gitignore\n ensureGitignore()\n}\n\n// ---------------------------------------------------------------------------\n// Tenant list cache (~/.01software/tenants.json)\n// ---------------------------------------------------------------------------\n\nexport function saveTenantList(tenants: TenantInfo[]): void {\n const dir = join(homedir(), DIR_NAME)\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true, mode: 0o700 })\n }\n\n const filePath = join(homedir(), DIR_NAME, TENANTS_FILE)\n writeFileSync(filePath, JSON.stringify(tenants, null, 2), {\n encoding: 'utf-8',\n mode: 0o600,\n })\n}\n\nexport function loadTenantList(): TenantInfo[] | null {\n const filePath = join(homedir(), DIR_NAME, TENANTS_FILE)\n if (!existsSync(filePath)) return null\n\n try {\n const raw = readFileSync(filePath, 'utf-8')\n const data = JSON.parse(raw)\n if (!Array.isArray(data)) return null\n const valid = data.filter(\n (t): t is TenantInfo =>\n typeof t?.id === 'string' && typeof t?.name === 'string',\n )\n return valid.length > 0 ? valid : null\n } catch {\n return null\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction loadCredentialsFrom(filePath: string): StoredCredentials | null {\n if (!existsSync(filePath)) return null\n\n try {\n const raw = readFileSync(filePath, 'utf-8')\n const data = JSON.parse(raw) as StoredCredentials\n if (!data.publishableKey || !data.secretKey) return null\n return data\n } catch {\n return null\n }\n}\n\nfunction ensureGitignore(): void {\n const gitignorePath = join(process.cwd(), '.gitignore')\n const entry = '.01software/'\n\n if (existsSync(gitignorePath)) {\n const content = readFileSync(gitignorePath, 'utf-8')\n if (content.includes(entry)) return\n appendFileSync(gitignorePath, `\\n${entry}\\n`, 'utf-8')\n } else {\n writeFileSync(gitignorePath, `${entry}\\n`, 'utf-8')\n }\n}\n","import pc from 'picocolors'\nimport {\n type AdminError,\n classifyError,\n adminErrorExitCode,\n} from './admin-error.js'\nimport { CLI_I18N_KO, t } from './i18n.js'\n\n// Build a Set of valid i18n keys for fast lookup when localizing AdminError\n// codes. Reused below to choose between localized and fallback rendering.\nconst CLI_I18N_KEYS: readonly string[] = Object.keys(CLI_I18N_KO)\n\nexport function printJson(data: unknown): void {\n console.log(JSON.stringify(data, null, 2))\n}\n\nexport function printTable(data: unknown): void {\n if (Array.isArray(data)) {\n if (data.length === 0) {\n console.log(pc.dim(t('Empty')))\n return\n }\n const keys = Object.keys(data[0] as Record<string, unknown>)\n const widths = keys.map((k) =>\n Math.max(\n k.length,\n ...data.map(\n (row) => String((row as Record<string, unknown>)[k] ?? '').length,\n ),\n ),\n )\n\n // Header\n console.log(keys.map((k, i) => k.padEnd(widths[i]!)).join(' '))\n console.log(keys.map((_, i) => '-'.repeat(widths[i]!)).join(' '))\n\n // Rows\n for (const row of data) {\n console.log(\n keys\n .map((k, i) =>\n String((row as Record<string, unknown>)[k] ?? '').padEnd(\n widths[i]!,\n ),\n )\n .join(' '),\n )\n }\n } else if (data && typeof data === 'object') {\n const entries = Object.entries(data as Record<string, unknown>)\n const maxKey = Math.max(...entries.map(([k]) => k.length))\n for (const [key, value] of entries) {\n const display =\n typeof value === 'object' ? JSON.stringify(value) : String(value)\n console.log(`${pc.bold(key.padEnd(maxKey))} ${display}`)\n }\n } else {\n console.log(String(data))\n }\n}\n\nfunction printNdjson(data: unknown): void {\n if (Array.isArray(data)) {\n data.forEach((item) => console.log(JSON.stringify(item)))\n } else if (\n data &&\n typeof data === 'object' &&\n 'docs' in (data as Record<string, unknown>)\n ) {\n const { docs, ...meta } = data as {\n docs: unknown[]\n [key: string]: unknown\n }\n ;(docs as unknown[]).forEach((doc) => console.log(JSON.stringify(doc)))\n if (Object.keys(meta).length > 0)\n console.log(JSON.stringify({ _meta: meta }))\n } else {\n console.log(JSON.stringify(data))\n }\n}\n\nexport function printResult(data: unknown, format: string): void {\n if (format === 'ndjson') {\n printNdjson(data)\n } else if (format === 'table') {\n // For find responses with docs array, print the docs as table\n if (\n data &&\n typeof data === 'object' &&\n 'docs' in (data as Record<string, unknown>)\n ) {\n const resp = data as {\n docs: unknown[]\n totalDocs: number\n page: number\n totalPages: number\n }\n printTable(resp.docs)\n console.log(\n pc.dim(\n `\\n${t('Total', { n: resp.totalDocs })} | ${t('PageOf', {\n page: resp.page,\n total: resp.totalPages,\n })}`,\n ),\n )\n return\n }\n printTable(data)\n } else {\n printJson(data)\n }\n}\n\n/**\n * Map an unknown error → CLI exit code per `docs/packages/cli-exit-codes.md`.\n *\n * Routes through `classifyError()` (the AdminError discriminated union is\n * the canonical source). The SDK-error-name + HTTP-status heuristic lives\n * inside `classifyError` so existing thrown values keep their mapping.\n * The `unknown` code → exit 1 fallback is encoded in\n * `adminErrorExitCode` itself.\n */\nexport function getExitCode(error: unknown): number {\n return adminErrorExitCode(classifyError(error))\n}\n\nexport interface ErrorPrintOptions {\n format?: string\n}\n\n/**\n * Resolve the active output format. The entry point (`index.ts`) sets\n * `process.env.OUTPUT_FORMAT` from `--format` / fallback so command bodies\n * can call `exitWithError(e)` without threading the format through every\n * call site. Explicit `options.format` always wins.\n */\nfunction resolveFormat(options: ErrorPrintOptions): string {\n return options.format ?? process.env.OUTPUT_FORMAT ?? 'json'\n}\n\n/**\n * Render an error to the user. With `--format json` (or\n * `OUTPUT_FORMAT=json`), serialize the AdminError discriminated union to\n * stdout per the contract in `docs/packages/cli-exit-codes.md`. Otherwise\n * print a localized one-line message + supporting metadata to stderr.\n */\nexport function printError(\n error: unknown,\n options: ErrorPrintOptions = {},\n): void {\n const adminError = classifyError(error)\n\n // Per docs/packages/cli-exit-codes.md: ALWAYS emit a one-line human\n // message on stderr before exiting non-zero. Under `--format json` the\n // AdminError JSON is ALSO serialized to stdout so scripts can parse it.\n const knownKey = CLI_I18N_KEYS.includes(adminError.code)\n ? (adminError.code as Parameters<typeof t>[0])\n : null\n const localized = knownKey ? t(knownKey) : null\n const rawErr =\n error && typeof error === 'object'\n ? (error as Record<string, unknown>)\n : null\n const rawMessage =\n rawErr && typeof rawErr.message === 'string' ? rawErr.message : ''\n const stringErr = typeof error === 'string' ? error : ''\n const detailMessage =\n rawErr &&\n rawErr.detail &&\n typeof rawErr.detail === 'object' &&\n typeof (rawErr.detail as Record<string, unknown>).message === 'string'\n ? String((rawErr.detail as Record<string, unknown>).message)\n : ''\n // Headline: prefer the most specific human-readable text on hand —\n // raw `message` (most common SDK shape), then a string-error directly,\n // then `detail.message`, then the localized AdminError-code translation,\n // then the bare code.\n const headline =\n rawMessage || stringErr || detailMessage || localized || adminError.code\n\n console.error(pc.red(`Error: ${headline}`))\n // Surface the raw `code`/`status` (when present and distinct) so callers\n // who throw SDK errors with proprietary codes don't lose them in the\n // human-readable rendering. The AdminError type/code is always emitted\n // — that's the canonical contract.\n if (\n rawErr &&\n typeof rawErr.code === 'string' &&\n rawErr.code !== adminError.code\n ) {\n console.error(pc.dim(`Code: ${rawErr.code}`))\n } else {\n console.error(pc.dim(`Code: ${adminError.code}`))\n }\n if (rawErr && typeof rawErr.status === 'number') {\n console.error(pc.dim(`Status: ${rawErr.status}`))\n }\n console.error(pc.dim(`Type: ${adminError.type}`))\n\n if (\n adminError.type === 'degraded' &&\n typeof adminError.retryAfter === 'number'\n ) {\n console.error(pc.yellow(`Retry after: ${adminError.retryAfter}s`))\n }\n if (rawErr && typeof rawErr.suggestion === 'string') {\n console.error(pc.yellow(rawErr.suggestion))\n }\n\n if (resolveFormat(options) === 'json') {\n console.log(JSON.stringify(adminError))\n }\n}\n\nexport function exitWithError(\n error: unknown,\n options: ErrorPrintOptions = {},\n): never {\n printError(error, options)\n process.exit(getExitCode(error))\n}\n","// Mirror of `apps/console/src/lib/admin-error.ts`.\n//\n// Kept as a hand-mirrored copy rather than an import because the CLI ships\n// to npm as a standalone package that cannot reach into apps/console at\n// runtime. Drift is locked by `apps/console/scripts/check-i18n-parity.ts`,\n// which asserts every code listed in the console source has a matching CLI\n// translation entry.\n\nexport type ValidationCode = string\n\nexport type PermissionCode =\n | 'tenant_mismatch'\n | 'account_suspended'\n | 'feature_disabled'\n | 'role_denied'\n | 'credential_invalid'\n | 'pat_tenant_unpinned'\n | 'publishable_key_mismatch'\n | 'scope_denied'\n\nexport type DegradedCode =\n | 'redis_unavailable'\n | 'provider_unavailable'\n | 'rate_limited'\n\nexport type NetworkCode = 'upstream_timeout' | 'upstream_5xx' | 'dns_failure'\n\nexport type AdminErrorCode =\n | PermissionCode\n | DegradedCode\n | NetworkCode\n | ValidationCode\n\nexport type AdminError =\n | {\n type: 'validation'\n code: ValidationCode\n field?: string\n detail?: Record<string, unknown>\n }\n | {\n type: 'permission'\n code: PermissionCode\n detail?: Record<string, unknown>\n }\n | {\n type: 'degraded'\n code: DegradedCode\n retryAfter?: number\n detail?: Record<string, unknown>\n }\n | {\n type: 'network'\n code: NetworkCode\n detail?: Record<string, unknown>\n }\n\nconst PERMISSION_CODES: readonly PermissionCode[] = [\n 'tenant_mismatch',\n 'account_suspended',\n 'feature_disabled',\n 'role_denied',\n 'credential_invalid',\n 'pat_tenant_unpinned',\n 'publishable_key_mismatch',\n 'scope_denied',\n]\n\nconst DEGRADED_CODES: readonly DegradedCode[] = [\n 'redis_unavailable',\n 'provider_unavailable',\n 'rate_limited',\n]\n\nconst NETWORK_CODES: readonly NetworkCode[] = [\n 'upstream_timeout',\n 'upstream_5xx',\n 'dns_failure',\n]\n\nfunction isPermissionCode(code: string): code is PermissionCode {\n return (PERMISSION_CODES as readonly string[]).includes(code)\n}\n\nfunction isDegradedCode(code: string): code is DegradedCode {\n return (DEGRADED_CODES as readonly string[]).includes(code)\n}\n\nfunction isNetworkCode(code: string): code is NetworkCode {\n return (NETWORK_CODES as readonly string[]).includes(code)\n}\n\n/**\n * Classify an unknown thrown / rejected value into the AdminError union.\n * Heuristic mirrors `apps/console/src/lib/admin-error.ts:classifyError`:\n * 1. Object with `code: string` matching a known literal → typed bucket.\n * 2. Object with explicit `type` matching a union tag → trusted as-is.\n * 3. Anything else → `validation` / `unknown`.\n *\n * Additional heuristic (CLI-only): SDK error names + HTTP status fall\n * through to a sensible AdminError so existing thrown values continue to\n * classify even before callers migrate to literal codes.\n */\nexport function classifyError(err: unknown): AdminError {\n if (err && typeof err === 'object') {\n const obj = err as Record<string, unknown>\n\n if (typeof obj.code === 'string') {\n const code = obj.code\n if (isPermissionCode(code)) {\n return { type: 'permission', code }\n }\n if (isDegradedCode(code)) {\n const out: AdminError = { type: 'degraded', code }\n if (typeof obj.retryAfter === 'number') {\n out.retryAfter = obj.retryAfter\n }\n return out\n }\n if (isNetworkCode(code)) {\n return { type: 'network', code }\n }\n }\n\n if (obj.type === 'validation' && typeof obj.code === 'string') {\n const out: AdminError = { type: 'validation', code: obj.code }\n if (typeof obj.field === 'string') out.field = obj.field\n if (obj.detail && typeof obj.detail === 'object') {\n out.detail = obj.detail as Record<string, unknown>\n }\n return out\n }\n\n // CLI fallback: SDK error names + HTTP status.\n const name = typeof obj.name === 'string' ? obj.name : undefined\n const status = typeof obj.status === 'number' ? obj.status : undefined\n if (name === 'ConfigError' || status === 401) {\n return { type: 'permission', code: 'credential_invalid' }\n }\n if (\n name === 'NetworkError' ||\n name === 'TimeoutError' ||\n status === 408 ||\n status === 503\n ) {\n return { type: 'network', code: 'upstream_timeout' }\n }\n if (name === 'GoneError' || status === 404) {\n return {\n type: 'validation',\n code: 'not_found',\n detail:\n typeof obj.message === 'string'\n ? { message: obj.message }\n : undefined,\n }\n }\n if (name === 'UsageLimitError' || status === 429) {\n const out: AdminError = { type: 'degraded', code: 'rate_limited' }\n if (typeof obj.retryAfter === 'number') out.retryAfter = obj.retryAfter\n return out\n }\n if (name === 'ValidationError' || status === 400 || status === 422) {\n return {\n type: 'validation',\n code: 'invalid_argument',\n detail:\n typeof obj.message === 'string'\n ? { message: obj.message }\n : undefined,\n }\n }\n }\n\n return {\n type: 'validation',\n code: 'unknown',\n detail: { message: err instanceof Error ? err.message : String(err) },\n }\n}\n\n/**\n * Map AdminError → CLI exit code per `docs/packages/cli-exit-codes.md`.\n * permission → 2\n * validation → 3 (`not_found` → 5; `unknown` → 1)\n * network → 4\n * degraded → 6 (`rate_limited`; provider_unavailable /\n * redis_unavailable keep 4 as the canonical \"upstream\n * failure\")\n *\n * Exit code 1 is reserved for the \"we don't know\" bucket (matching the\n * shell-script contract). The `unknown` validation code is the explicit\n * channel for that — `classifyError` routes anything it cannot identify\n * here.\n */\nexport function adminErrorExitCode(err: AdminError): number {\n if (err.code === 'unknown') return 1\n switch (err.type) {\n case 'permission':\n return 2\n case 'validation':\n return err.code === 'not_found' ? 5 : 3\n case 'network':\n return 4\n case 'degraded':\n return err.code === 'rate_limited' ? 6 : 4\n }\n}\n\nexport const ADMIN_ERROR_CODES = {\n permission: PERMISSION_CODES,\n degraded: DEGRADED_CODES,\n network: NETWORK_CODES,\n} as const\n","// CLI i18n table — mirrors `apps/console/src/lib/i18n/admin.ts` AdminError\n// code coverage so a single check (`apps/console/scripts/check-i18n-parity.ts`)\n// can verify the CLI carries every code with both KO and EN translations.\n//\n// Locale resolution:\n// 1. CLI `--lang <ko|en>` (resolved by the entry point and exported via\n// `setLocale`).\n// 2. `LANG` / `LC_ALL` environment variables — anything starting with\n// `ko` (`ko_KR.UTF-8`, `ko-KR`, …) → ko; else en.\n// 3. Default `en`.\n\nexport const CLI_I18N_KO = {\n // CLI-surface microcopy\n AuthenticationRequired: '인증이 필요합니다',\n RunLoginToAuthenticate: '`01 login` 명령으로 브라우저 인증을 진행하거나,',\n PassApiKey: '`--api-key <token>` 옵션을 전달하거나,',\n SetEnvVars:\n '`SOFTWARE_PUBLISHABLE_KEY` / `SOFTWARE_SECRET_KEY` 환경 변수를 설정하세요.',\n InvalidApiKeyFormat:\n 'API 키 형식이 올바르지 않습니다. `sk01_` 또는 `pat01_` 토큰이 필요합니다.',\n RetiredHexCredentialsRejected:\n '이전 hex 자격 증명은 더 이상 허용되지 않습니다 — `01 login`으로 다시 인증하세요.',\n InvalidJsonObject: '`--{{label}}` 인자는 JSON 객체여야 합니다.',\n InvalidJsonArray: '`--{{label}}` 인자는 JSON 배열이어야 합니다.',\n InvalidJsonValue: '`--{{label}}` 인자의 JSON 형식이 올바르지 않습니다: {{value}}',\n Empty: '(없음)',\n Total: '총 {{n}}개',\n PageOf: '{{page}} / {{total}} 페이지',\n\n // AdminError code translations (mirrors apps/console admin.ts).\n tenant_mismatch: '권한이 없는 테넌트',\n account_suspended: '계정이 정지되었습니다',\n feature_disabled: '이 기능이 비활성화되었습니다',\n role_denied: '권한이 부족합니다',\n credential_invalid: '자격 증명이 유효하지 않습니다',\n pat_tenant_unpinned: 'PAT 토큰의 테넌트가 고정되지 않았습니다',\n publishable_key_mismatch: '공개 키가 일치하지 않습니다',\n scope_denied: '범위 권한이 없습니다',\n redis_unavailable: '캐시가 일시적으로 사용 불가합니다',\n provider_unavailable: '외부 공급자가 응답하지 않습니다',\n rate_limited: '요청이 너무 많습니다 — 잠시 후 다시 시도하세요',\n upstream_timeout: '응답 시간이 초과되었습니다',\n upstream_5xx: '외부 서비스 오류',\n dns_failure: '네트워크 연결 오류',\n not_found: '리소스를 찾을 수 없습니다',\n invalid_argument: '인자가 올바르지 않습니다',\n unknown: '알 수 없는 오류',\n} as const\n\nexport type CliI18nKey = keyof typeof CLI_I18N_KO\n\nexport const CLI_I18N_EN: Record<CliI18nKey, string> = {\n AuthenticationRequired: 'Authentication required',\n RunLoginToAuthenticate:\n 'Run `01 login` to authenticate via browser, or',\n PassApiKey: 'pass `--api-key <token>`, or',\n SetEnvVars:\n 'set `SOFTWARE_PUBLISHABLE_KEY` and `SOFTWARE_SECRET_KEY` environment variables.',\n InvalidApiKeyFormat:\n 'Invalid API key format. Expected `sk01_` or `pat01_` token.',\n RetiredHexCredentialsRejected:\n 'Retired hex credentials are no longer accepted — run `01 login` to re-authenticate.',\n InvalidJsonObject: '--{{label}} must be a JSON object.',\n InvalidJsonArray: '--{{label}} must be a JSON array.',\n InvalidJsonValue: 'Invalid JSON for --{{label}}: {{value}}',\n Empty: '(empty)',\n Total: '{{n}} total',\n PageOf: 'page {{page}}/{{total}}',\n\n tenant_mismatch: 'Tenant access denied',\n account_suspended: 'Your account has been suspended',\n feature_disabled: 'This feature is disabled',\n role_denied: 'Insufficient role permissions',\n credential_invalid: 'Invalid credentials',\n pat_tenant_unpinned: 'PAT token tenant is not pinned',\n publishable_key_mismatch: 'Publishable key mismatch',\n scope_denied: 'Scope permission denied',\n redis_unavailable: 'Cache temporarily unavailable',\n provider_unavailable: 'Upstream provider unavailable',\n rate_limited: 'Too many requests — please try again shortly',\n upstream_timeout: 'Upstream request timed out',\n upstream_5xx: 'Upstream service error',\n dns_failure: 'Network connection error',\n not_found: 'Resource not found',\n invalid_argument: 'Invalid argument',\n unknown: 'Unknown error',\n}\n\nexport type Locale = 'ko' | 'en'\n\nlet activeLocale: Locale | null = null\n\nexport function detectLocale(): Locale {\n if (activeLocale) return activeLocale\n const raw =\n process.env.LC_ALL ?? process.env.LANG ?? process.env.LANGUAGE ?? ''\n return raw.toLowerCase().startsWith('ko') ? 'ko' : 'en'\n}\n\nexport function setLocale(locale: Locale | null | undefined): void {\n activeLocale = locale ?? null\n}\n\nexport function t(\n key: CliI18nKey,\n vars?: Record<string, string | number>,\n): string {\n const table = detectLocale() === 'ko' ? CLI_I18N_KO : CLI_I18N_EN\n let s: string = table[key]\n if (vars) {\n for (const [k, v] of Object.entries(vars)) {\n // Use a global regex (escape user-supplied key) instead of\n // String.prototype.replaceAll so we keep working on tsconfig\n // targets older than ES2021. Keys are statically declared above so\n // metacharacter escaping is defense-in-depth.\n const escaped = k.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n s = s.replace(new RegExp(`\\\\{\\\\{${escaped}\\\\}\\\\}`, 'g'), String(v))\n }\n }\n return s\n}\n","import { readFileSync } from 'node:fs'\nimport { basename } from 'node:path'\nimport { Command } from 'commander'\nimport { COLLECTIONS } from '@01.software/sdk'\nimport type { ApiQueryOptions } from '@01.software/sdk'\nimport type { ResolvedClient } from '../lib/client.js'\nimport { printResult, exitWithError } from '../lib/output.js'\nimport { parseJson } from '../lib/parse.js'\n\nfunction readFileAsBlob(filePath: string): { blob: Blob; filename: string } {\n const buffer = readFileSync(filePath)\n return { blob: new Blob([buffer]), filename: basename(filePath) }\n}\n\nfunction validateCollection(name: string): string {\n if (!(COLLECTIONS as readonly string[]).includes(name)) {\n const normalized = name.replace(/-/g, '').toLowerCase()\n const suggestions = COLLECTIONS.filter((c) => {\n const cn = c.replace(/-/g, '').toLowerCase()\n return (\n cn.startsWith(normalized) ||\n normalized.startsWith(cn) ||\n (normalized.length >= 3 && cn.includes(normalized))\n )\n }).slice(0, 5)\n const hint =\n suggestions.length > 0\n ? `Did you mean: ${suggestions.join(', ')}?`\n : 'Run \"01 --help\" for available collections.'\n throw new Error(`Unknown collection \"${name}\". ${hint}`)\n }\n return name\n}\n\nfunction parseSelect(input: string): Record<string, boolean> {\n return Object.fromEntries(input.split(',').map((f) => [f.trim(), true]))\n}\n\nexport function registerCrudCommands(\n program: Command,\n getClient: () => ResolvedClient,\n getFormat: () => string,\n) {\n program\n .command('query <collection>')\n .description('Query documents from a collection')\n .option('--where <json>', 'Filter conditions (JSON)')\n .option('--limit <n>', 'Max results', (v: string) => parseInt(v, 10))\n .option('--page <n>', 'Page number', (v: string) => parseInt(v, 10))\n .option('--sort <field>', 'Sort field (prefix with - for descending)')\n .option(\n '--depth <n>',\n 'Relationship depth (0 = no population)',\n (v: string) => parseInt(v, 10),\n )\n .option('--select <fields>', 'Comma-separated fields to select')\n .action(async (collection: string, opts) => {\n try {\n const col = validateCollection(collection)\n const client = getClient()\n const options: Record<string, unknown> = {}\n if (opts.where) options.where = parseJson(opts.where, 'where')\n if (opts.limit) options.limit = opts.limit\n if (opts.page) options.page = opts.page\n if (opts.sort) options.sort = opts.sort\n if (opts.depth != null) options.depth = opts.depth\n if (opts.select) options.select = parseSelect(opts.select)\n const result = await client.collections\n .from(col as (typeof COLLECTIONS)[number])\n .find(options)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n program\n .command('get <collection> <id>')\n .description('Get a document by ID')\n .option(\n '--depth <n>',\n 'Relationship depth (0 = no population)',\n (v: string) => parseInt(v, 10),\n )\n .option('--select <fields>', 'Comma-separated fields to select')\n .action(async (collection: string, id: string, opts) => {\n try {\n const col = validateCollection(collection)\n const client = getClient()\n const options: Record<string, unknown> = {}\n if (opts.depth != null) options.depth = opts.depth\n if (opts.select) options.select = parseSelect(opts.select)\n const result = await client.collections\n .from(col as (typeof COLLECTIONS)[number])\n .findById(id, options)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n program\n .command('create <collection>')\n .description('Create a new document')\n .requiredOption('--data <json>', 'Document data (JSON)')\n .option('--file <path>', 'File to upload (for upload collections)')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (collection: string, opts) => {\n try {\n const col = validateCollection(collection)\n const data = parseJson(opts.data, 'data')\n if (opts.dryRun) {\n printResult(\n {\n dryRun: true,\n valid: true,\n action: 'create',\n collection: col,\n data,\n },\n getFormat(),\n )\n return\n }\n const client = getClient()\n let fileOpts: { file: Blob; filename: string } | undefined\n if (opts.file) {\n const { blob, filename } = readFileAsBlob(opts.file)\n fileOpts = { file: blob, filename }\n }\n const result = await client.collections\n .from(col as (typeof COLLECTIONS)[number])\n .create(data, fileOpts)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n program\n .command('update <collection> <id>')\n .description('Update a document by ID')\n .requiredOption('--data <json>', 'Document data (JSON)')\n .option('--file <path>', 'File to upload (for upload collections)')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (collection: string, id: string, opts) => {\n try {\n const col = validateCollection(collection)\n const data = parseJson(opts.data, 'data')\n if (opts.dryRun) {\n printResult(\n {\n dryRun: true,\n valid: true,\n action: 'update',\n collection: col,\n id,\n data,\n },\n getFormat(),\n )\n return\n }\n const client = getClient()\n let fileOpts: { file: Blob; filename: string } | undefined\n if (opts.file) {\n const { blob, filename } = readFileAsBlob(opts.file)\n fileOpts = { file: blob, filename }\n }\n const result = await client.collections\n .from(col as (typeof COLLECTIONS)[number])\n .update(id, data, fileOpts)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n program\n .command('delete <collection> <id>')\n .description('Delete a document by ID')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (collection: string, id: string, opts) => {\n try {\n const col = validateCollection(collection)\n if (opts.dryRun) {\n printResult(\n {\n dryRun: true,\n valid: true,\n action: 'delete',\n collection: col,\n id,\n },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.collections\n .from(col as (typeof COLLECTIONS)[number])\n .remove(id)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n program\n .command('update-many <collection>')\n .description('Update multiple documents matching a filter')\n .requiredOption('--where <json>', 'Filter conditions (JSON)')\n .requiredOption('--data <json>', 'Update data (JSON)')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (collection: string, opts) => {\n try {\n const col = validateCollection(collection)\n const where = parseJson(opts.where, 'where') as ApiQueryOptions['where']\n const data = parseJson(opts.data, 'data')\n if (opts.dryRun) {\n printResult(\n {\n dryRun: true,\n valid: true,\n action: 'update-many',\n collection: col,\n where,\n data,\n },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.collections\n .from(col as (typeof COLLECTIONS)[number])\n .updateMany(where, data)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n program\n .command('delete-many <collection>')\n .description('Delete multiple documents matching a filter')\n .requiredOption('--where <json>', 'Filter conditions (JSON)')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (collection: string, opts) => {\n try {\n const col = validateCollection(collection)\n const where = parseJson(opts.where, 'where') as ApiQueryOptions['where']\n if (opts.dryRun) {\n printResult(\n {\n dryRun: true,\n valid: true,\n action: 'delete-many',\n collection: col,\n where,\n },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.collections\n .from(col as (typeof COLLECTIONS)[number])\n .removeMany(where)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n}\n","import { exitWithError } from './output.js'\nimport { t } from './i18n.js'\nimport type { z } from 'zod'\n\n/**\n * Throw an AdminError-shaped object so `exitWithError` can render it correctly\n * under `--format json` and exit with code 3 (validation). The `code` literal\n * `invalid_argument` is already in the validation bucket per `admin-error.ts`.\n */\nfunction failArg(\n label: string,\n value: string,\n expectedKind: 'object' | 'array' | 'value',\n): never {\n const message =\n expectedKind === 'object'\n ? t('InvalidJsonObject', { label })\n : expectedKind === 'array'\n ? t('InvalidJsonArray', { label })\n : t('InvalidJsonValue', { label, value })\n exitWithError({\n type: 'validation',\n code: 'invalid_argument',\n field: label,\n // `message` is read by `printError` for the stderr headline so the\n // user sees the label/value in the one-line summary; `detail` carries\n // the structured fields for `--format json` consumers.\n message,\n detail: { message, value, field: label },\n })\n}\n\nfunction stringifyValue(value: unknown): string {\n try {\n return JSON.stringify(value)\n } catch {\n return String(value)\n }\n}\n\nfunction formatSchemaIssues(\n label: string,\n issues: readonly { path: readonly string[]; message: string }[],\n): string {\n return issues\n .map((issue) => {\n const path = issue.path.length > 0 ? issue.path.join('.') : label\n return `${path}: ${issue.message}`\n })\n .join('; ')\n}\n\nexport function parseWithSchema<T>(\n value: unknown,\n label: string,\n schema: z.ZodType<T>,\n): T {\n const parsed = schema.safeParse(value)\n if (parsed.success) return parsed.data\n\n const issues = parsed.error.issues.map((issue) => ({\n path: issue.path.map(String),\n message: issue.message,\n }))\n const message = `Invalid value for --${label}: ${formatSchemaIssues(label, issues)}`\n\n exitWithError({\n type: 'validation',\n code: 'invalid_argument',\n field: label,\n message,\n detail: {\n message,\n value: stringifyValue(value),\n field: label,\n issues,\n },\n })\n}\n\nexport function parseJson(\n value: string,\n label: string,\n options: { format?: string } = {},\n): Record<string, unknown> {\n let parsed: unknown\n try {\n parsed = JSON.parse(value)\n } catch {\n return failArg(label, value, 'value')\n }\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n return failArg(label, value, 'object')\n }\n void options\n return parsed as Record<string, unknown>\n}\n\nexport function parseJsonArray(\n value: string,\n label: string,\n options: { format?: string } = {},\n): unknown[] {\n let parsed: unknown\n try {\n parsed = JSON.parse(value)\n } catch {\n return failArg(label, value, 'value')\n }\n if (!Array.isArray(parsed)) {\n return failArg(label, value, 'array')\n }\n void options\n return parsed\n}\n","import { Command } from 'commander'\nimport { z } from 'zod'\nimport type { ResolvedClient } from '../lib/client.js'\nimport { printResult, exitWithError } from '../lib/output.js'\nimport { parseJson, parseJsonArray, parseWithSchema } from '../lib/parse.js'\n\nconst idSchema = z.union([z.string().min(1), z.number()]).transform(String)\n\nconst customerSnapshotSchema = z\n .object({\n email: z.string().email('Invalid email format'),\n name: z.string().optional(),\n phone: z.string().optional(),\n })\n .strict()\n\nconst shippingAddressSchema = z\n .object({\n postalCode: z.string().optional(),\n address: z.string().optional(),\n detailAddress: z.string().optional(),\n deliveryMessage: z.string().optional(),\n recipientName: z.string().optional(),\n phone: z.string().optional(),\n })\n .strict()\n\nconst orderItemSchema = z\n .object({\n product: idSchema,\n variant: idSchema,\n option: idSchema,\n quantity: z.number().int().positive('quantity must be a positive integer'),\n unitPrice: z.number().optional(),\n totalPrice: z.number().optional(),\n })\n .strict()\n\nconst orderItemsSchema = z\n .array(orderItemSchema)\n .min(1, 'At least one order item is required')\n .max(100, 'Maximum 100 items per order')\n\nconst orderStatusSchema = z.enum([\n 'pending',\n 'paid',\n 'failed',\n 'canceled',\n 'preparing',\n 'shipped',\n 'delivered',\n 'confirmed',\n])\n\nconst fulfillmentItemsSchema = z\n .array(\n z\n .object({\n orderItem: idSchema,\n quantity: z\n .number()\n .int()\n .positive('quantity must be a positive integer'),\n })\n .strict(),\n )\n .min(1, 'At least one fulfillment item is required')\n .max(100, 'Maximum 100 items per fulfillment')\n\nexport function registerOrderCommands(\n program: Command,\n getClient: () => ResolvedClient,\n getFormat: () => string,\n) {\n const order = program.command('order').description('Order management')\n\n order\n .command('create')\n .description('Create a new order')\n .option('--payment-id <id>', 'Payment ID')\n .requiredOption('--order-number <num>', 'Order number')\n .requiredOption('--email <email>', 'Customer email')\n .option('--customer <id>', 'Customer ID')\n .option('--name <name>', 'Customer name')\n .option('--phone <phone>', 'Customer phone')\n .requiredOption('--shipping-address <json>', 'Shipping address (JSON)')\n .requiredOption('--products <json>', 'Order products array (JSON)')\n .requiredOption('--total-amount <n>', 'Total amount', parseFloat)\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (opts) => {\n try {\n const shippingAddress = parseWithSchema(\n parseJson(opts.shippingAddress, 'shipping-address'),\n 'shipping-address',\n shippingAddressSchema,\n )\n const orderItems = parseWithSchema(\n parseJsonArray(opts.products, 'products'),\n 'products',\n orderItemsSchema,\n )\n const totalAmount = parseWithSchema(\n opts.totalAmount,\n 'total-amount',\n z.number().nonnegative('totalAmount must be non-negative'),\n )\n const data = {\n pgPaymentId: opts.paymentId,\n orderNumber: opts.orderNumber,\n customerSnapshot: {\n email: opts.email,\n name: opts.name,\n phone: opts.phone,\n },\n customer: opts.customer,\n shippingAddress,\n orderItems,\n totalAmount,\n }\n if (opts.dryRun) {\n printResult(\n { dryRun: true, valid: true, action: 'order create', data },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.commerce.orders.create({\n ...data,\n orderItems: orderItems as Parameters<\n typeof client.commerce.orders.create\n >[0]['orderItems'],\n })\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n order\n .command('get <orderNumber>')\n .description('Get an order by order number')\n .action(async (orderNumber: string) => {\n try {\n const client = getClient()\n const { docs: [order] } = await client.collections.from('orders').find({ where: { orderNumber: { equals: orderNumber } }, limit: 1, depth: 1 })\n if (!order) throw new Error('Order not found')\n printResult(order, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n order\n .command('update <orderNumber>')\n .description('Update order status')\n .requiredOption('--status <status>', 'New status')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (orderNumber: string, opts) => {\n try {\n const status = parseWithSchema(opts.status, 'status', orderStatusSchema)\n const data = { orderNumber, status }\n if (opts.dryRun) {\n printResult(\n { dryRun: true, valid: true, action: 'order update', data },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.commerce.orders.update(data)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n order\n .command('checkout')\n .description('Convert a cart to an order')\n .requiredOption('--cart-id <id>', 'Cart ID')\n .option('--payment-id <id>', 'Payment ID (optional for free orders)')\n .requiredOption('--order-number <num>', 'Order number')\n .requiredOption('--customer <json>', 'Customer snapshot (JSON)')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (opts) => {\n try {\n const customerSnapshot = parseWithSchema(\n parseJson(opts.customer, 'customer'),\n 'customer',\n customerSnapshotSchema,\n )\n const data = {\n cartId: opts.cartId,\n pgPaymentId: opts.paymentId,\n orderNumber: opts.orderNumber,\n customerSnapshot,\n }\n if (opts.dryRun) {\n printResult(\n { dryRun: true, valid: true, action: 'order checkout', data },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.commerce.orders.checkout({\n ...data,\n customerSnapshot: customerSnapshot as Parameters<\n typeof client.commerce.orders.checkout\n >[0]['customerSnapshot'],\n })\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n order\n .command('fulfill <orderNumber>')\n .description('Create a fulfillment for an order')\n .requiredOption('--items <json>', 'Fulfillment items array (JSON)')\n .option('--carrier <name>', 'Shipping carrier')\n .option('--tracking-number <num>', 'Tracking number')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (orderNumber: string, opts) => {\n try {\n const items = parseWithSchema(\n parseJsonArray(opts.items, 'items'),\n 'items',\n fulfillmentItemsSchema,\n )\n const data = {\n orderNumber,\n items,\n carrier: opts.carrier,\n trackingNumber: opts.trackingNumber,\n }\n if (opts.dryRun) {\n printResult(\n { dryRun: true, valid: true, action: 'order fulfill', data },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.commerce.orders.createFulfillment({\n ...data,\n items: items as Parameters<\n typeof client.commerce.orders.createFulfillment\n >[0]['items'],\n })\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n}\n","import { Command } from 'commander'\nimport { z } from 'zod'\nimport type { ResolvedClient } from '../lib/client.js'\nimport { printResult, exitWithError } from '../lib/output.js'\nimport { parseJsonArray, parseWithSchema } from '../lib/parse.js'\n\nconst idSchema = z.union([z.string().min(1), z.number()]).transform(String)\n\nconst returnReasonSchema = z\n .enum(['change_of_mind', 'defective', 'wrong_delivery', 'damaged', 'other'])\n .optional()\n\nconst returnItemsSchema = z\n .array(\n z\n .object({\n orderItem: idSchema,\n quantity: z\n .number()\n .int()\n .positive('quantity must be a positive integer'),\n restockAction: z\n .enum(['return_to_stock', 'discard'])\n .default('return_to_stock'),\n })\n .strict(),\n )\n .min(1, 'At least one return item is required')\n .max(100, 'Too many return items')\n\nconst returnStatusSchema = z.enum([\n 'processing',\n 'approved',\n 'rejected',\n 'completed',\n])\n\nconst refundAmountSchema = z\n .number()\n .nonnegative('refundAmount must be non-negative')\n\nexport function registerReturnCommands(\n program: Command,\n getClient: () => ResolvedClient,\n getFormat: () => string,\n) {\n const ret = program.command('return').description('Return management')\n\n ret\n .command('create <orderNumber>')\n .description('Create a return request')\n .requiredOption('--products <json>', 'Return products array (JSON)')\n .requiredOption('--refund-amount <n>', 'Refund amount', parseFloat)\n .option(\n '--reason <reason>',\n 'Return reason (change_of_mind, defective, wrong_delivery, damaged, other)',\n )\n .option('--reason-detail <text>', 'Detailed reason')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (orderNumber: string, opts) => {\n try {\n const returnItems = parseWithSchema(\n parseJsonArray(opts.products, 'products'),\n 'products',\n returnItemsSchema,\n )\n const refundAmount = parseWithSchema(\n opts.refundAmount,\n 'refund-amount',\n refundAmountSchema,\n )\n const reason = parseWithSchema(\n opts.reason,\n 'reason',\n returnReasonSchema,\n )\n const data = {\n orderNumber,\n returnItems,\n refundAmount,\n reason,\n reasonDetail: opts.reasonDetail,\n }\n if (opts.dryRun) {\n printResult(\n { dryRun: true, valid: true, action: 'return create', data },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.commerce.orders.createReturn({\n ...data,\n returnItems: returnItems as Parameters<\n typeof client.commerce.orders.createReturn\n >[0]['returnItems'],\n })\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n ret\n .command('update <returnId>')\n .description('Update return status')\n .requiredOption(\n '--status <status>',\n 'New status (processing, approved, rejected, completed)',\n )\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (returnId: string, opts) => {\n try {\n const status = parseWithSchema(opts.status, 'status', returnStatusSchema)\n const data = { returnId, status }\n if (opts.dryRun) {\n printResult(\n { dryRun: true, valid: true, action: 'return update', data },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.commerce.orders.updateReturn(data)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n ret\n .command('refund <orderNumber>')\n .description('Return with refund')\n .requiredOption('--products <json>', 'Return products array (JSON)')\n .requiredOption('--refund-amount <n>', 'Refund amount', parseFloat)\n .requiredOption('--payment-id <id>', 'Payment ID')\n .option('--reason <reason>', 'Return reason')\n .option('--reason-detail <text>', 'Detailed reason')\n .option('--refund-receipt-url <url>', 'Refund receipt URL')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (orderNumber: string, opts) => {\n try {\n const returnItems = parseWithSchema(\n parseJsonArray(opts.products, 'products'),\n 'products',\n returnItemsSchema,\n )\n const refundAmount = parseWithSchema(\n opts.refundAmount,\n 'refund-amount',\n refundAmountSchema,\n )\n const reason = parseWithSchema(\n opts.reason,\n 'reason',\n returnReasonSchema,\n )\n const data = {\n orderNumber,\n returnItems,\n refundAmount,\n pgPaymentId: opts.paymentId,\n reason,\n reasonDetail: opts.reasonDetail,\n refundReceiptUrl: opts.refundReceiptUrl,\n }\n if (opts.dryRun) {\n printResult(\n { dryRun: true, valid: true, action: 'return refund', data },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.commerce.orders.returnWithRefund({\n ...data,\n returnItems: returnItems as Parameters<\n typeof client.commerce.orders.returnWithRefund\n >[0]['returnItems'],\n })\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n}\n","import { Command } from 'commander'\nimport type { ResolvedClient } from '../lib/client.js'\nimport { printResult, exitWithError } from '../lib/output.js'\n\nexport function registerCartCommands(\n program: Command,\n getClient: () => ResolvedClient,\n getFormat: () => string,\n) {\n const cart = program.command('cart').description('Cart management')\n\n cart\n .command('add <cartId>')\n .description('Add an item to cart')\n .requiredOption('--product <id>', 'Product ID')\n .requiredOption('--variant <id>', 'Variant ID')\n .requiredOption('--option <id>', 'Option ID')\n .requiredOption('--quantity <n>', 'Quantity', (v: string) =>\n parseInt(v, 10),\n )\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (cartId: string, opts) => {\n try {\n const data = {\n cartId,\n product: opts.product,\n variant: opts.variant,\n option: opts.option,\n quantity: opts.quantity,\n }\n if (opts.dryRun) {\n printResult(\n { dryRun: true, valid: true, action: 'cart add', data },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.commerce.cart.addItem(data)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n cart\n .command('update <cartItemId>')\n .description('Update cart item quantity')\n .requiredOption('--quantity <n>', 'New quantity', (v: string) =>\n parseInt(v, 10),\n )\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (cartItemId: string, opts) => {\n try {\n const data = { cartItemId, quantity: opts.quantity }\n if (opts.dryRun) {\n printResult(\n { dryRun: true, valid: true, action: 'cart update', data },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.commerce.cart.updateItem(data)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n cart\n .command('remove <cartItemId>')\n .description('Remove an item from cart')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (cartItemId: string, opts) => {\n try {\n if (opts.dryRun) {\n printResult(\n {\n dryRun: true,\n valid: true,\n action: 'cart remove',\n data: { cartItemId },\n },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.commerce.cart.removeItem({ cartItemId })\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n}\n","import { Command } from 'commander'\nimport type { ResolvedClient } from '../lib/client.js'\nimport { printResult, exitWithError } from '../lib/output.js'\nimport { parseJsonArray } from '../lib/parse.js'\n\nexport function registerStockCommands(\n program: Command,\n getClient: () => ResolvedClient,\n getFormat: () => string,\n) {\n const stock = program.command('stock').description('Stock management')\n\n stock\n .command('check')\n .description('Check stock availability')\n .requiredOption(\n '--items <json>',\n 'Items to check (JSON array of { optionId, quantity })',\n )\n .action(async (opts) => {\n try {\n const client = getClient()\n const items = parseJsonArray(opts.items, 'items') as Parameters<\n typeof client.commerce.product.stockCheck\n >[0]['items']\n const result = await client.commerce.product.stockCheck({ items })\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n}\n","import { Command } from 'commander'\nimport type { ResolvedClient } from '../lib/client.js'\nimport { printResult, exitWithError } from '../lib/output.js'\n\nexport function registerTransactionCommands(\n program: Command,\n getClient: () => ResolvedClient,\n getFormat: () => string,\n) {\n const tx = program\n .command('transaction')\n .description('Transaction management')\n\n tx.command('update')\n .description('Update transaction status')\n .requiredOption('--payment-id <id>', 'Payment ID')\n .requiredOption(\n '--status <status>',\n 'New status (pending, paid, failed, canceled)',\n )\n .requiredOption('--payment-method <method>', 'Payment method')\n .requiredOption('--receipt-url <url>', 'Receipt URL')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (opts) => {\n try {\n const data = {\n pgPaymentId: opts.paymentId,\n status: opts.status,\n paymentMethod: opts.paymentMethod,\n receiptUrl: opts.receiptUrl,\n }\n if (opts.dryRun) {\n printResult(\n { dryRun: true, valid: true, action: 'transaction update', data },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.commerce.orders.updateTransaction(data)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n}\n","import { randomBytes } from 'node:crypto'\nimport { createServer } from 'node:http'\nimport { execFile, exec } from 'node:child_process'\nimport { platform } from 'node:os'\nimport { URL } from 'node:url'\nimport type { Command } from 'commander'\nimport pc from 'picocolors'\nimport {\n loadCredentials,\n saveCredentials,\n deleteCredentials,\n getCredentialsPath,\n loadLocalCredentials,\n saveLocalCredentials,\n getLocalCredentialsPath,\n loadTenantList,\n saveTenantList,\n type TenantInfo,\n} from '../lib/credentials.js'\n\nconst WEB_URL = process.env.SOFTWARE_WEB_URL || 'https://01.software'\nconst TIMEOUT_MS = 3 * 60 * 1000 // 3 minutes\n\nfunction escapeHtml(s: string): string {\n return s\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n}\n\nfunction openBrowser(url: string): void {\n const os = platform()\n\n const onError = () => {\n console.log(\n pc.yellow(\n `Could not open browser automatically. Open this URL manually:\\n${url}`,\n ),\n )\n }\n\n if (os === 'win32') {\n exec(`start \"\" \"${url}\"`, (err) => {\n if (err) onError()\n })\n } else {\n const cmd = os === 'darwin' ? 'open' : 'xdg-open'\n execFile(cmd, [url], (err) => {\n if (err) onError()\n })\n }\n}\n\nconst PAGE_STYLE = `*{margin:0;box-sizing:border-box}\nbody{font-family:system-ui,-apple-system,sans-serif;display:flex;justify-content:center;align-items:center;min-height:100vh;background:#fff;color:#252525}\n@media(prefers-color-scheme:dark){body{background:#252525;color:#f5f5f5}}\n.card{text-align:center;padding:2rem 2.5rem;border-radius:10px;max-width:380px;width:100%}\n.icon{width:40px;height:40px;margin:0 auto 1rem;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:1.25rem}\n.icon.ok{background:rgba(0,0,0,.05);color:#252525}\n.icon.err{background:rgba(220,38,38,.08);color:#dc2626}\n@media(prefers-color-scheme:dark){.icon.ok{background:rgba(255,255,255,.08);color:#f5f5f5}}\nh1{font-size:.875rem;font-weight:600;margin-bottom:.375rem}\np{font-size:.75rem;color:#737373;line-height:1.5}`\n\nconst SUCCESS_HTML = `<!DOCTYPE html>\n<html lang=\"en\"><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width\"><title>CLI Login</title>\n<style>${PAGE_STYLE}</style>\n</head><body><div class=\"card\"><div class=\"icon ok\">\\u2713</div><h1>Authenticated</h1><p>You can close this tab and return to the terminal.</p></div></body></html>`\n\nconst ERROR_HTML = (msg: string) => `<!DOCTYPE html>\n<html lang=\"en\"><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width\"><title>CLI Login Error</title>\n<style>${PAGE_STYLE}</style>\n</head><body><div class=\"card\"><div class=\"icon err\">!</div><h1>Authentication failed</h1><p>${escapeHtml(msg)}</p></div></body></html>`\n\ninterface ExchangeResponse {\n publishableKey: string\n secretKey: string\n tenantName: string\n tenantId: string\n tenants?: TenantInfo[]\n}\n\nasync function exchangeCode(code: string): Promise<ExchangeResponse | null> {\n const url = `${WEB_URL}/api/cli/exchange`\n try {\n const res = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ code }),\n })\n if (!res.ok) {\n const body = await res.text().catch(() => '')\n console.error(\n pc.red(\n `Exchange failed: HTTP ${res.status} from ${url}${body ? ` — ${body.slice(0, 200)}` : ''}`,\n ),\n )\n return null\n }\n const data = (await res.json()) as Partial<ExchangeResponse>\n if (\n typeof data.publishableKey !== 'string' ||\n typeof data.secretKey !== 'string' ||\n typeof data.tenantName !== 'string' ||\n typeof data.tenantId !== 'string'\n ) {\n console.error(pc.red(`Exchange failed: malformed response from ${url}`))\n return null\n }\n return {\n publishableKey: data.publishableKey,\n secretKey: data.secretKey,\n tenantName: data.tenantName,\n tenantId: data.tenantId,\n tenants: Array.isArray(data.tenants)\n ? data.tenants.filter(\n (t): t is TenantInfo =>\n typeof (t as TenantInfo)?.id === 'string' &&\n typeof (t as TenantInfo)?.name === 'string',\n )\n : undefined,\n }\n } catch (err) {\n console.error(\n pc.red(\n `Exchange request to ${url} failed: ${err instanceof Error ? err.message : String(err)}`,\n ),\n )\n return null\n }\n}\n\n/**\n * Start a local HTTP server that receives the OAuth-style redirect callback\n * from the browser. The browser top-level-navigates to\n * http://127.0.0.1:{port}/callback?code={encryptedCode}&state={state}\n * and the CLI exchanges the opaque code with the web API to receive the\n * actual credentials server-to-server. This path has no CORS or PNA\n * preflight because the browser never issues a subresource fetch.\n */\nfunction startAuthServer(options: {\n state: string\n saveFn: (creds: {\n publishableKey: string\n secretKey: string\n tenantId?: string\n tenantName: string\n }) => void\n}): Promise<{ port: number; cleanup: (exitCode?: number) => void }> {\n return new Promise((resolve, reject) => {\n const server = createServer((req, res) => {\n if (!req.url) {\n res.writeHead(400).end()\n return\n }\n\n const url = new URL(req.url, `http://localhost`)\n\n if (url.pathname !== '/callback' || req.method !== 'GET') {\n res.writeHead(404).end()\n return\n }\n\n const error = url.searchParams.get('error')\n if (error) {\n res\n .writeHead(200, { 'Content-Type': 'text/html; charset=utf-8', Connection: 'close' })\n .end(ERROR_HTML(error))\n console.error(pc.red(`Login failed: ${error}`))\n cleanup(2)\n return\n }\n\n const code = url.searchParams.get('code')\n const receivedState = url.searchParams.get('state')\n\n if (!code || !receivedState) {\n res\n .writeHead(400, { 'Content-Type': 'text/html; charset=utf-8', Connection: 'close' })\n .end(ERROR_HTML('Missing code or state. Start over with \"01 login\".'))\n cleanup(2)\n return\n }\n\n if (receivedState !== options.state) {\n res\n .writeHead(403, { 'Content-Type': 'text/html; charset=utf-8', Connection: 'close' })\n .end(ERROR_HTML('State mismatch. Start over with \"01 login\".'))\n console.error(pc.red('Login failed: state mismatch.'))\n cleanup(2)\n return\n }\n\n exchangeCode(code).then((creds) => {\n if (!creds) {\n res\n .writeHead(400, { 'Content-Type': 'text/html; charset=utf-8', Connection: 'close' })\n .end(ERROR_HTML('Invalid or expired code. Start over with \"01 login\".'))\n console.error(pc.red('Login failed: code exchange failed.'))\n cleanup(2)\n return\n }\n\n options.saveFn({\n publishableKey: creds.publishableKey,\n secretKey: creds.secretKey,\n tenantId: creds.tenantId,\n tenantName: creds.tenantName,\n })\n\n if (creds.tenants && creds.tenants.length > 0) {\n saveTenantList(creds.tenants)\n }\n\n console.log(pc.green(`\\nLogged in successfully!`))\n console.log(pc.dim(`Tenant: ${creds.tenantName}`))\n\n res\n .writeHead(200, { 'Content-Type': 'text/html; charset=utf-8', Connection: 'close' })\n .end(SUCCESS_HTML)\n cleanup(0)\n })\n })\n\n let timeout: ReturnType<typeof setTimeout>\n let completed = false\n\n function cleanup(exitCode = 0) {\n if (completed) return\n completed = true\n clearTimeout(timeout)\n server.closeAllConnections?.()\n server.close(() => process.exit(exitCode))\n }\n\n server.listen(0, '127.0.0.1', () => {\n const addr = server.address()\n if (!addr || typeof addr === 'string') {\n reject(new Error('Failed to start local server.'))\n return\n }\n\n timeout = setTimeout(() => {\n console.error(\n pc.red('\\nLogin timed out (3 minutes). Please try again.'),\n )\n cleanup(4)\n }, TIMEOUT_MS)\n\n resolve({ port: addr.port, cleanup })\n })\n\n server.on('error', (err) => {\n reject(err)\n })\n })\n}\n\nexport function registerAuthCommands(program: Command): void {\n program\n .command('login')\n .description('Login via browser and store credentials')\n .action(async () => {\n const state = randomBytes(32).toString('hex')\n\n try {\n const { port } = await startAuthServer({\n state,\n saveFn: (creds) => {\n saveCredentials(creds)\n console.log(pc.dim(`Credentials saved to ${getCredentialsPath()}`))\n },\n })\n\n const params = new URLSearchParams({ port: String(port), state })\n const loginUrl = `${WEB_URL}/cli-auth?${params.toString()}`\n\n console.log(pc.dim('Opening browser for login...'))\n console.log(pc.dim(`If the browser does not open, visit:\\n${loginUrl}`))\n openBrowser(loginUrl)\n } catch (err) {\n console.error(\n pc.red(\n `Server error: ${err instanceof Error ? err.message : String(err)}`,\n ),\n )\n process.exit(4)\n }\n })\n\n program\n .command('logout')\n .description('Remove stored credentials')\n .action(() => {\n const deleted = deleteCredentials()\n if (deleted) {\n console.log(pc.green('Logged out. Credentials removed.'))\n } else {\n console.log(pc.dim('No stored credentials found.'))\n }\n })\n\n program\n .command('whoami')\n .description('Show current authentication status')\n .action(() => {\n // Check local credentials first\n const localCreds = loadLocalCredentials()\n const globalCreds = loadCredentials()\n const creds = localCreds || globalCreds\n const isLocal = !!localCreds\n\n if (!creds) {\n console.log(pc.dim('Not logged in. Run \"01 login\" to authenticate.'))\n return\n }\n\n const masked =\n creds.publishableKey.length > 8\n ? creds.publishableKey.slice(0, 4) + '...' + creds.publishableKey.slice(-4)\n : '****'\n\n const scope = isLocal ? pc.cyan(' (local)') : ''\n console.log(`Tenant: ${pc.bold(creds.tenantName)}${scope}`)\n console.log(`Publishable Key: ${pc.dim(masked)}`)\n console.log(`Stored at: ${pc.dim(creds.storedAt)}`)\n console.log(\n `File: ${pc.dim(isLocal ? getLocalCredentialsPath() : getCredentialsPath())}`,\n )\n })\n\n // -------------------------------------------------------------------------\n // tenant subcommands\n // -------------------------------------------------------------------------\n const tenant = program\n .command('tenant')\n .description('Manage tenant switching')\n\n tenant\n .command('list')\n .description('Show cached tenant list')\n .action(() => {\n const tenants = loadTenantList()\n if (!tenants || tenants.length === 0) {\n console.log(pc.dim('No cached tenants. Run \"01 login\" first.'))\n return\n }\n\n // Determine active tenant\n const localCreds = loadLocalCredentials()\n const globalCreds = loadCredentials()\n const activeCreds = localCreds || globalCreds\n const activeId = activeCreds?.tenantId\n const activeName = activeCreds?.tenantName\n\n console.log(pc.bold('Cached tenants:\\n'))\n for (const t of tenants) {\n const active = (activeId ? t.id === activeId : t.name === activeName)\n ? pc.green(' *')\n : ''\n console.log(` ${t.name}${active}`)\n }\n console.log()\n if (activeName) {\n const scope = localCreds ? '(local)' : '(global)'\n console.log(pc.dim(`* active ${scope}`))\n }\n })\n\n tenant\n .command('use <name>')\n .description('Switch to a different tenant via browser')\n .option('--local', 'Save credentials locally in the current project')\n .action(async (name: string, opts: { local?: boolean }) => {\n const tenants = loadTenantList()\n if (!tenants || tenants.length === 0) {\n console.error(pc.red('No cached tenants. Run \"01 login\" first.'))\n process.exit(2)\n }\n\n const match = tenants.find(\n (t) => t.name.toLowerCase() === name.toLowerCase(),\n )\n if (!match) {\n console.error(pc.red(`Tenant \"${name}\" not found in cache.`))\n console.error(\n pc.dim(`Available: ${tenants.map((t) => t.name).join(', ')}`),\n )\n process.exit(3)\n }\n\n const state = randomBytes(32).toString('hex')\n const isLocal = !!opts.local\n\n try {\n const { port } = await startAuthServer({\n state,\n saveFn: (creds) => {\n if (isLocal) {\n saveLocalCredentials(creds)\n console.log(\n pc.dim(`Credentials saved to ${getLocalCredentialsPath()}`),\n )\n } else {\n saveCredentials(creds)\n console.log(\n pc.dim(`Credentials saved to ${getCredentialsPath()}`),\n )\n }\n },\n })\n\n const params = new URLSearchParams({\n port: String(port),\n state,\n tenantId: match.id,\n })\n const loginUrl = `${WEB_URL}/cli-auth?${params.toString()}`\n\n console.log(pc.dim(`Switching to tenant \"${match.name}\"...`))\n console.log(pc.dim(`If the browser does not open, visit:\\n${loginUrl}`))\n openBrowser(loginUrl)\n } catch (err) {\n console.error(\n pc.red(\n `Server error: ${err instanceof Error ? err.message : String(err)}`,\n ),\n )\n process.exit(4)\n }\n })\n}\n","import { Command } from 'commander'\nimport { COLLECTIONS } from '@01.software/sdk'\nimport type { ResolvedClient } from '../lib/client.js'\nimport { printResult, exitWithError } from '../lib/output.js'\n\ndeclare const __DEFAULT_API_URL__: string\n\nfunction getApiUrl(): string {\n return (\n process.env.SOFTWARE_API_URL ||\n process.env.NEXT_PUBLIC_SOFTWARE_API_URL ||\n __DEFAULT_API_URL__\n ).replace(/\\/$/, '')\n}\n\nexport function registerSchemaCommands(\n program: Command,\n getClient: () => ResolvedClient,\n getFormat: () => string,\n) {\n const schema = program\n .command('schema')\n .description('Collection schema introspection')\n\n schema\n .command('list')\n .description('List available collections')\n .action(() => {\n printResult(COLLECTIONS, getFormat())\n })\n\n schema\n .command('show <collection>')\n .description('Show collection field schema')\n .action(async (collection: string) => {\n try {\n if (!(COLLECTIONS as readonly string[]).includes(collection)) {\n const normalized = collection.replace(/-/g, '').toLowerCase()\n const suggestions = (COLLECTIONS as readonly string[])\n .filter((c) => {\n const cn = c.replace(/-/g, '').toLowerCase()\n return (\n cn.startsWith(normalized) ||\n normalized.startsWith(cn) ||\n (normalized.length >= 3 && cn.includes(normalized))\n )\n })\n .slice(0, 5)\n const hint =\n suggestions.length > 0\n ? `Did you mean: ${suggestions.join(', ')}?`\n : 'Run \"01 schema list\" for available collections.'\n throw new Error(`Unknown collection \"${collection}\". ${hint}`)\n }\n const client = getClient()\n const baseUrl = getApiUrl()\n\n const url = `${baseUrl}/api/tenants/schema/${encodeURIComponent(collection)}`\n const response = await fetch(url, {\n headers: {\n 'X-Publishable-Key': client.publishableKey,\n Authorization: `Bearer ${client.secretKey}`,\n },\n })\n\n if (!response.ok) {\n const body = await response\n .json()\n .catch(() => ({ error: response.statusText }))\n const err = new Error(\n (body as { error?: string }).error || `HTTP ${response.status}`,\n )\n Object.assign(err, { status: response.status })\n throw err\n }\n\n const result = await response.json()\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n}\n","import { resolve, dirname } from 'node:path'\nimport { existsSync } from 'node:fs'\nimport { spawn } from 'node:child_process'\nimport { fileURLToPath } from 'node:url'\nimport type { Command } from 'commander'\nimport { resolveClient } from '../lib/client.js'\nimport { exitWithError } from '../lib/output.js'\n\nconst __dirname = dirname(fileURLToPath(import.meta.url))\n\nexport interface StdioEntryCandidate {\n label: string\n path: string\n}\n\n/**\n * Locate the MCP stdio entry point.\n * Resolve order:\n * 1. Packaged MCP server copied into packages/cli/dist/mcp/stdio.js\n * 2. Monorepo MCP build output: apps/mcp/dist/stdio.js\n * 3. xmcp output: apps/mcp/.xmcp/stdio.js\n */\nexport function getStdioEntryCandidates(\n baseDir = __dirname,\n): StdioEntryCandidate[] {\n const candidates: StdioEntryCandidate[] = [\n {\n label: 'packaged CLI artifact',\n path: resolve(baseDir, 'mcp/stdio.js'),\n },\n ]\n const roots = ['../../../..', '../../..', '../..']\n const entries = [\n {\n label: 'monorepo build output',\n path: 'apps/mcp/dist/stdio.js',\n },\n {\n label: 'xmcp build output',\n path: 'apps/mcp/.xmcp/stdio.js',\n },\n ]\n\n for (const entry of entries) {\n for (const root of roots) {\n candidates.push({\n label: entry.label,\n path: resolve(baseDir, root, entry.path),\n })\n }\n }\n\n return candidates\n}\n\nexport function findStdioEntry(baseDir = __dirname): string | null {\n for (const candidate of getStdioEntryCandidates(baseDir)) {\n if (existsSync(candidate.path)) return candidate.path\n }\n\n return null\n}\n\nexport function formatMissingStdioEntryMessage(baseDir = __dirname): string {\n const checked = getStdioEntryCandidates(baseDir)\n .map((candidate) => ` - ${candidate.label}: ${candidate.path}`)\n .join('\\n')\n\n return [\n 'MCP stdio entry not found.',\n 'Checked:',\n checked,\n 'Fix:',\n ' - Monorepo checkout: run pnpm --filter mcp build.',\n ' - Published CLI: reinstall or update @01.software/cli so dist/mcp/stdio.js is included.',\n ].join('\\n')\n}\n\nexport function createMcpEnv(\n baseEnv: NodeJS.ProcessEnv,\n client: { publishableKey: string; secretKey: string },\n): NodeJS.ProcessEnv {\n const env: NodeJS.ProcessEnv = {\n ...baseEnv,\n SOFTWARE_PUBLISHABLE_KEY: client.publishableKey,\n SOFTWARE_SECRET_KEY: client.secretKey,\n }\n\n delete env.SOFTWARE_TENANT_ID\n\n return env\n}\n\nexport function registerMcpCommands(program: Command) {\n program\n .command('mcp')\n .description('Start local MCP stdio server for trusted server-key workflows')\n .addHelpText(\n 'after',\n `\nPrerequisites:\n Run 01 login, or set SOFTWARE_PUBLISHABLE_KEY and SOFTWARE_SECRET_KEY.\n Local stdio exposes the full MCP tool surface; HTTP OAuth MCP uses the\n narrower remote surface documented in the web integration guide.\n In a monorepo checkout, build the stdio artifact first:\n pnpm --filter mcp build\n`,\n )\n .action(() => {\n // 1. Validate credentials before spawning (exits with code 2 if missing)\n const client = resolveClient(program.opts().apiKey as string | undefined)\n\n // 2. Find stdio.js entry point\n const stdioEntry = findStdioEntry()\n if (!stdioEntry) {\n exitWithError(new Error(formatMissingStdioEntryMessage()))\n }\n\n // 3. Spawn stdio process (inherits env with SOFTWARE_PUBLISHABLE_KEY + SOFTWARE_SECRET_KEY)\n const child = spawn(process.execPath, [stdioEntry], {\n env: createMcpEnv(process.env, client),\n stdio: ['inherit', 'inherit', 'inherit'],\n })\n\n child.on('error', (err) => {\n exitWithError(new Error(`Failed to start MCP server: ${err.message}`))\n })\n\n child.on('exit', (code) => {\n process.exit(code ?? 0)\n })\n })\n}\n"],"mappings":"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","names":["t","readFileSync","readFileSync","program","getClient","getFormat","program","getClient","getFormat","order","z","idSchema","z","program","getClient","getFormat","program","getClient","getFormat","program","getClient","getFormat","program","getClient","getFormat","pc","pc","t","resolve","program","COLLECTIONS","program","getClient","getFormat","COLLECTIONS","existsSync","existsSync","program","require"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/lib/client.ts","../src/lib/credentials.ts","../src/lib/output.ts","../src/lib/admin-error.ts","../src/lib/i18n.ts","../src/commands/crud.ts","../src/lib/parse.ts","../src/commands/order.ts","../src/commands/return.ts","../src/commands/cart.ts","../src/commands/stock.ts","../src/commands/transaction.ts","../src/commands/auth.ts","../src/commands/schema.ts","../../contracts/src/tenant/index.ts","../src/commands/feature.ts","../src/commands/mcp.ts"],"sourcesContent":["import { createRequire } from 'node:module'\nimport { Command } from 'commander'\nimport { resolveClient } from './lib/client.js'\nimport { exitWithError } from './lib/output.js'\nimport { setLocale, type Locale } from './lib/i18n.js'\nimport { registerCrudCommands } from './commands/crud.js'\nimport { registerOrderCommands } from './commands/order.js'\nimport { registerReturnCommands } from './commands/return.js'\nimport { registerCartCommands } from './commands/cart.js'\nimport { registerStockCommands } from './commands/stock.js'\nimport { registerTransactionCommands } from './commands/transaction.js'\nimport { registerAuthCommands } from './commands/auth.js'\nimport { registerSchemaCommands } from './commands/schema.js'\nimport { registerFeatureCommands } from './commands/feature.js'\nimport { registerMcpCommands } from './commands/mcp.js'\n\nconst require = createRequire(import.meta.url)\nconst { version } = require('../package.json') as { version: string }\n\nconst program = new Command()\n\nprogram\n .name('01')\n .description('CLI for the 01.software platform')\n .version(version)\n .option('--api-key <key>', 'API key (sk01_... or pat01_... token)')\n .option('--format <format>', 'Output format: json, table, or ndjson')\n .option('--lang <locale>', 'Force locale (ko or en)')\n\nconst getFormat = () =>\n (program.opts().format ?? process.env.OUTPUT_FORMAT ?? 'json') as string\n\n// Surface the explicit `--lang` flag (when supplied) so the i18n table\n// detection in `lib/i18n.ts` honours it before falling back to LC_ALL/LANG.\n// Also pin OUTPUT_FORMAT into the env so `exitWithError(e)` calls inside\n// command bodies pick up the format without threading it through every\n// call site.\nprogram.hook('preAction', () => {\n const lang = program.opts().lang as string | undefined\n if (lang === 'ko' || lang === 'en') setLocale(lang as Locale)\n process.env.OUTPUT_FORMAT = getFormat()\n})\n\nprocess.on('unhandledRejection', (err) => {\n exitWithError(err, { format: getFormat() })\n})\n\nconst getClient = () =>\n resolveClient(program.opts().apiKey as string | undefined)\n\nregisterCrudCommands(program, getClient, getFormat)\nregisterOrderCommands(program, getClient, getFormat)\nregisterReturnCommands(program, getClient, getFormat)\nregisterCartCommands(program, getClient, getFormat)\nregisterStockCommands(program, getClient, getFormat)\nregisterTransactionCommands(program, getClient, getFormat)\nregisterSchemaCommands(program, getClient, getFormat)\nregisterFeatureCommands(program, getClient, getFormat)\nregisterMcpCommands(program)\nregisterAuthCommands(program)\n\nprogram.parse()\n","import {\n CollectionClient,\n ServerCommerceClient,\n} from '@01.software/sdk'\nimport { loadCredentials, loadLocalCredentials } from './credentials.js'\nimport { exitWithError } from './output.js'\nimport { t } from './i18n.js'\n\nexport interface ResolvedClient {\n collections: CollectionClient\n commerce: ServerCommerceClient\n publishableKey: string\n secretKey: string\n}\n\n/**\n * Accepted opaque bearer token prefixes.\n * - `sk01_` = tenant-level API key (created in Console > Settings > API Keys)\n * - `pat01_` = user-level Personal Access Token\n * Hex HMAC secrets from the pre-2026-04 auth system are rejected.\n */\nfunction isValidBearerToken(secret: string): boolean {\n return secret.startsWith('sk01_') || secret.startsWith('pat01_')\n}\n\n/**\n * Resolve credentials in priority order:\n * 1. `--api-key <token>` flag (overrides secretKey only; publishableKey still\n * comes from env/credentials)\n * 2. `SOFTWARE_PUBLISHABLE_KEY` + `SOFTWARE_SECRET_KEY` env vars\n * 3. Local project credentials (`./01software/credentials.json`)\n * 4. Global user credentials (`~/.01software/credentials.json`)\n */\nexport function resolveClient(apiKeyFlag?: string): ResolvedClient {\n let publishableKey: string | undefined = process.env.SOFTWARE_PUBLISHABLE_KEY\n let secretKey: string | undefined =\n apiKeyFlag ?? process.env.SOFTWARE_SECRET_KEY\n\n if (!publishableKey || !secretKey) {\n const local = loadLocalCredentials()\n if (local) {\n publishableKey = publishableKey ?? local.publishableKey\n secretKey = secretKey ?? local.secretKey\n }\n }\n\n if (!publishableKey || !secretKey) {\n const stored = loadCredentials()\n if (stored) {\n publishableKey = publishableKey ?? stored.publishableKey\n secretKey = secretKey ?? stored.secretKey\n }\n }\n\n if (!publishableKey || !secretKey) {\n exitWithError({\n type: 'permission',\n code: 'credential_invalid',\n detail: {\n message: t('AuthenticationRequired'),\n steps: [\n t('RunLoginToAuthenticate'),\n t('PassApiKey'),\n t('SetEnvVars'),\n ],\n },\n })\n }\n\n if (!isValidBearerToken(secretKey)) {\n exitWithError({\n type: 'permission',\n code: 'credential_invalid',\n detail: {\n message: t('InvalidApiKeyFormat'),\n suggestion: t('RetiredHexCredentialsRejected'),\n },\n })\n }\n\n const serverOptions = { publishableKey, secretKey }\n\n return {\n collections: new CollectionClient(\n publishableKey,\n secretKey,\n undefined,\n undefined,\n undefined,\n ),\n commerce: new ServerCommerceClient(serverOptions),\n publishableKey,\n secretKey,\n }\n}\n","import {\n existsSync,\n mkdirSync,\n readFileSync,\n writeFileSync,\n unlinkSync,\n appendFileSync,\n} from 'node:fs'\nimport { join } from 'node:path'\nimport { homedir } from 'node:os'\n\nexport interface StoredCredentials {\n publishableKey: string\n /** Opaque bearer token — tenant API key (sk01_...) or PAT (pat01_...) */\n secretKey: string\n tenantId?: string\n tenantName: string\n storedAt: string\n}\n\nexport interface TenantInfo {\n id: string\n name: string\n}\n\nconst DIR_NAME = '.01software'\nconst FILE_NAME = 'credentials.json'\nconst TENANTS_FILE = 'tenants.json'\n\n// ---------------------------------------------------------------------------\n// Global credentials (~/.01software/credentials.json)\n// ---------------------------------------------------------------------------\n\nexport function getCredentialsPath(): string {\n return join(homedir(), DIR_NAME, FILE_NAME)\n}\n\nexport function loadCredentials(): StoredCredentials | null {\n return loadCredentialsFrom(getCredentialsPath())\n}\n\nexport function saveCredentials(\n creds: Omit<StoredCredentials, 'storedAt'>,\n): void {\n const dir = join(homedir(), DIR_NAME)\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true, mode: 0o700 })\n }\n\n const filePath = getCredentialsPath()\n const data: StoredCredentials = {\n ...creds,\n storedAt: new Date().toISOString(),\n }\n writeFileSync(filePath, JSON.stringify(data, null, 2), {\n encoding: 'utf-8',\n mode: 0o600,\n })\n}\n\nexport function deleteCredentials(): boolean {\n const filePath = getCredentialsPath()\n if (!existsSync(filePath)) return false\n\n unlinkSync(filePath)\n return true\n}\n\n// ---------------------------------------------------------------------------\n// Local credentials (./01software/credentials.json)\n// ---------------------------------------------------------------------------\n\nexport function getLocalCredentialsPath(): string {\n return join(process.cwd(), DIR_NAME, FILE_NAME)\n}\n\nexport function loadLocalCredentials(): StoredCredentials | null {\n return loadCredentialsFrom(getLocalCredentialsPath())\n}\n\nexport function saveLocalCredentials(\n creds: Omit<StoredCredentials, 'storedAt'>,\n): void {\n const dir = join(process.cwd(), DIR_NAME)\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true, mode: 0o700 })\n }\n\n const filePath = getLocalCredentialsPath()\n const data: StoredCredentials = {\n ...creds,\n storedAt: new Date().toISOString(),\n }\n writeFileSync(filePath, JSON.stringify(data, null, 2), {\n encoding: 'utf-8',\n mode: 0o600,\n })\n\n // Ensure .01software/ is in .gitignore\n ensureGitignore()\n}\n\n// ---------------------------------------------------------------------------\n// Tenant list cache (~/.01software/tenants.json)\n// ---------------------------------------------------------------------------\n\nexport function saveTenantList(tenants: TenantInfo[]): void {\n const dir = join(homedir(), DIR_NAME)\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true, mode: 0o700 })\n }\n\n const filePath = join(homedir(), DIR_NAME, TENANTS_FILE)\n writeFileSync(filePath, JSON.stringify(tenants, null, 2), {\n encoding: 'utf-8',\n mode: 0o600,\n })\n}\n\nexport function loadTenantList(): TenantInfo[] | null {\n const filePath = join(homedir(), DIR_NAME, TENANTS_FILE)\n if (!existsSync(filePath)) return null\n\n try {\n const raw = readFileSync(filePath, 'utf-8')\n const data = JSON.parse(raw)\n if (!Array.isArray(data)) return null\n const valid = data.filter(\n (t): t is TenantInfo =>\n typeof t?.id === 'string' && typeof t?.name === 'string',\n )\n return valid.length > 0 ? valid : null\n } catch {\n return null\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction loadCredentialsFrom(filePath: string): StoredCredentials | null {\n if (!existsSync(filePath)) return null\n\n try {\n const raw = readFileSync(filePath, 'utf-8')\n const data = JSON.parse(raw) as StoredCredentials\n if (!data.publishableKey || !data.secretKey) return null\n return data\n } catch {\n return null\n }\n}\n\nfunction ensureGitignore(): void {\n const gitignorePath = join(process.cwd(), '.gitignore')\n const entry = '.01software/'\n\n if (existsSync(gitignorePath)) {\n const content = readFileSync(gitignorePath, 'utf-8')\n if (content.includes(entry)) return\n appendFileSync(gitignorePath, `\\n${entry}\\n`, 'utf-8')\n } else {\n writeFileSync(gitignorePath, `${entry}\\n`, 'utf-8')\n }\n}\n","import pc from 'picocolors'\nimport {\n type AdminError,\n classifyError,\n adminErrorExitCode,\n} from './admin-error.js'\nimport { CLI_I18N_KO, t } from './i18n.js'\n\n// Build a Set of valid i18n keys for fast lookup when localizing AdminError\n// codes. Reused below to choose between localized and fallback rendering.\nconst CLI_I18N_KEYS: readonly string[] = Object.keys(CLI_I18N_KO)\n\nexport function printJson(data: unknown): void {\n console.log(JSON.stringify(data, null, 2))\n}\n\nexport function printTable(data: unknown): void {\n if (Array.isArray(data)) {\n if (data.length === 0) {\n console.log(pc.dim(t('Empty')))\n return\n }\n const keys = Object.keys(data[0] as Record<string, unknown>)\n const widths = keys.map((k) =>\n Math.max(\n k.length,\n ...data.map(\n (row) => String((row as Record<string, unknown>)[k] ?? '').length,\n ),\n ),\n )\n\n // Header\n console.log(keys.map((k, i) => k.padEnd(widths[i]!)).join(' '))\n console.log(keys.map((_, i) => '-'.repeat(widths[i]!)).join(' '))\n\n // Rows\n for (const row of data) {\n console.log(\n keys\n .map((k, i) =>\n String((row as Record<string, unknown>)[k] ?? '').padEnd(\n widths[i]!,\n ),\n )\n .join(' '),\n )\n }\n } else if (data && typeof data === 'object') {\n const entries = Object.entries(data as Record<string, unknown>)\n const maxKey = Math.max(...entries.map(([k]) => k.length))\n for (const [key, value] of entries) {\n const display =\n typeof value === 'object' ? JSON.stringify(value) : String(value)\n console.log(`${pc.bold(key.padEnd(maxKey))} ${display}`)\n }\n } else {\n console.log(String(data))\n }\n}\n\nfunction printNdjson(data: unknown): void {\n if (Array.isArray(data)) {\n data.forEach((item) => console.log(JSON.stringify(item)))\n } else if (\n data &&\n typeof data === 'object' &&\n 'docs' in (data as Record<string, unknown>)\n ) {\n const { docs, ...meta } = data as {\n docs: unknown[]\n [key: string]: unknown\n }\n ;(docs as unknown[]).forEach((doc) => console.log(JSON.stringify(doc)))\n if (Object.keys(meta).length > 0)\n console.log(JSON.stringify({ _meta: meta }))\n } else {\n console.log(JSON.stringify(data))\n }\n}\n\nexport function printResult(data: unknown, format: string): void {\n if (format === 'ndjson') {\n printNdjson(data)\n } else if (format === 'table') {\n // For find responses with docs array, print the docs as table\n if (\n data &&\n typeof data === 'object' &&\n 'docs' in (data as Record<string, unknown>)\n ) {\n const resp = data as {\n docs: unknown[]\n totalDocs: number\n page: number\n totalPages: number\n }\n printTable(resp.docs)\n console.log(\n pc.dim(\n `\\n${t('Total', { n: resp.totalDocs })} | ${t('PageOf', {\n page: resp.page,\n total: resp.totalPages,\n })}`,\n ),\n )\n return\n }\n printTable(data)\n } else {\n printJson(data)\n }\n}\n\n/**\n * Map an unknown error → CLI exit code per `docs/packages/cli-exit-codes.md`.\n *\n * Routes through `classifyError()` (the AdminError discriminated union is\n * the canonical source). The SDK-error-name + HTTP-status heuristic lives\n * inside `classifyError` so existing thrown values keep their mapping.\n * The `unknown` code → exit 1 fallback is encoded in\n * `adminErrorExitCode` itself.\n */\nexport function getExitCode(error: unknown): number {\n return adminErrorExitCode(classifyError(error))\n}\n\nexport interface ErrorPrintOptions {\n format?: string\n}\n\n/**\n * Resolve the active output format. The entry point (`index.ts`) sets\n * `process.env.OUTPUT_FORMAT` from `--format` / fallback so command bodies\n * can call `exitWithError(e)` without threading the format through every\n * call site. Explicit `options.format` always wins.\n */\nfunction resolveFormat(options: ErrorPrintOptions): string {\n return options.format ?? process.env.OUTPUT_FORMAT ?? 'json'\n}\n\n/**\n * Render an error to the user. With `--format json` (or\n * `OUTPUT_FORMAT=json`), serialize the AdminError discriminated union to\n * stdout per the contract in `docs/packages/cli-exit-codes.md`. Otherwise\n * print a localized one-line message + supporting metadata to stderr.\n */\nexport function printError(\n error: unknown,\n options: ErrorPrintOptions = {},\n): void {\n const adminError = classifyError(error)\n\n // Per docs/packages/cli-exit-codes.md: ALWAYS emit a one-line human\n // message on stderr before exiting non-zero. Under `--format json` the\n // AdminError JSON is ALSO serialized to stdout so scripts can parse it.\n const knownKey = CLI_I18N_KEYS.includes(adminError.code)\n ? (adminError.code as Parameters<typeof t>[0])\n : null\n const localized = knownKey ? t(knownKey) : null\n const rawErr =\n error && typeof error === 'object'\n ? (error as Record<string, unknown>)\n : null\n const rawMessage =\n rawErr && typeof rawErr.message === 'string' ? rawErr.message : ''\n const stringErr = typeof error === 'string' ? error : ''\n const detailMessage =\n rawErr &&\n rawErr.detail &&\n typeof rawErr.detail === 'object' &&\n typeof (rawErr.detail as Record<string, unknown>).message === 'string'\n ? String((rawErr.detail as Record<string, unknown>).message)\n : ''\n // Headline: prefer the most specific human-readable text on hand —\n // raw `message` (most common SDK shape), then a string-error directly,\n // then `detail.message`, then the localized AdminError-code translation,\n // then the bare code.\n const headline =\n rawMessage || stringErr || detailMessage || localized || adminError.code\n\n console.error(pc.red(`Error: ${headline}`))\n // Surface the raw `code`/`status` (when present and distinct) so callers\n // who throw SDK errors with proprietary codes don't lose them in the\n // human-readable rendering. The AdminError type/code is always emitted\n // — that's the canonical contract.\n if (\n rawErr &&\n typeof rawErr.code === 'string' &&\n rawErr.code !== adminError.code\n ) {\n console.error(pc.dim(`Code: ${rawErr.code}`))\n } else {\n console.error(pc.dim(`Code: ${adminError.code}`))\n }\n if (rawErr && typeof rawErr.status === 'number') {\n console.error(pc.dim(`Status: ${rawErr.status}`))\n }\n console.error(pc.dim(`Type: ${adminError.type}`))\n\n if (\n adminError.type === 'degraded' &&\n typeof adminError.retryAfter === 'number'\n ) {\n console.error(pc.yellow(`Retry after: ${adminError.retryAfter}s`))\n }\n if (rawErr && typeof rawErr.suggestion === 'string') {\n console.error(pc.yellow(rawErr.suggestion))\n }\n\n if (resolveFormat(options) === 'json') {\n console.log(JSON.stringify(adminError))\n }\n}\n\nexport function exitWithError(\n error: unknown,\n options: ErrorPrintOptions = {},\n): never {\n printError(error, options)\n process.exit(getExitCode(error))\n}\n","// Mirror of `apps/console/src/lib/admin-error.ts`.\n//\n// Kept as a hand-mirrored copy rather than an import because the CLI ships\n// to npm as a standalone package that cannot reach into apps/console at\n// runtime. Drift is locked by `apps/console/scripts/check-i18n-parity.ts`,\n// which asserts every code listed in the console source has a matching CLI\n// translation entry.\n\nexport type ValidationCode = string\n\nexport type PermissionCode =\n | 'tenant_mismatch'\n | 'account_suspended'\n | 'feature_disabled'\n | 'role_denied'\n | 'credential_invalid'\n | 'pat_tenant_unpinned'\n | 'publishable_key_mismatch'\n | 'scope_denied'\n\nexport type DegradedCode =\n | 'redis_unavailable'\n | 'provider_unavailable'\n | 'rate_limited'\n\nexport type NetworkCode = 'upstream_timeout' | 'upstream_5xx' | 'dns_failure'\n\nexport type AdminErrorCode =\n | PermissionCode\n | DegradedCode\n | NetworkCode\n | ValidationCode\n\nexport type AdminError =\n | {\n type: 'validation'\n code: ValidationCode\n field?: string\n detail?: Record<string, unknown>\n }\n | {\n type: 'permission'\n code: PermissionCode\n detail?: Record<string, unknown>\n }\n | {\n type: 'degraded'\n code: DegradedCode\n retryAfter?: number\n detail?: Record<string, unknown>\n }\n | {\n type: 'network'\n code: NetworkCode\n detail?: Record<string, unknown>\n }\n\nconst PERMISSION_CODES: readonly PermissionCode[] = [\n 'tenant_mismatch',\n 'account_suspended',\n 'feature_disabled',\n 'role_denied',\n 'credential_invalid',\n 'pat_tenant_unpinned',\n 'publishable_key_mismatch',\n 'scope_denied',\n]\n\nconst DEGRADED_CODES: readonly DegradedCode[] = [\n 'redis_unavailable',\n 'provider_unavailable',\n 'rate_limited',\n]\n\nconst NETWORK_CODES: readonly NetworkCode[] = [\n 'upstream_timeout',\n 'upstream_5xx',\n 'dns_failure',\n]\n\nfunction isPermissionCode(code: string): code is PermissionCode {\n return (PERMISSION_CODES as readonly string[]).includes(code)\n}\n\nfunction isDegradedCode(code: string): code is DegradedCode {\n return (DEGRADED_CODES as readonly string[]).includes(code)\n}\n\nfunction isNetworkCode(code: string): code is NetworkCode {\n return (NETWORK_CODES as readonly string[]).includes(code)\n}\n\n/**\n * Classify an unknown thrown / rejected value into the AdminError union.\n * Heuristic mirrors `apps/console/src/lib/admin-error.ts:classifyError`:\n * 1. Object with `code: string` matching a known literal → typed bucket.\n * 2. Object with explicit `type` matching a union tag → trusted as-is.\n * 3. Anything else → `validation` / `unknown`.\n *\n * Additional heuristic (CLI-only): SDK error names + HTTP status fall\n * through to a sensible AdminError so existing thrown values continue to\n * classify even before callers migrate to literal codes.\n */\nexport function classifyError(err: unknown): AdminError {\n if (err && typeof err === 'object') {\n const obj = err as Record<string, unknown>\n\n if (typeof obj.code === 'string') {\n const code = obj.code\n if (isPermissionCode(code)) {\n return { type: 'permission', code }\n }\n if (isDegradedCode(code)) {\n const out: AdminError = { type: 'degraded', code }\n if (typeof obj.retryAfter === 'number') {\n out.retryAfter = obj.retryAfter\n }\n return out\n }\n if (isNetworkCode(code)) {\n return { type: 'network', code }\n }\n }\n\n if (obj.type === 'validation' && typeof obj.code === 'string') {\n const out: AdminError = { type: 'validation', code: obj.code }\n if (typeof obj.field === 'string') out.field = obj.field\n if (obj.detail && typeof obj.detail === 'object') {\n out.detail = obj.detail as Record<string, unknown>\n }\n return out\n }\n\n // CLI fallback: SDK error names + HTTP status.\n const name = typeof obj.name === 'string' ? obj.name : undefined\n const status = typeof obj.status === 'number' ? obj.status : undefined\n if (name === 'ConfigError' || status === 401) {\n return { type: 'permission', code: 'credential_invalid' }\n }\n if (\n name === 'NetworkError' ||\n name === 'TimeoutError' ||\n status === 408 ||\n status === 503\n ) {\n return { type: 'network', code: 'upstream_timeout' }\n }\n if (name === 'GoneError' || status === 404) {\n return {\n type: 'validation',\n code: 'not_found',\n detail:\n typeof obj.message === 'string'\n ? { message: obj.message }\n : undefined,\n }\n }\n if (name === 'UsageLimitError' || status === 429) {\n const out: AdminError = { type: 'degraded', code: 'rate_limited' }\n if (typeof obj.retryAfter === 'number') out.retryAfter = obj.retryAfter\n return out\n }\n if (name === 'ValidationError' || status === 400 || status === 422) {\n return {\n type: 'validation',\n code: 'invalid_argument',\n detail:\n typeof obj.message === 'string'\n ? { message: obj.message }\n : undefined,\n }\n }\n }\n\n return {\n type: 'validation',\n code: 'unknown',\n detail: { message: err instanceof Error ? err.message : String(err) },\n }\n}\n\n/**\n * Map AdminError → CLI exit code per `docs/packages/cli-exit-codes.md`.\n * permission → 2\n * validation → 3 (`not_found` → 5; `unknown` → 1)\n * network → 4\n * degraded → 6 (`rate_limited`; provider_unavailable /\n * redis_unavailable keep 4 as the canonical \"upstream\n * failure\")\n *\n * Exit code 1 is reserved for the \"we don't know\" bucket (matching the\n * shell-script contract). The `unknown` validation code is the explicit\n * channel for that — `classifyError` routes anything it cannot identify\n * here.\n */\nexport function adminErrorExitCode(err: AdminError): number {\n if (err.code === 'unknown') return 1\n switch (err.type) {\n case 'permission':\n return 2\n case 'validation':\n return err.code === 'not_found' ? 5 : 3\n case 'network':\n return 4\n case 'degraded':\n return err.code === 'rate_limited' ? 6 : 4\n }\n}\n\nexport const ADMIN_ERROR_CODES = {\n permission: PERMISSION_CODES,\n degraded: DEGRADED_CODES,\n network: NETWORK_CODES,\n} as const\n","// CLI i18n table — mirrors `apps/console/src/lib/i18n/admin.ts` AdminError\n// code coverage so a single check (`apps/console/scripts/check-i18n-parity.ts`)\n// can verify the CLI carries every code with both KO and EN translations.\n//\n// Locale resolution:\n// 1. CLI `--lang <ko|en>` (resolved by the entry point and exported via\n// `setLocale`).\n// 2. `LANG` / `LC_ALL` environment variables — anything starting with\n// `ko` (`ko_KR.UTF-8`, `ko-KR`, …) → ko; else en.\n// 3. Default `en`.\n\nexport const CLI_I18N_KO = {\n // CLI-surface microcopy\n AuthenticationRequired: '인증이 필요합니다',\n RunLoginToAuthenticate: '`01 login` 명령으로 브라우저 인증을 진행하거나,',\n PassApiKey: '`--api-key <token>` 옵션을 전달하거나,',\n SetEnvVars:\n '`SOFTWARE_PUBLISHABLE_KEY` / `SOFTWARE_SECRET_KEY` 환경 변수를 설정하세요.',\n InvalidApiKeyFormat:\n 'API 키 형식이 올바르지 않습니다. `sk01_` 또는 `pat01_` 토큰이 필요합니다.',\n RetiredHexCredentialsRejected:\n '이전 hex 자격 증명은 더 이상 허용되지 않습니다 — `01 login`으로 다시 인증하세요.',\n InvalidJsonObject: '`--{{label}}` 인자는 JSON 객체여야 합니다.',\n InvalidJsonArray: '`--{{label}}` 인자는 JSON 배열이어야 합니다.',\n InvalidJsonValue: '`--{{label}}` 인자의 JSON 형식이 올바르지 않습니다: {{value}}',\n Empty: '(없음)',\n Total: '총 {{n}}개',\n PageOf: '{{page}} / {{total}} 페이지',\n\n // AdminError code translations (mirrors apps/console admin.ts).\n tenant_mismatch: '권한이 없는 테넌트',\n account_suspended: '계정이 정지되었습니다',\n feature_disabled: '이 기능이 비활성화되었습니다',\n role_denied: '권한이 부족합니다',\n credential_invalid: '자격 증명이 유효하지 않습니다',\n pat_tenant_unpinned: 'PAT 토큰의 테넌트가 고정되지 않았습니다',\n publishable_key_mismatch: '공개 키가 일치하지 않습니다',\n scope_denied: '범위 권한이 없습니다',\n redis_unavailable: '캐시가 일시적으로 사용 불가합니다',\n provider_unavailable: '외부 공급자가 응답하지 않습니다',\n rate_limited: '요청이 너무 많습니다 — 잠시 후 다시 시도하세요',\n upstream_timeout: '응답 시간이 초과되었습니다',\n upstream_5xx: '외부 서비스 오류',\n dns_failure: '네트워크 연결 오류',\n not_found: '리소스를 찾을 수 없습니다',\n invalid_argument: '인자가 올바르지 않습니다',\n unknown: '알 수 없는 오류',\n} as const\n\nexport type CliI18nKey = keyof typeof CLI_I18N_KO\n\nexport const CLI_I18N_EN: Record<CliI18nKey, string> = {\n AuthenticationRequired: 'Authentication required',\n RunLoginToAuthenticate:\n 'Run `01 login` to authenticate via browser, or',\n PassApiKey: 'pass `--api-key <token>`, or',\n SetEnvVars:\n 'set `SOFTWARE_PUBLISHABLE_KEY` and `SOFTWARE_SECRET_KEY` environment variables.',\n InvalidApiKeyFormat:\n 'Invalid API key format. Expected `sk01_` or `pat01_` token.',\n RetiredHexCredentialsRejected:\n 'Retired hex credentials are no longer accepted — run `01 login` to re-authenticate.',\n InvalidJsonObject: '--{{label}} must be a JSON object.',\n InvalidJsonArray: '--{{label}} must be a JSON array.',\n InvalidJsonValue: 'Invalid JSON for --{{label}}: {{value}}',\n Empty: '(empty)',\n Total: '{{n}} total',\n PageOf: 'page {{page}}/{{total}}',\n\n tenant_mismatch: 'Tenant access denied',\n account_suspended: 'Your account has been suspended',\n feature_disabled: 'This feature is disabled',\n role_denied: 'Insufficient role permissions',\n credential_invalid: 'Invalid credentials',\n pat_tenant_unpinned: 'PAT token tenant is not pinned',\n publishable_key_mismatch: 'Publishable key mismatch',\n scope_denied: 'Scope permission denied',\n redis_unavailable: 'Cache temporarily unavailable',\n provider_unavailable: 'Upstream provider unavailable',\n rate_limited: 'Too many requests — please try again shortly',\n upstream_timeout: 'Upstream request timed out',\n upstream_5xx: 'Upstream service error',\n dns_failure: 'Network connection error',\n not_found: 'Resource not found',\n invalid_argument: 'Invalid argument',\n unknown: 'Unknown error',\n}\n\nexport type Locale = 'ko' | 'en'\n\nlet activeLocale: Locale | null = null\n\nexport function detectLocale(): Locale {\n if (activeLocale) return activeLocale\n const raw =\n process.env.LC_ALL ?? process.env.LANG ?? process.env.LANGUAGE ?? ''\n return raw.toLowerCase().startsWith('ko') ? 'ko' : 'en'\n}\n\nexport function setLocale(locale: Locale | null | undefined): void {\n activeLocale = locale ?? null\n}\n\nexport function t(\n key: CliI18nKey,\n vars?: Record<string, string | number>,\n): string {\n const table = detectLocale() === 'ko' ? CLI_I18N_KO : CLI_I18N_EN\n let s: string = table[key]\n if (vars) {\n for (const [k, v] of Object.entries(vars)) {\n // Use a global regex (escape user-supplied key) instead of\n // String.prototype.replaceAll so we keep working on tsconfig\n // targets older than ES2021. Keys are statically declared above so\n // metacharacter escaping is defense-in-depth.\n const escaped = k.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n s = s.replace(new RegExp(`\\\\{\\\\{${escaped}\\\\}\\\\}`, 'g'), String(v))\n }\n }\n return s\n}\n","import { readFileSync } from 'node:fs'\nimport { basename } from 'node:path'\nimport { Command } from 'commander'\nimport { COLLECTIONS } from '@01.software/sdk'\nimport type { ApiQueryOptions } from '@01.software/sdk'\nimport type { ResolvedClient } from '../lib/client.js'\nimport { printResult, exitWithError } from '../lib/output.js'\nimport { parseJson } from '../lib/parse.js'\n\nfunction readFileAsBlob(filePath: string): { blob: Blob; filename: string } {\n const buffer = readFileSync(filePath)\n return { blob: new Blob([buffer]), filename: basename(filePath) }\n}\n\nfunction validateCollection(name: string): string {\n if (!(COLLECTIONS as readonly string[]).includes(name)) {\n const normalized = name.replace(/-/g, '').toLowerCase()\n const suggestions = COLLECTIONS.filter((c) => {\n const cn = c.replace(/-/g, '').toLowerCase()\n return (\n cn.startsWith(normalized) ||\n normalized.startsWith(cn) ||\n (normalized.length >= 3 && cn.includes(normalized))\n )\n }).slice(0, 5)\n const hint =\n suggestions.length > 0\n ? `Did you mean: ${suggestions.join(', ')}?`\n : 'Run \"01 --help\" for available collections.'\n throw new Error(`Unknown collection \"${name}\". ${hint}`)\n }\n return name\n}\n\nfunction parseSelect(input: string): Record<string, boolean> {\n return Object.fromEntries(input.split(',').map((f) => [f.trim(), true]))\n}\n\nexport function registerCrudCommands(\n program: Command,\n getClient: () => ResolvedClient,\n getFormat: () => string,\n) {\n program\n .command('query <collection>')\n .description('Query documents from a collection')\n .option('--where <json>', 'Filter conditions (JSON)')\n .option('--limit <n>', 'Max results', (v: string) => parseInt(v, 10))\n .option('--page <n>', 'Page number', (v: string) => parseInt(v, 10))\n .option('--sort <field>', 'Sort field (prefix with - for descending)')\n .option(\n '--depth <n>',\n 'Relationship depth (0 = no population)',\n (v: string) => parseInt(v, 10),\n )\n .option('--select <fields>', 'Comma-separated fields to select')\n .action(async (collection: string, opts) => {\n try {\n const col = validateCollection(collection)\n const client = getClient()\n const options: Record<string, unknown> = {}\n if (opts.where) options.where = parseJson(opts.where, 'where')\n if (opts.limit) options.limit = opts.limit\n if (opts.page) options.page = opts.page\n if (opts.sort) options.sort = opts.sort\n if (opts.depth != null) options.depth = opts.depth\n if (opts.select) options.select = parseSelect(opts.select)\n const result = await client.collections\n .from(col as (typeof COLLECTIONS)[number])\n .find(options)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n program\n .command('get <collection> <id>')\n .description('Get a document by ID')\n .option(\n '--depth <n>',\n 'Relationship depth (0 = no population)',\n (v: string) => parseInt(v, 10),\n )\n .option('--select <fields>', 'Comma-separated fields to select')\n .action(async (collection: string, id: string, opts) => {\n try {\n const col = validateCollection(collection)\n const client = getClient()\n const options: Record<string, unknown> = {}\n if (opts.depth != null) options.depth = opts.depth\n if (opts.select) options.select = parseSelect(opts.select)\n const result = await client.collections\n .from(col as (typeof COLLECTIONS)[number])\n .findById(id, options)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n program\n .command('create <collection>')\n .description('Create a new document')\n .requiredOption('--data <json>', 'Document data (JSON)')\n .option('--file <path>', 'File to upload (for upload collections)')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (collection: string, opts) => {\n try {\n const col = validateCollection(collection)\n const data = parseJson(opts.data, 'data')\n if (opts.dryRun) {\n printResult(\n {\n dryRun: true,\n valid: true,\n action: 'create',\n collection: col,\n data,\n },\n getFormat(),\n )\n return\n }\n const client = getClient()\n let fileOpts: { file: Blob; filename: string } | undefined\n if (opts.file) {\n const { blob, filename } = readFileAsBlob(opts.file)\n fileOpts = { file: blob, filename }\n }\n const result = await client.collections\n .from(col as (typeof COLLECTIONS)[number])\n .create(data, fileOpts)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n program\n .command('update <collection> <id>')\n .description('Update a document by ID')\n .requiredOption('--data <json>', 'Document data (JSON)')\n .option('--file <path>', 'File to upload (for upload collections)')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (collection: string, id: string, opts) => {\n try {\n const col = validateCollection(collection)\n const data = parseJson(opts.data, 'data')\n if (opts.dryRun) {\n printResult(\n {\n dryRun: true,\n valid: true,\n action: 'update',\n collection: col,\n id,\n data,\n },\n getFormat(),\n )\n return\n }\n const client = getClient()\n let fileOpts: { file: Blob; filename: string } | undefined\n if (opts.file) {\n const { blob, filename } = readFileAsBlob(opts.file)\n fileOpts = { file: blob, filename }\n }\n const result = await client.collections\n .from(col as (typeof COLLECTIONS)[number])\n .update(id, data, fileOpts)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n program\n .command('delete <collection> <id>')\n .description('Delete a document by ID')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (collection: string, id: string, opts) => {\n try {\n const col = validateCollection(collection)\n if (opts.dryRun) {\n printResult(\n {\n dryRun: true,\n valid: true,\n action: 'delete',\n collection: col,\n id,\n },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.collections\n .from(col as (typeof COLLECTIONS)[number])\n .remove(id)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n program\n .command('update-many <collection>')\n .description('Update multiple documents matching a filter')\n .requiredOption('--where <json>', 'Filter conditions (JSON)')\n .requiredOption('--data <json>', 'Update data (JSON)')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (collection: string, opts) => {\n try {\n const col = validateCollection(collection)\n const where = parseJson(opts.where, 'where') as ApiQueryOptions['where']\n const data = parseJson(opts.data, 'data')\n if (opts.dryRun) {\n printResult(\n {\n dryRun: true,\n valid: true,\n action: 'update-many',\n collection: col,\n where,\n data,\n },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.collections\n .from(col as (typeof COLLECTIONS)[number])\n .updateMany(where, data)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n program\n .command('delete-many <collection>')\n .description('Delete multiple documents matching a filter')\n .requiredOption('--where <json>', 'Filter conditions (JSON)')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (collection: string, opts) => {\n try {\n const col = validateCollection(collection)\n const where = parseJson(opts.where, 'where') as ApiQueryOptions['where']\n if (opts.dryRun) {\n printResult(\n {\n dryRun: true,\n valid: true,\n action: 'delete-many',\n collection: col,\n where,\n },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.collections\n .from(col as (typeof COLLECTIONS)[number])\n .removeMany(where)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n}\n","import { exitWithError } from './output.js'\nimport { t } from './i18n.js'\nimport type { z } from 'zod'\n\n/**\n * Throw an AdminError-shaped object so `exitWithError` can render it correctly\n * under `--format json` and exit with code 3 (validation). The `code` literal\n * `invalid_argument` is already in the validation bucket per `admin-error.ts`.\n */\nfunction failArg(\n label: string,\n value: string,\n expectedKind: 'object' | 'array' | 'value',\n): never {\n const message =\n expectedKind === 'object'\n ? t('InvalidJsonObject', { label })\n : expectedKind === 'array'\n ? t('InvalidJsonArray', { label })\n : t('InvalidJsonValue', { label, value })\n exitWithError({\n type: 'validation',\n code: 'invalid_argument',\n field: label,\n // `message` is read by `printError` for the stderr headline so the\n // user sees the label/value in the one-line summary; `detail` carries\n // the structured fields for `--format json` consumers.\n message,\n detail: { message, value, field: label },\n })\n}\n\nfunction stringifyValue(value: unknown): string {\n try {\n return JSON.stringify(value)\n } catch {\n return String(value)\n }\n}\n\nfunction formatSchemaIssues(\n label: string,\n issues: readonly { path: readonly string[]; message: string }[],\n): string {\n return issues\n .map((issue) => {\n const path = issue.path.length > 0 ? issue.path.join('.') : label\n return `${path}: ${issue.message}`\n })\n .join('; ')\n}\n\nexport function parseWithSchema<T>(\n value: unknown,\n label: string,\n schema: z.ZodType<T>,\n): T {\n const parsed = schema.safeParse(value)\n if (parsed.success) return parsed.data\n\n const issues = parsed.error.issues.map((issue) => ({\n path: issue.path.map(String),\n message: issue.message,\n }))\n const message = `Invalid value for --${label}: ${formatSchemaIssues(label, issues)}`\n\n exitWithError({\n type: 'validation',\n code: 'invalid_argument',\n field: label,\n message,\n detail: {\n message,\n value: stringifyValue(value),\n field: label,\n issues,\n },\n })\n}\n\nexport function parseJson(\n value: string,\n label: string,\n options: { format?: string } = {},\n): Record<string, unknown> {\n let parsed: unknown\n try {\n parsed = JSON.parse(value)\n } catch {\n return failArg(label, value, 'value')\n }\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n return failArg(label, value, 'object')\n }\n void options\n return parsed as Record<string, unknown>\n}\n\nexport function parseJsonArray(\n value: string,\n label: string,\n options: { format?: string } = {},\n): unknown[] {\n let parsed: unknown\n try {\n parsed = JSON.parse(value)\n } catch {\n return failArg(label, value, 'value')\n }\n if (!Array.isArray(parsed)) {\n return failArg(label, value, 'array')\n }\n void options\n return parsed\n}\n","import { Command } from 'commander'\nimport { z } from 'zod'\nimport type { ResolvedClient } from '../lib/client.js'\nimport { printResult, exitWithError } from '../lib/output.js'\nimport { parseJson, parseJsonArray, parseWithSchema } from '../lib/parse.js'\n\nconst idSchema = z.union([z.string().min(1), z.number()]).transform(String)\n\nconst customerSnapshotSchema = z\n .object({\n email: z.string().email('Invalid email format'),\n name: z.string().optional(),\n phone: z.string().optional(),\n })\n .strict()\n\nconst shippingAddressSchema = z\n .object({\n postalCode: z.string().optional(),\n address: z.string().optional(),\n detailAddress: z.string().optional(),\n deliveryMessage: z.string().optional(),\n recipientName: z.string().optional(),\n phone: z.string().optional(),\n })\n .strict()\n\nconst orderItemSchema = z\n .object({\n product: idSchema,\n variant: idSchema,\n option: idSchema,\n quantity: z.number().int().positive('quantity must be a positive integer'),\n unitPrice: z.number().optional(),\n totalPrice: z.number().optional(),\n })\n .strict()\n\nconst orderItemsSchema = z\n .array(orderItemSchema)\n .min(1, 'At least one order item is required')\n .max(100, 'Maximum 100 items per order')\n\nconst orderStatusSchema = z.enum([\n 'pending',\n 'paid',\n 'failed',\n 'canceled',\n 'preparing',\n 'shipped',\n 'delivered',\n 'confirmed',\n])\n\nconst fulfillmentItemsSchema = z\n .array(\n z\n .object({\n orderItem: idSchema,\n quantity: z\n .number()\n .int()\n .positive('quantity must be a positive integer'),\n })\n .strict(),\n )\n .min(1, 'At least one fulfillment item is required')\n .max(100, 'Maximum 100 items per fulfillment')\n\nexport function registerOrderCommands(\n program: Command,\n getClient: () => ResolvedClient,\n getFormat: () => string,\n) {\n const order = program.command('order').description('Order management')\n\n order\n .command('create')\n .description('Create a new order')\n .option('--payment-id <id>', 'Payment ID')\n .requiredOption('--order-number <num>', 'Order number')\n .requiredOption('--email <email>', 'Customer email')\n .option('--customer <id>', 'Customer ID')\n .option('--name <name>', 'Customer name')\n .option('--phone <phone>', 'Customer phone')\n .requiredOption('--shipping-address <json>', 'Shipping address (JSON)')\n .requiredOption('--products <json>', 'Order products array (JSON)')\n .requiredOption('--total-amount <n>', 'Total amount', parseFloat)\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (opts) => {\n try {\n const shippingAddress = parseWithSchema(\n parseJson(opts.shippingAddress, 'shipping-address'),\n 'shipping-address',\n shippingAddressSchema,\n )\n const orderItems = parseWithSchema(\n parseJsonArray(opts.products, 'products'),\n 'products',\n orderItemsSchema,\n )\n const totalAmount = parseWithSchema(\n opts.totalAmount,\n 'total-amount',\n z.number().nonnegative('totalAmount must be non-negative'),\n )\n const data = {\n pgPaymentId: opts.paymentId,\n orderNumber: opts.orderNumber,\n customerSnapshot: {\n email: opts.email,\n name: opts.name,\n phone: opts.phone,\n },\n customer: opts.customer,\n shippingAddress,\n orderItems,\n totalAmount,\n }\n if (opts.dryRun) {\n printResult(\n { dryRun: true, valid: true, action: 'order create', data },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.commerce.orders.create({\n ...data,\n orderItems: orderItems as Parameters<\n typeof client.commerce.orders.create\n >[0]['orderItems'],\n })\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n order\n .command('get <orderNumber>')\n .description('Get an order by order number')\n .action(async (orderNumber: string) => {\n try {\n const client = getClient()\n const { docs: [order] } = await client.collections.from('orders').find({ where: { orderNumber: { equals: orderNumber } }, limit: 1, depth: 1 })\n if (!order) throw new Error('Order not found')\n printResult(order, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n order\n .command('update <orderNumber>')\n .description('Update order status')\n .requiredOption('--status <status>', 'New status')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (orderNumber: string, opts) => {\n try {\n const status = parseWithSchema(opts.status, 'status', orderStatusSchema)\n const data = { orderNumber, status }\n if (opts.dryRun) {\n printResult(\n { dryRun: true, valid: true, action: 'order update', data },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.commerce.orders.update(data)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n order\n .command('checkout')\n .description('Convert a cart to an order')\n .requiredOption('--cart-id <id>', 'Cart ID')\n .option('--payment-id <id>', 'Payment ID (optional for free orders)')\n .requiredOption('--order-number <num>', 'Order number')\n .requiredOption('--customer <json>', 'Customer snapshot (JSON)')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (opts) => {\n try {\n const customerSnapshot = parseWithSchema(\n parseJson(opts.customer, 'customer'),\n 'customer',\n customerSnapshotSchema,\n )\n const data = {\n cartId: opts.cartId,\n pgPaymentId: opts.paymentId,\n orderNumber: opts.orderNumber,\n customerSnapshot,\n }\n if (opts.dryRun) {\n printResult(\n { dryRun: true, valid: true, action: 'order checkout', data },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.commerce.orders.checkout({\n ...data,\n customerSnapshot: customerSnapshot as Parameters<\n typeof client.commerce.orders.checkout\n >[0]['customerSnapshot'],\n })\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n order\n .command('fulfill <orderNumber>')\n .description('Create a fulfillment for an order')\n .requiredOption('--items <json>', 'Fulfillment items array (JSON)')\n .option('--carrier <name>', 'Shipping carrier')\n .option('--tracking-number <num>', 'Tracking number')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (orderNumber: string, opts) => {\n try {\n const items = parseWithSchema(\n parseJsonArray(opts.items, 'items'),\n 'items',\n fulfillmentItemsSchema,\n )\n const data = {\n orderNumber,\n items,\n carrier: opts.carrier,\n trackingNumber: opts.trackingNumber,\n }\n if (opts.dryRun) {\n printResult(\n { dryRun: true, valid: true, action: 'order fulfill', data },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.commerce.orders.createFulfillment({\n ...data,\n items: items as Parameters<\n typeof client.commerce.orders.createFulfillment\n >[0]['items'],\n })\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n}\n","import { Command } from 'commander'\nimport { z } from 'zod'\nimport type { ResolvedClient } from '../lib/client.js'\nimport { printResult, exitWithError } from '../lib/output.js'\nimport { parseJsonArray, parseWithSchema } from '../lib/parse.js'\n\nconst idSchema = z.union([z.string().min(1), z.number()]).transform(String)\n\nconst returnReasonSchema = z\n .enum(['change_of_mind', 'defective', 'wrong_delivery', 'damaged', 'other'])\n .optional()\n\nconst returnItemsSchema = z\n .array(\n z\n .object({\n orderItem: idSchema,\n quantity: z\n .number()\n .int()\n .positive('quantity must be a positive integer'),\n restockAction: z\n .enum(['return_to_stock', 'discard'])\n .default('return_to_stock'),\n })\n .strict(),\n )\n .min(1, 'At least one return item is required')\n .max(100, 'Too many return items')\n\nconst returnStatusSchema = z.enum([\n 'processing',\n 'approved',\n 'rejected',\n 'completed',\n])\n\nconst refundAmountSchema = z\n .number()\n .nonnegative('refundAmount must be non-negative')\n\nexport function registerReturnCommands(\n program: Command,\n getClient: () => ResolvedClient,\n getFormat: () => string,\n) {\n const ret = program.command('return').description('Return management')\n\n ret\n .command('create <orderNumber>')\n .description('Create a return request')\n .requiredOption('--products <json>', 'Return products array (JSON)')\n .requiredOption('--refund-amount <n>', 'Refund amount', parseFloat)\n .option(\n '--reason <reason>',\n 'Return reason (change_of_mind, defective, wrong_delivery, damaged, other)',\n )\n .option('--reason-detail <text>', 'Detailed reason')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (orderNumber: string, opts) => {\n try {\n const returnItems = parseWithSchema(\n parseJsonArray(opts.products, 'products'),\n 'products',\n returnItemsSchema,\n )\n const refundAmount = parseWithSchema(\n opts.refundAmount,\n 'refund-amount',\n refundAmountSchema,\n )\n const reason = parseWithSchema(\n opts.reason,\n 'reason',\n returnReasonSchema,\n )\n const data = {\n orderNumber,\n returnItems,\n refundAmount,\n reason,\n reasonDetail: opts.reasonDetail,\n }\n if (opts.dryRun) {\n printResult(\n { dryRun: true, valid: true, action: 'return create', data },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.commerce.orders.createReturn({\n ...data,\n returnItems: returnItems as Parameters<\n typeof client.commerce.orders.createReturn\n >[0]['returnItems'],\n })\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n ret\n .command('update <returnId>')\n .description('Update return status')\n .requiredOption(\n '--status <status>',\n 'New status (processing, approved, rejected, completed)',\n )\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (returnId: string, opts) => {\n try {\n const status = parseWithSchema(opts.status, 'status', returnStatusSchema)\n const data = { returnId, status }\n if (opts.dryRun) {\n printResult(\n { dryRun: true, valid: true, action: 'return update', data },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.commerce.orders.updateReturn(data)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n ret\n .command('refund <orderNumber>')\n .description('Return with refund')\n .requiredOption('--products <json>', 'Return products array (JSON)')\n .requiredOption('--refund-amount <n>', 'Refund amount', parseFloat)\n .requiredOption('--payment-id <id>', 'Payment ID')\n .option('--reason <reason>', 'Return reason')\n .option('--reason-detail <text>', 'Detailed reason')\n .option('--refund-receipt-url <url>', 'Refund receipt URL')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (orderNumber: string, opts) => {\n try {\n const returnItems = parseWithSchema(\n parseJsonArray(opts.products, 'products'),\n 'products',\n returnItemsSchema,\n )\n const refundAmount = parseWithSchema(\n opts.refundAmount,\n 'refund-amount',\n refundAmountSchema,\n )\n const reason = parseWithSchema(\n opts.reason,\n 'reason',\n returnReasonSchema,\n )\n const data = {\n orderNumber,\n returnItems,\n refundAmount,\n pgPaymentId: opts.paymentId,\n reason,\n reasonDetail: opts.reasonDetail,\n refundReceiptUrl: opts.refundReceiptUrl,\n }\n if (opts.dryRun) {\n printResult(\n { dryRun: true, valid: true, action: 'return refund', data },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.commerce.orders.returnWithRefund({\n ...data,\n returnItems: returnItems as Parameters<\n typeof client.commerce.orders.returnWithRefund\n >[0]['returnItems'],\n })\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n}\n","import { Command } from 'commander'\nimport type { ResolvedClient } from '../lib/client.js'\nimport { printResult, exitWithError } from '../lib/output.js'\n\nexport function registerCartCommands(\n program: Command,\n getClient: () => ResolvedClient,\n getFormat: () => string,\n) {\n const cart = program.command('cart').description('Cart management')\n\n cart\n .command('add <cartId>')\n .description('Add an item to cart')\n .requiredOption('--product <id>', 'Product ID')\n .requiredOption('--variant <id>', 'Variant ID')\n .requiredOption('--option <id>', 'Option ID')\n .requiredOption('--quantity <n>', 'Quantity', (v: string) =>\n parseInt(v, 10),\n )\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (cartId: string, opts) => {\n try {\n const data = {\n cartId,\n product: opts.product,\n variant: opts.variant,\n option: opts.option,\n quantity: opts.quantity,\n }\n if (opts.dryRun) {\n printResult(\n { dryRun: true, valid: true, action: 'cart add', data },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.commerce.cart.addItem(data)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n cart\n .command('update <cartItemId>')\n .description('Update cart item quantity')\n .requiredOption('--quantity <n>', 'New quantity', (v: string) =>\n parseInt(v, 10),\n )\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (cartItemId: string, opts) => {\n try {\n const data = { cartItemId, quantity: opts.quantity }\n if (opts.dryRun) {\n printResult(\n { dryRun: true, valid: true, action: 'cart update', data },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.commerce.cart.updateItem(data)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n\n cart\n .command('remove <cartItemId>')\n .description('Remove an item from cart')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (cartItemId: string, opts) => {\n try {\n if (opts.dryRun) {\n printResult(\n {\n dryRun: true,\n valid: true,\n action: 'cart remove',\n data: { cartItemId },\n },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.commerce.cart.removeItem({ cartItemId })\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n}\n","import { Command } from 'commander'\nimport type { ResolvedClient } from '../lib/client.js'\nimport { printResult, exitWithError } from '../lib/output.js'\nimport { parseJsonArray } from '../lib/parse.js'\n\nexport function registerStockCommands(\n program: Command,\n getClient: () => ResolvedClient,\n getFormat: () => string,\n) {\n const stock = program.command('stock').description('Stock management')\n\n stock\n .command('check')\n .description('Check stock availability')\n .requiredOption(\n '--items <json>',\n 'Items to check (JSON array of { optionId, quantity })',\n )\n .action(async (opts) => {\n try {\n const client = getClient()\n const items = parseJsonArray(opts.items, 'items') as Parameters<\n typeof client.commerce.product.stockCheck\n >[0]['items']\n const result = await client.commerce.product.stockCheck({ items })\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n}\n","import { Command } from 'commander'\nimport type { ResolvedClient } from '../lib/client.js'\nimport { printResult, exitWithError } from '../lib/output.js'\n\nexport function registerTransactionCommands(\n program: Command,\n getClient: () => ResolvedClient,\n getFormat: () => string,\n) {\n const tx = program\n .command('transaction')\n .description('Transaction management')\n\n tx.command('update')\n .description('Update transaction status')\n .requiredOption('--payment-id <id>', 'Payment ID')\n .requiredOption(\n '--status <status>',\n 'New status (pending, paid, failed, canceled)',\n )\n .requiredOption('--payment-method <method>', 'Payment method')\n .requiredOption('--receipt-url <url>', 'Receipt URL')\n .option('--dry-run', 'Validate inputs without executing')\n .action(async (opts) => {\n try {\n const data = {\n pgPaymentId: opts.paymentId,\n status: opts.status,\n paymentMethod: opts.paymentMethod,\n receiptUrl: opts.receiptUrl,\n }\n if (opts.dryRun) {\n printResult(\n { dryRun: true, valid: true, action: 'transaction update', data },\n getFormat(),\n )\n return\n }\n const client = getClient()\n const result = await client.commerce.orders.updateTransaction(data)\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n}\n","import { randomBytes } from 'node:crypto'\nimport { createServer } from 'node:http'\nimport { execFile, exec } from 'node:child_process'\nimport { platform } from 'node:os'\nimport { URL } from 'node:url'\nimport type { Command } from 'commander'\nimport pc from 'picocolors'\nimport {\n loadCredentials,\n saveCredentials,\n deleteCredentials,\n getCredentialsPath,\n loadLocalCredentials,\n saveLocalCredentials,\n getLocalCredentialsPath,\n loadTenantList,\n saveTenantList,\n type TenantInfo,\n} from '../lib/credentials.js'\n\nconst WEB_URL = process.env.SOFTWARE_WEB_URL || 'https://01.software'\nconst TIMEOUT_MS = 3 * 60 * 1000 // 3 minutes\n\nfunction escapeHtml(s: string): string {\n return s\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n}\n\nfunction openBrowser(url: string): void {\n const os = platform()\n\n const onError = () => {\n console.log(\n pc.yellow(\n `Could not open browser automatically. Open this URL manually:\\n${url}`,\n ),\n )\n }\n\n if (os === 'win32') {\n exec(`start \"\" \"${url}\"`, (err) => {\n if (err) onError()\n })\n } else {\n const cmd = os === 'darwin' ? 'open' : 'xdg-open'\n execFile(cmd, [url], (err) => {\n if (err) onError()\n })\n }\n}\n\nconst PAGE_STYLE = `*{margin:0;box-sizing:border-box}\nbody{font-family:system-ui,-apple-system,sans-serif;display:flex;justify-content:center;align-items:center;min-height:100vh;background:#fff;color:#252525}\n@media(prefers-color-scheme:dark){body{background:#252525;color:#f5f5f5}}\n.card{text-align:center;padding:2rem 2.5rem;border-radius:10px;max-width:380px;width:100%}\n.icon{width:40px;height:40px;margin:0 auto 1rem;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:1.25rem}\n.icon.ok{background:rgba(0,0,0,.05);color:#252525}\n.icon.err{background:rgba(220,38,38,.08);color:#dc2626}\n@media(prefers-color-scheme:dark){.icon.ok{background:rgba(255,255,255,.08);color:#f5f5f5}}\nh1{font-size:.875rem;font-weight:600;margin-bottom:.375rem}\np{font-size:.75rem;color:#737373;line-height:1.5}`\n\nconst SUCCESS_HTML = `<!DOCTYPE html>\n<html lang=\"en\"><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width\"><title>CLI Login</title>\n<style>${PAGE_STYLE}</style>\n</head><body><div class=\"card\"><div class=\"icon ok\">\\u2713</div><h1>Authenticated</h1><p>You can close this tab and return to the terminal.</p></div></body></html>`\n\nconst ERROR_HTML = (msg: string) => `<!DOCTYPE html>\n<html lang=\"en\"><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width\"><title>CLI Login Error</title>\n<style>${PAGE_STYLE}</style>\n</head><body><div class=\"card\"><div class=\"icon err\">!</div><h1>Authentication failed</h1><p>${escapeHtml(msg)}</p></div></body></html>`\n\ninterface ExchangeResponse {\n publishableKey: string\n secretKey: string\n tenantName: string\n tenantId: string\n tenants?: TenantInfo[]\n}\n\nasync function exchangeCode(code: string): Promise<ExchangeResponse | null> {\n const url = `${WEB_URL}/api/cli/exchange`\n try {\n const res = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ code }),\n })\n if (!res.ok) {\n const body = await res.text().catch(() => '')\n console.error(\n pc.red(\n `Exchange failed: HTTP ${res.status} from ${url}${body ? ` — ${body.slice(0, 200)}` : ''}`,\n ),\n )\n return null\n }\n const data = (await res.json()) as Partial<ExchangeResponse>\n if (\n typeof data.publishableKey !== 'string' ||\n typeof data.secretKey !== 'string' ||\n typeof data.tenantName !== 'string' ||\n typeof data.tenantId !== 'string'\n ) {\n console.error(pc.red(`Exchange failed: malformed response from ${url}`))\n return null\n }\n return {\n publishableKey: data.publishableKey,\n secretKey: data.secretKey,\n tenantName: data.tenantName,\n tenantId: data.tenantId,\n tenants: Array.isArray(data.tenants)\n ? data.tenants.filter(\n (t): t is TenantInfo =>\n typeof (t as TenantInfo)?.id === 'string' &&\n typeof (t as TenantInfo)?.name === 'string',\n )\n : undefined,\n }\n } catch (err) {\n console.error(\n pc.red(\n `Exchange request to ${url} failed: ${err instanceof Error ? err.message : String(err)}`,\n ),\n )\n return null\n }\n}\n\n/**\n * Start a local HTTP server that receives the OAuth-style redirect callback\n * from the browser. The browser top-level-navigates to\n * http://127.0.0.1:{port}/callback?code={encryptedCode}&state={state}\n * and the CLI exchanges the opaque code with the web API to receive the\n * actual credentials server-to-server. This path has no CORS or PNA\n * preflight because the browser never issues a subresource fetch.\n */\nfunction startAuthServer(options: {\n state: string\n saveFn: (creds: {\n publishableKey: string\n secretKey: string\n tenantId?: string\n tenantName: string\n }) => void\n}): Promise<{ port: number; cleanup: (exitCode?: number) => void }> {\n return new Promise((resolve, reject) => {\n const server = createServer((req, res) => {\n if (!req.url) {\n res.writeHead(400).end()\n return\n }\n\n const url = new URL(req.url, `http://localhost`)\n\n if (url.pathname !== '/callback' || req.method !== 'GET') {\n res.writeHead(404).end()\n return\n }\n\n const error = url.searchParams.get('error')\n if (error) {\n res\n .writeHead(200, { 'Content-Type': 'text/html; charset=utf-8', Connection: 'close' })\n .end(ERROR_HTML(error))\n console.error(pc.red(`Login failed: ${error}`))\n cleanup(2)\n return\n }\n\n const code = url.searchParams.get('code')\n const receivedState = url.searchParams.get('state')\n\n if (!code || !receivedState) {\n res\n .writeHead(400, { 'Content-Type': 'text/html; charset=utf-8', Connection: 'close' })\n .end(ERROR_HTML('Missing code or state. Start over with \"01 login\".'))\n cleanup(2)\n return\n }\n\n if (receivedState !== options.state) {\n res\n .writeHead(403, { 'Content-Type': 'text/html; charset=utf-8', Connection: 'close' })\n .end(ERROR_HTML('State mismatch. Start over with \"01 login\".'))\n console.error(pc.red('Login failed: state mismatch.'))\n cleanup(2)\n return\n }\n\n exchangeCode(code).then((creds) => {\n if (!creds) {\n res\n .writeHead(400, { 'Content-Type': 'text/html; charset=utf-8', Connection: 'close' })\n .end(ERROR_HTML('Invalid or expired code. Start over with \"01 login\".'))\n console.error(pc.red('Login failed: code exchange failed.'))\n cleanup(2)\n return\n }\n\n options.saveFn({\n publishableKey: creds.publishableKey,\n secretKey: creds.secretKey,\n tenantId: creds.tenantId,\n tenantName: creds.tenantName,\n })\n\n if (creds.tenants && creds.tenants.length > 0) {\n saveTenantList(creds.tenants)\n }\n\n console.log(pc.green(`\\nLogged in successfully!`))\n console.log(pc.dim(`Tenant: ${creds.tenantName}`))\n\n res\n .writeHead(200, { 'Content-Type': 'text/html; charset=utf-8', Connection: 'close' })\n .end(SUCCESS_HTML)\n cleanup(0)\n })\n })\n\n let timeout: ReturnType<typeof setTimeout>\n let completed = false\n\n function cleanup(exitCode = 0) {\n if (completed) return\n completed = true\n clearTimeout(timeout)\n server.closeAllConnections?.()\n server.close(() => process.exit(exitCode))\n }\n\n server.listen(0, '127.0.0.1', () => {\n const addr = server.address()\n if (!addr || typeof addr === 'string') {\n reject(new Error('Failed to start local server.'))\n return\n }\n\n timeout = setTimeout(() => {\n console.error(\n pc.red('\\nLogin timed out (3 minutes). Please try again.'),\n )\n cleanup(4)\n }, TIMEOUT_MS)\n\n resolve({ port: addr.port, cleanup })\n })\n\n server.on('error', (err) => {\n reject(err)\n })\n })\n}\n\nexport function registerAuthCommands(program: Command): void {\n program\n .command('login')\n .description('Login via browser and store credentials')\n .action(async () => {\n const state = randomBytes(32).toString('hex')\n\n try {\n const { port } = await startAuthServer({\n state,\n saveFn: (creds) => {\n saveCredentials(creds)\n console.log(pc.dim(`Credentials saved to ${getCredentialsPath()}`))\n },\n })\n\n const params = new URLSearchParams({ port: String(port), state })\n const loginUrl = `${WEB_URL}/cli-auth?${params.toString()}`\n\n console.log(pc.dim('Opening browser for login...'))\n console.log(pc.dim(`If the browser does not open, visit:\\n${loginUrl}`))\n openBrowser(loginUrl)\n } catch (err) {\n console.error(\n pc.red(\n `Server error: ${err instanceof Error ? err.message : String(err)}`,\n ),\n )\n process.exit(4)\n }\n })\n\n program\n .command('logout')\n .description('Remove stored credentials')\n .action(() => {\n const deleted = deleteCredentials()\n if (deleted) {\n console.log(pc.green('Logged out. Credentials removed.'))\n } else {\n console.log(pc.dim('No stored credentials found.'))\n }\n })\n\n program\n .command('whoami')\n .description('Show current authentication status')\n .action(() => {\n // Check local credentials first\n const localCreds = loadLocalCredentials()\n const globalCreds = loadCredentials()\n const creds = localCreds || globalCreds\n const isLocal = !!localCreds\n\n if (!creds) {\n console.log(pc.dim('Not logged in. Run \"01 login\" to authenticate.'))\n return\n }\n\n const masked =\n creds.publishableKey.length > 8\n ? creds.publishableKey.slice(0, 4) + '...' + creds.publishableKey.slice(-4)\n : '****'\n\n const scope = isLocal ? pc.cyan(' (local)') : ''\n console.log(`Tenant: ${pc.bold(creds.tenantName)}${scope}`)\n console.log(`Publishable Key: ${pc.dim(masked)}`)\n console.log(`Stored at: ${pc.dim(creds.storedAt)}`)\n console.log(\n `File: ${pc.dim(isLocal ? getLocalCredentialsPath() : getCredentialsPath())}`,\n )\n })\n\n // -------------------------------------------------------------------------\n // tenant subcommands\n // -------------------------------------------------------------------------\n const tenant = program\n .command('tenant')\n .description('Manage tenant switching')\n\n tenant\n .command('list')\n .description('Show cached tenant list')\n .action(() => {\n const tenants = loadTenantList()\n if (!tenants || tenants.length === 0) {\n console.log(pc.dim('No cached tenants. Run \"01 login\" first.'))\n return\n }\n\n // Determine active tenant\n const localCreds = loadLocalCredentials()\n const globalCreds = loadCredentials()\n const activeCreds = localCreds || globalCreds\n const activeId = activeCreds?.tenantId\n const activeName = activeCreds?.tenantName\n\n console.log(pc.bold('Cached tenants:\\n'))\n for (const t of tenants) {\n const active = (activeId ? t.id === activeId : t.name === activeName)\n ? pc.green(' *')\n : ''\n console.log(` ${t.name}${active}`)\n }\n console.log()\n if (activeName) {\n const scope = localCreds ? '(local)' : '(global)'\n console.log(pc.dim(`* active ${scope}`))\n }\n })\n\n tenant\n .command('use <name>')\n .description('Switch to a different tenant via browser')\n .option('--local', 'Save credentials locally in the current project')\n .action(async (name: string, opts: { local?: boolean }) => {\n const tenants = loadTenantList()\n if (!tenants || tenants.length === 0) {\n console.error(pc.red('No cached tenants. Run \"01 login\" first.'))\n process.exit(2)\n }\n\n const match = tenants.find(\n (t) => t.name.toLowerCase() === name.toLowerCase(),\n )\n if (!match) {\n console.error(pc.red(`Tenant \"${name}\" not found in cache.`))\n console.error(\n pc.dim(`Available: ${tenants.map((t) => t.name).join(', ')}`),\n )\n process.exit(3)\n }\n\n const state = randomBytes(32).toString('hex')\n const isLocal = !!opts.local\n\n try {\n const { port } = await startAuthServer({\n state,\n saveFn: (creds) => {\n if (isLocal) {\n saveLocalCredentials(creds)\n console.log(\n pc.dim(`Credentials saved to ${getLocalCredentialsPath()}`),\n )\n } else {\n saveCredentials(creds)\n console.log(\n pc.dim(`Credentials saved to ${getCredentialsPath()}`),\n )\n }\n },\n })\n\n const params = new URLSearchParams({\n port: String(port),\n state,\n tenantId: match.id,\n })\n const loginUrl = `${WEB_URL}/cli-auth?${params.toString()}`\n\n console.log(pc.dim(`Switching to tenant \"${match.name}\"...`))\n console.log(pc.dim(`If the browser does not open, visit:\\n${loginUrl}`))\n openBrowser(loginUrl)\n } catch (err) {\n console.error(\n pc.red(\n `Server error: ${err instanceof Error ? err.message : String(err)}`,\n ),\n )\n process.exit(4)\n }\n })\n}\n","import { Command } from 'commander'\nimport { COLLECTIONS } from '@01.software/sdk'\nimport type { ResolvedClient } from '../lib/client.js'\nimport { printResult, exitWithError } from '../lib/output.js'\n\ndeclare const __DEFAULT_API_URL__: string\n\nfunction getApiUrl(): string {\n return (\n process.env.SOFTWARE_API_URL ||\n process.env.NEXT_PUBLIC_SOFTWARE_API_URL ||\n __DEFAULT_API_URL__\n ).replace(/\\/$/, '')\n}\n\nexport function registerSchemaCommands(\n program: Command,\n getClient: () => ResolvedClient,\n getFormat: () => string,\n) {\n const schema = program\n .command('schema')\n .description('Collection schema introspection')\n\n schema\n .command('list')\n .description('List available collections')\n .action(() => {\n printResult(COLLECTIONS, getFormat())\n })\n\n schema\n .command('show <collection>')\n .description('Show collection field schema')\n .action(async (collection: string) => {\n try {\n if (!(COLLECTIONS as readonly string[]).includes(collection)) {\n const normalized = collection.replace(/-/g, '').toLowerCase()\n const suggestions = (COLLECTIONS as readonly string[])\n .filter((c) => {\n const cn = c.replace(/-/g, '').toLowerCase()\n return (\n cn.startsWith(normalized) ||\n normalized.startsWith(cn) ||\n (normalized.length >= 3 && cn.includes(normalized))\n )\n })\n .slice(0, 5)\n const hint =\n suggestions.length > 0\n ? `Did you mean: ${suggestions.join(', ')}?`\n : 'Run \"01 schema list\" for available collections.'\n throw new Error(`Unknown collection \"${collection}\". ${hint}`)\n }\n const client = getClient()\n const baseUrl = getApiUrl()\n\n const url = `${baseUrl}/api/tenants/schema/${encodeURIComponent(collection)}`\n const response = await fetch(url, {\n headers: {\n 'X-Publishable-Key': client.publishableKey,\n Authorization: `Bearer ${client.secretKey}`,\n },\n })\n\n if (!response.ok) {\n const body = await response\n .json()\n .catch(() => ({ error: response.statusText }))\n const err = new Error(\n (body as { error?: string }).error || `HTTP ${response.status}`,\n )\n Object.assign(err, { status: response.status })\n throw err\n }\n\n const result = await response.json()\n printResult(result, getFormat())\n } catch (e) {\n exitWithError(e)\n }\n })\n}\n","import { z } from 'zod'\n\nexport const tenantFieldConfigStateSchema = z\n .object({\n hiddenFields: z.array(z.string()),\n isHidden: z.boolean(),\n })\n .strict()\n\nexport const tenantContextQuerySchema = z\n .object({\n counts: z.literal('true').optional(),\n })\n .strict()\n\nexport const tenantContextToolInputSchema = z\n .object({\n includeCounts: z\n .boolean()\n .optional()\n .default(false)\n .describe(\n 'Include per-collection document counts and config status (bypasses cache, slower)',\n ),\n })\n .strict()\n\nexport const tenantContextResponseSchema = z\n .object({\n tenant: z\n .object({\n id: z.string(),\n name: z.string(),\n plan: z.string(),\n planSource: z.string().optional(),\n authoritative: z.boolean().optional(),\n capabilityVersion: z.string().optional(),\n })\n .strict(),\n features: z.array(z.string()),\n collections: z\n .object({\n active: z.array(z.string()),\n inactive: z.array(z.string()),\n })\n .strict(),\n fieldConfigs: z.record(z.string(), tenantFieldConfigStateSchema),\n counts: z.record(z.string(), z.number()).optional(),\n config: z\n .object({\n webhookConfigured: z.boolean(),\n })\n .strict()\n .optional(),\n })\n .strict()\n\nexport const tenantFeatureProgressFeatureSchema = z.enum(['ecommerce'])\n\nexport const tenantFeatureProgressInputSchema = z\n .object({\n feature: tenantFeatureProgressFeatureSchema.describe(\n 'Feature to inspect for tenant implementation readiness',\n ),\n includeEvidence: z\n .boolean()\n .optional()\n .default(false)\n .describe('Include sanitized counts and static surface evidence'),\n })\n .strict()\n\nexport const tenantFeatureProgressStatusSchema = z.enum([\n 'ready',\n 'attention',\n 'blocked',\n])\n\nexport const tenantFeatureProgressItemStateSchema = z.enum([\n 'complete',\n 'incomplete',\n 'blocked',\n 'attention',\n 'optional',\n 'unknown',\n 'manual',\n 'not-applicable',\n])\n\nexport const tenantFeatureProgressSeveritySchema = z.enum([\n 'required',\n 'recommended',\n 'optional',\n])\n\nexport const tenantFeatureProgressEvidenceValueSchema = z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.null(),\n])\n\nexport const tenantFeatureProgressItemSchema = z\n .object({\n id: z.string(),\n title: z.string(),\n state: tenantFeatureProgressItemStateSchema,\n severity: tenantFeatureProgressSeveritySchema,\n summary: z.string(),\n evidence: z\n .record(z.string(), tenantFeatureProgressEvidenceValueSchema)\n .optional(),\n })\n .strict()\n\nexport const tenantFeatureProgressGroupSchema = z\n .object({\n id: z.string(),\n title: z.string(),\n summary: z.string().optional(),\n items: z.array(tenantFeatureProgressItemSchema),\n })\n .strict()\n\nexport const tenantFeatureProgressResponseSchema = z\n .object({\n schemaVersion: z.literal(1),\n feature: tenantFeatureProgressFeatureSchema,\n status: tenantFeatureProgressStatusSchema,\n generatedAt: z.string(),\n tenant: z\n .object({\n id: z.string(),\n name: z.string(),\n plan: z.string(),\n })\n .strict(),\n capability: z\n .object({\n effectiveFeatures: z.array(z.string()),\n planBlocked: z.array(z.string()),\n closureAdded: z.array(z.string()),\n })\n .strict(),\n summary: z\n .object({\n complete: z.number().int().nonnegative(),\n total: z.number().int().nonnegative(),\n blocking: z.number().int().nonnegative(),\n manual: z.number().int().nonnegative(),\n unknown: z.number().int().nonnegative(),\n })\n .strict(),\n groups: z.array(tenantFeatureProgressGroupSchema),\n })\n .strict()\n\nexport const COLLECTION_SCHEMA_CONTRACT_VERSION = 1\n\nexport const collectionSchemaEndpointParamsSchema = z\n .object({\n collectionSlug: z.string().min(1, 'collectionSlug is required'),\n })\n .strict()\n\nexport function createCollectionSchemaToolInputSchema<\n const T extends readonly [string, ...string[]],\n>(collections: T) {\n return z\n .object({\n collection: z.enum(collections).describe('Collection name (required)'),\n })\n .strict()\n}\n\nexport const collectionFieldOptionSchema = z\n .object({\n label: z.string(),\n value: z.string(),\n })\n .strict()\n\nexport interface CollectionFieldSchema {\n name: string\n path: string\n type: string\n required?: true\n unique?: true\n hasMany?: true\n relationTo?: string | string[]\n options?: Array<{ label: string; value: string }>\n hidden?: true\n systemManaged?: true\n writable?: boolean\n fields?: CollectionFieldSchema[]\n}\n\nexport const collectionFieldSchema: z.ZodType<CollectionFieldSchema> = z.lazy(\n () =>\n z\n .object({\n name: z.string(),\n path: z.string(),\n type: z.string(),\n required: z.literal(true).optional(),\n unique: z.literal(true).optional(),\n hasMany: z.literal(true).optional(),\n relationTo: z.union([z.string(), z.array(z.string())]).optional(),\n options: z.array(collectionFieldOptionSchema).optional(),\n hidden: z.literal(true).optional(),\n systemManaged: z.literal(true).optional(),\n writable: z.boolean().optional(),\n fields: z.array(collectionFieldSchema).optional(),\n })\n .strict(),\n)\n\nexport const collectionSchemaResponseSchema = z\n .object({\n contractVersion: z.literal(COLLECTION_SCHEMA_CONTRACT_VERSION),\n mode: z.literal('effective'),\n collection: z\n .object({\n slug: z.string(),\n timestamps: z.boolean(),\n alwaysActive: z.boolean(),\n feature: z.string().nullable(),\n systemFields: z.array(z.string()),\n visibility: z\n .object({\n collectionHidden: z.boolean(),\n hiddenFields: z.array(z.string()),\n })\n .strict(),\n fields: z.array(collectionFieldSchema),\n })\n .strict(),\n })\n .strict()\n\nexport type TenantFieldConfigState = z.infer<\n typeof tenantFieldConfigStateSchema\n>\nexport type TenantContextQuery = z.input<typeof tenantContextQuerySchema>\nexport type TenantContextToolInput = z.infer<\n typeof tenantContextToolInputSchema\n>\nexport type TenantContextResponse = z.infer<typeof tenantContextResponseSchema>\nexport type TenantFeatureProgressFeature = z.infer<\n typeof tenantFeatureProgressFeatureSchema\n>\nexport type TenantFeatureProgressInput = z.infer<\n typeof tenantFeatureProgressInputSchema\n>\nexport type TenantFeatureProgressStatus = z.infer<\n typeof tenantFeatureProgressStatusSchema\n>\nexport type TenantFeatureProgressItemState = z.infer<\n typeof tenantFeatureProgressItemStateSchema\n>\nexport type TenantFeatureProgressSeverity = z.infer<\n typeof tenantFeatureProgressSeveritySchema\n>\nexport type TenantFeatureProgressEvidenceValue = z.infer<\n typeof tenantFeatureProgressEvidenceValueSchema\n>\nexport type TenantFeatureProgressItem = z.infer<\n typeof tenantFeatureProgressItemSchema\n>\nexport type TenantFeatureProgressGroup = z.infer<\n typeof tenantFeatureProgressGroupSchema\n>\nexport type TenantFeatureProgressResponse = z.infer<\n typeof tenantFeatureProgressResponseSchema\n>\nexport type CollectionSchemaEndpointParams = z.infer<\n typeof collectionSchemaEndpointParamsSchema\n>\nexport type CollectionFieldOption = z.infer<typeof collectionFieldOptionSchema>\nexport type CollectionSchemaResponse = z.infer<\n typeof collectionSchemaResponseSchema\n>\n","import { Command } from 'commander'\nimport {\n tenantFeatureProgressInputSchema,\n tenantFeatureProgressResponseSchema,\n type TenantFeatureProgressResponse,\n} from '@01.software/contracts'\nimport type { ResolvedClient } from '../lib/client.js'\nimport { printResult, exitWithError } from '../lib/output.js'\nimport { parseWithSchema } from '../lib/parse.js'\n\ndeclare const __DEFAULT_API_URL__: string\n\nfunction getApiUrl(): string {\n return (\n process.env.SOFTWARE_API_URL ||\n process.env.NEXT_PUBLIC_SOFTWARE_API_URL ||\n __DEFAULT_API_URL__\n ).replace(/\\/$/, '')\n}\n\nfunction flattenProgress(progress: TenantFeatureProgressResponse) {\n return progress.groups.flatMap((group) =>\n group.items.map((item) => ({\n group: group.title,\n item: item.title,\n state: item.state,\n severity: item.severity,\n summary: item.summary,\n })),\n )\n}\n\nexport function registerFeatureCommands(\n program: Command,\n getClient: () => ResolvedClient,\n getFormat: () => string,\n) {\n const feature = program\n .command('feature')\n .description('Feature implementation progress checks')\n\n feature\n .command('check <feature>')\n .description('Check tenant implementation progress for a feature')\n .option('--evidence', 'Include sanitized evidence counts and surface flags')\n .action(async (featureName: string, options: { evidence?: boolean }) => {\n try {\n const input = parseWithSchema(\n {\n feature: featureName,\n includeEvidence: Boolean(options.evidence),\n },\n 'feature',\n tenantFeatureProgressInputSchema,\n )\n const client = getClient()\n const baseUrl = getApiUrl()\n const search = new URLSearchParams({ feature: input.feature })\n if (input.includeEvidence) search.set('includeEvidence', 'true')\n\n const response = await fetch(\n `${baseUrl}/api/tenants/feature-progress?${search.toString()}`,\n {\n headers: {\n 'X-Publishable-Key': client.publishableKey,\n Authorization: `Bearer ${client.secretKey}`,\n },\n },\n )\n\n if (!response.ok) {\n const body = await response\n .json()\n .catch(() => ({ error: response.statusText }))\n const err = new Error(\n (body as { error?: string }).error || `HTTP ${response.status}`,\n )\n Object.assign(err, { status: response.status })\n throw err\n }\n\n const result = tenantFeatureProgressResponseSchema.parse(\n await response.json(),\n )\n const format = getFormat()\n printResult(\n format === 'table' ? flattenProgress(result) : result,\n format,\n )\n } catch (error) {\n exitWithError(error)\n }\n })\n}\n","import { resolve, dirname } from 'node:path'\nimport { existsSync } from 'node:fs'\nimport { spawn } from 'node:child_process'\nimport { fileURLToPath } from 'node:url'\nimport type { Command } from 'commander'\nimport { resolveClient } from '../lib/client.js'\nimport { exitWithError } from '../lib/output.js'\n\nconst __dirname = dirname(fileURLToPath(import.meta.url))\n\nexport interface StdioEntryCandidate {\n label: string\n path: string\n}\n\n/**\n * Locate the MCP stdio entry point.\n * Resolve order:\n * 1. Packaged MCP server copied into packages/cli/dist/mcp/stdio.js\n * 2. Monorepo MCP build output: apps/mcp/dist/stdio.js\n * 3. xmcp output: apps/mcp/.xmcp/stdio.js\n */\nexport function getStdioEntryCandidates(\n baseDir = __dirname,\n): StdioEntryCandidate[] {\n const candidates: StdioEntryCandidate[] = [\n {\n label: 'packaged CLI artifact',\n path: resolve(baseDir, 'mcp/stdio.js'),\n },\n ]\n const roots = ['../../../..', '../../..', '../..']\n const entries = [\n {\n label: 'monorepo build output',\n path: 'apps/mcp/dist/stdio.js',\n },\n {\n label: 'xmcp build output',\n path: 'apps/mcp/.xmcp/stdio.js',\n },\n ]\n\n for (const entry of entries) {\n for (const root of roots) {\n candidates.push({\n label: entry.label,\n path: resolve(baseDir, root, entry.path),\n })\n }\n }\n\n return candidates\n}\n\nexport function findStdioEntry(baseDir = __dirname): string | null {\n for (const candidate of getStdioEntryCandidates(baseDir)) {\n if (existsSync(candidate.path)) return candidate.path\n }\n\n return null\n}\n\nexport function formatMissingStdioEntryMessage(baseDir = __dirname): string {\n const checked = getStdioEntryCandidates(baseDir)\n .map((candidate) => ` - ${candidate.label}: ${candidate.path}`)\n .join('\\n')\n\n return [\n 'MCP stdio entry not found.',\n 'Checked:',\n checked,\n 'Fix:',\n ' - Monorepo checkout: run pnpm --filter mcp build.',\n ' - Published CLI: reinstall or update @01.software/cli so dist/mcp/stdio.js is included.',\n ].join('\\n')\n}\n\nexport function createMcpEnv(\n baseEnv: NodeJS.ProcessEnv,\n client: { publishableKey: string; secretKey: string },\n): NodeJS.ProcessEnv {\n const env: NodeJS.ProcessEnv = {\n ...baseEnv,\n SOFTWARE_PUBLISHABLE_KEY: client.publishableKey,\n SOFTWARE_SECRET_KEY: client.secretKey,\n }\n\n delete env.SOFTWARE_TENANT_ID\n\n return env\n}\n\nexport function registerMcpCommands(program: Command) {\n program\n .command('mcp')\n .description('Start local MCP stdio server for trusted server-key workflows')\n .addHelpText(\n 'after',\n `\nPrerequisites:\n Run 01 login, or set SOFTWARE_PUBLISHABLE_KEY and SOFTWARE_SECRET_KEY.\n Local stdio exposes the full MCP tool surface; HTTP OAuth MCP uses the\n narrower remote surface documented in the web integration guide.\n In a monorepo checkout, build the stdio artifact first:\n pnpm --filter mcp build\n`,\n )\n .action(() => {\n // 1. Validate credentials before spawning (exits with code 2 if missing)\n const client = resolveClient(program.opts().apiKey as string | undefined)\n\n // 2. Find stdio.js entry point\n const stdioEntry = findStdioEntry()\n if (!stdioEntry) {\n exitWithError(new Error(formatMissingStdioEntryMessage()))\n }\n\n // 3. Spawn stdio process (inherits env with SOFTWARE_PUBLISHABLE_KEY + SOFTWARE_SECRET_KEY)\n const child = spawn(process.execPath, [stdioEntry], {\n env: createMcpEnv(process.env, client),\n stdio: ['inherit', 'inherit', 'inherit'],\n })\n\n child.on('error', (err) => {\n exitWithError(new Error(`Failed to start MCP server: ${err.message}`))\n })\n\n child.on('exit', (code) => {\n process.exit(code ?? 0)\n })\n })\n}\n"],"mappings":"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","names":["t","readFileSync","readFileSync","program","getClient","getFormat","program","getClient","getFormat","order","z","idSchema","z","program","getClient","getFormat","program","getClient","getFormat","program","getClient","getFormat","program","getClient","getFormat","pc","pc","t","resolve","program","COLLECTIONS","program","getClient","getFormat","COLLECTIONS","z","z","getApiUrl","program","getClient","getFormat","existsSync","existsSync","program","require"]}