swiftpatch-cli 1.1.1 → 1.1.3
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 +148 -19
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../node_modules/tsup/assets/esm_shims.js","../src/lib/config.ts","../src/lib/api.ts","../src/lib/auth.ts","../src/index.ts","../src/cli.ts","../src/commands/login.ts","../src/utils/logger.ts","../src/commands/logout.ts","../src/commands/whoami.ts","../src/commands/apps/index.ts","../src/commands/apps/list.ts","../src/utils/auth-guard.ts","../src/utils/org-resolver.ts","../src/utils/table.ts","../src/commands/apps/create.ts","../src/commands/apps/info.ts","../src/commands/apps/update.ts","../src/commands/apps/delete.ts","../src/commands/release.ts","../src/lib/bundler.ts","../src/lib/uploader.ts","../src/lib/hash.ts","../src/lib/signing.ts","../src/utils/detect.ts","../src/commands/releases/index.ts","../src/commands/releases/list.ts","../src/commands/releases/info.ts","../src/commands/releases/rollout.ts","../src/commands/releases/rollback.ts","../src/commands/releases/disable.ts","../src/commands/channels/index.ts","../src/commands/channels/list.ts","../src/commands/channels/create.ts","../src/commands/channels/update.ts","../src/commands/channels/delete.ts","../src/commands/ci-tokens/index.ts","../src/commands/ci-tokens/list.ts","../src/commands/ci-tokens/create.ts","../src/commands/ci-tokens/delete.ts","../src/commands/ci-tokens/regenerate.ts","../src/commands/webhooks/index.ts","../src/commands/webhooks/list.ts","../src/commands/webhooks/create.ts","../src/commands/webhooks/update.ts","../src/commands/webhooks/delete.ts","../src/commands/webhooks/test.ts","../src/commands/analytics.ts","../src/commands/ai.ts","../src/commands/ai-doctor.ts","../src/lib/claude.ts","../src/utils/consent.ts","../src/commands/ai-explain.ts","../src/commands/ai-review.ts","../src/commands/config.ts","../src/commands/publish-bundle.ts","../src/lib/archive.ts","../src/lib/artifacts.ts","../src/lib/react-native-utils.ts","../src/commands/release-bundle.ts","../src/commands/update-release.ts","../src/commands/generate-key-pair.ts","../src/commands/deploy.ts","../src/commands/status.ts","../src/commands/init.ts","../src/commands/doctor.ts","../src/utils/update-checker.ts","../src/utils/errors.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","import Conf from 'conf';\nimport type { CLIConfig } from '../types/config.js';\n\nconst store = new Conf<CLIConfig>({\n projectName: 'swiftpatch-cli-config',\n});\n\nexport const config = {\n get<K extends keyof CLIConfig>(key: K): CLIConfig[K] | undefined {\n return store.get(key) as CLIConfig[K] | undefined;\n },\n\n set<K extends keyof CLIConfig>(key: K, value: CLIConfig[K]): void {\n store.set(key, value);\n },\n\n delete<K extends keyof CLIConfig>(key: K): void {\n store.delete(key);\n },\n\n getAll(): CLIConfig {\n return store.store;\n },\n\n clear(): void {\n store.clear();\n },\n\n get path(): string {\n return store.path;\n },\n};\n","import axios, { AxiosInstance, AxiosError } from 'axios';\nimport { auth } from './auth.js';\nimport { config } from './config.js';\nimport type {\n User,\n Organization,\n App,\n Release,\n Channel,\n AnalyticsData,\n CreateReleaseParams,\n CompleteUploadParams,\n CIToken,\n Webhook,\n CreateWebhookParams,\n UpdateWebhookParams,\n WebhookTestResult,\n UpdateAppParams,\n UpdateChannelParams,\n} from '../types/api.js';\n\nconst API_BASE_URL = process.env.SWIFTPATCH_API_URL || 'https://api.blendapp.ae/api/v1';\n\n/**\n * Warn if a custom API URL uses HTTP in production (non-localhost)\n */\nfunction warnIfInsecure(url: string): void {\n if (\n url.startsWith('http://') &&\n !url.includes('localhost') &&\n !url.includes('127.0.0.1')\n ) {\n console.warn(\n '\\x1b[33m⚠ Warning: API URL uses HTTP instead of HTTPS. This is insecure for production use.\\x1b[0m'\n );\n }\n}\n\n/**\n * Recursively normalize MongoDB _id fields to id\n */\nfunction normalizeIds(obj: any): any {\n if (obj === null || obj === undefined) return obj;\n if (Array.isArray(obj)) return obj.map(normalizeIds);\n if (typeof obj === 'object') {\n const result: any = {};\n for (const [key, value] of Object.entries(obj)) {\n if (key === '_id') {\n result['id'] = value;\n } else if (key === '__v') {\n // Skip Mongoose version key\n continue;\n } else {\n result[key] = normalizeIds(value);\n }\n }\n return result;\n }\n return obj;\n}\n\nclass ApiClient {\n private client: AxiosInstance;\n\n constructor() {\n const baseURL = config.get('apiUrl') || API_BASE_URL;\n warnIfInsecure(baseURL);\n\n this.client = axios.create({\n baseURL,\n timeout: 30000,\n headers: {\n 'Content-Type': 'application/json',\n 'User-Agent': 'swiftpatch-cli/1.0.0',\n },\n });\n\n // Add auth header to all requests\n this.client.interceptors.request.use((reqConfig) => {\n const authHeaders = auth.getAuthHeader();\n Object.assign(reqConfig.headers, authHeaders);\n return reqConfig;\n });\n\n // Handle errors\n this.client.interceptors.response.use(\n (response) => response,\n (error: AxiosError) => {\n if (error.response) {\n const data = error.response.data as Record<string, any>;\n const message = data?.error?.message || error.message;\n\n if (error.response.status === 401) {\n throw new Error('Authentication failed. Please run: swiftpatch login');\n }\n\n throw new Error(message);\n }\n throw error;\n }\n );\n }\n\n // AUTH\n async createLoginSession(): Promise<{ sessionId: string; loginUrl: string }> {\n const { data } = await this.client.post('/auth/cli/session');\n return normalizeIds(data.data);\n }\n\n async checkLoginSession(sessionId: string): Promise<{ status: string; token?: string }> {\n const { data } = await this.client.get(`/auth/cli/session/${sessionId}`);\n return normalizeIds(data.data);\n }\n\n // USER\n async getCurrentUser(): Promise<User> {\n const { data } = await this.client.get('/auth/me');\n return normalizeIds(data.data);\n }\n\n async getOrganizations(): Promise<Organization[]> {\n const { data } = await this.client.get('/orgs');\n return normalizeIds(data.data);\n }\n\n // APPS (org-scoped)\n async getApps(orgId: string): Promise<App[]> {\n const { data } = await this.client.get(`/orgs/${orgId}/apps`);\n return normalizeIds(data.data);\n }\n\n async getApp(orgId: string, appId: string): Promise<App> {\n const { data } = await this.client.get(`/orgs/${orgId}/apps/${appId}`);\n return normalizeIds(data.data);\n }\n\n async createApp(orgId: string, params: {\n name: string;\n platform: 'IOS' | 'ANDROID' | 'BOTH';\n }): Promise<App> {\n const { data } = await this.client.post(`/orgs/${orgId}/apps`, params);\n return normalizeIds(data.data);\n }\n\n async updateApp(orgId: string, appId: string, params: UpdateAppParams): Promise<App> {\n const { data } = await this.client.patch(`/orgs/${orgId}/apps/${appId}`, params);\n return normalizeIds(data.data);\n }\n\n async deleteApp(orgId: string, appId: string): Promise<void> {\n await this.client.delete(`/orgs/${orgId}/apps/${appId}`);\n }\n\n // RELEASES (org-scoped)\n async getReleases(\n orgId: string,\n appId: string,\n params?: { page?: number; limit?: number }\n ): Promise<{ releases: Release[]; pagination: any }> {\n const { data } = await this.client.get(`/orgs/${orgId}/apps/${appId}/releases`, { params });\n const normalized = normalizeIds(data);\n return {\n releases: normalized.data || [],\n pagination: normalized.pagination,\n };\n }\n\n async getRelease(orgId: string, appId: string, releaseId: string): Promise<Release> {\n const { data } = await this.client.get(`/orgs/${orgId}/apps/${appId}/releases/${releaseId}`);\n return normalizeIds(data.data?.release || data.data);\n }\n\n async createRelease(\n orgId: string,\n appId: string,\n params: CreateReleaseParams\n ): Promise<Release & { uploadUrl: string }> {\n const { data } = await this.client.post(`/orgs/${orgId}/apps/${appId}/releases`, params);\n return normalizeIds(data.data?.release || data.data);\n }\n\n async completeUpload(\n orgId: string,\n appId: string,\n releaseId: string,\n params: CompleteUploadParams\n ): Promise<Release> {\n const { data } = await this.client.post(\n `/orgs/${orgId}/apps/${appId}/releases/${releaseId}/upload-complete`,\n params\n );\n return normalizeIds(data.data?.release || data.data);\n }\n\n async publishRelease(\n orgId: string,\n appId: string,\n releaseId: string,\n params: { rolloutPercent: number }\n ): Promise<Release> {\n const { data } = await this.client.post(\n `/orgs/${orgId}/apps/${appId}/releases/${releaseId}/publish`,\n params\n );\n return normalizeIds(data.data?.release || data.data);\n }\n\n async updateRollout(\n orgId: string,\n appId: string,\n releaseId: string,\n rolloutPercent: number\n ): Promise<Release> {\n const { data } = await this.client.patch(\n `/orgs/${orgId}/apps/${appId}/releases/${releaseId}/rollout`,\n { rolloutPercent }\n );\n return normalizeIds(data.data?.release || data.data);\n }\n\n async disableRelease(orgId: string, appId: string, releaseId: string, reason?: string): Promise<Release> {\n const { data } = await this.client.post(\n `/orgs/${orgId}/apps/${appId}/releases/${releaseId}/disable`,\n { reason }\n );\n return normalizeIds(data.data?.release || data.data);\n }\n\n async rollbackRelease(orgId: string, appId: string, releaseId: string, reason?: string): Promise<Release> {\n const { data } = await this.client.post(\n `/orgs/${orgId}/apps/${appId}/releases/${releaseId}/rollback`,\n { reason }\n );\n return normalizeIds(data.data?.release || data.data);\n }\n\n // CHANNELS (org-scoped)\n async getChannels(orgId: string, appId: string): Promise<Channel[]> {\n const { data } = await this.client.get(`/orgs/${orgId}/apps/${appId}/channels`);\n return normalizeIds(data.data);\n }\n\n async createChannel(orgId: string, appId: string, params: { name: string }): Promise<Channel> {\n const { data } = await this.client.post(`/orgs/${orgId}/apps/${appId}/channels`, params);\n return normalizeIds(data.data);\n }\n\n async updateChannel(orgId: string, appId: string, channelId: string, params: UpdateChannelParams): Promise<Channel> {\n const { data } = await this.client.patch(`/orgs/${orgId}/apps/${appId}/channels/${channelId}`, params);\n return normalizeIds(data.data);\n }\n\n async deleteChannel(orgId: string, appId: string, channelId: string): Promise<void> {\n await this.client.delete(`/orgs/${orgId}/apps/${appId}/channels/${channelId}`);\n }\n\n // ANALYTICS (org-scoped)\n async getAnalytics(\n orgId: string,\n appId: string,\n params?: { days?: number; releaseId?: string }\n ): Promise<AnalyticsData> {\n const { data } = await this.client.get(`/orgs/${orgId}/apps/${appId}/analytics/overview`, { params });\n return normalizeIds(data.data);\n }\n\n // ── AI ENDPOINTS ────────────────────────────────────────────────\n\n getBaseUrl(): string {\n return this.client.defaults.baseURL || API_BASE_URL;\n }\n\n getAuthHeaders(): Record<string, string> {\n return auth.getAuthHeader();\n }\n\n async aiRiskAssessment(\n orgId: string,\n appId: string,\n releaseId: string\n ): Promise<{ score: number; level: string; factors: { factor: string; impact: number; description: string }[]; recommendation: string }> {\n const { data } = await this.client.post(\n `/orgs/${orgId}/apps/${appId}/releases/${releaseId}/ai/risk-assessment`\n );\n return normalizeIds(data.data);\n }\n\n async aiCrashGroups(\n orgId: string,\n appId: string,\n params?: { status?: string; severity?: string; limit?: number }\n ): Promise<any[]> {\n const { data } = await this.client.get(`/orgs/${orgId}/apps/${appId}/ai/crash-groups`, { params });\n return normalizeIds(data.data);\n }\n\n async aiInsights(\n orgId: string,\n appId: string,\n params?: { type?: string; status?: string }\n ): Promise<any[]> {\n const { data } = await this.client.get(`/orgs/${orgId}/apps/${appId}/ai/insights`, { params });\n return normalizeIds(data.data);\n }\n\n // ── CLAUDE AI KEY (platform-provisioned) ──────────────────────\n\n async getClaudeApiKey(): Promise<{ apiKey: string }> {\n const { data } = await this.client.get('/ai/claude-key');\n return normalizeIds(data.data);\n }\n\n // ── CLI ENDPOINTS ──────────────────────────────────────────────\n\n /**\n * Generate a signed S3 URL for bundle upload.\n * Uses /cli/gen-signed-url (user auth) or /cli/ci/gen-signed-url (CI token auth).\n */\n async generateSignedUrl(\n params: { hash: string; uploadPath: string; platform: string; releaseNote: string; signature?: string },\n ciToken?: string\n ): Promise<{ url: string }> {\n const headers: Record<string, string> = {};\n const endpoint = ciToken ? '/cli/ci/gen-signed-url' : '/cli/gen-signed-url';\n\n if (ciToken) {\n headers['x-ci-token'] = ciToken;\n }\n\n const { data } = await this.client.post(endpoint, params, { headers });\n return normalizeIds(data.data);\n }\n\n /**\n * Promote a published bundle to a release.\n */\n async promoteBundle(\n params: {\n projectId: string;\n hash: string;\n appVersion: string;\n releaseNote: string;\n isMandatory?: boolean;\n isPaused?: boolean;\n },\n ciToken: string\n ): Promise<any> {\n const { data } = await this.client.post('/cli/ci/promote', params, {\n headers: { 'x-ci-token': ciToken },\n });\n return normalizeIds(data.data);\n }\n\n /**\n * Update an existing release via CLI.\n */\n async updateReleaseCli(\n params: {\n projectId: string;\n hash: string;\n releaseNote?: string;\n isMandatory?: boolean;\n isPaused?: boolean;\n isRolledBack?: boolean;\n rolloutPercent?: number;\n },\n ciToken: string\n ): Promise<any> {\n const { data } = await this.client.post('/cli/ci/update-release', params, {\n headers: { 'x-ci-token': ciToken },\n });\n return normalizeIds(data.data);\n }\n\n // ── CI TOKENS ─────────────────────────────────────────────────\n\n async getCITokens(orgId: string, appId: string): Promise<CIToken[]> {\n const { data } = await this.client.get(`/orgs/${orgId}/apps/${appId}/ci-tokens`);\n return normalizeIds(data.data);\n }\n\n async createCIToken(orgId: string, appId: string, name: string): Promise<{ token: string; ciToken: CIToken }> {\n const { data } = await this.client.post(`/orgs/${orgId}/apps/${appId}/ci-tokens`, { name });\n return normalizeIds(data.data);\n }\n\n async deleteCIToken(orgId: string, appId: string, tokenId: string): Promise<void> {\n await this.client.delete(`/orgs/${orgId}/apps/${appId}/ci-tokens/${tokenId}`);\n }\n\n async regenerateCIToken(orgId: string, appId: string, tokenId: string): Promise<{ token: string; ciToken: CIToken }> {\n const { data } = await this.client.post(`/orgs/${orgId}/apps/${appId}/ci-tokens/${tokenId}/regenerate`);\n return normalizeIds(data.data);\n }\n\n // ── WEBHOOKS ──────────────────────────────────────────────────\n\n async getWebhooks(orgId: string): Promise<Webhook[]> {\n const { data } = await this.client.get(`/orgs/${orgId}/webhooks`);\n return normalizeIds(data.data);\n }\n\n async createWebhook(orgId: string, params: CreateWebhookParams): Promise<Webhook> {\n const { data } = await this.client.post(`/orgs/${orgId}/webhooks`, params);\n return normalizeIds(data.data);\n }\n\n async updateWebhook(orgId: string, webhookId: string, params: UpdateWebhookParams): Promise<Webhook> {\n const { data } = await this.client.patch(`/orgs/${orgId}/webhooks/${webhookId}`, params);\n return normalizeIds(data.data);\n }\n\n async deleteWebhook(orgId: string, webhookId: string): Promise<void> {\n await this.client.delete(`/orgs/${orgId}/webhooks/${webhookId}`);\n }\n\n async testWebhook(orgId: string, webhookId: string): Promise<WebhookTestResult> {\n const { data } = await this.client.post(`/orgs/${orgId}/webhooks/${webhookId}/test`);\n return normalizeIds(data.data);\n }\n}\n\nexport const api = new ApiClient();\n","import Conf from 'conf';\nimport crypto from 'crypto';\nimport os from 'os';\n\ninterface AuthConfig {\n token?: string;\n apiKey?: string;\n claudeApiKey?: string;\n user?: {\n id: string;\n email: string;\n name: string;\n };\n}\n\nfunction deriveEncryptionKey(): string {\n const material = [\n os.hostname(),\n os.userInfo().username,\n os.homedir(),\n 'swiftpatch-cli',\n ].join(':');\n return crypto.createHash('sha256').update(material).digest('hex');\n}\n\nfunction createStore(): Conf<AuthConfig> {\n try {\n return new Conf<AuthConfig>({\n projectName: 'swiftpatch-cli',\n encryptionKey: deriveEncryptionKey(),\n });\n } catch {\n // Migration: if decryption fails (old hardcoded key), clear and recreate\n const fresh = new Conf<AuthConfig>({\n projectName: 'swiftpatch-cli',\n encryptionKey: deriveEncryptionKey(),\n });\n fresh.clear();\n return fresh;\n }\n}\n\nconst store = createStore();\n\nexport const auth = {\n isLoggedIn(): boolean {\n return !!(store.get('token') || store.get('apiKey'));\n },\n\n getToken(): string | undefined {\n return store.get('token') || store.get('apiKey');\n },\n\n getAuthHeader(): Record<string, string> {\n const token = this.getToken();\n if (!token) return {};\n return { Authorization: `Bearer ${token}` };\n },\n\n saveToken(token: string): void {\n store.set('token', token);\n store.delete('apiKey');\n },\n\n async loginWithApiKey(apiKey: string): Promise<boolean> {\n const originalToken = store.get('token');\n const originalApiKey = store.get('apiKey');\n\n store.set('apiKey', apiKey);\n store.delete('token');\n\n try {\n // Import api dynamically to avoid circular dependency\n const { api } = await import('./api.js');\n await api.getCurrentUser();\n return true;\n } catch (error) {\n // Restore previous auth state\n if (originalToken) store.set('token', originalToken);\n else store.delete('token');\n if (originalApiKey) store.set('apiKey', originalApiKey);\n else store.delete('apiKey');\n throw error;\n }\n },\n\n saveUser(user: { id: string; email: string; name: string }): void {\n store.set('user', user);\n },\n\n getUser(): AuthConfig['user'] | undefined {\n return store.get('user');\n },\n\n logout(): void {\n store.delete('token');\n store.delete('apiKey');\n store.delete('user');\n },\n\n getClaudeApiKey(): string | undefined {\n return store.get('claudeApiKey');\n },\n\n setClaudeApiKey(key: string): void {\n store.set('claudeApiKey', key);\n },\n\n deleteClaudeApiKey(): void {\n store.delete('claudeApiKey');\n },\n\n getConfigPath(): string {\n return store.path;\n },\n};\n","import { cli } from './cli.js';\nimport { checkForUpdates } from './utils/update-checker.js';\nimport { handleError } from './utils/errors.js';\n\nasync function main() {\n try {\n // Check for CLI updates (non-blocking)\n checkForUpdates();\n\n // Run CLI\n await cli.parseAsync(process.argv);\n } catch (error) {\n handleError(error);\n process.exit(1);\n }\n}\n\nmain();\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { readFileSync } from 'fs';\nimport { fileURLToPath } from 'url';\nimport { dirname, join } from 'path';\n\n// Commands\nimport { loginCommand } from './commands/login.js';\nimport { logoutCommand } from './commands/logout.js';\nimport { whoamiCommand } from './commands/whoami.js';\nimport { appsCommands } from './commands/apps/index.js';\nimport { releaseCommand } from './commands/release.js';\nimport { releasesCommands } from './commands/releases/index.js';\nimport { channelsCommands } from './commands/channels/index.js';\nimport { ciTokensCommands } from './commands/ci-tokens/index.js';\nimport { webhooksCommands } from './commands/webhooks/index.js';\nimport { analyticsCommand } from './commands/analytics.js';\nimport { aiCommand } from './commands/ai.js';\nimport { configCommands } from './commands/config.js';\nimport { publishBundleCommand } from './commands/publish-bundle.js';\nimport { releaseBundleCommand } from './commands/release-bundle.js';\nimport { updateReleaseCommand } from './commands/update-release.js';\nimport { generateKeyPairCommand } from './commands/generate-key-pair.js';\nimport { deployCommand } from './commands/deploy.js';\nimport { statusCommand } from './commands/status.js';\nimport { initCommand } from './commands/init.js';\nimport { doctorCommand } from './commands/doctor.js';\n\n// Get package version\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nlet version = '1.0.0';\ntry {\n const pkg = JSON.parse(readFileSync(join(__dirname, '../package.json'), 'utf-8'));\n version = pkg.version;\n} catch {\n // Use default version\n}\n\nexport const cli = new Command();\n\ncli\n .name('swiftpatch')\n .description(chalk.bold('SwiftPatch CLI') + ' - Ship React Native updates instantly')\n .version(version, '-v, --version', 'Output the current version')\n .helpOption('-h, --help', 'Display help for command')\n .addHelpText('after', `\n${chalk.bold('Quick Start:')}\n $ swiftpatch init ${chalk.gray('# Set up SwiftPatch in your project')}\n $ swiftpatch deploy -p ios ${chalk.gray('# Bundle, upload, and release')}\n $ swiftpatch status ${chalk.gray('# View app status at a glance')}\n\n${chalk.bold('Examples:')}\n ${chalk.gray('# Login to SwiftPatch')}\n $ swiftpatch login\n\n ${chalk.gray('# Publish a bundle')}\n $ swiftpatch publish-bundle -p ios --hermes\n\n ${chalk.gray('# Promote a bundle to a release')}\n $ swiftpatch release-bundle --hash <hash> --app-version 1.0.0 --ci-token <token>\n\n ${chalk.gray('# One-step deploy (bundle + upload + release)')}\n $ swiftpatch deploy -p ios --ci-token <token>\n\n ${chalk.gray('# List all apps')}\n $ swiftpatch apps list\n\n ${chalk.gray('# Update rollout percentage')}\n $ swiftpatch releases rollout <release-id> --percent 50\n\n ${chalk.gray('# Manage CI tokens')}\n $ swiftpatch ci-tokens create\n\n ${chalk.gray('# Diagnose setup issues')}\n $ swiftpatch doctor\n\n${chalk.bold('Documentation:')}\n ${chalk.cyan('https://docs.swiftpatch.io/cli')}\n`);\n\n// Setup & diagnostics\ncli.addCommand(initCommand);\ncli.addCommand(doctorCommand);\ncli.addCommand(statusCommand);\n\n// Auth commands\ncli.addCommand(loginCommand);\ncli.addCommand(logoutCommand);\ncli.addCommand(whoamiCommand);\n\n// Apps commands\ncli.addCommand(appsCommands);\n\n// Deploy command (one-step: bundle + upload + release)\ncli.addCommand(deployCommand);\n\n// Release command (legacy - deprecated in favor of publish-bundle + release-bundle)\ncli.addCommand(releaseCommand);\n\n// Bundle publishing commands\ncli.addCommand(publishBundleCommand);\ncli.addCommand(releaseBundleCommand);\ncli.addCommand(updateReleaseCommand);\ncli.addCommand(generateKeyPairCommand);\n\n// Releases commands\ncli.addCommand(releasesCommands);\n\n// Channels commands\ncli.addCommand(channelsCommands);\n\n// CI tokens commands\ncli.addCommand(ciTokensCommands);\n\n// Webhooks commands\ncli.addCommand(webhooksCommands);\n\n// Analytics command\ncli.addCommand(analyticsCommand);\n\n// AI commands\ncli.addCommand(aiCommand);\n\n// Config commands\ncli.addCommand(configCommands);\n\n// Default action\ncli.action(() => {\n console.log('');\n console.log(chalk.bold.cyan(' SwiftPatch CLI'));\n console.log(chalk.gray(` v${version}`));\n console.log('');\n console.log(' Run ' + chalk.cyan('swiftpatch --help') + ' for usage information');\n console.log('');\n});\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport open from 'open';\nimport ora from 'ora';\nimport { auth } from '../lib/auth.js';\nimport { api } from '../lib/api.js';\nimport { logger } from '../utils/logger.js';\n\nexport const loginCommand = new Command('login')\n .description('Authenticate with SwiftPatch')\n .option('-k, --api-key <key>', 'Login with API key (for CI/CD)')\n .option('-i, --interactive', 'Force interactive login')\n .action(async (options) => {\n // Check if already logged in\n const existingToken = auth.getToken();\n if (existingToken && !options.interactive && !options.apiKey) {\n const user = await api.getCurrentUser().catch(() => null);\n if (user) {\n logger.info(`Already logged in as ${chalk.cyan(user.email)}`);\n const { reauth } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'reauth',\n message: 'Do you want to log in with a different account?',\n default: false,\n },\n ]);\n if (!reauth) return;\n }\n }\n\n // API Key login (for CI/CD)\n if (options.apiKey) {\n const spinner = ora('Validating API key...').start();\n try {\n const isValid = await auth.loginWithApiKey(options.apiKey);\n if (isValid) {\n spinner.succeed('Logged in with API key');\n const user = await api.getCurrentUser();\n logger.success(`Authenticated as ${chalk.cyan(user.email)}`);\n } else {\n spinner.fail('Invalid API key');\n process.exit(1);\n }\n } catch (error: any) {\n spinner.fail(`Login failed: ${error.message}`);\n process.exit(1);\n }\n return;\n }\n\n // Interactive login\n const { method } = await inquirer.prompt([\n {\n type: 'list',\n name: 'method',\n message: 'How would you like to authenticate?',\n choices: [\n { name: 'Login with browser (recommended)', value: 'browser' },\n { name: 'Enter API key', value: 'apikey' },\n ],\n },\n ]);\n\n if (method === 'browser') {\n await browserLogin();\n } else {\n await apiKeyLogin();\n }\n });\n\nasync function browserLogin() {\n const spinner = ora('Opening browser...').start();\n\n try {\n const { sessionId, loginUrl } = await api.createLoginSession();\n\n spinner.text = 'Waiting for authentication...';\n\n await open(loginUrl);\n\n logger.info(`\\nIf browser doesn't open, visit:\\n${chalk.cyan(loginUrl)}\\n`);\n\n const token = await pollForToken(sessionId, spinner);\n\n auth.saveToken(token);\n\n spinner.succeed('Login successful!');\n\n const user = await api.getCurrentUser();\n console.log('');\n logger.success(`Welcome, ${chalk.bold(user.name)}!`);\n logger.info(`Email: ${chalk.cyan(user.email)}`);\n\n const orgs = await api.getOrganizations();\n if (orgs.length > 0) {\n logger.info(`Organizations: ${orgs.map(o => chalk.cyan(o.name)).join(', ')}`);\n }\n } catch (error: any) {\n spinner.fail(`Login failed: ${error.message}`);\n process.exit(1);\n }\n}\n\nasync function pollForToken(sessionId: string, spinner: ReturnType<typeof ora>): Promise<string> {\n const maxAttempts = 60;\n let attempts = 0;\n\n while (attempts < maxAttempts) {\n try {\n const result = await api.checkLoginSession(sessionId);\n\n if (result.status === 'completed' && result.token) {\n return result.token;\n }\n\n if (result.status === 'expired') {\n throw new Error('Login session expired. Please try again.');\n }\n } catch (error: any) {\n if (error.message.includes('expired')) {\n throw error;\n }\n }\n\n await sleep(5000);\n attempts++;\n const remainingSeconds = (maxAttempts - attempts) * 5;\n const remainingMinutes = Math.floor(remainingSeconds / 60);\n const remainingSecs = remainingSeconds % 60;\n spinner.text = `Waiting for authentication... (${remainingMinutes}m ${remainingSecs}s remaining)`;\n }\n\n throw new Error('Login timed out. Please try again.');\n}\n\nasync function apiKeyLogin() {\n const { apiKey } = await inquirer.prompt([\n {\n type: 'password',\n name: 'apiKey',\n message: 'Enter your API key:',\n mask: '*',\n validate: (input: string) => {\n if (!input) return 'API key is required';\n if (!input.startsWith('sp_')) return 'Invalid API key format';\n return true;\n },\n },\n ]);\n\n const spinner = ora('Validating API key...').start();\n\n try {\n await auth.loginWithApiKey(apiKey);\n spinner.succeed('Login successful!');\n\n const user = await api.getCurrentUser();\n logger.success(`Authenticated as ${chalk.cyan(user.email)}`);\n } catch (error: any) {\n spinner.fail(`Login failed: ${error.message}`);\n process.exit(1);\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n","import chalk from 'chalk';\nimport figures from 'figures';\n\nexport const logger = {\n info(message: string): void {\n console.log(chalk.blue(figures.info) + ' ' + message);\n },\n\n success(message: string): void {\n console.log(chalk.green(figures.tick) + ' ' + message);\n },\n\n warning(message: string): void {\n console.log(chalk.yellow(figures.warning) + ' ' + message);\n },\n\n error(message: string): void {\n console.log(chalk.red(figures.cross) + ' ' + message);\n },\n\n debug(message: string): void {\n if (process.env.DEBUG) {\n console.log(chalk.gray(figures.pointer) + ' ' + chalk.gray(message));\n }\n },\n\n blank(): void {\n console.log('');\n },\n\n divider(): void {\n console.log(chalk.gray('\\u2500'.repeat(50)));\n },\n};\n","import { Command } from 'commander';\nimport inquirer from 'inquirer';\nimport { auth } from '../lib/auth.js';\nimport { logger } from '../utils/logger.js';\n\nexport const logoutCommand = new Command('logout')\n .description('Log out from SwiftPatch')\n .option('-f, --force', 'Logout without confirmation')\n .action(async (options) => {\n if (!auth.isLoggedIn()) {\n logger.info('You are not logged in');\n return;\n }\n\n if (!options.force) {\n const { confirm } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirm',\n message: 'Are you sure you want to log out?',\n default: false,\n },\n ]);\n\n if (!confirm) {\n logger.info('Logout cancelled');\n return;\n }\n }\n\n auth.logout();\n logger.success('Logged out successfully');\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { auth } from '../lib/auth.js';\nimport { api } from '../lib/api.js';\nimport { logger } from '../utils/logger.js';\n\nexport const whoamiCommand = new Command('whoami')\n .description('Show current authenticated user')\n .action(async () => {\n if (!auth.isLoggedIn()) {\n logger.error('Not logged in. Run ' + chalk.cyan('swiftpatch login') + ' first.');\n process.exit(1);\n }\n\n try {\n const user = await api.getCurrentUser();\n const orgs = await api.getOrganizations();\n\n console.log('');\n console.log(chalk.bold(' Current User'));\n console.log('');\n console.log(` Name: ${chalk.cyan(user.name)}`);\n console.log(` Email: ${chalk.cyan(user.email)}`);\n console.log(` ID: ${chalk.gray(user.id)}`);\n console.log('');\n\n if (orgs.length > 0) {\n console.log(chalk.bold(' Organizations'));\n console.log('');\n orgs.forEach(org => {\n console.log(` \\u2022 ${chalk.cyan(org.name)} ${chalk.gray(`(${org.slug})`)}`);\n console.log(` Plan: ${org.plan} | Apps: ${org.usage.appsCount}`);\n });\n console.log('');\n }\n } catch (error: any) {\n logger.error(`Failed to get user info: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport { listAppsCommand } from './list.js';\nimport { createAppCommand } from './create.js';\nimport { infoAppCommand } from './info.js';\nimport { updateAppCommand } from './update.js';\nimport { deleteAppCommand } from './delete.js';\n\nexport const appsCommands = new Command('apps')\n .description('Manage apps');\n\nappsCommands.addCommand(listAppsCommand);\nappsCommands.addCommand(createAppCommand);\nappsCommands.addCommand(infoAppCommand);\nappsCommands.addCommand(updateAppCommand);\nappsCommands.addCommand(deleteAppCommand);\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { api } from '../../lib/api.js';\nimport { requireAuth } from '../../utils/auth-guard.js';\nimport { resolveOrgId } from '../../utils/org-resolver.js';\nimport { createTable } from '../../utils/table.js';\n\nexport const listAppsCommand = new Command('list')\n .description('List all apps')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n const spinner = ora('Fetching apps...').start();\n\n try {\n const apps = await api.getApps(orgId);\n spinner.stop();\n\n if (options.json) {\n console.log(JSON.stringify(apps, null, 2));\n return;\n }\n\n if (apps.length === 0) {\n console.log('');\n console.log(chalk.gray(' No apps found.'));\n console.log('');\n console.log(' Create one with: ' + chalk.cyan('swiftpatch apps create'));\n console.log('');\n return;\n }\n\n console.log('');\n console.log(chalk.bold(' Your Apps'));\n console.log('');\n\n const table = createTable({\n head: ['Name', 'Platform', 'Deployment Key', 'Releases'],\n rows: apps.map(app => [\n chalk.cyan(app.name || ''),\n app.platform || '',\n chalk.gray((app.deploymentKey || '').slice(0, 20) + '...'),\n String(app.stats?.totalReleases ?? 0),\n ]),\n });\n\n console.log(table);\n console.log('');\n } catch (error: any) {\n spinner.fail(`Failed to fetch apps: ${error.message}`);\n process.exit(1);\n }\n });\n","import chalk from 'chalk';\nimport { auth } from '../lib/auth.js';\nimport { logger } from './logger.js';\n\nexport async function requireAuth(): Promise<void> {\n if (!auth.isLoggedIn()) {\n logger.error('You must be logged in to run this command');\n console.log('');\n console.log('Run ' + chalk.cyan('swiftpatch login') + ' to authenticate');\n console.log('');\n process.exit(1);\n }\n}\n","import chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport { api } from '../lib/api.js';\nimport { config } from '../lib/config.js';\nimport { logger } from './logger.js';\n\n/**\n * Resolve the organization ID to use for the current command.\n * Priority:\n * 1. Explicit --org flag value\n * 2. Saved default org from config\n * 3. Auto-select if user has only one org\n * 4. Interactive prompt if multiple orgs\n */\nexport async function resolveOrgId(explicitOrgId?: string): Promise<string> {\n // 1. Explicit flag\n if (explicitOrgId) {\n return explicitOrgId;\n }\n\n // 2. Saved default\n const defaultOrg = config.get('defaultOrg');\n if (defaultOrg) {\n return defaultOrg;\n }\n\n // 3. Fetch orgs\n const orgs = await api.getOrganizations();\n\n if (orgs.length === 0) {\n logger.error('No organizations found. Please create one at https://app.swiftpatch.io');\n process.exit(1);\n }\n\n // Auto-select if only one\n if (orgs.length === 1) {\n return orgs[0].id;\n }\n\n // 4. Interactive prompt\n const { selectedOrg } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selectedOrg',\n message: 'Select organization:',\n choices: orgs.map(org => ({\n name: `${org.name} ${chalk.gray(`(${org.slug})`)}`,\n value: org.id,\n })),\n },\n ]);\n\n // Offer to save as default\n const { saveDefault } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'saveDefault',\n message: 'Save as default organization?',\n default: true,\n },\n ]);\n\n if (saveDefault) {\n config.set('defaultOrg', selectedOrg);\n logger.info(`Default organization saved. Change with: ${chalk.cyan('swiftpatch config set defaultOrg <org-id>')}`);\n }\n\n return selectedOrg;\n}\n","import Table from 'cli-table3';\nimport chalk from 'chalk';\n\ninterface TableOptions {\n head: string[];\n rows: (string | number)[][];\n colWidths?: number[];\n}\n\nexport function createTable(options: TableOptions): string {\n const tableConfig: any = {\n head: options.head.map(h => chalk.bold(h)),\n style: {\n head: [],\n border: [],\n },\n chars: {\n 'top': '\\u2500',\n 'top-mid': '\\u252C',\n 'top-left': '\\u250C',\n 'top-right': '\\u2510',\n 'bottom': '\\u2500',\n 'bottom-mid': '\\u2534',\n 'bottom-left': '\\u2514',\n 'bottom-right': '\\u2518',\n 'left': '\\u2502',\n 'left-mid': '\\u251C',\n 'mid': '\\u2500',\n 'mid-mid': '\\u253C',\n 'right': '\\u2502',\n 'right-mid': '\\u2524',\n 'middle': '\\u2502',\n },\n };\n\n if (options.colWidths) {\n tableConfig.colWidths = options.colWidths;\n }\n\n const table = new Table(tableConfig);\n\n for (const row of options.rows) {\n table.push(row.map(v => v == null ? '' : String(v)));\n }\n\n return table.toString();\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { api } from '../../lib/api.js';\nimport { requireAuth } from '../../utils/auth-guard.js';\nimport { resolveOrgId } from '../../utils/org-resolver.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const createAppCommand = new Command('create')\n .description('Create a new app')\n .option('-n, --name <name>', 'App name')\n .option('-p, --platform <platform>', 'Platform (ios, android, or both)')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n\n // Get app name\n let appName = options.name;\n if (!appName) {\n const inquirer = (await import('inquirer')).default;\n const { name } = await inquirer.prompt([\n {\n type: 'input',\n name: 'name',\n message: 'App name:',\n validate: (input: string) => {\n if (!input.trim()) return 'App name is required';\n if (input.length < 2) return 'Name must be at least 2 characters';\n return true;\n },\n },\n ]);\n appName = name;\n }\n\n // Get platform\n let platform = options.platform?.toUpperCase();\n if (!platform || !['IOS', 'ANDROID', 'BOTH'].includes(platform)) {\n const inquirer = (await import('inquirer')).default;\n const { selectedPlatform } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selectedPlatform',\n message: 'Select platform:',\n choices: [\n { name: 'iOS', value: 'IOS' },\n { name: 'Android', value: 'ANDROID' },\n { name: 'Both (iOS & Android)', value: 'BOTH' },\n ],\n },\n ]);\n platform = selectedPlatform;\n }\n\n const spinner = ora('Creating app...').start();\n\n try {\n const app = await api.createApp(orgId, {\n name: appName,\n platform: platform as 'IOS' | 'ANDROID' | 'BOTH',\n });\n\n spinner.succeed('App created!');\n\n if (options.json) {\n console.log(JSON.stringify(app, null, 2));\n return;\n }\n\n console.log('');\n console.log(chalk.bold(' App Details'));\n console.log('');\n console.log(` Name: ${chalk.cyan(app.name)}`);\n console.log(` ID: ${chalk.gray(app.id)}`);\n console.log(` Platform: ${app.platform}`);\n console.log(` Deployment Key: ${chalk.gray(app.deploymentKey)}`);\n console.log('');\n console.log(chalk.gray(' Add this to your React Native app:'));\n console.log(` ${chalk.cyan(`deploymentKey: \"${app.deploymentKey}\"`)}`);\n console.log('');\n } catch (error: any) {\n spinner.fail(`Failed to create app: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { api } from '../../lib/api.js';\nimport { requireAuth } from '../../utils/auth-guard.js';\nimport { resolveOrgId } from '../../utils/org-resolver.js';\n\nexport const infoAppCommand = new Command('info')\n .description('Show app details')\n .argument('<app-id>', 'App ID')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('--json', 'Output as JSON')\n .action(async (appId, options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n const spinner = ora('Fetching app details...').start();\n\n try {\n const app = await api.getApp(orgId, appId);\n spinner.stop();\n\n if (options.json) {\n console.log(JSON.stringify(app, null, 2));\n return;\n }\n\n console.log('');\n console.log(chalk.bold(' App Details'));\n console.log('');\n console.log(` Name: ${chalk.cyan(app.name)}`);\n console.log(` ID: ${chalk.gray(app.id)}`);\n console.log(` Slug: ${chalk.gray(app.slug)}`);\n console.log(` Platform: ${app.platform}`);\n console.log(` Deployment Key: ${chalk.gray(app.deploymentKey)}`);\n console.log(` Signing: ${app.signingEnabled ? chalk.green('Enabled') : chalk.gray('Disabled')}`);\n const orgDisplay = typeof app.organizationId === 'object' && app.organizationId?.name\n ? `${app.organizationId.name} (${app.organizationId.id || app.organizationId._id})`\n : app.organizationId;\n console.log(` Organization: ${chalk.gray(orgDisplay)}`);\n\n if (app.stats) {\n console.log('');\n console.log(chalk.bold(' Stats'));\n console.log(` Total Releases: ${app.stats.totalReleases}`);\n console.log(` Total Installs: ${app.stats.totalInstalls}`);\n console.log(` Active Devices: ${app.stats.activeDevices}`);\n }\n\n console.log('');\n } catch (error: any) {\n spinner.fail(`Failed to fetch app: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport { api } from '../../lib/api.js';\nimport { requireAuth } from '../../utils/auth-guard.js';\nimport { resolveOrgId } from '../../utils/org-resolver.js';\n\nexport const updateAppCommand = new Command('update')\n .description('Update app settings')\n .argument('<app-id>', 'App ID')\n .option('-n, --name <name>', 'New app name')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('--json', 'Output as JSON')\n .action(async (appId, options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n\n const spinner = ora('Fetching app details...').start();\n const app = await api.getApp(orgId, appId);\n spinner.stop();\n\n let name = options.name;\n if (!name) {\n const answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'name',\n message: 'New app name:',\n default: app.name,\n validate: (input: string) => {\n if (!input.trim()) return 'App name is required';\n return true;\n },\n },\n ]);\n name = answers.name;\n }\n\n const updateSpinner = ora('Updating app...').start();\n\n try {\n const updated = await api.updateApp(orgId, appId, { name });\n updateSpinner.succeed('App updated!');\n\n if (options.json) {\n console.log(JSON.stringify(updated, null, 2));\n return;\n }\n\n console.log('');\n console.log(` Name: ${chalk.cyan(updated.name)}`);\n console.log(` Slug: ${chalk.gray(updated.slug)}`);\n console.log('');\n } catch (error: any) {\n updateSpinner.fail(`Failed to update app: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport { api } from '../../lib/api.js';\nimport { requireAuth } from '../../utils/auth-guard.js';\nimport { resolveOrgId } from '../../utils/org-resolver.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const deleteAppCommand = new Command('delete')\n .description('Delete an app')\n .argument('<app-id>', 'App ID')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('-y, --yes', 'Skip confirmation')\n .action(async (appId, options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n\n // Get app info first\n const app = await api.getApp(orgId, appId);\n\n if (!options.yes) {\n console.log('');\n logger.warning(`You are about to delete: ${chalk.bold(app.name)}`);\n console.log(chalk.gray(' This action cannot be undone.'));\n console.log('');\n\n const { confirm } = await inquirer.prompt([\n {\n type: 'input',\n name: 'confirm',\n message: `Type \"${app.name}\" to confirm deletion:`,\n validate: (input: string) => {\n if (input !== app.name) return `Please type \"${app.name}\" to confirm`;\n return true;\n },\n },\n ]);\n\n if (confirm !== app.name) {\n logger.info('Deletion cancelled');\n return;\n }\n }\n\n const spinner = ora('Deleting app...').start();\n\n try {\n await api.deleteApp(orgId, appId);\n spinner.succeed(`App \"${app.name}\" deleted`);\n } catch (error: any) {\n spinner.fail(`Failed to delete app: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport path from 'path';\nimport fs from 'fs-extra';\nimport { auth } from '../lib/auth.js';\nimport { api } from '../lib/api.js';\nimport { bundler } from '../lib/bundler.js';\nimport { uploader } from '../lib/uploader.js';\nimport { hashBundle } from '../lib/hash.js';\nimport { signBundle } from '../lib/signing.js';\nimport { logger } from '../utils/logger.js';\nimport { requireAuth } from '../utils/auth-guard.js';\nimport { resolveOrgId } from '../utils/org-resolver.js';\nimport { detectAppInfo } from '../utils/detect.js';\n\ninterface ReleaseOptions {\n app?: string;\n org?: string;\n platform?: 'ios' | 'android';\n target?: string[];\n channel?: string;\n mandatory?: boolean;\n rollout?: string;\n note?: string;\n bundlePath?: string;\n dryRun?: boolean;\n yes?: boolean;\n sign?: boolean;\n privateKey?: string;\n}\n\nexport const releaseCommand = new Command('release')\n .description('Bundle and publish a new release (deprecated: use publish-bundle + release-bundle)')\n .option('-a, --app <app-id>', 'App ID or slug')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('-p, --platform <platform>', 'Target platform (ios or android)')\n .option('-t, --target <versions...>', 'Target binary version(s)')\n .option('-c, --channel <channel>', 'Release channel', 'production')\n .option('-m, --mandatory', 'Mark as mandatory update', false)\n .option('-r, --rollout <percent>', 'Rollout percentage', '100')\n .option('-n, --note <note>', 'Release notes')\n .option('--bundle-path <path>', 'Path to pre-built bundle')\n .option('--dry-run', 'Simulate release without uploading', false)\n .option('-y, --yes', 'Skip confirmation prompts', false)\n .option('--sign', 'Sign the bundle', false)\n .option('--private-key <path>', 'Path to private key for signing')\n .action(async (options: ReleaseOptions) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n\n console.log('');\n logger.warning(\n chalk.yellow('The \"release\" command is deprecated. Use \"publish-bundle\" + \"release-bundle\" instead.')\n );\n console.log('');\n logger.info(chalk.bold('SwiftPatch Release'));\n console.log('');\n\n // STEP 1: Gather Information\n let appId = options.app;\n if (!appId) {\n const configApp = await detectAppFromConfig();\n if (configApp) {\n appId = configApp;\n logger.info(`Using app from config: ${chalk.cyan(appId)}`);\n } else {\n const apps = await api.getApps(orgId);\n if (apps.length === 0) {\n logger.error('No apps found. Create one with: swiftpatch apps create');\n process.exit(1);\n }\n\n const { selectedApp } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selectedApp',\n message: 'Select app:',\n choices: apps.map(app => ({\n name: `${app.name} (${app.platform})`,\n value: app.id,\n })),\n },\n ]);\n appId = selectedApp;\n }\n }\n\n const app = await api.getApp(orgId, appId!);\n logger.info(`App: ${chalk.cyan(app.name)}`);\n\n // Platform\n let platform = options.platform;\n if (!platform) {\n if (app.platform === 'BOTH') {\n const { selectedPlatform } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selectedPlatform',\n message: 'Select platform:',\n choices: [\n { name: 'iOS', value: 'ios' },\n { name: 'Android', value: 'android' },\n ],\n },\n ]);\n platform = selectedPlatform;\n } else {\n platform = app.platform.toLowerCase() as 'ios' | 'android';\n }\n }\n logger.info(`Platform: ${chalk.cyan(platform)}`);\n\n // Target version\n let targetVersions = options.target;\n if (!targetVersions || targetVersions.length === 0) {\n const detectedVersion = await detectAppInfo(platform!);\n\n const { version } = await inquirer.prompt([\n {\n type: 'input',\n name: 'version',\n message: 'Target binary version:',\n default: detectedVersion?.version || '1.0.0',\n validate: (input: string) => {\n if (!input) return 'Version is required';\n if (!/^\\d+\\.\\d+\\.\\d+/.test(input)) return 'Invalid version format (use semver)';\n return true;\n },\n },\n ]);\n targetVersions = [version];\n }\n logger.info(`Target version: ${chalk.cyan(targetVersions.join(', '))}`);\n\n // Release notes\n let releaseNote = options.note;\n if (!releaseNote && !options.yes) {\n const { note } = await inquirer.prompt([\n {\n type: 'input',\n name: 'note',\n message: 'Release notes (optional):',\n },\n ]);\n releaseNote = note || undefined;\n }\n\n const rolloutPercent = parseInt(options.rollout || '100', 10);\n\n // STEP 2: Bundle JavaScript\n let bundlePath = options.bundlePath;\n\n if (!bundlePath) {\n const spinner = ora('Bundling JavaScript...').start();\n\n try {\n const result = await bundler.bundle({\n platform: platform!,\n entryFile: 'index.js',\n dev: false,\n });\n\n bundlePath = result.bundlePath;\n spinner.succeed(`Bundle created: ${chalk.gray(formatBytes(result.bundleSize))}`);\n } catch (error: any) {\n spinner.fail(`Bundling failed: ${error.message}`);\n process.exit(1);\n }\n } else {\n if (!await fs.pathExists(bundlePath)) {\n logger.error(`Bundle not found: ${bundlePath}`);\n process.exit(1);\n }\n logger.info(`Using existing bundle: ${chalk.gray(bundlePath)}`);\n }\n\n // STEP 3: Hash Bundle\n const spinner2 = ora('Computing bundle hash...').start();\n const bundleHash = await hashBundle(bundlePath!);\n const bundleSize = (await fs.stat(bundlePath!)).size;\n spinner2.succeed(`Bundle hash: ${chalk.gray(bundleHash.slice(0, 16))}...`);\n\n // STEP 4: Sign Bundle (optional)\n let signature: string | undefined;\n\n if (options.sign || app.signingEnabled) {\n const spinner3 = ora('Signing bundle...').start();\n\n try {\n const privateKeyPath = options.privateKey || './swiftpatch-private.pem';\n signature = await signBundle(bundlePath!, privateKeyPath);\n spinner3.succeed('Bundle signed');\n } catch (error: any) {\n spinner3.fail(`Signing failed: ${error.message}`);\n if (app.signingEnabled) {\n logger.error('Bundle signing is required for this app');\n process.exit(1);\n }\n }\n }\n\n // STEP 5: Confirm Release\n console.log('');\n console.log(chalk.bold(' Release Summary'));\n console.log('');\n console.log(` App: ${chalk.cyan(app.name)}`);\n console.log(` Platform: ${chalk.cyan(platform)}`);\n console.log(` Target: ${chalk.cyan(targetVersions.join(', '))}`);\n console.log(` Channel: ${chalk.cyan(options.channel || 'production')}`);\n console.log(` Rollout: ${chalk.cyan(rolloutPercent + '%')}`);\n console.log(` Mandatory: ${options.mandatory ? chalk.yellow('Yes') : chalk.gray('No')}`);\n console.log(` Bundle: ${chalk.gray(formatBytes(bundleSize))}`);\n console.log(` Hash: ${chalk.gray(bundleHash.slice(0, 16))}...`);\n if (signature) {\n console.log(` Signed: ${chalk.green('Yes')}`);\n }\n if (releaseNote) {\n console.log(` Notes: ${chalk.gray(releaseNote.slice(0, 50))}${releaseNote.length > 50 ? '...' : ''}`);\n }\n console.log('');\n\n if (options.dryRun) {\n logger.info('Dry run - skipping upload');\n return;\n }\n\n if (!options.yes) {\n const { confirm } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirm',\n message: 'Publish this release?',\n default: true,\n },\n ]);\n\n if (!confirm) {\n logger.info('Release cancelled');\n return;\n }\n }\n\n // STEP 6: Create Release & Upload\n const spinner4 = ora('Creating release...').start();\n\n try {\n const release = await api.createRelease(orgId, app.id, {\n version: targetVersions[0],\n platform: platform!.toUpperCase() as 'IOS' | 'ANDROID',\n targetVersions,\n isMandatory: options.mandatory || false,\n releaseNote,\n });\n\n spinner4.text = 'Uploading bundle...';\n\n await uploader.uploadBundle(release.uploadUrl, bundlePath!, (progress) => {\n spinner4.text = `Uploading bundle... ${progress}%`;\n });\n\n spinner4.text = 'Processing...';\n\n await api.completeUpload(orgId, app.id, release.id, {\n bundleHash,\n bundleSize,\n signature,\n });\n\n const finalRelease = await waitForProcessing(orgId, app.id, release.id, spinner4);\n\n spinner4.text = 'Publishing...';\n await api.publishRelease(orgId, app.id, release.id, { rolloutPercent });\n\n spinner4.succeed('Release published!');\n\n // STEP 7: Show Success\n console.log('');\n console.log(chalk.green(' Release published successfully!'));\n console.log('');\n console.log(` Version: ${chalk.cyan(finalRelease.version)}`);\n console.log(` Release ID: ${chalk.gray(release.id)}`);\n console.log(` Status: ${chalk.green('RELEASED')}`);\n console.log(` Rollout: ${chalk.cyan(rolloutPercent + '%')}`);\n console.log('');\n console.log(` View in dashboard: ${chalk.cyan(`https://app.swiftpatch.io/apps/${app.id}/releases/${release.id}`)}`);\n console.log('');\n } catch (error: any) {\n spinner4.fail(`Release failed: ${error.message}`);\n process.exit(1);\n }\n });\n\nasync function detectAppFromConfig(): Promise<string | undefined> {\n const configPaths = [\n './swiftpatch.config.js',\n './swiftpatch.config.json',\n './.swiftpatchrc',\n ];\n\n for (const configPath of configPaths) {\n if (await fs.pathExists(configPath)) {\n try {\n const config = configPath.endsWith('.js')\n ? (await import(path.resolve(configPath))).default\n : await fs.readJson(configPath);\n return config.appId || config.app;\n } catch {\n continue;\n }\n }\n }\n\n return undefined;\n}\n\nasync function waitForProcessing(\n orgId: string,\n appId: string,\n releaseId: string,\n spinner: ReturnType<typeof ora>\n): Promise<any> {\n const maxAttempts = 12; // 60 seconds max wait\n let attempts = 0;\n\n while (attempts < maxAttempts) {\n const release = await api.getRelease(orgId, appId, releaseId);\n\n if (release.status === 'READY' || release.status === 'RELEASED') {\n return release;\n }\n\n if (release.status === 'FAILED') {\n throw new Error(release.statusMessage || 'Processing failed');\n }\n\n // After 15 seconds, proceed with PROCESSING status (publish endpoint accepts it)\n if (attempts >= 3 && release.status === 'PROCESSING') {\n return release;\n }\n\n await sleep(5000);\n attempts++;\n spinner.text = `Processing... (${attempts * 5}s)`;\n }\n\n // If we hit max attempts but status is PROCESSING, still proceed\n const release = await api.getRelease(orgId, appId, releaseId);\n if (release.status === 'PROCESSING') {\n return release;\n }\n\n throw new Error('Processing timed out');\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return bytes + ' B';\n if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB';\n return (bytes / 1024 / 1024).toFixed(1) + ' MB';\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n","import { spawn } from 'child_process';\nimport path from 'path';\nimport fs from 'fs-extra';\nimport os from 'os';\n\ninterface BundleOptions {\n platform: 'ios' | 'android';\n entryFile?: string;\n dev?: boolean;\n minify?: boolean;\n sourcemap?: boolean;\n}\n\ninterface BundleResult {\n bundlePath: string;\n bundleSize: number;\n sourcemapPath?: string;\n}\n\nexport const bundler = {\n async bundle(options: BundleOptions): Promise<BundleResult> {\n const {\n platform,\n entryFile = 'index.js',\n dev = false,\n minify = true,\n sourcemap = false,\n } = options;\n\n // Create temp directory for output\n const tempDir = path.join(os.tmpdir(), `swiftpatch-bundle-${Date.now()}`);\n await fs.ensureDir(tempDir);\n\n const bundlePath = path.join(tempDir, `index.${platform}.bundle`);\n const sourcemapPath = sourcemap\n ? path.join(tempDir, `index.${platform}.bundle.map`)\n : undefined;\n\n // Build metro bundler command\n const args = [\n 'react-native',\n 'bundle',\n '--platform', platform,\n '--entry-file', entryFile,\n '--bundle-output', bundlePath,\n '--dev', String(dev),\n '--minify', String(minify),\n '--reset-cache',\n ];\n\n if (sourcemap && sourcemapPath) {\n args.push('--sourcemap-output', sourcemapPath);\n }\n\n // Run metro bundler\n await runCommand('npx', args);\n\n // Get bundle size\n const stats = await fs.stat(bundlePath);\n\n return {\n bundlePath,\n bundleSize: stats.size,\n sourcemapPath,\n };\n },\n\n async bundleWithConfig(configPath: string): Promise<BundleResult> {\n const config = await fs.readJson(configPath);\n return this.bundle(config);\n },\n};\n\nfunction runCommand(command: string, args: string[]): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n stdio: ['inherit', 'pipe', 'pipe'],\n shell: true,\n });\n\n let stderr = '';\n\n child.stdout?.on('data', () => {\n // Optionally log output\n });\n\n child.stderr?.on('data', (data: Buffer) => {\n stderr += data.toString();\n });\n\n child.on('close', (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Bundle failed: ${stderr}`));\n }\n });\n\n child.on('error', (error) => {\n reject(error);\n });\n });\n}\n","import axios from 'axios';\nimport fs from 'fs-extra';\n\ntype ProgressCallback = (percent: number) => void;\n\nexport const uploader = {\n async uploadBundle(\n uploadUrl: string,\n bundlePath: string,\n onProgress?: ProgressCallback\n ): Promise<void> {\n const fileSize = (await fs.stat(bundlePath)).size;\n const fileStream = fs.createReadStream(bundlePath);\n\n let uploadedBytes = 0;\n\n fileStream.on('data', (chunk: any) => {\n uploadedBytes += chunk.length;\n const percent = Math.round((uploadedBytes / fileSize) * 100);\n onProgress?.(percent);\n });\n\n await axios.put(uploadUrl, fileStream, {\n headers: {\n 'Content-Type': 'application/javascript',\n 'Content-Length': fileSize,\n },\n maxContentLength: Infinity,\n maxBodyLength: Infinity,\n });\n },\n\n /**\n * Upload a ZIP file to S3 via presigned URL (for publish-bundle).\n */\n async uploadZip(\n uploadUrl: string,\n zipPath: string,\n onProgress?: ProgressCallback\n ): Promise<void> {\n const fileSize = (await fs.stat(zipPath)).size;\n const fileStream = fs.createReadStream(zipPath);\n\n let uploadedBytes = 0;\n\n fileStream.on('data', (chunk: any) => {\n uploadedBytes += chunk.length;\n const percent = Math.round((uploadedBytes / fileSize) * 100);\n onProgress?.(percent);\n });\n\n await axios.put(uploadUrl, fileStream, {\n headers: {\n 'Content-Type': 'application/zip',\n 'Content-Length': fileSize,\n },\n maxContentLength: Infinity,\n maxBodyLength: Infinity,\n });\n },\n\n async uploadWithRetry(\n uploadUrl: string,\n bundlePath: string,\n onProgress?: ProgressCallback,\n maxRetries: number = 3\n ): Promise<void> {\n let lastError: Error | null = null;\n\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n try {\n await this.uploadBundle(uploadUrl, bundlePath, onProgress);\n return;\n } catch (error: any) {\n lastError = error;\n if (attempt < maxRetries) {\n await sleep(1000 * Math.pow(2, attempt));\n }\n }\n }\n\n throw lastError || new Error('Upload failed');\n },\n};\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n","import crypto from 'crypto';\nimport fs from 'fs-extra';\nimport { readFileSync } from 'fs';\n\nexport async function hashBundle(bundlePath: string): Promise<string> {\n return new Promise((resolve, reject) => {\n const hash = crypto.createHash('sha256');\n const stream = fs.createReadStream(bundlePath);\n\n stream.on('data', (chunk) => hash.update(chunk));\n stream.on('end', () => resolve(hash.digest('hex')));\n stream.on('error', reject);\n });\n}\n\nexport function hashString(content: string): string {\n return crypto.createHash('sha256').update(content).digest('hex');\n}\n\n/**\n * Calculate SHA256 hash of a ZIP file synchronously.\n * Returns null if file doesn't exist or isn't a valid file.\n */\nexport function calculateZipHash(filePath: string): string | null {\n try {\n const fileBuffer = readFileSync(filePath);\n return crypto.createHash('sha256').update(fileBuffer).digest('hex');\n } catch {\n return null;\n }\n}\n\n/**\n * Hash a single file (for manifest generation).\n */\nexport async function hashFile(filePath: string): Promise<string> {\n return new Promise((resolve, reject) => {\n const hash = crypto.createHash('sha256');\n const stream = fs.createReadStream(filePath);\n\n stream.on('data', (chunk: any) => hash.update(chunk));\n stream.on('end', () => resolve(hash.digest('hex')));\n stream.on('error', reject);\n });\n}\n","import crypto from 'crypto';\nimport fs from 'fs-extra';\nimport path from 'path';\nimport jwt from 'jsonwebtoken';\nimport { hashFile } from './hash.js';\n\nconst BUNDLE_EXTENSION = '.swiftpatchsigned';\n\n/**\n * Sign a single bundle file with RSA-SHA256 (legacy method).\n */\nexport async function signBundle(bundlePath: string, privateKeyPath: string): Promise<string> {\n const absolutePath = path.resolve(privateKeyPath);\n\n if (!await fs.pathExists(absolutePath)) {\n throw new Error(`Private key not found: ${absolutePath}`);\n }\n\n const privateKey = await fs.readFile(absolutePath, 'utf-8');\n const bundleContent = await fs.readFile(bundlePath);\n\n const sign = crypto.createSign('RSA-SHA256');\n sign.update(bundleContent);\n sign.end();\n\n const signature = sign.sign(privateKey, 'base64');\n return signature;\n}\n\n/**\n * Sign a bundle directory with JWT RS256.\n * Generates a package manifest, computes package hash, signs with JWT.\n * Outputs a .swiftpatchsigned file in the bundle directory.\n */\nexport async function signBundleDirectory(bundlePath: string, privateKeyPath: string): Promise<void> {\n if (!privateKeyPath) return;\n\n let privateKey: Buffer;\n try {\n privateKey = await fs.readFile(path.resolve(privateKeyPath));\n } catch {\n throw new Error(`The path specified for the signing key (\"${privateKeyPath}\") was not valid.`);\n }\n\n const signedFilePath = path.join(bundlePath, BUNDLE_EXTENSION);\n\n const fileHashMap = await generatePackageManifest(bundlePath, bundlePath);\n const packageHash = await computePackageHash(fileHashMap);\n\n const payload = { packageHash };\n\n try {\n const signedJwt = jwt.sign(payload, privateKey, { algorithm: 'RS256' });\n await fs.writeFile(signedFilePath, signedJwt);\n } catch (err) {\n throw new Error(`Error signing bundle: ${(err as Error).message}`);\n }\n}\n\n/**\n * Generate a manifest of SHA256 hashes for all files in a directory.\n */\nexport async function generatePackageManifest(\n directoryPath: string,\n basePath: string\n): Promise<Map<string, string>> {\n const fileHashMap = new Map<string, string>();\n const filePathList = await getFilePathsInDir(directoryPath);\n\n if (!filePathList || filePathList.length === 0) {\n throw new Error(\"Error: Can't sign the release because no files were found.\");\n }\n\n for (const filePath of filePathList) {\n const relativePath = normalizePath(path.relative(basePath, filePath));\n if (!isIgnored(relativePath)) {\n const hash = await hashFile(filePath);\n fileHashMap.set(relativePath, hash);\n }\n }\n\n return fileHashMap;\n}\n\n/**\n * Compute a package hash from a file hash manifest.\n */\nexport async function computePackageHash(fileHashMap: Map<string, string>): Promise<string> {\n let entries: string[] = [];\n fileHashMap.forEach((hash: string, name: string) => {\n entries.push(name + ':' + hash);\n });\n entries = entries.sort();\n return crypto.createHash('sha256').update(JSON.stringify(entries)).digest('hex');\n}\n\nexport async function verifySignature(\n bundlePath: string,\n signature: string,\n publicKeyPath: string\n): Promise<boolean> {\n const publicKey = await fs.readFile(publicKeyPath, 'utf-8');\n const bundleContent = await fs.readFile(bundlePath);\n\n const verify = crypto.createVerify('RSA-SHA256');\n verify.update(bundleContent);\n verify.end();\n\n return verify.verify(publicKey, signature, 'base64');\n}\n\nexport async function generateKeyPair(outputDir: string): Promise<{\n publicKeyPath: string;\n privateKeyPath: string;\n}> {\n const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', {\n modulusLength: 2048,\n publicKeyEncoding: {\n type: 'spki',\n format: 'pem',\n },\n privateKeyEncoding: {\n type: 'pkcs8',\n format: 'pem',\n },\n });\n\n const publicKeyPath = path.join(outputDir, 'swiftpatch-public.pem');\n const privateKeyPath = path.join(outputDir, 'swiftpatch-private.pem');\n\n await fs.ensureDir(outputDir);\n await fs.writeFile(publicKeyPath, publicKey);\n await fs.writeFile(privateKeyPath, privateKey, { mode: 0o600 });\n\n return { publicKeyPath, privateKeyPath };\n}\n\n/**\n * Read the bundle signature (JWT) from a signed bundle directory.\n * Returns the JWT string or null if no signature file exists.\n */\nexport async function readBundleSignature(bundlePath: string): Promise<string | null> {\n const signedFilePath = path.join(bundlePath, BUNDLE_EXTENSION);\n if (!await fs.pathExists(signedFilePath)) {\n return null;\n }\n const signature = await fs.readFile(signedFilePath, 'utf-8');\n return signature.trim();\n}\n\n// ── Helpers ─────────────────────────────────────────────────────\n\nfunction normalizePath(filePath: string): string {\n return filePath.replace(/\\\\/g, '/');\n}\n\nasync function getFilePathsInDir(dir: string): Promise<string[]> {\n const stats = await fs.stat(dir);\n if (stats.isDirectory()) {\n let files: string[] = [];\n for (const file of await fs.readdir(dir)) {\n files = files.concat(await getFilePathsInDir(path.join(dir, file)));\n }\n return files;\n } else {\n return [dir];\n }\n}\n\nfunction isIgnored(relativeFilePath: string): boolean {\n const MACOSX = '__MACOSX/';\n const DS_STORE = '.DS_Store';\n const CODEPUSH_META = '.codepushrelease';\n return (\n relativeFilePath.startsWith(MACOSX) ||\n relativeFilePath === DS_STORE ||\n relativeFilePath.endsWith('/' + DS_STORE) ||\n relativeFilePath === CODEPUSH_META ||\n relativeFilePath.endsWith('/' + CODEPUSH_META)\n );\n}\n","import fs from 'fs-extra';\nimport path from 'path';\n\ninterface AppInfo {\n version: string;\n buildNumber?: string;\n}\n\nexport async function detectPlatform(): Promise<'ios' | 'android' | null> {\n const hasIos = await fs.pathExists('./ios');\n const hasAndroid = await fs.pathExists('./android');\n\n if (hasIos && !hasAndroid) return 'ios';\n if (hasAndroid && !hasIos) return 'android';\n return null;\n}\n\nexport async function detectAppInfo(platform: string): Promise<AppInfo | null> {\n try {\n if (platform === 'ios') {\n return await detectIosVersion();\n } else {\n return await detectAndroidVersion();\n }\n } catch {\n return null;\n }\n}\n\nasync function detectIosVersion(): Promise<AppInfo | null> {\n // Try to read from package.json\n try {\n const pkg = await fs.readJson('./package.json');\n if (pkg.version) {\n return { version: pkg.version };\n }\n } catch {\n // ignore\n }\n return null;\n}\n\nasync function detectAndroidVersion(): Promise<AppInfo | null> {\n // Try to read from package.json\n try {\n const pkg = await fs.readJson('./package.json');\n if (pkg.version) {\n return { version: pkg.version };\n }\n } catch {\n // ignore\n }\n return null;\n}\n","import { Command } from 'commander';\nimport { listReleasesCommand } from './list.js';\nimport { infoReleaseCommand } from './info.js';\nimport { rolloutCommand } from './rollout.js';\nimport { rollbackCommand } from './rollback.js';\nimport { disableCommand } from './disable.js';\n\nexport const releasesCommands = new Command('releases')\n .description('Manage releases');\n\nreleasesCommands.addCommand(listReleasesCommand);\nreleasesCommands.addCommand(infoReleaseCommand);\nreleasesCommands.addCommand(rolloutCommand);\nreleasesCommands.addCommand(rollbackCommand);\nreleasesCommands.addCommand(disableCommand);\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { api } from '../../lib/api.js';\nimport { requireAuth } from '../../utils/auth-guard.js';\nimport { resolveOrgId } from '../../utils/org-resolver.js';\nimport { createTable } from '../../utils/table.js';\n\nexport const listReleasesCommand = new Command('list')\n .description('List releases for an app')\n .argument('<app-id>', 'App ID')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('--page <page>', 'Page number', '1')\n .option('--limit <limit>', 'Items per page', '20')\n .option('--json', 'Output as JSON')\n .action(async (appId, options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n const spinner = ora('Fetching releases...').start();\n\n try {\n const result = await api.getReleases(orgId, appId, {\n page: parseInt(options.page, 10),\n limit: parseInt(options.limit, 10),\n });\n spinner.stop();\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n if (result.releases.length === 0) {\n console.log('');\n console.log(chalk.gray(' No releases found.'));\n console.log('');\n console.log(' Publish one with: ' + chalk.cyan('swiftpatch release'));\n console.log('');\n return;\n }\n\n console.log('');\n console.log(chalk.bold(' Releases'));\n console.log('');\n\n const table = createTable({\n head: ['Version', 'Platform', 'Status', 'Rollout', 'Mandatory', 'Created'],\n rows: result.releases.map(r => [\n chalk.cyan(r.version),\n r.platform,\n formatStatus(r.status),\n `${r.rolloutPercent}%`,\n r.isMandatory ? chalk.yellow('Yes') : chalk.gray('No'),\n new Date(r.createdAt).toLocaleDateString(),\n ]),\n });\n\n console.log(table);\n\n if (result.pagination) {\n console.log('');\n console.log(chalk.gray(\n ` Page ${result.pagination.page} of ${result.pagination.totalPages} (${result.pagination.total} total)`\n ));\n }\n\n console.log('');\n } catch (error: any) {\n spinner.fail(`Failed to fetch releases: ${error.message}`);\n process.exit(1);\n }\n });\n\nfunction formatStatus(status: string): string {\n switch (status) {\n case 'RELEASED': return chalk.green(status);\n case 'ROLLED_BACK': return chalk.red(status);\n case 'PROCESSING': return chalk.yellow(status);\n case 'READY': return chalk.blue(status);\n case 'FAILED': return chalk.red(status);\n default: return chalk.gray(status);\n }\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport inquirer from 'inquirer';\nimport { api } from '../../lib/api.js';\nimport { requireAuth } from '../../utils/auth-guard.js';\nimport { resolveOrgId } from '../../utils/org-resolver.js';\n\nexport const infoReleaseCommand = new Command('info')\n .description('Show release details')\n .argument('<release-id>', 'Release ID')\n .option('-a, --app <app-id>', 'App ID')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('--json', 'Output as JSON')\n .action(async (releaseId, options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n\n let appId = options.app;\n if (!appId) {\n const apps = await api.getApps(orgId);\n const { selectedApp } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selectedApp',\n message: 'Select app:',\n choices: apps.map(app => ({ name: app.name, value: app.id })),\n },\n ]);\n appId = selectedApp;\n }\n\n const spinner = ora('Fetching release details...').start();\n\n try {\n const release = await api.getRelease(orgId, appId, releaseId);\n spinner.stop();\n\n if (options.json) {\n console.log(JSON.stringify(release, null, 2));\n return;\n }\n\n console.log('');\n console.log(chalk.bold(' Release Details'));\n console.log('');\n console.log(` Version: ${chalk.cyan(release.version)}`);\n console.log(` ID: ${chalk.gray(release.id)}`);\n console.log(` Platform: ${release.platform}`);\n console.log(` Status: ${formatStatus(release.status)}`);\n console.log(` Rollout: ${chalk.cyan(release.rolloutPercent + '%')}`);\n console.log(` Mandatory: ${release.isMandatory ? chalk.yellow('Yes') : chalk.gray('No')}`);\n console.log(` Bundle Size: ${chalk.gray(formatBytes(release.bundleSize))}`);\n console.log(` Bundle Hash: ${chalk.gray(release.bundleHash?.slice(0, 16) || 'N/A')}...`);\n console.log(` Created: ${new Date(release.createdAt).toLocaleString()}`);\n if (release.releasedAt) {\n console.log(` Released: ${new Date(release.releasedAt).toLocaleString()}`);\n }\n if (release.releaseNote) {\n console.log('');\n console.log(chalk.bold(' Release Notes'));\n console.log(` ${release.releaseNote}`);\n }\n console.log('');\n } catch (error: any) {\n spinner.fail(`Failed to fetch release: ${error.message}`);\n process.exit(1);\n }\n });\n\nfunction formatStatus(status: string): string {\n switch (status) {\n case 'RELEASED': return chalk.green(status);\n case 'ROLLED_BACK': return chalk.red(status);\n case 'PROCESSING': return chalk.yellow(status);\n default: return chalk.gray(status);\n }\n}\n\nfunction formatBytes(bytes: number): string {\n if (!bytes) return 'N/A';\n if (bytes < 1024) return bytes + ' B';\n if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB';\n return (bytes / 1024 / 1024).toFixed(1) + ' MB';\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport { api } from '../../lib/api.js';\nimport { requireAuth } from '../../utils/auth-guard.js';\nimport { resolveOrgId } from '../../utils/org-resolver.js';\n\nexport const rolloutCommand = new Command('rollout')\n .description('Update rollout percentage for a release')\n .argument('<release-id>', 'Release ID')\n .option('-a, --app <app-id>', 'App ID')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('-p, --percent <percent>', 'Rollout percentage (0-100)')\n .action(async (releaseId, options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n\n let appId = options.app;\n if (!appId) {\n const apps = await api.getApps(orgId);\n const { selectedApp } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selectedApp',\n message: 'Select app:',\n choices: apps.map(app => ({ name: app.name, value: app.id })),\n },\n ]);\n appId = selectedApp;\n }\n\n let rolloutPercent = options.percent ? parseInt(options.percent, 10) : null;\n\n if (rolloutPercent !== null && (isNaN(rolloutPercent) || rolloutPercent < 0 || rolloutPercent > 100)) {\n console.error(chalk.red('Rollout percentage must be a number between 0 and 100'));\n process.exit(1);\n }\n\n if (rolloutPercent === null) {\n const release = await api.getRelease(orgId, appId, releaseId);\n\n const { percent } = await inquirer.prompt([\n {\n type: 'number',\n name: 'percent',\n message: `Current rollout: ${release.rolloutPercent}%. New percentage:`,\n default: release.rolloutPercent,\n validate: (input: number) => {\n if (input < 0 || input > 100) return 'Must be between 0 and 100';\n return true;\n },\n },\n ]);\n rolloutPercent = percent;\n }\n\n const spinner = ora('Updating rollout...').start();\n\n try {\n const release = await api.updateRollout(orgId, appId, releaseId, rolloutPercent!);\n spinner.succeed(`Rollout updated to ${chalk.cyan(rolloutPercent + '%')}`);\n\n console.log('');\n console.log(` Release: ${chalk.gray(release.version)}`);\n console.log(` Status: ${chalk.green(release.status)}`);\n console.log(` Rollout: ${chalk.cyan(release.rolloutPercent + '%')}`);\n console.log('');\n } catch (error: any) {\n spinner.fail(`Failed to update rollout: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport { api } from '../../lib/api.js';\nimport { requireAuth } from '../../utils/auth-guard.js';\nimport { resolveOrgId } from '../../utils/org-resolver.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const rollbackCommand = new Command('rollback')\n .description('Rollback (disable) a release')\n .argument('<release-id>', 'Release ID')\n .option('-a, --app <app-id>', 'App ID')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('-r, --reason <reason>', 'Rollback reason')\n .option('-y, --yes', 'Skip confirmation')\n .action(async (releaseId, options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n\n let appId = options.app;\n if (!appId) {\n const apps = await api.getApps(orgId);\n const { selectedApp } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selectedApp',\n message: 'Select app:',\n choices: apps.map(app => ({ name: app.name, value: app.id })),\n },\n ]);\n appId = selectedApp;\n }\n\n const release = await api.getRelease(orgId, appId, releaseId);\n\n console.log('');\n logger.warning('You are about to rollback this release:');\n console.log('');\n console.log(` Version: ${chalk.cyan(release.version)}`);\n console.log(` Platform: ${release.platform}`);\n console.log(` Status: ${release.status}`);\n console.log(` Rollout: ${release.rolloutPercent}%`);\n console.log('');\n\n if (!options.yes) {\n const { confirm } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirm',\n message: 'Are you sure you want to rollback this release?',\n default: false,\n },\n ]);\n\n if (!confirm) {\n logger.info('Rollback cancelled');\n return;\n }\n }\n\n let reason = options.reason;\n if (!reason && !options.yes) {\n const { inputReason } = await inquirer.prompt([\n {\n type: 'input',\n name: 'inputReason',\n message: 'Reason for rollback (optional):',\n },\n ]);\n reason = inputReason || undefined;\n }\n\n const spinner = ora('Rolling back release...').start();\n\n try {\n await api.rollbackRelease(orgId, appId, releaseId, reason);\n spinner.succeed('Release rolled back');\n\n console.log('');\n console.log(chalk.yellow(' Release has been disabled'));\n console.log(chalk.gray(' Users will no longer receive this update'));\n console.log('');\n } catch (error: any) {\n spinner.fail(`Rollback failed: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport { api } from '../../lib/api.js';\nimport { requireAuth } from '../../utils/auth-guard.js';\nimport { resolveOrgId } from '../../utils/org-resolver.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const disableCommand = new Command('disable')\n .description('Disable a release (stops serving to new devices)')\n .argument('<release-id>', 'Release ID')\n .option('-a, --app <app-id>', 'App ID')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('-r, --reason <reason>', 'Reason for disabling')\n .option('-y, --yes', 'Skip confirmation')\n .action(async (releaseId, options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n\n let appId = options.app;\n if (!appId) {\n const apps = await api.getApps(orgId);\n const { selectedApp } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selectedApp',\n message: 'Select app:',\n choices: apps.map(app => ({ name: app.name, value: app.id })),\n },\n ]);\n appId = selectedApp;\n }\n\n const release = await api.getRelease(orgId, appId, releaseId);\n\n console.log('');\n logger.warning('You are about to disable this release:');\n console.log('');\n console.log(` Version: ${chalk.cyan(release.version)}`);\n console.log(` Platform: ${release.platform}`);\n console.log(` Status: ${release.status}`);\n console.log(` Rollout: ${release.rolloutPercent}%`);\n console.log('');\n\n if (!options.yes) {\n const { confirm } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirm',\n message: 'Are you sure you want to disable this release?',\n default: false,\n },\n ]);\n\n if (!confirm) {\n logger.info('Cancelled');\n return;\n }\n }\n\n let reason = options.reason;\n if (!reason && !options.yes) {\n const { inputReason } = await inquirer.prompt([\n {\n type: 'input',\n name: 'inputReason',\n message: 'Reason for disabling (optional):',\n },\n ]);\n reason = inputReason || undefined;\n }\n\n const spinner = ora('Disabling release...').start();\n\n try {\n await api.disableRelease(orgId, appId, releaseId, reason);\n spinner.succeed('Release disabled');\n\n console.log('');\n console.log(chalk.yellow(' Release has been disabled'));\n console.log(chalk.gray(' New devices will not receive this update'));\n console.log(chalk.gray(' Devices that already installed it are unaffected'));\n console.log('');\n } catch (error: any) {\n spinner.fail(`Failed to disable release: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport { listChannelsCommand } from './list.js';\nimport { createChannelCommand } from './create.js';\nimport { updateChannelCommand } from './update.js';\nimport { deleteChannelCommand } from './delete.js';\n\nexport const channelsCommands = new Command('channels')\n .description('Manage channels');\n\nchannelsCommands.addCommand(listChannelsCommand);\nchannelsCommands.addCommand(createChannelCommand);\nchannelsCommands.addCommand(updateChannelCommand);\nchannelsCommands.addCommand(deleteChannelCommand);\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { api } from '../../lib/api.js';\nimport { requireAuth } from '../../utils/auth-guard.js';\nimport { resolveOrgId } from '../../utils/org-resolver.js';\nimport { createTable } from '../../utils/table.js';\n\nexport const listChannelsCommand = new Command('list')\n .description('List channels for an app')\n .argument('<app-id>', 'App ID')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('--json', 'Output as JSON')\n .action(async (appId, options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n const spinner = ora('Fetching channels...').start();\n\n try {\n const channels = await api.getChannels(orgId, appId);\n spinner.stop();\n\n if (options.json) {\n console.log(JSON.stringify(channels, null, 2));\n return;\n }\n\n if (channels.length === 0) {\n console.log('');\n console.log(chalk.gray(' No channels found.'));\n console.log('');\n return;\n }\n\n console.log('');\n console.log(chalk.bold(' Channels'));\n console.log('');\n\n const table = createTable({\n head: ['Name', 'Slug', 'Created'],\n rows: channels.map(ch => [\n chalk.cyan(ch.name),\n chalk.gray(ch.slug),\n new Date(ch.createdAt).toLocaleDateString(),\n ]),\n });\n\n console.log(table);\n console.log('');\n } catch (error: any) {\n spinner.fail(`Failed to fetch channels: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport { api } from '../../lib/api.js';\nimport { requireAuth } from '../../utils/auth-guard.js';\nimport { resolveOrgId } from '../../utils/org-resolver.js';\n\nexport const createChannelCommand = new Command('create')\n .description('Create a new channel')\n .argument('<app-id>', 'App ID')\n .option('-n, --name <name>', 'Channel name')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('--json', 'Output as JSON')\n .action(async (appId, options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n\n let channelName = options.name;\n if (!channelName) {\n const { name } = await inquirer.prompt([\n {\n type: 'input',\n name: 'name',\n message: 'Channel name:',\n validate: (input: string) => {\n if (!input.trim()) return 'Channel name is required';\n return true;\n },\n },\n ]);\n channelName = name;\n }\n\n const spinner = ora('Creating channel...').start();\n\n try {\n const channel = await api.createChannel(orgId, appId, { name: channelName });\n spinner.succeed('Channel created!');\n\n if (options.json) {\n console.log(JSON.stringify(channel, null, 2));\n return;\n }\n\n console.log('');\n console.log(` Name: ${chalk.cyan(channel.name)}`);\n console.log(` Slug: ${chalk.gray(channel.slug)}`);\n console.log('');\n } catch (error: any) {\n spinner.fail(`Failed to create channel: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport { api } from '../../lib/api.js';\nimport { requireAuth } from '../../utils/auth-guard.js';\nimport { resolveOrgId } from '../../utils/org-resolver.js';\n\nexport const updateChannelCommand = new Command('update')\n .description('Update a channel')\n .argument('<app-id>', 'App ID')\n .argument('<channel-id>', 'Channel ID')\n .option('-n, --name <name>', 'New channel name')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('--json', 'Output as JSON')\n .action(async (appId, channelId, options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n\n let channelName = options.name;\n if (!channelName) {\n const answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'name',\n message: 'New channel name:',\n validate: (input: string) => {\n if (!input.trim()) return 'Channel name is required';\n return true;\n },\n },\n ]);\n channelName = answers.name;\n }\n\n const spinner = ora('Updating channel...').start();\n\n try {\n const channel = await api.updateChannel(orgId, appId, channelId, { name: channelName });\n spinner.succeed('Channel updated!');\n\n if (options.json) {\n console.log(JSON.stringify(channel, null, 2));\n return;\n }\n\n console.log('');\n console.log(` Name: ${chalk.cyan(channel.name)}`);\n console.log(` Slug: ${chalk.gray(channel.slug)}`);\n console.log('');\n } catch (error: any) {\n spinner.fail(`Failed to update channel: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport { api } from '../../lib/api.js';\nimport { requireAuth } from '../../utils/auth-guard.js';\nimport { resolveOrgId } from '../../utils/org-resolver.js';\n\nexport const deleteChannelCommand = new Command('delete')\n .description('Delete a channel')\n .argument('<app-id>', 'App ID')\n .argument('<channel-id>', 'Channel ID')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('-y, --yes', 'Skip confirmation')\n .action(async (appId, channelId, options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n\n if (!options.yes) {\n const { confirm } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirm',\n message: 'Are you sure you want to delete this channel? This cannot be undone.',\n default: false,\n },\n ]);\n\n if (!confirm) {\n console.log(chalk.gray(' Cancelled'));\n return;\n }\n }\n\n const spinner = ora('Deleting channel...').start();\n\n try {\n await api.deleteChannel(orgId, appId, channelId);\n spinner.succeed('Channel deleted');\n console.log('');\n } catch (error: any) {\n spinner.fail(`Failed to delete channel: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport { listCITokensCommand } from './list.js';\nimport { createCITokenCommand } from './create.js';\nimport { deleteCITokenCommand } from './delete.js';\nimport { regenerateCITokenCommand } from './regenerate.js';\n\nexport const ciTokensCommands = new Command('ci-tokens')\n .description('Manage CI/CD tokens');\n\nciTokensCommands.addCommand(listCITokensCommand);\nciTokensCommands.addCommand(createCITokenCommand);\nciTokensCommands.addCommand(deleteCITokenCommand);\nciTokensCommands.addCommand(regenerateCITokenCommand);\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport { api } from '../../lib/api.js';\nimport { requireAuth } from '../../utils/auth-guard.js';\nimport { resolveOrgId } from '../../utils/org-resolver.js';\nimport { createTable } from '../../utils/table.js';\n\nexport const listCITokensCommand = new Command('list')\n .description('List CI tokens for an app')\n .argument('[app-id]', 'App ID')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('--json', 'Output as JSON')\n .action(async (appId, options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n\n if (!appId) {\n const apps = await api.getApps(orgId);\n const { selectedApp } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selectedApp',\n message: 'Select app:',\n choices: apps.map(app => ({ name: app.name, value: app.id })),\n },\n ]);\n appId = selectedApp;\n }\n\n const spinner = ora('Fetching CI tokens...').start();\n\n try {\n const tokens = await api.getCITokens(orgId, appId);\n spinner.stop();\n\n if (options.json) {\n console.log(JSON.stringify(tokens, null, 2));\n return;\n }\n\n if (tokens.length === 0) {\n console.log('');\n console.log(chalk.gray(' No CI tokens found.'));\n console.log(chalk.gray(' Create one with: swiftpatch ci-tokens create'));\n console.log('');\n return;\n }\n\n console.log('');\n console.log(chalk.bold(' CI Tokens'));\n console.log('');\n\n const table = createTable({\n head: ['Name', 'Prefix', 'Status', 'Uses', 'Last Used', 'Created'],\n rows: tokens.map(t => [\n chalk.cyan(t.name),\n chalk.gray(t.tokenPrefix + '...'),\n t.isActive ? chalk.green('Active') : chalk.red('Revoked'),\n String(t.usageCount),\n t.lastUsedAt ? new Date(t.lastUsedAt).toLocaleDateString() : chalk.gray('Never'),\n new Date(t.createdAt).toLocaleDateString(),\n ]),\n });\n\n console.log(table);\n console.log('');\n } catch (error: any) {\n spinner.fail(`Failed to fetch CI tokens: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport { api } from '../../lib/api.js';\nimport { requireAuth } from '../../utils/auth-guard.js';\nimport { resolveOrgId } from '../../utils/org-resolver.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const createCITokenCommand = new Command('create')\n .description('Create a new CI token')\n .argument('[app-id]', 'App ID')\n .option('-n, --name <name>', 'Token name')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('--json', 'Output as JSON')\n .action(async (appId, options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n\n if (!appId) {\n const apps = await api.getApps(orgId);\n const { selectedApp } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selectedApp',\n message: 'Select app:',\n choices: apps.map(app => ({ name: app.name, value: app.id })),\n },\n ]);\n appId = selectedApp;\n }\n\n let tokenName = options.name;\n if (!tokenName) {\n const answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'name',\n message: 'Token name (e.g., \"GitHub Actions\", \"Jenkins\"):',\n validate: (input: string) => {\n if (!input.trim()) return 'Token name is required';\n return true;\n },\n },\n ]);\n tokenName = answers.name;\n }\n\n const spinner = ora('Creating CI token...').start();\n\n try {\n const result = await api.createCIToken(orgId, appId, tokenName);\n spinner.succeed('CI token created!');\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n console.log('');\n console.log(chalk.bold(' Your CI Token (shown only once):'));\n console.log('');\n console.log(` ${chalk.green(result.token)}`);\n console.log('');\n logger.warning('Save this token now. It will not be shown again.');\n console.log('');\n console.log(chalk.gray(' Usage in CI/CD:'));\n console.log(chalk.gray(' $ swiftpatch publish-bundle -p ios --ci-token <token>'));\n console.log(chalk.gray(' $ swiftpatch release-bundle --hash <hash> --app-version 1.0.0 --ci-token <token>'));\n console.log('');\n console.log(chalk.gray(' Or set as environment variable:'));\n console.log(chalk.gray(' $ export SWIFTPATCH_CI_TOKEN=<token>'));\n console.log('');\n } catch (error: any) {\n spinner.fail(`Failed to create CI token: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport { api } from '../../lib/api.js';\nimport { requireAuth } from '../../utils/auth-guard.js';\nimport { resolveOrgId } from '../../utils/org-resolver.js';\n\nexport const deleteCITokenCommand = new Command('delete')\n .description('Revoke a CI token')\n .argument('<token-id>', 'Token ID')\n .option('-a, --app <app-id>', 'App ID')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('-y, --yes', 'Skip confirmation')\n .action(async (tokenId, options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n\n let appId = options.app;\n if (!appId) {\n const apps = await api.getApps(orgId);\n const { selectedApp } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selectedApp',\n message: 'Select app:',\n choices: apps.map(app => ({ name: app.name, value: app.id })),\n },\n ]);\n appId = selectedApp;\n }\n\n if (!options.yes) {\n const { confirm } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirm',\n message: 'Are you sure you want to revoke this CI token? Any pipelines using it will stop working.',\n default: false,\n },\n ]);\n\n if (!confirm) {\n console.log(chalk.gray(' Cancelled'));\n return;\n }\n }\n\n const spinner = ora('Revoking CI token...').start();\n\n try {\n await api.deleteCIToken(orgId, appId, tokenId);\n spinner.succeed('CI token revoked');\n console.log('');\n } catch (error: any) {\n spinner.fail(`Failed to revoke CI token: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport { api } from '../../lib/api.js';\nimport { requireAuth } from '../../utils/auth-guard.js';\nimport { resolveOrgId } from '../../utils/org-resolver.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const regenerateCITokenCommand = new Command('regenerate')\n .description('Regenerate a CI token (revokes old one)')\n .argument('<token-id>', 'Token ID')\n .option('-a, --app <app-id>', 'App ID')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('-y, --yes', 'Skip confirmation')\n .option('--json', 'Output as JSON')\n .action(async (tokenId, options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n\n let appId = options.app;\n if (!appId) {\n const apps = await api.getApps(orgId);\n const { selectedApp } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selectedApp',\n message: 'Select app:',\n choices: apps.map(app => ({ name: app.name, value: app.id })),\n },\n ]);\n appId = selectedApp;\n }\n\n if (!options.yes) {\n const { confirm } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirm',\n message: 'This will revoke the old token. Pipelines using it will need to be updated. Continue?',\n default: false,\n },\n ]);\n\n if (!confirm) {\n console.log(chalk.gray(' Cancelled'));\n return;\n }\n }\n\n const spinner = ora('Regenerating CI token...').start();\n\n try {\n const result = await api.regenerateCIToken(orgId, appId, tokenId);\n spinner.succeed('CI token regenerated!');\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n console.log('');\n console.log(chalk.bold(' Your new CI Token (shown only once):'));\n console.log('');\n console.log(` ${chalk.green(result.token)}`);\n console.log('');\n logger.warning('Save this token now. It will not be shown again.');\n logger.warning('The old token has been revoked.');\n console.log('');\n } catch (error: any) {\n spinner.fail(`Failed to regenerate CI token: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport { listWebhooksCommand } from './list.js';\nimport { createWebhookCommand } from './create.js';\nimport { updateWebhookCommand } from './update.js';\nimport { deleteWebhookCommand } from './delete.js';\nimport { testWebhookCommand } from './test.js';\n\nexport const webhooksCommands = new Command('webhooks')\n .description('Manage webhooks');\n\nwebhooksCommands.addCommand(listWebhooksCommand);\nwebhooksCommands.addCommand(createWebhookCommand);\nwebhooksCommands.addCommand(updateWebhookCommand);\nwebhooksCommands.addCommand(deleteWebhookCommand);\nwebhooksCommands.addCommand(testWebhookCommand);\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { api } from '../../lib/api.js';\nimport { requireAuth } from '../../utils/auth-guard.js';\nimport { resolveOrgId } from '../../utils/org-resolver.js';\nimport { createTable } from '../../utils/table.js';\n\nexport const listWebhooksCommand = new Command('list')\n .description('List webhooks')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n const spinner = ora('Fetching webhooks...').start();\n\n try {\n const webhooks = await api.getWebhooks(orgId);\n spinner.stop();\n\n if (options.json) {\n console.log(JSON.stringify(webhooks, null, 2));\n return;\n }\n\n if (webhooks.length === 0) {\n console.log('');\n console.log(chalk.gray(' No webhooks configured.'));\n console.log(chalk.gray(' Create one with: swiftpatch webhooks create'));\n console.log('');\n return;\n }\n\n console.log('');\n console.log(chalk.bold(' Webhooks'));\n console.log('');\n\n const table = createTable({\n head: ['ID', 'URL', 'Events', 'Status', 'Deliveries'],\n rows: webhooks.map(w => [\n chalk.gray(w.id.slice(0, 8) + '...'),\n chalk.cyan(w.url.length > 40 ? w.url.slice(0, 40) + '...' : w.url),\n w.events.join(', '),\n w.isActive ? chalk.green('Active') : chalk.red('Inactive'),\n w.stats ? `${w.stats.successfulDeliveries}/${w.stats.totalDeliveries}` : '0/0',\n ]),\n });\n\n console.log(table);\n console.log('');\n } catch (error: any) {\n spinner.fail(`Failed to fetch webhooks: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport { api } from '../../lib/api.js';\nimport { requireAuth } from '../../utils/auth-guard.js';\nimport { resolveOrgId } from '../../utils/org-resolver.js';\n\nconst WEBHOOK_EVENTS = [\n 'release.published',\n 'release.disabled',\n 'update.success',\n 'update.failed',\n 'app.created',\n 'app.deleted',\n];\n\nexport const createWebhookCommand = new Command('create')\n .description('Create a webhook')\n .option('-u, --url <url>', 'Webhook URL')\n .option('-e, --events <events...>', 'Events to subscribe to')\n .option('-s, --secret <secret>', 'Webhook signing secret')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n\n let url = options.url;\n if (!url) {\n const answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'url',\n message: 'Webhook URL:',\n validate: (input: string) => {\n if (!input.trim()) return 'URL is required';\n try {\n new URL(input);\n return true;\n } catch {\n return 'Invalid URL';\n }\n },\n },\n ]);\n url = answers.url;\n }\n\n let events = options.events;\n if (!events || events.length === 0) {\n const answers = await inquirer.prompt([\n {\n type: 'checkbox',\n name: 'events',\n message: 'Select events to subscribe to:',\n choices: WEBHOOK_EVENTS,\n validate: (input: string[]) => {\n if (input.length === 0) return 'Select at least one event';\n return true;\n },\n },\n ]);\n events = answers.events;\n }\n\n const spinner = ora('Creating webhook...').start();\n\n try {\n const webhook = await api.createWebhook(orgId, {\n url,\n events,\n secret: options.secret,\n });\n spinner.succeed('Webhook created!');\n\n if (options.json) {\n console.log(JSON.stringify(webhook, null, 2));\n return;\n }\n\n console.log('');\n console.log(` ID: ${chalk.gray(webhook.id)}`);\n console.log(` URL: ${chalk.cyan(webhook.url)}`);\n console.log(` Events: ${webhook.events.join(', ')}`);\n if (webhook.secret) {\n console.log(` Secret: ${chalk.green(webhook.secret)}`);\n console.log(chalk.yellow(' Save this secret — it will not be shown again.'));\n }\n console.log('');\n } catch (error: any) {\n spinner.fail(`Failed to create webhook: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { api } from '../../lib/api.js';\nimport { requireAuth } from '../../utils/auth-guard.js';\nimport { resolveOrgId } from '../../utils/org-resolver.js';\n\nexport const updateWebhookCommand = new Command('update')\n .description('Update a webhook')\n .argument('<webhook-id>', 'Webhook ID')\n .option('-u, --url <url>', 'New URL')\n .option('-e, --events <events...>', 'New events list')\n .option('-s, --secret <secret>', 'New signing secret')\n .option('--enable', 'Enable webhook')\n .option('--disable', 'Disable webhook')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('--json', 'Output as JSON')\n .action(async (webhookId, options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n\n const params: Record<string, any> = {};\n if (options.url) params.url = options.url;\n if (options.events) params.events = options.events;\n if (options.secret) params.secret = options.secret;\n if (options.enable) params.isActive = true;\n if (options.disable) params.isActive = false;\n\n if (Object.keys(params).length === 0) {\n console.log(chalk.yellow(' No changes specified. Use --url, --events, --secret, --enable, or --disable'));\n process.exit(1);\n }\n\n const spinner = ora('Updating webhook...').start();\n\n try {\n const webhook = await api.updateWebhook(orgId, webhookId, params);\n spinner.succeed('Webhook updated!');\n\n if (options.json) {\n console.log(JSON.stringify(webhook, null, 2));\n return;\n }\n\n console.log('');\n console.log(` URL: ${chalk.cyan(webhook.url)}`);\n console.log(` Events: ${webhook.events.join(', ')}`);\n console.log(` Status: ${webhook.isActive ? chalk.green('Active') : chalk.red('Inactive')}`);\n console.log('');\n } catch (error: any) {\n spinner.fail(`Failed to update webhook: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport { api } from '../../lib/api.js';\nimport { requireAuth } from '../../utils/auth-guard.js';\nimport { resolveOrgId } from '../../utils/org-resolver.js';\n\nexport const deleteWebhookCommand = new Command('delete')\n .description('Delete a webhook')\n .argument('<webhook-id>', 'Webhook ID')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('-y, --yes', 'Skip confirmation')\n .action(async (webhookId, options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n\n if (!options.yes) {\n const { confirm } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirm',\n message: 'Are you sure you want to delete this webhook?',\n default: false,\n },\n ]);\n\n if (!confirm) {\n console.log(chalk.gray(' Cancelled'));\n return;\n }\n }\n\n const spinner = ora('Deleting webhook...').start();\n\n try {\n await api.deleteWebhook(orgId, webhookId);\n spinner.succeed('Webhook deleted');\n console.log('');\n } catch (error: any) {\n spinner.fail(`Failed to delete webhook: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { api } from '../../lib/api.js';\nimport { requireAuth } from '../../utils/auth-guard.js';\nimport { resolveOrgId } from '../../utils/org-resolver.js';\n\nexport const testWebhookCommand = new Command('test')\n .description('Send a test event to a webhook')\n .argument('<webhook-id>', 'Webhook ID')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('--json', 'Output as JSON')\n .action(async (webhookId, options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n const spinner = ora('Sending test event...').start();\n\n try {\n const result = await api.testWebhook(orgId, webhookId);\n\n if (result.success) {\n spinner.succeed(`Test event delivered (status ${result.statusCode})`);\n } else {\n spinner.fail(`Test event failed: ${result.error || 'Unknown error'}`);\n }\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n console.log('');\n } catch (error: any) {\n spinner.fail(`Failed to send test event: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { api } from '../lib/api.js';\nimport { requireAuth } from '../utils/auth-guard.js';\nimport { resolveOrgId } from '../utils/org-resolver.js';\n\nexport const analyticsCommand = new Command('analytics')\n .description('View analytics for an app')\n .argument('<app-id>', 'App ID')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('-r, --release <release-id>', 'Filter by release')\n .option('-d, --days <days>', 'Time range in days', '7')\n .option('--json', 'Output as JSON')\n .action(async (appId, options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n const spinner = ora('Fetching analytics...').start();\n\n try {\n const analytics = await api.getAnalytics(orgId, appId, {\n days: parseInt(options.days, 10),\n releaseId: options.release,\n });\n spinner.stop();\n\n if (options.json) {\n console.log(JSON.stringify(analytics, null, 2));\n return;\n }\n\n console.log('');\n console.log(chalk.bold(' Analytics Overview'));\n console.log('');\n console.log(` Total Updates: ${chalk.cyan((analytics.totalUpdates ?? 0).toLocaleString())}`);\n console.log(` Success Rate: ${chalk.green((analytics.successRate ?? 0).toFixed(1) + '%')}`);\n console.log(` Avg Patch Size: ${chalk.cyan(formatBytes(analytics.avgPatchSize ?? 0))}`);\n console.log(` Bandwidth Saved: ${chalk.green(formatBytes(analytics.bandwidthSaved ?? 0))}`);\n console.log(` Bandwidth Used: ${chalk.gray(formatBytes(analytics.totalBandwidthUsed ?? 0))}`);\n console.log('');\n } catch (error: any) {\n spinner.fail(`Failed to fetch analytics: ${error.message}`);\n process.exit(1);\n }\n });\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return bytes + ' B';\n if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB';\n return (bytes / 1024 / 1024).toFixed(1) + ' MB';\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { api } from '../lib/api.js';\nimport { requireAuth } from '../utils/auth-guard.js';\nimport { resolveOrgId } from '../utils/org-resolver.js';\nimport { aiDoctorCommand } from './ai-doctor.js';\nimport { aiExplainCommand } from './ai-explain.js';\nimport { aiReviewCommand } from './ai-review.js';\n\nexport const aiCommand = new Command('ai')\n .description('AI-powered release intelligence');\n\n// ── Claude AI local commands (doctor, explain, review) ─────\n\naiCommand.addCommand(aiDoctorCommand);\naiCommand.addCommand(aiExplainCommand);\naiCommand.addCommand(aiReviewCommand);\n\n// ── Ask AI ──────────────────────────────────────────────────\n\naiCommand\n .command('ask')\n .description('Ask AI about your releases, crashes, or deployment strategy')\n .argument('<question>', 'Your question')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('-a, --app <app-id>', 'App ID for context')\n .action(async (question, options) => {\n await requireAuth();\n const orgId = await resolveOrgId(options.org);\n\n process.stdout.write(chalk.dim('AI: '));\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 60_000);\n\n try {\n const response = await fetch(\n `${api.getBaseUrl()}/orgs/${orgId}/ai/chat`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...api.getAuthHeaders(),\n },\n body: JSON.stringify({\n message: question,\n context: {\n page: 'cli',\n ...(options.app ? { entityType: 'app', entityId: options.app } : {}),\n },\n }),\n signal: controller.signal,\n }\n );\n\n if (!response.ok) {\n throw new Error(`Request failed: ${response.status} ${response.statusText}`);\n }\n\n if (!response.body) {\n throw new Error('No response body');\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6);\n if (data === '[DONE]') break;\n process.stdout.write(data);\n }\n }\n }\n\n console.log('');\n console.log('');\n } catch (error: any) {\n console.log('');\n if (error.name === 'AbortError') {\n console.error(chalk.red('AI request timed out after 60 seconds.'));\n } else {\n console.error(chalk.red(`Failed: ${error.message}`));\n }\n process.exit(1);\n } finally {\n clearTimeout(timeout);\n }\n });\n\n// ── Risk Score ──────────────────────────────────────────────\n\naiCommand\n .command('risk-score')\n .description('Get AI risk assessment for a release')\n .requiredOption('-o, --org <org-id>', 'Organization ID')\n .requiredOption('-a, --app <app-id>', 'App ID')\n .requiredOption('-r, --release <release-id>', 'Release ID')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n await requireAuth();\n const orgId = options.org;\n const spinner = ora('Assessing release risk...').start();\n\n try {\n const assessment = await api.aiRiskAssessment(orgId, options.app, options.release);\n spinner.stop();\n\n if (options.json) {\n console.log(JSON.stringify(assessment, null, 2));\n return;\n }\n\n const levelColors: Record<string, (s: string) => string> = {\n LOW: chalk.green,\n MEDIUM: chalk.yellow,\n HIGH: chalk.hex('#f97316'),\n CRITICAL: chalk.red,\n };\n\n const colorFn = levelColors[assessment.level] || chalk.white;\n\n console.log('');\n console.log(chalk.bold(' Risk Assessment'));\n console.log('');\n console.log(` Score: ${colorFn(String(assessment.score) + '/100')}`);\n console.log(` Level: ${colorFn(assessment.level)}`);\n console.log('');\n console.log(chalk.bold(' Risk Factors:'));\n for (const factor of assessment.factors) {\n const bar = '\\u2588'.repeat(factor.impact) + '\\u2591'.repeat(10 - factor.impact);\n console.log(` ${bar} ${factor.factor}`);\n console.log(` ${chalk.gray(factor.description)}`);\n }\n console.log('');\n console.log(chalk.bold(' Recommendation:'));\n console.log(` ${assessment.recommendation}`);\n console.log('');\n } catch (error: any) {\n spinner.fail(`Failed: ${error.message}`);\n process.exit(1);\n }\n });\n\n// ── Crash Groups ────────────────────────────────────────────\n\naiCommand\n .command('crashes')\n .description('List AI-grouped crash reports for an app')\n .requiredOption('-o, --org <org-id>', 'Organization ID')\n .requiredOption('-a, --app <app-id>', 'App ID')\n .option('-s, --status <status>', 'Filter by status (OPEN, RESOLVED, IGNORED)', 'OPEN')\n .option('-l, --limit <limit>', 'Maximum number of results', '10')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n await requireAuth();\n const spinner = ora('Fetching crash groups...').start();\n\n try {\n const groups = await api.aiCrashGroups(options.org, options.app, {\n status: options.status,\n limit: parseInt(options.limit, 10),\n });\n spinner.stop();\n\n if (options.json) {\n console.log(JSON.stringify(groups, null, 2));\n return;\n }\n\n if (groups.length === 0) {\n console.log(chalk.green('\\n No crash groups found. Your app is running smoothly!\\n'));\n return;\n }\n\n console.log('');\n console.log(chalk.bold(` Crash Groups (${groups.length})`));\n console.log('');\n\n const severityColors: Record<string, (s: string) => string> = {\n CRITICAL: chalk.red,\n HIGH: chalk.hex('#f97316'),\n MEDIUM: chalk.yellow,\n LOW: chalk.blue,\n };\n\n for (const group of groups) {\n const colorFn = severityColors[group.severity] || chalk.white;\n console.log(` ${colorFn(`[${group.severity}]`)} ${group.title}`);\n console.log(` ${chalk.gray(`${group.occurrenceCount} occurrences \\u00b7 ${group.affectedDevices} devices \\u00b7 ${group.category}`)}`);\n if (group.aiAnalysis) {\n console.log(` ${chalk.cyan('AI:')} ${group.aiAnalysis.rootCause.slice(0, 100)}${group.aiAnalysis.rootCause.length > 100 ? '...' : ''}`);\n }\n console.log('');\n }\n } catch (error: any) {\n spinner.fail(`Failed: ${error.message}`);\n process.exit(1);\n }\n });\n\n// ── AI Insights ─────────────────────────────────────────────\n\naiCommand\n .command('insights')\n .description('View AI-generated insights for an app')\n .requiredOption('-o, --org <org-id>', 'Organization ID')\n .requiredOption('-a, --app <app-id>', 'App ID')\n .option('-s, --status <status>', 'Filter by status (ACTIVE, ACKNOWLEDGED, DISMISSED)', 'ACTIVE')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n await requireAuth();\n const spinner = ora('Fetching AI insights...').start();\n\n try {\n const insights = await api.aiInsights(options.org, options.app, {\n status: options.status,\n });\n spinner.stop();\n\n if (options.json) {\n console.log(JSON.stringify(insights, null, 2));\n return;\n }\n\n if (insights.length === 0) {\n console.log(chalk.green('\\n No active insights. All systems nominal!\\n'));\n return;\n }\n\n console.log('');\n console.log(chalk.bold(` AI Insights (${insights.length})`));\n console.log('');\n\n const priorityColors: Record<string, (s: string) => string> = {\n CRITICAL: chalk.red,\n HIGH: chalk.hex('#f97316'),\n MEDIUM: chalk.yellow,\n LOW: chalk.blue,\n INFO: chalk.gray,\n };\n\n for (const insight of insights) {\n const colorFn = priorityColors[insight.priority] || chalk.white;\n console.log(` ${colorFn(`[${insight.priority}]`)} ${insight.title}`);\n console.log(` ${chalk.gray(insight.summary)}`);\n if (insight.actionItems.length > 0) {\n for (const item of insight.actionItems) {\n console.log(` ${chalk.cyan('\\u2192')} ${item}`);\n }\n }\n console.log('');\n }\n } catch (error: any) {\n spinner.fail(`Failed: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport path from 'path';\nimport fs from 'fs-extra';\nimport { claudeChat } from '../lib/claude.js';\nimport { logger } from '../utils/logger.js';\nimport { requireConsent } from '../utils/consent.js';\n\ninterface DoctorDiagnostics {\n projectRoot: string;\n packageJson: Record<string, any> | null;\n reactNativeVersion: string | null;\n nativeDeps: string[];\n assets: { name: string; sizeKB: number }[];\n hermesEnabled: boolean;\n hasSigningKey: boolean;\n podfileLockHash: string | null;\n gradleDeps: string[];\n warnings: string[];\n}\n\n/**\n * Collect local project diagnostics without executing user code.\n * All file reads use static analysis only — no evals, no shell commands.\n */\nasync function collectDiagnostics(projectRoot: string): Promise<DoctorDiagnostics> {\n const diag: DoctorDiagnostics = {\n projectRoot,\n packageJson: null,\n reactNativeVersion: null,\n nativeDeps: [],\n assets: [],\n hermesEnabled: false,\n hasSigningKey: false,\n podfileLockHash: null,\n gradleDeps: [],\n warnings: [],\n };\n\n // 1. Read package.json\n const pkgPath = path.join(projectRoot, 'package.json');\n if (await fs.pathExists(pkgPath)) {\n try {\n diag.packageJson = await fs.readJson(pkgPath);\n const deps = { ...diag.packageJson?.dependencies, ...diag.packageJson?.devDependencies };\n diag.reactNativeVersion = deps?.['react-native'] || null;\n\n // Identify native dependencies (common patterns)\n const nativeModulePatterns = [\n 'react-native-',\n '@react-native/',\n '@react-native-community/',\n 'expo-',\n 'react-native-reanimated',\n 'react-native-gesture-handler',\n 'react-native-screens',\n 'react-native-svg',\n 'lottie-react-native',\n '@shopify/react-native-skia',\n ];\n\n for (const [dep] of Object.entries(deps || {})) {\n if (nativeModulePatterns.some(p => dep.startsWith(p) || dep === p)) {\n diag.nativeDeps.push(`${dep}@${deps[dep]}`);\n }\n }\n } catch {\n diag.warnings.push('Failed to parse package.json');\n }\n } else {\n diag.warnings.push('No package.json found — are you in a React Native project root?');\n }\n\n // 2. Check for large assets\n const assetDirs = ['assets', 'src/assets', 'app/assets', 'src/images'];\n for (const dir of assetDirs) {\n const fullDir = path.join(projectRoot, dir);\n if (await fs.pathExists(fullDir)) {\n try {\n const files = await fs.readdir(fullDir);\n for (const file of files.slice(0, 50)) {\n try {\n const stat = await fs.stat(path.join(fullDir, file));\n if (stat.isFile() && stat.size > 100 * 1024) {\n diag.assets.push({ name: `${dir}/${file}`, sizeKB: Math.round(stat.size / 1024) });\n }\n } catch {\n // skip unreadable files\n }\n }\n } catch {\n // skip unreadable dirs\n }\n }\n }\n\n // 3. Detect Hermes config\n const gradlePath = path.join(projectRoot, 'android/app/build.gradle');\n if (await fs.pathExists(gradlePath)) {\n try {\n const gradle = await fs.readFile(gradlePath, 'utf-8');\n diag.hermesEnabled = gradle.includes('hermesEnabled') && !gradle.includes('hermesEnabled: false');\n\n // Extract key Gradle dependencies\n const depMatches = gradle.match(/implementation\\s+['\"]([^'\"]+)['\"]/g);\n if (depMatches) {\n diag.gradleDeps = depMatches.slice(0, 20).map(m => m.replace(/implementation\\s+['\"]/, '').replace(/['\"]/, ''));\n }\n } catch {\n // ignore\n }\n }\n\n // New arch (react-native.config.js or newArchEnabled in gradle.properties)\n const gradlePropsPath = path.join(projectRoot, 'android/gradle.properties');\n if (await fs.pathExists(gradlePropsPath)) {\n try {\n const props = await fs.readFile(gradlePropsPath, 'utf-8');\n if (props.includes('newArchEnabled=true')) {\n diag.warnings.push('New Architecture is enabled — ensure your OTA bundle is compatible');\n }\n } catch {\n // ignore\n }\n }\n\n // 4. Check signing key existence (don't read the key content)\n const signingPaths = [\n path.join(projectRoot, 'swiftpatch-private.pem'),\n path.join(projectRoot, '.swiftpatch/private.pem'),\n path.join(projectRoot, 'keys/swiftpatch-private.pem'),\n ];\n for (const p of signingPaths) {\n if (await fs.pathExists(p)) {\n diag.hasSigningKey = true;\n break;\n }\n }\n\n // 5. Check Podfile.lock existence (indicates iOS native dep state)\n const podfileLock = path.join(projectRoot, 'ios/Podfile.lock');\n if (await fs.pathExists(podfileLock)) {\n try {\n const stat = await fs.stat(podfileLock);\n diag.podfileLockHash = `modified:${stat.mtimeMs}`;\n } catch {\n // ignore\n }\n }\n\n return diag;\n}\n\nexport const aiDoctorCommand = new Command('doctor')\n .description('AI-powered pre-publish diagnostics for your React Native project')\n .option('-d, --dir <path>', 'Project root directory', process.cwd())\n .option('-y, --yes', 'Skip consent prompt (for CI/CD)')\n .option('--json', 'Output raw diagnostics as JSON')\n .action(async (options) => {\n const projectRoot = path.resolve(options.dir);\n\n if (!await fs.pathExists(path.join(projectRoot, 'package.json'))) {\n logger.error('No package.json found. Run this from your React Native project root.');\n process.exit(1);\n }\n\n // Require explicit consent before scanning local files\n const consented = await requireConsent(\n ['project-files', 'project-structure'],\n { yes: options.yes }\n );\n if (!consented) {\n process.exit(0);\n }\n\n const spinner = ora('Scanning project...').start();\n\n let diag: DoctorDiagnostics;\n try {\n diag = await collectDiagnostics(projectRoot);\n spinner.succeed('Project scanned');\n } catch (error: any) {\n spinner.fail(`Scan failed: ${error.message}`);\n process.exit(1);\n }\n\n if (options.json) {\n console.log(JSON.stringify(diag, null, 2));\n return;\n }\n\n // Show local findings first\n console.log('');\n console.log(chalk.bold(' Project Diagnostics'));\n console.log('');\n\n if (diag.reactNativeVersion) {\n console.log(` React Native: ${chalk.cyan(diag.reactNativeVersion)}`);\n }\n console.log(` Native deps: ${chalk.cyan(String(diag.nativeDeps.length))}`);\n console.log(` Hermes: ${diag.hermesEnabled ? chalk.green('Enabled') : chalk.yellow('Disabled')}`);\n console.log(` Signing key: ${diag.hasSigningKey ? chalk.green('Found') : chalk.yellow('Not found')}`);\n\n if (diag.assets.length > 0) {\n console.log('');\n console.log(chalk.bold(' Large Assets (>100KB):'));\n for (const asset of diag.assets.slice(0, 10)) {\n const color = asset.sizeKB > 500 ? chalk.red : chalk.yellow;\n console.log(` ${color(`${asset.sizeKB}KB`)} ${asset.name}`);\n }\n if (diag.assets.length > 10) {\n console.log(chalk.gray(` ... and ${diag.assets.length - 10} more`));\n }\n }\n\n if (diag.warnings.length > 0) {\n console.log('');\n for (const w of diag.warnings) {\n logger.warning(w);\n }\n }\n\n // Now send to Claude for analysis\n const aiSpinner = ora('Analyzing with Claude AI...').start();\n\n try {\n const systemPrompt =\n 'You are SwiftPatch Doctor, an expert in React Native OTA (Over-The-Air) updates. ' +\n 'Analyze the project diagnostics and provide a concise, actionable report. ' +\n 'Focus on:\\n' +\n '1. Native dependency risks: identify deps that require a full app store release if changed\\n' +\n '2. Bundle size concerns: large assets, unnecessary imports\\n' +\n '3. Hermes compatibility: is the config optimal for OTA?\\n' +\n '4. Signing: is bundle signing configured?\\n' +\n '5. Overall OTA readiness score (1-10)\\n\\n' +\n 'Format your response with clear sections using markdown-style headers (##). ' +\n 'Be direct and specific. Do not explain what OTA is. The user is a developer.';\n\n const diagnosticsSummary = JSON.stringify({\n reactNativeVersion: diag.reactNativeVersion,\n nativeDeps: diag.nativeDeps,\n largeAssets: diag.assets,\n hermesEnabled: diag.hermesEnabled,\n hasSigningKey: diag.hasSigningKey,\n hasPodfileLock: !!diag.podfileLockHash,\n gradleDeps: diag.gradleDeps,\n localWarnings: diag.warnings,\n }, null, 2);\n\n const analysis = await claudeChat(\n [{ role: 'user', content: `Analyze this React Native project for OTA update readiness:\\n\\n${diagnosticsSummary}` }],\n { system: systemPrompt, temperature: 0.3 }\n );\n\n aiSpinner.succeed('AI analysis complete');\n console.log('');\n console.log(chalk.bold(' AI Analysis'));\n console.log('');\n\n // Indent each line for consistent formatting\n for (const line of analysis.split('\\n')) {\n console.log(` ${line}`);\n }\n console.log('');\n } catch (error: any) {\n aiSpinner.fail(`AI analysis failed: ${error.message}`);\n console.log('');\n console.log(chalk.gray(' Local diagnostics above are still valid.'));\n console.log('');\n process.exit(1);\n }\n });\n","import Anthropic from '@anthropic-ai/sdk';\nimport { auth } from './auth.js';\nimport { api } from './api.js';\nimport { logger } from '../utils/logger.js';\n\nconst CLAUDE_MODEL = 'claude-sonnet-4-5-20250929';\nconst MAX_TOKENS = 4096;\nconst TIMEOUT_MS = 120_000;\n\n/**\n * Resolves the Claude API key with a clear priority chain:\n * 1. SWIFTPATCH_CLAUDE_API_KEY env var (CI/CD override)\n * 2. User-configured key via `swiftpatch config set claudeApiKey <key>`\n * 3. SwiftPatch platform-provisioned key (fetched from backend)\n *\n * Returns null if no key is available.\n */\nasync function resolveApiKey(): Promise<string | null> {\n // 1. Environment variable (highest priority — CI/CD and local override)\n const envKey = process.env.SWIFTPATCH_CLAUDE_API_KEY;\n if (envKey && isValidClaudeKey(envKey)) {\n return envKey;\n }\n\n // 2. User-configured key stored in encrypted config\n const storedKey = auth.getClaudeApiKey();\n if (storedKey && isValidClaudeKey(storedKey)) {\n return storedKey;\n }\n\n // 3. Platform-provisioned key (requires SwiftPatch auth)\n if (auth.isLoggedIn()) {\n try {\n const { apiKey } = await api.getClaudeApiKey();\n if (apiKey && isValidClaudeKey(apiKey)) {\n return apiKey;\n }\n } catch {\n // Backend doesn't support provisioned keys yet — fall through\n logger.debug('Platform Claude key not available, skipping');\n }\n }\n\n return null;\n}\n\n/**\n * Validate Claude API key format without exposing the key.\n * Anthropic keys start with \"sk-ant-\" prefix.\n */\nfunction isValidClaudeKey(key: string): boolean {\n return typeof key === 'string' && key.startsWith('sk-ant-') && key.length > 20;\n}\n\n/**\n * Create a configured Anthropic client instance.\n * Throws a user-friendly error if no API key is available.\n */\nasync function createClient(): Promise<Anthropic> {\n const apiKey = await resolveApiKey();\n\n if (!apiKey) {\n throw new Error(\n 'No Claude API key configured.\\n\\n' +\n ' Set one with:\\n' +\n ' swiftpatch config set claudeApiKey <your-key>\\n\\n' +\n ' Or set the SWIFTPATCH_CLAUDE_API_KEY environment variable.\\n\\n' +\n ' Get a key at: https://console.anthropic.com/settings/keys'\n );\n }\n\n return new Anthropic({\n apiKey,\n timeout: TIMEOUT_MS,\n maxRetries: 2,\n });\n}\n\nexport interface ClaudeMessage {\n role: 'user' | 'assistant';\n content: string;\n}\n\nexport interface ClaudeOptions {\n system?: string;\n maxTokens?: number;\n temperature?: number;\n}\n\n/**\n * Send a message to Claude and get a complete response.\n * Use this for structured analysis (doctor, review).\n */\nexport async function claudeChat(\n messages: ClaudeMessage[],\n options: ClaudeOptions = {}\n): Promise<string> {\n const client = await createClient();\n\n const response = await client.messages.create({\n model: CLAUDE_MODEL,\n max_tokens: options.maxTokens || MAX_TOKENS,\n ...(options.system ? { system: options.system } : {}),\n ...(options.temperature !== undefined ? { temperature: options.temperature } : {}),\n messages,\n });\n\n const textBlock = response.content.find((block) => block.type === 'text');\n if (!textBlock || textBlock.type !== 'text') {\n throw new Error('Unexpected response format from Claude');\n }\n\n return textBlock.text;\n}\n\n/**\n * Stream a response from Claude to stdout in real-time.\n * Use this for conversational commands (ask, explain).\n */\nexport async function claudeStream(\n messages: ClaudeMessage[],\n options: ClaudeOptions = {}\n): Promise<string> {\n const client = await createClient();\n\n let fullText = '';\n\n const stream = client.messages.stream({\n model: CLAUDE_MODEL,\n max_tokens: options.maxTokens || MAX_TOKENS,\n ...(options.system ? { system: options.system } : {}),\n ...(options.temperature !== undefined ? { temperature: options.temperature } : {}),\n messages,\n });\n\n for await (const event of stream) {\n if (\n event.type === 'content_block_delta' &&\n event.delta.type === 'text_delta'\n ) {\n process.stdout.write(event.delta.text);\n fullText += event.delta.text;\n }\n }\n\n return fullText;\n}\n\n/**\n * Check if Claude AI features are available (key is configured).\n */\nexport async function isClaudeAvailable(): Promise<boolean> {\n const key = await resolveApiKey();\n return key !== null;\n}\n","import chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport { config } from '../lib/config.js';\nimport { logger } from './logger.js';\n\n/**\n * Data categories that require user consent before analysis.\n */\nexport type DataScope =\n | 'project-files' // package.json, build configs, asset dirs\n | 'git-history' // commit messages, diff stats, file names\n | 'git-diff' // actual code diff content (most sensitive)\n | 'project-structure'; // directory layout, file existence checks\n\nconst SCOPE_DESCRIPTIONS: Record<DataScope, string> = {\n 'project-files': 'Project config files (package.json, build.gradle, Podfile)',\n 'git-history': 'Git commit messages, file change names, and diff stats',\n 'git-diff': 'Code diff content from your changed JS/TS files',\n 'project-structure': 'Project directory structure and file existence checks',\n};\n\n/**\n * Prompt the user for consent before sending local project data to Claude AI.\n *\n * - Shows exactly what data scopes will be accessed and sent\n * - Supports --yes flag to skip the prompt (for CI/CD)\n * - Remembers consent per-scope if user opts in\n * - Returns false if user declines — the caller MUST abort\n */\nexport async function requireConsent(\n scopes: DataScope[],\n options: { yes?: boolean } = {}\n): Promise<boolean> {\n // --yes flag skips interactive prompt (CI/CD)\n if (options.yes) {\n return true;\n }\n\n // Check if user has already consented to all requested scopes\n const consentedScopes = config.get('aiConsentScopes');\n if (consentedScopes) {\n const allConsented = scopes.every(s => consentedScopes.includes(s));\n if (allConsented) {\n return true;\n }\n }\n\n // Show what we'll access\n console.log('');\n console.log(chalk.bold(' Data Access Notice'));\n console.log('');\n console.log(' This command will read the following local data and send');\n console.log(' a summary to Claude AI (Anthropic) for analysis:');\n console.log('');\n\n for (const scope of scopes) {\n console.log(` ${chalk.cyan('•')} ${SCOPE_DESCRIPTIONS[scope]}`);\n }\n\n console.log('');\n console.log(chalk.gray(' No source code is stored. Data is sent via encrypted HTTPS.'));\n console.log(chalk.gray(' See: https://docs.swiftpatch.io/privacy/ai'));\n console.log('');\n\n const { consent } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'consent',\n message: 'Allow SwiftPatch AI to analyze this data?',\n default: true,\n },\n ]);\n\n if (!consent) {\n logger.info('AI analysis cancelled. No data was sent.');\n return false;\n }\n\n // Ask if they want to remember this choice\n const { remember } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'remember',\n message: 'Remember this choice for future runs?',\n default: true,\n },\n ]);\n\n if (remember) {\n const existing = config.get('aiConsentScopes') || [];\n const merged = [...new Set([...existing, ...scopes])];\n config.set('aiConsentScopes', merged);\n logger.info(`Consent saved. Reset with: ${chalk.cyan('swiftpatch config delete aiConsentScopes')}`);\n }\n\n return true;\n}\n\n/**\n * Revoke all AI consent. Called via `swiftpatch config delete aiConsentScopes`.\n */\nexport function revokeConsent(): void {\n config.delete('aiConsentScopes');\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { execFile } from 'child_process';\nimport { promisify } from 'util';\nimport { claudeStream, claudeChat } from '../lib/claude.js';\nimport { logger } from '../utils/logger.js';\nimport { requireConsent } from '../utils/consent.js';\n\nconst execFileAsync = promisify(execFile);\n\n/** Maximum bytes of git log/diff to send to Claude (prevents token overflow) */\nconst MAX_CONTEXT_BYTES = 12_000;\n\n/**\n * Safely execute a git command. Returns stdout or null on failure.\n * Uses execFile (not exec) to prevent shell injection.\n */\nasync function gitCommand(args: string[], cwd: string): Promise<string | null> {\n try {\n const { stdout } = await execFileAsync('git', args, {\n cwd,\n maxBuffer: 512 * 1024,\n timeout: 15_000,\n });\n return stdout.trim();\n } catch {\n return null;\n }\n}\n\n/**\n * Get the most recent tag matching common release patterns.\n */\nasync function getLastReleaseTag(cwd: string): Promise<string | null> {\n // Try SwiftPatch-specific tags first, then generic version tags\n const patterns = ['swiftpatch-*', 'release-*', 'v*'];\n\n for (const pattern of patterns) {\n const tag = await gitCommand(\n ['describe', '--tags', '--match', pattern, '--abbrev=0', 'HEAD~1'],\n cwd\n );\n if (tag) return tag;\n }\n\n // Fallback: any most recent tag\n const anyTag = await gitCommand(['describe', '--tags', '--abbrev=0', 'HEAD~1'], cwd);\n return anyTag;\n}\n\nexport const aiExplainCommand = new Command('explain')\n .description('Generate a changelog from git history using AI')\n .option('-f, --from <ref>', 'Start ref (tag, commit, or branch). Defaults to last tag.')\n .option('-t, --to <ref>', 'End ref', 'HEAD')\n .option('--format <type>', 'Output format: markdown, plain, json', 'markdown')\n .option('--max-commits <n>', 'Maximum commits to analyze', '50')\n .option('-y, --yes', 'Skip consent prompt (for CI/CD)')\n .option('--json', 'Output structured JSON')\n .action(async (options) => {\n const cwd = process.cwd();\n\n // Verify git repo\n const isGit = await gitCommand(['rev-parse', '--is-inside-work-tree'], cwd);\n if (isGit !== 'true') {\n logger.error('Not a git repository. Run this from your project root.');\n process.exit(1);\n }\n\n // Require explicit consent before reading git history\n const consented = await requireConsent(\n ['git-history'],\n { yes: options.yes }\n );\n if (!consented) {\n process.exit(0);\n }\n\n const spinner = ora('Gathering git history...').start();\n\n // Resolve start ref\n let fromRef = options.from;\n if (!fromRef) {\n fromRef = await getLastReleaseTag(cwd);\n if (!fromRef) {\n // Fallback: last 20 commits\n fromRef = `HEAD~${Math.min(parseInt(options.maxCommits, 10), 50)}`;\n spinner.text = `No release tags found. Using last ${options.maxCommits} commits...`;\n }\n }\n\n const toRef = options.to;\n\n // Get commit log\n const maxCommits = Math.min(Math.max(parseInt(options.maxCommits, 10) || 50, 1), 100);\n const logOutput = await gitCommand(\n ['log', `${fromRef}..${toRef}`, `--max-count=${maxCommits}`, '--pretty=format:%h|%s|%an|%ad', '--date=short'],\n cwd\n );\n\n if (!logOutput) {\n spinner.fail('No commits found in the specified range.');\n console.log('');\n console.log(chalk.gray(` Range: ${fromRef}..${toRef}`));\n console.log('');\n process.exit(1);\n }\n\n // Get diff stat (file changes summary — NOT full diff for security)\n const diffStat = await gitCommand(\n ['diff', '--stat', `${fromRef}..${toRef}`],\n cwd\n );\n\n // Get changed file names only\n const changedFiles = await gitCommand(\n ['diff', '--name-only', `${fromRef}..${toRef}`],\n cwd\n );\n\n spinner.succeed(`Found ${logOutput.split('\\n').length} commits (${fromRef}..${toRef})`);\n\n // Truncate to stay within token limits\n const truncatedLog = logOutput.slice(0, MAX_CONTEXT_BYTES);\n const truncatedStat = (diffStat || '').slice(0, MAX_CONTEXT_BYTES / 2);\n const truncatedFiles = (changedFiles || '').slice(0, MAX_CONTEXT_BYTES / 2);\n\n const outputFormat = options.json ? 'json' : options.format;\n\n const systemPrompt =\n 'You are a senior developer writing release notes for a React Native app ' +\n 'that uses SwiftPatch for OTA updates. ' +\n 'Generate a clear, professional changelog from the provided git history.\\n\\n' +\n 'Rules:\\n' +\n '- Group changes by category: Features, Bug Fixes, Improvements, Breaking Changes\\n' +\n '- Only include Breaking Changes if there are actual breaking API or behavior changes\\n' +\n '- Omit empty categories\\n' +\n '- Write for end-users and fellow developers, not bots\\n' +\n '- Be concise: one line per change\\n' +\n '- Highlight any changes that affect native code (these CANNOT be delivered via OTA)\\n' +\n (outputFormat === 'json'\n ? '- Return valid JSON with structure: { \"summary\": \"...\", \"categories\": [{ \"name\": \"...\", \"changes\": [\"...\"] }], \"nativeChanges\": boolean, \"otaSafe\": boolean }'\n : outputFormat === 'markdown'\n ? '- Use markdown formatting with ## headers'\n : '- Use plain text formatting, no markdown');\n\n const userMessage =\n `Generate a changelog for these changes:\\n\\n` +\n `## Commits\\n${truncatedLog}\\n\\n` +\n `## Changed Files\\n${truncatedFiles}\\n\\n` +\n `## Diff Stats\\n${truncatedStat}`;\n\n if (outputFormat === 'json') {\n const aiSpinner = ora('Generating changelog with AI...').start();\n try {\n const result = await claudeChat(\n [{ role: 'user', content: userMessage }],\n { system: systemPrompt, temperature: 0.3 }\n );\n aiSpinner.succeed('Changelog generated');\n console.log('');\n console.log(result);\n console.log('');\n } catch (error: any) {\n aiSpinner.fail(`Failed: ${error.message}`);\n process.exit(1);\n }\n } else {\n console.log('');\n process.stdout.write(chalk.dim(''));\n try {\n await claudeStream(\n [{ role: 'user', content: userMessage }],\n { system: systemPrompt, temperature: 0.3 }\n );\n console.log('');\n console.log('');\n } catch (error: any) {\n console.log('');\n logger.error(`Failed: ${error.message}`);\n process.exit(1);\n }\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { execFile } from 'child_process';\nimport { promisify } from 'util';\nimport { claudeChat } from '../lib/claude.js';\nimport { logger } from '../utils/logger.js';\nimport { requireConsent } from '../utils/consent.js';\n\nconst execFileAsync = promisify(execFile);\n\n/** Maximum bytes of diff to send to Claude */\nconst MAX_DIFF_BYTES = 15_000;\n\n/** Files that indicate high-risk changes for OTA updates */\nconst HIGH_RISK_PATTERNS = [\n 'android/',\n 'ios/',\n 'Podfile',\n 'build.gradle',\n 'AndroidManifest.xml',\n 'Info.plist',\n 'settings.gradle',\n '.pbxproj',\n 'Podfile.lock',\n];\n\n/** Source patterns that are especially sensitive */\nconst SENSITIVE_PATTERNS = [\n 'auth',\n 'login',\n 'token',\n 'payment',\n 'checkout',\n 'security',\n 'crypto',\n 'encrypt',\n 'password',\n 'secret',\n 'api-key',\n 'apiKey',\n 'credential',\n];\n\n/**\n * Safely execute a git command using execFile (no shell injection).\n */\nasync function gitCommand(args: string[], cwd: string): Promise<string | null> {\n try {\n const { stdout } = await execFileAsync('git', args, {\n cwd,\n maxBuffer: 1024 * 1024,\n timeout: 15_000,\n });\n return stdout.trim();\n } catch {\n return null;\n }\n}\n\ninterface LocalAnalysis {\n nativeFileChanges: string[];\n sensitiveFileChanges: string[];\n totalFilesChanged: number;\n linesAdded: number;\n linesRemoved: number;\n hasNativeChanges: boolean;\n hasSensitiveChanges: boolean;\n changedFiles: string[];\n diffExcerpt: string;\n}\n\n/**\n * Perform local analysis of git changes without AI.\n */\nasync function analyzeChangesLocally(\n fromRef: string,\n toRef: string,\n cwd: string\n): Promise<LocalAnalysis> {\n const result: LocalAnalysis = {\n nativeFileChanges: [],\n sensitiveFileChanges: [],\n totalFilesChanged: 0,\n linesAdded: 0,\n linesRemoved: 0,\n hasNativeChanges: false,\n hasSensitiveChanges: false,\n changedFiles: [],\n diffExcerpt: '',\n };\n\n // Get changed files\n const filesOutput = await gitCommand(\n ['diff', '--name-only', `${fromRef}..${toRef}`],\n cwd\n );\n\n if (!filesOutput) return result;\n\n const files = filesOutput.split('\\n').filter(Boolean);\n result.changedFiles = files;\n result.totalFilesChanged = files.length;\n\n // Classify files\n for (const file of files) {\n const lower = file.toLowerCase();\n\n if (HIGH_RISK_PATTERNS.some(p => lower.includes(p.toLowerCase()))) {\n result.nativeFileChanges.push(file);\n result.hasNativeChanges = true;\n }\n\n if (SENSITIVE_PATTERNS.some(p => lower.includes(p))) {\n result.sensitiveFileChanges.push(file);\n result.hasSensitiveChanges = true;\n }\n }\n\n // Get diff stats\n const statsOutput = await gitCommand(\n ['diff', '--shortstat', `${fromRef}..${toRef}`],\n cwd\n );\n\n if (statsOutput) {\n const addMatch = statsOutput.match(/(\\d+) insertion/);\n const delMatch = statsOutput.match(/(\\d+) deletion/);\n result.linesAdded = addMatch ? parseInt(addMatch[1], 10) : 0;\n result.linesRemoved = delMatch ? parseInt(delMatch[1], 10) : 0;\n }\n\n // Get JS/TS diff only (exclude native files, binaries, lock files)\n const jsDiff = await gitCommand(\n [\n 'diff', `${fromRef}..${toRef}`,\n '--', '*.ts', '*.tsx', '*.js', '*.jsx',\n ':!node_modules', ':!*.lock', ':!dist/', ':!build/',\n ],\n cwd\n );\n\n if (jsDiff) {\n result.diffExcerpt = jsDiff.slice(0, MAX_DIFF_BYTES);\n }\n\n return result;\n}\n\nexport const aiReviewCommand = new Command('review')\n .description('AI-powered safety review of changes before OTA deployment')\n .option('-f, --from <ref>', 'Start ref (tag, commit, or branch). Defaults to last tag.')\n .option('-t, --to <ref>', 'End ref', 'HEAD')\n .option('-y, --yes', 'Skip consent prompt (for CI/CD)')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n const cwd = process.cwd();\n\n // Verify git repo\n const isGit = await gitCommand(['rev-parse', '--is-inside-work-tree'], cwd);\n if (isGit !== 'true') {\n logger.error('Not a git repository. Run this from your project root.');\n process.exit(1);\n }\n\n // Require explicit consent before reading code diffs\n const consented = await requireConsent(\n ['git-history', 'git-diff'],\n { yes: options.yes }\n );\n if (!consented) {\n process.exit(0);\n }\n\n const spinner = ora('Analyzing changes...').start();\n\n // Resolve from ref\n let fromRef = options.from;\n if (!fromRef) {\n // Try to find last tag\n fromRef = await gitCommand(['describe', '--tags', '--abbrev=0', 'HEAD~1'], cwd);\n if (!fromRef) {\n fromRef = 'HEAD~10';\n spinner.text = 'No tags found. Comparing against last 10 commits...';\n }\n }\n\n const toRef = options.to;\n\n let analysis: LocalAnalysis;\n try {\n analysis = await analyzeChangesLocally(fromRef, toRef, cwd);\n } catch (error: any) {\n spinner.fail(`Analysis failed: ${error.message}`);\n process.exit(1);\n }\n\n if (analysis.totalFilesChanged === 0) {\n spinner.succeed('No changes found');\n console.log('');\n console.log(chalk.gray(` Range: ${fromRef}..${toRef}`));\n console.log(chalk.green(' Nothing to review — working tree is clean.'));\n console.log('');\n return;\n }\n\n spinner.succeed(`Found ${analysis.totalFilesChanged} changed files (+${analysis.linesAdded} -${analysis.linesRemoved})`);\n\n // Show immediate local warnings\n if (analysis.hasNativeChanges) {\n console.log('');\n logger.warning(chalk.bold('Native file changes detected — these CANNOT be delivered via OTA:'));\n for (const f of analysis.nativeFileChanges) {\n console.log(` ${chalk.red('!')} ${f}`);\n }\n }\n\n if (analysis.hasSensitiveChanges) {\n console.log('');\n logger.warning(chalk.bold('Sensitive file changes detected — review carefully:'));\n for (const f of analysis.sensitiveFileChanges) {\n console.log(` ${chalk.yellow('!')} ${f}`);\n }\n }\n\n // AI analysis\n const aiSpinner = ora('Running AI safety review...').start();\n\n try {\n const systemPrompt =\n 'You are SwiftPatch Review, an expert in React Native OTA update safety. ' +\n 'Analyze the code diff and provide a safety assessment for shipping this as an OTA update.\\n\\n' +\n 'Your response MUST include:\\n' +\n '1. **OTA Safety Score** (1-10, where 10 is perfectly safe)\\n' +\n '2. **Verdict**: SAFE, CAUTION, or UNSAFE\\n' +\n '3. **Risk Summary**: 1-2 sentences about the overall risk\\n' +\n '4. **Issues Found**: List specific concerns (if any)\\n' +\n '5. **Recommendation**: Should this be shipped as OTA or requires app store release?\\n\\n' +\n 'Risk factors to check:\\n' +\n '- Native code changes (cannot be OTA updated)\\n' +\n '- Authentication/security logic changes\\n' +\n '- API endpoint changes (URL, headers, auth)\\n' +\n '- Error handling removal or weakening\\n' +\n '- Removal of safety checks or validation\\n' +\n '- Large structural refactors that may introduce regressions\\n' +\n '- Third-party SDK version changes\\n\\n' +\n 'Be concise and specific. Developers are your audience.';\n\n const contextData = JSON.stringify({\n range: `${fromRef}..${toRef}`,\n totalFilesChanged: analysis.totalFilesChanged,\n linesAdded: analysis.linesAdded,\n linesRemoved: analysis.linesRemoved,\n nativeFileChanges: analysis.nativeFileChanges,\n sensitiveFileChanges: analysis.sensitiveFileChanges,\n changedFiles: analysis.changedFiles.slice(0, 50),\n }, null, 2);\n\n const userMessage =\n `Review this OTA update for safety:\\n\\n` +\n `## Change Summary\\n${contextData}\\n\\n` +\n `## Code Diff (JS/TS only)\\n\\`\\`\\`diff\\n${analysis.diffExcerpt}\\n\\`\\`\\``;\n\n const result = await claudeChat(\n [{ role: 'user', content: userMessage }],\n { system: systemPrompt, temperature: 0.2 }\n );\n\n aiSpinner.succeed('Safety review complete');\n\n if (options.json) {\n console.log(JSON.stringify({\n range: `${fromRef}..${toRef}`,\n localAnalysis: {\n totalFilesChanged: analysis.totalFilesChanged,\n linesAdded: analysis.linesAdded,\n linesRemoved: analysis.linesRemoved,\n hasNativeChanges: analysis.hasNativeChanges,\n hasSensitiveChanges: analysis.hasSensitiveChanges,\n nativeFileChanges: analysis.nativeFileChanges,\n sensitiveFileChanges: analysis.sensitiveFileChanges,\n },\n aiReview: result,\n }, null, 2));\n return;\n }\n\n console.log('');\n console.log(chalk.bold(' AI Safety Review'));\n console.log('');\n for (const line of result.split('\\n')) {\n console.log(` ${line}`);\n }\n console.log('');\n } catch (error: any) {\n aiSpinner.fail(`AI review failed: ${error.message}`);\n console.log('');\n console.log(chalk.gray(' Local analysis above is still valid.'));\n console.log('');\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { config } from '../lib/config.js';\nimport { auth } from '../lib/auth.js';\nimport { logger } from '../utils/logger.js';\nimport type { CLIConfig } from '../types/config.js';\n\nconst VALID_KEYS: (keyof CLIConfig)[] = [\n 'apiUrl',\n 'defaultOrg',\n 'defaultApp',\n 'defaultPlatform',\n 'defaultChannel',\n 'aiConsentScopes',\n];\n\n/** Keys that are stored in the encrypted auth store instead of plain config */\nconst SECRET_KEYS = ['claudeApiKey'] as const;\ntype SecretKey = (typeof SECRET_KEYS)[number];\n\nconst ALL_KEYS = [...VALID_KEYS, ...SECRET_KEYS];\n\nfunction isSecretKey(key: string): key is SecretKey {\n return SECRET_KEYS.includes(key as SecretKey);\n}\n\nfunction maskSecret(value: string): string {\n if (value.length <= 8) return '****';\n return value.slice(0, 7) + '...' + '*'.repeat(8);\n}\n\nexport const configCommands = new Command('config')\n .description('CLI configuration');\n\nconfigCommands\n .command('set')\n .description('Set a config value')\n .argument('<key>', 'Config key')\n .argument('<value>', 'Config value')\n .action((key: string, value: string) => {\n if (!ALL_KEYS.includes(key as any)) {\n logger.error(`Invalid config key: ${key}`);\n console.log('');\n console.log('Valid keys: ' + ALL_KEYS.map(k => chalk.cyan(k)).join(', '));\n console.log('');\n process.exit(1);\n }\n\n if (isSecretKey(key)) {\n if (key === 'claudeApiKey') {\n if (!value.startsWith('sk-ant-') || value.length <= 20) {\n logger.error('Invalid Claude API key format. Keys start with \"sk-ant-\"');\n console.log('');\n console.log(' Get a key at: ' + chalk.cyan('https://console.anthropic.com/settings/keys'));\n console.log('');\n process.exit(1);\n }\n auth.setClaudeApiKey(value);\n logger.success(`Set ${chalk.cyan(key)} = ${chalk.gray(maskSecret(value))} (encrypted)`);\n }\n return;\n }\n\n config.set(key as keyof CLIConfig, value as any);\n logger.success(`Set ${chalk.cyan(key)} = ${chalk.gray(value)}`);\n });\n\nconfigCommands\n .command('get')\n .description('Get a config value')\n .argument('<key>', 'Config key')\n .action((key: string) => {\n if (isSecretKey(key)) {\n if (key === 'claudeApiKey') {\n const value = auth.getClaudeApiKey();\n if (!value) {\n logger.info(`${key} is not set`);\n } else {\n console.log(`${chalk.cyan(key)} = ${maskSecret(value)} (encrypted)`);\n }\n }\n return;\n }\n\n const value = config.get(key as keyof CLIConfig);\n if (value === undefined) {\n logger.info(`${key} is not set`);\n } else {\n console.log(`${chalk.cyan(key)} = ${value}`);\n }\n });\n\nconfigCommands\n .command('delete')\n .description('Delete a config value')\n .argument('<key>', 'Config key')\n .action((key: string) => {\n if (!ALL_KEYS.includes(key as any)) {\n logger.error(`Invalid config key: ${key}`);\n process.exit(1);\n }\n\n if (isSecretKey(key)) {\n if (key === 'claudeApiKey') {\n auth.deleteClaudeApiKey();\n logger.success(`Deleted ${chalk.cyan(key)}`);\n }\n return;\n }\n\n config.delete(key as keyof CLIConfig);\n logger.success(`Deleted ${chalk.cyan(key)}`);\n });\n\nconfigCommands\n .command('list')\n .description('List all config values')\n .action(() => {\n const all = config.getAll();\n const plainKeys = Object.keys(all);\n const hasClaudeKey = !!auth.getClaudeApiKey();\n\n if (plainKeys.length === 0 && !hasClaudeKey) {\n console.log('');\n console.log(chalk.gray(' No config values set.'));\n console.log('');\n console.log(' Set a value with: ' + chalk.cyan('swiftpatch config set <key> <value>'));\n console.log('');\n return;\n }\n\n console.log('');\n console.log(chalk.bold(' CLI Configuration'));\n console.log('');\n plainKeys.forEach(key => {\n console.log(` ${chalk.cyan(key)} = ${(all as Record<string, any>)[key]}`);\n });\n if (hasClaudeKey) {\n const key = auth.getClaudeApiKey()!;\n console.log(` ${chalk.cyan('claudeApiKey')} = ${maskSecret(key)} ${chalk.gray('(encrypted)')}`);\n }\n console.log('');\n console.log(chalk.gray(` Config path: ${config.path}`));\n console.log('');\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport path from 'path';\nimport fs from 'fs-extra';\nimport os from 'os';\nimport { auth } from '../lib/auth.js';\nimport { api } from '../lib/api.js';\nimport { uploader } from '../lib/uploader.js';\nimport { calculateZipHash } from '../lib/hash.js';\nimport { signBundleDirectory, readBundleSignature } from '../lib/signing.js';\nimport { createZip } from '../lib/archive.js';\nimport { keepArtifacts } from '../lib/artifacts.js';\nimport {\n runReactNativeBundleCommand,\n runHermesEmitBinaryCommand,\n isValidPlatform,\n fileDoesNotExistOrIsDirectory,\n} from '../lib/react-native-utils.js';\nimport { logger } from '../utils/logger.js';\nimport { requireAuth } from '../utils/auth-guard.js';\nimport { resolveOrgId } from '../utils/org-resolver.js';\n\ninterface PublishBundleOptions {\n app?: string;\n org?: string;\n platform: string;\n entryFile?: string;\n releaseNote?: string;\n privateKey?: string;\n dev?: boolean;\n sourcemap?: boolean;\n hermes?: boolean;\n hermescPath?: string;\n hermesLogs?: boolean;\n keepArtifacts?: boolean;\n ciToken?: string;\n}\n\nexport const publishBundleCommand = new Command('publish-bundle')\n .description('Bundle, compile Hermes, sign, and upload a JS bundle to SwiftPatch')\n .requiredOption('-p, --platform <platform>', 'Target platform (ios or android)')\n .option('-a, --app <app-id>', 'App ID or slug')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('-e, --entry-file <path>', 'Entry file for React Native bundle', 'index.js')\n .option('-n, --release-note <note>', 'Release notes', '')\n .option('-k, --private-key <path>', 'Path to RSA private key for bundle signing')\n .option('--dev', 'Create a development bundle', false)\n .option('--sourcemap', 'Generate sourcemaps', false)\n .option('--hermes', 'Compile to Hermes bytecode', false)\n .option('--hermesc-path <path>', 'Custom path to hermesc binary')\n .option('--hermes-logs', 'Output Hermes compilation logs to file', false)\n .option('--keep-artifacts', 'Save intermediate build artifacts for debugging', false)\n .option('--ci-token <token>', 'CI token for authentication (alternative to login)')\n .action(async (options: PublishBundleOptions) => {\n const platform = options.platform.toLowerCase();\n\n if (!isValidPlatform(platform)) {\n logger.error('Invalid platform. Must be \"ios\" or \"android\".');\n process.exit(1);\n }\n\n // Auth: either CI token or user login\n const ciToken = options.ciToken || process.env.SWIFTPATCH_CI_TOKEN;\n if (!ciToken) {\n await requireAuth();\n }\n\n const orgId = ciToken ? undefined : await resolveOrgId(options.org);\n\n console.log('');\n logger.info(chalk.bold('SwiftPatch Publish Bundle'));\n console.log('');\n\n // Resolve app\n let appSlug = options.app;\n let resolvedAppId = '';\n if (!appSlug && !ciToken) {\n const apps = await api.getApps(orgId!);\n if (apps.length === 0) {\n logger.error('No apps found. Create one with: swiftpatch apps create');\n process.exit(1);\n }\n\n // Auto-select if only one app\n if (apps.length === 1) {\n appSlug = apps[0].slug || apps[0].id;\n resolvedAppId = apps[0].id;\n logger.info(`App: ${chalk.cyan(apps[0].name)}`);\n } else {\n const inquirer = (await import('inquirer')).default;\n const { selectedApp } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selectedApp',\n message: 'Select app:',\n choices: apps.map(app => ({\n name: `${app.name} (${app.platform})`,\n value: app.slug || app.id,\n })),\n },\n ]);\n appSlug = selectedApp;\n }\n }\n\n // Build uploadPath: use app slug or ID\n const uploadPath = appSlug || resolvedAppId || '';\n\n const entryFile = options.entryFile || 'index.js';\n const bundleName = platform === 'ios' ? 'main.jsbundle' : 'index.android.bundle';\n\n // Create temp working directory\n const contentRootPath = path.join(os.tmpdir(), `swiftpatch-publish-${Date.now()}`);\n await fs.ensureDir(contentRootPath);\n\n try {\n // STEP 1: React Native Bundle\n const spinner = ora('Bundling JavaScript...').start();\n try {\n await runReactNativeBundleCommand(\n bundleName,\n entryFile,\n contentRootPath,\n platform,\n options.sourcemap || false,\n options.dev || false\n );\n spinner.succeed('JavaScript bundled');\n } catch (error: any) {\n spinner.fail(`Bundling failed: ${error.message}`);\n process.exit(1);\n }\n\n // Save normal artifacts\n if (options.keepArtifacts) {\n await keepArtifacts(contentRootPath, platform, 'normal');\n }\n\n // STEP 2: Hermes Compilation (optional)\n if (options.hermes) {\n const hermesSpinner = ora('Compiling to Hermes bytecode...').start();\n try {\n await runHermesEmitBinaryCommand(\n bundleName,\n contentRootPath,\n options.hermesLogs || false,\n options.hermescPath,\n options.sourcemap || false\n );\n hermesSpinner.succeed('Hermes bytecode compiled');\n } catch (error: any) {\n hermesSpinner.fail(`Hermes compilation failed: ${error.message}`);\n process.exit(1);\n }\n\n // Save hermes artifacts\n if (options.keepArtifacts) {\n await keepArtifacts(contentRootPath, platform, 'hermes');\n }\n }\n\n // STEP 3: Sign Bundle (optional)\n if (options.privateKey) {\n const signSpinner = ora('Signing bundle...').start();\n try {\n const bundlesDir = path.join(contentRootPath, 'bundles');\n await signBundleDirectory(bundlesDir, options.privateKey);\n signSpinner.succeed('Bundle signed with JWT RS256');\n } catch (error: any) {\n signSpinner.fail(`Signing failed: ${error.message}`);\n process.exit(1);\n }\n }\n\n // STEP 4: Create ZIP Archive\n const zipSpinner = ora('Creating ZIP archive...').start();\n const bundlesDir = path.join(contentRootPath, 'bundles');\n await createZip(bundlesDir, contentRootPath);\n const zipPath = path.join(contentRootPath, 'build.zip');\n\n if (!await fs.pathExists(zipPath)) {\n zipSpinner.fail('ZIP creation failed: build.zip not found');\n process.exit(1);\n }\n\n const zipSize = (await fs.stat(zipPath)).size;\n zipSpinner.succeed(`ZIP archive created: ${chalk.gray(formatBytes(zipSize))}`);\n\n // STEP 5: Calculate hash\n const hashSpinner = ora('Computing ZIP hash...').start();\n const hash = calculateZipHash(zipPath);\n if (!hash) {\n hashSpinner.fail('Failed to compute ZIP hash');\n process.exit(1);\n }\n hashSpinner.succeed(`ZIP hash: ${chalk.gray(hash.slice(0, 16))}...`);\n\n // STEP 6: Read bundle signature (if signed)\n let bundleSignature: string | undefined;\n if (options.privateKey) {\n const bundlesDir2 = path.join(contentRootPath, 'bundles');\n const sig = await readBundleSignature(bundlesDir2);\n if (sig) bundleSignature = sig;\n }\n\n // STEP 7: Get signed URL\n const urlSpinner = ora('Requesting upload URL...').start();\n try {\n const { url } = await api.generateSignedUrl(\n {\n hash,\n uploadPath,\n platform,\n releaseNote: options.releaseNote || '',\n signature: bundleSignature,\n },\n ciToken\n );\n\n urlSpinner.succeed('Upload URL received');\n\n // STEP 7: Upload ZIP\n const uploadSpinner = ora('Uploading bundle...').start();\n await uploader.uploadZip(url, zipPath, (percent) => {\n uploadSpinner.text = `Uploading bundle... ${percent}%`;\n });\n uploadSpinner.succeed('Bundle uploaded');\n\n // Done!\n console.log('');\n console.log(chalk.green(' Bundle published successfully!'));\n console.log('');\n console.log(` Hash: ${chalk.cyan(hash)}`);\n console.log(` Platform: ${chalk.cyan(platform)}`);\n console.log(` Size: ${chalk.gray(formatBytes(zipSize))}`);\n if (options.hermes) {\n console.log(` Hermes: ${chalk.green('Yes')}`);\n }\n if (options.privateKey) {\n console.log(` Signed: ${chalk.green('Yes')}`);\n }\n console.log('');\n console.log(\n chalk.gray(' Use this hash to create a release:')\n );\n console.log(\n ` ${chalk.cyan(`swiftpatch release-bundle --hash ${hash} --app-version <version>`)}`\n );\n console.log('');\n } catch (error: any) {\n urlSpinner.fail(`Upload failed: ${error.message}`);\n process.exit(1);\n }\n } finally {\n // Cleanup temp directory\n await fs.remove(contentRootPath).catch(() => {});\n }\n });\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return bytes + ' B';\n if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB';\n return (bytes / 1024 / 1024).toFixed(1) + ' MB';\n}\n","import archiver from 'archiver';\nimport fs from 'fs';\nimport path from 'path';\n\n/**\n * Create a ZIP archive from an input directory.\n * Contents are placed inside a `build/` subdirectory in the ZIP.\n */\nexport function createZip(inputPath: string, outputPath: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const zipPath = path.join(outputPath, 'build.zip');\n const output = fs.createWriteStream(zipPath);\n const archive = archiver('zip', { zlib: { level: 9 } });\n\n output.on('close', () => resolve());\n archive.on('error', (err: Error) => reject(err));\n\n archive.pipe(output);\n archive.directory(inputPath, 'build');\n archive.finalize();\n });\n}\n","import fs from 'fs-extra';\nimport path from 'path';\n\nexport type ArtifactVariant = 'normal' | 'hermes';\n\n/**\n * Save intermediate bundle artifacts for debugging.\n * Copies current build outputs to swiftpatch-artifacts/<platform>/<variant>/\n */\nexport async function keepArtifacts(\n contentRootPath: string,\n platform: string,\n variant: ArtifactVariant\n): Promise<void> {\n const artifactsDir = path.join(process.cwd(), 'swiftpatch-artifacts', platform, variant);\n await fs.ensureDir(artifactsDir);\n\n const bundlesDir = path.join(contentRootPath, 'bundles');\n const sourcemapsDir = path.join(contentRootPath, 'sourcemaps');\n\n // Copy bundles\n if (await fs.pathExists(bundlesDir)) {\n await copyDirRecursive(bundlesDir, path.join(artifactsDir, 'bundles'));\n }\n\n // Copy sourcemaps if present\n if (await fs.pathExists(sourcemapsDir)) {\n await copyDirRecursive(sourcemapsDir, path.join(artifactsDir, 'sourcemaps'));\n }\n}\n\nasync function copyDirRecursive(srcDir: string, destDir: string): Promise<void> {\n await fs.ensureDir(destDir);\n const entries = await fs.readdir(srcDir);\n\n for (const entry of entries) {\n const srcPath = path.join(srcDir, entry);\n const destPath = path.join(destDir, entry);\n const stat = await fs.stat(srcPath);\n\n if (stat.isDirectory()) {\n await copyDirRecursive(srcPath, destPath);\n } else {\n await fs.copyFile(srcPath, destPath);\n }\n }\n}\n","import * as path from 'path';\nimport * as fs from 'fs';\nimport * as childProcess from 'child_process';\nimport { coerce, compare } from 'semver';\nimport { logger } from '../utils/logger.js';\n\nfunction findUpwardReactNativePackageJson(startDir: string = process.cwd()): string | null {\n let current = startDir;\n while (current !== path.parse(current).root) {\n const candidate = path.join(current, 'node_modules', 'react-native', 'package.json');\n if (fs.existsSync(candidate)) return candidate;\n current = path.dirname(current);\n }\n return null;\n}\n\nexport function getReactNativeVersion(): string | null {\n const rnPackageJsonPath = findUpwardReactNativePackageJson();\n if (!rnPackageJsonPath) return null;\n const rnPackageJson = JSON.parse(fs.readFileSync(rnPackageJsonPath, 'utf-8'));\n return rnPackageJson.version;\n}\n\nfunction directoryExistsSync(dirname: string): boolean {\n try {\n return fs.statSync(dirname).isDirectory();\n } catch (err: any) {\n if (err.code !== 'ENOENT') throw err;\n }\n return false;\n}\n\nfunction getReactNativePackagePath(): string {\n const rnPackageJsonPath = findUpwardReactNativePackageJson();\n if (rnPackageJsonPath) return path.dirname(rnPackageJsonPath);\n\n const result = childProcess.spawnSync('node', [\n '--print',\n \"require.resolve('react-native/package.json')\",\n ]);\n const packagePath = path.dirname(result.stdout.toString().trim());\n if (result.status === 0 && directoryExistsSync(packagePath)) return packagePath;\n\n return path.join('node_modules', 'react-native');\n}\n\nfunction resolvePackageDirFromCwd(packageName: string): string | null {\n const result = childProcess.spawnSync('node', [\n '--print',\n `require.resolve('${packageName}/package.json')`,\n ]);\n if (result.status !== 0) return null;\n const resolved = result.stdout.toString().trim();\n if (!resolved) return null;\n const packageDir = path.dirname(resolved);\n return directoryExistsSync(packageDir) ? packageDir : null;\n}\n\nexport function isValidPlatform(platform: string): boolean {\n return platform?.toLowerCase() === 'android' || platform?.toLowerCase() === 'ios';\n}\n\nexport function fileDoesNotExistOrIsDirectory(filePath: string): boolean {\n try {\n return fs.statSync(filePath).isDirectory();\n } catch {\n return true;\n }\n}\n\nexport function fileExists(filePath: string): boolean {\n try {\n return fs.statSync(filePath).isFile();\n } catch {\n return false;\n }\n}\n\nfunction getCliPath(): string {\n return path.join(getReactNativePackagePath(), 'cli.js');\n}\n\nexport async function runReactNativeBundleCommand(\n bundleName: string,\n entryFile: string,\n outputFolder: string,\n platform: string,\n sourcemap: boolean,\n devMode: boolean\n): Promise<void> {\n // Ensure output subfolders exist\n fs.mkdirSync(path.join(outputFolder, 'bundles'), { recursive: true });\n if (sourcemap) {\n fs.mkdirSync(path.join(outputFolder, 'sourcemaps'), { recursive: true });\n }\n\n const reactNativeBundleArgs: any[] = [\n getCliPath(),\n 'bundle',\n '--dev', devMode,\n '--assets-dest', path.join(outputFolder, 'bundles'),\n '--bundle-output', path.join(outputFolder, 'bundles', bundleName),\n '--entry-file', entryFile,\n '--platform', platform,\n ...(sourcemap\n ? ['--sourcemap-output', path.join(outputFolder, 'sourcemaps', bundleName + '.map')]\n : []),\n ];\n\n logger.info('Running \"react-native bundle\" command');\n\n const reactNativeBundleProcess = childProcess.spawn('node', reactNativeBundleArgs);\n\n return new Promise<void>((resolve, reject) => {\n reactNativeBundleProcess.stdout.on('data', (data: Buffer) => {\n console.log(data.toString().trim());\n });\n\n reactNativeBundleProcess.stderr.on('data', (data: Buffer) => {\n logger.error(data.toString().trim());\n });\n\n reactNativeBundleProcess.on('close', (exitCode: number, signal: string) => {\n if (exitCode !== 0) {\n reject(\n new Error(`\"react-native bundle\" command failed (exitCode=${exitCode}, signal=${signal}).`)\n );\n }\n resolve();\n });\n });\n}\n\nexport async function runHermesEmitBinaryCommand(\n bundleName: string,\n outputFolder: string,\n hermesLogs: boolean = false,\n hermescPath?: string,\n sourcemap: boolean = false\n): Promise<void> {\n const hermesArgs: string[] = [\n ...(sourcemap ? ['--output-source-map'] : []),\n '--emit-binary',\n '--out', path.join(outputFolder, bundleName + '.hbc'),\n path.join(outputFolder, 'bundles', bundleName),\n ];\n\n logger.info('Converting JS bundle to Hermes bytecode');\n const hermesCommand = await getHermesCommand();\n logger.info(`Hermesc path: ${hermescPath || hermesCommand}`);\n\n const hermesProcess = childProcess.spawn(hermescPath || hermesCommand, hermesArgs);\n\n let logFile: fs.WriteStream | null = null;\n let isWarned = false;\n if (hermesLogs) {\n logFile = fs.createWriteStream('output.log', { flags: 'a' });\n }\n\n return new Promise<void>((resolve, reject) => {\n hermesProcess.stdout.on('data', (data: Buffer) => {\n logger.info(data.toString().trim());\n });\n\n hermesProcess.stderr.on('data', (data: Buffer) => {\n if (isWarned) {\n if (hermesLogs && logFile) logFile.write(data.toString().trim());\n return;\n }\n isWarned = true;\n logger.warning('Hermes command executed with warnings. Use --hermes-logs for full logs.');\n });\n\n hermesProcess.on('close', (exitCode: number, signal: string) => {\n if (hermesLogs && logFile) {\n logger.success('Done writing logs in output.log file.');\n logFile.end();\n }\n\n if (exitCode !== 0) {\n reject(new Error(`\"hermes\" command failed (exitCode=${exitCode}, signal=${signal}).`));\n return;\n }\n\n const source = path.join(outputFolder, bundleName + '.hbc');\n const destination = path.join(outputFolder, 'bundles', bundleName);\n fs.copyFile(source, destination, (err) => {\n if (err) {\n reject(new Error(`Copying Hermes output failed: ${err.message}`));\n return;\n }\n fs.unlink(source, (unlinkErr) => {\n if (unlinkErr) {\n reject(unlinkErr);\n return;\n }\n resolve();\n });\n });\n });\n });\n}\n\nfunction getHermesOSBin(): string {\n switch (process.platform) {\n case 'win32': return 'win64-bin';\n case 'darwin': return 'osx-bin';\n default: return 'linux64-bin';\n }\n}\n\nfunction getHermesOSExe(): string {\n const versionObj = coerce(getReactNativeVersion());\n if (!versionObj?.version) {\n throw new Error('Unable to determine React Native version');\n }\n const react63orAbove = compare(versionObj.version, '0.63.0') !== -1;\n const hermesExecutableName = react63orAbove ? 'hermesc' : 'hermes';\n return process.platform === 'win32' ? hermesExecutableName + '.exe' : hermesExecutableName;\n}\n\nasync function getHermesCommand(): Promise<string> {\n // 1. Check React Native bundled SDK\n const bundledHermesEngine = path.join(\n getReactNativePackagePath(), 'sdks', 'hermesc', getHermesOSBin(), getHermesOSExe()\n );\n if (fileExists(bundledHermesEngine)) return bundledHermesEngine;\n\n // 2. Check hermes-engine package\n const hermesEnginePackageDir = resolvePackageDirFromCwd('hermes-engine');\n if (hermesEnginePackageDir) {\n const hermesEngine = path.join(hermesEnginePackageDir, getHermesOSBin(), getHermesOSExe());\n if (fileExists(hermesEngine)) return hermesEngine;\n }\n const hermesEngine = path.join('node_modules', 'hermes-engine', getHermesOSBin(), getHermesOSExe());\n if (fileExists(hermesEngine)) return hermesEngine;\n\n // 3. Check hermes-compiler package\n const hermesCompilerPackageDir = resolvePackageDirFromCwd('hermes-compiler');\n if (hermesCompilerPackageDir) {\n const hermesCompiler = path.join(hermesCompilerPackageDir, 'hermesc', getHermesOSBin(), getHermesOSExe());\n if (fileExists(hermesCompiler)) return hermesCompiler;\n }\n const hermesCompiler = path.join('node_modules', 'hermes-compiler', 'hermesc', getHermesOSBin(), getHermesOSExe());\n if (fileExists(hermesCompiler)) return hermesCompiler;\n\n // 4. Check hermesvm package\n const hermesVmPackageDir = resolvePackageDirFromCwd('hermesvm');\n if (hermesVmPackageDir) {\n return path.join(hermesVmPackageDir, getHermesOSBin(), 'hermes');\n }\n\n return path.join('node_modules', 'hermesvm', getHermesOSBin(), 'hermes');\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { api } from '../lib/api.js';\nimport { logger } from '../utils/logger.js';\n\ninterface ReleaseBundleOptions {\n hash: string;\n appVersion: string;\n projectId?: string;\n releaseNote?: string;\n mandatory?: boolean;\n paused?: boolean;\n ciToken?: string;\n}\n\nexport const releaseBundleCommand = new Command('release-bundle')\n .description('Promote a published bundle to a release (requires CI token)')\n .requiredOption('--hash <hash>', 'Bundle hash from publish-bundle output')\n .requiredOption('--app-version <version>', 'Target binary app version (semver)')\n .option('--project-id <id>', 'Project/App ID')\n .option('-n, --release-note <note>', 'Release notes', '')\n .option('-m, --mandatory', 'Mark as mandatory update', false)\n .option('--paused', 'Create release in paused state', false)\n .option('--ci-token <token>', 'CI token for authentication')\n .action(async (options: ReleaseBundleOptions) => {\n const ciToken = options.ciToken || process.env.SWIFTPATCH_CI_TOKEN;\n if (!ciToken) {\n logger.error('CI token required. Provide --ci-token or set SWIFTPATCH_CI_TOKEN env var.');\n process.exit(1);\n }\n\n if (!options.projectId) {\n logger.error('--project-id is required for release-bundle.');\n process.exit(1);\n }\n\n console.log('');\n logger.info(chalk.bold('SwiftPatch Release Bundle'));\n console.log('');\n\n const spinner = ora('Promoting bundle to release...').start();\n\n try {\n const result = await api.promoteBundle(\n {\n projectId: options.projectId,\n hash: options.hash,\n appVersion: options.appVersion,\n releaseNote: options.releaseNote || '',\n isMandatory: options.mandatory || false,\n isPaused: options.paused || false,\n },\n ciToken\n );\n\n spinner.succeed('Bundle promoted to release!');\n\n console.log('');\n console.log(chalk.green(' Release created successfully!'));\n console.log('');\n console.log(` Hash: ${chalk.cyan(options.hash.slice(0, 16))}...`);\n console.log(` App Version: ${chalk.cyan(options.appVersion)}`);\n console.log(` Mandatory: ${options.mandatory ? chalk.yellow('Yes') : chalk.gray('No')}`);\n console.log(` Paused: ${options.paused ? chalk.yellow('Yes') : chalk.gray('No')}`);\n if (result?.id) {\n console.log(` Release ID: ${chalk.gray(result.id)}`);\n }\n console.log('');\n } catch (error: any) {\n spinner.fail(`Release failed: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { api } from '../lib/api.js';\nimport { logger } from '../utils/logger.js';\n\ninterface UpdateReleaseOptions {\n hash: string;\n projectId?: string;\n releaseNote?: string;\n mandatory?: boolean;\n paused?: boolean;\n rolledBack?: boolean;\n rollout?: string;\n ciToken?: string;\n}\n\nexport const updateReleaseCommand = new Command('update-release')\n .description('Update an existing release by bundle hash (requires CI token)')\n .requiredOption('--hash <hash>', 'Bundle hash of the release to update')\n .option('--project-id <id>', 'Project/App ID')\n .option('-n, --release-note <note>', 'Updated release notes')\n .option('-m, --mandatory', 'Mark as mandatory update')\n .option('--paused', 'Pause the release')\n .option('--rolled-back', 'Mark release as rolled back')\n .option('-r, --rollout <percent>', 'Rollout percentage (1-100)')\n .option('--ci-token <token>', 'CI token for authentication')\n .action(async (options: UpdateReleaseOptions) => {\n const ciToken = options.ciToken || process.env.SWIFTPATCH_CI_TOKEN;\n if (!ciToken) {\n logger.error('CI token required. Provide --ci-token or set SWIFTPATCH_CI_TOKEN env var.');\n process.exit(1);\n }\n\n if (!options.projectId) {\n logger.error('--project-id is required for update-release.');\n process.exit(1);\n }\n\n console.log('');\n logger.info(chalk.bold('SwiftPatch Update Release'));\n console.log('');\n\n const spinner = ora('Updating release...').start();\n\n try {\n const params: Record<string, any> = {\n projectId: options.projectId,\n hash: options.hash,\n };\n\n if (options.releaseNote !== undefined) params.releaseNote = options.releaseNote;\n if (options.mandatory !== undefined) params.isMandatory = options.mandatory;\n if (options.paused !== undefined) params.isPaused = options.paused;\n if (options.rolledBack !== undefined) params.isRolledBack = options.rolledBack;\n if (options.rollout !== undefined) params.rolloutPercent = parseInt(options.rollout, 10);\n\n const result = await api.updateReleaseCli(params as any, ciToken);\n\n spinner.succeed('Release updated!');\n\n console.log('');\n console.log(chalk.green(' Release updated successfully!'));\n console.log('');\n console.log(` Hash: ${chalk.cyan(options.hash.slice(0, 16))}...`);\n if (options.releaseNote) {\n console.log(` Note: ${chalk.gray(options.releaseNote.slice(0, 60))}`);\n }\n if (options.mandatory !== undefined) {\n console.log(` Mandatory: ${options.mandatory ? chalk.yellow('Yes') : chalk.gray('No')}`);\n }\n if (options.paused !== undefined) {\n console.log(` Paused: ${options.paused ? chalk.yellow('Yes') : chalk.gray('No')}`);\n }\n if (options.rolledBack !== undefined) {\n console.log(` Rolled Back: ${options.rolledBack ? chalk.yellow('Yes') : chalk.gray('No')}`);\n }\n if (options.rollout !== undefined) {\n console.log(` Rollout: ${chalk.cyan(options.rollout + '%')}`);\n }\n if (result?.id) {\n console.log(` Release ID: ${chalk.gray(result.id)}`);\n }\n console.log('');\n } catch (error: any) {\n spinner.fail(`Update failed: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport path from 'path';\nimport { generateKeyPair } from '../lib/signing.js';\nimport { logger } from '../utils/logger.js';\n\ninterface GenerateKeyPairOptions {\n output?: string;\n}\n\nexport const generateKeyPairCommand = new Command('generate-key-pair')\n .description('Generate RSA 2048-bit key pair for bundle signing')\n .option('-o, --output <dir>', 'Output directory for key files', '.')\n .action(async (options: GenerateKeyPairOptions) => {\n console.log('');\n logger.info(chalk.bold('SwiftPatch Generate Key Pair'));\n console.log('');\n\n const outputDir = path.resolve(options.output || '.');\n const spinner = ora('Generating RSA 2048-bit key pair...').start();\n\n try {\n const { publicKeyPath, privateKeyPath } = await generateKeyPair(outputDir);\n\n spinner.succeed('Key pair generated!');\n\n console.log('');\n console.log(chalk.green(' Key pair created successfully!'));\n console.log('');\n console.log(` Public key: ${chalk.cyan(publicKeyPath)}`);\n console.log(` Private key: ${chalk.cyan(privateKeyPath)}`);\n console.log('');\n console.log(chalk.gray(' Usage:'));\n console.log(chalk.gray(' 1. Upload the public key to your app settings in the SwiftPatch dashboard'));\n console.log(chalk.gray(' 2. Use --private-key flag when publishing bundles:'));\n console.log(` ${chalk.cyan(`swiftpatch publish-bundle --private-key ${privateKeyPath} -p ios`)}`);\n console.log('');\n console.log(chalk.yellow(' Important: Keep your private key secure and never commit it to version control.'));\n console.log(chalk.yellow(' Add it to .gitignore:'));\n console.log(` ${chalk.gray('echo \"swiftpatch-private.pem\" >> .gitignore')}`);\n console.log('');\n } catch (error: any) {\n spinner.fail(`Key generation failed: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport fs from 'fs-extra';\nimport path from 'path';\nimport { api } from '../lib/api.js';\nimport { requireAuth } from '../utils/auth-guard.js';\nimport { resolveOrgId } from '../utils/org-resolver.js';\nimport { runReactNativeBundleCommand, runHermesEmitBinaryCommand } from '../lib/react-native-utils.js';\nimport { createZip } from '../lib/archive.js';\nimport { calculateZipHash } from '../lib/hash.js';\nimport { uploader } from '../lib/uploader.js';\nimport { logger } from '../utils/logger.js';\n\nexport const deployCommand = new Command('deploy')\n .description('Bundle, publish, and release in one step')\n .option('-p, --platform <platform>', 'Target platform (ios or android)')\n .option('-a, --app <app-id>', 'App ID or slug')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('--app-version <version>', 'Target app version (semver)')\n .option('-n, --release-note <note>', 'Release notes')\n .option('-m, --mandatory', 'Mark as mandatory update')\n .option('--paused', 'Create release in paused state')\n .option('--hermes', 'Compile to Hermes bytecode')\n .option('--ci-token <token>', 'CI token for authentication')\n .option('-e, --entry-file <path>', 'Entry file (default: index.js)')\n .option('--dev', 'Dev bundle')\n .option('--sourcemap', 'Generate sourcemaps')\n .option('-k, --private-key <path>', 'Private key path for signing')\n .option('-y, --yes', 'Skip confirmations')\n .action(async (options) => {\n const ciToken = options.ciToken || process.env.SWIFTPATCH_CI_TOKEN;\n\n if (!ciToken) {\n await requireAuth();\n }\n\n const orgId = ciToken ? undefined : await resolveOrgId(options.org);\n\n // Resolve platform\n let platform = options.platform;\n if (!platform) {\n const hasIos = await fs.pathExists('./ios');\n const hasAndroid = await fs.pathExists('./android');\n\n if (hasIos && !hasAndroid) {\n platform = 'ios';\n } else if (hasAndroid && !hasIos) {\n platform = 'android';\n } else {\n const answers = await inquirer.prompt([\n {\n type: 'list',\n name: 'platform',\n message: 'Select platform:',\n choices: ['ios', 'android'],\n },\n ]);\n platform = answers.platform;\n }\n }\n\n // Resolve app version\n let appVersion = options.appVersion;\n if (!appVersion) {\n try {\n const pkg = await fs.readJson('./package.json');\n appVersion = pkg.version;\n } catch {\n // ignore\n }\n\n if (!appVersion) {\n const answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'version',\n message: 'App version (semver):',\n validate: (v: string) => /^\\d+\\.\\d+\\.\\d+/.test(v) || 'Must be valid semver (e.g., 1.0.0)',\n },\n ]);\n appVersion = answers.version;\n } else if (!options.yes) {\n console.log(chalk.gray(` Detected version: ${appVersion}`));\n }\n }\n\n const releaseNote = options.releaseNote || '';\n\n // Resolve app ID for upload path\n let uploadPath = options.app || '';\n if (!uploadPath && orgId) {\n const apps = await api.getApps(orgId);\n if (apps.length === 1) {\n uploadPath = apps[0].slug || apps[0].id;\n if (!options.yes) console.log(chalk.gray(` Using app: ${apps[0].name}`));\n } else if (apps.length > 1) {\n const { selectedApp } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selectedApp',\n message: 'Select app:',\n choices: apps.map(a => ({ name: `${a.name} (${a.platform})`, value: a.slug || a.id })),\n },\n ]);\n uploadPath = selectedApp;\n }\n }\n\n console.log('');\n console.log(chalk.bold(' Deploy'));\n console.log(chalk.gray(` Platform: ${platform} · Version: ${appVersion}`));\n console.log('');\n\n // Step 1: Bundle\n const bundleSpinner = ora('Bundling JavaScript...').start();\n try {\n const entryFile = options.entryFile || 'index.js';\n const outputDir = path.join('.swiftpatch-tmp', platform);\n await fs.ensureDir(outputDir);\n\n const bundleName = platform === 'ios' ? 'main.jsbundle' : 'index.android.bundle';\n await runReactNativeBundleCommand(\n bundleName,\n entryFile,\n outputDir,\n platform,\n options.sourcemap || false,\n options.dev || false,\n );\n\n // Hermes compilation\n if (options.hermes) {\n bundleSpinner.text = 'Compiling to Hermes bytecode...';\n // Hermes compilation is handled inside bundleReactNative when hermes flag is set\n }\n\n bundleSpinner.succeed('Bundle created');\n } catch (error: any) {\n bundleSpinner.fail(`Bundle failed: ${error.message}`);\n process.exit(1);\n }\n\n // Step 2: Archive + Hash\n const archiveSpinner = ora('Creating archive...').start();\n let zipPath: string;\n let bundleHash: string | null;\n try {\n const outputDir = path.join('.swiftpatch-tmp', platform);\n const zipOutputDir = path.join('.swiftpatch-tmp', 'zip');\n await fs.ensureDir(zipOutputDir);\n await createZip(outputDir, zipOutputDir);\n zipPath = path.join(zipOutputDir, 'build.zip');\n bundleHash = calculateZipHash(zipPath);\n if (!bundleHash) throw new Error('Failed to compute bundle hash');\n archiveSpinner.succeed(`Archive created (hash: ${bundleHash.slice(0, 12)}...)`);\n } catch (error: any) {\n archiveSpinner.fail(`Archive failed: ${error.message}`);\n process.exit(1);\n }\n\n // Step 3: Upload\n const uploadSpinner = ora('Uploading bundle...').start();\n try {\n const { url } = await api.generateSignedUrl(\n { hash: bundleHash, uploadPath, platform, releaseNote },\n ciToken\n );\n\n await uploader.uploadZip(url, zipPath!, (progress: number) => {\n uploadSpinner.text = `Uploading bundle... ${progress}%`;\n });\n\n uploadSpinner.succeed('Bundle uploaded');\n } catch (error: any) {\n uploadSpinner.fail(`Upload failed: ${error.message}`);\n process.exit(1);\n }\n\n // Step 4: Promote to release\n if (!ciToken) {\n console.log('');\n logger.warning('Deploy requires a CI token to create the release.');\n console.log(chalk.gray(' Bundle was uploaded. Promote it manually:'));\n console.log(chalk.cyan(` $ swiftpatch release-bundle --hash ${bundleHash} --app-version ${appVersion} --ci-token <token>`));\n console.log('');\n } else {\n const releaseSpinner = ora('Creating release...').start();\n try {\n await api.promoteBundle(\n {\n projectId: uploadPath,\n hash: bundleHash,\n appVersion,\n releaseNote,\n isMandatory: options.mandatory || false,\n isPaused: options.paused || false,\n },\n ciToken\n );\n\n releaseSpinner.succeed('Release created!');\n\n console.log('');\n console.log(chalk.bold(' Deploy Complete'));\n console.log(` Hash: ${chalk.gray(bundleHash)}`);\n console.log(` Version: ${chalk.cyan(appVersion)}`);\n console.log(` Platform: ${platform}`);\n console.log(` Mandatory: ${options.mandatory ? chalk.yellow('Yes') : 'No'}`);\n console.log(` Status: ${options.paused ? chalk.yellow('Paused') : chalk.green('Released')}`);\n console.log('');\n } catch (error: any) {\n releaseSpinner.fail(`Release failed: ${error.message}`);\n process.exit(1);\n }\n }\n\n // Cleanup\n await fs.remove('.swiftpatch-tmp').catch(() => {});\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport { api } from '../lib/api.js';\nimport { requireAuth } from '../utils/auth-guard.js';\nimport { resolveOrgId } from '../utils/org-resolver.js';\n\nexport const statusCommand = new Command('status')\n .description('Show app status at a glance')\n .argument('[app-id]', 'App ID')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('--json', 'Output as JSON')\n .action(async (appId, options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n\n if (!appId) {\n const apps = await api.getApps(orgId);\n if (apps.length === 0) {\n console.log('');\n console.log(chalk.gray(' No apps found. Create one with: swiftpatch apps create'));\n console.log('');\n return;\n }\n const { selectedApp } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selectedApp',\n message: 'Select app:',\n choices: apps.map(app => ({ name: `${app.name} (${app.platform})`, value: app.id })),\n },\n ]);\n appId = selectedApp;\n }\n\n const spinner = ora('Fetching status...').start();\n\n try {\n const [app, releasesResult, channels, analytics] = await Promise.all([\n api.getApp(orgId, appId),\n api.getReleases(orgId, appId, { page: 1, limit: 5 }),\n api.getChannels(orgId, appId),\n api.getAnalytics(orgId, appId, { days: 7 }).catch(() => null),\n ]);\n\n spinner.stop();\n\n if (options.json) {\n console.log(JSON.stringify({ app, releases: releasesResult.releases, channels, analytics }, null, 2));\n return;\n }\n\n console.log('');\n console.log(chalk.bold(` ${app.name}`));\n console.log(chalk.gray(` ${app.slug} · ${app.platform} · ${app.signingEnabled ? 'Signing enabled' : 'No signing'}`));\n console.log('');\n\n // Stats\n if (app.stats) {\n console.log(chalk.bold(' Overview'));\n console.log(` Releases: ${chalk.cyan(String(app.stats.totalReleases))}`);\n console.log(` Total Installs: ${chalk.cyan(String(app.stats.totalInstalls))}`);\n console.log(` Active Devices: ${chalk.green(String(app.stats.activeDevices))}`);\n console.log('');\n }\n\n // Analytics (7-day)\n if (analytics) {\n console.log(chalk.bold(' Last 7 Days'));\n console.log(` Updates: ${chalk.cyan(String(analytics.totalUpdates))}`);\n console.log(` Success Rate: ${analytics.successRate >= 95 ? chalk.green(analytics.successRate + '%') : chalk.yellow(analytics.successRate + '%')}`);\n if (analytics.failedUpdates > 0) {\n console.log(` Failed: ${chalk.red(String(analytics.failedUpdates))}`);\n }\n console.log('');\n }\n\n // Recent releases\n const releases = releasesResult.releases;\n if (releases.length > 0) {\n console.log(chalk.bold(' Recent Releases'));\n for (const r of releases) {\n const statusColor = r.status === 'RELEASED' ? chalk.green :\n r.status === 'DISABLED' ? chalk.red :\n r.status === 'READY' ? chalk.blue : chalk.gray;\n console.log(\n ` ${statusColor('●')} v${r.version} (build ${r.buildNumber}) · ${r.platform} · ${statusColor(r.status)} · ${r.rolloutPercent}% rollout`\n );\n }\n console.log('');\n }\n\n // Channels\n if (channels.length > 0) {\n console.log(chalk.bold(' Channels'));\n console.log(` ${channels.map(c => chalk.cyan(c.name)).join(', ')}`);\n console.log('');\n }\n\n console.log(chalk.gray(` Deployment Key: ${app.deploymentKey}`));\n console.log('');\n } catch (error: any) {\n spinner.fail(`Failed to fetch status: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport fs from 'fs-extra';\nimport path from 'path';\nimport { api } from '../lib/api.js';\nimport { auth } from '../lib/auth.js';\nimport { config } from '../lib/config.js';\nimport { requireAuth } from '../utils/auth-guard.js';\nimport { resolveOrgId } from '../utils/org-resolver.js';\nimport { logger } from '../utils/logger.js';\n\nexport const initCommand = new Command('init')\n .description('Initialize SwiftPatch in your React Native project')\n .option('-y, --yes', 'Accept defaults')\n .action(async (options) => {\n console.log('');\n console.log(chalk.bold(' SwiftPatch Setup'));\n console.log('');\n\n // Check if this is a React Native project\n const hasPackageJson = await fs.pathExists('./package.json');\n if (!hasPackageJson) {\n logger.error('No package.json found. Run this command in your React Native project root.');\n process.exit(1);\n }\n\n const pkg = await fs.readJson('./package.json');\n const hasRN = pkg.dependencies?.['react-native'] || pkg.devDependencies?.['react-native'];\n if (!hasRN) {\n logger.warning('react-native not found in dependencies. Is this a React Native project?');\n if (!options.yes) {\n const { proceed } = await inquirer.prompt([\n { type: 'confirm', name: 'proceed', message: 'Continue anyway?', default: false },\n ]);\n if (!proceed) return;\n }\n } else {\n logger.success(`React Native project detected (${hasRN})`);\n }\n\n // Check SDK\n const hasSDK = pkg.dependencies?.['@swiftpatch/react-native'] || pkg.devDependencies?.['@swiftpatch/react-native'];\n if (!hasSDK) {\n logger.warning('@swiftpatch/react-native SDK not installed');\n console.log(chalk.gray(' Install with: npm install @swiftpatch/react-native'));\n console.log('');\n } else {\n logger.success(`SwiftPatch SDK installed (${hasSDK})`);\n }\n\n // Check auth\n if (!auth.isLoggedIn()) {\n logger.warning('Not logged in');\n console.log(chalk.gray(' Run: swiftpatch login'));\n console.log('');\n process.exit(1);\n }\n logger.success('Authenticated');\n\n // Resolve organization\n const orgId = await resolveOrgId();\n\n // Detect platforms\n const hasIos = await fs.pathExists('./ios');\n const hasAndroid = await fs.pathExists('./android');\n const platforms: string[] = [];\n if (hasIos) platforms.push('ios');\n if (hasAndroid) platforms.push('android');\n if (platforms.length > 0) {\n logger.success(`Platforms detected: ${platforms.join(', ')}`);\n }\n\n // Select or create app\n const spinner = ora('Fetching apps...').start();\n const apps = await api.getApps(orgId);\n spinner.stop();\n\n let selectedApp: any;\n\n if (apps.length > 0 && !options.yes) {\n const { action } = await inquirer.prompt([\n {\n type: 'list',\n name: 'action',\n message: 'Link to an existing app or create a new one?',\n choices: [\n { name: 'Link existing app', value: 'link' },\n { name: 'Create new app', value: 'create' },\n ],\n },\n ]);\n\n if (action === 'link') {\n const { appChoice } = await inquirer.prompt([\n {\n type: 'list',\n name: 'appChoice',\n message: 'Select app:',\n choices: apps.map(a => ({ name: `${a.name} (${a.platform})`, value: a })),\n },\n ]);\n selectedApp = appChoice;\n } else {\n selectedApp = await createApp(orgId, pkg, platforms);\n }\n } else if (apps.length === 0) {\n console.log(chalk.gray(' No apps found. Creating one...'));\n selectedApp = await createApp(orgId, pkg, platforms);\n } else {\n selectedApp = apps[0];\n }\n\n // Determine platform setting\n let defaultPlatform: 'ios' | 'android' | undefined;\n if (hasIos && !hasAndroid) defaultPlatform = 'ios';\n if (hasAndroid && !hasIos) defaultPlatform = 'android';\n\n // Write .swiftpatchrc\n const rcConfig = {\n appId: selectedApp.id,\n app: selectedApp.slug,\n platform: defaultPlatform || (selectedApp.platform === 'BOTH' ? undefined : selectedApp.platform.toLowerCase()),\n deploymentKey: selectedApp.deploymentKey,\n };\n\n const rcPath = path.resolve('.swiftpatchrc');\n await fs.writeJson(rcPath, rcConfig, { spaces: 2 });\n logger.success('Created .swiftpatchrc');\n\n // Save defaults to CLI config\n config.set('defaultOrg', orgId);\n config.set('defaultApp', selectedApp.id);\n if (defaultPlatform) config.set('defaultPlatform', defaultPlatform);\n logger.success('Saved defaults to CLI config');\n\n // Summary\n console.log('');\n console.log(chalk.bold(' Setup Complete'));\n console.log('');\n console.log(` App: ${chalk.cyan(selectedApp.name)}`);\n console.log(` Platform: ${selectedApp.platform}`);\n console.log(` Deployment Key: ${chalk.gray(selectedApp.deploymentKey)}`);\n console.log(` Config: ${chalk.gray(rcPath)}`);\n console.log('');\n console.log(chalk.bold(' Next Steps'));\n console.log(chalk.gray(' 1. Add the deployment key to your app (Info.plist / strings.xml)'));\n console.log(chalk.gray(' 2. Wrap your app with <SwiftPatchProvider />'));\n console.log(chalk.gray(' 3. Run: swiftpatch deploy -p ios --ci-token <token>'));\n console.log('');\n });\n\nasync function createApp(orgId: string, pkg: any, platforms: string[]): Promise<any> {\n const { name } = await inquirer.prompt([\n {\n type: 'input',\n name: 'name',\n message: 'App name:',\n default: pkg.name || path.basename(process.cwd()),\n },\n ]);\n\n let platform: 'IOS' | 'ANDROID' | 'BOTH';\n if (platforms.length === 2) {\n platform = 'BOTH';\n } else if (platforms.length === 1) {\n platform = platforms[0].toUpperCase() as 'IOS' | 'ANDROID';\n } else {\n const { p } = await inquirer.prompt([\n {\n type: 'list',\n name: 'p',\n message: 'Platform:',\n choices: [\n { name: 'iOS', value: 'IOS' },\n { name: 'Android', value: 'ANDROID' },\n { name: 'Both', value: 'BOTH' },\n ],\n },\n ]);\n platform = p;\n }\n\n const createSpinner = ora('Creating app...').start();\n const app = await api.createApp(orgId, { name, platform });\n createSpinner.succeed(`App created: ${app.name}`);\n return app;\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport fs from 'fs-extra';\nimport { api } from '../lib/api.js';\nimport { auth } from '../lib/auth.js';\nimport { config } from '../lib/config.js';\nimport { logger } from '../utils/logger.js';\n\nexport const doctorCommand = new Command('doctor')\n .description('Diagnose your SwiftPatch setup')\n .action(async () => {\n console.log('');\n console.log(chalk.bold(' SwiftPatch Doctor'));\n console.log('');\n\n let issues = 0;\n\n // 1. Check Node.js version\n const nodeVersion = process.version;\n const major = parseInt(nodeVersion.slice(1).split('.')[0], 10);\n if (major >= 18) {\n logger.success(`Node.js ${nodeVersion}`);\n } else {\n logger.error(`Node.js ${nodeVersion} — requires >= 18.0.0`);\n issues++;\n }\n\n // 2. Check if in a React Native project\n const hasPackageJson = await fs.pathExists('./package.json');\n if (hasPackageJson) {\n const pkg = await fs.readJson('./package.json');\n const rnVersion = pkg.dependencies?.['react-native'] || pkg.devDependencies?.['react-native'];\n if (rnVersion) {\n logger.success(`React Native ${rnVersion}`);\n } else {\n logger.warning('react-native not found in dependencies');\n issues++;\n }\n\n // Check SDK\n const sdkVersion = pkg.dependencies?.['@swiftpatch/react-native'] || pkg.devDependencies?.['@swiftpatch/react-native'];\n if (sdkVersion) {\n logger.success(`@swiftpatch/react-native ${sdkVersion}`);\n } else {\n logger.error('@swiftpatch/react-native SDK not installed');\n console.log(chalk.gray(' Fix: npm install @swiftpatch/react-native'));\n issues++;\n }\n } else {\n logger.warning('No package.json found (not in a project directory?)');\n }\n\n // 3. Check platforms\n const hasIos = await fs.pathExists('./ios');\n const hasAndroid = await fs.pathExists('./android');\n if (hasIos || hasAndroid) {\n const platforms = [hasIos && 'iOS', hasAndroid && 'Android'].filter(Boolean).join(', ');\n logger.success(`Platforms: ${platforms}`);\n } else if (hasPackageJson) {\n logger.warning('No ios/ or android/ directories found');\n issues++;\n }\n\n // 4. Check authentication\n if (auth.isLoggedIn()) {\n logger.success('Authenticated');\n\n // Try API connectivity\n try {\n const user = await api.getCurrentUser();\n logger.success(`Connected as ${user.name} (${user.email})`);\n } catch (error: any) {\n logger.error(`API connection failed: ${error.message}`);\n issues++;\n }\n } else {\n logger.error('Not authenticated');\n console.log(chalk.gray(' Fix: swiftpatch login'));\n issues++;\n }\n\n // 5. Check API URL\n const customApiUrl = config.get('apiUrl');\n if (customApiUrl) {\n logger.info(`Custom API URL: ${customApiUrl}`);\n if (customApiUrl.startsWith('http://') && !customApiUrl.includes('localhost')) {\n logger.warning('API URL uses HTTP — consider HTTPS for production');\n issues++;\n }\n } else {\n logger.success('API URL: default (production)');\n }\n\n // 6. Check CLI config\n const defaultOrg = config.get('defaultOrg');\n const defaultApp = config.get('defaultApp');\n if (defaultOrg) {\n logger.success(`Default org: ${defaultOrg}`);\n } else {\n logger.info('No default org set (will prompt each time)');\n }\n if (defaultApp) {\n logger.success(`Default app: ${defaultApp}`);\n } else {\n logger.info('No default app set');\n }\n\n // 7. Check .swiftpatchrc\n const hasRc = await fs.pathExists('./.swiftpatchrc');\n if (hasRc) {\n try {\n const rc = await fs.readJson('./.swiftpatchrc');\n logger.success(`.swiftpatchrc found (app: ${rc.app || rc.appId || 'unknown'})`);\n } catch {\n logger.warning('.swiftpatchrc exists but is invalid JSON');\n issues++;\n }\n } else {\n logger.info('No .swiftpatchrc (run: swiftpatch init)');\n }\n\n // 8. Check for Hermes\n if (hasPackageJson) {\n try {\n const pkg = await fs.readJson('./package.json');\n const rnVersion = pkg.dependencies?.['react-native'];\n if (rnVersion) {\n // RN 0.70+ enables Hermes by default\n const cleanVersion = rnVersion.replace(/[\\^~>=<]/g, '');\n const [, minor] = cleanVersion.split('.');\n if (parseInt(minor) >= 70) {\n logger.success('Hermes likely enabled (RN 0.70+)');\n } else {\n logger.info('Hermes may need to be manually enabled');\n }\n }\n } catch {\n // ignore\n }\n }\n\n // Summary\n console.log('');\n if (issues === 0) {\n console.log(chalk.green.bold(' All checks passed!'));\n } else {\n console.log(chalk.yellow.bold(` ${issues} issue${issues > 1 ? 's' : ''} found`));\n }\n console.log('');\n });\n","import { logger } from './logger.js';\n\nexport function checkForUpdates(): void {\n // Non-blocking update check\n try {\n // Dynamic import to avoid blocking startup\n import('update-notifier').then(({ default: updateNotifier }) => {\n import('fs-extra').then(({ default: fs }) => {\n import('url').then(({ fileURLToPath }) => {\n import('path').then(({ dirname, join }) => {\n try {\n const __dirname = dirname(fileURLToPath(import.meta.url));\n const pkg = JSON.parse(\n fs.readFileSync(join(__dirname, '../../package.json'), 'utf-8')\n );\n const notifier = updateNotifier({ pkg, updateCheckInterval: 1000 * 60 * 60 * 24 });\n notifier.notify();\n } catch {\n // Silently fail - don't block CLI usage\n }\n });\n });\n });\n }).catch(() => {\n // Silently fail\n });\n } catch {\n // Silently fail\n }\n}\n","import chalk from 'chalk';\nimport { logger } from './logger.js';\n\nexport class CLIError extends Error {\n constructor(\n message: string,\n public code?: string,\n public suggestion?: string\n ) {\n super(message);\n this.name = 'CLIError';\n }\n}\n\nexport function handleError(error: unknown): void {\n console.log('');\n\n if (error instanceof CLIError) {\n logger.error(error.message);\n\n if (error.suggestion) {\n console.log('');\n console.log(chalk.gray('Suggestion: ') + error.suggestion);\n }\n } else if (error instanceof Error) {\n logger.error(error.message);\n\n if (process.env.DEBUG) {\n console.log('');\n console.log(chalk.gray(error.stack || ''));\n }\n } else {\n logger.error('An unexpected error occurred');\n }\n\n console.log('');\n console.log(chalk.gray('For help, run: swiftpatch --help'));\n console.log(chalk.gray('Report issues: https://github.com/codewprincee/cli/issues'));\n console.log('');\n}\n"],"mappings":"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","names":["Conf","store","api","Command","chalk","readFileSync","fileURLToPath","dirname","join","chalk","chalk","Command","inquirer","Command","inquirer","Command","chalk","Command","chalk","Command","Command","chalk","ora","chalk","chalk","chalk","inquirer","inquirer","chalk","chalk","Command","ora","chalk","Command","chalk","ora","Command","inquirer","ora","chalk","Command","chalk","ora","Command","ora","chalk","Command","chalk","inquirer","ora","Command","ora","inquirer","chalk","Command","chalk","inquirer","ora","Command","chalk","inquirer","ora","Command","Command","chalk","inquirer","ora","path","fs","path","os","config","axios","fs","sleep","crypto","fs","crypto","fs","crypto","fs","path","path","fs","crypto","crypto","path","fs","fs","fs","Command","chalk","inquirer","app","version","ora","fs","config","path","release","sleep","Command","Command","chalk","ora","Command","ora","chalk","Command","chalk","ora","inquirer","Command","inquirer","ora","chalk","formatStatus","formatBytes","Command","chalk","inquirer","ora","Command","inquirer","chalk","ora","Command","chalk","inquirer","ora","Command","inquirer","chalk","ora","Command","chalk","inquirer","ora","Command","inquirer","chalk","ora","Command","Command","Command","chalk","ora","Command","ora","chalk","Command","chalk","inquirer","ora","Command","inquirer","ora","chalk","Command","chalk","inquirer","ora","Command","inquirer","ora","chalk","Command","chalk","inquirer","ora","Command","inquirer","chalk","ora","Command","Command","Command","chalk","inquirer","ora","Command","inquirer","ora","chalk","Command","chalk","inquirer","ora","Command","inquirer","ora","chalk","Command","chalk","inquirer","ora","Command","inquirer","chalk","ora","Command","chalk","inquirer","ora","Command","inquirer","chalk","ora","Command","Command","Command","chalk","ora","Command","ora","chalk","Command","chalk","inquirer","ora","Command","inquirer","ora","chalk","Command","chalk","ora","Command","chalk","ora","Command","chalk","inquirer","ora","Command","inquirer","chalk","ora","Command","ora","Command","ora","Command","Command","chalk","ora","Command","ora","chalk","formatBytes","Command","chalk","ora","Command","chalk","ora","path","fs","chalk","inquirer","chalk","inquirer","path","fs","Command","ora","chalk","Command","chalk","ora","Command","ora","chalk","Command","chalk","ora","execFile","promisify","execFileAsync","promisify","execFile","gitCommand","Command","ora","chalk","Command","chalk","ora","Command","chalk","Command","chalk","value","Command","chalk","ora","path","fs","os","fs","path","fs","path","path","fs","dirname","hermesEngine","hermesCompiler","Command","chalk","inquirer","path","os","fs","ora","bundlesDir","formatBytes","Command","chalk","ora","Command","chalk","ora","Command","chalk","ora","Command","chalk","ora","Command","chalk","ora","path","Command","chalk","path","ora","Command","chalk","inquirer","ora","fs","path","Command","fs","inquirer","chalk","ora","path","Command","chalk","inquirer","ora","Command","chalk","inquirer","ora","Command","chalk","inquirer","ora","fs","path","Command","chalk","fs","inquirer","ora","path","Command","chalk","fs","Command","chalk","fs","__dirname","dirname","fileURLToPath","readFileSync","join","Command","chalk","fs","fileURLToPath","dirname","join","__dirname","chalk","chalk"]}
|
|
1
|
+
{"version":3,"sources":["../node_modules/tsup/assets/esm_shims.js","../src/lib/config.ts","../src/lib/api.ts","../src/lib/auth.ts","../src/index.ts","../src/cli.ts","../src/commands/login.ts","../src/utils/logger.ts","../src/commands/logout.ts","../src/commands/whoami.ts","../src/commands/apps/index.ts","../src/commands/apps/list.ts","../src/utils/auth-guard.ts","../src/utils/org-resolver.ts","../src/utils/table.ts","../src/commands/apps/create.ts","../src/commands/apps/info.ts","../src/commands/apps/update.ts","../src/commands/apps/delete.ts","../src/commands/release.ts","../src/lib/bundler.ts","../src/lib/uploader.ts","../src/lib/hash.ts","../src/lib/signing.ts","../src/utils/detect.ts","../src/commands/releases/index.ts","../src/commands/releases/list.ts","../src/commands/releases/info.ts","../src/commands/releases/rollout.ts","../src/commands/releases/rollback.ts","../src/commands/releases/disable.ts","../src/commands/channels/index.ts","../src/commands/channels/list.ts","../src/commands/channels/create.ts","../src/commands/channels/update.ts","../src/commands/channels/delete.ts","../src/commands/ci-tokens/index.ts","../src/commands/ci-tokens/list.ts","../src/commands/ci-tokens/create.ts","../src/commands/ci-tokens/delete.ts","../src/commands/ci-tokens/regenerate.ts","../src/commands/webhooks/index.ts","../src/commands/webhooks/list.ts","../src/commands/webhooks/create.ts","../src/commands/webhooks/update.ts","../src/commands/webhooks/delete.ts","../src/commands/webhooks/test.ts","../src/commands/analytics.ts","../src/commands/ai.ts","../src/commands/ai-doctor.ts","../src/lib/claude.ts","../src/utils/consent.ts","../src/commands/ai-explain.ts","../src/commands/ai-review.ts","../src/commands/config.ts","../src/commands/publish-bundle.ts","../src/lib/archive.ts","../src/lib/artifacts.ts","../src/lib/react-native-utils.ts","../src/commands/release-bundle.ts","../src/commands/update-release.ts","../src/commands/generate-key-pair.ts","../src/commands/deploy.ts","../src/commands/status.ts","../src/commands/init.ts","../src/commands/doctor.ts","../src/utils/update-checker.ts","../src/utils/errors.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","import Conf from 'conf';\nimport type { CLIConfig } from '../types/config.js';\n\nconst store = new Conf<CLIConfig>({\n projectName: 'swiftpatch-cli-config',\n});\n\nexport const config = {\n get<K extends keyof CLIConfig>(key: K): CLIConfig[K] | undefined {\n return store.get(key) as CLIConfig[K] | undefined;\n },\n\n set<K extends keyof CLIConfig>(key: K, value: CLIConfig[K]): void {\n store.set(key, value);\n },\n\n delete<K extends keyof CLIConfig>(key: K): void {\n store.delete(key);\n },\n\n getAll(): CLIConfig {\n return store.store;\n },\n\n clear(): void {\n store.clear();\n },\n\n get path(): string {\n return store.path;\n },\n};\n","import axios, { AxiosInstance, AxiosError } from 'axios';\nimport { auth } from './auth.js';\nimport { config } from './config.js';\nimport type {\n User,\n Organization,\n App,\n Release,\n Channel,\n AnalyticsData,\n CreateReleaseParams,\n CompleteUploadParams,\n CIToken,\n Webhook,\n CreateWebhookParams,\n UpdateWebhookParams,\n WebhookTestResult,\n UpdateAppParams,\n UpdateChannelParams,\n} from '../types/api.js';\n\nconst API_BASE_URL = process.env.SWIFTPATCH_API_URL || 'https://api.blendapp.ae/api/v1';\n\n/**\n * Warn if a custom API URL uses HTTP in production (non-localhost)\n */\nfunction warnIfInsecure(url: string): void {\n if (\n url.startsWith('http://') &&\n !url.includes('localhost') &&\n !url.includes('127.0.0.1')\n ) {\n console.warn(\n '\\x1b[33m⚠ Warning: API URL uses HTTP instead of HTTPS. This is insecure for production use.\\x1b[0m'\n );\n }\n}\n\n/**\n * Recursively normalize MongoDB _id fields to id\n */\nfunction normalizeIds(obj: any): any {\n if (obj === null || obj === undefined) return obj;\n if (Array.isArray(obj)) return obj.map(normalizeIds);\n if (typeof obj === 'object') {\n const result: any = {};\n for (const [key, value] of Object.entries(obj)) {\n if (key === '_id') {\n result['id'] = value;\n } else if (key === '__v') {\n // Skip Mongoose version key\n continue;\n } else {\n result[key] = normalizeIds(value);\n }\n }\n return result;\n }\n return obj;\n}\n\nclass ApiClient {\n private client: AxiosInstance;\n\n constructor() {\n const baseURL = config.get('apiUrl') || API_BASE_URL;\n warnIfInsecure(baseURL);\n\n this.client = axios.create({\n baseURL,\n timeout: 30000,\n headers: {\n 'Content-Type': 'application/json',\n 'User-Agent': 'swiftpatch-cli/1.0.0',\n },\n });\n\n // Add auth header to all requests\n this.client.interceptors.request.use((reqConfig) => {\n const authHeaders = auth.getAuthHeader();\n Object.assign(reqConfig.headers, authHeaders);\n return reqConfig;\n });\n\n // Handle errors with automatic token refresh\n this.client.interceptors.response.use(\n (response) => response,\n async (error: AxiosError) => {\n if (error.response) {\n const data = error.response.data as Record<string, any>;\n const message = data?.error?.message || error.message;\n\n // Try refreshing the token on 401\n if (error.response.status === 401 && error.config && !(error.config as any)._isRetry) {\n const refreshToken = auth.getRefreshToken();\n if (refreshToken) {\n try {\n (error.config as any)._isRetry = true;\n const { data: refreshData } = await axios.post(\n `${baseURL}/auth/refresh`,\n { refreshToken }\n );\n const newAccessToken = refreshData.data?.accessToken;\n const newRefreshToken = refreshData.data?.refreshToken;\n if (newAccessToken) {\n auth.saveToken(newAccessToken, newRefreshToken);\n error.config!.headers['Authorization'] = `Bearer ${newAccessToken}`;\n return this.client.request(error.config!);\n }\n } catch {\n // Refresh failed — fall through to auth error\n }\n }\n throw new Error('Authentication failed. Please run: swiftpatch login');\n }\n\n throw new Error(message);\n }\n throw error;\n }\n );\n }\n\n // AUTH\n async loginWithCredentials(email: string, password: string): Promise<{ accessToken: string; refreshToken?: string; user: User }> {\n const response = await this.client.post('/auth/login', { email, password });\n const result = normalizeIds(response.data.data);\n // Extract refresh token from Set-Cookie header\n let refreshToken: string | undefined;\n const cookies = response.headers['set-cookie'];\n if (cookies) {\n for (const cookie of cookies) {\n const match = cookie.match(/refreshToken=([^;]+)/);\n if (match) {\n refreshToken = match[1];\n break;\n }\n }\n }\n return { accessToken: result.accessToken, refreshToken, user: result.user };\n }\n\n async createLoginSession(): Promise<{ sessionId: string; loginUrl: string }> {\n const { data } = await this.client.post('/auth/cli/session');\n return normalizeIds(data.data);\n }\n\n async checkLoginSession(sessionId: string): Promise<{ status: string; token?: string }> {\n const { data } = await this.client.get(`/auth/cli/session/${sessionId}`);\n return normalizeIds(data.data);\n }\n\n // USER\n async getCurrentUser(): Promise<User> {\n const { data } = await this.client.get('/auth/me');\n return normalizeIds(data.data);\n }\n\n async getOrganizations(): Promise<Organization[]> {\n const { data } = await this.client.get('/orgs');\n return normalizeIds(data.data);\n }\n\n // APPS (org-scoped)\n async getApps(orgId: string): Promise<App[]> {\n const { data } = await this.client.get(`/orgs/${orgId}/apps`);\n return normalizeIds(data.data);\n }\n\n async getApp(orgId: string, appId: string): Promise<App> {\n const { data } = await this.client.get(`/orgs/${orgId}/apps/${appId}`);\n return normalizeIds(data.data);\n }\n\n async createApp(orgId: string, params: {\n name: string;\n platform: 'IOS' | 'ANDROID' | 'BOTH';\n }): Promise<App> {\n const { data } = await this.client.post(`/orgs/${orgId}/apps`, params);\n return normalizeIds(data.data);\n }\n\n async updateApp(orgId: string, appId: string, params: UpdateAppParams): Promise<App> {\n const { data } = await this.client.patch(`/orgs/${orgId}/apps/${appId}`, params);\n return normalizeIds(data.data);\n }\n\n async deleteApp(orgId: string, appId: string): Promise<void> {\n await this.client.delete(`/orgs/${orgId}/apps/${appId}`);\n }\n\n // RELEASES (org-scoped)\n async getReleases(\n orgId: string,\n appId: string,\n params?: { page?: number; limit?: number }\n ): Promise<{ releases: Release[]; pagination: any }> {\n const { data } = await this.client.get(`/orgs/${orgId}/apps/${appId}/releases`, { params });\n const normalized = normalizeIds(data);\n return {\n releases: normalized.data || [],\n pagination: normalized.pagination,\n };\n }\n\n async getRelease(orgId: string, appId: string, releaseId: string): Promise<Release> {\n const { data } = await this.client.get(`/orgs/${orgId}/apps/${appId}/releases/${releaseId}`);\n return normalizeIds(data.data?.release || data.data);\n }\n\n async createRelease(\n orgId: string,\n appId: string,\n params: CreateReleaseParams\n ): Promise<Release & { uploadUrl: string }> {\n const { data } = await this.client.post(`/orgs/${orgId}/apps/${appId}/releases`, params);\n return normalizeIds(data.data?.release || data.data);\n }\n\n async completeUpload(\n orgId: string,\n appId: string,\n releaseId: string,\n params: CompleteUploadParams\n ): Promise<Release> {\n const { data } = await this.client.post(\n `/orgs/${orgId}/apps/${appId}/releases/${releaseId}/upload-complete`,\n params\n );\n return normalizeIds(data.data?.release || data.data);\n }\n\n async publishRelease(\n orgId: string,\n appId: string,\n releaseId: string,\n params: { rolloutPercent: number }\n ): Promise<Release> {\n const { data } = await this.client.post(\n `/orgs/${orgId}/apps/${appId}/releases/${releaseId}/publish`,\n params\n );\n return normalizeIds(data.data?.release || data.data);\n }\n\n async updateRollout(\n orgId: string,\n appId: string,\n releaseId: string,\n rolloutPercent: number\n ): Promise<Release> {\n const { data } = await this.client.patch(\n `/orgs/${orgId}/apps/${appId}/releases/${releaseId}/rollout`,\n { rolloutPercent }\n );\n return normalizeIds(data.data?.release || data.data);\n }\n\n async disableRelease(orgId: string, appId: string, releaseId: string, reason?: string): Promise<Release> {\n const { data } = await this.client.post(\n `/orgs/${orgId}/apps/${appId}/releases/${releaseId}/disable`,\n { reason }\n );\n return normalizeIds(data.data?.release || data.data);\n }\n\n async rollbackRelease(orgId: string, appId: string, releaseId: string, reason?: string): Promise<Release> {\n const { data } = await this.client.post(\n `/orgs/${orgId}/apps/${appId}/releases/${releaseId}/rollback`,\n { reason }\n );\n return normalizeIds(data.data?.release || data.data);\n }\n\n // CHANNELS (org-scoped)\n async getChannels(orgId: string, appId: string): Promise<Channel[]> {\n const { data } = await this.client.get(`/orgs/${orgId}/apps/${appId}/channels`);\n return normalizeIds(data.data);\n }\n\n async createChannel(orgId: string, appId: string, params: { name: string }): Promise<Channel> {\n const { data } = await this.client.post(`/orgs/${orgId}/apps/${appId}/channels`, params);\n return normalizeIds(data.data);\n }\n\n async updateChannel(orgId: string, appId: string, channelId: string, params: UpdateChannelParams): Promise<Channel> {\n const { data } = await this.client.patch(`/orgs/${orgId}/apps/${appId}/channels/${channelId}`, params);\n return normalizeIds(data.data);\n }\n\n async deleteChannel(orgId: string, appId: string, channelId: string): Promise<void> {\n await this.client.delete(`/orgs/${orgId}/apps/${appId}/channels/${channelId}`);\n }\n\n // ANALYTICS (org-scoped)\n async getAnalytics(\n orgId: string,\n appId: string,\n params?: { days?: number; releaseId?: string }\n ): Promise<AnalyticsData> {\n const { data } = await this.client.get(`/orgs/${orgId}/apps/${appId}/analytics/overview`, { params });\n return normalizeIds(data.data);\n }\n\n // ── AI ENDPOINTS ────────────────────────────────────────────────\n\n getBaseUrl(): string {\n return this.client.defaults.baseURL || API_BASE_URL;\n }\n\n getAuthHeaders(): Record<string, string> {\n return auth.getAuthHeader();\n }\n\n async aiRiskAssessment(\n orgId: string,\n appId: string,\n releaseId: string\n ): Promise<{ score: number; level: string; factors: { factor: string; impact: number; description: string }[]; recommendation: string }> {\n const { data } = await this.client.post(\n `/orgs/${orgId}/apps/${appId}/releases/${releaseId}/ai/risk-assessment`\n );\n return normalizeIds(data.data);\n }\n\n async aiCrashGroups(\n orgId: string,\n appId: string,\n params?: { status?: string; severity?: string; limit?: number }\n ): Promise<any[]> {\n const { data } = await this.client.get(`/orgs/${orgId}/apps/${appId}/ai/crash-groups`, { params });\n return normalizeIds(data.data);\n }\n\n async aiInsights(\n orgId: string,\n appId: string,\n params?: { type?: string; status?: string }\n ): Promise<any[]> {\n const { data } = await this.client.get(`/orgs/${orgId}/apps/${appId}/ai/insights`, { params });\n return normalizeIds(data.data);\n }\n\n // ── CLAUDE AI KEY (platform-provisioned) ──────────────────────\n\n async getClaudeApiKey(): Promise<{ apiKey: string }> {\n const { data } = await this.client.get('/ai/claude-key');\n return normalizeIds(data.data);\n }\n\n // ── CLI ENDPOINTS ──────────────────────────────────────────────\n\n /**\n * Generate a signed S3 URL for bundle upload.\n * Uses /cli/gen-signed-url (user auth) or /cli/ci/gen-signed-url (CI token auth).\n */\n async generateSignedUrl(\n params: { hash: string; uploadPath: string; platform: string; releaseNote: string; signature?: string },\n ciToken?: string\n ): Promise<{ url: string }> {\n const headers: Record<string, string> = {};\n const endpoint = ciToken ? '/cli/ci/gen-signed-url' : '/cli/gen-signed-url';\n\n if (ciToken) {\n headers['x-ci-token'] = ciToken;\n }\n\n const { data } = await this.client.post(endpoint, params, { headers });\n return normalizeIds(data.data);\n }\n\n /**\n * Promote a published bundle to a release.\n */\n async promoteBundle(\n params: {\n projectId: string;\n hash: string;\n appVersion: string;\n releaseNote: string;\n isMandatory?: boolean;\n isPaused?: boolean;\n },\n ciToken: string\n ): Promise<any> {\n const { data } = await this.client.post('/cli/ci/promote', params, {\n headers: { 'x-ci-token': ciToken },\n });\n return normalizeIds(data.data);\n }\n\n /**\n * Update an existing release via CLI.\n */\n async updateReleaseCli(\n params: {\n projectId: string;\n hash: string;\n releaseNote?: string;\n isMandatory?: boolean;\n isPaused?: boolean;\n isRolledBack?: boolean;\n rolloutPercent?: number;\n },\n ciToken: string\n ): Promise<any> {\n const { data } = await this.client.post('/cli/ci/update-release', params, {\n headers: { 'x-ci-token': ciToken },\n });\n return normalizeIds(data.data);\n }\n\n // ── CI TOKENS ─────────────────────────────────────────────────\n\n async getCITokens(orgId: string, appId: string): Promise<CIToken[]> {\n const { data } = await this.client.get(`/orgs/${orgId}/apps/${appId}/ci-tokens`);\n return normalizeIds(data.data);\n }\n\n async createCIToken(orgId: string, appId: string, name: string): Promise<{ token: string; ciToken: CIToken }> {\n const { data } = await this.client.post(`/orgs/${orgId}/apps/${appId}/ci-tokens`, { name });\n return normalizeIds(data.data);\n }\n\n async deleteCIToken(orgId: string, appId: string, tokenId: string): Promise<void> {\n await this.client.delete(`/orgs/${orgId}/apps/${appId}/ci-tokens/${tokenId}`);\n }\n\n async regenerateCIToken(orgId: string, appId: string, tokenId: string): Promise<{ token: string; ciToken: CIToken }> {\n const { data } = await this.client.post(`/orgs/${orgId}/apps/${appId}/ci-tokens/${tokenId}/regenerate`);\n return normalizeIds(data.data);\n }\n\n // ── WEBHOOKS ──────────────────────────────────────────────────\n\n async getWebhooks(orgId: string): Promise<Webhook[]> {\n const { data } = await this.client.get(`/orgs/${orgId}/webhooks`);\n return normalizeIds(data.data);\n }\n\n async createWebhook(orgId: string, params: CreateWebhookParams): Promise<Webhook> {\n const { data } = await this.client.post(`/orgs/${orgId}/webhooks`, params);\n return normalizeIds(data.data);\n }\n\n async updateWebhook(orgId: string, webhookId: string, params: UpdateWebhookParams): Promise<Webhook> {\n const { data } = await this.client.patch(`/orgs/${orgId}/webhooks/${webhookId}`, params);\n return normalizeIds(data.data);\n }\n\n async deleteWebhook(orgId: string, webhookId: string): Promise<void> {\n await this.client.delete(`/orgs/${orgId}/webhooks/${webhookId}`);\n }\n\n async testWebhook(orgId: string, webhookId: string): Promise<WebhookTestResult> {\n const { data } = await this.client.post(`/orgs/${orgId}/webhooks/${webhookId}/test`);\n return normalizeIds(data.data);\n }\n}\n\nexport const api = new ApiClient();\n","import Conf from 'conf';\nimport crypto from 'crypto';\nimport os from 'os';\n\ninterface AuthConfig {\n token?: string;\n refreshToken?: string;\n apiKey?: string;\n claudeApiKey?: string;\n user?: {\n id: string;\n email: string;\n name: string;\n };\n}\n\nfunction deriveEncryptionKey(): string {\n const material = [\n os.hostname(),\n os.userInfo().username,\n os.homedir(),\n 'swiftpatch-cli',\n ].join(':');\n return crypto.createHash('sha256').update(material).digest('hex');\n}\n\nfunction createStore(): Conf<AuthConfig> {\n try {\n return new Conf<AuthConfig>({\n projectName: 'swiftpatch-cli',\n encryptionKey: deriveEncryptionKey(),\n });\n } catch {\n // Migration: if decryption fails (old hardcoded key), clear and recreate\n const fresh = new Conf<AuthConfig>({\n projectName: 'swiftpatch-cli',\n encryptionKey: deriveEncryptionKey(),\n });\n fresh.clear();\n return fresh;\n }\n}\n\nconst store = createStore();\n\nexport const auth = {\n isLoggedIn(): boolean {\n return !!(store.get('token') || store.get('apiKey'));\n },\n\n getToken(): string | undefined {\n return store.get('token') || store.get('apiKey');\n },\n\n getAuthHeader(): Record<string, string> {\n const token = this.getToken();\n if (!token) return {};\n return { Authorization: `Bearer ${token}` };\n },\n\n saveToken(token: string, refreshToken?: string): void {\n store.set('token', token);\n if (refreshToken) {\n store.set('refreshToken', refreshToken);\n }\n store.delete('apiKey');\n },\n\n getRefreshToken(): string | undefined {\n return store.get('refreshToken');\n },\n\n async loginWithApiKey(apiKey: string): Promise<boolean> {\n const originalToken = store.get('token');\n const originalApiKey = store.get('apiKey');\n\n store.set('apiKey', apiKey);\n store.delete('token');\n\n try {\n // Import api dynamically to avoid circular dependency\n const { api } = await import('./api.js');\n await api.getCurrentUser();\n return true;\n } catch (error) {\n // Restore previous auth state\n if (originalToken) store.set('token', originalToken);\n else store.delete('token');\n if (originalApiKey) store.set('apiKey', originalApiKey);\n else store.delete('apiKey');\n throw error;\n }\n },\n\n saveUser(user: { id: string; email: string; name: string }): void {\n store.set('user', user);\n },\n\n getUser(): AuthConfig['user'] | undefined {\n return store.get('user');\n },\n\n logout(): void {\n store.delete('token');\n store.delete('refreshToken');\n store.delete('apiKey');\n store.delete('user');\n },\n\n getClaudeApiKey(): string | undefined {\n return store.get('claudeApiKey');\n },\n\n setClaudeApiKey(key: string): void {\n store.set('claudeApiKey', key);\n },\n\n deleteClaudeApiKey(): void {\n store.delete('claudeApiKey');\n },\n\n getConfigPath(): string {\n return store.path;\n },\n};\n","import { cli } from './cli.js';\nimport { checkForUpdates } from './utils/update-checker.js';\nimport { handleError } from './utils/errors.js';\n\nasync function main() {\n try {\n // Check for CLI updates (non-blocking)\n checkForUpdates();\n\n // Run CLI\n await cli.parseAsync(process.argv);\n } catch (error) {\n handleError(error);\n process.exit(1);\n }\n}\n\nmain();\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { readFileSync } from 'fs';\nimport { fileURLToPath } from 'url';\nimport { dirname, join } from 'path';\n\n// Commands\nimport { loginCommand } from './commands/login.js';\nimport { logoutCommand } from './commands/logout.js';\nimport { whoamiCommand } from './commands/whoami.js';\nimport { appsCommands } from './commands/apps/index.js';\nimport { releaseCommand } from './commands/release.js';\nimport { releasesCommands } from './commands/releases/index.js';\nimport { channelsCommands } from './commands/channels/index.js';\nimport { ciTokensCommands } from './commands/ci-tokens/index.js';\nimport { webhooksCommands } from './commands/webhooks/index.js';\nimport { analyticsCommand } from './commands/analytics.js';\nimport { aiCommand } from './commands/ai.js';\nimport { configCommands } from './commands/config.js';\nimport { publishBundleCommand } from './commands/publish-bundle.js';\nimport { releaseBundleCommand } from './commands/release-bundle.js';\nimport { updateReleaseCommand } from './commands/update-release.js';\nimport { generateKeyPairCommand } from './commands/generate-key-pair.js';\nimport { deployCommand } from './commands/deploy.js';\nimport { statusCommand } from './commands/status.js';\nimport { initCommand } from './commands/init.js';\nimport { doctorCommand } from './commands/doctor.js';\n\n// Get package version\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nlet version = '1.0.0';\ntry {\n const pkg = JSON.parse(readFileSync(join(__dirname, '../package.json'), 'utf-8'));\n version = pkg.version;\n} catch {\n // Use default version\n}\n\nexport const cli = new Command();\n\ncli\n .name('swiftpatch')\n .description(chalk.bold('SwiftPatch CLI') + ' - Ship React Native updates instantly')\n .version(version, '-v, --version', 'Output the current version')\n .helpOption('-h, --help', 'Display help for command')\n .addHelpText('after', `\n${chalk.bold('Quick Start:')}\n $ swiftpatch init ${chalk.gray('# Set up SwiftPatch in your project')}\n $ swiftpatch deploy -p ios ${chalk.gray('# Bundle, upload, and release')}\n $ swiftpatch status ${chalk.gray('# View app status at a glance')}\n\n${chalk.bold('Examples:')}\n ${chalk.gray('# Login to SwiftPatch')}\n $ swiftpatch login\n\n ${chalk.gray('# Publish a bundle')}\n $ swiftpatch publish-bundle -p ios --hermes\n\n ${chalk.gray('# Promote a bundle to a release')}\n $ swiftpatch release-bundle --hash <hash> --app-version 1.0.0 --ci-token <token>\n\n ${chalk.gray('# One-step deploy (bundle + upload + release)')}\n $ swiftpatch deploy -p ios --ci-token <token>\n\n ${chalk.gray('# List all apps')}\n $ swiftpatch apps list\n\n ${chalk.gray('# Update rollout percentage')}\n $ swiftpatch releases rollout <release-id> --percent 50\n\n ${chalk.gray('# Manage CI tokens')}\n $ swiftpatch ci-tokens create\n\n ${chalk.gray('# Diagnose setup issues')}\n $ swiftpatch doctor\n\n${chalk.bold('Documentation:')}\n ${chalk.cyan('https://docs.swiftpatch.io/cli')}\n`);\n\n// Setup & diagnostics\ncli.addCommand(initCommand);\ncli.addCommand(doctorCommand);\ncli.addCommand(statusCommand);\n\n// Auth commands\ncli.addCommand(loginCommand);\ncli.addCommand(logoutCommand);\ncli.addCommand(whoamiCommand);\n\n// Apps commands\ncli.addCommand(appsCommands);\n\n// Deploy command (one-step: bundle + upload + release)\ncli.addCommand(deployCommand);\n\n// Release command (legacy - deprecated in favor of publish-bundle + release-bundle)\ncli.addCommand(releaseCommand);\n\n// Bundle publishing commands\ncli.addCommand(publishBundleCommand);\ncli.addCommand(releaseBundleCommand);\ncli.addCommand(updateReleaseCommand);\ncli.addCommand(generateKeyPairCommand);\n\n// Releases commands\ncli.addCommand(releasesCommands);\n\n// Channels commands\ncli.addCommand(channelsCommands);\n\n// CI tokens commands\ncli.addCommand(ciTokensCommands);\n\n// Webhooks commands\ncli.addCommand(webhooksCommands);\n\n// Analytics command\ncli.addCommand(analyticsCommand);\n\n// AI commands\ncli.addCommand(aiCommand);\n\n// Config commands\ncli.addCommand(configCommands);\n\n// Default action\ncli.action(() => {\n console.log('');\n console.log(chalk.bold.cyan(' SwiftPatch CLI'));\n console.log(chalk.gray(` v${version}`));\n console.log('');\n console.log(' Run ' + chalk.cyan('swiftpatch --help') + ' for usage information');\n console.log('');\n});\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport open from 'open';\nimport ora from 'ora';\nimport { auth } from '../lib/auth.js';\nimport { api } from '../lib/api.js';\nimport { logger } from '../utils/logger.js';\n\nexport const loginCommand = new Command('login')\n .description('Authenticate with SwiftPatch')\n .option('-k, --api-key <key>', 'Login with API key (for CI/CD)')\n .option('-e, --email <email>', 'Login with email and password')\n .option('-p, --password <password>', 'Password (used with --email)')\n .option('-i, --interactive', 'Force interactive login')\n .action(async (options) => {\n // Check if already logged in\n const existingToken = auth.getToken();\n if (existingToken && !options.interactive && !options.apiKey && !options.email) {\n const user = await api.getCurrentUser().catch(() => null);\n if (user) {\n logger.info(`Already logged in as ${chalk.cyan(user.email)}`);\n const { reauth } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'reauth',\n message: 'Do you want to log in with a different account?',\n default: false,\n },\n ]);\n if (!reauth) return;\n }\n }\n\n // API Key login (for CI/CD)\n if (options.apiKey) {\n const spinner = ora('Validating API key...').start();\n try {\n const isValid = await auth.loginWithApiKey(options.apiKey);\n if (isValid) {\n spinner.succeed('Logged in with API key');\n const user = await api.getCurrentUser();\n logger.success(`Authenticated as ${chalk.cyan(user.email)}`);\n } else {\n spinner.fail('Invalid API key');\n process.exit(1);\n }\n } catch (error: any) {\n spinner.fail(`Login failed: ${error.message}`);\n process.exit(1);\n }\n return;\n }\n\n // Email/password login (non-interactive or via flags)\n if (options.email) {\n await emailLogin(options.email, options.password);\n return;\n }\n\n // Interactive login\n const { method } = await inquirer.prompt([\n {\n type: 'list',\n name: 'method',\n message: 'How would you like to authenticate?',\n choices: [\n { name: 'Login with email & password', value: 'email' },\n { name: 'Login with browser', value: 'browser' },\n { name: 'Enter API key (for CI/CD)', value: 'apikey' },\n ],\n },\n ]);\n\n if (method === 'browser') {\n await browserLogin();\n } else if (method === 'email') {\n await emailLoginInteractive();\n } else {\n await apiKeyLogin();\n }\n });\n\nasync function emailLogin(email: string, password?: string) {\n if (!password) {\n const answers = await inquirer.prompt([\n {\n type: 'password',\n name: 'password',\n message: 'Password:',\n mask: '*',\n validate: (input: string) => input ? true : 'Password is required',\n },\n ]);\n password = answers.password;\n }\n\n const spinner = ora('Logging in...').start();\n try {\n const result = await api.loginWithCredentials(email, password!);\n\n auth.saveToken(result.accessToken, result.refreshToken);\n auth.saveUser({\n id: result.user.id || (result.user as any)._id,\n email: result.user.email,\n name: result.user.name,\n });\n\n spinner.succeed('Login successful!');\n console.log('');\n logger.success(`Welcome, ${chalk.bold(result.user.name)}!`);\n logger.info(`Email: ${chalk.cyan(result.user.email)}`);\n\n const orgs = await api.getOrganizations();\n if (orgs.length > 0) {\n logger.info(`Organizations: ${orgs.map(o => chalk.cyan(o.name)).join(', ')}`);\n }\n } catch (error: any) {\n spinner.fail(`Login failed: ${error.message}`);\n process.exit(1);\n }\n}\n\nasync function emailLoginInteractive() {\n const { email, password } = await inquirer.prompt([\n {\n type: 'input',\n name: 'email',\n message: 'Email:',\n validate: (input: string) => {\n if (!input) return 'Email is required';\n if (!input.includes('@')) return 'Invalid email format';\n return true;\n },\n },\n {\n type: 'password',\n name: 'password',\n message: 'Password:',\n mask: '*',\n validate: (input: string) => input ? true : 'Password is required',\n },\n ]);\n\n await emailLogin(email, password);\n}\n\nasync function browserLogin() {\n const spinner = ora('Opening browser...').start();\n\n try {\n const { sessionId, loginUrl } = await api.createLoginSession();\n\n spinner.text = 'Waiting for authentication...';\n\n await open(loginUrl);\n\n logger.info(`\\nIf browser doesn't open, visit:\\n${chalk.cyan(loginUrl)}\\n`);\n\n const token = await pollForToken(sessionId, spinner);\n\n auth.saveToken(token);\n\n spinner.succeed('Login successful!');\n\n const user = await api.getCurrentUser();\n console.log('');\n logger.success(`Welcome, ${chalk.bold(user.name)}!`);\n logger.info(`Email: ${chalk.cyan(user.email)}`);\n\n const orgs = await api.getOrganizations();\n if (orgs.length > 0) {\n logger.info(`Organizations: ${orgs.map(o => chalk.cyan(o.name)).join(', ')}`);\n }\n } catch (error: any) {\n spinner.fail(`Login failed: ${error.message}`);\n process.exit(1);\n }\n}\n\nasync function pollForToken(sessionId: string, spinner: ReturnType<typeof ora>): Promise<string> {\n const maxAttempts = 60;\n let attempts = 0;\n\n while (attempts < maxAttempts) {\n try {\n const result = await api.checkLoginSession(sessionId);\n\n if (result.status === 'completed' && result.token) {\n return result.token;\n }\n\n if (result.status === 'expired') {\n throw new Error('Login session expired. Please try again.');\n }\n } catch (error: any) {\n if (error.message.includes('expired')) {\n throw error;\n }\n }\n\n await sleep(5000);\n attempts++;\n const remainingSeconds = (maxAttempts - attempts) * 5;\n const remainingMinutes = Math.floor(remainingSeconds / 60);\n const remainingSecs = remainingSeconds % 60;\n spinner.text = `Waiting for authentication... (${remainingMinutes}m ${remainingSecs}s remaining)`;\n }\n\n throw new Error('Login timed out. Please try again.');\n}\n\nasync function apiKeyLogin() {\n const { apiKey } = await inquirer.prompt([\n {\n type: 'password',\n name: 'apiKey',\n message: 'Enter your API key:',\n mask: '*',\n validate: (input: string) => {\n if (!input) return 'API key is required';\n if (!input.startsWith('sp_')) return 'Invalid API key format';\n return true;\n },\n },\n ]);\n\n const spinner = ora('Validating API key...').start();\n\n try {\n await auth.loginWithApiKey(apiKey);\n spinner.succeed('Login successful!');\n\n const user = await api.getCurrentUser();\n logger.success(`Authenticated as ${chalk.cyan(user.email)}`);\n } catch (error: any) {\n spinner.fail(`Login failed: ${error.message}`);\n process.exit(1);\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n","import chalk from 'chalk';\nimport figures from 'figures';\n\nexport const logger = {\n info(message: string): void {\n console.log(chalk.blue(figures.info) + ' ' + message);\n },\n\n success(message: string): void {\n console.log(chalk.green(figures.tick) + ' ' + message);\n },\n\n warning(message: string): void {\n console.log(chalk.yellow(figures.warning) + ' ' + message);\n },\n\n error(message: string): void {\n console.log(chalk.red(figures.cross) + ' ' + message);\n },\n\n debug(message: string): void {\n if (process.env.DEBUG) {\n console.log(chalk.gray(figures.pointer) + ' ' + chalk.gray(message));\n }\n },\n\n blank(): void {\n console.log('');\n },\n\n divider(): void {\n console.log(chalk.gray('\\u2500'.repeat(50)));\n },\n};\n","import { Command } from 'commander';\nimport inquirer from 'inquirer';\nimport { auth } from '../lib/auth.js';\nimport { logger } from '../utils/logger.js';\n\nexport const logoutCommand = new Command('logout')\n .description('Log out from SwiftPatch')\n .option('-f, --force', 'Logout without confirmation')\n .action(async (options) => {\n if (!auth.isLoggedIn()) {\n logger.info('You are not logged in');\n return;\n }\n\n if (!options.force) {\n const { confirm } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirm',\n message: 'Are you sure you want to log out?',\n default: false,\n },\n ]);\n\n if (!confirm) {\n logger.info('Logout cancelled');\n return;\n }\n }\n\n auth.logout();\n logger.success('Logged out successfully');\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { auth } from '../lib/auth.js';\nimport { api } from '../lib/api.js';\nimport { logger } from '../utils/logger.js';\n\nexport const whoamiCommand = new Command('whoami')\n .description('Show current authenticated user')\n .action(async () => {\n if (!auth.isLoggedIn()) {\n logger.error('Not logged in. Run ' + chalk.cyan('swiftpatch login') + ' first.');\n process.exit(1);\n }\n\n try {\n const user = await api.getCurrentUser();\n const orgs = await api.getOrganizations();\n\n console.log('');\n console.log(chalk.bold(' Current User'));\n console.log('');\n console.log(` Name: ${chalk.cyan(user.name)}`);\n console.log(` Email: ${chalk.cyan(user.email)}`);\n console.log(` ID: ${chalk.gray(user.id)}`);\n console.log('');\n\n if (orgs.length > 0) {\n console.log(chalk.bold(' Organizations'));\n console.log('');\n orgs.forEach(org => {\n console.log(` \\u2022 ${chalk.cyan(org.name)} ${chalk.gray(`(${org.slug})`)}`);\n console.log(` Plan: ${org.plan} | Apps: ${org.usage.appsCount}`);\n });\n console.log('');\n }\n } catch (error: any) {\n logger.error(`Failed to get user info: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport { listAppsCommand } from './list.js';\nimport { createAppCommand } from './create.js';\nimport { infoAppCommand } from './info.js';\nimport { updateAppCommand } from './update.js';\nimport { deleteAppCommand } from './delete.js';\n\nexport const appsCommands = new Command('apps')\n .description('Manage apps');\n\nappsCommands.addCommand(listAppsCommand);\nappsCommands.addCommand(createAppCommand);\nappsCommands.addCommand(infoAppCommand);\nappsCommands.addCommand(updateAppCommand);\nappsCommands.addCommand(deleteAppCommand);\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { api } from '../../lib/api.js';\nimport { requireAuth } from '../../utils/auth-guard.js';\nimport { resolveOrgId } from '../../utils/org-resolver.js';\nimport { createTable } from '../../utils/table.js';\n\nexport const listAppsCommand = new Command('list')\n .description('List all apps')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n const spinner = ora('Fetching apps...').start();\n\n try {\n const apps = await api.getApps(orgId);\n spinner.stop();\n\n if (options.json) {\n console.log(JSON.stringify(apps, null, 2));\n return;\n }\n\n if (apps.length === 0) {\n console.log('');\n console.log(chalk.gray(' No apps found.'));\n console.log('');\n console.log(' Create one with: ' + chalk.cyan('swiftpatch apps create'));\n console.log('');\n return;\n }\n\n console.log('');\n console.log(chalk.bold(' Your Apps'));\n console.log('');\n\n const table = createTable({\n head: ['Name', 'Platform', 'Deployment Key', 'Releases'],\n rows: apps.map(app => [\n chalk.cyan(app.name || ''),\n app.platform || '',\n chalk.gray((app.deploymentKey || '').slice(0, 20) + '...'),\n String(app.stats?.totalReleases ?? 0),\n ]),\n });\n\n console.log(table);\n console.log('');\n } catch (error: any) {\n spinner.fail(`Failed to fetch apps: ${error.message}`);\n process.exit(1);\n }\n });\n","import chalk from 'chalk';\nimport { auth } from '../lib/auth.js';\nimport { logger } from './logger.js';\n\nexport async function requireAuth(): Promise<void> {\n if (!auth.isLoggedIn()) {\n logger.error('You must be logged in to run this command');\n console.log('');\n console.log('Run ' + chalk.cyan('swiftpatch login') + ' to authenticate');\n console.log('');\n process.exit(1);\n }\n}\n","import chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport { api } from '../lib/api.js';\nimport { config } from '../lib/config.js';\nimport { logger } from './logger.js';\n\n/**\n * Resolve the organization ID to use for the current command.\n * Priority:\n * 1. Explicit --org flag value\n * 2. Saved default org from config\n * 3. Auto-select if user has only one org\n * 4. Interactive prompt if multiple orgs\n */\nexport async function resolveOrgId(explicitOrgId?: string): Promise<string> {\n // 1. Explicit flag\n if (explicitOrgId) {\n return explicitOrgId;\n }\n\n // 2. Saved default\n const defaultOrg = config.get('defaultOrg');\n if (defaultOrg) {\n return defaultOrg;\n }\n\n // 3. Fetch orgs\n const orgs = await api.getOrganizations();\n\n if (orgs.length === 0) {\n logger.error('No organizations found. Please create one at https://app.swiftpatch.io');\n process.exit(1);\n }\n\n // Auto-select if only one\n if (orgs.length === 1) {\n return orgs[0].id;\n }\n\n // 4. Interactive prompt\n const { selectedOrg } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selectedOrg',\n message: 'Select organization:',\n choices: orgs.map(org => ({\n name: `${org.name} ${chalk.gray(`(${org.slug})`)}`,\n value: org.id,\n })),\n },\n ]);\n\n // Offer to save as default\n const { saveDefault } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'saveDefault',\n message: 'Save as default organization?',\n default: true,\n },\n ]);\n\n if (saveDefault) {\n config.set('defaultOrg', selectedOrg);\n logger.info(`Default organization saved. Change with: ${chalk.cyan('swiftpatch config set defaultOrg <org-id>')}`);\n }\n\n return selectedOrg;\n}\n","import Table from 'cli-table3';\nimport chalk from 'chalk';\n\ninterface TableOptions {\n head: string[];\n rows: (string | number)[][];\n colWidths?: number[];\n}\n\nexport function createTable(options: TableOptions): string {\n const tableConfig: any = {\n head: options.head.map(h => chalk.bold(h)),\n style: {\n head: [],\n border: [],\n },\n chars: {\n 'top': '\\u2500',\n 'top-mid': '\\u252C',\n 'top-left': '\\u250C',\n 'top-right': '\\u2510',\n 'bottom': '\\u2500',\n 'bottom-mid': '\\u2534',\n 'bottom-left': '\\u2514',\n 'bottom-right': '\\u2518',\n 'left': '\\u2502',\n 'left-mid': '\\u251C',\n 'mid': '\\u2500',\n 'mid-mid': '\\u253C',\n 'right': '\\u2502',\n 'right-mid': '\\u2524',\n 'middle': '\\u2502',\n },\n };\n\n if (options.colWidths) {\n tableConfig.colWidths = options.colWidths;\n }\n\n const table = new Table(tableConfig);\n\n for (const row of options.rows) {\n table.push(row.map(v => v == null ? '' : String(v)));\n }\n\n return table.toString();\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { api } from '../../lib/api.js';\nimport { requireAuth } from '../../utils/auth-guard.js';\nimport { resolveOrgId } from '../../utils/org-resolver.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const createAppCommand = new Command('create')\n .description('Create a new app')\n .option('-n, --name <name>', 'App name')\n .option('-p, --platform <platform>', 'Platform (ios, android, or both)')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n\n // Get app name\n let appName = options.name;\n if (!appName) {\n const inquirer = (await import('inquirer')).default;\n const { name } = await inquirer.prompt([\n {\n type: 'input',\n name: 'name',\n message: 'App name:',\n validate: (input: string) => {\n if (!input.trim()) return 'App name is required';\n if (input.length < 2) return 'Name must be at least 2 characters';\n return true;\n },\n },\n ]);\n appName = name;\n }\n\n // Get platform\n let platform = options.platform?.toUpperCase();\n if (!platform || !['IOS', 'ANDROID', 'BOTH'].includes(platform)) {\n const inquirer = (await import('inquirer')).default;\n const { selectedPlatform } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selectedPlatform',\n message: 'Select platform:',\n choices: [\n { name: 'iOS', value: 'IOS' },\n { name: 'Android', value: 'ANDROID' },\n { name: 'Both (iOS & Android)', value: 'BOTH' },\n ],\n },\n ]);\n platform = selectedPlatform;\n }\n\n const spinner = ora('Creating app...').start();\n\n try {\n const app = await api.createApp(orgId, {\n name: appName,\n platform: platform as 'IOS' | 'ANDROID' | 'BOTH',\n });\n\n spinner.succeed('App created!');\n\n if (options.json) {\n console.log(JSON.stringify(app, null, 2));\n return;\n }\n\n console.log('');\n console.log(chalk.bold(' App Details'));\n console.log('');\n console.log(` Name: ${chalk.cyan(app.name)}`);\n console.log(` ID: ${chalk.gray(app.id)}`);\n console.log(` Platform: ${app.platform}`);\n console.log(` Deployment Key: ${chalk.gray(app.deploymentKey)}`);\n console.log('');\n console.log(chalk.gray(' Add this to your React Native app:'));\n console.log(` ${chalk.cyan(`deploymentKey: \"${app.deploymentKey}\"`)}`);\n console.log('');\n } catch (error: any) {\n spinner.fail(`Failed to create app: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { api } from '../../lib/api.js';\nimport { requireAuth } from '../../utils/auth-guard.js';\nimport { resolveOrgId } from '../../utils/org-resolver.js';\n\nexport const infoAppCommand = new Command('info')\n .description('Show app details')\n .argument('<app-id>', 'App ID')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('--json', 'Output as JSON')\n .action(async (appId, options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n const spinner = ora('Fetching app details...').start();\n\n try {\n const app = await api.getApp(orgId, appId);\n spinner.stop();\n\n if (options.json) {\n console.log(JSON.stringify(app, null, 2));\n return;\n }\n\n console.log('');\n console.log(chalk.bold(' App Details'));\n console.log('');\n console.log(` Name: ${chalk.cyan(app.name)}`);\n console.log(` ID: ${chalk.gray(app.id)}`);\n console.log(` Slug: ${chalk.gray(app.slug)}`);\n console.log(` Platform: ${app.platform}`);\n console.log(` Deployment Key: ${chalk.gray(app.deploymentKey)}`);\n console.log(` Signing: ${app.signingEnabled ? chalk.green('Enabled') : chalk.gray('Disabled')}`);\n const orgDisplay = typeof app.organizationId === 'object' && app.organizationId?.name\n ? `${app.organizationId.name} (${app.organizationId.id || app.organizationId._id})`\n : app.organizationId;\n console.log(` Organization: ${chalk.gray(orgDisplay)}`);\n\n if (app.stats) {\n console.log('');\n console.log(chalk.bold(' Stats'));\n console.log(` Total Releases: ${app.stats.totalReleases}`);\n console.log(` Total Installs: ${app.stats.totalInstalls}`);\n console.log(` Active Devices: ${app.stats.activeDevices}`);\n }\n\n console.log('');\n } catch (error: any) {\n spinner.fail(`Failed to fetch app: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport { api } from '../../lib/api.js';\nimport { requireAuth } from '../../utils/auth-guard.js';\nimport { resolveOrgId } from '../../utils/org-resolver.js';\n\nexport const updateAppCommand = new Command('update')\n .description('Update app settings')\n .argument('<app-id>', 'App ID')\n .option('-n, --name <name>', 'New app name')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('--json', 'Output as JSON')\n .action(async (appId, options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n\n const spinner = ora('Fetching app details...').start();\n const app = await api.getApp(orgId, appId);\n spinner.stop();\n\n let name = options.name;\n if (!name) {\n const answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'name',\n message: 'New app name:',\n default: app.name,\n validate: (input: string) => {\n if (!input.trim()) return 'App name is required';\n return true;\n },\n },\n ]);\n name = answers.name;\n }\n\n const updateSpinner = ora('Updating app...').start();\n\n try {\n const updated = await api.updateApp(orgId, appId, { name });\n updateSpinner.succeed('App updated!');\n\n if (options.json) {\n console.log(JSON.stringify(updated, null, 2));\n return;\n }\n\n console.log('');\n console.log(` Name: ${chalk.cyan(updated.name)}`);\n console.log(` Slug: ${chalk.gray(updated.slug)}`);\n console.log('');\n } catch (error: any) {\n updateSpinner.fail(`Failed to update app: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport { api } from '../../lib/api.js';\nimport { requireAuth } from '../../utils/auth-guard.js';\nimport { resolveOrgId } from '../../utils/org-resolver.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const deleteAppCommand = new Command('delete')\n .description('Delete an app')\n .argument('<app-id>', 'App ID')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('-y, --yes', 'Skip confirmation')\n .action(async (appId, options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n\n // Get app info first\n const app = await api.getApp(orgId, appId);\n\n if (!options.yes) {\n console.log('');\n logger.warning(`You are about to delete: ${chalk.bold(app.name)}`);\n console.log(chalk.gray(' This action cannot be undone.'));\n console.log('');\n\n const { confirm } = await inquirer.prompt([\n {\n type: 'input',\n name: 'confirm',\n message: `Type \"${app.name}\" to confirm deletion:`,\n validate: (input: string) => {\n if (input !== app.name) return `Please type \"${app.name}\" to confirm`;\n return true;\n },\n },\n ]);\n\n if (confirm !== app.name) {\n logger.info('Deletion cancelled');\n return;\n }\n }\n\n const spinner = ora('Deleting app...').start();\n\n try {\n await api.deleteApp(orgId, appId);\n spinner.succeed(`App \"${app.name}\" deleted`);\n } catch (error: any) {\n spinner.fail(`Failed to delete app: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport path from 'path';\nimport fs from 'fs-extra';\nimport { auth } from '../lib/auth.js';\nimport { api } from '../lib/api.js';\nimport { bundler } from '../lib/bundler.js';\nimport { uploader } from '../lib/uploader.js';\nimport { hashBundle } from '../lib/hash.js';\nimport { signBundle } from '../lib/signing.js';\nimport { logger } from '../utils/logger.js';\nimport { requireAuth } from '../utils/auth-guard.js';\nimport { resolveOrgId } from '../utils/org-resolver.js';\nimport { detectAppInfo } from '../utils/detect.js';\n\ninterface ReleaseOptions {\n app?: string;\n org?: string;\n platform?: 'ios' | 'android';\n target?: string[];\n channel?: string;\n mandatory?: boolean;\n rollout?: string;\n note?: string;\n bundlePath?: string;\n dryRun?: boolean;\n yes?: boolean;\n sign?: boolean;\n privateKey?: string;\n}\n\nexport const releaseCommand = new Command('release')\n .description('Bundle and publish a new release (deprecated: use publish-bundle + release-bundle)')\n .option('-a, --app <app-id>', 'App ID or slug')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('-p, --platform <platform>', 'Target platform (ios or android)')\n .option('-t, --target <versions...>', 'Target binary version(s)')\n .option('-c, --channel <channel>', 'Release channel', 'production')\n .option('-m, --mandatory', 'Mark as mandatory update', false)\n .option('-r, --rollout <percent>', 'Rollout percentage', '100')\n .option('-n, --note <note>', 'Release notes')\n .option('--bundle-path <path>', 'Path to pre-built bundle')\n .option('--dry-run', 'Simulate release without uploading', false)\n .option('-y, --yes', 'Skip confirmation prompts', false)\n .option('--sign', 'Sign the bundle', false)\n .option('--private-key <path>', 'Path to private key for signing')\n .action(async (options: ReleaseOptions) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n\n console.log('');\n logger.warning(\n chalk.yellow('The \"release\" command is deprecated. Use \"publish-bundle\" + \"release-bundle\" instead.')\n );\n console.log('');\n logger.info(chalk.bold('SwiftPatch Release'));\n console.log('');\n\n // STEP 1: Gather Information\n let appId = options.app;\n if (!appId) {\n const configApp = await detectAppFromConfig();\n if (configApp) {\n appId = configApp;\n logger.info(`Using app from config: ${chalk.cyan(appId)}`);\n } else {\n const apps = await api.getApps(orgId);\n if (apps.length === 0) {\n logger.error('No apps found. Create one with: swiftpatch apps create');\n process.exit(1);\n }\n\n const { selectedApp } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selectedApp',\n message: 'Select app:',\n choices: apps.map(app => ({\n name: `${app.name} (${app.platform})`,\n value: app.id,\n })),\n },\n ]);\n appId = selectedApp;\n }\n }\n\n const app = await api.getApp(orgId, appId!);\n logger.info(`App: ${chalk.cyan(app.name)}`);\n\n // Platform\n let platform = options.platform;\n if (!platform) {\n if (app.platform === 'BOTH') {\n const { selectedPlatform } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selectedPlatform',\n message: 'Select platform:',\n choices: [\n { name: 'iOS', value: 'ios' },\n { name: 'Android', value: 'android' },\n ],\n },\n ]);\n platform = selectedPlatform;\n } else {\n platform = app.platform.toLowerCase() as 'ios' | 'android';\n }\n }\n logger.info(`Platform: ${chalk.cyan(platform)}`);\n\n // Target version\n let targetVersions = options.target;\n if (!targetVersions || targetVersions.length === 0) {\n const detectedVersion = await detectAppInfo(platform!);\n\n const { version } = await inquirer.prompt([\n {\n type: 'input',\n name: 'version',\n message: 'Target binary version:',\n default: detectedVersion?.version || '1.0.0',\n validate: (input: string) => {\n if (!input) return 'Version is required';\n if (!/^\\d+\\.\\d+\\.\\d+/.test(input)) return 'Invalid version format (use semver)';\n return true;\n },\n },\n ]);\n targetVersions = [version];\n }\n logger.info(`Target version: ${chalk.cyan(targetVersions.join(', '))}`);\n\n // Release notes\n let releaseNote = options.note;\n if (!releaseNote && !options.yes) {\n const { note } = await inquirer.prompt([\n {\n type: 'input',\n name: 'note',\n message: 'Release notes (optional):',\n },\n ]);\n releaseNote = note || undefined;\n }\n\n const rolloutPercent = parseInt(options.rollout || '100', 10);\n\n // STEP 2: Bundle JavaScript\n let bundlePath = options.bundlePath;\n\n if (!bundlePath) {\n const spinner = ora('Bundling JavaScript...').start();\n\n try {\n const result = await bundler.bundle({\n platform: platform!,\n entryFile: 'index.js',\n dev: false,\n });\n\n bundlePath = result.bundlePath;\n spinner.succeed(`Bundle created: ${chalk.gray(formatBytes(result.bundleSize))}`);\n } catch (error: any) {\n spinner.fail(`Bundling failed: ${error.message}`);\n process.exit(1);\n }\n } else {\n if (!await fs.pathExists(bundlePath)) {\n logger.error(`Bundle not found: ${bundlePath}`);\n process.exit(1);\n }\n logger.info(`Using existing bundle: ${chalk.gray(bundlePath)}`);\n }\n\n // STEP 3: Hash Bundle\n const spinner2 = ora('Computing bundle hash...').start();\n const bundleHash = await hashBundle(bundlePath!);\n const bundleSize = (await fs.stat(bundlePath!)).size;\n spinner2.succeed(`Bundle hash: ${chalk.gray(bundleHash.slice(0, 16))}...`);\n\n // STEP 4: Sign Bundle (optional)\n let signature: string | undefined;\n\n if (options.sign || app.signingEnabled) {\n const spinner3 = ora('Signing bundle...').start();\n\n try {\n const privateKeyPath = options.privateKey || './swiftpatch-private.pem';\n signature = await signBundle(bundlePath!, privateKeyPath);\n spinner3.succeed('Bundle signed');\n } catch (error: any) {\n spinner3.fail(`Signing failed: ${error.message}`);\n if (app.signingEnabled) {\n logger.error('Bundle signing is required for this app');\n process.exit(1);\n }\n }\n }\n\n // STEP 5: Confirm Release\n console.log('');\n console.log(chalk.bold(' Release Summary'));\n console.log('');\n console.log(` App: ${chalk.cyan(app.name)}`);\n console.log(` Platform: ${chalk.cyan(platform)}`);\n console.log(` Target: ${chalk.cyan(targetVersions.join(', '))}`);\n console.log(` Channel: ${chalk.cyan(options.channel || 'production')}`);\n console.log(` Rollout: ${chalk.cyan(rolloutPercent + '%')}`);\n console.log(` Mandatory: ${options.mandatory ? chalk.yellow('Yes') : chalk.gray('No')}`);\n console.log(` Bundle: ${chalk.gray(formatBytes(bundleSize))}`);\n console.log(` Hash: ${chalk.gray(bundleHash.slice(0, 16))}...`);\n if (signature) {\n console.log(` Signed: ${chalk.green('Yes')}`);\n }\n if (releaseNote) {\n console.log(` Notes: ${chalk.gray(releaseNote.slice(0, 50))}${releaseNote.length > 50 ? '...' : ''}`);\n }\n console.log('');\n\n if (options.dryRun) {\n logger.info('Dry run - skipping upload');\n return;\n }\n\n if (!options.yes) {\n const { confirm } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirm',\n message: 'Publish this release?',\n default: true,\n },\n ]);\n\n if (!confirm) {\n logger.info('Release cancelled');\n return;\n }\n }\n\n // STEP 6: Create Release & Upload\n const spinner4 = ora('Creating release...').start();\n\n try {\n const release = await api.createRelease(orgId, app.id, {\n version: targetVersions[0],\n platform: platform!.toUpperCase() as 'IOS' | 'ANDROID',\n targetVersions,\n isMandatory: options.mandatory || false,\n releaseNote,\n });\n\n spinner4.text = 'Uploading bundle...';\n\n await uploader.uploadBundle(release.uploadUrl, bundlePath!, (progress) => {\n spinner4.text = `Uploading bundle... ${progress}%`;\n });\n\n spinner4.text = 'Processing...';\n\n await api.completeUpload(orgId, app.id, release.id, {\n bundleHash,\n bundleSize,\n signature,\n });\n\n const finalRelease = await waitForProcessing(orgId, app.id, release.id, spinner4);\n\n spinner4.text = 'Publishing...';\n await api.publishRelease(orgId, app.id, release.id, { rolloutPercent });\n\n spinner4.succeed('Release published!');\n\n // STEP 7: Show Success\n console.log('');\n console.log(chalk.green(' Release published successfully!'));\n console.log('');\n console.log(` Version: ${chalk.cyan(finalRelease.version)}`);\n console.log(` Release ID: ${chalk.gray(release.id)}`);\n console.log(` Status: ${chalk.green('RELEASED')}`);\n console.log(` Rollout: ${chalk.cyan(rolloutPercent + '%')}`);\n console.log('');\n console.log(` View in dashboard: ${chalk.cyan(`https://app.swiftpatch.io/apps/${app.id}/releases/${release.id}`)}`);\n console.log('');\n } catch (error: any) {\n spinner4.fail(`Release failed: ${error.message}`);\n process.exit(1);\n }\n });\n\nasync function detectAppFromConfig(): Promise<string | undefined> {\n const configPaths = [\n './swiftpatch.config.js',\n './swiftpatch.config.json',\n './.swiftpatchrc',\n ];\n\n for (const configPath of configPaths) {\n if (await fs.pathExists(configPath)) {\n try {\n const config = configPath.endsWith('.js')\n ? (await import(path.resolve(configPath))).default\n : await fs.readJson(configPath);\n return config.appId || config.app;\n } catch {\n continue;\n }\n }\n }\n\n return undefined;\n}\n\nasync function waitForProcessing(\n orgId: string,\n appId: string,\n releaseId: string,\n spinner: ReturnType<typeof ora>\n): Promise<any> {\n const maxAttempts = 12; // 60 seconds max wait\n let attempts = 0;\n\n while (attempts < maxAttempts) {\n const release = await api.getRelease(orgId, appId, releaseId);\n\n if (release.status === 'READY' || release.status === 'RELEASED') {\n return release;\n }\n\n if (release.status === 'FAILED') {\n throw new Error(release.statusMessage || 'Processing failed');\n }\n\n // After 15 seconds, proceed with PROCESSING status (publish endpoint accepts it)\n if (attempts >= 3 && release.status === 'PROCESSING') {\n return release;\n }\n\n await sleep(5000);\n attempts++;\n spinner.text = `Processing... (${attempts * 5}s)`;\n }\n\n // If we hit max attempts but status is PROCESSING, still proceed\n const release = await api.getRelease(orgId, appId, releaseId);\n if (release.status === 'PROCESSING') {\n return release;\n }\n\n throw new Error('Processing timed out');\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return bytes + ' B';\n if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB';\n return (bytes / 1024 / 1024).toFixed(1) + ' MB';\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n","import { spawn } from 'child_process';\nimport path from 'path';\nimport fs from 'fs-extra';\nimport os from 'os';\n\ninterface BundleOptions {\n platform: 'ios' | 'android';\n entryFile?: string;\n dev?: boolean;\n minify?: boolean;\n sourcemap?: boolean;\n}\n\ninterface BundleResult {\n bundlePath: string;\n bundleSize: number;\n sourcemapPath?: string;\n}\n\nexport const bundler = {\n async bundle(options: BundleOptions): Promise<BundleResult> {\n const {\n platform,\n entryFile = 'index.js',\n dev = false,\n minify = true,\n sourcemap = false,\n } = options;\n\n // Create temp directory for output\n const tempDir = path.join(os.tmpdir(), `swiftpatch-bundle-${Date.now()}`);\n await fs.ensureDir(tempDir);\n\n const bundlePath = path.join(tempDir, `index.${platform}.bundle`);\n const sourcemapPath = sourcemap\n ? path.join(tempDir, `index.${platform}.bundle.map`)\n : undefined;\n\n // Build metro bundler command\n const args = [\n 'react-native',\n 'bundle',\n '--platform', platform,\n '--entry-file', entryFile,\n '--bundle-output', bundlePath,\n '--dev', String(dev),\n '--minify', String(minify),\n '--reset-cache',\n ];\n\n if (sourcemap && sourcemapPath) {\n args.push('--sourcemap-output', sourcemapPath);\n }\n\n // Run metro bundler\n await runCommand('npx', args);\n\n // Get bundle size\n const stats = await fs.stat(bundlePath);\n\n return {\n bundlePath,\n bundleSize: stats.size,\n sourcemapPath,\n };\n },\n\n async bundleWithConfig(configPath: string): Promise<BundleResult> {\n const config = await fs.readJson(configPath);\n return this.bundle(config);\n },\n};\n\nfunction runCommand(command: string, args: string[]): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n stdio: ['inherit', 'pipe', 'pipe'],\n shell: true,\n });\n\n let stderr = '';\n\n child.stdout?.on('data', () => {\n // Optionally log output\n });\n\n child.stderr?.on('data', (data: Buffer) => {\n stderr += data.toString();\n });\n\n child.on('close', (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Bundle failed: ${stderr}`));\n }\n });\n\n child.on('error', (error) => {\n reject(error);\n });\n });\n}\n","import axios from 'axios';\nimport fs from 'fs-extra';\n\ntype ProgressCallback = (percent: number) => void;\n\nexport const uploader = {\n async uploadBundle(\n uploadUrl: string,\n bundlePath: string,\n onProgress?: ProgressCallback\n ): Promise<void> {\n const fileSize = (await fs.stat(bundlePath)).size;\n const fileStream = fs.createReadStream(bundlePath);\n\n let uploadedBytes = 0;\n\n fileStream.on('data', (chunk: any) => {\n uploadedBytes += chunk.length;\n const percent = Math.round((uploadedBytes / fileSize) * 100);\n onProgress?.(percent);\n });\n\n await axios.put(uploadUrl, fileStream, {\n headers: {\n 'Content-Type': 'application/javascript',\n 'Content-Length': fileSize,\n },\n maxContentLength: Infinity,\n maxBodyLength: Infinity,\n });\n },\n\n /**\n * Upload a ZIP file to S3 via presigned URL (for publish-bundle).\n */\n async uploadZip(\n uploadUrl: string,\n zipPath: string,\n onProgress?: ProgressCallback\n ): Promise<void> {\n const fileSize = (await fs.stat(zipPath)).size;\n const fileStream = fs.createReadStream(zipPath);\n\n let uploadedBytes = 0;\n\n fileStream.on('data', (chunk: any) => {\n uploadedBytes += chunk.length;\n const percent = Math.round((uploadedBytes / fileSize) * 100);\n onProgress?.(percent);\n });\n\n await axios.put(uploadUrl, fileStream, {\n headers: {\n 'Content-Type': 'application/zip',\n 'Content-Length': fileSize,\n },\n maxContentLength: Infinity,\n maxBodyLength: Infinity,\n });\n },\n\n async uploadWithRetry(\n uploadUrl: string,\n bundlePath: string,\n onProgress?: ProgressCallback,\n maxRetries: number = 3\n ): Promise<void> {\n let lastError: Error | null = null;\n\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n try {\n await this.uploadBundle(uploadUrl, bundlePath, onProgress);\n return;\n } catch (error: any) {\n lastError = error;\n if (attempt < maxRetries) {\n await sleep(1000 * Math.pow(2, attempt));\n }\n }\n }\n\n throw lastError || new Error('Upload failed');\n },\n};\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n","import crypto from 'crypto';\nimport fs from 'fs-extra';\nimport { readFileSync } from 'fs';\n\nexport async function hashBundle(bundlePath: string): Promise<string> {\n return new Promise((resolve, reject) => {\n const hash = crypto.createHash('sha256');\n const stream = fs.createReadStream(bundlePath);\n\n stream.on('data', (chunk) => hash.update(chunk));\n stream.on('end', () => resolve(hash.digest('hex')));\n stream.on('error', reject);\n });\n}\n\nexport function hashString(content: string): string {\n return crypto.createHash('sha256').update(content).digest('hex');\n}\n\n/**\n * Calculate SHA256 hash of a ZIP file synchronously.\n * Returns null if file doesn't exist or isn't a valid file.\n */\nexport function calculateZipHash(filePath: string): string | null {\n try {\n const fileBuffer = readFileSync(filePath);\n return crypto.createHash('sha256').update(fileBuffer).digest('hex');\n } catch {\n return null;\n }\n}\n\n/**\n * Hash a single file (for manifest generation).\n */\nexport async function hashFile(filePath: string): Promise<string> {\n return new Promise((resolve, reject) => {\n const hash = crypto.createHash('sha256');\n const stream = fs.createReadStream(filePath);\n\n stream.on('data', (chunk: any) => hash.update(chunk));\n stream.on('end', () => resolve(hash.digest('hex')));\n stream.on('error', reject);\n });\n}\n","import crypto from 'crypto';\nimport fs from 'fs-extra';\nimport path from 'path';\nimport jwt from 'jsonwebtoken';\nimport { hashFile } from './hash.js';\n\nconst BUNDLE_EXTENSION = '.swiftpatchsigned';\n\n/**\n * Sign a single bundle file with RSA-SHA256 (legacy method).\n */\nexport async function signBundle(bundlePath: string, privateKeyPath: string): Promise<string> {\n const absolutePath = path.resolve(privateKeyPath);\n\n if (!await fs.pathExists(absolutePath)) {\n throw new Error(`Private key not found: ${absolutePath}`);\n }\n\n const privateKey = await fs.readFile(absolutePath, 'utf-8');\n const bundleContent = await fs.readFile(bundlePath);\n\n const sign = crypto.createSign('RSA-SHA256');\n sign.update(bundleContent);\n sign.end();\n\n const signature = sign.sign(privateKey, 'base64');\n return signature;\n}\n\n/**\n * Sign a bundle directory with JWT RS256.\n * Generates a package manifest, computes package hash, signs with JWT.\n * Outputs a .swiftpatchsigned file in the bundle directory.\n */\nexport async function signBundleDirectory(bundlePath: string, privateKeyPath: string): Promise<void> {\n if (!privateKeyPath) return;\n\n let privateKey: Buffer;\n try {\n privateKey = await fs.readFile(path.resolve(privateKeyPath));\n } catch {\n throw new Error(`The path specified for the signing key (\"${privateKeyPath}\") was not valid.`);\n }\n\n const signedFilePath = path.join(bundlePath, BUNDLE_EXTENSION);\n\n const fileHashMap = await generatePackageManifest(bundlePath, bundlePath);\n const packageHash = await computePackageHash(fileHashMap);\n\n const payload = { packageHash };\n\n try {\n const signedJwt = jwt.sign(payload, privateKey, { algorithm: 'RS256' });\n await fs.writeFile(signedFilePath, signedJwt);\n } catch (err) {\n throw new Error(`Error signing bundle: ${(err as Error).message}`);\n }\n}\n\n/**\n * Generate a manifest of SHA256 hashes for all files in a directory.\n */\nexport async function generatePackageManifest(\n directoryPath: string,\n basePath: string\n): Promise<Map<string, string>> {\n const fileHashMap = new Map<string, string>();\n const filePathList = await getFilePathsInDir(directoryPath);\n\n if (!filePathList || filePathList.length === 0) {\n throw new Error(\"Error: Can't sign the release because no files were found.\");\n }\n\n for (const filePath of filePathList) {\n const relativePath = normalizePath(path.relative(basePath, filePath));\n if (!isIgnored(relativePath)) {\n const hash = await hashFile(filePath);\n fileHashMap.set(relativePath, hash);\n }\n }\n\n return fileHashMap;\n}\n\n/**\n * Compute a package hash from a file hash manifest.\n */\nexport async function computePackageHash(fileHashMap: Map<string, string>): Promise<string> {\n let entries: string[] = [];\n fileHashMap.forEach((hash: string, name: string) => {\n entries.push(name + ':' + hash);\n });\n entries = entries.sort();\n return crypto.createHash('sha256').update(JSON.stringify(entries)).digest('hex');\n}\n\nexport async function verifySignature(\n bundlePath: string,\n signature: string,\n publicKeyPath: string\n): Promise<boolean> {\n const publicKey = await fs.readFile(publicKeyPath, 'utf-8');\n const bundleContent = await fs.readFile(bundlePath);\n\n const verify = crypto.createVerify('RSA-SHA256');\n verify.update(bundleContent);\n verify.end();\n\n return verify.verify(publicKey, signature, 'base64');\n}\n\nexport async function generateKeyPair(outputDir: string): Promise<{\n publicKeyPath: string;\n privateKeyPath: string;\n}> {\n const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', {\n modulusLength: 2048,\n publicKeyEncoding: {\n type: 'spki',\n format: 'pem',\n },\n privateKeyEncoding: {\n type: 'pkcs8',\n format: 'pem',\n },\n });\n\n const publicKeyPath = path.join(outputDir, 'swiftpatch-public.pem');\n const privateKeyPath = path.join(outputDir, 'swiftpatch-private.pem');\n\n await fs.ensureDir(outputDir);\n await fs.writeFile(publicKeyPath, publicKey);\n await fs.writeFile(privateKeyPath, privateKey, { mode: 0o600 });\n\n return { publicKeyPath, privateKeyPath };\n}\n\n/**\n * Read the bundle signature (JWT) from a signed bundle directory.\n * Returns the JWT string or null if no signature file exists.\n */\nexport async function readBundleSignature(bundlePath: string): Promise<string | null> {\n const signedFilePath = path.join(bundlePath, BUNDLE_EXTENSION);\n if (!await fs.pathExists(signedFilePath)) {\n return null;\n }\n const signature = await fs.readFile(signedFilePath, 'utf-8');\n return signature.trim();\n}\n\n// ── Helpers ─────────────────────────────────────────────────────\n\nfunction normalizePath(filePath: string): string {\n return filePath.replace(/\\\\/g, '/');\n}\n\nasync function getFilePathsInDir(dir: string): Promise<string[]> {\n const stats = await fs.stat(dir);\n if (stats.isDirectory()) {\n let files: string[] = [];\n for (const file of await fs.readdir(dir)) {\n files = files.concat(await getFilePathsInDir(path.join(dir, file)));\n }\n return files;\n } else {\n return [dir];\n }\n}\n\nfunction isIgnored(relativeFilePath: string): boolean {\n const MACOSX = '__MACOSX/';\n const DS_STORE = '.DS_Store';\n const CODEPUSH_META = '.codepushrelease';\n return (\n relativeFilePath.startsWith(MACOSX) ||\n relativeFilePath === DS_STORE ||\n relativeFilePath.endsWith('/' + DS_STORE) ||\n relativeFilePath === CODEPUSH_META ||\n relativeFilePath.endsWith('/' + CODEPUSH_META)\n );\n}\n","import fs from 'fs-extra';\nimport path from 'path';\n\ninterface AppInfo {\n version: string;\n buildNumber?: string;\n}\n\nexport async function detectPlatform(): Promise<'ios' | 'android' | null> {\n const hasIos = await fs.pathExists('./ios');\n const hasAndroid = await fs.pathExists('./android');\n\n if (hasIos && !hasAndroid) return 'ios';\n if (hasAndroid && !hasIos) return 'android';\n return null;\n}\n\nexport async function detectAppInfo(platform: string): Promise<AppInfo | null> {\n try {\n if (platform === 'ios') {\n return await detectIosVersion();\n } else {\n return await detectAndroidVersion();\n }\n } catch {\n return null;\n }\n}\n\nasync function detectIosVersion(): Promise<AppInfo | null> {\n // Try to read from package.json\n try {\n const pkg = await fs.readJson('./package.json');\n if (pkg.version) {\n return { version: pkg.version };\n }\n } catch {\n // ignore\n }\n return null;\n}\n\nasync function detectAndroidVersion(): Promise<AppInfo | null> {\n // Try to read from package.json\n try {\n const pkg = await fs.readJson('./package.json');\n if (pkg.version) {\n return { version: pkg.version };\n }\n } catch {\n // ignore\n }\n return null;\n}\n","import { Command } from 'commander';\nimport { listReleasesCommand } from './list.js';\nimport { infoReleaseCommand } from './info.js';\nimport { rolloutCommand } from './rollout.js';\nimport { rollbackCommand } from './rollback.js';\nimport { disableCommand } from './disable.js';\n\nexport const releasesCommands = new Command('releases')\n .description('Manage releases');\n\nreleasesCommands.addCommand(listReleasesCommand);\nreleasesCommands.addCommand(infoReleaseCommand);\nreleasesCommands.addCommand(rolloutCommand);\nreleasesCommands.addCommand(rollbackCommand);\nreleasesCommands.addCommand(disableCommand);\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { api } from '../../lib/api.js';\nimport { requireAuth } from '../../utils/auth-guard.js';\nimport { resolveOrgId } from '../../utils/org-resolver.js';\nimport { createTable } from '../../utils/table.js';\n\nexport const listReleasesCommand = new Command('list')\n .description('List releases for an app')\n .argument('<app-id>', 'App ID')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('--page <page>', 'Page number', '1')\n .option('--limit <limit>', 'Items per page', '20')\n .option('--json', 'Output as JSON')\n .action(async (appId, options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n const spinner = ora('Fetching releases...').start();\n\n try {\n const result = await api.getReleases(orgId, appId, {\n page: parseInt(options.page, 10),\n limit: parseInt(options.limit, 10),\n });\n spinner.stop();\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n if (result.releases.length === 0) {\n console.log('');\n console.log(chalk.gray(' No releases found.'));\n console.log('');\n console.log(' Publish one with: ' + chalk.cyan('swiftpatch release'));\n console.log('');\n return;\n }\n\n console.log('');\n console.log(chalk.bold(' Releases'));\n console.log('');\n\n const table = createTable({\n head: ['Version', 'Platform', 'Status', 'Rollout', 'Mandatory', 'Created'],\n rows: result.releases.map(r => [\n chalk.cyan(r.version),\n r.platform,\n formatStatus(r.status),\n `${r.rolloutPercent}%`,\n r.isMandatory ? chalk.yellow('Yes') : chalk.gray('No'),\n new Date(r.createdAt).toLocaleDateString(),\n ]),\n });\n\n console.log(table);\n\n if (result.pagination) {\n console.log('');\n console.log(chalk.gray(\n ` Page ${result.pagination.page} of ${result.pagination.totalPages} (${result.pagination.total} total)`\n ));\n }\n\n console.log('');\n } catch (error: any) {\n spinner.fail(`Failed to fetch releases: ${error.message}`);\n process.exit(1);\n }\n });\n\nfunction formatStatus(status: string): string {\n switch (status) {\n case 'RELEASED': return chalk.green(status);\n case 'ROLLED_BACK': return chalk.red(status);\n case 'PROCESSING': return chalk.yellow(status);\n case 'READY': return chalk.blue(status);\n case 'FAILED': return chalk.red(status);\n default: return chalk.gray(status);\n }\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport inquirer from 'inquirer';\nimport { api } from '../../lib/api.js';\nimport { requireAuth } from '../../utils/auth-guard.js';\nimport { resolveOrgId } from '../../utils/org-resolver.js';\n\nexport const infoReleaseCommand = new Command('info')\n .description('Show release details')\n .argument('<release-id>', 'Release ID')\n .option('-a, --app <app-id>', 'App ID')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('--json', 'Output as JSON')\n .action(async (releaseId, options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n\n let appId = options.app;\n if (!appId) {\n const apps = await api.getApps(orgId);\n const { selectedApp } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selectedApp',\n message: 'Select app:',\n choices: apps.map(app => ({ name: app.name, value: app.id })),\n },\n ]);\n appId = selectedApp;\n }\n\n const spinner = ora('Fetching release details...').start();\n\n try {\n const release = await api.getRelease(orgId, appId, releaseId);\n spinner.stop();\n\n if (options.json) {\n console.log(JSON.stringify(release, null, 2));\n return;\n }\n\n console.log('');\n console.log(chalk.bold(' Release Details'));\n console.log('');\n console.log(` Version: ${chalk.cyan(release.version)}`);\n console.log(` ID: ${chalk.gray(release.id)}`);\n console.log(` Platform: ${release.platform}`);\n console.log(` Status: ${formatStatus(release.status)}`);\n console.log(` Rollout: ${chalk.cyan(release.rolloutPercent + '%')}`);\n console.log(` Mandatory: ${release.isMandatory ? chalk.yellow('Yes') : chalk.gray('No')}`);\n console.log(` Bundle Size: ${chalk.gray(formatBytes(release.bundleSize))}`);\n console.log(` Bundle Hash: ${chalk.gray(release.bundleHash?.slice(0, 16) || 'N/A')}...`);\n console.log(` Created: ${new Date(release.createdAt).toLocaleString()}`);\n if (release.releasedAt) {\n console.log(` Released: ${new Date(release.releasedAt).toLocaleString()}`);\n }\n if (release.releaseNote) {\n console.log('');\n console.log(chalk.bold(' Release Notes'));\n console.log(` ${release.releaseNote}`);\n }\n console.log('');\n } catch (error: any) {\n spinner.fail(`Failed to fetch release: ${error.message}`);\n process.exit(1);\n }\n });\n\nfunction formatStatus(status: string): string {\n switch (status) {\n case 'RELEASED': return chalk.green(status);\n case 'ROLLED_BACK': return chalk.red(status);\n case 'PROCESSING': return chalk.yellow(status);\n default: return chalk.gray(status);\n }\n}\n\nfunction formatBytes(bytes: number): string {\n if (!bytes) return 'N/A';\n if (bytes < 1024) return bytes + ' B';\n if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB';\n return (bytes / 1024 / 1024).toFixed(1) + ' MB';\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport { api } from '../../lib/api.js';\nimport { requireAuth } from '../../utils/auth-guard.js';\nimport { resolveOrgId } from '../../utils/org-resolver.js';\n\nexport const rolloutCommand = new Command('rollout')\n .description('Update rollout percentage for a release')\n .argument('<release-id>', 'Release ID')\n .option('-a, --app <app-id>', 'App ID')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('-p, --percent <percent>', 'Rollout percentage (0-100)')\n .action(async (releaseId, options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n\n let appId = options.app;\n if (!appId) {\n const apps = await api.getApps(orgId);\n const { selectedApp } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selectedApp',\n message: 'Select app:',\n choices: apps.map(app => ({ name: app.name, value: app.id })),\n },\n ]);\n appId = selectedApp;\n }\n\n let rolloutPercent = options.percent ? parseInt(options.percent, 10) : null;\n\n if (rolloutPercent !== null && (isNaN(rolloutPercent) || rolloutPercent < 0 || rolloutPercent > 100)) {\n console.error(chalk.red('Rollout percentage must be a number between 0 and 100'));\n process.exit(1);\n }\n\n if (rolloutPercent === null) {\n const release = await api.getRelease(orgId, appId, releaseId);\n\n const { percent } = await inquirer.prompt([\n {\n type: 'number',\n name: 'percent',\n message: `Current rollout: ${release.rolloutPercent}%. New percentage:`,\n default: release.rolloutPercent,\n validate: (input: number) => {\n if (input < 0 || input > 100) return 'Must be between 0 and 100';\n return true;\n },\n },\n ]);\n rolloutPercent = percent;\n }\n\n const spinner = ora('Updating rollout...').start();\n\n try {\n const release = await api.updateRollout(orgId, appId, releaseId, rolloutPercent!);\n spinner.succeed(`Rollout updated to ${chalk.cyan(rolloutPercent + '%')}`);\n\n console.log('');\n console.log(` Release: ${chalk.gray(release.version)}`);\n console.log(` Status: ${chalk.green(release.status)}`);\n console.log(` Rollout: ${chalk.cyan(release.rolloutPercent + '%')}`);\n console.log('');\n } catch (error: any) {\n spinner.fail(`Failed to update rollout: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport { api } from '../../lib/api.js';\nimport { requireAuth } from '../../utils/auth-guard.js';\nimport { resolveOrgId } from '../../utils/org-resolver.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const rollbackCommand = new Command('rollback')\n .description('Rollback (disable) a release')\n .argument('<release-id>', 'Release ID')\n .option('-a, --app <app-id>', 'App ID')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('-r, --reason <reason>', 'Rollback reason')\n .option('-y, --yes', 'Skip confirmation')\n .action(async (releaseId, options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n\n let appId = options.app;\n if (!appId) {\n const apps = await api.getApps(orgId);\n const { selectedApp } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selectedApp',\n message: 'Select app:',\n choices: apps.map(app => ({ name: app.name, value: app.id })),\n },\n ]);\n appId = selectedApp;\n }\n\n const release = await api.getRelease(orgId, appId, releaseId);\n\n console.log('');\n logger.warning('You are about to rollback this release:');\n console.log('');\n console.log(` Version: ${chalk.cyan(release.version)}`);\n console.log(` Platform: ${release.platform}`);\n console.log(` Status: ${release.status}`);\n console.log(` Rollout: ${release.rolloutPercent}%`);\n console.log('');\n\n if (!options.yes) {\n const { confirm } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirm',\n message: 'Are you sure you want to rollback this release?',\n default: false,\n },\n ]);\n\n if (!confirm) {\n logger.info('Rollback cancelled');\n return;\n }\n }\n\n let reason = options.reason;\n if (!reason && !options.yes) {\n const { inputReason } = await inquirer.prompt([\n {\n type: 'input',\n name: 'inputReason',\n message: 'Reason for rollback (optional):',\n },\n ]);\n reason = inputReason || undefined;\n }\n\n const spinner = ora('Rolling back release...').start();\n\n try {\n await api.rollbackRelease(orgId, appId, releaseId, reason);\n spinner.succeed('Release rolled back');\n\n console.log('');\n console.log(chalk.yellow(' Release has been disabled'));\n console.log(chalk.gray(' Users will no longer receive this update'));\n console.log('');\n } catch (error: any) {\n spinner.fail(`Rollback failed: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport { api } from '../../lib/api.js';\nimport { requireAuth } from '../../utils/auth-guard.js';\nimport { resolveOrgId } from '../../utils/org-resolver.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const disableCommand = new Command('disable')\n .description('Disable a release (stops serving to new devices)')\n .argument('<release-id>', 'Release ID')\n .option('-a, --app <app-id>', 'App ID')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('-r, --reason <reason>', 'Reason for disabling')\n .option('-y, --yes', 'Skip confirmation')\n .action(async (releaseId, options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n\n let appId = options.app;\n if (!appId) {\n const apps = await api.getApps(orgId);\n const { selectedApp } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selectedApp',\n message: 'Select app:',\n choices: apps.map(app => ({ name: app.name, value: app.id })),\n },\n ]);\n appId = selectedApp;\n }\n\n const release = await api.getRelease(orgId, appId, releaseId);\n\n console.log('');\n logger.warning('You are about to disable this release:');\n console.log('');\n console.log(` Version: ${chalk.cyan(release.version)}`);\n console.log(` Platform: ${release.platform}`);\n console.log(` Status: ${release.status}`);\n console.log(` Rollout: ${release.rolloutPercent}%`);\n console.log('');\n\n if (!options.yes) {\n const { confirm } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirm',\n message: 'Are you sure you want to disable this release?',\n default: false,\n },\n ]);\n\n if (!confirm) {\n logger.info('Cancelled');\n return;\n }\n }\n\n let reason = options.reason;\n if (!reason && !options.yes) {\n const { inputReason } = await inquirer.prompt([\n {\n type: 'input',\n name: 'inputReason',\n message: 'Reason for disabling (optional):',\n },\n ]);\n reason = inputReason || undefined;\n }\n\n const spinner = ora('Disabling release...').start();\n\n try {\n await api.disableRelease(orgId, appId, releaseId, reason);\n spinner.succeed('Release disabled');\n\n console.log('');\n console.log(chalk.yellow(' Release has been disabled'));\n console.log(chalk.gray(' New devices will not receive this update'));\n console.log(chalk.gray(' Devices that already installed it are unaffected'));\n console.log('');\n } catch (error: any) {\n spinner.fail(`Failed to disable release: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport { listChannelsCommand } from './list.js';\nimport { createChannelCommand } from './create.js';\nimport { updateChannelCommand } from './update.js';\nimport { deleteChannelCommand } from './delete.js';\n\nexport const channelsCommands = new Command('channels')\n .description('Manage channels');\n\nchannelsCommands.addCommand(listChannelsCommand);\nchannelsCommands.addCommand(createChannelCommand);\nchannelsCommands.addCommand(updateChannelCommand);\nchannelsCommands.addCommand(deleteChannelCommand);\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { api } from '../../lib/api.js';\nimport { requireAuth } from '../../utils/auth-guard.js';\nimport { resolveOrgId } from '../../utils/org-resolver.js';\nimport { createTable } from '../../utils/table.js';\n\nexport const listChannelsCommand = new Command('list')\n .description('List channels for an app')\n .argument('<app-id>', 'App ID')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('--json', 'Output as JSON')\n .action(async (appId, options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n const spinner = ora('Fetching channels...').start();\n\n try {\n const channels = await api.getChannels(orgId, appId);\n spinner.stop();\n\n if (options.json) {\n console.log(JSON.stringify(channels, null, 2));\n return;\n }\n\n if (channels.length === 0) {\n console.log('');\n console.log(chalk.gray(' No channels found.'));\n console.log('');\n return;\n }\n\n console.log('');\n console.log(chalk.bold(' Channels'));\n console.log('');\n\n const table = createTable({\n head: ['Name', 'Slug', 'Created'],\n rows: channels.map(ch => [\n chalk.cyan(ch.name),\n chalk.gray(ch.slug),\n new Date(ch.createdAt).toLocaleDateString(),\n ]),\n });\n\n console.log(table);\n console.log('');\n } catch (error: any) {\n spinner.fail(`Failed to fetch channels: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport { api } from '../../lib/api.js';\nimport { requireAuth } from '../../utils/auth-guard.js';\nimport { resolveOrgId } from '../../utils/org-resolver.js';\n\nexport const createChannelCommand = new Command('create')\n .description('Create a new channel')\n .argument('<app-id>', 'App ID')\n .option('-n, --name <name>', 'Channel name')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('--json', 'Output as JSON')\n .action(async (appId, options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n\n let channelName = options.name;\n if (!channelName) {\n const { name } = await inquirer.prompt([\n {\n type: 'input',\n name: 'name',\n message: 'Channel name:',\n validate: (input: string) => {\n if (!input.trim()) return 'Channel name is required';\n return true;\n },\n },\n ]);\n channelName = name;\n }\n\n const spinner = ora('Creating channel...').start();\n\n try {\n const channel = await api.createChannel(orgId, appId, { name: channelName });\n spinner.succeed('Channel created!');\n\n if (options.json) {\n console.log(JSON.stringify(channel, null, 2));\n return;\n }\n\n console.log('');\n console.log(` Name: ${chalk.cyan(channel.name)}`);\n console.log(` Slug: ${chalk.gray(channel.slug)}`);\n console.log('');\n } catch (error: any) {\n spinner.fail(`Failed to create channel: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport { api } from '../../lib/api.js';\nimport { requireAuth } from '../../utils/auth-guard.js';\nimport { resolveOrgId } from '../../utils/org-resolver.js';\n\nexport const updateChannelCommand = new Command('update')\n .description('Update a channel')\n .argument('<app-id>', 'App ID')\n .argument('<channel-id>', 'Channel ID')\n .option('-n, --name <name>', 'New channel name')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('--json', 'Output as JSON')\n .action(async (appId, channelId, options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n\n let channelName = options.name;\n if (!channelName) {\n const answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'name',\n message: 'New channel name:',\n validate: (input: string) => {\n if (!input.trim()) return 'Channel name is required';\n return true;\n },\n },\n ]);\n channelName = answers.name;\n }\n\n const spinner = ora('Updating channel...').start();\n\n try {\n const channel = await api.updateChannel(orgId, appId, channelId, { name: channelName });\n spinner.succeed('Channel updated!');\n\n if (options.json) {\n console.log(JSON.stringify(channel, null, 2));\n return;\n }\n\n console.log('');\n console.log(` Name: ${chalk.cyan(channel.name)}`);\n console.log(` Slug: ${chalk.gray(channel.slug)}`);\n console.log('');\n } catch (error: any) {\n spinner.fail(`Failed to update channel: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport { api } from '../../lib/api.js';\nimport { requireAuth } from '../../utils/auth-guard.js';\nimport { resolveOrgId } from '../../utils/org-resolver.js';\n\nexport const deleteChannelCommand = new Command('delete')\n .description('Delete a channel')\n .argument('<app-id>', 'App ID')\n .argument('<channel-id>', 'Channel ID')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('-y, --yes', 'Skip confirmation')\n .action(async (appId, channelId, options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n\n if (!options.yes) {\n const { confirm } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirm',\n message: 'Are you sure you want to delete this channel? This cannot be undone.',\n default: false,\n },\n ]);\n\n if (!confirm) {\n console.log(chalk.gray(' Cancelled'));\n return;\n }\n }\n\n const spinner = ora('Deleting channel...').start();\n\n try {\n await api.deleteChannel(orgId, appId, channelId);\n spinner.succeed('Channel deleted');\n console.log('');\n } catch (error: any) {\n spinner.fail(`Failed to delete channel: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport { listCITokensCommand } from './list.js';\nimport { createCITokenCommand } from './create.js';\nimport { deleteCITokenCommand } from './delete.js';\nimport { regenerateCITokenCommand } from './regenerate.js';\n\nexport const ciTokensCommands = new Command('ci-tokens')\n .description('Manage CI/CD tokens');\n\nciTokensCommands.addCommand(listCITokensCommand);\nciTokensCommands.addCommand(createCITokenCommand);\nciTokensCommands.addCommand(deleteCITokenCommand);\nciTokensCommands.addCommand(regenerateCITokenCommand);\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport { api } from '../../lib/api.js';\nimport { requireAuth } from '../../utils/auth-guard.js';\nimport { resolveOrgId } from '../../utils/org-resolver.js';\nimport { createTable } from '../../utils/table.js';\n\nexport const listCITokensCommand = new Command('list')\n .description('List CI tokens for an app')\n .argument('[app-id]', 'App ID')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('--json', 'Output as JSON')\n .action(async (appId, options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n\n if (!appId) {\n const apps = await api.getApps(orgId);\n const { selectedApp } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selectedApp',\n message: 'Select app:',\n choices: apps.map(app => ({ name: app.name, value: app.id })),\n },\n ]);\n appId = selectedApp;\n }\n\n const spinner = ora('Fetching CI tokens...').start();\n\n try {\n const tokens = await api.getCITokens(orgId, appId);\n spinner.stop();\n\n if (options.json) {\n console.log(JSON.stringify(tokens, null, 2));\n return;\n }\n\n if (tokens.length === 0) {\n console.log('');\n console.log(chalk.gray(' No CI tokens found.'));\n console.log(chalk.gray(' Create one with: swiftpatch ci-tokens create'));\n console.log('');\n return;\n }\n\n console.log('');\n console.log(chalk.bold(' CI Tokens'));\n console.log('');\n\n const table = createTable({\n head: ['Name', 'Prefix', 'Status', 'Uses', 'Last Used', 'Created'],\n rows: tokens.map(t => [\n chalk.cyan(t.name),\n chalk.gray(t.tokenPrefix + '...'),\n t.isActive ? chalk.green('Active') : chalk.red('Revoked'),\n String(t.usageCount),\n t.lastUsedAt ? new Date(t.lastUsedAt).toLocaleDateString() : chalk.gray('Never'),\n new Date(t.createdAt).toLocaleDateString(),\n ]),\n });\n\n console.log(table);\n console.log('');\n } catch (error: any) {\n spinner.fail(`Failed to fetch CI tokens: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport { api } from '../../lib/api.js';\nimport { requireAuth } from '../../utils/auth-guard.js';\nimport { resolveOrgId } from '../../utils/org-resolver.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const createCITokenCommand = new Command('create')\n .description('Create a new CI token')\n .argument('[app-id]', 'App ID')\n .option('-n, --name <name>', 'Token name')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('--json', 'Output as JSON')\n .action(async (appId, options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n\n if (!appId) {\n const apps = await api.getApps(orgId);\n const { selectedApp } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selectedApp',\n message: 'Select app:',\n choices: apps.map(app => ({ name: app.name, value: app.id })),\n },\n ]);\n appId = selectedApp;\n }\n\n let tokenName = options.name;\n if (!tokenName) {\n const answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'name',\n message: 'Token name (e.g., \"GitHub Actions\", \"Jenkins\"):',\n validate: (input: string) => {\n if (!input.trim()) return 'Token name is required';\n return true;\n },\n },\n ]);\n tokenName = answers.name;\n }\n\n const spinner = ora('Creating CI token...').start();\n\n try {\n const result = await api.createCIToken(orgId, appId, tokenName);\n spinner.succeed('CI token created!');\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n console.log('');\n console.log(chalk.bold(' Your CI Token (shown only once):'));\n console.log('');\n console.log(` ${chalk.green(result.token)}`);\n console.log('');\n logger.warning('Save this token now. It will not be shown again.');\n console.log('');\n console.log(chalk.gray(' Usage in CI/CD:'));\n console.log(chalk.gray(' $ swiftpatch publish-bundle -p ios --ci-token <token>'));\n console.log(chalk.gray(' $ swiftpatch release-bundle --hash <hash> --app-version 1.0.0 --ci-token <token>'));\n console.log('');\n console.log(chalk.gray(' Or set as environment variable:'));\n console.log(chalk.gray(' $ export SWIFTPATCH_CI_TOKEN=<token>'));\n console.log('');\n } catch (error: any) {\n spinner.fail(`Failed to create CI token: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport { api } from '../../lib/api.js';\nimport { requireAuth } from '../../utils/auth-guard.js';\nimport { resolveOrgId } from '../../utils/org-resolver.js';\n\nexport const deleteCITokenCommand = new Command('delete')\n .description('Revoke a CI token')\n .argument('<token-id>', 'Token ID')\n .option('-a, --app <app-id>', 'App ID')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('-y, --yes', 'Skip confirmation')\n .action(async (tokenId, options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n\n let appId = options.app;\n if (!appId) {\n const apps = await api.getApps(orgId);\n const { selectedApp } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selectedApp',\n message: 'Select app:',\n choices: apps.map(app => ({ name: app.name, value: app.id })),\n },\n ]);\n appId = selectedApp;\n }\n\n if (!options.yes) {\n const { confirm } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirm',\n message: 'Are you sure you want to revoke this CI token? Any pipelines using it will stop working.',\n default: false,\n },\n ]);\n\n if (!confirm) {\n console.log(chalk.gray(' Cancelled'));\n return;\n }\n }\n\n const spinner = ora('Revoking CI token...').start();\n\n try {\n await api.deleteCIToken(orgId, appId, tokenId);\n spinner.succeed('CI token revoked');\n console.log('');\n } catch (error: any) {\n spinner.fail(`Failed to revoke CI token: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport { api } from '../../lib/api.js';\nimport { requireAuth } from '../../utils/auth-guard.js';\nimport { resolveOrgId } from '../../utils/org-resolver.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const regenerateCITokenCommand = new Command('regenerate')\n .description('Regenerate a CI token (revokes old one)')\n .argument('<token-id>', 'Token ID')\n .option('-a, --app <app-id>', 'App ID')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('-y, --yes', 'Skip confirmation')\n .option('--json', 'Output as JSON')\n .action(async (tokenId, options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n\n let appId = options.app;\n if (!appId) {\n const apps = await api.getApps(orgId);\n const { selectedApp } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selectedApp',\n message: 'Select app:',\n choices: apps.map(app => ({ name: app.name, value: app.id })),\n },\n ]);\n appId = selectedApp;\n }\n\n if (!options.yes) {\n const { confirm } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirm',\n message: 'This will revoke the old token. Pipelines using it will need to be updated. Continue?',\n default: false,\n },\n ]);\n\n if (!confirm) {\n console.log(chalk.gray(' Cancelled'));\n return;\n }\n }\n\n const spinner = ora('Regenerating CI token...').start();\n\n try {\n const result = await api.regenerateCIToken(orgId, appId, tokenId);\n spinner.succeed('CI token regenerated!');\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n console.log('');\n console.log(chalk.bold(' Your new CI Token (shown only once):'));\n console.log('');\n console.log(` ${chalk.green(result.token)}`);\n console.log('');\n logger.warning('Save this token now. It will not be shown again.');\n logger.warning('The old token has been revoked.');\n console.log('');\n } catch (error: any) {\n spinner.fail(`Failed to regenerate CI token: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport { listWebhooksCommand } from './list.js';\nimport { createWebhookCommand } from './create.js';\nimport { updateWebhookCommand } from './update.js';\nimport { deleteWebhookCommand } from './delete.js';\nimport { testWebhookCommand } from './test.js';\n\nexport const webhooksCommands = new Command('webhooks')\n .description('Manage webhooks');\n\nwebhooksCommands.addCommand(listWebhooksCommand);\nwebhooksCommands.addCommand(createWebhookCommand);\nwebhooksCommands.addCommand(updateWebhookCommand);\nwebhooksCommands.addCommand(deleteWebhookCommand);\nwebhooksCommands.addCommand(testWebhookCommand);\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { api } from '../../lib/api.js';\nimport { requireAuth } from '../../utils/auth-guard.js';\nimport { resolveOrgId } from '../../utils/org-resolver.js';\nimport { createTable } from '../../utils/table.js';\n\nexport const listWebhooksCommand = new Command('list')\n .description('List webhooks')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n const spinner = ora('Fetching webhooks...').start();\n\n try {\n const webhooks = await api.getWebhooks(orgId);\n spinner.stop();\n\n if (options.json) {\n console.log(JSON.stringify(webhooks, null, 2));\n return;\n }\n\n if (webhooks.length === 0) {\n console.log('');\n console.log(chalk.gray(' No webhooks configured.'));\n console.log(chalk.gray(' Create one with: swiftpatch webhooks create'));\n console.log('');\n return;\n }\n\n console.log('');\n console.log(chalk.bold(' Webhooks'));\n console.log('');\n\n const table = createTable({\n head: ['ID', 'URL', 'Events', 'Status', 'Deliveries'],\n rows: webhooks.map(w => [\n chalk.gray(w.id.slice(0, 8) + '...'),\n chalk.cyan(w.url.length > 40 ? w.url.slice(0, 40) + '...' : w.url),\n w.events.join(', '),\n w.isActive ? chalk.green('Active') : chalk.red('Inactive'),\n w.stats ? `${w.stats.successfulDeliveries}/${w.stats.totalDeliveries}` : '0/0',\n ]),\n });\n\n console.log(table);\n console.log('');\n } catch (error: any) {\n spinner.fail(`Failed to fetch webhooks: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport { api } from '../../lib/api.js';\nimport { requireAuth } from '../../utils/auth-guard.js';\nimport { resolveOrgId } from '../../utils/org-resolver.js';\n\nconst WEBHOOK_EVENTS = [\n 'release.published',\n 'release.disabled',\n 'update.success',\n 'update.failed',\n 'app.created',\n 'app.deleted',\n];\n\nexport const createWebhookCommand = new Command('create')\n .description('Create a webhook')\n .option('-u, --url <url>', 'Webhook URL')\n .option('-e, --events <events...>', 'Events to subscribe to')\n .option('-s, --secret <secret>', 'Webhook signing secret')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n\n let url = options.url;\n if (!url) {\n const answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'url',\n message: 'Webhook URL:',\n validate: (input: string) => {\n if (!input.trim()) return 'URL is required';\n try {\n new URL(input);\n return true;\n } catch {\n return 'Invalid URL';\n }\n },\n },\n ]);\n url = answers.url;\n }\n\n let events = options.events;\n if (!events || events.length === 0) {\n const answers = await inquirer.prompt([\n {\n type: 'checkbox',\n name: 'events',\n message: 'Select events to subscribe to:',\n choices: WEBHOOK_EVENTS,\n validate: (input: string[]) => {\n if (input.length === 0) return 'Select at least one event';\n return true;\n },\n },\n ]);\n events = answers.events;\n }\n\n const spinner = ora('Creating webhook...').start();\n\n try {\n const webhook = await api.createWebhook(orgId, {\n url,\n events,\n secret: options.secret,\n });\n spinner.succeed('Webhook created!');\n\n if (options.json) {\n console.log(JSON.stringify(webhook, null, 2));\n return;\n }\n\n console.log('');\n console.log(` ID: ${chalk.gray(webhook.id)}`);\n console.log(` URL: ${chalk.cyan(webhook.url)}`);\n console.log(` Events: ${webhook.events.join(', ')}`);\n if (webhook.secret) {\n console.log(` Secret: ${chalk.green(webhook.secret)}`);\n console.log(chalk.yellow(' Save this secret — it will not be shown again.'));\n }\n console.log('');\n } catch (error: any) {\n spinner.fail(`Failed to create webhook: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { api } from '../../lib/api.js';\nimport { requireAuth } from '../../utils/auth-guard.js';\nimport { resolveOrgId } from '../../utils/org-resolver.js';\n\nexport const updateWebhookCommand = new Command('update')\n .description('Update a webhook')\n .argument('<webhook-id>', 'Webhook ID')\n .option('-u, --url <url>', 'New URL')\n .option('-e, --events <events...>', 'New events list')\n .option('-s, --secret <secret>', 'New signing secret')\n .option('--enable', 'Enable webhook')\n .option('--disable', 'Disable webhook')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('--json', 'Output as JSON')\n .action(async (webhookId, options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n\n const params: Record<string, any> = {};\n if (options.url) params.url = options.url;\n if (options.events) params.events = options.events;\n if (options.secret) params.secret = options.secret;\n if (options.enable) params.isActive = true;\n if (options.disable) params.isActive = false;\n\n if (Object.keys(params).length === 0) {\n console.log(chalk.yellow(' No changes specified. Use --url, --events, --secret, --enable, or --disable'));\n process.exit(1);\n }\n\n const spinner = ora('Updating webhook...').start();\n\n try {\n const webhook = await api.updateWebhook(orgId, webhookId, params);\n spinner.succeed('Webhook updated!');\n\n if (options.json) {\n console.log(JSON.stringify(webhook, null, 2));\n return;\n }\n\n console.log('');\n console.log(` URL: ${chalk.cyan(webhook.url)}`);\n console.log(` Events: ${webhook.events.join(', ')}`);\n console.log(` Status: ${webhook.isActive ? chalk.green('Active') : chalk.red('Inactive')}`);\n console.log('');\n } catch (error: any) {\n spinner.fail(`Failed to update webhook: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport { api } from '../../lib/api.js';\nimport { requireAuth } from '../../utils/auth-guard.js';\nimport { resolveOrgId } from '../../utils/org-resolver.js';\n\nexport const deleteWebhookCommand = new Command('delete')\n .description('Delete a webhook')\n .argument('<webhook-id>', 'Webhook ID')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('-y, --yes', 'Skip confirmation')\n .action(async (webhookId, options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n\n if (!options.yes) {\n const { confirm } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirm',\n message: 'Are you sure you want to delete this webhook?',\n default: false,\n },\n ]);\n\n if (!confirm) {\n console.log(chalk.gray(' Cancelled'));\n return;\n }\n }\n\n const spinner = ora('Deleting webhook...').start();\n\n try {\n await api.deleteWebhook(orgId, webhookId);\n spinner.succeed('Webhook deleted');\n console.log('');\n } catch (error: any) {\n spinner.fail(`Failed to delete webhook: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { api } from '../../lib/api.js';\nimport { requireAuth } from '../../utils/auth-guard.js';\nimport { resolveOrgId } from '../../utils/org-resolver.js';\n\nexport const testWebhookCommand = new Command('test')\n .description('Send a test event to a webhook')\n .argument('<webhook-id>', 'Webhook ID')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('--json', 'Output as JSON')\n .action(async (webhookId, options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n const spinner = ora('Sending test event...').start();\n\n try {\n const result = await api.testWebhook(orgId, webhookId);\n\n if (result.success) {\n spinner.succeed(`Test event delivered (status ${result.statusCode})`);\n } else {\n spinner.fail(`Test event failed: ${result.error || 'Unknown error'}`);\n }\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n console.log('');\n } catch (error: any) {\n spinner.fail(`Failed to send test event: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { api } from '../lib/api.js';\nimport { requireAuth } from '../utils/auth-guard.js';\nimport { resolveOrgId } from '../utils/org-resolver.js';\n\nexport const analyticsCommand = new Command('analytics')\n .description('View analytics for an app')\n .argument('<app-id>', 'App ID')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('-r, --release <release-id>', 'Filter by release')\n .option('-d, --days <days>', 'Time range in days', '7')\n .option('--json', 'Output as JSON')\n .action(async (appId, options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n const spinner = ora('Fetching analytics...').start();\n\n try {\n const analytics = await api.getAnalytics(orgId, appId, {\n days: parseInt(options.days, 10),\n releaseId: options.release,\n });\n spinner.stop();\n\n if (options.json) {\n console.log(JSON.stringify(analytics, null, 2));\n return;\n }\n\n console.log('');\n console.log(chalk.bold(' Analytics Overview'));\n console.log('');\n console.log(` Total Updates: ${chalk.cyan((analytics.totalUpdates ?? 0).toLocaleString())}`);\n console.log(` Success Rate: ${chalk.green((analytics.successRate ?? 0).toFixed(1) + '%')}`);\n console.log(` Avg Patch Size: ${chalk.cyan(formatBytes(analytics.avgPatchSize ?? 0))}`);\n console.log(` Bandwidth Saved: ${chalk.green(formatBytes(analytics.bandwidthSaved ?? 0))}`);\n console.log(` Bandwidth Used: ${chalk.gray(formatBytes(analytics.totalBandwidthUsed ?? 0))}`);\n console.log('');\n } catch (error: any) {\n spinner.fail(`Failed to fetch analytics: ${error.message}`);\n process.exit(1);\n }\n });\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return bytes + ' B';\n if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB';\n return (bytes / 1024 / 1024).toFixed(1) + ' MB';\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { api } from '../lib/api.js';\nimport { requireAuth } from '../utils/auth-guard.js';\nimport { resolveOrgId } from '../utils/org-resolver.js';\nimport { aiDoctorCommand } from './ai-doctor.js';\nimport { aiExplainCommand } from './ai-explain.js';\nimport { aiReviewCommand } from './ai-review.js';\n\nexport const aiCommand = new Command('ai')\n .description('AI-powered release intelligence');\n\n// ── Claude AI local commands (doctor, explain, review) ─────\n\naiCommand.addCommand(aiDoctorCommand);\naiCommand.addCommand(aiExplainCommand);\naiCommand.addCommand(aiReviewCommand);\n\n// ── Ask AI ──────────────────────────────────────────────────\n\naiCommand\n .command('ask')\n .description('Ask AI about your releases, crashes, or deployment strategy')\n .argument('<question>', 'Your question')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('-a, --app <app-id>', 'App ID for context')\n .action(async (question, options) => {\n await requireAuth();\n const orgId = await resolveOrgId(options.org);\n\n process.stdout.write(chalk.dim('AI: '));\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 60_000);\n\n try {\n const response = await fetch(\n `${api.getBaseUrl()}/orgs/${orgId}/ai/chat`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...api.getAuthHeaders(),\n },\n body: JSON.stringify({\n message: question,\n context: {\n page: 'cli',\n ...(options.app ? { entityType: 'app', entityId: options.app } : {}),\n },\n }),\n signal: controller.signal,\n }\n );\n\n if (!response.ok) {\n throw new Error(`Request failed: ${response.status} ${response.statusText}`);\n }\n\n if (!response.body) {\n throw new Error('No response body');\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6).trim();\n if (data === '[DONE]') break;\n try {\n const parsed = JSON.parse(data);\n const text = parsed.content || parsed.text || parsed.delta?.content || '';\n if (text) process.stdout.write(text);\n } catch {\n // Not JSON, write raw\n process.stdout.write(data);\n }\n }\n }\n }\n\n console.log('');\n console.log('');\n } catch (error: any) {\n console.log('');\n if (error.name === 'AbortError') {\n console.error(chalk.red('AI request timed out after 60 seconds.'));\n } else {\n console.error(chalk.red(`Failed: ${error.message}`));\n }\n process.exit(1);\n } finally {\n clearTimeout(timeout);\n }\n });\n\n// ── Risk Score ──────────────────────────────────────────────\n\naiCommand\n .command('risk-score')\n .description('Get AI risk assessment for a release')\n .option('-o, --org <org-id>', 'Organization ID')\n .requiredOption('-a, --app <app-id>', 'App ID')\n .requiredOption('-r, --release <release-id>', 'Release ID')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n await requireAuth();\n const orgId = await resolveOrgId(options.org);\n const spinner = ora('Assessing release risk...').start();\n\n try {\n const assessment = await api.aiRiskAssessment(orgId, options.app, options.release);\n spinner.stop();\n\n if (options.json) {\n console.log(JSON.stringify(assessment, null, 2));\n return;\n }\n\n const levelColors: Record<string, (s: string) => string> = {\n LOW: chalk.green,\n MEDIUM: chalk.yellow,\n HIGH: chalk.hex('#f97316'),\n CRITICAL: chalk.red,\n };\n\n const colorFn = levelColors[assessment.level] || chalk.white;\n\n console.log('');\n console.log(chalk.bold(' Risk Assessment'));\n console.log('');\n console.log(` Score: ${colorFn(String(assessment.score) + '/100')}`);\n console.log(` Level: ${colorFn(assessment.level)}`);\n console.log('');\n console.log(chalk.bold(' Risk Factors:'));\n for (const factor of assessment.factors) {\n const bar = '\\u2588'.repeat(factor.impact) + '\\u2591'.repeat(10 - factor.impact);\n console.log(` ${bar} ${factor.factor}`);\n console.log(` ${chalk.gray(factor.description)}`);\n }\n console.log('');\n console.log(chalk.bold(' Recommendation:'));\n console.log(` ${assessment.recommendation}`);\n console.log('');\n } catch (error: any) {\n spinner.fail(`Failed: ${error.message}`);\n process.exit(1);\n }\n });\n\n// ── Crash Groups ────────────────────────────────────────────\n\naiCommand\n .command('crashes')\n .description('List AI-grouped crash reports for an app')\n .option('-o, --org <org-id>', 'Organization ID')\n .requiredOption('-a, --app <app-id>', 'App ID')\n .option('-s, --status <status>', 'Filter by status (OPEN, RESOLVED, IGNORED)', 'OPEN')\n .option('-l, --limit <limit>', 'Maximum number of results', '10')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n await requireAuth();\n const orgId = await resolveOrgId(options.org);\n const spinner = ora('Fetching crash groups...').start();\n\n try {\n const groups = await api.aiCrashGroups(orgId, options.app, {\n status: options.status,\n limit: parseInt(options.limit, 10),\n });\n spinner.stop();\n\n if (options.json) {\n console.log(JSON.stringify(groups, null, 2));\n return;\n }\n\n if (groups.length === 0) {\n console.log(chalk.green('\\n No crash groups found. Your app is running smoothly!\\n'));\n return;\n }\n\n console.log('');\n console.log(chalk.bold(` Crash Groups (${groups.length})`));\n console.log('');\n\n const severityColors: Record<string, (s: string) => string> = {\n CRITICAL: chalk.red,\n HIGH: chalk.hex('#f97316'),\n MEDIUM: chalk.yellow,\n LOW: chalk.blue,\n };\n\n for (const group of groups) {\n const colorFn = severityColors[group.severity] || chalk.white;\n console.log(` ${colorFn(`[${group.severity}]`)} ${group.title}`);\n console.log(` ${chalk.gray(`${group.occurrenceCount} occurrences \\u00b7 ${group.affectedDevices} devices \\u00b7 ${group.category}`)}`);\n if (group.aiAnalysis) {\n console.log(` ${chalk.cyan('AI:')} ${group.aiAnalysis.rootCause.slice(0, 100)}${group.aiAnalysis.rootCause.length > 100 ? '...' : ''}`);\n }\n console.log('');\n }\n } catch (error: any) {\n spinner.fail(`Failed: ${error.message}`);\n process.exit(1);\n }\n });\n\n// ── AI Insights ─────────────────────────────────────────────\n\naiCommand\n .command('insights')\n .description('View AI-generated insights for an app')\n .option('-o, --org <org-id>', 'Organization ID')\n .requiredOption('-a, --app <app-id>', 'App ID')\n .option('-s, --status <status>', 'Filter by status (ACTIVE, ACKNOWLEDGED, DISMISSED)', 'ACTIVE')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n await requireAuth();\n const orgId = await resolveOrgId(options.org);\n const spinner = ora('Fetching AI insights...').start();\n\n try {\n const insights = await api.aiInsights(orgId, options.app, {\n status: options.status,\n });\n spinner.stop();\n\n if (options.json) {\n console.log(JSON.stringify(insights, null, 2));\n return;\n }\n\n if (insights.length === 0) {\n console.log(chalk.green('\\n No active insights. All systems nominal!\\n'));\n return;\n }\n\n console.log('');\n console.log(chalk.bold(` AI Insights (${insights.length})`));\n console.log('');\n\n const priorityColors: Record<string, (s: string) => string> = {\n CRITICAL: chalk.red,\n HIGH: chalk.hex('#f97316'),\n MEDIUM: chalk.yellow,\n LOW: chalk.blue,\n INFO: chalk.gray,\n };\n\n for (const insight of insights) {\n const colorFn = priorityColors[insight.priority] || chalk.white;\n console.log(` ${colorFn(`[${insight.priority}]`)} ${insight.title}`);\n console.log(` ${chalk.gray(insight.summary)}`);\n if (insight.actionItems.length > 0) {\n for (const item of insight.actionItems) {\n console.log(` ${chalk.cyan('\\u2192')} ${item}`);\n }\n }\n console.log('');\n }\n } catch (error: any) {\n spinner.fail(`Failed: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport path from 'path';\nimport fs from 'fs-extra';\nimport { claudeChat } from '../lib/claude.js';\nimport { logger } from '../utils/logger.js';\nimport { requireConsent } from '../utils/consent.js';\n\ninterface DoctorDiagnostics {\n projectRoot: string;\n packageJson: Record<string, any> | null;\n reactNativeVersion: string | null;\n nativeDeps: string[];\n assets: { name: string; sizeKB: number }[];\n hermesEnabled: boolean;\n hasSigningKey: boolean;\n podfileLockHash: string | null;\n gradleDeps: string[];\n warnings: string[];\n}\n\n/**\n * Collect local project diagnostics without executing user code.\n * All file reads use static analysis only — no evals, no shell commands.\n */\nasync function collectDiagnostics(projectRoot: string): Promise<DoctorDiagnostics> {\n const diag: DoctorDiagnostics = {\n projectRoot,\n packageJson: null,\n reactNativeVersion: null,\n nativeDeps: [],\n assets: [],\n hermesEnabled: false,\n hasSigningKey: false,\n podfileLockHash: null,\n gradleDeps: [],\n warnings: [],\n };\n\n // 1. Read package.json\n const pkgPath = path.join(projectRoot, 'package.json');\n if (await fs.pathExists(pkgPath)) {\n try {\n diag.packageJson = await fs.readJson(pkgPath);\n const deps = { ...diag.packageJson?.dependencies, ...diag.packageJson?.devDependencies };\n diag.reactNativeVersion = deps?.['react-native'] || null;\n\n // Identify native dependencies (common patterns)\n const nativeModulePatterns = [\n 'react-native-',\n '@react-native/',\n '@react-native-community/',\n 'expo-',\n 'react-native-reanimated',\n 'react-native-gesture-handler',\n 'react-native-screens',\n 'react-native-svg',\n 'lottie-react-native',\n '@shopify/react-native-skia',\n ];\n\n for (const [dep] of Object.entries(deps || {})) {\n if (nativeModulePatterns.some(p => dep.startsWith(p) || dep === p)) {\n diag.nativeDeps.push(`${dep}@${deps[dep]}`);\n }\n }\n } catch {\n diag.warnings.push('Failed to parse package.json');\n }\n } else {\n diag.warnings.push('No package.json found — are you in a React Native project root?');\n }\n\n // 2. Check for large assets\n const assetDirs = ['assets', 'src/assets', 'app/assets', 'src/images'];\n for (const dir of assetDirs) {\n const fullDir = path.join(projectRoot, dir);\n if (await fs.pathExists(fullDir)) {\n try {\n const files = await fs.readdir(fullDir);\n for (const file of files.slice(0, 50)) {\n try {\n const stat = await fs.stat(path.join(fullDir, file));\n if (stat.isFile() && stat.size > 100 * 1024) {\n diag.assets.push({ name: `${dir}/${file}`, sizeKB: Math.round(stat.size / 1024) });\n }\n } catch {\n // skip unreadable files\n }\n }\n } catch {\n // skip unreadable dirs\n }\n }\n }\n\n // 3. Detect Hermes config\n const gradlePath = path.join(projectRoot, 'android/app/build.gradle');\n if (await fs.pathExists(gradlePath)) {\n try {\n const gradle = await fs.readFile(gradlePath, 'utf-8');\n diag.hermesEnabled = gradle.includes('hermesEnabled') && !gradle.includes('hermesEnabled: false');\n\n // Extract key Gradle dependencies\n const depMatches = gradle.match(/implementation\\s+['\"]([^'\"]+)['\"]/g);\n if (depMatches) {\n diag.gradleDeps = depMatches.slice(0, 20).map(m => m.replace(/implementation\\s+['\"]/, '').replace(/['\"]/, ''));\n }\n } catch {\n // ignore\n }\n }\n\n // New arch (react-native.config.js or newArchEnabled in gradle.properties)\n const gradlePropsPath = path.join(projectRoot, 'android/gradle.properties');\n if (await fs.pathExists(gradlePropsPath)) {\n try {\n const props = await fs.readFile(gradlePropsPath, 'utf-8');\n if (props.includes('newArchEnabled=true')) {\n diag.warnings.push('New Architecture is enabled — ensure your OTA bundle is compatible');\n }\n } catch {\n // ignore\n }\n }\n\n // 4. Check signing key existence (don't read the key content)\n const signingPaths = [\n path.join(projectRoot, 'swiftpatch-private.pem'),\n path.join(projectRoot, '.swiftpatch/private.pem'),\n path.join(projectRoot, 'keys/swiftpatch-private.pem'),\n ];\n for (const p of signingPaths) {\n if (await fs.pathExists(p)) {\n diag.hasSigningKey = true;\n break;\n }\n }\n\n // 5. Check Podfile.lock existence (indicates iOS native dep state)\n const podfileLock = path.join(projectRoot, 'ios/Podfile.lock');\n if (await fs.pathExists(podfileLock)) {\n try {\n const stat = await fs.stat(podfileLock);\n diag.podfileLockHash = `modified:${stat.mtimeMs}`;\n } catch {\n // ignore\n }\n }\n\n return diag;\n}\n\nexport const aiDoctorCommand = new Command('doctor')\n .description('AI-powered pre-publish diagnostics for your React Native project')\n .option('-d, --dir <path>', 'Project root directory', process.cwd())\n .option('-y, --yes', 'Skip consent prompt (for CI/CD)')\n .option('--json', 'Output raw diagnostics as JSON')\n .action(async (options) => {\n const projectRoot = path.resolve(options.dir);\n\n if (!await fs.pathExists(path.join(projectRoot, 'package.json'))) {\n logger.error('No package.json found. Run this from your React Native project root.');\n process.exit(1);\n }\n\n // Require explicit consent before scanning local files\n const consented = await requireConsent(\n ['project-files', 'project-structure'],\n { yes: options.yes }\n );\n if (!consented) {\n process.exit(0);\n }\n\n const spinner = ora('Scanning project...').start();\n\n let diag: DoctorDiagnostics;\n try {\n diag = await collectDiagnostics(projectRoot);\n spinner.succeed('Project scanned');\n } catch (error: any) {\n spinner.fail(`Scan failed: ${error.message}`);\n process.exit(1);\n }\n\n if (options.json) {\n console.log(JSON.stringify(diag, null, 2));\n return;\n }\n\n // Show local findings first\n console.log('');\n console.log(chalk.bold(' Project Diagnostics'));\n console.log('');\n\n if (diag.reactNativeVersion) {\n console.log(` React Native: ${chalk.cyan(diag.reactNativeVersion)}`);\n }\n console.log(` Native deps: ${chalk.cyan(String(diag.nativeDeps.length))}`);\n console.log(` Hermes: ${diag.hermesEnabled ? chalk.green('Enabled') : chalk.yellow('Disabled')}`);\n console.log(` Signing key: ${diag.hasSigningKey ? chalk.green('Found') : chalk.yellow('Not found')}`);\n\n if (diag.assets.length > 0) {\n console.log('');\n console.log(chalk.bold(' Large Assets (>100KB):'));\n for (const asset of diag.assets.slice(0, 10)) {\n const color = asset.sizeKB > 500 ? chalk.red : chalk.yellow;\n console.log(` ${color(`${asset.sizeKB}KB`)} ${asset.name}`);\n }\n if (diag.assets.length > 10) {\n console.log(chalk.gray(` ... and ${diag.assets.length - 10} more`));\n }\n }\n\n if (diag.warnings.length > 0) {\n console.log('');\n for (const w of diag.warnings) {\n logger.warning(w);\n }\n }\n\n // Now send to Claude for analysis\n const aiSpinner = ora('Analyzing with Claude AI...').start();\n\n try {\n const systemPrompt =\n 'You are SwiftPatch Doctor, an expert in React Native OTA (Over-The-Air) updates. ' +\n 'Analyze the project diagnostics and provide a concise, actionable report. ' +\n 'Focus on:\\n' +\n '1. Native dependency risks: identify deps that require a full app store release if changed\\n' +\n '2. Bundle size concerns: large assets, unnecessary imports\\n' +\n '3. Hermes compatibility: is the config optimal for OTA?\\n' +\n '4. Signing: is bundle signing configured?\\n' +\n '5. Overall OTA readiness score (1-10)\\n\\n' +\n 'Format your response with clear sections using markdown-style headers (##). ' +\n 'Be direct and specific. Do not explain what OTA is. The user is a developer.';\n\n const diagnosticsSummary = JSON.stringify({\n reactNativeVersion: diag.reactNativeVersion,\n nativeDeps: diag.nativeDeps,\n largeAssets: diag.assets,\n hermesEnabled: diag.hermesEnabled,\n hasSigningKey: diag.hasSigningKey,\n hasPodfileLock: !!diag.podfileLockHash,\n gradleDeps: diag.gradleDeps,\n localWarnings: diag.warnings,\n }, null, 2);\n\n const analysis = await claudeChat(\n [{ role: 'user', content: `Analyze this React Native project for OTA update readiness:\\n\\n${diagnosticsSummary}` }],\n { system: systemPrompt, temperature: 0.3 }\n );\n\n aiSpinner.succeed('AI analysis complete');\n console.log('');\n console.log(chalk.bold(' AI Analysis'));\n console.log('');\n\n // Indent each line for consistent formatting\n for (const line of analysis.split('\\n')) {\n console.log(` ${line}`);\n }\n console.log('');\n } catch (error: any) {\n aiSpinner.fail(`AI analysis failed: ${error.message}`);\n console.log('');\n console.log(chalk.gray(' Local diagnostics above are still valid.'));\n console.log('');\n process.exit(1);\n }\n });\n","import Anthropic from '@anthropic-ai/sdk';\nimport { auth } from './auth.js';\nimport { api } from './api.js';\nimport { logger } from '../utils/logger.js';\n\nconst CLAUDE_MODEL = 'claude-sonnet-4-5-20250929';\nconst MAX_TOKENS = 4096;\nconst TIMEOUT_MS = 120_000;\n\n/**\n * Resolves the Claude API key with a clear priority chain:\n * 1. SWIFTPATCH_CLAUDE_API_KEY env var (CI/CD override)\n * 2. User-configured key via `swiftpatch config set claudeApiKey <key>`\n * 3. SwiftPatch platform-provisioned key (fetched from backend)\n *\n * Returns null if no key is available.\n */\nasync function resolveApiKey(): Promise<string | null> {\n // 1. Environment variable (highest priority — CI/CD and local override)\n const envKey = process.env.SWIFTPATCH_CLAUDE_API_KEY;\n if (envKey && isValidClaudeKey(envKey)) {\n return envKey;\n }\n\n // 2. User-configured key stored in encrypted config\n const storedKey = auth.getClaudeApiKey();\n if (storedKey && isValidClaudeKey(storedKey)) {\n return storedKey;\n }\n\n // 3. Platform-provisioned key (requires SwiftPatch auth)\n if (auth.isLoggedIn()) {\n try {\n const { apiKey } = await api.getClaudeApiKey();\n if (apiKey && isValidClaudeKey(apiKey)) {\n return apiKey;\n }\n } catch {\n // Backend doesn't support provisioned keys yet — fall through\n logger.debug('Platform Claude key not available, skipping');\n }\n }\n\n return null;\n}\n\n/**\n * Validate Claude API key format without exposing the key.\n * Anthropic keys start with \"sk-ant-\" prefix.\n */\nfunction isValidClaudeKey(key: string): boolean {\n return typeof key === 'string' && key.startsWith('sk-ant-') && key.length > 20;\n}\n\n/**\n * Create a configured Anthropic client instance.\n * Throws a user-friendly error if no API key is available.\n */\nasync function createClient(): Promise<Anthropic> {\n const apiKey = await resolveApiKey();\n\n if (!apiKey) {\n throw new Error(\n 'No Claude API key configured.\\n\\n' +\n ' Set one with:\\n' +\n ' swiftpatch config set claudeApiKey <your-key>\\n\\n' +\n ' Or set the SWIFTPATCH_CLAUDE_API_KEY environment variable.\\n\\n' +\n ' Get a key at: https://console.anthropic.com/settings/keys'\n );\n }\n\n return new Anthropic({\n apiKey,\n timeout: TIMEOUT_MS,\n maxRetries: 2,\n });\n}\n\nexport interface ClaudeMessage {\n role: 'user' | 'assistant';\n content: string;\n}\n\nexport interface ClaudeOptions {\n system?: string;\n maxTokens?: number;\n temperature?: number;\n}\n\n/**\n * Send a message to Claude and get a complete response.\n * Use this for structured analysis (doctor, review).\n */\nexport async function claudeChat(\n messages: ClaudeMessage[],\n options: ClaudeOptions = {}\n): Promise<string> {\n const client = await createClient();\n\n const response = await client.messages.create({\n model: CLAUDE_MODEL,\n max_tokens: options.maxTokens || MAX_TOKENS,\n ...(options.system ? { system: options.system } : {}),\n ...(options.temperature !== undefined ? { temperature: options.temperature } : {}),\n messages,\n });\n\n const textBlock = response.content.find((block) => block.type === 'text');\n if (!textBlock || textBlock.type !== 'text') {\n throw new Error('Unexpected response format from Claude');\n }\n\n return textBlock.text;\n}\n\n/**\n * Stream a response from Claude to stdout in real-time.\n * Use this for conversational commands (ask, explain).\n */\nexport async function claudeStream(\n messages: ClaudeMessage[],\n options: ClaudeOptions = {}\n): Promise<string> {\n const client = await createClient();\n\n let fullText = '';\n\n const stream = client.messages.stream({\n model: CLAUDE_MODEL,\n max_tokens: options.maxTokens || MAX_TOKENS,\n ...(options.system ? { system: options.system } : {}),\n ...(options.temperature !== undefined ? { temperature: options.temperature } : {}),\n messages,\n });\n\n for await (const event of stream) {\n if (\n event.type === 'content_block_delta' &&\n event.delta.type === 'text_delta'\n ) {\n process.stdout.write(event.delta.text);\n fullText += event.delta.text;\n }\n }\n\n return fullText;\n}\n\n/**\n * Check if Claude AI features are available (key is configured).\n */\nexport async function isClaudeAvailable(): Promise<boolean> {\n const key = await resolveApiKey();\n return key !== null;\n}\n","import chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport { config } from '../lib/config.js';\nimport { logger } from './logger.js';\n\n/**\n * Data categories that require user consent before analysis.\n */\nexport type DataScope =\n | 'project-files' // package.json, build configs, asset dirs\n | 'git-history' // commit messages, diff stats, file names\n | 'git-diff' // actual code diff content (most sensitive)\n | 'project-structure'; // directory layout, file existence checks\n\nconst SCOPE_DESCRIPTIONS: Record<DataScope, string> = {\n 'project-files': 'Project config files (package.json, build.gradle, Podfile)',\n 'git-history': 'Git commit messages, file change names, and diff stats',\n 'git-diff': 'Code diff content from your changed JS/TS files',\n 'project-structure': 'Project directory structure and file existence checks',\n};\n\n/**\n * Prompt the user for consent before sending local project data to Claude AI.\n *\n * - Shows exactly what data scopes will be accessed and sent\n * - Supports --yes flag to skip the prompt (for CI/CD)\n * - Remembers consent per-scope if user opts in\n * - Returns false if user declines — the caller MUST abort\n */\nexport async function requireConsent(\n scopes: DataScope[],\n options: { yes?: boolean } = {}\n): Promise<boolean> {\n // --yes flag skips interactive prompt (CI/CD)\n if (options.yes) {\n return true;\n }\n\n // Check if user has already consented to all requested scopes\n const consentedScopes = config.get('aiConsentScopes');\n if (consentedScopes) {\n const allConsented = scopes.every(s => consentedScopes.includes(s));\n if (allConsented) {\n return true;\n }\n }\n\n // Show what we'll access\n console.log('');\n console.log(chalk.bold(' Data Access Notice'));\n console.log('');\n console.log(' This command will read the following local data and send');\n console.log(' a summary to Claude AI (Anthropic) for analysis:');\n console.log('');\n\n for (const scope of scopes) {\n console.log(` ${chalk.cyan('•')} ${SCOPE_DESCRIPTIONS[scope]}`);\n }\n\n console.log('');\n console.log(chalk.gray(' No source code is stored. Data is sent via encrypted HTTPS.'));\n console.log(chalk.gray(' See: https://docs.swiftpatch.io/privacy/ai'));\n console.log('');\n\n const { consent } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'consent',\n message: 'Allow SwiftPatch AI to analyze this data?',\n default: true,\n },\n ]);\n\n if (!consent) {\n logger.info('AI analysis cancelled. No data was sent.');\n return false;\n }\n\n // Ask if they want to remember this choice\n const { remember } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'remember',\n message: 'Remember this choice for future runs?',\n default: true,\n },\n ]);\n\n if (remember) {\n const existing = config.get('aiConsentScopes') || [];\n const merged = [...new Set([...existing, ...scopes])];\n config.set('aiConsentScopes', merged);\n logger.info(`Consent saved. Reset with: ${chalk.cyan('swiftpatch config delete aiConsentScopes')}`);\n }\n\n return true;\n}\n\n/**\n * Revoke all AI consent. Called via `swiftpatch config delete aiConsentScopes`.\n */\nexport function revokeConsent(): void {\n config.delete('aiConsentScopes');\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { execFile } from 'child_process';\nimport { promisify } from 'util';\nimport { claudeStream, claudeChat } from '../lib/claude.js';\nimport { logger } from '../utils/logger.js';\nimport { requireConsent } from '../utils/consent.js';\n\nconst execFileAsync = promisify(execFile);\n\n/** Maximum bytes of git log/diff to send to Claude (prevents token overflow) */\nconst MAX_CONTEXT_BYTES = 12_000;\n\n/**\n * Safely execute a git command. Returns stdout or null on failure.\n * Uses execFile (not exec) to prevent shell injection.\n */\nasync function gitCommand(args: string[], cwd: string): Promise<string | null> {\n try {\n const { stdout } = await execFileAsync('git', args, {\n cwd,\n maxBuffer: 512 * 1024,\n timeout: 15_000,\n });\n return stdout.trim();\n } catch {\n return null;\n }\n}\n\n/**\n * Get the most recent tag matching common release patterns.\n */\nasync function getLastReleaseTag(cwd: string): Promise<string | null> {\n // Try SwiftPatch-specific tags first, then generic version tags\n const patterns = ['swiftpatch-*', 'release-*', 'v*'];\n\n for (const pattern of patterns) {\n const tag = await gitCommand(\n ['describe', '--tags', '--match', pattern, '--abbrev=0', 'HEAD~1'],\n cwd\n );\n if (tag) return tag;\n }\n\n // Fallback: any most recent tag\n const anyTag = await gitCommand(['describe', '--tags', '--abbrev=0', 'HEAD~1'], cwd);\n return anyTag;\n}\n\nexport const aiExplainCommand = new Command('explain')\n .description('Generate a changelog from git history using AI')\n .option('-f, --from <ref>', 'Start ref (tag, commit, or branch). Defaults to last tag.')\n .option('-t, --to <ref>', 'End ref', 'HEAD')\n .option('--format <type>', 'Output format: markdown, plain, json', 'markdown')\n .option('--max-commits <n>', 'Maximum commits to analyze', '50')\n .option('-y, --yes', 'Skip consent prompt (for CI/CD)')\n .option('--json', 'Output structured JSON')\n .action(async (options) => {\n const cwd = process.cwd();\n\n // Verify git repo\n const isGit = await gitCommand(['rev-parse', '--is-inside-work-tree'], cwd);\n if (isGit !== 'true') {\n logger.error('Not a git repository. Run this from your project root.');\n process.exit(1);\n }\n\n // Require explicit consent before reading git history\n const consented = await requireConsent(\n ['git-history'],\n { yes: options.yes }\n );\n if (!consented) {\n process.exit(0);\n }\n\n const spinner = ora('Gathering git history...').start();\n\n // Resolve start ref\n let fromRef = options.from;\n if (!fromRef) {\n fromRef = await getLastReleaseTag(cwd);\n if (!fromRef) {\n // Fallback: use commit count to avoid HEAD~N exceeding history\n const countOutput = await gitCommand(['rev-list', '--count', 'HEAD'], cwd);\n const totalCommits = countOutput ? parseInt(countOutput, 10) : 1;\n const maxFallback = Math.min(parseInt(options.maxCommits, 10), 50, totalCommits - 1);\n if (maxFallback <= 0) {\n // Only 1 commit — use root commit\n const root = await gitCommand(['rev-list', '--max-parents=0', 'HEAD'], cwd);\n fromRef = root || 'HEAD';\n } else {\n fromRef = `HEAD~${maxFallback}`;\n }\n spinner.text = `No release tags found. Using last ${maxFallback > 0 ? maxFallback : 'all'} commits...`;\n }\n }\n\n const toRef = options.to;\n\n // Get commit log\n const maxCommits = Math.min(Math.max(parseInt(options.maxCommits, 10) || 50, 1), 100);\n const logOutput = await gitCommand(\n ['log', `${fromRef}..${toRef}`, `--max-count=${maxCommits}`, '--pretty=format:%h|%s|%an|%ad', '--date=short'],\n cwd\n );\n\n if (!logOutput) {\n spinner.fail('No commits found in the specified range.');\n console.log('');\n console.log(chalk.gray(` Range: ${fromRef}..${toRef}`));\n console.log('');\n process.exit(1);\n }\n\n // Get diff stat (file changes summary — NOT full diff for security)\n const diffStat = await gitCommand(\n ['diff', '--stat', `${fromRef}..${toRef}`],\n cwd\n );\n\n // Get changed file names only\n const changedFiles = await gitCommand(\n ['diff', '--name-only', `${fromRef}..${toRef}`],\n cwd\n );\n\n spinner.succeed(`Found ${logOutput.split('\\n').length} commits (${fromRef}..${toRef})`);\n\n // Truncate to stay within token limits\n const truncatedLog = logOutput.slice(0, MAX_CONTEXT_BYTES);\n const truncatedStat = (diffStat || '').slice(0, MAX_CONTEXT_BYTES / 2);\n const truncatedFiles = (changedFiles || '').slice(0, MAX_CONTEXT_BYTES / 2);\n\n const outputFormat = options.json ? 'json' : options.format;\n\n const systemPrompt =\n 'You are a senior developer writing release notes for a React Native app ' +\n 'that uses SwiftPatch for OTA updates. ' +\n 'Generate a clear, professional changelog from the provided git history.\\n\\n' +\n 'Rules:\\n' +\n '- Group changes by category: Features, Bug Fixes, Improvements, Breaking Changes\\n' +\n '- Only include Breaking Changes if there are actual breaking API or behavior changes\\n' +\n '- Omit empty categories\\n' +\n '- Write for end-users and fellow developers, not bots\\n' +\n '- Be concise: one line per change\\n' +\n '- Highlight any changes that affect native code (these CANNOT be delivered via OTA)\\n' +\n (outputFormat === 'json'\n ? '- Return valid JSON with structure: { \"summary\": \"...\", \"categories\": [{ \"name\": \"...\", \"changes\": [\"...\"] }], \"nativeChanges\": boolean, \"otaSafe\": boolean }'\n : outputFormat === 'markdown'\n ? '- Use markdown formatting with ## headers'\n : '- Use plain text formatting, no markdown');\n\n const userMessage =\n `Generate a changelog for these changes:\\n\\n` +\n `## Commits\\n${truncatedLog}\\n\\n` +\n `## Changed Files\\n${truncatedFiles}\\n\\n` +\n `## Diff Stats\\n${truncatedStat}`;\n\n if (outputFormat === 'json') {\n const aiSpinner = ora('Generating changelog with AI...').start();\n try {\n const result = await claudeChat(\n [{ role: 'user', content: userMessage }],\n { system: systemPrompt, temperature: 0.3 }\n );\n aiSpinner.succeed('Changelog generated');\n console.log('');\n console.log(result);\n console.log('');\n } catch (error: any) {\n aiSpinner.fail(`Failed: ${error.message}`);\n process.exit(1);\n }\n } else {\n console.log('');\n process.stdout.write(chalk.dim(''));\n try {\n await claudeStream(\n [{ role: 'user', content: userMessage }],\n { system: systemPrompt, temperature: 0.3 }\n );\n console.log('');\n console.log('');\n } catch (error: any) {\n console.log('');\n logger.error(`Failed: ${error.message}`);\n process.exit(1);\n }\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { execFile } from 'child_process';\nimport { promisify } from 'util';\nimport { claudeChat } from '../lib/claude.js';\nimport { logger } from '../utils/logger.js';\nimport { requireConsent } from '../utils/consent.js';\n\nconst execFileAsync = promisify(execFile);\n\n/** Maximum bytes of diff to send to Claude */\nconst MAX_DIFF_BYTES = 15_000;\n\n/** Files that indicate high-risk changes for OTA updates */\nconst HIGH_RISK_PATTERNS = [\n 'android/',\n 'ios/',\n 'Podfile',\n 'build.gradle',\n 'AndroidManifest.xml',\n 'Info.plist',\n 'settings.gradle',\n '.pbxproj',\n 'Podfile.lock',\n];\n\n/** Source patterns that are especially sensitive */\nconst SENSITIVE_PATTERNS = [\n 'auth',\n 'login',\n 'token',\n 'payment',\n 'checkout',\n 'security',\n 'crypto',\n 'encrypt',\n 'password',\n 'secret',\n 'api-key',\n 'apiKey',\n 'credential',\n];\n\n/**\n * Safely execute a git command using execFile (no shell injection).\n */\nasync function gitCommand(args: string[], cwd: string): Promise<string | null> {\n try {\n const { stdout } = await execFileAsync('git', args, {\n cwd,\n maxBuffer: 1024 * 1024,\n timeout: 15_000,\n });\n return stdout.trim();\n } catch {\n return null;\n }\n}\n\ninterface LocalAnalysis {\n nativeFileChanges: string[];\n sensitiveFileChanges: string[];\n totalFilesChanged: number;\n linesAdded: number;\n linesRemoved: number;\n hasNativeChanges: boolean;\n hasSensitiveChanges: boolean;\n changedFiles: string[];\n diffExcerpt: string;\n}\n\n/**\n * Perform local analysis of git changes without AI.\n */\nasync function analyzeChangesLocally(\n fromRef: string,\n toRef: string,\n cwd: string\n): Promise<LocalAnalysis> {\n const result: LocalAnalysis = {\n nativeFileChanges: [],\n sensitiveFileChanges: [],\n totalFilesChanged: 0,\n linesAdded: 0,\n linesRemoved: 0,\n hasNativeChanges: false,\n hasSensitiveChanges: false,\n changedFiles: [],\n diffExcerpt: '',\n };\n\n // Get changed files\n const filesOutput = await gitCommand(\n ['diff', '--name-only', `${fromRef}..${toRef}`],\n cwd\n );\n\n if (!filesOutput) return result;\n\n const files = filesOutput.split('\\n').filter(Boolean);\n result.changedFiles = files;\n result.totalFilesChanged = files.length;\n\n // Classify files\n for (const file of files) {\n const lower = file.toLowerCase();\n\n if (HIGH_RISK_PATTERNS.some(p => lower.includes(p.toLowerCase()))) {\n result.nativeFileChanges.push(file);\n result.hasNativeChanges = true;\n }\n\n if (SENSITIVE_PATTERNS.some(p => lower.includes(p))) {\n result.sensitiveFileChanges.push(file);\n result.hasSensitiveChanges = true;\n }\n }\n\n // Get diff stats\n const statsOutput = await gitCommand(\n ['diff', '--shortstat', `${fromRef}..${toRef}`],\n cwd\n );\n\n if (statsOutput) {\n const addMatch = statsOutput.match(/(\\d+) insertion/);\n const delMatch = statsOutput.match(/(\\d+) deletion/);\n result.linesAdded = addMatch ? parseInt(addMatch[1], 10) : 0;\n result.linesRemoved = delMatch ? parseInt(delMatch[1], 10) : 0;\n }\n\n // Get JS/TS diff only (exclude native files, binaries, lock files)\n const jsDiff = await gitCommand(\n [\n 'diff', `${fromRef}..${toRef}`,\n '--', '*.ts', '*.tsx', '*.js', '*.jsx',\n ':!node_modules', ':!*.lock', ':!dist/', ':!build/',\n ],\n cwd\n );\n\n if (jsDiff) {\n result.diffExcerpt = jsDiff.slice(0, MAX_DIFF_BYTES);\n }\n\n return result;\n}\n\nexport const aiReviewCommand = new Command('review')\n .description('AI-powered safety review of changes before OTA deployment')\n .option('-f, --from <ref>', 'Start ref (tag, commit, or branch). Defaults to last tag.')\n .option('-t, --to <ref>', 'End ref', 'HEAD')\n .option('-y, --yes', 'Skip consent prompt (for CI/CD)')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n const cwd = process.cwd();\n\n // Verify git repo\n const isGit = await gitCommand(['rev-parse', '--is-inside-work-tree'], cwd);\n if (isGit !== 'true') {\n logger.error('Not a git repository. Run this from your project root.');\n process.exit(1);\n }\n\n // Require explicit consent before reading code diffs\n const consented = await requireConsent(\n ['git-history', 'git-diff'],\n { yes: options.yes }\n );\n if (!consented) {\n process.exit(0);\n }\n\n const spinner = ora('Analyzing changes...').start();\n\n // Resolve from ref\n let fromRef = options.from;\n if (!fromRef) {\n // Try to find last tag\n fromRef = await gitCommand(['describe', '--tags', '--abbrev=0', 'HEAD~1'], cwd);\n if (!fromRef) {\n // Fallback: use commit count to avoid HEAD~N exceeding history\n const countOutput = await gitCommand(['rev-list', '--count', 'HEAD'], cwd);\n const totalCommits = countOutput ? parseInt(countOutput, 10) : 1;\n const maxFallback = Math.min(10, totalCommits - 1);\n if (maxFallback <= 0) {\n const root = await gitCommand(['rev-list', '--max-parents=0', 'HEAD'], cwd);\n fromRef = root || 'HEAD';\n } else {\n fromRef = `HEAD~${maxFallback}`;\n }\n spinner.text = `No tags found. Comparing against last ${maxFallback > 0 ? maxFallback : 'all'} commits...`;\n }\n }\n\n const toRef = options.to;\n\n let analysis: LocalAnalysis;\n try {\n analysis = await analyzeChangesLocally(fromRef, toRef, cwd);\n } catch (error: any) {\n spinner.fail(`Analysis failed: ${error.message}`);\n process.exit(1);\n }\n\n if (analysis.totalFilesChanged === 0) {\n spinner.succeed('No changes found');\n console.log('');\n console.log(chalk.gray(` Range: ${fromRef}..${toRef}`));\n console.log(chalk.green(' Nothing to review — working tree is clean.'));\n console.log('');\n return;\n }\n\n spinner.succeed(`Found ${analysis.totalFilesChanged} changed files (+${analysis.linesAdded} -${analysis.linesRemoved})`);\n\n // Show immediate local warnings\n if (analysis.hasNativeChanges) {\n console.log('');\n logger.warning(chalk.bold('Native file changes detected — these CANNOT be delivered via OTA:'));\n for (const f of analysis.nativeFileChanges) {\n console.log(` ${chalk.red('!')} ${f}`);\n }\n }\n\n if (analysis.hasSensitiveChanges) {\n console.log('');\n logger.warning(chalk.bold('Sensitive file changes detected — review carefully:'));\n for (const f of analysis.sensitiveFileChanges) {\n console.log(` ${chalk.yellow('!')} ${f}`);\n }\n }\n\n // AI analysis\n const aiSpinner = ora('Running AI safety review...').start();\n\n try {\n const systemPrompt =\n 'You are SwiftPatch Review, an expert in React Native OTA update safety. ' +\n 'Analyze the code diff and provide a safety assessment for shipping this as an OTA update.\\n\\n' +\n 'Your response MUST include:\\n' +\n '1. **OTA Safety Score** (1-10, where 10 is perfectly safe)\\n' +\n '2. **Verdict**: SAFE, CAUTION, or UNSAFE\\n' +\n '3. **Risk Summary**: 1-2 sentences about the overall risk\\n' +\n '4. **Issues Found**: List specific concerns (if any)\\n' +\n '5. **Recommendation**: Should this be shipped as OTA or requires app store release?\\n\\n' +\n 'Risk factors to check:\\n' +\n '- Native code changes (cannot be OTA updated)\\n' +\n '- Authentication/security logic changes\\n' +\n '- API endpoint changes (URL, headers, auth)\\n' +\n '- Error handling removal or weakening\\n' +\n '- Removal of safety checks or validation\\n' +\n '- Large structural refactors that may introduce regressions\\n' +\n '- Third-party SDK version changes\\n\\n' +\n 'Be concise and specific. Developers are your audience.';\n\n const contextData = JSON.stringify({\n range: `${fromRef}..${toRef}`,\n totalFilesChanged: analysis.totalFilesChanged,\n linesAdded: analysis.linesAdded,\n linesRemoved: analysis.linesRemoved,\n nativeFileChanges: analysis.nativeFileChanges,\n sensitiveFileChanges: analysis.sensitiveFileChanges,\n changedFiles: analysis.changedFiles.slice(0, 50),\n }, null, 2);\n\n const userMessage =\n `Review this OTA update for safety:\\n\\n` +\n `## Change Summary\\n${contextData}\\n\\n` +\n `## Code Diff (JS/TS only)\\n\\`\\`\\`diff\\n${analysis.diffExcerpt}\\n\\`\\`\\``;\n\n const result = await claudeChat(\n [{ role: 'user', content: userMessage }],\n { system: systemPrompt, temperature: 0.2 }\n );\n\n aiSpinner.succeed('Safety review complete');\n\n if (options.json) {\n console.log(JSON.stringify({\n range: `${fromRef}..${toRef}`,\n localAnalysis: {\n totalFilesChanged: analysis.totalFilesChanged,\n linesAdded: analysis.linesAdded,\n linesRemoved: analysis.linesRemoved,\n hasNativeChanges: analysis.hasNativeChanges,\n hasSensitiveChanges: analysis.hasSensitiveChanges,\n nativeFileChanges: analysis.nativeFileChanges,\n sensitiveFileChanges: analysis.sensitiveFileChanges,\n },\n aiReview: result,\n }, null, 2));\n return;\n }\n\n console.log('');\n console.log(chalk.bold(' AI Safety Review'));\n console.log('');\n for (const line of result.split('\\n')) {\n console.log(` ${line}`);\n }\n console.log('');\n } catch (error: any) {\n aiSpinner.fail(`AI review failed: ${error.message}`);\n console.log('');\n console.log(chalk.gray(' Local analysis above is still valid.'));\n console.log('');\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { config } from '../lib/config.js';\nimport { auth } from '../lib/auth.js';\nimport { logger } from '../utils/logger.js';\nimport type { CLIConfig } from '../types/config.js';\n\nconst VALID_KEYS: (keyof CLIConfig)[] = [\n 'apiUrl',\n 'defaultOrg',\n 'defaultApp',\n 'defaultPlatform',\n 'defaultChannel',\n 'aiConsentScopes',\n];\n\n/** Keys that are stored in the encrypted auth store instead of plain config */\nconst SECRET_KEYS = ['claudeApiKey'] as const;\ntype SecretKey = (typeof SECRET_KEYS)[number];\n\nconst ALL_KEYS = [...VALID_KEYS, ...SECRET_KEYS];\n\nfunction isSecretKey(key: string): key is SecretKey {\n return SECRET_KEYS.includes(key as SecretKey);\n}\n\nfunction maskSecret(value: string): string {\n if (value.length <= 8) return '****';\n return value.slice(0, 7) + '...' + '*'.repeat(8);\n}\n\nexport const configCommands = new Command('config')\n .description('CLI configuration');\n\nconfigCommands\n .command('set')\n .description('Set a config value')\n .argument('<key>', 'Config key')\n .argument('<value>', 'Config value')\n .action((key: string, value: string) => {\n if (!ALL_KEYS.includes(key as any)) {\n logger.error(`Invalid config key: ${key}`);\n console.log('');\n console.log('Valid keys: ' + ALL_KEYS.map(k => chalk.cyan(k)).join(', '));\n console.log('');\n process.exit(1);\n }\n\n if (isSecretKey(key)) {\n if (key === 'claudeApiKey') {\n if (!value.startsWith('sk-ant-') || value.length <= 20) {\n logger.error('Invalid Claude API key format. Keys start with \"sk-ant-\"');\n console.log('');\n console.log(' Get a key at: ' + chalk.cyan('https://console.anthropic.com/settings/keys'));\n console.log('');\n process.exit(1);\n }\n auth.setClaudeApiKey(value);\n logger.success(`Set ${chalk.cyan(key)} = ${chalk.gray(maskSecret(value))} (encrypted)`);\n }\n return;\n }\n\n config.set(key as keyof CLIConfig, value as any);\n logger.success(`Set ${chalk.cyan(key)} = ${chalk.gray(value)}`);\n });\n\nconfigCommands\n .command('get')\n .description('Get a config value')\n .argument('<key>', 'Config key')\n .action((key: string) => {\n if (isSecretKey(key)) {\n if (key === 'claudeApiKey') {\n const value = auth.getClaudeApiKey();\n if (!value) {\n logger.info(`${key} is not set`);\n } else {\n console.log(`${chalk.cyan(key)} = ${maskSecret(value)} (encrypted)`);\n }\n }\n return;\n }\n\n const value = config.get(key as keyof CLIConfig);\n if (value === undefined) {\n logger.info(`${key} is not set`);\n } else {\n console.log(`${chalk.cyan(key)} = ${value}`);\n }\n });\n\nconfigCommands\n .command('delete')\n .description('Delete a config value')\n .argument('<key>', 'Config key')\n .action((key: string) => {\n if (!ALL_KEYS.includes(key as any)) {\n logger.error(`Invalid config key: ${key}`);\n process.exit(1);\n }\n\n if (isSecretKey(key)) {\n if (key === 'claudeApiKey') {\n auth.deleteClaudeApiKey();\n logger.success(`Deleted ${chalk.cyan(key)}`);\n }\n return;\n }\n\n config.delete(key as keyof CLIConfig);\n logger.success(`Deleted ${chalk.cyan(key)}`);\n });\n\nconfigCommands\n .command('list')\n .description('List all config values')\n .action(() => {\n const all = config.getAll();\n const plainKeys = Object.keys(all);\n const hasClaudeKey = !!auth.getClaudeApiKey();\n\n if (plainKeys.length === 0 && !hasClaudeKey) {\n console.log('');\n console.log(chalk.gray(' No config values set.'));\n console.log('');\n console.log(' Set a value with: ' + chalk.cyan('swiftpatch config set <key> <value>'));\n console.log('');\n return;\n }\n\n console.log('');\n console.log(chalk.bold(' CLI Configuration'));\n console.log('');\n plainKeys.forEach(key => {\n console.log(` ${chalk.cyan(key)} = ${(all as Record<string, any>)[key]}`);\n });\n if (hasClaudeKey) {\n const key = auth.getClaudeApiKey()!;\n console.log(` ${chalk.cyan('claudeApiKey')} = ${maskSecret(key)} ${chalk.gray('(encrypted)')}`);\n }\n console.log('');\n console.log(chalk.gray(` Config path: ${config.path}`));\n console.log('');\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport path from 'path';\nimport fs from 'fs-extra';\nimport os from 'os';\nimport { auth } from '../lib/auth.js';\nimport { api } from '../lib/api.js';\nimport { uploader } from '../lib/uploader.js';\nimport { calculateZipHash } from '../lib/hash.js';\nimport { signBundleDirectory, readBundleSignature } from '../lib/signing.js';\nimport { createZip } from '../lib/archive.js';\nimport { keepArtifacts } from '../lib/artifacts.js';\nimport {\n runReactNativeBundleCommand,\n runHermesEmitBinaryCommand,\n isValidPlatform,\n fileDoesNotExistOrIsDirectory,\n} from '../lib/react-native-utils.js';\nimport { logger } from '../utils/logger.js';\nimport { requireAuth } from '../utils/auth-guard.js';\nimport { resolveOrgId } from '../utils/org-resolver.js';\n\ninterface PublishBundleOptions {\n app?: string;\n org?: string;\n platform: string;\n entryFile?: string;\n releaseNote?: string;\n privateKey?: string;\n dev?: boolean;\n sourcemap?: boolean;\n hermes?: boolean;\n hermescPath?: string;\n hermesLogs?: boolean;\n keepArtifacts?: boolean;\n ciToken?: string;\n}\n\nexport const publishBundleCommand = new Command('publish-bundle')\n .description('Bundle, compile Hermes, sign, and upload a JS bundle to SwiftPatch')\n .requiredOption('-p, --platform <platform>', 'Target platform (ios or android)')\n .option('-a, --app <app-id>', 'App ID or slug')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('-e, --entry-file <path>', 'Entry file for React Native bundle', 'index.js')\n .option('-n, --release-note <note>', 'Release notes', '')\n .option('-k, --private-key <path>', 'Path to RSA private key for bundle signing')\n .option('--dev', 'Create a development bundle', false)\n .option('--sourcemap', 'Generate sourcemaps', false)\n .option('--hermes', 'Compile to Hermes bytecode', false)\n .option('--hermesc-path <path>', 'Custom path to hermesc binary')\n .option('--hermes-logs', 'Output Hermes compilation logs to file', false)\n .option('--keep-artifacts', 'Save intermediate build artifacts for debugging', false)\n .option('--ci-token <token>', 'CI token for authentication (alternative to login)')\n .action(async (options: PublishBundleOptions) => {\n const platform = options.platform.toLowerCase();\n\n if (!isValidPlatform(platform)) {\n logger.error('Invalid platform. Must be \"ios\" or \"android\".');\n process.exit(1);\n }\n\n // Auth: either CI token or user login\n const ciToken = options.ciToken || process.env.SWIFTPATCH_CI_TOKEN;\n if (!ciToken) {\n await requireAuth();\n }\n\n const orgId = ciToken ? undefined : await resolveOrgId(options.org);\n\n console.log('');\n logger.info(chalk.bold('SwiftPatch Publish Bundle'));\n console.log('');\n\n // Resolve app\n let appSlug = options.app;\n let resolvedAppId = '';\n if (!appSlug && !ciToken) {\n const apps = await api.getApps(orgId!);\n if (apps.length === 0) {\n logger.error('No apps found. Create one with: swiftpatch apps create');\n process.exit(1);\n }\n\n // Auto-select if only one app\n if (apps.length === 1) {\n appSlug = apps[0].slug || apps[0].id;\n resolvedAppId = apps[0].id;\n logger.info(`App: ${chalk.cyan(apps[0].name)}`);\n } else {\n const inquirer = (await import('inquirer')).default;\n const { selectedApp } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selectedApp',\n message: 'Select app:',\n choices: apps.map(app => ({\n name: `${app.name} (${app.platform})`,\n value: app.slug || app.id,\n })),\n },\n ]);\n appSlug = selectedApp;\n }\n }\n\n // Build uploadPath: use app slug or ID\n const uploadPath = appSlug || resolvedAppId || '';\n\n const entryFile = options.entryFile || 'index.js';\n const bundleName = platform === 'ios' ? 'main.jsbundle' : 'index.android.bundle';\n\n // Create temp working directory\n const contentRootPath = path.join(os.tmpdir(), `swiftpatch-publish-${Date.now()}`);\n await fs.ensureDir(contentRootPath);\n\n try {\n // STEP 1: React Native Bundle\n const spinner = ora('Bundling JavaScript...').start();\n try {\n await runReactNativeBundleCommand(\n bundleName,\n entryFile,\n contentRootPath,\n platform,\n options.sourcemap || false,\n options.dev || false\n );\n spinner.succeed('JavaScript bundled');\n } catch (error: any) {\n spinner.fail(`Bundling failed: ${error.message}`);\n process.exit(1);\n }\n\n // Save normal artifacts\n if (options.keepArtifacts) {\n await keepArtifacts(contentRootPath, platform, 'normal');\n }\n\n // STEP 2: Hermes Compilation (optional)\n if (options.hermes) {\n const hermesSpinner = ora('Compiling to Hermes bytecode...').start();\n try {\n await runHermesEmitBinaryCommand(\n bundleName,\n contentRootPath,\n options.hermesLogs || false,\n options.hermescPath,\n options.sourcemap || false\n );\n hermesSpinner.succeed('Hermes bytecode compiled');\n } catch (error: any) {\n hermesSpinner.fail(`Hermes compilation failed: ${error.message}`);\n process.exit(1);\n }\n\n // Save hermes artifacts\n if (options.keepArtifacts) {\n await keepArtifacts(contentRootPath, platform, 'hermes');\n }\n }\n\n // STEP 3: Sign Bundle (optional)\n if (options.privateKey) {\n const signSpinner = ora('Signing bundle...').start();\n try {\n const bundlesDir = path.join(contentRootPath, 'bundles');\n await signBundleDirectory(bundlesDir, options.privateKey);\n signSpinner.succeed('Bundle signed with JWT RS256');\n } catch (error: any) {\n signSpinner.fail(`Signing failed: ${error.message}`);\n process.exit(1);\n }\n }\n\n // STEP 4: Create ZIP Archive\n const zipSpinner = ora('Creating ZIP archive...').start();\n const bundlesDir = path.join(contentRootPath, 'bundles');\n await createZip(bundlesDir, contentRootPath);\n const zipPath = path.join(contentRootPath, 'build.zip');\n\n if (!await fs.pathExists(zipPath)) {\n zipSpinner.fail('ZIP creation failed: build.zip not found');\n process.exit(1);\n }\n\n const zipSize = (await fs.stat(zipPath)).size;\n zipSpinner.succeed(`ZIP archive created: ${chalk.gray(formatBytes(zipSize))}`);\n\n // STEP 5: Calculate hash\n const hashSpinner = ora('Computing ZIP hash...').start();\n const hash = calculateZipHash(zipPath);\n if (!hash) {\n hashSpinner.fail('Failed to compute ZIP hash');\n process.exit(1);\n }\n hashSpinner.succeed(`ZIP hash: ${chalk.gray(hash.slice(0, 16))}...`);\n\n // STEP 6: Read bundle signature (if signed)\n let bundleSignature: string | undefined;\n if (options.privateKey) {\n const bundlesDir2 = path.join(contentRootPath, 'bundles');\n const sig = await readBundleSignature(bundlesDir2);\n if (sig) bundleSignature = sig;\n }\n\n // STEP 7: Get signed URL\n const urlSpinner = ora('Requesting upload URL...').start();\n try {\n const { url } = await api.generateSignedUrl(\n {\n hash,\n uploadPath,\n platform,\n releaseNote: options.releaseNote || '',\n signature: bundleSignature,\n },\n ciToken\n );\n\n urlSpinner.succeed('Upload URL received');\n\n // STEP 7: Upload ZIP\n const uploadSpinner = ora('Uploading bundle...').start();\n await uploader.uploadZip(url, zipPath, (percent) => {\n uploadSpinner.text = `Uploading bundle... ${percent}%`;\n });\n uploadSpinner.succeed('Bundle uploaded');\n\n // Done!\n console.log('');\n console.log(chalk.green(' Bundle published successfully!'));\n console.log('');\n console.log(` Hash: ${chalk.cyan(hash)}`);\n console.log(` Platform: ${chalk.cyan(platform)}`);\n console.log(` Size: ${chalk.gray(formatBytes(zipSize))}`);\n if (options.hermes) {\n console.log(` Hermes: ${chalk.green('Yes')}`);\n }\n if (options.privateKey) {\n console.log(` Signed: ${chalk.green('Yes')}`);\n }\n console.log('');\n console.log(\n chalk.gray(' Use this hash to create a release:')\n );\n console.log(\n ` ${chalk.cyan(`swiftpatch release-bundle --hash ${hash} --app-version <version>`)}`\n );\n console.log('');\n } catch (error: any) {\n urlSpinner.fail(`Upload failed: ${error.message}`);\n process.exit(1);\n }\n } finally {\n // Cleanup temp directory\n await fs.remove(contentRootPath).catch(() => {});\n }\n });\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return bytes + ' B';\n if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB';\n return (bytes / 1024 / 1024).toFixed(1) + ' MB';\n}\n","import archiver from 'archiver';\nimport fs from 'fs';\nimport path from 'path';\n\n/**\n * Create a ZIP archive from an input directory.\n * Contents are placed inside a `build/` subdirectory in the ZIP.\n */\nexport function createZip(inputPath: string, outputPath: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const zipPath = path.join(outputPath, 'build.zip');\n const output = fs.createWriteStream(zipPath);\n const archive = archiver('zip', { zlib: { level: 9 } });\n\n output.on('close', () => resolve());\n archive.on('error', (err: Error) => reject(err));\n\n archive.pipe(output);\n archive.directory(inputPath, 'build');\n archive.finalize();\n });\n}\n","import fs from 'fs-extra';\nimport path from 'path';\n\nexport type ArtifactVariant = 'normal' | 'hermes';\n\n/**\n * Save intermediate bundle artifacts for debugging.\n * Copies current build outputs to swiftpatch-artifacts/<platform>/<variant>/\n */\nexport async function keepArtifacts(\n contentRootPath: string,\n platform: string,\n variant: ArtifactVariant\n): Promise<void> {\n const artifactsDir = path.join(process.cwd(), 'swiftpatch-artifacts', platform, variant);\n await fs.ensureDir(artifactsDir);\n\n const bundlesDir = path.join(contentRootPath, 'bundles');\n const sourcemapsDir = path.join(contentRootPath, 'sourcemaps');\n\n // Copy bundles\n if (await fs.pathExists(bundlesDir)) {\n await copyDirRecursive(bundlesDir, path.join(artifactsDir, 'bundles'));\n }\n\n // Copy sourcemaps if present\n if (await fs.pathExists(sourcemapsDir)) {\n await copyDirRecursive(sourcemapsDir, path.join(artifactsDir, 'sourcemaps'));\n }\n}\n\nasync function copyDirRecursive(srcDir: string, destDir: string): Promise<void> {\n await fs.ensureDir(destDir);\n const entries = await fs.readdir(srcDir);\n\n for (const entry of entries) {\n const srcPath = path.join(srcDir, entry);\n const destPath = path.join(destDir, entry);\n const stat = await fs.stat(srcPath);\n\n if (stat.isDirectory()) {\n await copyDirRecursive(srcPath, destPath);\n } else {\n await fs.copyFile(srcPath, destPath);\n }\n }\n}\n","import * as path from 'path';\nimport * as fs from 'fs';\nimport * as childProcess from 'child_process';\nimport { coerce, compare } from 'semver';\nimport { logger } from '../utils/logger.js';\n\nfunction findUpwardReactNativePackageJson(startDir: string = process.cwd()): string | null {\n let current = startDir;\n while (current !== path.parse(current).root) {\n const candidate = path.join(current, 'node_modules', 'react-native', 'package.json');\n if (fs.existsSync(candidate)) return candidate;\n current = path.dirname(current);\n }\n return null;\n}\n\nexport function getReactNativeVersion(): string | null {\n const rnPackageJsonPath = findUpwardReactNativePackageJson();\n if (!rnPackageJsonPath) return null;\n const rnPackageJson = JSON.parse(fs.readFileSync(rnPackageJsonPath, 'utf-8'));\n return rnPackageJson.version;\n}\n\nfunction directoryExistsSync(dirname: string): boolean {\n try {\n return fs.statSync(dirname).isDirectory();\n } catch (err: any) {\n if (err.code !== 'ENOENT') throw err;\n }\n return false;\n}\n\nfunction getReactNativePackagePath(): string {\n const rnPackageJsonPath = findUpwardReactNativePackageJson();\n if (rnPackageJsonPath) return path.dirname(rnPackageJsonPath);\n\n const result = childProcess.spawnSync('node', [\n '--print',\n \"require.resolve('react-native/package.json')\",\n ]);\n const packagePath = path.dirname(result.stdout.toString().trim());\n if (result.status === 0 && directoryExistsSync(packagePath)) return packagePath;\n\n return path.join('node_modules', 'react-native');\n}\n\nfunction resolvePackageDirFromCwd(packageName: string): string | null {\n const result = childProcess.spawnSync('node', [\n '--print',\n `require.resolve('${packageName}/package.json')`,\n ]);\n if (result.status !== 0) return null;\n const resolved = result.stdout.toString().trim();\n if (!resolved) return null;\n const packageDir = path.dirname(resolved);\n return directoryExistsSync(packageDir) ? packageDir : null;\n}\n\nexport function isValidPlatform(platform: string): boolean {\n return platform?.toLowerCase() === 'android' || platform?.toLowerCase() === 'ios';\n}\n\nexport function fileDoesNotExistOrIsDirectory(filePath: string): boolean {\n try {\n return fs.statSync(filePath).isDirectory();\n } catch {\n return true;\n }\n}\n\nexport function fileExists(filePath: string): boolean {\n try {\n return fs.statSync(filePath).isFile();\n } catch {\n return false;\n }\n}\n\nfunction getCliPath(): string {\n return path.join(getReactNativePackagePath(), 'cli.js');\n}\n\nexport async function runReactNativeBundleCommand(\n bundleName: string,\n entryFile: string,\n outputFolder: string,\n platform: string,\n sourcemap: boolean,\n devMode: boolean\n): Promise<void> {\n // Ensure output subfolders exist\n fs.mkdirSync(path.join(outputFolder, 'bundles'), { recursive: true });\n if (sourcemap) {\n fs.mkdirSync(path.join(outputFolder, 'sourcemaps'), { recursive: true });\n }\n\n const reactNativeBundleArgs: any[] = [\n getCliPath(),\n 'bundle',\n '--dev', devMode,\n '--assets-dest', path.join(outputFolder, 'bundles'),\n '--bundle-output', path.join(outputFolder, 'bundles', bundleName),\n '--entry-file', entryFile,\n '--platform', platform,\n ...(sourcemap\n ? ['--sourcemap-output', path.join(outputFolder, 'sourcemaps', bundleName + '.map')]\n : []),\n ];\n\n logger.info('Running \"react-native bundle\" command');\n\n const reactNativeBundleProcess = childProcess.spawn('node', reactNativeBundleArgs);\n\n return new Promise<void>((resolve, reject) => {\n reactNativeBundleProcess.stdout.on('data', (data: Buffer) => {\n console.log(data.toString().trim());\n });\n\n reactNativeBundleProcess.stderr.on('data', (data: Buffer) => {\n logger.error(data.toString().trim());\n });\n\n reactNativeBundleProcess.on('close', (exitCode: number, signal: string) => {\n if (exitCode !== 0) {\n reject(\n new Error(`\"react-native bundle\" command failed (exitCode=${exitCode}, signal=${signal}).`)\n );\n }\n resolve();\n });\n });\n}\n\nexport async function runHermesEmitBinaryCommand(\n bundleName: string,\n outputFolder: string,\n hermesLogs: boolean = false,\n hermescPath?: string,\n sourcemap: boolean = false\n): Promise<void> {\n const hermesArgs: string[] = [\n ...(sourcemap ? ['--output-source-map'] : []),\n '--emit-binary',\n '--out', path.join(outputFolder, bundleName + '.hbc'),\n path.join(outputFolder, 'bundles', bundleName),\n ];\n\n logger.info('Converting JS bundle to Hermes bytecode');\n const hermesCommand = await getHermesCommand();\n logger.info(`Hermesc path: ${hermescPath || hermesCommand}`);\n\n const hermesProcess = childProcess.spawn(hermescPath || hermesCommand, hermesArgs);\n\n let logFile: fs.WriteStream | null = null;\n let isWarned = false;\n if (hermesLogs) {\n logFile = fs.createWriteStream('output.log', { flags: 'a' });\n }\n\n return new Promise<void>((resolve, reject) => {\n hermesProcess.stdout.on('data', (data: Buffer) => {\n logger.info(data.toString().trim());\n });\n\n hermesProcess.stderr.on('data', (data: Buffer) => {\n if (isWarned) {\n if (hermesLogs && logFile) logFile.write(data.toString().trim());\n return;\n }\n isWarned = true;\n logger.warning('Hermes command executed with warnings. Use --hermes-logs for full logs.');\n });\n\n hermesProcess.on('close', (exitCode: number, signal: string) => {\n if (hermesLogs && logFile) {\n logger.success('Done writing logs in output.log file.');\n logFile.end();\n }\n\n if (exitCode !== 0) {\n reject(new Error(`\"hermes\" command failed (exitCode=${exitCode}, signal=${signal}).`));\n return;\n }\n\n const source = path.join(outputFolder, bundleName + '.hbc');\n const destination = path.join(outputFolder, 'bundles', bundleName);\n fs.copyFile(source, destination, (err) => {\n if (err) {\n reject(new Error(`Copying Hermes output failed: ${err.message}`));\n return;\n }\n fs.unlink(source, (unlinkErr) => {\n if (unlinkErr) {\n reject(unlinkErr);\n return;\n }\n resolve();\n });\n });\n });\n });\n}\n\nfunction getHermesOSBin(): string {\n switch (process.platform) {\n case 'win32': return 'win64-bin';\n case 'darwin': return 'osx-bin';\n default: return 'linux64-bin';\n }\n}\n\nfunction getHermesOSExe(): string {\n const versionObj = coerce(getReactNativeVersion());\n if (!versionObj?.version) {\n throw new Error('Unable to determine React Native version');\n }\n const react63orAbove = compare(versionObj.version, '0.63.0') !== -1;\n const hermesExecutableName = react63orAbove ? 'hermesc' : 'hermes';\n return process.platform === 'win32' ? hermesExecutableName + '.exe' : hermesExecutableName;\n}\n\nasync function getHermesCommand(): Promise<string> {\n // 1. Check React Native bundled SDK\n const bundledHermesEngine = path.join(\n getReactNativePackagePath(), 'sdks', 'hermesc', getHermesOSBin(), getHermesOSExe()\n );\n if (fileExists(bundledHermesEngine)) return bundledHermesEngine;\n\n // 2. Check hermes-engine package\n const hermesEnginePackageDir = resolvePackageDirFromCwd('hermes-engine');\n if (hermesEnginePackageDir) {\n const hermesEngine = path.join(hermesEnginePackageDir, getHermesOSBin(), getHermesOSExe());\n if (fileExists(hermesEngine)) return hermesEngine;\n }\n const hermesEngine = path.join('node_modules', 'hermes-engine', getHermesOSBin(), getHermesOSExe());\n if (fileExists(hermesEngine)) return hermesEngine;\n\n // 3. Check hermes-compiler package\n const hermesCompilerPackageDir = resolvePackageDirFromCwd('hermes-compiler');\n if (hermesCompilerPackageDir) {\n const hermesCompiler = path.join(hermesCompilerPackageDir, 'hermesc', getHermesOSBin(), getHermesOSExe());\n if (fileExists(hermesCompiler)) return hermesCompiler;\n }\n const hermesCompiler = path.join('node_modules', 'hermes-compiler', 'hermesc', getHermesOSBin(), getHermesOSExe());\n if (fileExists(hermesCompiler)) return hermesCompiler;\n\n // 4. Check hermesvm package\n const hermesVmPackageDir = resolvePackageDirFromCwd('hermesvm');\n if (hermesVmPackageDir) {\n return path.join(hermesVmPackageDir, getHermesOSBin(), 'hermes');\n }\n\n return path.join('node_modules', 'hermesvm', getHermesOSBin(), 'hermes');\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { api } from '../lib/api.js';\nimport { logger } from '../utils/logger.js';\n\ninterface ReleaseBundleOptions {\n hash: string;\n appVersion: string;\n projectId?: string;\n releaseNote?: string;\n mandatory?: boolean;\n paused?: boolean;\n ciToken?: string;\n}\n\nexport const releaseBundleCommand = new Command('release-bundle')\n .description('Promote a published bundle to a release (requires CI token)')\n .requiredOption('--hash <hash>', 'Bundle hash from publish-bundle output')\n .requiredOption('--app-version <version>', 'Target binary app version (semver)')\n .option('--project-id <id>', 'Project/App ID')\n .option('-n, --release-note <note>', 'Release notes', '')\n .option('-m, --mandatory', 'Mark as mandatory update', false)\n .option('--paused', 'Create release in paused state', false)\n .option('--ci-token <token>', 'CI token for authentication')\n .action(async (options: ReleaseBundleOptions) => {\n const ciToken = options.ciToken || process.env.SWIFTPATCH_CI_TOKEN;\n if (!ciToken) {\n logger.error('CI token required. Provide --ci-token or set SWIFTPATCH_CI_TOKEN env var.');\n process.exit(1);\n }\n\n if (!options.projectId) {\n logger.error('--project-id is required for release-bundle.');\n process.exit(1);\n }\n\n console.log('');\n logger.info(chalk.bold('SwiftPatch Release Bundle'));\n console.log('');\n\n const spinner = ora('Promoting bundle to release...').start();\n\n try {\n const result = await api.promoteBundle(\n {\n projectId: options.projectId,\n hash: options.hash,\n appVersion: options.appVersion,\n releaseNote: options.releaseNote || '',\n isMandatory: options.mandatory || false,\n isPaused: options.paused || false,\n },\n ciToken\n );\n\n spinner.succeed('Bundle promoted to release!');\n\n console.log('');\n console.log(chalk.green(' Release created successfully!'));\n console.log('');\n console.log(` Hash: ${chalk.cyan(options.hash.slice(0, 16))}...`);\n console.log(` App Version: ${chalk.cyan(options.appVersion)}`);\n console.log(` Mandatory: ${options.mandatory ? chalk.yellow('Yes') : chalk.gray('No')}`);\n console.log(` Paused: ${options.paused ? chalk.yellow('Yes') : chalk.gray('No')}`);\n if (result?.id) {\n console.log(` Release ID: ${chalk.gray(result.id)}`);\n }\n console.log('');\n } catch (error: any) {\n spinner.fail(`Release failed: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { api } from '../lib/api.js';\nimport { logger } from '../utils/logger.js';\n\ninterface UpdateReleaseOptions {\n hash: string;\n projectId?: string;\n releaseNote?: string;\n mandatory?: boolean;\n paused?: boolean;\n rolledBack?: boolean;\n rollout?: string;\n ciToken?: string;\n}\n\nexport const updateReleaseCommand = new Command('update-release')\n .description('Update an existing release by bundle hash (requires CI token)')\n .requiredOption('--hash <hash>', 'Bundle hash of the release to update')\n .option('--project-id <id>', 'Project/App ID')\n .option('-n, --release-note <note>', 'Updated release notes')\n .option('-m, --mandatory', 'Mark as mandatory update')\n .option('--paused', 'Pause the release')\n .option('--rolled-back', 'Mark release as rolled back')\n .option('-r, --rollout <percent>', 'Rollout percentage (1-100)')\n .option('--ci-token <token>', 'CI token for authentication')\n .action(async (options: UpdateReleaseOptions) => {\n const ciToken = options.ciToken || process.env.SWIFTPATCH_CI_TOKEN;\n if (!ciToken) {\n logger.error('CI token required. Provide --ci-token or set SWIFTPATCH_CI_TOKEN env var.');\n process.exit(1);\n }\n\n if (!options.projectId) {\n logger.error('--project-id is required for update-release.');\n process.exit(1);\n }\n\n console.log('');\n logger.info(chalk.bold('SwiftPatch Update Release'));\n console.log('');\n\n const spinner = ora('Updating release...').start();\n\n try {\n const params: Record<string, any> = {\n projectId: options.projectId,\n hash: options.hash,\n };\n\n if (options.releaseNote !== undefined) params.releaseNote = options.releaseNote;\n if (options.mandatory !== undefined) params.isMandatory = options.mandatory;\n if (options.paused !== undefined) params.isPaused = options.paused;\n if (options.rolledBack !== undefined) params.isRolledBack = options.rolledBack;\n if (options.rollout !== undefined) params.rolloutPercent = parseInt(options.rollout, 10);\n\n const result = await api.updateReleaseCli(params as any, ciToken);\n\n spinner.succeed('Release updated!');\n\n console.log('');\n console.log(chalk.green(' Release updated successfully!'));\n console.log('');\n console.log(` Hash: ${chalk.cyan(options.hash.slice(0, 16))}...`);\n if (options.releaseNote) {\n console.log(` Note: ${chalk.gray(options.releaseNote.slice(0, 60))}`);\n }\n if (options.mandatory !== undefined) {\n console.log(` Mandatory: ${options.mandatory ? chalk.yellow('Yes') : chalk.gray('No')}`);\n }\n if (options.paused !== undefined) {\n console.log(` Paused: ${options.paused ? chalk.yellow('Yes') : chalk.gray('No')}`);\n }\n if (options.rolledBack !== undefined) {\n console.log(` Rolled Back: ${options.rolledBack ? chalk.yellow('Yes') : chalk.gray('No')}`);\n }\n if (options.rollout !== undefined) {\n console.log(` Rollout: ${chalk.cyan(options.rollout + '%')}`);\n }\n if (result?.id) {\n console.log(` Release ID: ${chalk.gray(result.id)}`);\n }\n console.log('');\n } catch (error: any) {\n spinner.fail(`Update failed: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport path from 'path';\nimport { generateKeyPair } from '../lib/signing.js';\nimport { logger } from '../utils/logger.js';\n\ninterface GenerateKeyPairOptions {\n output?: string;\n}\n\nexport const generateKeyPairCommand = new Command('generate-key-pair')\n .description('Generate RSA 2048-bit key pair for bundle signing')\n .option('-o, --output <dir>', 'Output directory for key files', '.')\n .action(async (options: GenerateKeyPairOptions) => {\n console.log('');\n logger.info(chalk.bold('SwiftPatch Generate Key Pair'));\n console.log('');\n\n const outputDir = path.resolve(options.output || '.');\n const spinner = ora('Generating RSA 2048-bit key pair...').start();\n\n try {\n const { publicKeyPath, privateKeyPath } = await generateKeyPair(outputDir);\n\n spinner.succeed('Key pair generated!');\n\n console.log('');\n console.log(chalk.green(' Key pair created successfully!'));\n console.log('');\n console.log(` Public key: ${chalk.cyan(publicKeyPath)}`);\n console.log(` Private key: ${chalk.cyan(privateKeyPath)}`);\n console.log('');\n console.log(chalk.gray(' Usage:'));\n console.log(chalk.gray(' 1. Upload the public key to your app settings in the SwiftPatch dashboard'));\n console.log(chalk.gray(' 2. Use --private-key flag when publishing bundles:'));\n console.log(` ${chalk.cyan(`swiftpatch publish-bundle --private-key ${privateKeyPath} -p ios`)}`);\n console.log('');\n console.log(chalk.yellow(' Important: Keep your private key secure and never commit it to version control.'));\n console.log(chalk.yellow(' Add it to .gitignore:'));\n console.log(` ${chalk.gray('echo \"swiftpatch-private.pem\" >> .gitignore')}`);\n console.log('');\n } catch (error: any) {\n spinner.fail(`Key generation failed: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport fs from 'fs-extra';\nimport path from 'path';\nimport { api } from '../lib/api.js';\nimport { requireAuth } from '../utils/auth-guard.js';\nimport { resolveOrgId } from '../utils/org-resolver.js';\nimport { runReactNativeBundleCommand, runHermesEmitBinaryCommand } from '../lib/react-native-utils.js';\nimport { createZip } from '../lib/archive.js';\nimport { calculateZipHash } from '../lib/hash.js';\nimport { uploader } from '../lib/uploader.js';\nimport { logger } from '../utils/logger.js';\n\nexport const deployCommand = new Command('deploy')\n .description('Bundle, publish, and release in one step')\n .option('-p, --platform <platform>', 'Target platform (ios or android)')\n .option('-a, --app <app-id>', 'App ID or slug')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('--app-version <version>', 'Target app version (semver)')\n .option('-n, --release-note <note>', 'Release notes')\n .option('-m, --mandatory', 'Mark as mandatory update')\n .option('--paused', 'Create release in paused state')\n .option('--hermes', 'Compile to Hermes bytecode')\n .option('--ci-token <token>', 'CI token for authentication')\n .option('-e, --entry-file <path>', 'Entry file (default: index.js)')\n .option('--dev', 'Dev bundle')\n .option('--sourcemap', 'Generate sourcemaps')\n .option('-k, --private-key <path>', 'Private key path for signing')\n .option('-y, --yes', 'Skip confirmations')\n .action(async (options) => {\n const ciToken = options.ciToken || process.env.SWIFTPATCH_CI_TOKEN;\n\n if (!ciToken) {\n await requireAuth();\n }\n\n const orgId = ciToken ? undefined : await resolveOrgId(options.org);\n\n // Resolve platform\n let platform = options.platform;\n if (!platform) {\n const hasIos = await fs.pathExists('./ios');\n const hasAndroid = await fs.pathExists('./android');\n\n if (hasIos && !hasAndroid) {\n platform = 'ios';\n } else if (hasAndroid && !hasIos) {\n platform = 'android';\n } else {\n const answers = await inquirer.prompt([\n {\n type: 'list',\n name: 'platform',\n message: 'Select platform:',\n choices: ['ios', 'android'],\n },\n ]);\n platform = answers.platform;\n }\n }\n\n // Resolve app version\n let appVersion = options.appVersion;\n if (!appVersion) {\n try {\n const pkg = await fs.readJson('./package.json');\n appVersion = pkg.version;\n } catch {\n // ignore\n }\n\n if (!appVersion) {\n const answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'version',\n message: 'App version (semver):',\n validate: (v: string) => /^\\d+\\.\\d+\\.\\d+/.test(v) || 'Must be valid semver (e.g., 1.0.0)',\n },\n ]);\n appVersion = answers.version;\n } else if (!options.yes) {\n console.log(chalk.gray(` Detected version: ${appVersion}`));\n }\n }\n\n const releaseNote = options.releaseNote || '';\n\n // Resolve app ID for upload path\n let uploadPath = options.app || '';\n if (!uploadPath && orgId) {\n const apps = await api.getApps(orgId);\n if (apps.length === 1) {\n uploadPath = apps[0].slug || apps[0].id;\n if (!options.yes) console.log(chalk.gray(` Using app: ${apps[0].name}`));\n } else if (apps.length > 1) {\n const { selectedApp } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selectedApp',\n message: 'Select app:',\n choices: apps.map(a => ({ name: `${a.name} (${a.platform})`, value: a.slug || a.id })),\n },\n ]);\n uploadPath = selectedApp;\n }\n }\n\n console.log('');\n console.log(chalk.bold(' Deploy'));\n console.log(chalk.gray(` Platform: ${platform} · Version: ${appVersion}`));\n console.log('');\n\n // Step 1: Bundle\n const bundleSpinner = ora('Bundling JavaScript...').start();\n try {\n const entryFile = options.entryFile || 'index.js';\n const outputDir = path.join('.swiftpatch-tmp', platform);\n await fs.ensureDir(outputDir);\n\n const bundleName = platform === 'ios' ? 'main.jsbundle' : 'index.android.bundle';\n await runReactNativeBundleCommand(\n bundleName,\n entryFile,\n outputDir,\n platform,\n options.sourcemap || false,\n options.dev || false,\n );\n\n // Hermes compilation\n if (options.hermes) {\n bundleSpinner.text = 'Compiling to Hermes bytecode...';\n // Hermes compilation is handled inside bundleReactNative when hermes flag is set\n }\n\n bundleSpinner.succeed('Bundle created');\n } catch (error: any) {\n bundleSpinner.fail(`Bundle failed: ${error.message}`);\n process.exit(1);\n }\n\n // Step 2: Archive + Hash\n const archiveSpinner = ora('Creating archive...').start();\n let zipPath: string;\n let bundleHash: string | null;\n try {\n const outputDir = path.join('.swiftpatch-tmp', platform);\n const zipOutputDir = path.join('.swiftpatch-tmp', 'zip');\n await fs.ensureDir(zipOutputDir);\n await createZip(outputDir, zipOutputDir);\n zipPath = path.join(zipOutputDir, 'build.zip');\n bundleHash = calculateZipHash(zipPath);\n if (!bundleHash) throw new Error('Failed to compute bundle hash');\n archiveSpinner.succeed(`Archive created (hash: ${bundleHash.slice(0, 12)}...)`);\n } catch (error: any) {\n archiveSpinner.fail(`Archive failed: ${error.message}`);\n process.exit(1);\n }\n\n // Step 3: Upload\n const uploadSpinner = ora('Uploading bundle...').start();\n try {\n const { url } = await api.generateSignedUrl(\n { hash: bundleHash, uploadPath, platform, releaseNote },\n ciToken\n );\n\n await uploader.uploadZip(url, zipPath!, (progress: number) => {\n uploadSpinner.text = `Uploading bundle... ${progress}%`;\n });\n\n uploadSpinner.succeed('Bundle uploaded');\n } catch (error: any) {\n uploadSpinner.fail(`Upload failed: ${error.message}`);\n process.exit(1);\n }\n\n // Step 4: Promote to release\n if (!ciToken) {\n console.log('');\n logger.warning('Deploy requires a CI token to create the release.');\n console.log(chalk.gray(' Bundle was uploaded. Promote it manually:'));\n console.log(chalk.cyan(` $ swiftpatch release-bundle --hash ${bundleHash} --app-version ${appVersion} --ci-token <token>`));\n console.log('');\n } else {\n const releaseSpinner = ora('Creating release...').start();\n try {\n await api.promoteBundle(\n {\n projectId: uploadPath,\n hash: bundleHash,\n appVersion,\n releaseNote,\n isMandatory: options.mandatory || false,\n isPaused: options.paused || false,\n },\n ciToken\n );\n\n releaseSpinner.succeed('Release created!');\n\n console.log('');\n console.log(chalk.bold(' Deploy Complete'));\n console.log(` Hash: ${chalk.gray(bundleHash)}`);\n console.log(` Version: ${chalk.cyan(appVersion)}`);\n console.log(` Platform: ${platform}`);\n console.log(` Mandatory: ${options.mandatory ? chalk.yellow('Yes') : 'No'}`);\n console.log(` Status: ${options.paused ? chalk.yellow('Paused') : chalk.green('Released')}`);\n console.log('');\n } catch (error: any) {\n releaseSpinner.fail(`Release failed: ${error.message}`);\n process.exit(1);\n }\n }\n\n // Cleanup\n await fs.remove('.swiftpatch-tmp').catch(() => {});\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport { api } from '../lib/api.js';\nimport { requireAuth } from '../utils/auth-guard.js';\nimport { resolveOrgId } from '../utils/org-resolver.js';\n\nexport const statusCommand = new Command('status')\n .description('Show app status at a glance')\n .argument('[app-id]', 'App ID')\n .option('-o, --org <org-id>', 'Organization ID')\n .option('--json', 'Output as JSON')\n .action(async (appId, options) => {\n await requireAuth();\n\n const orgId = await resolveOrgId(options.org);\n\n if (!appId) {\n const apps = await api.getApps(orgId);\n if (apps.length === 0) {\n console.log('');\n console.log(chalk.gray(' No apps found. Create one with: swiftpatch apps create'));\n console.log('');\n return;\n }\n const { selectedApp } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selectedApp',\n message: 'Select app:',\n choices: apps.map(app => ({ name: `${app.name} (${app.platform})`, value: app.id })),\n },\n ]);\n appId = selectedApp;\n }\n\n const spinner = ora('Fetching status...').start();\n\n try {\n const [app, releasesResult, channels, analytics] = await Promise.all([\n api.getApp(orgId, appId),\n api.getReleases(orgId, appId, { page: 1, limit: 5 }),\n api.getChannels(orgId, appId),\n api.getAnalytics(orgId, appId, { days: 7 }).catch(() => null),\n ]);\n\n spinner.stop();\n\n if (options.json) {\n console.log(JSON.stringify({ app, releases: releasesResult.releases, channels, analytics }, null, 2));\n return;\n }\n\n console.log('');\n console.log(chalk.bold(` ${app.name}`));\n console.log(chalk.gray(` ${app.slug} · ${app.platform} · ${app.signingEnabled ? 'Signing enabled' : 'No signing'}`));\n console.log('');\n\n // Stats\n if (app.stats) {\n console.log(chalk.bold(' Overview'));\n console.log(` Releases: ${chalk.cyan(String(app.stats.totalReleases))}`);\n console.log(` Total Installs: ${chalk.cyan(String(app.stats.totalInstalls))}`);\n console.log(` Active Devices: ${chalk.green(String(app.stats.activeDevices))}`);\n console.log('');\n }\n\n // Analytics (7-day)\n if (analytics) {\n console.log(chalk.bold(' Last 7 Days'));\n console.log(` Updates: ${chalk.cyan(String(analytics.totalUpdates))}`);\n console.log(` Success Rate: ${analytics.successRate >= 95 ? chalk.green(analytics.successRate + '%') : chalk.yellow(analytics.successRate + '%')}`);\n if (analytics.failedUpdates > 0) {\n console.log(` Failed: ${chalk.red(String(analytics.failedUpdates))}`);\n }\n console.log('');\n }\n\n // Recent releases\n const releases = releasesResult.releases;\n if (releases.length > 0) {\n console.log(chalk.bold(' Recent Releases'));\n for (const r of releases) {\n const statusColor = r.status === 'RELEASED' ? chalk.green :\n r.status === 'DISABLED' ? chalk.red :\n r.status === 'READY' ? chalk.blue : chalk.gray;\n console.log(\n ` ${statusColor('●')} v${r.version} (build ${r.buildNumber}) · ${r.platform} · ${statusColor(r.status)} · ${r.rolloutPercent}% rollout`\n );\n }\n console.log('');\n }\n\n // Channels\n if (channels.length > 0) {\n console.log(chalk.bold(' Channels'));\n console.log(` ${channels.map(c => chalk.cyan(c.name)).join(', ')}`);\n console.log('');\n }\n\n console.log(chalk.gray(` Deployment Key: ${app.deploymentKey}`));\n console.log('');\n } catch (error: any) {\n spinner.fail(`Failed to fetch status: ${error.message}`);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport fs from 'fs-extra';\nimport path from 'path';\nimport { api } from '../lib/api.js';\nimport { auth } from '../lib/auth.js';\nimport { config } from '../lib/config.js';\nimport { requireAuth } from '../utils/auth-guard.js';\nimport { resolveOrgId } from '../utils/org-resolver.js';\nimport { logger } from '../utils/logger.js';\n\nexport const initCommand = new Command('init')\n .description('Initialize SwiftPatch in your React Native project')\n .option('-y, --yes', 'Accept defaults')\n .action(async (options) => {\n console.log('');\n console.log(chalk.bold(' SwiftPatch Setup'));\n console.log('');\n\n // Check if this is a React Native project\n const hasPackageJson = await fs.pathExists('./package.json');\n if (!hasPackageJson) {\n logger.error('No package.json found. Run this command in your React Native project root.');\n process.exit(1);\n }\n\n const pkg = await fs.readJson('./package.json');\n const hasRN = pkg.dependencies?.['react-native'] || pkg.devDependencies?.['react-native'];\n if (!hasRN) {\n logger.warning('react-native not found in dependencies. Is this a React Native project?');\n if (!options.yes) {\n const { proceed } = await inquirer.prompt([\n { type: 'confirm', name: 'proceed', message: 'Continue anyway?', default: false },\n ]);\n if (!proceed) return;\n }\n } else {\n logger.success(`React Native project detected (${hasRN})`);\n }\n\n // Check SDK\n const hasSDK = pkg.dependencies?.['@swiftpatch/react-native'] || pkg.devDependencies?.['@swiftpatch/react-native'];\n if (!hasSDK) {\n logger.warning('@swiftpatch/react-native SDK not installed');\n console.log(chalk.gray(' Install with: npm install @swiftpatch/react-native'));\n console.log('');\n } else {\n logger.success(`SwiftPatch SDK installed (${hasSDK})`);\n }\n\n // Check auth\n if (!auth.isLoggedIn()) {\n logger.warning('Not logged in');\n console.log(chalk.gray(' Run: swiftpatch login'));\n console.log('');\n process.exit(1);\n }\n logger.success('Authenticated');\n\n // Resolve organization\n const orgId = await resolveOrgId();\n\n // Detect platforms\n const hasIos = await fs.pathExists('./ios');\n const hasAndroid = await fs.pathExists('./android');\n const platforms: string[] = [];\n if (hasIos) platforms.push('ios');\n if (hasAndroid) platforms.push('android');\n if (platforms.length > 0) {\n logger.success(`Platforms detected: ${platforms.join(', ')}`);\n }\n\n // Select or create app\n const spinner = ora('Fetching apps...').start();\n const apps = await api.getApps(orgId);\n spinner.stop();\n\n let selectedApp: any;\n\n if (apps.length > 0 && !options.yes) {\n const { action } = await inquirer.prompt([\n {\n type: 'list',\n name: 'action',\n message: 'Link to an existing app or create a new one?',\n choices: [\n { name: 'Link existing app', value: 'link' },\n { name: 'Create new app', value: 'create' },\n ],\n },\n ]);\n\n if (action === 'link') {\n const { appChoice } = await inquirer.prompt([\n {\n type: 'list',\n name: 'appChoice',\n message: 'Select app:',\n choices: apps.map(a => ({ name: `${a.name} (${a.platform})`, value: a })),\n },\n ]);\n selectedApp = appChoice;\n } else {\n selectedApp = await createApp(orgId, pkg, platforms);\n }\n } else if (apps.length === 0) {\n console.log(chalk.gray(' No apps found. Creating one...'));\n selectedApp = await createApp(orgId, pkg, platforms);\n } else {\n selectedApp = apps[0];\n }\n\n // Determine platform setting\n let defaultPlatform: 'ios' | 'android' | undefined;\n if (hasIos && !hasAndroid) defaultPlatform = 'ios';\n if (hasAndroid && !hasIos) defaultPlatform = 'android';\n\n // Write .swiftpatchrc\n const rcConfig = {\n appId: selectedApp.id,\n app: selectedApp.slug,\n platform: defaultPlatform || (selectedApp.platform === 'BOTH' ? undefined : selectedApp.platform.toLowerCase()),\n deploymentKey: selectedApp.deploymentKey,\n };\n\n const rcPath = path.resolve('.swiftpatchrc');\n await fs.writeJson(rcPath, rcConfig, { spaces: 2 });\n logger.success('Created .swiftpatchrc');\n\n // Save defaults to CLI config\n config.set('defaultOrg', orgId);\n config.set('defaultApp', selectedApp.id);\n if (defaultPlatform) config.set('defaultPlatform', defaultPlatform);\n logger.success('Saved defaults to CLI config');\n\n // Summary\n console.log('');\n console.log(chalk.bold(' Setup Complete'));\n console.log('');\n console.log(` App: ${chalk.cyan(selectedApp.name)}`);\n console.log(` Platform: ${selectedApp.platform}`);\n console.log(` Deployment Key: ${chalk.gray(selectedApp.deploymentKey)}`);\n console.log(` Config: ${chalk.gray(rcPath)}`);\n console.log('');\n console.log(chalk.bold(' Next Steps'));\n console.log(chalk.gray(' 1. Add the deployment key to your app (Info.plist / strings.xml)'));\n console.log(chalk.gray(' 2. Wrap your app with <SwiftPatchProvider />'));\n console.log(chalk.gray(' 3. Run: swiftpatch deploy -p ios --ci-token <token>'));\n console.log('');\n });\n\nasync function createApp(orgId: string, pkg: any, platforms: string[]): Promise<any> {\n const { name } = await inquirer.prompt([\n {\n type: 'input',\n name: 'name',\n message: 'App name:',\n default: pkg.name || path.basename(process.cwd()),\n },\n ]);\n\n let platform: 'IOS' | 'ANDROID' | 'BOTH';\n if (platforms.length === 2) {\n platform = 'BOTH';\n } else if (platforms.length === 1) {\n platform = platforms[0].toUpperCase() as 'IOS' | 'ANDROID';\n } else {\n const { p } = await inquirer.prompt([\n {\n type: 'list',\n name: 'p',\n message: 'Platform:',\n choices: [\n { name: 'iOS', value: 'IOS' },\n { name: 'Android', value: 'ANDROID' },\n { name: 'Both', value: 'BOTH' },\n ],\n },\n ]);\n platform = p;\n }\n\n const createSpinner = ora('Creating app...').start();\n const app = await api.createApp(orgId, { name, platform });\n createSpinner.succeed(`App created: ${app.name}`);\n return app;\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport fs from 'fs-extra';\nimport { api } from '../lib/api.js';\nimport { auth } from '../lib/auth.js';\nimport { config } from '../lib/config.js';\nimport { logger } from '../utils/logger.js';\n\nexport const doctorCommand = new Command('doctor')\n .description('Diagnose your SwiftPatch setup')\n .action(async () => {\n console.log('');\n console.log(chalk.bold(' SwiftPatch Doctor'));\n console.log('');\n\n let issues = 0;\n\n // 1. Check Node.js version\n const nodeVersion = process.version;\n const major = parseInt(nodeVersion.slice(1).split('.')[0], 10);\n if (major >= 18) {\n logger.success(`Node.js ${nodeVersion}`);\n } else {\n logger.error(`Node.js ${nodeVersion} — requires >= 18.0.0`);\n issues++;\n }\n\n // 2. Check if in a React Native project\n const hasPackageJson = await fs.pathExists('./package.json');\n if (hasPackageJson) {\n const pkg = await fs.readJson('./package.json');\n const rnVersion = pkg.dependencies?.['react-native'] || pkg.devDependencies?.['react-native'];\n if (rnVersion) {\n logger.success(`React Native ${rnVersion}`);\n } else {\n logger.warning('react-native not found in dependencies');\n issues++;\n }\n\n // Check SDK\n const sdkVersion = pkg.dependencies?.['@swiftpatch/react-native'] || pkg.devDependencies?.['@swiftpatch/react-native'];\n if (sdkVersion) {\n logger.success(`@swiftpatch/react-native ${sdkVersion}`);\n } else {\n logger.error('@swiftpatch/react-native SDK not installed');\n console.log(chalk.gray(' Fix: npm install @swiftpatch/react-native'));\n issues++;\n }\n } else {\n logger.warning('No package.json found (not in a project directory?)');\n }\n\n // 3. Check platforms\n const hasIos = await fs.pathExists('./ios');\n const hasAndroid = await fs.pathExists('./android');\n if (hasIos || hasAndroid) {\n const platforms = [hasIos && 'iOS', hasAndroid && 'Android'].filter(Boolean).join(', ');\n logger.success(`Platforms: ${platforms}`);\n } else if (hasPackageJson) {\n logger.warning('No ios/ or android/ directories found');\n issues++;\n }\n\n // 4. Check authentication\n if (auth.isLoggedIn()) {\n logger.success('Authenticated');\n\n // Try API connectivity\n try {\n const user = await api.getCurrentUser();\n logger.success(`Connected as ${user.name} (${user.email})`);\n } catch (error: any) {\n logger.error(`API connection failed: ${error.message}`);\n issues++;\n }\n } else {\n logger.error('Not authenticated');\n console.log(chalk.gray(' Fix: swiftpatch login'));\n issues++;\n }\n\n // 5. Check API URL\n const customApiUrl = config.get('apiUrl');\n if (customApiUrl) {\n logger.info(`Custom API URL: ${customApiUrl}`);\n if (customApiUrl.startsWith('http://') && !customApiUrl.includes('localhost')) {\n logger.warning('API URL uses HTTP — consider HTTPS for production');\n issues++;\n }\n } else {\n logger.success('API URL: default (production)');\n }\n\n // 6. Check CLI config\n const defaultOrg = config.get('defaultOrg');\n const defaultApp = config.get('defaultApp');\n if (defaultOrg) {\n logger.success(`Default org: ${defaultOrg}`);\n } else {\n logger.info('No default org set (will prompt each time)');\n }\n if (defaultApp) {\n logger.success(`Default app: ${defaultApp}`);\n } else {\n logger.info('No default app set');\n }\n\n // 7. Check .swiftpatchrc\n const hasRc = await fs.pathExists('./.swiftpatchrc');\n if (hasRc) {\n try {\n const rc = await fs.readJson('./.swiftpatchrc');\n logger.success(`.swiftpatchrc found (app: ${rc.app || rc.appId || 'unknown'})`);\n } catch {\n logger.warning('.swiftpatchrc exists but is invalid JSON');\n issues++;\n }\n } else {\n logger.info('No .swiftpatchrc (run: swiftpatch init)');\n }\n\n // 8. Check for Hermes\n if (hasPackageJson) {\n try {\n const pkg = await fs.readJson('./package.json');\n const rnVersion = pkg.dependencies?.['react-native'];\n if (rnVersion) {\n // RN 0.70+ enables Hermes by default\n const cleanVersion = rnVersion.replace(/[\\^~>=<]/g, '');\n const [, minor] = cleanVersion.split('.');\n if (parseInt(minor) >= 70) {\n logger.success('Hermes likely enabled (RN 0.70+)');\n } else {\n logger.info('Hermes may need to be manually enabled');\n }\n }\n } catch {\n // ignore\n }\n }\n\n // Summary\n console.log('');\n if (issues === 0) {\n console.log(chalk.green.bold(' All checks passed!'));\n } else {\n console.log(chalk.yellow.bold(` ${issues} issue${issues > 1 ? 's' : ''} found`));\n }\n console.log('');\n });\n","import { logger } from './logger.js';\n\nexport function checkForUpdates(): void {\n // Non-blocking update check\n try {\n // Dynamic import to avoid blocking startup\n import('update-notifier').then(({ default: updateNotifier }) => {\n import('fs-extra').then(({ default: fs }) => {\n import('url').then(({ fileURLToPath }) => {\n import('path').then(({ dirname, join }) => {\n try {\n const __dirname = dirname(fileURLToPath(import.meta.url));\n const pkg = JSON.parse(\n fs.readFileSync(join(__dirname, '../../package.json'), 'utf-8')\n );\n const notifier = updateNotifier({ pkg, updateCheckInterval: 1000 * 60 * 60 * 24 });\n notifier.notify();\n } catch {\n // Silently fail - don't block CLI usage\n }\n });\n });\n });\n }).catch(() => {\n // Silently fail\n });\n } catch {\n // Silently fail\n }\n}\n","import chalk from 'chalk';\nimport { logger } from './logger.js';\n\nexport class CLIError extends Error {\n constructor(\n message: string,\n public code?: string,\n public suggestion?: string\n ) {\n super(message);\n this.name = 'CLIError';\n }\n}\n\nexport function handleError(error: unknown): void {\n console.log('');\n\n if (error instanceof CLIError) {\n logger.error(error.message);\n\n if (error.suggestion) {\n console.log('');\n console.log(chalk.gray('Suggestion: ') + error.suggestion);\n }\n } else if (error instanceof Error) {\n logger.error(error.message);\n\n if (process.env.DEBUG) {\n console.log('');\n console.log(chalk.gray(error.stack || ''));\n }\n } else {\n logger.error('An unexpected error occurred');\n }\n\n console.log('');\n console.log(chalk.gray('For help, run: swiftpatch --help'));\n console.log(chalk.gray('Report issues: https://github.com/codewprincee/cli/issues'));\n console.log('');\n}\n"],"mappings":"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","names":["Conf","store","api","Command","chalk","readFileSync","fileURLToPath","dirname","join","chalk","chalk","Command","inquirer","Command","inquirer","Command","chalk","Command","chalk","Command","Command","chalk","ora","chalk","chalk","chalk","inquirer","inquirer","chalk","chalk","Command","ora","chalk","Command","chalk","ora","Command","inquirer","ora","chalk","Command","chalk","ora","Command","ora","chalk","Command","chalk","inquirer","ora","Command","ora","inquirer","chalk","Command","chalk","inquirer","ora","Command","chalk","inquirer","ora","Command","Command","chalk","inquirer","ora","path","fs","path","os","config","axios","fs","sleep","crypto","fs","crypto","fs","crypto","fs","path","path","fs","crypto","crypto","path","fs","fs","fs","Command","chalk","inquirer","app","version","ora","fs","config","path","release","sleep","Command","Command","chalk","ora","Command","ora","chalk","Command","chalk","ora","inquirer","Command","inquirer","ora","chalk","formatStatus","formatBytes","Command","chalk","inquirer","ora","Command","inquirer","chalk","ora","Command","chalk","inquirer","ora","Command","inquirer","chalk","ora","Command","chalk","inquirer","ora","Command","inquirer","chalk","ora","Command","Command","Command","chalk","ora","Command","ora","chalk","Command","chalk","inquirer","ora","Command","inquirer","ora","chalk","Command","chalk","inquirer","ora","Command","inquirer","ora","chalk","Command","chalk","inquirer","ora","Command","inquirer","chalk","ora","Command","Command","Command","chalk","inquirer","ora","Command","inquirer","ora","chalk","Command","chalk","inquirer","ora","Command","inquirer","ora","chalk","Command","chalk","inquirer","ora","Command","inquirer","chalk","ora","Command","chalk","inquirer","ora","Command","inquirer","chalk","ora","Command","Command","Command","chalk","ora","Command","ora","chalk","Command","chalk","inquirer","ora","Command","inquirer","ora","chalk","Command","chalk","ora","Command","chalk","ora","Command","chalk","inquirer","ora","Command","inquirer","chalk","ora","Command","ora","Command","ora","Command","Command","chalk","ora","Command","ora","chalk","formatBytes","Command","chalk","ora","Command","chalk","ora","path","fs","chalk","inquirer","chalk","inquirer","path","fs","Command","ora","chalk","Command","chalk","ora","Command","ora","chalk","Command","chalk","ora","execFile","promisify","execFileAsync","promisify","execFile","gitCommand","Command","ora","chalk","Command","chalk","ora","Command","chalk","Command","chalk","value","Command","chalk","ora","path","fs","os","fs","path","fs","path","path","fs","dirname","hermesEngine","hermesCompiler","Command","chalk","inquirer","path","os","fs","ora","bundlesDir","formatBytes","Command","chalk","ora","Command","chalk","ora","Command","chalk","ora","Command","chalk","ora","Command","chalk","ora","path","Command","chalk","path","ora","Command","chalk","inquirer","ora","fs","path","Command","fs","inquirer","chalk","ora","path","Command","chalk","inquirer","ora","Command","chalk","inquirer","ora","Command","chalk","inquirer","ora","fs","path","Command","chalk","fs","inquirer","ora","path","Command","chalk","fs","Command","chalk","fs","__dirname","dirname","fileURLToPath","readFileSync","join","Command","chalk","fs","fileURLToPath","dirname","join","__dirname","chalk","chalk"]}
|