rush-ai 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/output/formatters/csv.ts","../src/output/formatters/table.ts","../src/output/formatters/index.ts","../src/util/require-auth.ts","../src/commands/agent/index.ts","../src/commands/auth/browser-login.ts","../src/commands/auth/index.ts","../src/commands/check/index.ts","../src/commands/check/checks/database.ts","../src/commands/check/checks/framework.ts","../src/commands/check/checks/lock-file.ts","../src/commands/check/checks/package-json.ts","../src/commands/check/checks/port-env.ts","../src/commands/completion/index.ts","../src/commands/config/index.ts","../src/commands/doctor/index.ts","../src/commands/doctor/checks/auth.ts","../src/commands/doctor/checks/config.ts","../src/commands/doctor/checks/connectivity.ts","../src/commands/doctor/checks/environment.ts","../src/commands/doctor/checks/plugins.ts","../src/commands/mcp/index.ts","../src/commands/plugin/index.ts","../src/commands/plugin/adapters/claude-code.ts","../src/commands/plugin/adapters/base.ts","../src/commands/plugin/adapters/cursor.ts","../src/commands/plugin/adapters/index.ts","../src/commands/plugin/assets.ts","../src/commands/plugin/doctor.ts","../src/commands/plugin/preflight.ts","../src/commands/plugin/verify.ts","../src/commands/task/index.ts","../src/output/diff.ts","../src/util/ci.ts","../src/util/stdin.ts","../src/commands/task/deploy.ts","../src/util/git.ts","../src/commands/index.ts","../src/util/update-check.ts"],"sourcesContent":["import chalk from 'chalk';\nimport { Command } from 'commander';\nimport { registerCommands } from './commands/index.js';\nimport { output } from './output/logger.js';\nimport { getAuthMethod } from './util/auth.js';\nimport { isCIMode } from './util/ci.js';\nimport { isRushError } from './util/errors.js';\nimport { checkForUpdate } from './util/update-check.js';\nimport { setVerbosity } from './util/verbosity.js';\nimport { VERSION } from './version.js';\n\nconst BANNER = `\n ${chalk.bold.cyan('Rush CLI')} ${chalk.dim(`v${VERSION}`)}\n ${chalk.dim('The command-line interface for the Rush AI platform')}\n`;\n\nfunction showWelcomeGuide(): void {\n const lines = [\n '',\n ` ${chalk.bold.cyan('Rush CLI')} ${chalk.dim(`v${VERSION}`)}`,\n '',\n chalk.dim(' Quick start:'),\n ` ${chalk.cyan('rush-ai auth login')} Log in to Rush platform`,\n ` ${chalk.cyan('rush-ai agent list')} Browse available agents`,\n ` ${chalk.cyan('rush-ai task create -a <agent>')} Create a task`,\n '',\n ];\n\n try {\n const method = getAuthMethod();\n if (method) {\n lines.push(chalk.dim(' Status:'), ` Logged in via ${method}`, '');\n }\n } catch {\n // Ignore auth errors in welcome guide\n }\n\n lines.push(chalk.dim(' Run rush-ai --help for all commands.'), '');\n console.error(lines.join('\\n'));\n}\n\nexport function createProgram(): Command {\n const program = new Command();\n\n program\n .name('rush-ai')\n .version(VERSION, '-v, --version')\n .description('Rush CLI - Command-line interface for the Rush AI platform')\n .configureHelp({\n sortSubcommands: true,\n })\n .addHelpText('before', BANNER)\n .option('--no-color', 'Disable color output')\n .option('--json', 'Output as JSON where supported')\n .option('-f, --format <type>', 'Output format (table, json, csv)')\n .option(\n '--ci',\n 'CI mode: JSON output, no interactive prompts, strict exit codes'\n )\n .option('--verbose', 'Show detailed output including HTTP requests')\n .option('--debug', 'Show debug-level output (implies --verbose)');\n\n // CI mode: auto-enable --json before any command runs\n // Set verbosity BEFORE any command action runs\n program.hook('preAction', (thisCommand) => {\n const opts = thisCommand.optsWithGlobals();\n if (isCIMode(opts)) {\n if (!opts.json) {\n thisCommand.setOptionValue('json', true);\n }\n }\n setVerbosity(!!opts.verbose, !!opts.debug);\n });\n\n // No-argument interactive guide (Commander handles --help/--version first)\n program.action(() => {\n if (process.stdout.isTTY) {\n showWelcomeGuide();\n } else {\n program.help();\n }\n });\n\n registerCommands(program);\n\n return program;\n}\n\nasync function main(): Promise<void> {\n // Disable color in non-TTY environments, --no-color, or CI mode\n if (\n !process.stdout.isTTY ||\n process.argv.includes('--no-color') ||\n isCIMode()\n ) {\n process.env.NO_COLOR = '1';\n }\n\n const program = createProgram();\n\n try {\n await program.parseAsync(process.argv);\n } catch (error) {\n const ci = isCIMode(program.opts());\n\n if (isRushError(error)) {\n if (ci) {\n output.log(\n JSON.stringify({\n error: true,\n code: error.code,\n message: error.message,\n exitCode: error.exitCode,\n })\n );\n } else {\n output.error(error.message);\n if (error.code === 'AUTH_ERROR') {\n output.newline();\n output.dim('Run `rush-ai auth login` to authenticate.');\n }\n }\n process.exit(error.exitCode);\n }\n\n if (error instanceof Error) {\n const exitCode = 2;\n if (ci) {\n output.log(\n JSON.stringify({\n error: true,\n code: 'UNKNOWN_ERROR',\n message: error.message,\n exitCode,\n })\n );\n } else {\n output.error(error.message);\n if (process.env.DEBUG) {\n console.error(error.stack);\n }\n }\n process.exit(exitCode);\n }\n\n if (ci) {\n output.log(\n JSON.stringify({\n error: true,\n code: 'UNKNOWN_ERROR',\n message: 'An unexpected error occurred.',\n exitCode: 2,\n })\n );\n } else {\n output.error('An unexpected error occurred.');\n }\n process.exit(2);\n }\n\n // Non-blocking version check after command completes\n void checkForUpdate(VERSION);\n}\n\n// Only run when executed as entry point, not when imported by tests\nif (!process.env.VITEST) {\n main();\n}\n","/**\n * RFC 4180 compliant CSV formatter.\n * No external dependencies.\n */\n\nfunction escapeField(value: string): string {\n // If value contains comma, quote, newline, or leading/trailing spaces, wrap in quotes\n if (\n value.includes(',') ||\n value.includes('\"') ||\n value.includes('\\n') ||\n value.includes('\\r') ||\n value !== value.trim()\n ) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }\n return value;\n}\n\nexport function formatCsv(rows: Record<string, string>[]): string {\n if (rows.length === 0) return '';\n\n const keys = Object.keys(rows[0]);\n\n // Header row\n const header = keys.map(escapeField).join(',');\n\n // Data rows\n const lines = rows.map((row) =>\n keys.map((k) => escapeField(row[k] ?? '')).join(',')\n );\n\n return [header, ...lines].join('\\n');\n}\n","import chalk from 'chalk';\n\nexport interface TableColumnOptions {\n maxWidth?: number;\n align?: 'left' | 'right';\n}\n\nexport interface TableFormatOptions {\n columns?: Record<string, TableColumnOptions>;\n}\n\nconst STATUS_COLORS: Record<string, (s: string) => string> = {\n completed: chalk.green,\n active: chalk.green,\n installed: chalk.green,\n running: chalk.yellow,\n pending: chalk.yellow,\n available: chalk.dim,\n failed: chalk.red,\n cancelled: chalk.red,\n error: chalk.red,\n};\n\nfunction colorizeStatus(value: string): string {\n const colorFn = STATUS_COLORS[value.toLowerCase()];\n return colorFn ? colorFn(value) : value;\n}\n\nfunction truncate(str: string, max: number): string {\n if (str.length <= max) return str;\n return `${str.slice(0, max - 3)}...`;\n}\n\nexport function formatTableEnhanced(\n rows: Record<string, string>[],\n options?: TableFormatOptions\n): string {\n if (rows.length === 0) return '';\n\n const keys = Object.keys(rows[0]);\n const colOpts = options?.columns ?? {};\n const widths: Record<string, number> = {};\n\n // Calculate column widths\n for (const key of keys) {\n widths[key] = key.length;\n }\n for (const row of rows) {\n for (const key of keys) {\n const val = row[key] ?? '';\n const maxW = colOpts[key]?.maxWidth;\n const display = maxW ? truncate(val, maxW) : val;\n if (display.length > widths[key]) {\n widths[key] = display.length;\n }\n }\n }\n\n // Build header\n const header = keys.map((k) => chalk.bold(k.padEnd(widths[k]))).join(' ');\n const separator = keys.map((k) => '-'.repeat(widths[k])).join(' ');\n\n // Build rows\n const lines = rows.map((row) =>\n keys\n .map((k) => {\n const raw = row[k] ?? '-';\n const display = raw === '' ? '-' : raw;\n const maxW = colOpts[k]?.maxWidth;\n const truncated = maxW ? truncate(display, maxW) : display;\n const align = colOpts[k]?.align ?? 'left';\n const padded =\n align === 'right'\n ? truncated.padStart(widths[k])\n : truncated.padEnd(widths[k]);\n\n // Colorize status-like values\n if (k.toLowerCase() === 'status' || k.toLowerCase() === 'state') {\n return colorizeStatus(padded);\n }\n return padded;\n })\n .join(' ')\n );\n\n return [header, separator, ...lines].join('\\n');\n}\n","import { formatCsv } from './csv.js';\nimport { formatTableEnhanced, type TableFormatOptions } from './table.js';\n\nexport type OutputFormat = 'table' | 'json' | 'csv';\n\nconst VALID_FORMATS: readonly string[] = ['table', 'json', 'csv'];\n\nexport interface FormatOptions extends TableFormatOptions {}\n\n/**\n * Resolve the effective output format from CLI options.\n * Throws if --json and --format conflict, or if format value is invalid.\n */\nexport function resolveFormat(opts: {\n json?: boolean;\n format?: string;\n}): OutputFormat {\n const hasJson = opts.json === true;\n const hasFormat = opts.format != null && opts.format !== undefined;\n\n // Validate format value\n if (hasFormat && !VALID_FORMATS.includes(opts.format as string)) {\n throw new Error(\n `Invalid format: \"${opts.format}\". Supported formats: ${VALID_FORMATS.join(', ')}`\n );\n }\n\n if (hasJson && hasFormat && opts.format !== 'json') {\n throw new Error(\n `Conflicting options: --json cannot be used with --format ${opts.format}. Use one or the other.`\n );\n }\n\n if (hasJson) return 'json';\n if (hasFormat) return opts.format as OutputFormat;\n return 'table';\n}\n\n/**\n * Format row data as a string in the specified format.\n * Note: JSON mode should be handled separately per-command to preserve payload structure.\n */\nexport function formatOutput(\n rows: Record<string, string>[],\n format: OutputFormat,\n options?: FormatOptions\n): string {\n switch (format) {\n case 'csv':\n return formatCsv(rows);\n case 'json':\n return JSON.stringify(rows, null, 2);\n default:\n return formatTableEnhanced(rows, options);\n }\n}\n\nexport { formatCsv } from './csv.js';\nexport type { TableColumnOptions, TableFormatOptions } from './table.js';\n// Re-export for convenience\nexport { formatTableEnhanced } from './table.js';\n","import { getAuthToken } from './auth.js';\nimport { getAuthConfig } from './config.js';\nimport { AuthError } from './errors.js';\n\n/**\n * Guard that throws AuthError if not authenticated.\n * Checks RUSH_API_KEY env and stored CAS token (including expiry).\n */\nexport function requireAuth(): void {\n const token = getAuthToken();\n if (!token) {\n throw new AuthError();\n }\n // Check expiry for stored tokens (env API keys never expire client-side)\n if (!process.env.RUSH_API_KEY) {\n const auth = getAuthConfig();\n if (auth.expiresAt && Date.now() > auth.expiresAt) {\n // CAS tokens with refresh_token can still be renewed lazily\n if (auth.method === 'cas' && auth.refreshToken) {\n return;\n }\n throw new AuthError(\n 'Token expired. Run `rush-ai auth login` to re-authenticate.'\n );\n }\n }\n}\n","import type { Command } from 'commander';\nimport { formatOutput, resolveFormat } from '../../output/format.js';\nimport { output } from '../../output/logger.js';\nimport { createClient } from '../../util/client.js';\nimport { ApiError } from '../../util/errors.js';\nimport { requireAuth } from '../../util/require-auth.js';\n\n/** Matches DbAgent from the real API */\ninterface ApiAgent {\n id: string;\n name: string;\n description: string | null;\n capabilities: string[] | null;\n skills: string[] | null;\n mcp_servers: unknown[] | null;\n status: string;\n visibility: string;\n provider_type: string;\n provider_model: string | null;\n system_prompt: string | null;\n created_at: string;\n updated_at: string;\n created_by_id: string | null;\n is_builtin: boolean;\n}\n\ninterface AgentListResponse {\n agents: ApiAgent[];\n pagination: {\n total: number;\n page: number;\n limit: number;\n totalPages: number;\n };\n}\n\ninterface AgentDetailResponse {\n agent: ApiAgent;\n}\n\ninterface AgentCandidateItem {\n id: string;\n name: string;\n status: string;\n visibility: string;\n created_at: string;\n}\n\ninterface AgentCandidatesBody {\n error: string;\n candidates: AgentCandidateItem[];\n}\n\nexport function registerAgentCommand(program: Command): void {\n const agent = program\n .command('agent')\n .description('Manage and inspect agents');\n\n agent\n .command('list')\n .alias('ls')\n .description('List available agents')\n .action(async () => {\n requireAuth();\n const format = resolveFormat(program.opts());\n const client = createClient();\n const { data } = await client.get<AgentListResponse>('/api/agents');\n\n if (format === 'json') {\n output.log(JSON.stringify(data, null, 2));\n return;\n }\n\n if (data.agents.length === 0) {\n output.info('No agents found.');\n return;\n }\n\n const total = data.pagination?.total ?? data.agents.length;\n output.log(output.bold(`Agents (${total} total):`));\n output.newline();\n\n const rows = data.agents.map((a) => ({\n Name: a.name,\n Description: truncate(a.description ?? '', 50),\n Status: a.status,\n Skills: String(a.skills?.length ?? 0),\n MCP: String(a.mcp_servers?.length ?? 0),\n }));\n\n output.log(\n formatOutput(rows, format, {\n columns: { Description: { maxWidth: 50 } },\n })\n );\n });\n\n agent\n .command('info')\n .description('Show agent details')\n .argument('<name>', 'Agent name or ID')\n .action(async (nameOrId: string) => {\n requireAuth();\n const format = resolveFormat(program.opts());\n const client = createClient();\n\n let data: AgentDetailResponse;\n try {\n ({ data } = await client.get<AgentDetailResponse>(\n `/api/agents/${encodeURIComponent(nameOrId)}`\n ));\n } catch (err: unknown) {\n if (err instanceof ApiError && err.status === 409) {\n let parsed: AgentCandidatesBody | undefined;\n try {\n parsed = JSON.parse(err.meta.body as string);\n } catch {\n // body 不是合法 JSON,走默认错误处理\n }\n\n // 运行时守卫:确保 candidates 是合法数组且每项有必要字段\n const candidates = parsed?.candidates;\n const isValid =\n Array.isArray(candidates) &&\n candidates.length > 0 &&\n candidates.every(\n (c) => typeof c.id === 'string' && typeof c.name === 'string'\n );\n\n if (isValid) {\n if (format === 'json') {\n output.log(JSON.stringify(parsed, null, 2));\n process.exitCode = 1;\n return;\n }\n\n output.error(`Multiple agents found with name \"${nameOrId}\":`);\n output.newline();\n for (const c of candidates!) {\n const date = c.created_at?.split('T')[0] ?? '';\n output.dim(` ${c.id} ${c.name} ${c.status ?? ''} ${date}`);\n }\n output.newline();\n output.info(`Use agent ID to specify: rush agent info <id>`);\n process.exitCode = 1;\n return;\n }\n }\n throw err;\n }\n\n const a = data.agent;\n\n if (format === 'json') {\n output.log(JSON.stringify(a, null, 2));\n return;\n }\n\n output.log(output.bold(a.name));\n output.log(` ID: ${a.id}`);\n output.log(` Description: ${a.description ?? '(none)'}`);\n output.log(` Status: ${a.status}`);\n output.log(` Visibility: ${a.visibility}`);\n output.log(\n ` Provider: ${a.provider_type}${a.provider_model ? ` (${a.provider_model})` : ''}`\n );\n output.log(` Capabilities: ${a.capabilities?.join(', ') || 'none'}`);\n output.newline();\n\n if (a.skills && a.skills.length > 0) {\n output.log(output.bold(' Skills:'));\n for (const skill of a.skills) {\n output.log(` - ${skill}`);\n }\n output.newline();\n }\n\n if (a.mcp_servers && a.mcp_servers.length > 0) {\n output.log(output.bold(` MCP Servers (${a.mcp_servers.length}):`));\n for (const mcp of a.mcp_servers) {\n if (typeof mcp === 'object' && mcp !== null) {\n const m = mcp as Record<string, unknown>;\n const name = String(m.serverName ?? m.name ?? 'unknown');\n const disabled = m.disabled ? ' (disabled)' : '';\n output.log(` - ${name}${disabled}`);\n } else {\n output.log(` - ${JSON.stringify(mcp)}`);\n }\n }\n output.newline();\n }\n\n output.dim(` Updated: ${new Date(a.updated_at).toLocaleString()}`);\n });\n}\n\nfunction truncate(str: string, max: number): string {\n if (str.length <= max) return str;\n return `${str.slice(0, max - 3)}...`;\n}\n","import { randomBytes } from 'node:crypto';\nimport { createServer } from 'node:http';\nimport type { AddressInfo } from 'node:net';\nimport open from 'open';\nimport { output } from '../../output/logger.js';\nimport { getGlobalConfig, setAuthConfig } from '../../util/config.js';\nimport { AuthError } from '../../util/errors.js';\n\ninterface TokenResponse {\n token: string;\n token_id: string;\n expires_at: string;\n}\n\nfunction getApiBaseUrl(): string {\n return process.env.RUSH_API_URL ?? getGlobalConfig().api;\n}\n\nexport async function loginViaBrowser(jsonMode?: boolean): Promise<void> {\n const baseUrl = getApiBaseUrl();\n const state = randomBytes(16).toString('hex');\n\n return new Promise<void>((resolve, reject) => {\n const server = createServer(async (req, res) => {\n try {\n const url = new URL(req.url ?? '/', 'http://localhost');\n\n if (url.pathname !== '/callback') {\n res.writeHead(404);\n res.end('Not found');\n return;\n }\n\n const code = url.searchParams.get('code');\n const returnedState = url.searchParams.get('state');\n const error = url.searchParams.get('error');\n\n if (error) {\n const desc = url.searchParams.get('error_description') ?? '认证失败';\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(\n getHtmlPage(\n '认证失败',\n `错误:${desc}。你可以关闭此页面。`,\n baseUrl\n )\n );\n server.close();\n reject(new AuthError(`Browser authentication failed: ${desc}`));\n return;\n }\n\n if (!code || returnedState !== state) {\n res.writeHead(400, { 'Content-Type': 'text/html' });\n res.end(\n getHtmlPage(\n '认证失败',\n '回调参数无效,请重新登录。你可以关闭此页面。',\n baseUrl\n )\n );\n server.close();\n reject(\n new AuthError('Invalid callback: missing code or state mismatch')\n );\n return;\n }\n\n // Exchange code for Platform Token\n const tokenUrl = `${baseUrl}/api/cli/auth/token`;\n const tokenResponse = await fetch(tokenUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ code, state }),\n });\n\n if (!tokenResponse.ok) {\n const errorText = await tokenResponse\n .text()\n .catch(() => 'Unknown error');\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(\n getHtmlPage(\n '认证失败',\n 'Token 交换失败,请重试。你可以关闭此页面。',\n baseUrl\n )\n );\n server.close();\n reject(new AuthError(`Token exchange failed: ${errorText}`));\n return;\n }\n\n const tokenData = (await tokenResponse.json()) as TokenResponse;\n\n const expiresAt = tokenData.expires_at\n ? new Date(tokenData.expires_at).getTime()\n : null;\n\n setAuthConfig({\n token: tokenData.token,\n expiresAt,\n refreshToken: null,\n method: 'platform_token',\n tokenId: tokenData.token_id,\n });\n\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(\n getHtmlPage(\n '认证成功',\n '你已成功登录,可以关闭此页面并返回终端。',\n baseUrl,\n expiresAt ?? undefined\n )\n );\n\n server.close();\n\n if (jsonMode) {\n output.log(\n JSON.stringify({\n status: 'authenticated',\n method: 'platform_token',\n expiresAt,\n })\n );\n } else {\n output.success('Logged in successfully.');\n if (expiresAt) {\n output.dim(\n `Token expires: ${new Date(expiresAt).toLocaleString()}`\n );\n }\n }\n\n resolve();\n } catch (err) {\n server.close();\n reject(\n err instanceof AuthError\n ? err\n : new AuthError(\n `Authentication error: ${err instanceof Error ? err.message : 'Unknown'}`\n )\n );\n }\n });\n\n server.listen(0, '127.0.0.1', () => {\n const { port } = server.address() as AddressInfo;\n\n const authUrl = `${baseUrl}/api/cli/auth/authorize?callback_port=${port}&state=${encodeURIComponent(state)}`;\n\n if (!jsonMode) {\n output.log('Opening browser for authentication...');\n output.dim(\"If the browser doesn't open, visit:\");\n output.dim(authUrl);\n output.newline();\n output.dim('Waiting for authentication...');\n }\n\n open(authUrl).catch(() => {\n if (!jsonMode) {\n output.warn(\n 'Could not open browser. Please visit the URL above manually.'\n );\n }\n });\n });\n\n // Timeout after 5 minutes\n const timeoutId = setTimeout(() => {\n server.close();\n reject(new AuthError('Authentication timed out after 5 minutes'));\n }, 300_000);\n\n server.on('close', () => clearTimeout(timeoutId));\n });\n}\n\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#x27;');\n}\n\nfunction getHtmlPage(\n title: string,\n message: string,\n serverUrl: string,\n expiresAt?: number\n): string {\n const metaLines: string[] = [\n `<span class=\"label\">服务器</span> <span class=\"value\">${escapeHtml(serverUrl)}</span>`,\n ];\n if (expiresAt) {\n metaLines.push(\n `<span class=\"label\">有效期至</span> <span class=\"value\">${escapeHtml(new Date(expiresAt).toLocaleString('zh-CN'))}</span>`\n );\n }\n const metaHtml = metaLines\n .map((line) => `<div class=\"meta-row\">${line}</div>`)\n .join('\\n ');\n\n return `<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head><meta charset=\"utf-8\"><title>Rush CLI - ${escapeHtml(title)}</title>\n<style>\n body { font-family: -apple-system, BlinkMacSystemFont, \"PingFang SC\", \"Microsoft YaHei\", sans-serif; display: flex; align-items: center; justify-content: center; height: 100vh; margin: 0; background: #f5f5f5; }\n .card { background: white; border-radius: 12px; padding: 40px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); text-align: center; max-width: 420px; }\n h1 { color: #333; font-size: 1.5em; margin-bottom: 8px; }\n p { color: #666; line-height: 1.6; }\n .meta { margin-top: 16px; padding-top: 16px; border-top: 1px solid #eee; text-align: left; }\n .meta-row { color: #888; font-size: 0.85em; line-height: 2; }\n .meta-row .label { color: #999; }\n .meta-row .value { color: #555; font-family: \"SF Mono\", Menlo, monospace; }\n</style>\n</head>\n<body>\n <div class=\"card\">\n <h1>${escapeHtml(title)}</h1>\n <p>${escapeHtml(message)}</p>\n <div class=\"meta\">\n ${metaHtml}\n </div>\n </div>\n</body>\n</html>`;\n}\n","import type { Command } from 'commander';\nimport { output } from '../../output/logger.js';\nimport { getAuthMethod } from '../../util/auth.js';\nimport {\n revokeCurrentSession,\n verifyCurrentAuthSession,\n} from '../../util/auth-session.js';\nimport {\n clearAuthConfig,\n getAuthConfig,\n getConfigDir,\n isLoggedIn,\n setAuthConfig,\n} from '../../util/config.js';\nimport { RushError } from '../../util/errors.js';\nimport { loginViaBrowser } from './browser-login.js';\n\nexport function registerAuthCommand(program: Command): void {\n const auth = program.command('auth').description('Manage authentication');\n\n auth\n .command('login')\n .description('Log in to the Rush platform')\n .option('--api-key <key>', 'Authenticate with an API key instead of CAS')\n .option('--no-verify', 'Skip online validation for API key login')\n .action(async (options: { apiKey?: string; verify?: boolean }) => {\n const jsonMode = program.opts().json;\n\n if (options.apiKey) {\n setAuthConfig({\n token: options.apiKey,\n expiresAt: null,\n refreshToken: null,\n method: 'api_key',\n });\n\n let verification:\n | Awaited<ReturnType<typeof verifyCurrentAuthSession>>\n | undefined;\n if (options.verify !== false) {\n verification = await verifyCurrentAuthSession();\n if (!verification.valid) {\n clearAuthConfig();\n throw new RushError(\n `API key validation failed: ${verification.message ?? 'invalid credentials'}`,\n {},\n 'AUTH_ERROR'\n );\n }\n }\n\n if (jsonMode) {\n output.log(\n JSON.stringify({\n status: 'authenticated',\n method: 'api_key',\n verified: options.verify !== false,\n ...(verification ? { serverStatus: verification.status } : {}),\n })\n );\n } else {\n output.success('Authenticated with API key.');\n if (options.verify !== false) {\n output.dim('Server validation: OK');\n }\n }\n return;\n }\n\n // CAS PKCE flow\n if (isLoggedIn()) {\n if (jsonMode) {\n output.log(JSON.stringify({ status: 'already_authenticated' }));\n } else {\n output.warn('You are already logged in.');\n output.dim('Run `rush-ai auth logout` first to log out.');\n }\n return;\n }\n\n await loginViaBrowser(jsonMode);\n });\n\n auth\n .command('status')\n .description('Show the current authentication status')\n .option('--verify', 'Validate the current credential against the server')\n .action(async (options: { verify?: boolean }) => {\n const jsonMode = program.opts().json;\n const method = getAuthMethod();\n const authConfig = getAuthConfig();\n // Consider authenticated if: env API key set, OR stored token is valid\n const loggedIn =\n method !== null && (method === 'api_key' || isLoggedIn());\n const verification =\n loggedIn && options.verify ? await verifyCurrentAuthSession() : null;\n\n if (jsonMode) {\n output.log(\n JSON.stringify({\n authenticated: loggedIn,\n method: method ?? null,\n expiresAt: authConfig.expiresAt,\n hasRefreshToken: Boolean(authConfig.refreshToken),\n configDir: getConfigDir(),\n ...(verification\n ? {\n serverAuthenticated: verification.valid,\n serverStatus: verification.status,\n serverMessage: verification.message,\n }\n : {}),\n })\n );\n } else {\n if (loggedIn) {\n output.success(`Authenticated via ${method ?? 'token'}`);\n if (authConfig.expiresAt) {\n const expiresDate = new Date(authConfig.expiresAt).toLocaleString();\n output.dim(`Token expires: ${expiresDate}`);\n }\n if (authConfig.refreshToken) {\n output.dim('Refresh token: available');\n }\n } else {\n output.warn('Not authenticated.');\n output.dim('Run `rush-ai auth login` to log in.');\n }\n if (verification) {\n if (verification.valid) {\n output.dim('Server validation: OK');\n } else {\n output.warn(\n `Server validation failed: ${verification.message ?? 'token rejected'}`\n );\n }\n }\n output.dim(`Config: ${getConfigDir()}`);\n }\n });\n\n auth\n .command('logout')\n .description('Log out and clear stored credentials')\n .option('--no-revoke', 'Skip best-effort CAS revoke request')\n .action(async (options: { revoke?: boolean }) => {\n const jsonMode = program.opts().json;\n const authConfig = getAuthConfig();\n\n const hasToken = authConfig.token !== null;\n if (!hasToken) {\n if (jsonMode) {\n output.log(JSON.stringify({ status: 'not_authenticated' }));\n } else {\n output.warn('You are not currently logged in.');\n }\n return;\n }\n\n const shouldRevoke =\n options.revoke !== false &&\n (authConfig.method === 'cas' || authConfig.method === 'platform_token');\n const revoked = shouldRevoke ? await revokeCurrentSession() : false;\n\n clearAuthConfig();\n if (jsonMode) {\n output.log(\n JSON.stringify({\n status: 'logged_out',\n ...(shouldRevoke ? { revoked } : {}),\n })\n );\n } else {\n output.success('Logged out successfully.');\n if (shouldRevoke) {\n if (revoked) {\n output.dim('Remote token revoked.');\n } else {\n output.warn(\n 'Could not confirm remote revoke. Local credentials were cleared.'\n );\n }\n }\n }\n });\n}\n","import { resolve } from 'node:path';\nimport chalk from 'chalk';\nimport type { Command } from 'commander';\nimport { output } from '../../output/logger.js';\nimport { checkDatabase } from './checks/database.js';\nimport { checkFramework, detectFramework } from './checks/framework.js';\nimport { checkLockFile, detectPackageManager } from './checks/lock-file.js';\nimport { checkPackageJson } from './checks/package-json.js';\nimport { checkPortEnv } from './checks/port-env.js';\nimport type { DeployCheck, DeployCheckReport } from './types.js';\n\nfunction severityIcon(severity: DeployCheck['severity']): string {\n switch (severity) {\n case 'error':\n return chalk.red('✗');\n case 'warning':\n return chalk.yellow('!');\n case 'info':\n return chalk.dim('·');\n }\n}\n\nfunction displayResults(report: DeployCheckReport): void {\n output.newline();\n output.log(chalk.bold(' Rush Deploy Check'));\n output.log(\n chalk.dim(\n ` Framework: ${report.framework} | Package Manager: ${report.packageManager ?? 'unknown'}`\n )\n );\n output.newline();\n\n const grouped = {\n error: report.checks.filter((c) => c.severity === 'error'),\n warning: report.checks.filter((c) => c.severity === 'warning'),\n info: report.checks.filter((c) => c.severity === 'info'),\n };\n\n for (const [severity, checks] of Object.entries(grouped)) {\n if (checks.length === 0) continue;\n for (const check of checks) {\n const icon = severityIcon(check.severity);\n output.log(` ${icon} ${check.message}`);\n if (check.fix && severity !== 'info') {\n output.log(chalk.dim(` → ${check.fix}`));\n }\n }\n }\n\n output.newline();\n\n const { errors, warnings } = report.summary;\n const parts: string[] = [];\n if (errors > 0) parts.push(chalk.red(`${errors} errors`));\n if (warnings > 0) parts.push(chalk.yellow(`${warnings} warnings`));\n if (errors === 0 && warnings === 0)\n parts.push(chalk.green('All checks passed'));\n output.log(` ${parts.join(', ')}`);\n\n if (report.deployable) {\n output.newline();\n output.log(\n chalk.green(' Ready to deploy! Run `rush-ai task deploy` to proceed.')\n );\n } else {\n output.newline();\n output.log(chalk.red(' Fix the errors above before deploying.'));\n }\n\n output.newline();\n}\n\nexport function runChecks(projectPath: string): DeployCheckReport {\n const framework = detectFramework(projectPath);\n const packageManager = detectPackageManager(projectPath);\n\n const checks: DeployCheck[] = [\n ...checkPackageJson(projectPath),\n ...checkFramework(projectPath),\n ...checkLockFile(projectPath),\n ...checkPortEnv(projectPath, framework),\n ];\n\n const { checks: dbChecks, info: dbInfo } = checkDatabase(\n projectPath,\n framework\n );\n checks.push(...dbChecks);\n\n const errors = checks.filter((c) => c.severity === 'error').length;\n const warnings = checks.filter((c) => c.severity === 'warning').length;\n const info = checks.filter((c) => c.severity === 'info').length;\n\n return {\n framework,\n packageManager,\n database: dbInfo,\n checks,\n summary: { errors, warnings, info },\n deployable: errors === 0,\n };\n}\n\nexport function registerCheckCommand(program: Command): void {\n program\n .command('check')\n .description('Check if the current project is ready for Rush deployment')\n .option('-p, --path <dir>', 'Project directory to check', '.')\n .action(async (opts: { path: string }) => {\n const projectPath = resolve(opts.path);\n const jsonMode = program.opts().json;\n\n const report = runChecks(projectPath);\n\n if (jsonMode) {\n output.log(JSON.stringify(report, null, 2));\n } else {\n displayResults(report);\n }\n\n if (!report.deployable) {\n process.exit(1);\n }\n });\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { DatabaseInfo, DeployCheck } from '../types.js';\nimport type { FrameworkType } from './framework.js';\n\nconst PLACEHOLDER_PATTERNS = [\n 'your-',\n 'placeholder',\n 'xxx',\n 'example',\n '<',\n '>',\n '${',\n 'todo',\n];\n\nfunction isPlaceholder(value: string): boolean {\n const lower = value.toLowerCase();\n return PLACEHOLDER_PATTERNS.some((p) => lower.includes(p));\n}\n\nfunction parseEnvFile(filePath: string): Record<string, string> {\n if (!existsSync(filePath)) return {};\n try {\n const content = readFileSync(filePath, 'utf-8');\n const vars: Record<string, string> = {};\n for (const line of content.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n const match = trimmed.match(/^([^=]+)=(.*)$/);\n if (match) vars[match[1]] = match[2];\n }\n return vars;\n } catch {\n return {};\n }\n}\n\nexport function checkDatabase(\n projectPath: string,\n framework: FrameworkType\n): { checks: DeployCheck[]; info: DatabaseInfo } {\n const defaultInfo: DatabaseInfo = {\n detected: false,\n type: null,\n autoCreate: false,\n };\n\n if (framework !== 'nextjs') {\n return {\n checks: [],\n info: defaultInfo,\n };\n }\n\n const checks: DeployCheck[] = [];\n const envVars = parseEnvFile(join(projectPath, '.env.local'));\n\n const postgresUrl = envVars.USER_POSTGRESQL_URL;\n if (\n postgresUrl &&\n !isPlaceholder(postgresUrl) &&\n (postgresUrl.startsWith('postgresql://') ||\n postgresUrl.startsWith('postgres://'))\n ) {\n checks.push({\n name: 'database_config',\n severity: 'info',\n message:\n 'Valid PostgreSQL config found in .env.local — Rush will use your existing database',\n });\n return {\n checks,\n info: { detected: true, type: 'postgresql', autoCreate: false },\n };\n }\n\n const supabaseUrl = envVars.SUPABASE_URL;\n const supabaseKey = envVars.SUPABASE_SERVICE_ROLE_KEY || envVars.SUPABASE_KEY;\n if (\n supabaseUrl &&\n supabaseKey &&\n !isPlaceholder(supabaseUrl) &&\n !isPlaceholder(supabaseKey) &&\n supabaseUrl.startsWith('https://') &&\n supabaseKey.length > 20\n ) {\n checks.push({\n name: 'database_config',\n severity: 'info',\n message:\n 'Valid Supabase config found in .env.local — Rush will use your existing database',\n });\n return {\n checks,\n info: { detected: true, type: 'supabase', autoCreate: false },\n };\n }\n\n // Next.js project without valid database config → Rush will auto-create\n const hasPlaceholder =\n (postgresUrl && isPlaceholder(postgresUrl)) ||\n (supabaseUrl && isPlaceholder(supabaseUrl));\n\n if (hasPlaceholder) {\n checks.push({\n name: 'database_config',\n severity: 'warning',\n message:\n 'Database env vars in .env.local contain placeholder values — Rush will auto-create a Supabase database and overwrite them',\n fix: 'Either set real database credentials or remove the placeholder values',\n });\n } else {\n checks.push({\n name: 'database_config',\n severity: 'info',\n message:\n 'No database config detected — Rush will auto-create a Supabase database for this Next.js project',\n });\n }\n\n return {\n checks,\n info: { detected: false, type: null, autoCreate: true },\n };\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { DeployCheck } from '../types.js';\n\nexport type FrameworkType = 'nextjs' | 'vite' | 'unknown';\n\nconst NEXT_CONFIG_FILES = [\n 'next.config.js',\n 'next.config.ts',\n 'next.config.mjs',\n];\n\nconst VITE_CONFIG_FILES = ['vite.config.ts', 'vite.config.js'];\n\nexport function detectFramework(projectPath: string): FrameworkType {\n const pkgPath = join(projectPath, 'package.json');\n if (!existsSync(pkgPath)) return 'unknown';\n\n try {\n const raw = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n const deps = { ...raw.dependencies, ...raw.devDependencies };\n if (deps.next) return 'nextjs';\n if (\n deps.vite ||\n VITE_CONFIG_FILES.some((f) => existsSync(join(projectPath, f)))\n ) {\n return 'vite';\n }\n return 'unknown';\n } catch {\n return 'unknown';\n }\n}\n\nexport function checkFramework(projectPath: string): DeployCheck[] {\n const checks: DeployCheck[] = [];\n const framework = detectFramework(projectPath);\n\n checks.push({\n name: 'framework_detected',\n severity: 'info',\n message: `Detected framework: ${framework}`,\n });\n\n if (framework === 'nextjs') {\n const hasConfig = NEXT_CONFIG_FILES.some((f) =>\n existsSync(join(projectPath, f))\n );\n if (!hasConfig) {\n checks.push({\n name: 'config_file',\n severity: 'warning',\n message: 'No next.config.js/ts/mjs found',\n fix: 'Create a next.config.js file',\n });\n }\n } else if (framework === 'vite') {\n const hasConfig = VITE_CONFIG_FILES.some((f) =>\n existsSync(join(projectPath, f))\n );\n if (hasConfig) {\n checks.push({\n name: 'config_file',\n severity: 'info',\n message: 'Vite config file found',\n });\n }\n\n if (existsSync(join(projectPath, 'index.html'))) {\n checks.push({\n name: 'index_html',\n severity: 'info',\n message: 'index.html found (Vite entry point)',\n });\n } else {\n checks.push({\n name: 'index_html',\n severity: 'warning',\n message:\n 'index.html not found — Vite projects typically need this as entry point',\n fix: 'Create an index.html at the project root',\n });\n }\n }\n\n return checks;\n}\n","import { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { DeployCheck } from '../types.js';\n\nexport type PackageManagerType = 'pnpm' | 'yarn' | 'npm' | null;\n\nexport function detectPackageManager(projectPath: string): PackageManagerType {\n if (existsSync(join(projectPath, 'pnpm-lock.yaml'))) return 'pnpm';\n if (existsSync(join(projectPath, 'yarn.lock'))) return 'yarn';\n if (existsSync(join(projectPath, 'package-lock.json'))) return 'npm';\n return null;\n}\n\nexport function checkLockFile(projectPath: string): DeployCheck[] {\n const checks: DeployCheck[] = [];\n const pm = detectPackageManager(projectPath);\n\n if (pm) {\n checks.push({\n name: 'lock_file_exists',\n severity: 'info',\n message: `Package manager: ${pm}`,\n });\n } else {\n checks.push({\n name: 'lock_file_exists',\n severity: 'warning',\n message:\n 'No lock file found (pnpm-lock.yaml, yarn.lock, or package-lock.json)',\n fix: 'Run `npm install` to generate package-lock.json',\n autoFixable: true,\n });\n }\n\n return checks;\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { DeployCheck } from '../types.js';\n\nexport interface PackageJsonInfo {\n exists: boolean;\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n}\n\nexport function readPackageJson(projectPath: string): PackageJsonInfo {\n const pkgPath = join(projectPath, 'package.json');\n if (!existsSync(pkgPath)) {\n return { exists: false };\n }\n try {\n const raw = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n return {\n exists: true,\n scripts: raw.scripts,\n dependencies: raw.dependencies,\n devDependencies: raw.devDependencies,\n };\n } catch {\n return { exists: false };\n }\n}\n\nexport function checkPackageJson(projectPath: string): DeployCheck[] {\n const checks: DeployCheck[] = [];\n const pkg = readPackageJson(projectPath);\n\n if (!pkg.exists) {\n checks.push({\n name: 'package_json_exists',\n severity: 'error',\n message: 'package.json not found',\n fix: 'Run `npm init -y` to create one',\n });\n return checks;\n }\n\n if (!pkg.scripts?.dev) {\n checks.push({\n name: 'scripts_dev',\n severity: 'error',\n message: 'Missing \"dev\" script in package.json',\n fix: 'Add a dev script (e.g., \"dev\": \"vite\" or \"dev\": \"next dev\")',\n autoFixable: true,\n });\n }\n\n if (!pkg.scripts?.build) {\n checks.push({\n name: 'scripts_build',\n severity: 'warning',\n message:\n 'Missing \"build\" script in package.json — deployment may skip build step',\n fix: 'Add a build script (e.g., \"build\": \"vite build\" or \"build\": \"next build\")',\n autoFixable: true,\n });\n }\n\n if (pkg.scripts?.build) {\n const build = pkg.scripts.build;\n if (/^(?:vue-)?tsc\\s.*&&/.test(build)) {\n checks.push({\n name: 'build_tsc_prefix',\n severity: 'info',\n message: `Build script starts with tsc: \"${build}\" — Rush will auto-strip the tsc check during build`,\n });\n }\n }\n\n return checks;\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { DeployCheck } from '../types.js';\nimport type { FrameworkType } from './framework.js';\n\nconst VITE_CONFIG_FILES = ['vite.config.ts', 'vite.config.js'];\n\nfunction readDevScript(projectPath: string): string | null {\n const pkgPath = join(projectPath, 'package.json');\n if (!existsSync(pkgPath)) return null;\n try {\n const raw = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n return raw.scripts?.dev ?? null;\n } catch {\n return null;\n }\n}\n\nfunction viteConfigReadsPort(projectPath: string): boolean {\n for (const file of VITE_CONFIG_FILES) {\n const filePath = join(projectPath, file);\n if (!existsSync(filePath)) continue;\n try {\n const content = readFileSync(filePath, 'utf-8');\n if (/process\\.env\\.PORT/.test(content)) return true;\n if (/env\\s*\\(\\s*['\"]PORT['\"]\\s*\\)/.test(content)) return true;\n } catch {\n // ignore read errors\n }\n }\n return false;\n}\n\nfunction devScriptReadsPort(devScript: string): boolean {\n if (/\\$PORT|\\$\\{PORT\\}|%PORT%/.test(devScript)) return true;\n if (/--port\\s+\\$/.test(devScript)) return true;\n return false;\n}\n\nexport function checkPortEnv(\n projectPath: string,\n framework: FrameworkType\n): DeployCheck[] {\n const checks: DeployCheck[] = [];\n\n if (framework === 'nextjs') {\n checks.push({\n name: 'port_env',\n severity: 'info',\n message: 'Next.js natively supports PORT env — no config change needed',\n });\n return checks;\n }\n\n if (framework === 'vite') {\n if (viteConfigReadsPort(projectPath)) {\n checks.push({\n name: 'port_env',\n severity: 'info',\n message: 'Vite config reads process.env.PORT',\n });\n return checks;\n }\n\n const devScript = readDevScript(projectPath);\n if (devScript && devScriptReadsPort(devScript)) {\n checks.push({\n name: 'port_env',\n severity: 'info',\n message: 'Dev script references PORT',\n });\n return checks;\n }\n\n checks.push({\n name: 'port_env',\n severity: 'error',\n message:\n 'Vite config does not read process.env.PORT — Rush Pod passes PORT=8000',\n fix: 'Add `server: { port: parseInt(process.env.PORT || \"5173\") }` to vite.config.ts',\n autoFixable: true,\n });\n return checks;\n }\n\n // Unknown framework — check dev script heuristically\n const devScript = readDevScript(projectPath);\n if (devScript && devScriptReadsPort(devScript)) {\n checks.push({\n name: 'port_env',\n severity: 'info',\n message: 'Dev script references PORT',\n });\n } else {\n checks.push({\n name: 'port_env',\n severity: 'error',\n message: 'Dev server must read PORT env var — Rush Pod passes PORT=8000',\n fix: 'Ensure your dev server reads process.env.PORT or accepts --port $PORT',\n autoFixable: false,\n });\n }\n\n return checks;\n}\n","import { existsSync } from 'node:fs';\nimport { appendFile, mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { basename, dirname, join } from 'node:path';\nimport type { Command } from 'commander';\nimport { output } from '../../output/logger.js';\n\nconst MARKER_BEGIN = '###-begin-rush-ai-completion-###';\nconst MARKER_END = '###-end-rush-ai-completion-###';\n\nconst COMPLETION_SCRIPTS: Record<string, string> = {\n bash: `\n${MARKER_BEGIN}\n_rush_cli_completion() {\n local cur=\"\\${COMP_WORDS[COMP_CWORD]}\"\n local prev=\"\\${COMP_WORDS[COMP_CWORD-1]}\"\n local cmds=\"auth agent task mcp plugin completion config doctor\"\n\n case \"$prev\" in\n rush-ai) COMPREPLY=( $(compgen -W \"$cmds\" -- \"$cur\") ) ;;\n auth) COMPREPLY=( $(compgen -W \"login logout status\" -- \"$cur\") ) ;;\n agent) COMPREPLY=( $(compgen -W \"list info\" -- \"$cur\") ) ;;\n task) COMPREPLY=( $(compgen -W \"run create status result list watch cancel\" -- \"$cur\") ) ;;\n plugin) COMPREPLY=( $(compgen -W \"install list status update uninstall\" -- \"$cur\") ) ;;\n completion) COMPREPLY=( $(compgen -W \"install bash zsh fish\" -- \"$cur\") ) ;;\n config) COMPREPLY=( $(compgen -W \"show set use create delete list\" -- \"$cur\") ) ;;\n esac\n}\ncomplete -F _rush_cli_completion rush-ai\n${MARKER_END}`.trimStart(),\n\n zsh: `\n${MARKER_BEGIN}\n_rush_cli_completion() {\n local -a cmds\n cmds=(\n 'auth:Authentication commands'\n 'agent:Agent management'\n 'task:Task operations'\n 'mcp:MCP server'\n 'plugin:Plugin management'\n 'completion:Shell completion'\n 'config:Configuration management'\n 'doctor:System diagnostics'\n )\n _describe 'command' cmds\n}\ncompdef _rush_cli_completion rush-ai\n${MARKER_END}`.trimStart(),\n\n fish: `\n${MARKER_BEGIN}\ncomplete -c rush-ai -n '__fish_use_subcommand' -a auth -d 'Authentication'\ncomplete -c rush-ai -n '__fish_use_subcommand' -a agent -d 'Agent management'\ncomplete -c rush-ai -n '__fish_use_subcommand' -a task -d 'Task operations'\ncomplete -c rush-ai -n '__fish_use_subcommand' -a mcp -d 'MCP server'\ncomplete -c rush-ai -n '__fish_use_subcommand' -a plugin -d 'Plugin management'\ncomplete -c rush-ai -n '__fish_use_subcommand' -a completion -d 'Shell completion'\ncomplete -c rush-ai -n '__fish_use_subcommand' -a config -d 'Configuration management'\ncomplete -c rush-ai -n '__fish_use_subcommand' -a doctor -d 'System diagnostics'\ncomplete -c rush-ai -n '__fish_seen_subcommand_from auth' -a 'login logout status'\ncomplete -c rush-ai -n '__fish_seen_subcommand_from agent' -a 'list info'\ncomplete -c rush-ai -n '__fish_seen_subcommand_from task' -a 'run create status result list watch cancel'\ncomplete -c rush-ai -n '__fish_seen_subcommand_from plugin' -a 'install list status update uninstall'\ncomplete -c rush-ai -n '__fish_seen_subcommand_from completion' -a 'install bash zsh fish'\ncomplete -c rush-ai -n '__fish_seen_subcommand_from config' -a 'show set use create delete list'\n${MARKER_END}`.trimStart(),\n};\n\nfunction detectShell(): string | null {\n const shell = process.env.SHELL;\n if (!shell) return null;\n const name = basename(shell);\n return COMPLETION_SCRIPTS[name] ? name : null;\n}\n\nfunction getShellRcFile(shell: string): string {\n const home = homedir();\n switch (shell) {\n case 'bash':\n return existsSync(join(home, '.bashrc'))\n ? join(home, '.bashrc')\n : join(home, '.bash_profile');\n case 'zsh':\n return join(home, '.zshrc');\n case 'fish':\n return join(home, '.config', 'fish', 'completions', 'rush-ai.fish');\n default:\n throw new Error(`Unsupported shell: ${shell}`);\n }\n}\n\nexport function registerCompletionCommand(program: Command): void {\n const completion = program\n .command('completion')\n .description('Shell completion utilities');\n\n // Print completion script to stdout\n completion\n .command('bash')\n .description('Print bash completion script')\n .action(() => {\n output.log(COMPLETION_SCRIPTS.bash);\n });\n\n completion\n .command('zsh')\n .description('Print zsh completion script')\n .action(() => {\n output.log(COMPLETION_SCRIPTS.zsh);\n });\n\n completion\n .command('fish')\n .description('Print fish completion script')\n .action(() => {\n output.log(COMPLETION_SCRIPTS.fish);\n });\n\n // Auto-install subcommand\n completion\n .command('install')\n .description('Auto-install shell completion to your shell rc file')\n .option('--shell <shell>', 'Shell type (auto-detect if omitted)')\n .action(async (opts: { shell?: string }) => {\n const shell = opts.shell ?? detectShell();\n if (!shell) {\n output.error('Could not detect shell. Use --shell <bash|zsh|fish>.');\n process.exit(1);\n }\n\n if (!COMPLETION_SCRIPTS[shell]) {\n output.error(\n `Unsupported shell: ${shell}. Supported: bash, zsh, fish.`\n );\n process.exit(1);\n }\n\n const script = COMPLETION_SCRIPTS[shell];\n const rcFile = getShellRcFile(shell);\n\n // Fish: write standalone completion file\n if (shell === 'fish') {\n try {\n await mkdir(dirname(rcFile), { recursive: true });\n await writeFile(rcFile, script + '\\n');\n output.success(`Fish completion installed to ${rcFile}`);\n } catch {\n output.error(`Failed to write to ${rcFile}`);\n output.dim(\n ' You can manually add the following to your fish completions:'\n );\n output.log(script);\n }\n return;\n }\n\n // Bash/Zsh: append to rc file (idempotent)\n try {\n const existing = await readFile(rcFile, 'utf-8');\n if (existing.includes(MARKER_BEGIN)) {\n output.info(`Completion already installed in ${rcFile}`);\n return;\n }\n } catch {\n // File doesn't exist — will be created by appendFile\n }\n\n try {\n await appendFile(rcFile, '\\n' + script + '\\n');\n output.success(`Completion installed to ${rcFile}`);\n output.dim(\n ` Run \\`source ${rcFile}\\` or restart your shell to activate.`\n );\n } catch {\n output.error(`Failed to write to ${rcFile}`);\n output.dim(\n ' You can manually add the following to your shell rc file:'\n );\n output.log(script);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { formatTable } from '../../output/format.js';\nimport { output } from '../../output/logger.js';\nimport {\n createProfile,\n deleteProfile,\n getActiveProfile,\n getAuthConfig,\n getConfigDir,\n getGlobalConfig,\n getProfileAuth,\n getProfileConfig,\n listProfiles,\n setActiveProfile,\n setGlobalConfig,\n} from '../../util/config.js';\n\nconst SETTABLE_KEYS = ['api', 'collectMetrics', 'currentTeam'] as const;\ntype SettableKey = (typeof SETTABLE_KEYS)[number];\n\nfunction maskToken(token: string | null): string {\n if (!token) return '(none)';\n if (token.length <= 8) return '****';\n return `${token.slice(0, 4)}...****`;\n}\n\nexport function registerConfigCommand(program: Command): void {\n const config = program\n .command('config')\n .description('Manage CLI configuration and profiles');\n\n config\n .command('show')\n .description('Show current configuration')\n .action(() => {\n const jsonMode = program.opts().json;\n const profile = getActiveProfile();\n const globalConf = getGlobalConfig();\n const authConf = getAuthConfig();\n const configDir = getConfigDir();\n\n const apiOverride = process.env.RUSH_API_URL;\n const profileOverride = process.env.RUSH_PROFILE;\n\n if (jsonMode) {\n output.log(\n JSON.stringify(\n {\n profile,\n api: apiOverride ?? globalConf.api,\n apiOverridden: Boolean(apiOverride),\n profileOverridden: Boolean(profileOverride),\n authMethod: authConf.method,\n collectMetrics: globalConf.collectMetrics,\n currentTeam: globalConf.currentTeam,\n configDir,\n },\n null,\n 2\n )\n );\n return;\n }\n\n output.log(output.bold('Configuration'));\n output.newline();\n\n const profileLabel = profileOverride\n ? `${profile} (overridden by RUSH_PROFILE env)`\n : profile;\n output.log(` Active profile: ${profileLabel}`);\n\n const apiLabel = apiOverride\n ? `${apiOverride} (overridden by RUSH_API_URL env)`\n : globalConf.api;\n output.log(` API: ${apiLabel}`);\n\n output.log(\n ` Auth method: ${authConf.method ?? '(not authenticated)'}`\n );\n output.log(` Token: ${maskToken(authConf.token)}`);\n output.log(\n ` Metrics: ${globalConf.collectMetrics ? 'enabled' : 'disabled'}`\n );\n output.log(` Config dir: ${configDir}`);\n });\n\n config\n .command('set')\n .description('Set a configuration value')\n .argument('<key>', `Config key (${SETTABLE_KEYS.join(', ')})`)\n .argument('<value>', 'Config value')\n .action((key: string, value: string) => {\n const jsonMode = program.opts().json;\n const profile = getActiveProfile();\n\n if (!SETTABLE_KEYS.includes(key as SettableKey)) {\n output.error(\n `Unknown config key '${key}'. Valid keys: ${SETTABLE_KEYS.join(', ')}`\n );\n process.exit(1);\n }\n\n let typedValue: unknown = value;\n\n if (key === 'collectMetrics') {\n if (value !== 'true' && value !== 'false') {\n output.error(\"'collectMetrics' must be 'true' or 'false'.\");\n process.exit(1);\n }\n typedValue = value === 'true';\n }\n\n if (key === 'currentTeam' && value === 'null') {\n typedValue = null;\n }\n\n setGlobalConfig({ [key]: typedValue });\n\n if (jsonMode) {\n output.log(JSON.stringify({ key, value: typedValue, profile }));\n } else {\n output.success(\n `Updated '${key}' to '${String(typedValue)}' (profile: ${profile})`\n );\n }\n });\n\n config\n .command('use')\n .description('Switch active profile')\n .argument('<profile>', 'Profile name to switch to')\n .action((profileName: string) => {\n const jsonMode = program.opts().json;\n\n try {\n setActiveProfile(profileName);\n } catch (err) {\n output.error(\n err instanceof Error ? err.message : 'Failed to switch profile'\n );\n const available = listProfiles();\n if (!jsonMode) {\n output.dim(`Available profiles: ${available.join(', ')}`);\n output.dim(\n `Run \\`rush-ai config create ${profileName}\\` to create it.`\n );\n }\n process.exit(1);\n }\n\n const globalConf = getGlobalConfig();\n\n if (jsonMode) {\n output.log(\n JSON.stringify({\n profile: profileName,\n api: globalConf.api,\n })\n );\n } else {\n output.success(`Switched to profile '${profileName}'`);\n output.dim(`API: ${globalConf.api}`);\n }\n });\n\n config\n .command('create')\n .description('Create a new profile')\n .argument('<profile>', 'Profile name')\n .option('--api <url>', 'API base URL')\n .action((profileName: string, options: { api?: string }) => {\n const jsonMode = program.opts().json;\n\n try {\n createProfile(\n profileName,\n options.api ? { api: options.api } : undefined\n );\n } catch (err) {\n output.error(\n err instanceof Error ? err.message : 'Failed to create profile'\n );\n process.exit(1);\n }\n\n if (jsonMode) {\n output.log(JSON.stringify({ profile: profileName, created: true }));\n } else {\n output.success(`Created profile '${profileName}'`);\n output.dim(\n `Run \\`rush-ai config use ${profileName}\\` to switch to it.`\n );\n }\n });\n\n config\n .command('delete')\n .description('Delete a profile')\n .argument('<profile>', 'Profile name to delete')\n .action((profileName: string) => {\n const jsonMode = program.opts().json;\n\n try {\n deleteProfile(profileName);\n } catch (err) {\n output.error(\n err instanceof Error ? err.message : 'Failed to delete profile'\n );\n process.exit(1);\n }\n\n if (jsonMode) {\n output.log(JSON.stringify({ profile: profileName, deleted: true }));\n } else {\n output.success(`Deleted profile '${profileName}'`);\n }\n });\n\n config\n .command('list')\n .alias('ls')\n .description('List all profiles')\n .action(() => {\n const jsonMode = program.opts().json;\n const profiles = listProfiles();\n const active = getActiveProfile();\n\n if (jsonMode) {\n const data = profiles.map((name) => {\n const conf = getProfileConfig(name);\n const auth = getProfileAuth(name);\n return {\n name,\n active: name === active,\n api: conf?.api ?? '',\n authMethod: auth.method,\n loggedIn: Boolean(auth.token),\n };\n });\n output.log(JSON.stringify(data, null, 2));\n return;\n }\n\n if (profiles.length === 0) {\n output.info('No profiles configured.');\n return;\n }\n\n const rows = profiles.map((name) => {\n const conf = getProfileConfig(name);\n const auth = getProfileAuth(name);\n const marker = name === active ? '*' : ' ';\n const authStatus = auth.token\n ? `${auth.method ?? 'unknown'} (logged in)`\n : 'not authenticated';\n return {\n ' ': marker,\n Profile: name,\n API: conf?.api ?? '',\n Auth: authStatus,\n };\n });\n\n output.log(formatTable(rows));\n });\n}\n","import chalk from 'chalk';\nimport type { Command } from 'commander';\nimport { output } from '../../output/logger.js';\nimport { checkAuth } from './checks/auth.js';\nimport { checkConfig } from './checks/config.js';\nimport { checkConnectivity } from './checks/connectivity.js';\nimport { checkEnvironment } from './checks/environment.js';\nimport { checkPlugins } from './checks/plugins.js';\nimport type { CheckRunner, DoctorCheck } from './types.js';\n\nconst CHECK_RUNNERS: CheckRunner[] = [\n checkEnvironment,\n checkAuth,\n checkConnectivity,\n checkConfig,\n checkPlugins,\n];\n\nasync function runAllChecks(): Promise<DoctorCheck[]> {\n const checks: DoctorCheck[] = [];\n for (const runner of CHECK_RUNNERS) {\n try {\n const results = await runner();\n checks.push(...results);\n } catch (err) {\n // Isolate runner failures so remaining checks still run\n checks.push({\n name: 'runner_error',\n group: 'Environment',\n status: 'fail',\n label: 'Check error',\n value: `A check group failed: ${err instanceof Error ? err.message : 'unknown error'}`,\n });\n }\n }\n return checks;\n}\n\nfunction getSummary(checks: DoctorCheck[]): {\n pass: number;\n warn: number;\n fail: number;\n} {\n let pass = 0;\n let warn = 0;\n let fail = 0;\n for (const c of checks) {\n if (c.status === 'pass') pass++;\n else if (c.status === 'warn') warn++;\n else if (c.status === 'fail') fail++;\n // info is excluded from summary\n }\n return { pass, warn, fail };\n}\n\nfunction statusIcon(status: DoctorCheck['status']): string {\n switch (status) {\n case 'pass':\n return chalk.green('✓');\n case 'warn':\n return chalk.yellow('!');\n case 'fail':\n return chalk.red('✗');\n case 'info':\n return chalk.dim('·');\n }\n}\n\nconst LABEL_WIDTH = 20;\n\nfunction displayResults(checks: DoctorCheck[]): void {\n // Group checks\n const groups = new Map<string, DoctorCheck[]>();\n for (const check of checks) {\n const existing = groups.get(check.group) ?? [];\n existing.push(check);\n groups.set(check.group, existing);\n }\n\n output.newline();\n\n for (const [groupName, groupChecks] of groups) {\n output.log(` ${chalk.bold(groupName)}`);\n for (const check of groupChecks) {\n const icon = statusIcon(check.status);\n const label = check.label.padEnd(LABEL_WIDTH);\n output.log(` ${icon} ${label} ${check.value}`);\n }\n output.log('');\n }\n\n const summary = getSummary(checks);\n const parts: string[] = [];\n parts.push(chalk.green(`${summary.pass} passed`));\n if (summary.warn > 0) parts.push(chalk.yellow(`${summary.warn} warnings`));\n if (summary.fail > 0) parts.push(chalk.red(`${summary.fail} failed`));\n if (summary.warn === 0 && summary.fail === 0) {\n parts.push('0 warnings');\n parts.push('0 failed');\n }\n output.log(` ${chalk.bold('Summary:')} ${parts.join(', ')}`);\n\n if (summary.fail > 0 || summary.warn > 0) {\n const fixable = checks.filter(\n (c) => c.status !== 'pass' && c.status !== 'info' && c.autoFix\n );\n if (fixable.length > 0) {\n output.log(\n chalk.dim(` Run \\`rush-ai doctor --fix\\` to attempt auto-fixes.`)\n );\n }\n }\n\n output.log('');\n}\n\nfunction outputJson(checks: DoctorCheck[]): void {\n const summary = getSummary(checks);\n const result = {\n checks: checks.map((c) => ({\n name: c.name,\n group: c.group,\n status: c.status,\n label: c.label,\n value: c.value,\n ...(c.fix ? { fix: c.fix } : {}),\n })),\n summary,\n };\n output.log(JSON.stringify(result, null, 2));\n}\n\nasync function runAutoFixes(checks: DoctorCheck[]): Promise<void> {\n const fixable = checks.filter(\n (c) => c.status !== 'pass' && c.status !== 'info' && c.autoFix\n );\n\n if (fixable.length === 0) {\n output.info('No auto-fixable issues found.');\n return;\n }\n\n output.newline();\n for (const check of fixable) {\n output.info(`Fixing: ${check.label}...`);\n try {\n await check.autoFix!();\n output.success(`Fixed: ${check.label}`);\n } catch (err) {\n output.error(\n `Failed to fix ${check.label}: ${err instanceof Error ? err.message : 'unknown error'}`\n );\n }\n }\n output.newline();\n}\n\nexport function registerDoctorCommand(program: Command): void {\n program\n .command('doctor')\n .description('Diagnose environment, auth, and connectivity issues')\n .option('--fix', 'Attempt to auto-fix detected issues')\n .action(async (opts: { fix?: boolean }) => {\n const jsonMode = program.opts().json;\n\n let checks = await runAllChecks();\n\n if (opts.fix) {\n await runAutoFixes(checks);\n // Re-run all checks after fixes\n checks = await runAllChecks();\n }\n\n if (jsonMode) {\n outputJson(checks);\n } else {\n displayResults(checks);\n }\n\n const hasFail = checks.some((c) => c.status === 'fail');\n if (hasFail) {\n process.exit(1);\n }\n });\n}\n","import { getAuthMethod } from '../../../util/auth.js';\nimport { getAuthConfig } from '../../../util/config.js';\nimport type { CheckRunner, DoctorCheck } from '../types.js';\n\nexport const checkAuth: CheckRunner = async () => {\n const checks: DoctorCheck[] = [];\n const method = getAuthMethod();\n\n // Auth method\n if (method === 'platform_token') {\n checks.push({\n name: 'auth_method',\n group: 'Authentication',\n status: 'pass',\n label: 'Auth method',\n value: 'Platform Token (browser login)',\n });\n } else if (method === 'cas') {\n checks.push({\n name: 'auth_method',\n group: 'Authentication',\n status: 'pass',\n label: 'Auth method',\n value: 'CAS PKCE',\n });\n } else if (method === 'api_key') {\n checks.push({\n name: 'auth_method',\n group: 'Authentication',\n status: 'pass',\n label: 'Auth method',\n value: 'API Key',\n });\n } else {\n checks.push({\n name: 'auth_method',\n group: 'Authentication',\n status: 'warn',\n label: 'Auth method',\n value: 'Not authenticated',\n fix: 'Run `rush-ai auth login` to authenticate',\n });\n }\n\n // Token status — depends on auth method\n if (method === 'api_key') {\n checks.push({\n name: 'token_status',\n group: 'Authentication',\n status: 'info',\n label: 'Token status',\n value: 'Using API key auth',\n });\n } else if (method === 'cas' || method === 'platform_token') {\n const auth = getAuthConfig();\n if (auth.token && auth.expiresAt) {\n const remaining = auth.expiresAt - Date.now();\n if (remaining > 0) {\n const hours = Math.floor(remaining / (1000 * 60 * 60));\n const minutes = Math.floor(\n (remaining % (1000 * 60 * 60)) / (1000 * 60)\n );\n const timeStr = hours > 0 ? `${hours}h ${minutes}m` : `${minutes}m`;\n checks.push({\n name: 'token_status',\n group: 'Authentication',\n status: 'pass',\n label: 'Token status',\n value: `Valid (expires in ${timeStr})`,\n });\n } else {\n checks.push({\n name: 'token_status',\n group: 'Authentication',\n status: 'warn',\n label: 'Token status',\n value: 'Expired',\n fix: 'Run `rush-ai auth login` to re-authenticate',\n });\n }\n } else if (auth.token) {\n // Token exists but no expiry info\n checks.push({\n name: 'token_status',\n group: 'Authentication',\n status: 'pass',\n label: 'Token status',\n value: 'Valid (no expiry set)',\n });\n } else {\n checks.push({\n name: 'token_status',\n group: 'Authentication',\n status: 'warn',\n label: 'Token status',\n value: 'No token found',\n fix: 'Run `rush-ai auth login` to authenticate',\n });\n }\n } else {\n // Not authenticated\n checks.push({\n name: 'token_status',\n group: 'Authentication',\n status: 'warn',\n label: 'Token status',\n value: 'Not authenticated',\n fix: 'Run `rush-ai auth login` to authenticate',\n });\n }\n\n // API Key env\n const apiKey = process.env.RUSH_API_KEY;\n checks.push({\n name: 'api_key',\n group: 'Authentication',\n status: 'info',\n label: 'API Key',\n value: apiKey ? 'Set (RUSH_API_KEY)' : 'Not set',\n });\n\n return checks;\n};\n","import { accessSync, constants, existsSync, mkdirSync } from 'node:fs';\nimport {\n getAuthConfig,\n getConfigDir,\n getGlobalConfig,\n} from '../../../util/config.js';\nimport type { CheckRunner, DoctorCheck } from '../types.js';\n\nexport const checkConfig: CheckRunner = async () => {\n const checks: DoctorCheck[] = [];\n const configDir = getConfigDir();\n\n // Config directory existence + writability\n const dirExists = existsSync(configDir);\n let writable = false;\n if (dirExists) {\n try {\n accessSync(configDir, constants.W_OK);\n writable = true;\n } catch {\n // not writable\n }\n }\n\n if (dirExists && writable) {\n checks.push({\n name: 'config_dir',\n group: 'Configuration',\n status: 'pass',\n label: 'Config directory',\n value: configDir,\n });\n } else if (dirExists && !writable) {\n checks.push({\n name: 'config_dir',\n group: 'Configuration',\n status: 'fail',\n label: 'Config directory',\n value: `${configDir} (not writable)`,\n fix: `Check permissions on ${configDir}`,\n });\n } else {\n checks.push({\n name: 'config_dir',\n group: 'Configuration',\n status: 'fail',\n label: 'Config directory',\n value: `${configDir} (not found)`,\n fix: `Run \\`rush-ai doctor --fix\\` to create it`,\n autoFix: async () => {\n mkdirSync(configDir, { recursive: true });\n },\n });\n }\n\n // Config files validity\n try {\n getGlobalConfig();\n getAuthConfig();\n checks.push({\n name: 'config_validity',\n group: 'Configuration',\n status: 'pass',\n label: 'Config files',\n value: 'Valid',\n });\n } catch (err) {\n checks.push({\n name: 'config_validity',\n group: 'Configuration',\n status: 'fail',\n label: 'Config files',\n value: `Error: ${err instanceof Error ? err.message : 'unknown'}`,\n fix: 'Check config files in ' + configDir,\n });\n }\n\n // API URL\n try {\n const config = getGlobalConfig();\n checks.push({\n name: 'api_url',\n group: 'Configuration',\n status: 'info',\n label: 'API URL',\n value: config.api,\n });\n } catch {\n checks.push({\n name: 'api_url',\n group: 'Configuration',\n status: 'warn',\n label: 'API URL',\n value: 'Unable to read',\n });\n }\n\n return checks;\n};\n","import { getGlobalConfig } from '../../../util/config.js';\nimport type { CheckRunner, DoctorCheck } from '../types.js';\n\nexport const checkConnectivity: CheckRunner = async () => {\n const checks: DoctorCheck[] = [];\n const config = getGlobalConfig();\n const apiUrl = process.env.RUSH_API_URL ?? config.api;\n\n // API endpoint — raw fetch without auth, measure RTT\n try {\n const start = Date.now();\n const response = await fetch(apiUrl, {\n method: 'HEAD',\n signal: AbortSignal.timeout(5000),\n });\n const rtt = Date.now() - start;\n\n // Any HTTP response (even 401/403) means the server is reachable\n checks.push({\n name: 'api_endpoint',\n group: 'Connectivity',\n status: 'pass',\n label: 'API endpoint',\n value: `${apiUrl} (${rtt}ms, HTTP ${response.status})`,\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Unknown error';\n const isTimeout = message.includes('timeout') || message.includes('abort');\n checks.push({\n name: 'api_endpoint',\n group: 'Connectivity',\n status: 'fail',\n label: 'API endpoint',\n value: isTimeout\n ? `${apiUrl} (timeout after 5s)`\n : `${apiUrl} (${message})`,\n fix: 'Check your network connection and API URL in config',\n });\n }\n\n // Proxy environment variables\n const httpProxy = process.env.HTTP_PROXY || process.env.http_proxy;\n const httpsProxy = process.env.HTTPS_PROXY || process.env.https_proxy;\n\n if (httpProxy || httpsProxy) {\n const parts: string[] = [];\n if (httpProxy) parts.push(`HTTP_PROXY=${maskUrl(httpProxy)}`);\n if (httpsProxy) parts.push(`HTTPS_PROXY=${maskUrl(httpsProxy)}`);\n checks.push({\n name: 'proxy',\n group: 'Connectivity',\n status: 'info',\n label: 'Proxy',\n value: parts.join(', '),\n });\n } else {\n checks.push({\n name: 'proxy',\n group: 'Connectivity',\n status: 'info',\n label: 'Proxy',\n value: 'Not configured',\n });\n }\n\n return checks;\n};\n\n/** Mask proxy URL credentials: http://user:pass@host → http://***@host */\nfunction maskUrl(url: string): string {\n try {\n const parsed = new URL(url);\n if (parsed.username || parsed.password) {\n parsed.username = '***';\n parsed.password = '';\n return parsed.toString().replace(/\\/$/, '');\n }\n // URL parsed but no standard credentials detected — check for @ in raw string\n // (non-standard schemes like `foo:user@host` won't expose username/password)\n if (url.includes('@')) {\n return url.replace(/[^/@]+@/, '***@');\n }\n return parsed.toString().replace(/\\/$/, '');\n } catch {\n // If URL parsing fails, strip anything that looks like credentials\n if (url.includes('@')) {\n return url.replace(/[^/@]+@/, '***@');\n }\n return url;\n }\n}\n","import { execFileSync } from 'node:child_process';\nimport { arch, platform, release, type } from 'node:os';\nimport { VERSION } from '../../../version.js';\nimport type { CheckRunner, DoctorCheck } from '../types.js';\n\nfunction formatOS(): string {\n const p = platform();\n const r = release();\n const a = arch();\n\n let osName: string;\n switch (p) {\n case 'darwin':\n osName = 'macOS';\n break;\n case 'win32':\n osName = 'Windows';\n break;\n case 'linux':\n osName = 'Linux';\n break;\n default:\n osName = type();\n }\n\n return `${osName} ${r} (${p} ${a})`;\n}\n\nconst KNOWN_SHELLS = ['bash', 'zsh', 'fish', 'sh', 'dash', 'ksh', 'tcsh'];\n\nfunction detectShell(): { name: string; version: string | null } {\n const shell = process.env.SHELL;\n if (!shell) {\n return { name: 'unknown', version: null };\n }\n\n const name = shell.split('/').pop() ?? shell;\n\n // Only execute known shells to avoid running arbitrary binaries\n if (!KNOWN_SHELLS.includes(name)) {\n return { name, version: null };\n }\n\n let version: string | null = null;\n\n try {\n const raw = execFileSync(shell, ['--version'], {\n timeout: 3000,\n stdio: ['pipe', 'pipe', 'pipe'],\n encoding: 'utf-8',\n });\n // Extract first line, try to find version number\n const firstLine = raw.split('\\n')[0] ?? '';\n const match = firstLine.match(/(\\d+\\.\\d+[\\d.]*)/);\n version = match?.[1] ?? null;\n } catch {\n // Some shells (e.g. fish) use --version differently, or may fail\n }\n\n return { name, version };\n}\n\nexport const checkEnvironment: CheckRunner = async () => {\n const checks: DoctorCheck[] = [];\n\n // CLI version\n checks.push({\n name: 'cli_version',\n group: 'Environment',\n status: 'info',\n label: 'CLI version',\n value: VERSION,\n });\n\n // Node.js version\n const nodeVersion = process.version;\n const major = parseInt(nodeVersion.slice(1), 10);\n const nodeOk = major >= 18;\n checks.push({\n name: 'node_version',\n group: 'Environment',\n status: nodeOk ? 'pass' : 'fail',\n label: 'Node.js version',\n value: `${nodeVersion}${nodeOk ? '' : ' (>=18.0.0 required)'}`,\n fix: nodeOk ? undefined : 'Upgrade Node.js to version 18 or higher',\n });\n\n // OS\n checks.push({\n name: 'os',\n group: 'Environment',\n status: 'info',\n label: 'OS',\n value: formatOS(),\n });\n\n // Shell\n const shell = detectShell();\n const shellValue =\n shell.name === 'unknown'\n ? 'Unknown'\n : shell.version\n ? `${shell.name} ${shell.version}`\n : shell.name;\n checks.push({\n name: 'shell',\n group: 'Environment',\n status: shell.name === 'unknown' ? 'warn' : 'pass',\n label: 'Shell',\n value: shellValue,\n });\n\n // Terminal\n const terminal = process.env.TERM_PROGRAM ?? 'Unknown';\n checks.push({\n name: 'terminal',\n group: 'Environment',\n status: 'info',\n label: 'Terminal',\n value: terminal,\n });\n\n return checks;\n};\n","import { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { resolve } from 'node:path';\nimport { getGlobalConfig } from '../../../util/config.js';\nimport type { CheckRunner, DoctorCheck } from '../types.js';\n\ninterface PluginManifest {\n name: string;\n version: string;\n type: 'claude-code' | 'cursor';\n installedAt: string;\n}\n\ninterface InstalledPlugins {\n plugins: Record<string, PluginManifest>;\n}\n\nconst PLUGINS_FILE = resolve(homedir(), '.rush', 'plugins', 'installed.json');\n\n/** Map plugin type to its MCP config file path */\nconst MCP_CONFIG_PATHS: Record<string, string> = {\n 'claude-code': resolve(homedir(), '.claude', 'settings.json'),\n cursor: resolve(homedir(), '.cursor', 'mcp.json'),\n};\n\nfunction safeReadJson<T>(filePath: string, fallback: T): T {\n if (!existsSync(filePath)) return fallback;\n try {\n return JSON.parse(readFileSync(filePath, 'utf-8')) as T;\n } catch {\n return fallback;\n }\n}\n\nfunction injectMcpConfig(configPath: string): void {\n const config = safeReadJson<Record<string, unknown>>(configPath, {});\n const mcpServers = (config.mcpServers ?? {}) as Record<string, unknown>;\n const globalConfig = getGlobalConfig();\n\n mcpServers.rush = {\n command: 'rush-ai',\n args: ['mcp', 'serve'],\n env: {\n RUSH_API_URL: globalConfig.api,\n },\n };\n config.mcpServers = mcpServers;\n writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf-8');\n}\n\nfunction checkMcpForPlugin(\n name: string,\n manifest: PluginManifest\n): DoctorCheck {\n const configPath = MCP_CONFIG_PATHS[manifest.type];\n if (!configPath) {\n return {\n name: `plugin_${name}`,\n group: 'Plugins',\n status: 'warn',\n label: name,\n value: `Installed (v${manifest.version}), unknown type: ${manifest.type}`,\n };\n }\n\n if (!existsSync(configPath)) {\n return {\n name: `plugin_${name}`,\n group: 'Plugins',\n status: 'warn',\n label: name,\n value: `Installed, MCP config missing (${configPath})`,\n fix: `Run \\`rush-ai plugin install ${name}\\``,\n autoFix: async () => {\n injectMcpConfig(configPath);\n },\n };\n }\n\n try {\n const config = JSON.parse(readFileSync(configPath, 'utf-8'));\n const servers = config.mcpServers as Record<string, unknown> | undefined;\n\n if (!servers || !('rush' in servers)) {\n return {\n name: `plugin_${name}`,\n group: 'Plugins',\n status: 'warn',\n label: name,\n value: 'Installed, MCP server not configured',\n fix: `Run \\`rush-ai doctor --fix\\` to inject MCP config`,\n autoFix: async () => {\n injectMcpConfig(configPath);\n },\n };\n }\n\n const rushServer = servers.rush as Record<string, unknown>;\n const command = rushServer?.command as string | undefined;\n\n if (command !== 'rush-ai') {\n return {\n name: `plugin_${name}`,\n group: 'Plugins',\n status: 'warn',\n label: name,\n value: `Installed, MCP command is \"${command}\" (expected \"rush-ai\")`,\n fix: `Run \\`rush-ai plugin update ${name}\\``,\n };\n }\n\n return {\n name: `plugin_${name}`,\n group: 'Plugins',\n status: 'pass',\n label: name,\n value: `Installed (v${manifest.version}), MCP config valid`,\n };\n } catch {\n return {\n name: `plugin_${name}`,\n group: 'Plugins',\n status: 'warn',\n label: name,\n value: `Installed, failed to parse MCP config`,\n fix: `Check ${configPath} for JSON syntax errors`,\n };\n }\n}\n\nexport const checkPlugins: CheckRunner = async () => {\n const data = safeReadJson<InstalledPlugins>(PLUGINS_FILE, { plugins: {} });\n const plugins =\n data &&\n typeof data === 'object' &&\n data.plugins &&\n typeof data.plugins === 'object'\n ? data.plugins\n : {};\n const entries = Object.entries(plugins);\n\n if (entries.length === 0) {\n return [\n {\n name: 'plugins_none',\n group: 'Plugins',\n status: 'info',\n label: 'Plugins',\n value: 'No plugins installed',\n },\n ];\n }\n\n return entries.map(([name, manifest]) => checkMcpForPlugin(name, manifest));\n};\n","import type { Command } from 'commander';\nimport { formatOutput, resolveFormat } from '../../output/format.js';\nimport { output } from '../../output/logger.js';\nimport { createClient } from '../../util/client.js';\nimport { ApiError } from '../../util/errors.js';\nimport { requireAuth } from '../../util/require-auth.js';\n\n/** MCP server as returned by GET /api/mcp-registry */\nexport interface McpServer {\n id: string;\n name: string;\n displayName: string;\n description: string;\n transportType: string;\n category: string;\n tags: string[];\n author: string;\n tools: Array<{ name: string; description: string }> | null;\n validationStatus: {\n status: string;\n errorCode?: string;\n errorMessage?: string;\n lastCheckedAt?: string;\n } | null;\n visibility: string;\n starCount: number;\n isBuiltin: boolean;\n}\n\n/** GET /api/mcp-registry response */\ninterface McpListApiResponse {\n success: boolean;\n data: McpServer[];\n meta?: {\n pagination?: {\n currentPage: number;\n totalPages: number;\n totalItems: number;\n itemsPerPage: number;\n hasNext: boolean;\n hasPrevious: boolean;\n };\n };\n}\n\n/** GET /api/mcp-registry/[id] response */\ninterface McpDetailApiResponse {\n success: boolean;\n data: McpServer;\n}\n\nfunction formatValidationStatus(vs: McpServer['validationStatus']): string {\n if (!vs) return '-';\n switch (vs.status) {\n case 'verified':\n return '✓ verified';\n case 'pending':\n return '… pending';\n case 'credential_required':\n return '⚠ credential required';\n case 'failed':\n return `✗ ${vs.errorCode || 'failed'}`;\n default:\n return vs.status;\n }\n}\n\nfunction truncate(str: string, max: number): string {\n if (str.length <= max) return str;\n return `${str.slice(0, max - 3)}...`;\n}\n\nexport function registerMcpCommand(program: Command): void {\n const mcp = program\n .command('mcp')\n .description('MCP server and platform MCP discovery');\n\n mcp\n .command('serve')\n .description('Start the MCP stdio server')\n .action(async () => {\n const { startMcpServer } = await import('./server.js');\n await startMcpServer();\n });\n\n mcp\n .command('list')\n .alias('ls')\n .description('List available MCP servers on the platform')\n .option('-c, --category <category>', 'Filter by category')\n .option('-t, --tag <tag>', 'Filter by tag')\n .option('-s, --search <query>', 'Search by name or description')\n .option('--transport <type>', 'Filter by transport type (stdio|sse|http)')\n .option(\n '-l, --limit <number>',\n 'Max results per page (default: 50, max: 100)',\n '50'\n )\n .option('-p, --page <number>', 'Page number (default: 1)', '1')\n .action(async (opts) => {\n requireAuth();\n const format = resolveFormat(program.opts());\n const client = createClient();\n\n const params = new URLSearchParams();\n if (opts.category) params.set('category', opts.category);\n if (opts.tag) params.set('tag', opts.tag);\n if (opts.search) params.set('search', opts.search);\n if (opts.transport) params.set('transport', opts.transport);\n const parsedLimit = parseInt(opts.limit, 10);\n params.set(\n 'limit',\n String(\n Math.min(\n Math.max(Number.isFinite(parsedLimit) ? parsedLimit : 50, 1),\n 100\n )\n )\n );\n const parsedPage = parseInt(opts.page, 10);\n params.set(\n 'page',\n String(Math.max(Number.isFinite(parsedPage) ? parsedPage : 1, 1))\n );\n\n const { data } = await client.get<McpListApiResponse>(\n `/api/mcp-registry?${params.toString()}`\n );\n\n const servers = data.data;\n const pagination = data.meta?.pagination;\n\n if (format === 'json') {\n output.log(JSON.stringify(data, null, 2));\n return;\n }\n\n if (servers.length === 0) {\n output.info('No MCP servers found.');\n return;\n }\n\n const totalItems = pagination?.totalItems ?? servers.length;\n output.log(output.bold(`MCP Servers (${totalItems} total):`));\n output.newline();\n\n const rows = servers.map((m) => ({\n ID: m.id,\n 'Display Name': truncate(m.displayName, 30),\n Category: m.category || '-',\n Transport: m.transportType || '-',\n Tools: String(m.tools?.length ?? 0),\n Status: formatValidationStatus(m.validationStatus),\n }));\n\n output.log(\n formatOutput(rows, format, {\n columns: { 'Display Name': { maxWidth: 30 } },\n })\n );\n\n // Show pagination hint if there are more pages\n if (pagination && pagination.hasNext) {\n output.newline();\n output.dim(\n `Page ${pagination.currentPage} of ${pagination.totalPages}. Use --page ${pagination.currentPage + 1} to see more.`\n );\n }\n });\n\n mcp\n .command('list-tools <server-id>')\n .description('List tools provided by an MCP server')\n .action(async (serverId: string) => {\n requireAuth();\n const format = resolveFormat(program.opts());\n const client = createClient();\n\n let data: McpDetailApiResponse;\n try {\n ({ data } = await client.get<McpDetailApiResponse>(\n `/api/mcp-registry/${encodeURIComponent(serverId)}`\n ));\n } catch (err) {\n if (err instanceof ApiError && err.status === 404) {\n output.error(`MCP server '${serverId}' not found.`);\n process.exitCode = 1;\n return;\n }\n throw err;\n }\n\n const server = data.data;\n\n if (format === 'json') {\n output.log(JSON.stringify(server, null, 2));\n return;\n }\n\n // Server summary header\n output.log(output.bold(`${server.displayName} (${server.id})`));\n output.log(` Category: ${server.category || '-'}`);\n output.log(` Transport: ${server.transportType || '-'}`);\n output.log(` Author: ${server.author || '-'}`);\n output.log(\n ` Status: ${formatValidationStatus(server.validationStatus)}`\n );\n output.newline();\n\n const tools = server.tools ?? [];\n if (tools.length === 0) {\n output.info('No tools defined for this MCP server.');\n return;\n }\n\n output.log(output.bold(`Tools (${tools.length}):`));\n output.newline();\n\n const rows = tools.map((t) => ({\n 'Tool Name': t.name || '-',\n Description: truncate(t.description || '', 60),\n }));\n\n output.log(\n formatOutput(rows, format, {\n columns: { Description: { maxWidth: 60 } },\n })\n );\n });\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { resolve } from 'node:path';\nimport chalk from 'chalk';\nimport type { Command } from 'commander';\nimport { formatOutput, resolveFormat } from '../../output/format.js';\nimport { output } from '../../output/logger.js';\nimport { getGlobalConfig } from '../../util/config.js';\nimport { RushError } from '../../util/errors.js';\nimport {\n getAdapter,\n getAdapterDescriptions,\n getAvailableAdapters,\n} from './adapters/index.js';\nimport { installAssets, uninstallAssets } from './assets.js';\nimport { runDoctorChecks } from './doctor.js';\nimport { runPreflightChecks } from './preflight.js';\nimport { runVerification, type VerifyResult } from './verify.js';\n\n// ─── Schema & Migration ────────────────────────────────────────\n\nconst CURRENT_SCHEMA_VERSION = 2;\n\ninterface PluginManifestV2 {\n name: string;\n version: string;\n type: string;\n installedAt: string;\n cli_version: string;\n adapter: string;\n}\n\ninterface InstalledPluginsV2 {\n schema_version: number;\n plugins: Record<string, PluginManifestV2>;\n}\n\nconst PLUGINS_DIR = resolve(homedir(), '.rush', 'plugins');\nconst PLUGINS_FILE = resolve(PLUGINS_DIR, 'installed.json');\n\nfunction safeReadJson<T>(filePath: string, fallback: T): T {\n if (!existsSync(filePath)) return fallback;\n try {\n return JSON.parse(readFileSync(filePath, 'utf-8')) as T;\n } catch {\n return fallback;\n }\n}\n\n/**\n * Load installed plugins with optional automatic schema migration.\n * If the stored schema is older and autoMigrate is true, migrate and write back once.\n * Pass autoMigrate=false for read-only callers (e.g. list, status).\n */\nfunction loadInstalledPlugins(autoMigrate = true): InstalledPluginsV2 {\n const raw = safeReadJson<Record<string, unknown>>(PLUGINS_FILE, {\n plugins: {},\n });\n const schemaVersion = (raw.schema_version as number) ?? 0;\n\n if (schemaVersion < CURRENT_SCHEMA_VERSION) {\n const migrated = migrateInstalledPlugins(raw);\n if (autoMigrate) {\n // One-time write-back to avoid repeated migration\n saveInstalledPlugins(migrated);\n }\n return migrated;\n }\n\n return raw as unknown as InstalledPluginsV2;\n}\n\nfunction saveInstalledPlugins(data: InstalledPluginsV2): void {\n if (!existsSync(PLUGINS_DIR)) {\n mkdirSync(PLUGINS_DIR, { recursive: true });\n }\n writeFileSync(PLUGINS_FILE, JSON.stringify(data, null, 2), 'utf-8');\n}\n\n/**\n * Migrate installed.json from any older schema to CURRENT_SCHEMA_VERSION.\n */\nfunction migrateInstalledPlugins(\n data: Record<string, unknown>\n): InstalledPluginsV2 {\n const result: InstalledPluginsV2 = {\n schema_version: CURRENT_SCHEMA_VERSION,\n plugins: {},\n };\n\n const oldPlugins = (data.plugins ?? {}) as Record<\n string,\n Record<string, unknown>\n >;\n\n for (const [name, manifest] of Object.entries(oldPlugins)) {\n result.plugins[name] = {\n name: (manifest.name as string) ?? name,\n version: (manifest.version as string) ?? '0.1.0',\n type: (manifest.type as string) ?? name,\n installedAt: (manifest.installedAt as string) ?? new Date().toISOString(),\n cli_version: (manifest.cli_version as string) ?? 'unknown',\n adapter:\n (manifest.adapter as string) ??\n (manifest.type === 'claude-code'\n ? 'claude-code'\n : ((manifest.type as string) ?? name)),\n };\n }\n\n return result;\n}\n\n// ─── Plugin Assets Source ──────────────────────────────────────\n\n/**\n * Resolve path to bundled plugin assets.\n * At build time, tsup copies rush-plugin assets to dist/plugin-assets/.\n * At dev time, resolve from the monorepo.\n */\nfunction resolvePluginAssetsDir(): string | null {\n const baseDir = import.meta.dirname ?? __dirname;\n\n if (!baseDir) {\n output.dim(\n ' Warning: Could not resolve plugin assets directory (import.meta.dirname and __dirname are both unavailable)'\n );\n return null;\n }\n\n // 1. Try bundled path (dist/plugin-assets/)\n const bundled = resolve(baseDir, 'plugin-assets');\n if (existsSync(bundled)) return bundled;\n\n // 2. Try monorepo path (../../rush-plugin/)\n const monorepo = resolve(baseDir, '..', '..', '..', '..', 'rush-plugin');\n if (existsSync(monorepo)) return monorepo;\n\n return null;\n}\n\n// ─── CLI Version ───────────────────────────────────────────────\n\nfunction getCliVersion(): string {\n try {\n const pkgPath = resolve(\n import.meta.dirname ?? __dirname,\n '..',\n '..',\n 'package.json'\n );\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n return pkg.version ?? '0.2.0';\n } catch {\n return '0.2.0';\n }\n}\n\n// ─── Command Registration ──────────────────────────────────────\n\nexport function registerPluginCommand(program: Command): void {\n const plugin = program.command('plugin').description('Manage IDE plugins');\n\n // ─── plugin list ───────────────────────────────────────────\n\n plugin\n .command('list')\n .alias('ls')\n .description('List available and installed plugins')\n .action(() => {\n const format = resolveFormat(program.opts());\n const installed = loadInstalledPlugins(false);\n const adapters = getAdapterDescriptions();\n\n const plugins = adapters.map((a) => ({\n name: a.name,\n description: a.description,\n version: a.version,\n installed: a.name in installed.plugins,\n installedVersion: installed.plugins[a.name]?.version ?? null,\n }));\n\n if (format === 'json') {\n output.log(JSON.stringify({ plugins }, null, 2));\n return;\n }\n\n output.log(output.bold('Available plugins:'));\n output.newline();\n\n const rows = plugins.map((p) => ({\n Name: p.name,\n Version: p.version,\n Status: p.installed ? 'installed' : 'available',\n Description: p.description,\n }));\n\n output.log(\n formatOutput(rows, format, {\n columns: { Description: { maxWidth: 60 } },\n })\n );\n });\n\n // ─── plugin install ────────────────────────────────────────\n\n plugin\n .command('install')\n .description('Install a plugin')\n .argument('<name>', `Plugin name (${getAvailableAdapters().join(' | ')})`)\n .option('--force', 'Skip preflight checks and overwrite modified assets')\n .option('--strict-preflight', 'Fail on preflight warnings (for CI)')\n .action(\n async (\n name: string,\n options: { force?: boolean; strictPreflight?: boolean }\n ) => {\n const format = resolveFormat(program.opts());\n const adapter = getAdapter(name);\n\n if (!adapter) {\n throw new RushError(\n `Unknown plugin: ${name}. Available: ${getAvailableAdapters().join(', ')}`\n );\n }\n\n const installed = loadInstalledPlugins();\n if (installed.plugins[name]) {\n if (format === 'json') {\n output.log(JSON.stringify({ status: 'already_installed', name }));\n } else {\n output.warn(`Plugin \"${name}\" is already installed.`);\n output.dim('Use `rush-ai plugin update` to update.');\n }\n return;\n }\n\n // Preflight checks\n if (!options.force) {\n const preflightOk = await runPreflightChecks({\n strict: options.strictPreflight ?? false,\n json: format === 'json',\n });\n if (!preflightOk) {\n output.newline();\n output.dim('Use --force to skip preflight checks.');\n process.exit(1);\n }\n }\n\n // Inject MCP config via adapter\n const config = getGlobalConfig();\n const existing = adapter.readConfig();\n const updated = adapter.injectMcpConfig(existing, config.api);\n adapter.writeConfig(updated);\n output.dim(` MCP config injected into ${adapter.configPath()}`);\n\n // Install plugin assets (SKILL.md, commands/, rules/) — only for claude-code\n const cliVersion = getCliVersion();\n if (name === 'claude-code') {\n const assetsDir = resolvePluginAssetsDir();\n if (assetsDir) {\n installAssets({\n pluginName: name,\n sourceDir: assetsDir,\n cliVersion,\n force: options.force,\n });\n output.dim(' Plugin assets installed');\n }\n }\n\n // Save manifest\n installed.plugins[name] = {\n name,\n version: adapter.version,\n type: name,\n installedAt: new Date().toISOString(),\n cli_version: cliVersion,\n adapter: adapter.name,\n };\n saveInstalledPlugins(installed);\n\n // Post-install verification\n if (format !== 'json') {\n output.newline();\n output.info('Post-install verification...');\n const verifyResults = await runVerification({\n mode: 'install',\n pluginName: name,\n adapter,\n });\n printVerifyResults(verifyResults);\n\n const hasFail = verifyResults.some((r) => r.status === 'fail');\n if (hasFail) {\n output.newline();\n output.warn(\n 'Some checks failed. Plugin is installed but may not work correctly.'\n );\n output.dim('Run `rush-ai plugin doctor` for detailed diagnostics.');\n }\n }\n\n if (format === 'json') {\n output.log(\n JSON.stringify({\n status: 'installed',\n name,\n version: adapter.version,\n })\n );\n } else {\n output.newline();\n output.success(`Plugin \"${name}\" installed.`);\n }\n }\n );\n\n // ─── plugin status ─────────────────────────────────────────\n\n plugin\n .command('status')\n .description('Show plugin status')\n .argument('<name>', 'Plugin name')\n .action((name: string) => {\n const format = resolveFormat(program.opts());\n const installed = loadInstalledPlugins(false);\n const manifest = installed.plugins[name];\n\n if (format === 'json') {\n output.log(\n JSON.stringify(\n manifest\n ? { ...manifest, installed: true }\n : { name, installed: false }\n )\n );\n } else if (manifest) {\n output.log(output.bold(name));\n output.log(` Version: ${manifest.version}`);\n output.log(` Type: ${manifest.type}`);\n output.log(` CLI version: ${manifest.cli_version}`);\n output.log(` Adapter: ${manifest.adapter}`);\n output.log(\n ` Installed: ${new Date(manifest.installedAt).toLocaleString()}`\n );\n } else {\n output.warn(`Plugin \"${name}\" is not installed.`);\n }\n });\n\n // ─── plugin update ─────────────────────────────────────────\n\n plugin\n .command('update')\n .description('Update a plugin')\n .argument('<name>', 'Plugin name')\n .option('--force', 'Overwrite modified assets')\n .action(async (name: string, options: { force?: boolean }) => {\n const format = resolveFormat(program.opts());\n const installed = loadInstalledPlugins();\n const manifest = installed.plugins[name];\n\n if (!manifest) {\n throw new RushError(`Plugin \"${name}\" is not installed.`);\n }\n\n const adapter = getAdapter(name);\n if (!adapter) {\n throw new RushError(`Unknown plugin: ${name}`);\n }\n\n // Re-inject MCP config\n const config = getGlobalConfig();\n const existing = adapter.readConfig();\n const updated = adapter.injectMcpConfig(existing, config.api);\n adapter.writeConfig(updated);\n\n // Re-install assets (only for claude-code)\n const cliVersion = getCliVersion();\n if (name === 'claude-code') {\n const assetsDir = resolvePluginAssetsDir();\n if (assetsDir) {\n installAssets({\n pluginName: name,\n sourceDir: assetsDir,\n cliVersion,\n force: options.force,\n });\n }\n }\n\n installed.plugins[name] = {\n ...manifest,\n version: adapter.version,\n installedAt: new Date().toISOString(),\n cli_version: cliVersion,\n adapter: adapter.name,\n };\n saveInstalledPlugins(installed);\n\n if (format === 'json') {\n output.log(\n JSON.stringify({\n status: 'updated',\n name,\n version: adapter.version,\n })\n );\n } else {\n output.success(`Plugin \"${name}\" updated to v${adapter.version}.`);\n }\n });\n\n // ─── plugin uninstall ──────────────────────────────────────\n\n plugin\n .command('uninstall')\n .description('Uninstall a plugin')\n .argument('<name>', 'Plugin name')\n .action((name: string) => {\n const format = resolveFormat(program.opts());\n const installed = loadInstalledPlugins();\n\n if (!installed.plugins[name]) {\n if (format === 'json') {\n output.log(JSON.stringify({ status: 'not_installed', name }));\n } else {\n output.warn(`Plugin \"${name}\" is not installed.`);\n }\n return;\n }\n\n // Remove MCP config via adapter\n const adapter = getAdapter(name);\n if (adapter) {\n const config = adapter.readConfig();\n const cleaned = adapter.removeMcpConfig(config);\n adapter.writeConfig(cleaned);\n }\n\n // Remove plugin assets\n uninstallAssets(name);\n\n delete installed.plugins[name];\n saveInstalledPlugins(installed);\n\n if (format === 'json') {\n output.log(JSON.stringify({ status: 'uninstalled', name }));\n } else {\n output.success(`Plugin \"${name}\" uninstalled.`);\n }\n });\n\n // ─── plugin doctor ─────────────────────────────────────────\n\n plugin\n .command('doctor')\n .description('Diagnose plugin configuration issues')\n .argument('[name]', 'Plugin name (diagnose specific plugin)')\n .action(async (name?: string) => {\n const format = resolveFormat(program.opts());\n const installed = loadInstalledPlugins();\n\n // Determine which plugins to check\n const pluginNames = name\n ? [name]\n : Object.keys(installed.plugins).length > 0\n ? Object.keys(installed.plugins)\n : getAvailableAdapters();\n\n if (format === 'json') {\n // JSON mode: use unified verify for richer output\n const jsonOutput = [];\n for (const pluginName of pluginNames) {\n const adapter = getAdapter(pluginName);\n if (adapter) {\n const results = await runVerification({\n mode: 'doctor',\n pluginName,\n adapter,\n });\n const summary = { pass: 0, warn: 0, fail: 0 };\n for (const r of results) summary[r.status]++;\n jsonOutput.push({\n plugin: pluginName,\n checks: results.map((r) => ({\n name: r.name,\n stage: r.stage,\n status: r.status,\n detail: r.detail,\n ...(r.fix ? { fix: r.fix } : {}),\n })),\n summary,\n });\n }\n }\n output.log(\n JSON.stringify(\n jsonOutput.length === 1 ? jsonOutput[0] : jsonOutput,\n null,\n 2\n )\n );\n return;\n }\n\n // Human-readable mode: use existing doctor checks + verify\n for (const pluginName of pluginNames) {\n const manifest = installed.plugins[pluginName];\n const adapter = getAdapter(pluginName);\n\n output.log(output.bold(`Plugin Doctor — ${pluginName}`));\n output.newline();\n\n // Run legacy doctor checks for backwards compatibility\n const checks = await runDoctorChecks({\n pluginName,\n manifest: manifest ?? null,\n pluginInfo: adapter\n ? {\n description: adapter.description,\n types: [adapter.name],\n version: adapter.version,\n }\n : null,\n });\n\n let pass = 0;\n let warn = 0;\n let fail = 0;\n\n for (const check of checks) {\n const icon =\n check.status === 'pass'\n ? chalk.green('[PASS]')\n : check.status === 'warn'\n ? chalk.yellow('[WARN]')\n : chalk.red('[FAIL]');\n output.log(` ${icon} ${check.label}: ${check.detail}`);\n if (check.fix) {\n output.dim(` Fix: ${check.fix}`);\n }\n if (check.status === 'pass') pass++;\n else if (check.status === 'warn') warn++;\n else fail++;\n }\n\n output.newline();\n const parts: string[] = [];\n if (pass > 0) parts.push(`${pass} passed`);\n if (warn > 0) parts.push(`${warn} warning${warn > 1 ? 's' : ''}`);\n if (fail > 0) parts.push(`${fail} failed`);\n output.log(parts.join(', '));\n output.newline();\n }\n });\n}\n\n// ─── Helpers ───────────────────────────────────────────────────\n\nfunction printVerifyResults(results: VerifyResult[]): void {\n for (const r of results) {\n const icon =\n r.status === 'pass'\n ? chalk.green('[PASS]')\n : r.status === 'warn'\n ? chalk.yellow('[WARN]')\n : chalk.red('[FAIL]');\n output.log(` ${icon} ${r.label}: ${r.detail}`);\n if (r.fix) {\n output.dim(` Fix: ${r.fix}`);\n }\n }\n}\n","import { existsSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { resolve } from 'node:path';\nimport { BaseJsonAdapter } from './base.js';\n\nexport class ClaudeCodeAdapter extends BaseJsonAdapter {\n readonly name = 'claude-code';\n readonly description =\n 'Claude Code integration (MCP config + SKILL.md + commands)';\n readonly version = '0.2.0';\n\n protected readonly configDir = resolve(homedir(), '.claude');\n protected readonly configFile = 'settings.json';\n\n detect(): boolean {\n return existsSync(this.configDir);\n }\n}\n","import {\n copyFileSync,\n existsSync,\n mkdirSync,\n readFileSync,\n writeFileSync,\n} from 'node:fs';\nimport { resolve } from 'node:path';\nimport type { IdeAdapter } from './types.js';\n\n/**\n * Abstract base class for JSON-file-based IDE adapters.\n * Subclasses must provide configDir and configFile; all\n * shared read/validate/inject/remove/write/configPath logic lives here.\n */\nexport abstract class BaseJsonAdapter implements IdeAdapter {\n abstract readonly name: string;\n abstract readonly description: string;\n abstract readonly version: string;\n\n /** Absolute path to the IDE's config directory (e.g. ~/.claude) */\n protected abstract readonly configDir: string;\n\n /** Config file name relative to configDir (e.g. settings.json) */\n protected abstract readonly configFile: string;\n\n detect(): boolean {\n return existsSync(this.configDir);\n }\n\n readConfig(): Record<string, unknown> {\n const file = this.configPath();\n if (!existsSync(file)) return {};\n try {\n return JSON.parse(readFileSync(file, 'utf-8'));\n } catch (err) {\n throw new Error(\n `Failed to parse ${file}: ${err instanceof Error ? err.message : 'invalid JSON'}`\n );\n }\n }\n\n validateConfig(config: Record<string, unknown>): boolean {\n return (\n config !== null && typeof config === 'object' && !Array.isArray(config)\n );\n }\n\n injectMcpConfig(\n config: Record<string, unknown>,\n apiUrl: string\n ): Record<string, unknown> {\n const mcpServers = (config.mcpServers ?? {}) as Record<string, unknown>;\n mcpServers.rush = {\n command: 'rush-ai',\n args: ['mcp', 'serve'],\n env: {\n RUSH_API_URL: apiUrl,\n },\n };\n return { ...config, mcpServers };\n }\n\n removeMcpConfig(config: Record<string, unknown>): Record<string, unknown> {\n const mcpServers = config.mcpServers as Record<string, unknown> | undefined;\n if (mcpServers && 'rush' in mcpServers) {\n delete mcpServers.rush;\n }\n return config;\n }\n\n writeConfig(config: Record<string, unknown>): void {\n const file = this.configPath();\n if (!existsSync(this.configDir)) {\n mkdirSync(this.configDir, { recursive: true });\n }\n if (existsSync(file)) {\n copyFileSync(file, `${file}.bak`);\n }\n writeFileSync(file, JSON.stringify(config, null, 2), 'utf-8');\n }\n\n configPath(): string {\n return resolve(this.configDir, this.configFile);\n }\n}\n","import { existsSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { resolve } from 'node:path';\nimport { BaseJsonAdapter } from './base.js';\n\nexport class CursorAdapter extends BaseJsonAdapter {\n readonly name = 'cursor';\n readonly description = 'Cursor integration (MCP config)';\n readonly version = '0.2.0';\n\n protected readonly configDir = resolve(homedir(), '.cursor');\n protected readonly configFile = 'mcp.json';\n\n detect(): boolean {\n return existsSync(this.configDir);\n }\n}\n","import { ClaudeCodeAdapter } from './claude-code.js';\nimport { CursorAdapter } from './cursor.js';\nimport type { IdeAdapter } from './types.js';\n\nexport { BaseJsonAdapter } from './base.js';\nexport { ClaudeCodeAdapter } from './claude-code.js';\nexport { CursorAdapter } from './cursor.js';\nexport type { IdeAdapter } from './types.js';\n\n/** Registry of all supported IDE adapters */\nconst ADAPTER_REGISTRY: Record<string, () => IdeAdapter> = {\n 'claude-code': () => new ClaudeCodeAdapter(),\n cursor: () => new CursorAdapter(),\n};\n\n/** Get an adapter instance by plugin name */\nexport function getAdapter(name: string): IdeAdapter | null {\n const factory = ADAPTER_REGISTRY[name];\n return factory ? factory() : null;\n}\n\n/** Get all available adapter names */\nexport function getAvailableAdapters(): string[] {\n return Object.keys(ADAPTER_REGISTRY);\n}\n\n/** Get adapter descriptions for `plugin list` */\nexport function getAdapterDescriptions(): Array<{\n name: string;\n description: string;\n version: string;\n}> {\n return Object.entries(ADAPTER_REGISTRY).map(([name, factory]) => {\n const adapter = factory();\n return {\n name,\n description: adapter.description,\n version: adapter.version,\n };\n });\n}\n","import { createHash } from 'node:crypto';\nimport {\n copyFileSync,\n existsSync,\n lstatSync,\n mkdirSync,\n readdirSync,\n readFileSync,\n readlinkSync,\n rmSync,\n symlinkSync,\n unlinkSync,\n writeFileSync,\n} from 'node:fs';\nimport { homedir } from 'node:os';\nimport { dirname, join, relative, resolve } from 'node:path';\nimport { output } from '../../output/logger.js';\n\n/** Current schema version for asset manifests */\nconst ASSET_SCHEMA_VERSION = 1;\n\nexport interface AssetFileEntry {\n /** Relative path within the plugin assets */\n path: string;\n /** SHA256 checksum of the file content */\n checksum: string;\n /** Absolute path where the file is installed */\n target: string;\n /** Type of installation: file copy or symlink */\n type: 'file' | 'symlink';\n}\n\nexport interface PluginAssetManifest {\n schema_version: number;\n version: string;\n cli_version: string;\n owner: 'rush-ai';\n files: AssetFileEntry[];\n installedAt: string;\n}\n\nconst PLUGINS_BASE = resolve(homedir(), '.rush', 'plugins');\n\nfunction getAssetManifestPath(pluginName: string): string {\n return resolve(PLUGINS_BASE, pluginName, 'asset-manifest.json');\n}\n\nfunction getAssetStorePath(pluginName: string): string {\n return resolve(PLUGINS_BASE, pluginName, 'assets');\n}\n\nfunction computeChecksum(filePath: string): string {\n const content = readFileSync(filePath);\n return createHash('sha256').update(content).digest('hex');\n}\n\n/**\n * Load an existing asset manifest, or null if not found.\n */\nexport function loadAssetManifest(\n pluginName: string\n): PluginAssetManifest | null {\n const manifestPath = getAssetManifestPath(pluginName);\n if (!existsSync(manifestPath)) return null;\n try {\n return JSON.parse(readFileSync(manifestPath, 'utf-8'));\n } catch {\n return null;\n }\n}\n\n/**\n * Install plugin assets from a source directory to the target locations.\n *\n * - Copies files to ~/.rush/plugins/<name>/assets/\n * - Creates symlinks to ~/.claude/skills/<skill-name>/\n * - Writes asset-manifest.json\n */\nexport function installAssets(options: {\n pluginName: string;\n sourceDir: string;\n cliVersion: string;\n force?: boolean;\n}): PluginAssetManifest {\n const { pluginName, sourceDir, cliVersion, force = false } = options;\n const storePath = getAssetStorePath(pluginName);\n const manifestPath = getAssetManifestPath(pluginName);\n\n // Ensure directories\n mkdirSync(storePath, { recursive: true });\n\n const files: AssetFileEntry[] = [];\n const existing = loadAssetManifest(pluginName);\n\n // Collect all files from source directory\n const sourceFiles = collectFiles(sourceDir);\n\n for (const relPath of sourceFiles) {\n const srcFile = resolve(sourceDir, relPath);\n const destFile = resolve(storePath, relPath);\n const newChecksum = computeChecksum(srcFile);\n\n // Check if target already exists and was modified by user\n if (existsSync(destFile) && !force && existing) {\n const existingEntry = existing.files.find((f) => f.path === relPath);\n if (existingEntry) {\n const currentChecksum = computeChecksum(destFile);\n if (\n currentChecksum !== existingEntry.checksum &&\n currentChecksum !== newChecksum\n ) {\n output.warn(\n ` Skipping ${relPath}: modified by user (use --force to overwrite)`\n );\n // Keep existing entry\n files.push({\n ...existingEntry,\n checksum: currentChecksum,\n });\n continue;\n }\n }\n }\n\n // Copy file\n mkdirSync(dirname(destFile), { recursive: true });\n copyFileSync(srcFile, destFile);\n\n files.push({\n path: relPath,\n checksum: newChecksum,\n target: destFile,\n type: 'file',\n });\n }\n\n // Create symlink for SKILL.md → ~/.claude/skills/rush-task/\n const skillTarget = resolve(homedir(), '.claude', 'skills', 'rush-task');\n if (!existsSync(skillTarget)) {\n mkdirSync(dirname(skillTarget), { recursive: true });\n try {\n symlinkSync(storePath, skillTarget, 'dir');\n files.push({\n path: '_symlink_skill',\n checksum: '',\n target: skillTarget,\n type: 'symlink',\n });\n } catch {\n // Symlink might fail on some systems; fall back to info message\n output.dim(\n ` Note: Could not create symlink at ${skillTarget}. You may need to manually link the skill.`\n );\n }\n } else {\n // Check if it's already our symlink (target must point to our store)\n try {\n const stat = lstatSync(skillTarget);\n if (stat.isSymbolicLink()) {\n const linkTarget = readlinkSync(skillTarget);\n if (linkTarget === storePath || resolve(linkTarget) === storePath) {\n files.push({\n path: '_symlink_skill',\n checksum: '',\n target: skillTarget,\n type: 'symlink',\n });\n } else {\n // Symlink exists but points to a different location — conflict\n output.warn(\n ` Skipping symlink at ${skillTarget}: already points to a different location (${linkTarget})`\n );\n }\n } else {\n // Path exists but is not a symlink — conflict\n output.warn(\n ` Skipping symlink at ${skillTarget}: path already exists and is not a symlink`\n );\n }\n } catch {\n // ignore\n }\n }\n\n // Write manifest\n const manifest: PluginAssetManifest = {\n schema_version: ASSET_SCHEMA_VERSION,\n version: options.cliVersion,\n cli_version: cliVersion,\n owner: 'rush-ai',\n files,\n installedAt: new Date().toISOString(),\n };\n\n writeFileSync(manifestPath, JSON.stringify(manifest, null, 2), 'utf-8');\n\n return manifest;\n}\n\n/**\n * Allowed path prefixes for asset deletion.\n * Prevents a tampered manifest from causing out-of-bounds file removal.\n */\nconst ALLOWED_DELETE_PREFIXES = [\n resolve(homedir(), '.rush', 'plugins'),\n resolve(homedir(), '.claude', 'skills'),\n];\n\nfunction isPathAllowed(targetPath: string): boolean {\n const resolved = resolve(targetPath);\n return ALLOWED_DELETE_PREFIXES.some((prefix) =>\n resolved.startsWith(`${prefix}/`)\n );\n}\n\n/**\n * Uninstall plugin assets safely.\n *\n * - Only removes files tracked in the asset manifest\n * - Path whitelist: only allows deletion under ~/.rush/plugins/ and ~/.claude/skills/\n * - For files: verifies checksum before deletion (skip if modified)\n * - For symlinks: only unlinks, doesn't delete target\n */\nexport function uninstallAssets(pluginName: string): void {\n const manifest = loadAssetManifest(pluginName);\n if (!manifest) return;\n\n // Validate manifest owner\n if (manifest.owner !== 'rush-ai') {\n output.warn(\n ` Skipping asset removal: manifest owner \"${manifest.owner}\" is not \"rush-ai\"`\n );\n return;\n }\n\n for (const entry of manifest.files) {\n if (!existsSync(entry.target)) continue;\n\n // Path whitelist check — refuse to delete outside allowed directories\n if (!isPathAllowed(entry.target)) {\n output.warn(\n ` Refusing to delete ${entry.target}: outside allowed directories`\n );\n continue;\n }\n\n if (entry.type === 'symlink') {\n try {\n const stat = lstatSync(entry.target);\n if (stat.isSymbolicLink()) {\n unlinkSync(entry.target);\n }\n } catch {\n // ignore\n }\n } else if (entry.type === 'file') {\n // Only delete if checksum matches (owner check)\n try {\n const currentChecksum = computeChecksum(entry.target);\n if (currentChecksum === entry.checksum) {\n rmSync(entry.target);\n } else {\n output.warn(\n ` Skipping ${entry.path}: file was modified after installation`\n );\n }\n } catch {\n // ignore\n }\n }\n }\n\n // Remove manifest and assets directory if empty\n const manifestPath = getAssetManifestPath(pluginName);\n if (existsSync(manifestPath)) {\n rmSync(manifestPath);\n }\n\n const storePath = getAssetStorePath(pluginName);\n try {\n const remaining = readdirSync(storePath);\n if (remaining.length === 0) {\n rmSync(storePath, { recursive: true });\n }\n } catch {\n // ignore\n }\n}\n\n/**\n * Recursively collect all file paths relative to a directory.\n */\nfunction collectFiles(dir: string, base?: string): string[] {\n const files: string[] = [];\n const baseDir = base ?? dir;\n\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n files.push(...collectFiles(fullPath, baseDir));\n } else if (entry.isFile()) {\n files.push(relative(baseDir, fullPath));\n }\n }\n\n return files;\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport path from 'node:path';\nimport { getAuthToken } from '../../util/auth.js';\nimport { createClient } from '../../util/client.js';\n\nexport interface DoctorCheckResult {\n name: string;\n label: string;\n status: 'pass' | 'warn' | 'fail';\n detail: string;\n fix?: string;\n}\n\ninterface DoctorContext {\n pluginName: string;\n manifest: {\n name: string;\n version: string;\n type: string;\n installedAt: string;\n } | null;\n pluginInfo: { description: string; types: string[]; version: string } | null;\n}\n\nfunction findCliInPath(): string | null {\n const pathDirs = (process.env.PATH || '').split(path.delimiter);\n for (const dir of pathDirs) {\n const candidate = path.join(dir, 'rush-ai');\n if (existsSync(candidate)) return candidate;\n }\n return null;\n}\n\nfunction checkCliInPath(): DoctorCheckResult {\n const found = findCliInPath();\n if (found) {\n return {\n name: 'cli_in_path',\n label: 'CLI in PATH',\n status: 'pass',\n detail: `rush-ai found at ${found}`,\n };\n }\n return {\n name: 'cli_in_path',\n label: 'CLI in PATH',\n status: 'warn',\n detail: 'rush-ai not found in PATH',\n fix: 'Ensure rush-ai is installed globally or add its directory to PATH',\n };\n}\n\nfunction checkAuth(): DoctorCheckResult {\n try {\n const token = getAuthToken();\n if (token) {\n return {\n name: 'auth_status',\n label: 'Authentication',\n status: 'pass',\n detail: 'Authenticated',\n };\n }\n } catch {\n // fall through\n }\n return {\n name: 'auth_status',\n label: 'Authentication',\n status: 'warn',\n detail: 'Not authenticated',\n fix: 'Run `rush-ai auth login` to authenticate',\n };\n}\n\nasync function checkApiConnectivity(): Promise<DoctorCheckResult> {\n try {\n const client = createClient();\n await client.get('/api/agents?limit=1');\n return {\n name: 'api_connectivity',\n label: 'API connectivity',\n status: 'pass',\n detail: 'API is reachable',\n };\n } catch {\n return {\n name: 'api_connectivity',\n label: 'API connectivity',\n status: 'warn',\n detail: 'API is unreachable',\n fix: 'Check your network connection and API URL in ~/.rush/config.json',\n };\n }\n}\n\nfunction checkPluginInstalled(ctx: DoctorContext): DoctorCheckResult {\n if (ctx.manifest) {\n return {\n name: 'plugin_installed',\n label: 'Plugin installed',\n status: 'pass',\n detail: `v${ctx.manifest.version} (installed ${new Date(ctx.manifest.installedAt).toLocaleDateString()})`,\n };\n }\n return {\n name: 'plugin_installed',\n label: 'Plugin installed',\n status: 'fail',\n detail: 'Not installed',\n fix: `Run \\`rush-ai plugin install ${ctx.pluginName}\\``,\n };\n}\n\nfunction checkMcpConfig(ctx: DoctorContext): DoctorCheckResult {\n const type = ctx.manifest?.type ?? ctx.pluginInfo?.types?.[0];\n\n let configPath: string;\n if (type === 'claude-code') {\n configPath = path.resolve(homedir(), '.claude', 'settings.json');\n } else if (type === 'cursor') {\n configPath = path.resolve(homedir(), '.cursor', 'mcp.json');\n } else {\n return {\n name: 'mcp_config',\n label: 'MCP config',\n status: 'warn',\n detail: `Unknown plugin type: ${type}`,\n };\n }\n\n if (!existsSync(configPath)) {\n return {\n name: 'mcp_config',\n label: 'MCP config',\n status: 'fail',\n detail: `Config file not found: ${configPath}`,\n fix: `Run \\`rush-ai plugin install ${ctx.pluginName}\\``,\n };\n }\n\n try {\n const config = JSON.parse(readFileSync(configPath, 'utf-8'));\n const servers = config.mcpServers as Record<string, unknown> | undefined;\n if (servers && 'rush' in servers) {\n const rushServer = servers.rush as Record<string, unknown>;\n const command = rushServer?.command as string | undefined;\n if (command === 'rush-ai') {\n return {\n name: 'mcp_config',\n label: 'MCP config',\n status: 'pass',\n detail: 'rush MCP server configured correctly',\n };\n }\n return {\n name: 'mcp_config',\n label: 'MCP config',\n status: 'warn',\n detail: `rush server configured, but command is \"${command}\" (expected \"rush-ai\")`,\n fix: `Run \\`rush-ai plugin update ${ctx.pluginName}\\``,\n };\n }\n return {\n name: 'mcp_config',\n label: 'MCP config',\n status: 'fail',\n detail: 'rush MCP server not found in config',\n fix: `Run \\`rush-ai plugin install ${ctx.pluginName}\\``,\n };\n } catch {\n return {\n name: 'mcp_config',\n label: 'MCP config',\n status: 'fail',\n detail: `Failed to parse config: ${configPath}`,\n fix: 'Check file for JSON syntax errors',\n };\n }\n}\n\nfunction checkVersionMatch(ctx: DoctorContext): DoctorCheckResult {\n if (!ctx.manifest || !ctx.pluginInfo) {\n return {\n name: 'version_match',\n label: 'Version',\n status: 'warn',\n detail: 'Cannot check version (plugin not installed or unknown)',\n };\n }\n\n if (ctx.manifest.version === ctx.pluginInfo.version) {\n return {\n name: 'version_match',\n label: 'Version',\n status: 'pass',\n detail: `Up to date (v${ctx.manifest.version})`,\n };\n }\n\n return {\n name: 'version_match',\n label: 'Version',\n status: 'warn',\n detail: `Installed v${ctx.manifest.version}, latest v${ctx.pluginInfo.version}`,\n fix: `Run \\`rush-ai plugin update ${ctx.pluginName}\\``,\n };\n}\n\nexport async function runDoctorChecks(\n ctx: DoctorContext\n): Promise<DoctorCheckResult[]> {\n const results: DoctorCheckResult[] = [];\n\n results.push(checkCliInPath());\n results.push(checkAuth());\n results.push(await checkApiConnectivity());\n results.push(checkPluginInstalled(ctx));\n results.push(checkMcpConfig(ctx));\n results.push(checkVersionMatch(ctx));\n\n return results;\n}\n","import { accessSync, constants, existsSync, mkdirSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport path from 'node:path';\nimport chalk from 'chalk';\nimport { output } from '../../output/logger.js';\nimport { getAuthToken } from '../../util/auth.js';\nimport { createClient } from '../../util/client.js';\n\ninterface PreflightOptions {\n strict: boolean;\n json: boolean;\n}\n\ninterface PreflightResult {\n name: string;\n status: 'pass' | 'warn' | 'fail';\n detail: string;\n}\n\nexport async function runPreflightChecks(\n options: PreflightOptions\n): Promise<boolean> {\n const results: PreflightResult[] = [];\n\n // 1. Auth check\n try {\n const token = getAuthToken();\n if (token) {\n results.push({\n name: 'Authentication',\n status: 'pass',\n detail: 'Authenticated',\n });\n } else {\n results.push({\n name: 'Authentication',\n status: options.strict ? 'fail' : 'warn',\n detail: 'Not authenticated. MCP server may not work until you login.',\n });\n }\n } catch {\n results.push({\n name: 'Authentication',\n status: options.strict ? 'fail' : 'warn',\n detail: 'Not authenticated. MCP server may not work until you login.',\n });\n }\n\n // 2. API connectivity\n try {\n const client = createClient();\n await client.get('/api/agents?limit=1');\n results.push({\n name: 'API connectivity',\n status: 'pass',\n detail: 'API is reachable',\n });\n } catch {\n results.push({\n name: 'API connectivity',\n status: options.strict ? 'fail' : 'warn',\n detail:\n 'API is unreachable. MCP server may not work until API is reachable.',\n });\n }\n\n // 3. Config dir writable (always fatal if fails)\n const rushDir = path.resolve(homedir(), '.rush');\n try {\n // Ensure directory exists\n if (!existsSync(rushDir)) {\n mkdirSync(rushDir, { recursive: true });\n }\n // Check write permission\n accessSync(rushDir, constants.W_OK);\n results.push({\n name: 'Config directory',\n status: 'pass',\n detail: `Config directory is writable: ${rushDir}`,\n });\n } catch {\n results.push({\n name: 'Config directory',\n status: 'fail',\n detail: `Config directory is not writable: ${rushDir}`,\n });\n }\n\n // Output results\n if (options.json) {\n output.log(JSON.stringify({ preflight: results }, null, 2));\n } else {\n output.info('Preflight checks...');\n for (const r of results) {\n const icon =\n r.status === 'pass'\n ? chalk.green('[PASS]')\n : r.status === 'warn'\n ? chalk.yellow('[WARN]')\n : chalk.red('[FAIL]');\n output.log(` ${icon} ${r.name}: ${r.detail}`);\n }\n }\n\n // Return false only if there are failures\n return !results.some((r) => r.status === 'fail');\n}\n","import { execFileSync } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { getAuthToken } from '../../util/auth.js';\nimport type { IdeAdapter } from './adapters/types.js';\n\nexport interface VerifyResult {\n name: string;\n label: string;\n stage: 'cli' | 'config' | 'mcp-tools' | 'api' | 'auth';\n status: 'pass' | 'warn' | 'fail';\n detail: string;\n fix?: string;\n}\n\n/**\n * Unified verification logic shared by `plugin install` and `plugin doctor`.\n *\n * - install mode: Phase 1 (local) must pass; Phase 2 (API) failures are warnings.\n * - doctor mode: All phases run with full severity.\n */\nexport async function runVerification(options: {\n mode: 'install' | 'doctor';\n pluginName: string;\n adapter: IdeAdapter;\n}): Promise<VerifyResult[]> {\n const results: VerifyResult[] = [];\n\n // 1. Config file check (via adapter)\n results.push(checkConfigFile(options.adapter));\n\n // 2. MCP connectivity check (two-phase)\n const mcpResults = await verifyMcpConnectivity(options.mode);\n results.push(...mcpResults);\n\n // 3. Auth status check\n results.push(checkAuthStatus());\n\n return results;\n}\n\nfunction checkConfigFile(adapter: IdeAdapter): VerifyResult {\n const configFile = adapter.configPath();\n\n if (!existsSync(configFile)) {\n return {\n name: 'config_file',\n label: 'IDE config',\n stage: 'config',\n status: 'warn',\n detail: `Config file not found: ${configFile}`,\n fix: `Run \\`rush-ai plugin install ${adapter.name}\\``,\n };\n }\n\n try {\n const config = adapter.readConfig();\n if (!adapter.validateConfig(config)) {\n return {\n name: 'config_file',\n label: 'IDE config',\n stage: 'config',\n status: 'fail',\n detail: `Invalid config format: ${configFile}`,\n fix: 'Check file for JSON syntax errors',\n };\n }\n\n // Check if rush MCP server is configured\n const mcpServers = config.mcpServers as Record<string, unknown> | undefined;\n if (mcpServers && 'rush' in mcpServers) {\n return {\n name: 'config_file',\n label: 'IDE config',\n stage: 'config',\n status: 'pass',\n detail: 'Rush MCP server configured',\n };\n }\n\n return {\n name: 'config_file',\n label: 'IDE config',\n stage: 'config',\n status: 'fail',\n detail: 'Rush MCP server not found in config',\n fix: `Run \\`rush-ai plugin install ${adapter.name}\\``,\n };\n } catch {\n return {\n name: 'config_file',\n label: 'IDE config',\n stage: 'config',\n status: 'fail',\n detail: `Failed to read config: ${configFile}`,\n fix: 'Check file for JSON syntax errors',\n };\n }\n}\n\n/**\n * Two-phase MCP connectivity verification:\n *\n * Phase 1 (local): Check that rush-ai can start and expose MCP tools.\n * - install mode: fail → install fails\n * - doctor mode: fail → fail\n *\n * Phase 2 (API): Check that the MCP server can reach the Rush API.\n * - install mode: fail → warn only\n * - doctor mode: fail → fail\n */\nasync function verifyMcpConnectivity(\n mode: 'install' | 'doctor'\n): Promise<VerifyResult[]> {\n const results: VerifyResult[] = [];\n\n // Phase 1: Local MCP handshake\n try {\n // Try to run rush-ai with a quick check (version)\n execFileSync('rush-ai', ['--version'], {\n timeout: 5000,\n stdio: 'pipe',\n });\n\n results.push({\n name: 'mcp_cli_exec',\n label: 'CLI executable',\n stage: 'cli',\n status: 'pass',\n detail: 'rush-ai executable responds',\n });\n } catch (err) {\n results.push({\n name: 'mcp_cli_exec',\n label: 'CLI executable',\n stage: 'cli',\n status: 'fail',\n detail: `rush-ai failed to execute: ${err instanceof Error ? err.message : 'unknown error'}`,\n fix: 'Ensure rush-ai is installed and accessible in PATH',\n });\n // Phase 1 failed — skip Phase 2\n return results;\n }\n\n // Phase 2: API connectivity (via direct HTTP check)\n try {\n const { createClient } = await import('../../util/client.js');\n const client = createClient();\n await client.get('/api/agents?limit=1');\n\n results.push({\n name: 'mcp_api',\n label: 'API connectivity',\n stage: 'api',\n status: 'pass',\n detail: 'Rush API is reachable',\n });\n } catch {\n results.push({\n name: 'mcp_api',\n label: 'API connectivity',\n stage: 'api',\n status: mode === 'install' ? 'warn' : 'fail',\n detail:\n mode === 'install'\n ? 'API unreachable (install will continue, but MCP tools may not work until resolved)'\n : 'API unreachable',\n fix: 'Check network connection or run `rush-ai auth login`',\n });\n }\n\n return results;\n}\n\nfunction checkAuthStatus(): VerifyResult {\n try {\n const token = getAuthToken();\n if (token) {\n return {\n name: 'auth_status',\n label: 'Authentication',\n stage: 'auth',\n status: 'pass',\n detail: 'Authenticated',\n };\n }\n } catch {\n // fall through\n }\n return {\n name: 'auth_status',\n label: 'Authentication',\n stage: 'auth',\n status: 'warn',\n detail: 'Not authenticated',\n fix: 'Run `rush-ai auth login` to authenticate',\n };\n}\n","import { createWriteStream } from 'node:fs';\nimport { mkdir } from 'node:fs/promises';\nimport path from 'node:path';\nimport { Readable } from 'node:stream';\nimport { pipeline } from 'node:stream/promises';\nimport type { Command } from 'commander';\nimport { colorizeDiff, containsDiff } from '../../output/diff.js';\nimport { formatOutput, resolveFormat } from '../../output/format.js';\nimport { output } from '../../output/logger.js';\nimport { isCIMode } from '../../util/ci.js';\nimport { createClient } from '../../util/client.js';\nimport { RushError, TaskFailedError } from '../../util/errors.js';\nimport { requireAuth } from '../../util/require-auth.js';\nimport { consumeSSEStreamWithReconnect } from '../../util/sse.js';\nimport { readStdinIfPiped } from '../../util/stdin.js';\n\ninterface TaskCreateResponse {\n id: string;\n status: string;\n}\n\ninterface TaskResult {\n id: string;\n name?: string;\n status: 'pending' | 'running' | 'completed' | 'failed' | 'cancelled';\n agent: string;\n prompt: string;\n result?: unknown;\n error?: string;\n createdAt: string;\n updatedAt: string;\n}\n\ninterface TaskListResponse {\n tasks: TaskResult[];\n total: number;\n}\n\ninterface TaskFile {\n id: string;\n filePath: string;\n fileName: string;\n ossPath?: string;\n ossUrl?: string;\n category: string;\n source: string;\n timestamp?: number;\n url?: string;\n conversationId?: string;\n}\n\ninterface TaskFilesResponse {\n files: TaskFile[];\n totalCount: number;\n}\n\nconst VALID_CATEGORIES = ['code', 'image', 'document', 'other'];\n\n/**\n * Sanitize a file path to prevent path traversal attacks.\n * Returns null if the path is unsafe.\n */\nfunction sanitizeFilePath(filePath: string, outputDir: string): string | null {\n // Strip leading slashes and drive letters\n let stripped = filePath.replace(/^[/\\\\]+/, '').replace(/^[a-zA-Z]:/, '');\n // Remove any .. components\n stripped = stripped\n .split('/')\n .filter((seg) => seg !== '..' && seg !== '.')\n .join('/');\n\n if (!stripped) return null;\n\n const resolvedOutput = path.resolve(outputDir);\n const target = path.resolve(resolvedOutput, stripped);\n const rel = path.relative(resolvedOutput, target);\n\n // Reject if relative path escapes the output directory\n if (rel.startsWith('..') || path.isAbsolute(rel)) {\n return null;\n }\n\n return target;\n}\n\n/**\n * Download a file from a URL to a local path using streaming.\n */\nasync function downloadFile(url: string, destPath: string): Promise<void> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(\n `Download failed: ${response.status} ${response.statusText}`\n );\n }\n if (!response.body) {\n throw new Error('No response body');\n }\n\n await mkdir(path.dirname(destPath), { recursive: true });\n\n const nodeStream = Readable.fromWeb(\n response.body as import('node:stream/web').ReadableStream\n );\n const fileStream = createWriteStream(destPath);\n await pipeline(nodeStream, fileStream);\n}\n\n/**\n * Build a file category summary string, e.g. \"8 code, 2 image, 2 document\"\n */\nfunction buildCategorySummary(files: TaskFile[]): string {\n const counts: Record<string, number> = {};\n for (const f of files) {\n counts[f.category] = (counts[f.category] || 0) + 1;\n }\n return Object.entries(counts)\n .map(([cat, count]) => `${count} ${cat}`)\n .join(', ');\n}\n\nimport { registerDeploySubcommand } from './deploy.js';\n\nexport function registerTaskCommand(program: Command): void {\n const task = program.command('task').description('Create and manage tasks');\n\n registerDeploySubcommand(task, program);\n\n task\n .command('create')\n .description('Create a task asynchronously')\n .requiredOption('-a, --agent <name>', 'Agent name to execute the task')\n .option('-p, --prompt <text>', 'Task prompt')\n .option('--skills <skills>', 'Comma-separated skills to add', commaSplit)\n .option('--mcp <servers>', 'Comma-separated MCP servers to add', commaSplit)\n .action(\n async (options: {\n agent: string;\n prompt?: string;\n skills?: string[];\n mcp?: string[];\n }) => {\n requireAuth();\n const format = resolveFormat(program.opts());\n const client = createClient();\n\n const prompt = options.prompt ?? (await readStdinIfPiped());\n if (!prompt) {\n throw new RushError(\n 'No prompt provided. Use --prompt or pipe via stdin.'\n );\n }\n\n const { data } = await client.post<TaskCreateResponse>('/api/tasks', {\n agent: options.agent,\n prompt,\n skills: options.skills,\n mcpServers: options.mcp,\n });\n\n if (format === 'json') {\n output.log(JSON.stringify(data, null, 2));\n } else {\n output.success(`Task created: ${data.id}`);\n output.dim(`Status: ${data.status}`);\n output.dim(\n `Run \\`rush-ai task status ${data.id}\\` to check progress.`\n );\n }\n }\n );\n\n task\n .command('send')\n .description('Send a message to an existing task')\n .argument('<id>', 'Task ID (project ID)')\n .option('-p, --prompt <text>', 'Message to send')\n .option('--skills <skills>', 'Comma-separated skills to add', commaSplit)\n .option('--mcp <servers>', 'Comma-separated MCP servers to add', commaSplit)\n .action(\n async (\n id: string,\n options: {\n prompt?: string;\n skills?: string[];\n mcp?: string[];\n }\n ) => {\n requireAuth();\n const format = resolveFormat(program.opts());\n const client = createClient();\n\n const prompt = options.prompt ?? (await readStdinIfPiped());\n if (!prompt) {\n throw new RushError(\n 'No prompt provided. Use --prompt or pipe via stdin.'\n );\n }\n\n const { data } = await client.post<TaskCreateResponse>(\n `/api/tasks/${encodeURIComponent(id)}/send`,\n {\n prompt,\n skills: options.skills,\n mcpServers: options.mcp,\n }\n );\n\n if (format === 'json') {\n output.log(JSON.stringify(data, null, 2));\n } else {\n output.success(`Message sent to task: ${data.id}`);\n output.dim(`Status: ${data.status}`);\n output.dim(\n `Run \\`rush-ai task watch ${data.id}\\` to follow progress.`\n );\n }\n }\n );\n\n task\n .command('status')\n .description('Check task status')\n .argument('<id>', 'Task ID')\n .action(async (id: string) => {\n requireAuth();\n const format = resolveFormat(program.opts());\n const client = createClient();\n const { data } = await client.get<TaskResult>(\n `/api/tasks/${encodeURIComponent(id)}`\n );\n\n if (format === 'json') {\n output.log(JSON.stringify(data, null, 2));\n } else {\n output.log(output.bold(`Task ${data.id}`));\n output.log(` Agent: ${data.agent}`);\n output.log(` Status: ${data.status}`);\n output.log(` Created: ${new Date(data.createdAt).toLocaleString()}`);\n output.log(` Updated: ${new Date(data.updatedAt).toLocaleString()}`);\n if (data.error) {\n output.error(` Error: ${data.error}`);\n }\n }\n\n // In CI mode, a failed task should produce a non-zero exit code\n if (isCIMode(program.opts()) && data.status === 'failed') {\n throw new TaskFailedError(\n `Task ${id} failed: ${data.error ?? 'unknown error'}`,\n { taskId: id, status: data.status }\n );\n }\n });\n\n task\n .command('result')\n .description('Get task result')\n .argument('<id>', 'Task ID')\n .action(async (id: string) => {\n requireAuth();\n const format = resolveFormat(program.opts());\n const client = createClient();\n const { data } = await client.get<{ result: unknown }>(\n `/api/tasks/${encodeURIComponent(id)}/result`\n );\n\n // Try to fetch file summary (non-blocking)\n let filesSummary: { totalCount: number; summary: string } | null = null;\n try {\n const { data: filesData } = await client.get<TaskFilesResponse>(\n `/api/chat/${encodeURIComponent(id)}/files`\n );\n if (filesData.totalCount > 0) {\n filesSummary = {\n totalCount: filesData.totalCount,\n summary: buildCategorySummary(filesData.files),\n };\n }\n } catch {\n // Silently degrade - file summary is an enhancement\n }\n\n if (format === 'json') {\n output.log(\n JSON.stringify(\n { ...data, filesSummary: filesSummary ?? undefined },\n null,\n 2\n )\n );\n } else {\n if (typeof data.result === 'string') {\n output.log(\n containsDiff(data.result) ? colorizeDiff(data.result) : data.result\n );\n } else {\n output.log(JSON.stringify(data.result, null, 2));\n }\n\n if (filesSummary) {\n output.newline();\n output.dim(\n `Files: ${filesSummary.totalCount} files (${filesSummary.summary})`\n );\n output.dim(`Run \\`rush-ai task files ${id}\\` to view details.`);\n }\n }\n });\n\n task\n .command('files')\n .description('List and download task artifact files')\n .argument('<id>', 'Task ID')\n .option('--download <path>', 'Download a specific file by its path')\n .option('--download-all', 'Download all files')\n .option('-o, --output <dir>', 'Output directory for downloads')\n .option(\n '-c, --category <type>',\n 'Filter by category: code, image, document, other'\n )\n .action(\n async (\n id: string,\n options: {\n download?: string;\n downloadAll?: boolean;\n output?: string;\n category?: string;\n }\n ) => {\n requireAuth();\n const format = resolveFormat(program.opts());\n const client = createClient();\n\n const { data } = await client.get<TaskFilesResponse>(\n `/api/chat/${encodeURIComponent(id)}/files`\n );\n\n let files = data.files;\n\n // Filter by category\n if (options.category && VALID_CATEGORIES.includes(options.category)) {\n files = files.filter((f) => f.category === options.category);\n } else if (options.category) {\n output.warn(\n `Unknown category \"${options.category}\". Showing all files.`\n );\n }\n\n // Single file download\n if (options.download) {\n const file = files.find(\n (f) =>\n f.filePath === options.download || f.fileName === options.download\n );\n if (!file) {\n output.error(`File not found: ${options.download}`);\n process.exit(1);\n }\n if (!file.ossUrl) {\n output.error(`File \"${file.fileName}\" has no download URL.`);\n process.exit(1);\n }\n\n const outputDir = options.output || '.';\n const destPath = sanitizeFilePath(file.filePath, outputDir);\n if (!destPath) {\n output.error(`Unsafe file path: ${file.filePath}`);\n process.exit(1);\n }\n\n await downloadFile(file.ossUrl, destPath);\n\n if (format === 'json') {\n output.log(\n JSON.stringify(\n { downloaded: file.filePath, dest: destPath },\n null,\n 2\n )\n );\n } else {\n output.success(`Downloaded: ${file.filePath} -> ${destPath}`);\n }\n return;\n }\n\n // Batch download\n if (options.downloadAll) {\n const outputDir = options.output || `task-files-${id.slice(0, 8)}`;\n let downloaded = 0;\n let skipped = 0;\n let failed = 0;\n\n for (const file of files) {\n if (!file.ossUrl) {\n skipped++;\n if (format !== 'json') {\n output.dim(` Skipped (no URL): ${file.filePath}`);\n }\n continue;\n }\n\n const destPath = sanitizeFilePath(file.filePath, outputDir);\n if (!destPath) {\n skipped++;\n if (format !== 'json') {\n output.warn(` Skipped (unsafe path): ${file.filePath}`);\n }\n continue;\n }\n\n try {\n await downloadFile(file.ossUrl, destPath);\n downloaded++;\n if (format !== 'json') {\n output.dim(` Downloaded: ${file.filePath}`);\n }\n } catch {\n failed++;\n if (format !== 'json') {\n output.warn(` Failed: ${file.filePath}`);\n }\n }\n }\n\n if (format === 'json') {\n output.log(\n JSON.stringify(\n { outputDir, downloaded, skipped, failed, total: files.length },\n null,\n 2\n )\n );\n } else {\n output.newline();\n output.success(\n `Downloaded ${downloaded}/${files.length} files to ${outputDir}`\n );\n if (skipped > 0) {\n output.dim(\n ` ${skipped} skipped (no download URL or unsafe path)`\n );\n }\n if (failed > 0) {\n output.warn(` ${failed} failed`);\n }\n }\n return;\n }\n\n // Default: list files\n if (format === 'json') {\n output.log(\n JSON.stringify({ files, totalCount: files.length }, null, 2)\n );\n return;\n }\n\n if (files.length === 0) {\n output.info('No files found.');\n return;\n }\n\n output.log(output.bold(`Files (${files.length} total):`));\n output.newline();\n\n const rows = files.map((f) => ({\n Name: f.fileName,\n Category: f.category,\n Source: f.source,\n Path: f.filePath,\n }));\n\n output.log(formatOutput(rows, format));\n }\n );\n\n task\n .command('list')\n .alias('ls')\n .description('List tasks')\n .option('-l, --limit <limit>', 'Maximum number of tasks', '20')\n .option('-s, --status <status>', 'Filter by status')\n .action(async (options: { limit?: string; status?: string }) => {\n requireAuth();\n const format = resolveFormat(program.opts());\n const client = createClient();\n\n const params = new URLSearchParams();\n if (options.limit) params.set('limit', options.limit);\n if (options.status) params.set('status', options.status);\n\n const { data } = await client.get<TaskListResponse>(\n `/api/tasks?${params.toString()}`\n );\n\n if (format === 'json') {\n output.log(JSON.stringify(data, null, 2));\n return;\n }\n\n if (data.tasks.length === 0) {\n output.info('No tasks found.');\n return;\n }\n\n output.log(output.bold(`Tasks (${data.total} total):`));\n output.newline();\n\n const rows = data.tasks.map((t) => ({\n ID: t.id,\n Name: t.name ?? '',\n Agent: t.agent,\n Status: t.status,\n Created: new Date(t.createdAt).toLocaleString(),\n }));\n\n output.log(formatOutput(rows, format));\n });\n\n task\n .command('watch')\n .description('Watch task execution in real-time')\n .argument('<id>', 'Task ID')\n .action(async (id: string) => {\n requireAuth();\n const format = resolveFormat(program.opts());\n const client = createClient();\n\n if (format !== 'json') {\n output.log(output.bold(`Watching task ${id}...`));\n output.newline();\n }\n\n const TERMINAL_STATUSES = ['completed', 'failed', 'cancelled'];\n\n const connectFn = async () => {\n const response = await client.fetchRaw(\n `/api/tasks/${encodeURIComponent(id)}/events`,\n { method: 'GET' }\n );\n if (!response.body) {\n throw new Error('No response body for SSE');\n }\n return response.body;\n };\n\n let finalStatus = '';\n\n await consumeSSEStreamWithReconnect(\n connectFn,\n (event) => {\n if (format === 'json') {\n output.log(JSON.stringify(event));\n } else {\n renderTaskEvent(event);\n }\n if (event.type === 'status') {\n finalStatus = event.data;\n }\n },\n {\n isTerminal: (event) =>\n event.type === 'status' && TERMINAL_STATUSES.includes(event.data),\n onReconnect: (attempt) => {\n if (format !== 'json') {\n output.dim(\n `\\u27F3 SSE connection lost. Reconnecting (${attempt}/5)...`\n );\n }\n },\n }\n );\n\n if (format !== 'json') {\n output.newline();\n if (finalStatus === 'completed') {\n output.success('Task completed.');\n } else if (finalStatus === 'failed') {\n output.error('Task failed.');\n } else if (finalStatus === 'cancelled') {\n output.info('Task cancelled.');\n }\n }\n });\n\n task\n .command('cancel')\n .description('Cancel a running task')\n .argument('<id>', 'Task ID')\n .action(async (id: string) => {\n requireAuth();\n const format = resolveFormat(program.opts());\n const client = createClient();\n\n await client.delete(`/api/tasks/${encodeURIComponent(id)}`);\n\n if (format === 'json') {\n output.log(JSON.stringify({ id, status: 'cancelled' }));\n } else {\n output.success(`Task ${id} cancelled.`);\n }\n });\n}\n\nfunction commaSplit(value: string): string[] {\n return value\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n}\n\nfunction renderTaskEvent(event: { type: string; data: string }): void {\n switch (event.type) {\n case 'status':\n output.info(`Status: ${event.data}`);\n break;\n case 'content':\n process.stdout.write(event.data);\n break;\n case 'error':\n output.error(event.data || 'Unknown error');\n break;\n case 'progress':\n output.dim(`Progress: ${event.data}`);\n break;\n case 'raw':\n process.stdout.write(event.data);\n break;\n default:\n output.dim(JSON.stringify(event));\n }\n}\n","import chalk from 'chalk';\n\n/** Detect whether text contains unified diff content. */\nexport function containsDiff(text: string): boolean {\n return /^@@\\s+-\\d+/m.test(text) || /^---\\s+a\\//m.test(text);\n}\n\n/** Colorize unified diff lines. */\nexport function colorizeDiff(text: string): string {\n return text\n .split('\\n')\n .map((line) => {\n if (line.startsWith('+++') || line.startsWith('---'))\n return chalk.bold(line);\n if (line.startsWith('+')) return chalk.green(line);\n if (line.startsWith('-')) return chalk.red(line);\n if (line.startsWith('@@')) return chalk.cyan(line);\n return line;\n })\n .join('\\n');\n}\n","/**\n * CI mode detection utility.\n *\n * CI mode is activated by any of:\n * - `--ci` CLI flag\n * - `CI` environment variable (set by GitHub Actions, GitLab CI, etc.)\n * - `RUSH_CI` environment variable (explicit opt-in)\n */\n\n/**\n * Strict env-var truthy check.\n * Returns true only for '1', 'true', 'yes' (case-insensitive).\n */\nfunction isEnvTruthy(value: string | undefined): boolean {\n if (!value) return false;\n return ['1', 'true', 'yes'].includes(value.trim().toLowerCase());\n}\n\n/**\n * Detect CI mode from CLI flag or environment variables.\n *\n * The `process.argv` check runs unconditionally as a reliable fallback\n * that works even before Commander parses (e.g. in early error paths).\n */\nexport function isCIMode(programOpts?: { ci?: boolean }): boolean {\n if (process.argv.includes('--ci')) return true;\n if (programOpts?.ci) return true;\n if (isEnvTruthy(process.env.CI)) return true;\n if (isEnvTruthy(process.env.RUSH_CI)) return true;\n return false;\n}\n","/**\n * Read stdin if data is being piped (non-TTY).\n * Returns null if stdin is a TTY (interactive mode).\n */\nexport async function readStdinIfPiped(): Promise<string | null> {\n if (process.stdin.isTTY) {\n return null;\n }\n\n return new Promise<string>((resolve, reject) => {\n const chunks: Buffer[] = [];\n\n process.stdin.on('data', (chunk: Buffer) => {\n chunks.push(chunk);\n });\n\n process.stdin.on('end', () => {\n resolve(Buffer.concat(chunks).toString('utf-8').trim());\n });\n\n process.stdin.on('error', reject);\n });\n}\n","import { resolve } from 'node:path';\nimport chalk from 'chalk';\nimport type { Command } from 'commander';\nimport { resolveFormat } from '../../output/format.js';\nimport { output } from '../../output/logger.js';\nimport { createClient } from '../../util/client.js';\nimport { RushError } from '../../util/errors.js';\nimport {\n gitAddAndCommit,\n gitInit,\n gitPushUrl,\n hasUncommittedChanges,\n isGitRepo,\n} from '../../util/git.js';\nimport { requireAuth } from '../../util/require-auth.js';\nimport { runChecks } from '../check/index.js';\n\ninterface DeployCliResponse {\n success: boolean;\n projectId: string;\n gitPushUrl: string;\n podChatUrl: string;\n podPreviewUrl: string;\n}\n\ninterface PodReadyResponse {\n success: boolean;\n data: { ready: boolean; message: string };\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n\nfunction maskToken(url: string): string {\n return url.replace(/:([^@]{4})[^@]*@/, ':$1****@');\n}\n\nexport function registerDeploySubcommand(\n task: Command,\n program: Command\n): void {\n task\n .command('deploy')\n .description('Deploy a local project to Rush platform')\n .option('-n, --name <name>', 'Project name')\n .option('-p, --path <dir>', 'Project directory', '.')\n .action(async (opts: { name?: string; path: string }) => {\n requireAuth();\n const format = resolveFormat(program.opts());\n const client = createClient();\n const projectPath = resolve(opts.path);\n\n // Step 1: Run checks\n if (format !== 'json') {\n output.info('Checking project readiness...');\n }\n\n const report = runChecks(projectPath);\n if (!report.deployable) {\n if (format === 'json') {\n output.log(\n JSON.stringify(\n { error: 'Project has errors that must be fixed', report },\n null,\n 2\n )\n );\n } else {\n output.error(\n 'Project has errors that must be fixed before deploying.'\n );\n output.dim('Run `rush-ai check` for details.');\n }\n process.exit(1);\n }\n\n // Step 2: Create project + get git push URL\n if (format !== 'json') {\n output.info('Creating Rush project...');\n }\n\n const projectName = opts.name || `deploy-${Date.now().toString(36)}`;\n const { data } = await client.post<DeployCliResponse>(\n '/api/projects/deploy-cli',\n {\n name: projectName,\n framework: report.framework,\n packageManager: report.packageManager,\n }\n );\n\n if (!data.success || !data.gitPushUrl) {\n throw new RushError(\n 'Failed to create project — no git push URL returned'\n );\n }\n\n if (format !== 'json') {\n output.success(`Project created: ${data.projectId}`);\n }\n\n // Step 3: Git operations\n if (format !== 'json') {\n output.info('Pushing code to Rush...');\n }\n\n if (!isGitRepo(projectPath)) {\n gitInit(projectPath);\n }\n\n if (hasUncommittedChanges(projectPath)) {\n gitAddAndCommit(projectPath, 'deploy to rush');\n }\n\n // Push directly to URL without persisting token in .git/config\n const pushResult = gitPushUrl(projectPath, data.gitPushUrl);\n if (!pushResult.success) {\n if (format === 'json') {\n output.log(\n JSON.stringify(\n {\n error: 'Git push failed',\n details: pushResult.stderr,\n projectId: data.projectId,\n },\n null,\n 2\n )\n );\n } else {\n output.error('Git push failed:');\n output.log(pushResult.stderr);\n output.dim(\n 'Check your VPN connection and network. The project was created but code was not pushed.'\n );\n output.dim(`Project ID: ${data.projectId}`);\n }\n process.exit(1);\n }\n\n if (format !== 'json') {\n output.success('Code pushed successfully');\n }\n\n // Step 4: Trigger init-clone\n if (format !== 'json') {\n output.info('Initializing project on Rush...');\n }\n\n try {\n await client.post(\n `/api/projects/${encodeURIComponent(data.projectId)}/init-clone`,\n {\n projectId: data.projectId,\n sourceProjectId: data.projectId,\n }\n );\n } catch {\n if (format !== 'json') {\n output.warn(\n 'Init-clone request failed — the pod may auto-initialize on startup'\n );\n }\n }\n\n // Step 5: Poll for pod readiness\n if (format !== 'json') {\n output.info('Waiting for project to be ready...');\n }\n\n const maxWait = 150_000;\n const pollInterval = 3_000;\n const startTime = Date.now();\n let ready = false;\n\n while (Date.now() - startTime < maxWait) {\n try {\n const { data: readyData } = await client.get<PodReadyResponse>(\n `/api/projects/${encodeURIComponent(data.projectId)}/pod-ready`\n );\n if (readyData?.data?.ready) {\n ready = true;\n break;\n }\n } catch {\n // ignore polling errors\n }\n await sleep(pollInterval);\n }\n\n // Step 6: Output result\n const result = {\n projectId: data.projectId,\n previewUrl: data.podPreviewUrl,\n chatUrl: data.podChatUrl,\n status: ready ? 'ready' : 'timeout',\n gitRemote: maskToken(data.gitPushUrl),\n };\n\n if (format === 'json') {\n output.log(JSON.stringify(result, null, 2));\n } else {\n output.newline();\n if (ready) {\n output.success('Deployment complete!');\n } else {\n output.warn('Pod is still starting up — it may take another minute.');\n }\n output.log(` ${chalk.bold('Project ID:')} ${result.projectId}`);\n output.log(` ${chalk.bold('Preview:')} ${result.previewUrl}`);\n output.log(` ${chalk.bold('Chat:')} ${result.chatUrl}`);\n output.log(` ${chalk.bold('Git remote:')} ${result.gitRemote}`);\n output.newline();\n }\n });\n}\n","import { execFileSync } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\n\nexport function isGitRepo(projectPath: string): boolean {\n return existsSync(join(projectPath, '.git'));\n}\n\nexport function gitInit(projectPath: string): void {\n execFileSync('git', ['init'], { cwd: projectPath, stdio: 'pipe' });\n}\n\nexport function hasUncommittedChanges(projectPath: string): boolean {\n try {\n const status = execFileSync('git', ['status', '--porcelain'], {\n cwd: projectPath,\n encoding: 'utf-8',\n });\n return status.trim().length > 0;\n } catch {\n return false;\n }\n}\n\nexport function gitAddAndCommit(projectPath: string, message: string): void {\n execFileSync('git', ['add', '-A'], { cwd: projectPath, stdio: 'pipe' });\n execFileSync('git', ['commit', '-m', message, '--allow-empty'], {\n cwd: projectPath,\n stdio: 'pipe',\n env: {\n ...process.env,\n GIT_AUTHOR_NAME: process.env.GIT_AUTHOR_NAME || 'rush-ai',\n GIT_AUTHOR_EMAIL: process.env.GIT_AUTHOR_EMAIL || 'rush-ai@rush.dev',\n GIT_COMMITTER_NAME: process.env.GIT_COMMITTER_NAME || 'rush-ai',\n GIT_COMMITTER_EMAIL:\n process.env.GIT_COMMITTER_EMAIL || 'rush-ai@rush.dev',\n },\n });\n}\n\nexport function setRemote(\n projectPath: string,\n remoteName: string,\n url: string\n): void {\n try {\n const remotes = execFileSync('git', ['remote'], {\n cwd: projectPath,\n encoding: 'utf-8',\n });\n if (remotes.split('\\n').includes(remoteName)) {\n execFileSync('git', ['remote', 'set-url', remoteName, url], {\n cwd: projectPath,\n stdio: 'pipe',\n });\n } else {\n execFileSync('git', ['remote', 'add', remoteName, url], {\n cwd: projectPath,\n stdio: 'pipe',\n });\n }\n } catch {\n execFileSync('git', ['remote', 'add', remoteName, url], {\n cwd: projectPath,\n stdio: 'pipe',\n });\n }\n}\n\nexport function gitPushUrl(\n projectPath: string,\n url: string\n): { success: boolean; stderr: string } {\n try {\n execFileSync('git', ['push', url, 'HEAD:main', '--force'], {\n cwd: projectPath,\n stdio: 'pipe',\n timeout: 300_000,\n maxBuffer: 10 * 1024 * 1024,\n });\n return { success: true, stderr: '' };\n } catch (err: unknown) {\n const rawStderr =\n err && typeof err === 'object' && 'stderr' in err\n ? String((err as { stderr: Buffer }).stderr)\n : 'unknown error';\n return { success: false, stderr: sanitizeGitOutput(rawStderr) };\n }\n}\n\nexport function sanitizeGitOutput(text: string): string {\n return text.replace(/https?:\\/\\/[^@]*@/g, 'https://***@');\n}\n","import type { Command } from 'commander';\nimport { registerAgentCommand } from './agent/index.js';\nimport { registerAuthCommand } from './auth/index.js';\nimport { registerCheckCommand } from './check/index.js';\nimport { registerCompletionCommand } from './completion/index.js';\nimport { registerConfigCommand } from './config/index.js';\nimport { registerDoctorCommand } from './doctor/index.js';\nimport { registerMcpCommand } from './mcp/index.js';\nimport { registerPluginCommand } from './plugin/index.js';\nimport { registerTaskCommand } from './task/index.js';\n\nexport function registerCommands(program: Command): void {\n registerAuthCommand(program);\n registerAgentCommand(program);\n registerTaskCommand(program);\n registerCheckCommand(program);\n registerMcpCommand(program);\n registerPluginCommand(program);\n registerCompletionCommand(program);\n registerConfigCommand(program);\n registerDoctorCommand(program);\n}\n","import { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { dirname, join } from 'node:path';\nimport { output } from '../output/logger.js';\n\nconst CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000;\nconst FETCH_TIMEOUT_MS = 3000;\nconst REGISTRY_URL = 'https://registry.npmjs.org/rush-ai/latest';\n\nfunction parseVersion(v: string): number[] | null {\n const segments = v.replace(/^v/, '').split('-')[0].split('.').map(Number);\n if (segments.some((n) => Number.isNaN(n))) return null;\n return segments;\n}\n\nfunction isNewerVersion(current: string, latest: string): boolean {\n const c = parseVersion(current);\n const l = parseVersion(latest);\n if (!c || !l) return false;\n for (let i = 0; i < Math.max(c.length, l.length); i++) {\n const cv = c[i] ?? 0;\n const lv = l[i] ?? 0;\n if (lv > cv) return true;\n if (lv < cv) return false;\n }\n return false;\n}\n\nasync function writeLastCheck(checkFile: string): Promise<void> {\n try {\n await mkdir(dirname(checkFile), { recursive: true });\n await writeFile(checkFile, JSON.stringify({ lastCheck: Date.now() }));\n } catch {\n // Truly silent — filesystem may not be writable\n }\n}\n\nexport async function checkForUpdate(currentVersion: string): Promise<void> {\n const rushDir = join(homedir(), '.rush');\n const checkFile = join(rushDir, 'update-check.json');\n\n try {\n if (process.env.CI) return;\n\n let lastCheck = 0;\n try {\n const data = JSON.parse(await readFile(checkFile, 'utf-8'));\n lastCheck = data.lastCheck ?? 0;\n } catch {\n // Missing or corrupt — will check\n }\n\n if (Date.now() - lastCheck < CHECK_INTERVAL_MS) return;\n\n // Write lastCheck immediately to prevent retry storms on failure\n await writeLastCheck(checkFile);\n\n const response = await fetch(REGISTRY_URL, {\n signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),\n });\n if (!response.ok) return;\n\n const { version: latest } = (await response.json()) as {\n version: string;\n };\n\n if (isNewerVersion(currentVersion, latest)) {\n output.newline();\n output.warn(\n `Update available: ${currentVersion} → ${latest}\\n` +\n ` Run \\`npm update -g rush-ai\\` to update.`\n );\n }\n } catch {\n // Silent — never block CLI usage.\n // lastCheck was already written above, so next invocation won't retry.\n }\n}\n"],"mappings":"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","names":["chalk","truncate","resolve","chalk","existsSync","readFileSync","join","existsSync","join","existsSync","readFileSync","join","existsSync","readFileSync","join","VITE_CONFIG_FILES","devScript","chalk","existsSync","join","existsSync","join","chalk","existsSync","existsSync","detectShell","existsSync","readFileSync","homedir","resolve","resolve","homedir","existsSync","readFileSync","chalk","displayResults","truncate","existsSync","mkdirSync","readFileSync","writeFileSync","homedir","resolve","chalk","existsSync","homedir","resolve","existsSync","mkdirSync","readFileSync","writeFileSync","resolve","resolve","homedir","existsSync","existsSync","homedir","resolve","resolve","homedir","existsSync","copyFileSync","existsSync","mkdirSync","readFileSync","writeFileSync","homedir","dirname","join","resolve","resolve","homedir","readFileSync","existsSync","mkdirSync","dirname","copyFileSync","writeFileSync","join","existsSync","readFileSync","homedir","existsSync","checkAuth","type","homedir","readFileSync","accessSync","constants","existsSync","mkdirSync","homedir","path","chalk","path","homedir","existsSync","mkdirSync","accessSync","constants","chalk","execFileSync","existsSync","existsSync","execFileSync","createClient","resolve","homedir","PLUGINS_FILE","safeReadJson","existsSync","readFileSync","mkdirSync","writeFileSync","chalk","mkdir","path","chalk","resolve","resolve","chalk","execFileSync","existsSync","join","execFileSync","maskToken","resolve","chalk","path","mkdir","mkdir","readFile","writeFile","homedir","dirname","join","mkdir","dirname","writeFile","join","homedir","readFile","chalk"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/output/formatters/csv.ts","../src/output/formatters/table.ts","../src/output/formatters/index.ts","../src/util/require-auth.ts","../src/commands/agent/index.ts","../src/commands/auth/browser-login.ts","../src/commands/auth/index.ts","../src/commands/check/index.ts","../src/commands/check/checks/database.ts","../src/commands/check/checks/framework.ts","../src/commands/check/checks/lock-file.ts","../src/commands/check/checks/package-json.ts","../src/commands/check/checks/port-env.ts","../src/commands/completion/index.ts","../src/commands/config/index.ts","../src/commands/doctor/index.ts","../src/commands/doctor/checks/auth.ts","../src/commands/doctor/checks/config.ts","../src/commands/doctor/checks/connectivity.ts","../src/commands/doctor/checks/environment.ts","../src/commands/doctor/checks/plugins.ts","../src/commands/mcp/index.ts","../src/commands/plugin/index.ts","../src/commands/plugin/adapters/claude-code.ts","../src/commands/plugin/adapters/base.ts","../src/commands/plugin/adapters/cursor.ts","../src/commands/plugin/adapters/index.ts","../src/commands/plugin/assets.ts","../src/commands/plugin/doctor.ts","../src/commands/plugin/preflight.ts","../src/commands/plugin/verify.ts","../src/commands/task/index.ts","../src/output/diff.ts","../src/util/ci.ts","../src/util/stdin.ts","../src/commands/task/deploy.ts","../src/util/git.ts","../src/commands/index.ts","../src/util/update-check.ts"],"sourcesContent":["import chalk from 'chalk';\nimport { Command } from 'commander';\nimport { registerCommands } from './commands/index.js';\nimport { output } from './output/logger.js';\nimport { getAuthMethod } from './util/auth.js';\nimport { isCIMode } from './util/ci.js';\nimport { isRushError } from './util/errors.js';\nimport { checkForUpdate } from './util/update-check.js';\nimport { setVerbosity } from './util/verbosity.js';\nimport { VERSION } from './version.js';\n\nconst BANNER = `\n ${chalk.bold.cyan('Rush CLI')} ${chalk.dim(`v${VERSION}`)}\n ${chalk.dim('The command-line interface for the Rush AI platform')}\n`;\n\nfunction showWelcomeGuide(): void {\n const lines = [\n '',\n ` ${chalk.bold.cyan('Rush CLI')} ${chalk.dim(`v${VERSION}`)}`,\n '',\n chalk.dim(' Quick start:'),\n ` ${chalk.cyan('rush-ai auth login')} Log in to Rush platform`,\n ` ${chalk.cyan('rush-ai agent list')} Browse available agents`,\n ` ${chalk.cyan('rush-ai task create -a <agent>')} Create a task`,\n '',\n ];\n\n try {\n const method = getAuthMethod();\n if (method) {\n lines.push(chalk.dim(' Status:'), ` Logged in via ${method}`, '');\n }\n } catch {\n // Ignore auth errors in welcome guide\n }\n\n lines.push(chalk.dim(' Run rush-ai --help for all commands.'), '');\n console.error(lines.join('\\n'));\n}\n\nexport function createProgram(): Command {\n const program = new Command();\n\n program\n .name('rush-ai')\n .version(VERSION, '-v, --version')\n .description('Rush CLI - Command-line interface for the Rush AI platform')\n .configureHelp({\n sortSubcommands: true,\n })\n .addHelpText('before', BANNER)\n .option('--no-color', 'Disable color output')\n .option('--json', 'Output as JSON where supported')\n .option('-f, --format <type>', 'Output format (table, json, csv)')\n .option(\n '--ci',\n 'CI mode: JSON output, no interactive prompts, strict exit codes'\n )\n .option('--verbose', 'Show detailed output including HTTP requests')\n .option('--debug', 'Show debug-level output (implies --verbose)');\n\n // CI mode: auto-enable --json before any command runs\n // Set verbosity BEFORE any command action runs\n program.hook('preAction', (thisCommand) => {\n const opts = thisCommand.optsWithGlobals();\n if (isCIMode(opts)) {\n if (!opts.json) {\n thisCommand.setOptionValue('json', true);\n }\n }\n setVerbosity(!!opts.verbose, !!opts.debug);\n });\n\n // No-argument interactive guide (Commander handles --help/--version first)\n program.action(() => {\n if (process.stdout.isTTY) {\n showWelcomeGuide();\n } else {\n program.help();\n }\n });\n\n registerCommands(program);\n\n return program;\n}\n\nasync function main(): Promise<void> {\n // Disable color in non-TTY environments, --no-color, or CI mode\n if (\n !process.stdout.isTTY ||\n process.argv.includes('--no-color') ||\n isCIMode()\n ) {\n process.env.NO_COLOR = '1';\n }\n\n const program = createProgram();\n\n try {\n await program.parseAsync(process.argv);\n } catch (error) {\n const ci = isCIMode(program.opts());\n\n if (isRushError(error)) {\n if (ci) {\n output.log(\n JSON.stringify({\n error: true,\n code: error.code,\n message: error.message,\n exitCode: error.exitCode,\n })\n );\n } else {\n output.error(error.message);\n if (error.code === 'AUTH_ERROR') {\n output.newline();\n output.dim('Run `rush-ai auth login` to authenticate.');\n }\n }\n process.exit(error.exitCode);\n }\n\n if (error instanceof Error) {\n const exitCode = 2;\n if (ci) {\n output.log(\n JSON.stringify({\n error: true,\n code: 'UNKNOWN_ERROR',\n message: error.message,\n exitCode,\n })\n );\n } else {\n output.error(error.message);\n if (process.env.DEBUG) {\n console.error(error.stack);\n }\n }\n process.exit(exitCode);\n }\n\n if (ci) {\n output.log(\n JSON.stringify({\n error: true,\n code: 'UNKNOWN_ERROR',\n message: 'An unexpected error occurred.',\n exitCode: 2,\n })\n );\n } else {\n output.error('An unexpected error occurred.');\n }\n process.exit(2);\n }\n\n // Non-blocking version check after command completes\n void checkForUpdate(VERSION);\n}\n\n// Only run when executed as entry point, not when imported by tests\nif (!process.env.VITEST) {\n main();\n}\n","/**\n * RFC 4180 compliant CSV formatter.\n * No external dependencies.\n */\n\nfunction escapeField(value: string): string {\n // If value contains comma, quote, newline, or leading/trailing spaces, wrap in quotes\n if (\n value.includes(',') ||\n value.includes('\"') ||\n value.includes('\\n') ||\n value.includes('\\r') ||\n value !== value.trim()\n ) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }\n return value;\n}\n\nexport function formatCsv(rows: Record<string, string>[]): string {\n if (rows.length === 0) return '';\n\n const keys = Object.keys(rows[0]);\n\n // Header row\n const header = keys.map(escapeField).join(',');\n\n // Data rows\n const lines = rows.map((row) =>\n keys.map((k) => escapeField(row[k] ?? '')).join(',')\n );\n\n return [header, ...lines].join('\\n');\n}\n","import chalk from 'chalk';\n\nexport interface TableColumnOptions {\n maxWidth?: number;\n align?: 'left' | 'right';\n}\n\nexport interface TableFormatOptions {\n columns?: Record<string, TableColumnOptions>;\n}\n\nconst STATUS_COLORS: Record<string, (s: string) => string> = {\n completed: chalk.green,\n active: chalk.green,\n installed: chalk.green,\n running: chalk.yellow,\n pending: chalk.yellow,\n available: chalk.dim,\n failed: chalk.red,\n cancelled: chalk.red,\n error: chalk.red,\n};\n\nfunction colorizeStatus(value: string): string {\n const colorFn = STATUS_COLORS[value.toLowerCase()];\n return colorFn ? colorFn(value) : value;\n}\n\nfunction truncate(str: string, max: number): string {\n if (str.length <= max) return str;\n return `${str.slice(0, max - 3)}...`;\n}\n\nexport function formatTableEnhanced(\n rows: Record<string, string>[],\n options?: TableFormatOptions\n): string {\n if (rows.length === 0) return '';\n\n const keys = Object.keys(rows[0]);\n const colOpts = options?.columns ?? {};\n const widths: Record<string, number> = {};\n\n // Calculate column widths\n for (const key of keys) {\n widths[key] = key.length;\n }\n for (const row of rows) {\n for (const key of keys) {\n const val = row[key] ?? '';\n const maxW = colOpts[key]?.maxWidth;\n const display = maxW ? truncate(val, maxW) : val;\n if (display.length > widths[key]) {\n widths[key] = display.length;\n }\n }\n }\n\n // Build header\n const header = keys.map((k) => chalk.bold(k.padEnd(widths[k]))).join(' ');\n const separator = keys.map((k) => '-'.repeat(widths[k])).join(' ');\n\n // Build rows\n const lines = rows.map((row) =>\n keys\n .map((k) => {\n const raw = row[k] ?? '-';\n const display = raw === '' ? '-' : raw;\n const maxW = colOpts[k]?.maxWidth;\n const truncated = maxW ? truncate(display, maxW) : display;\n const align = colOpts[k]?.align ?? 'left';\n const padded =\n align === 'right'\n ? truncated.padStart(widths[k])\n : truncated.padEnd(widths[k]);\n\n // Colorize status-like values\n if (k.toLowerCase() === 'status' || k.toLowerCase() === 'state') {\n return colorizeStatus(padded);\n }\n return padded;\n })\n .join(' ')\n );\n\n return [header, separator, ...lines].join('\\n');\n}\n","import { formatCsv } from './csv.js';\nimport { formatTableEnhanced, type TableFormatOptions } from './table.js';\n\nexport type OutputFormat = 'table' | 'json' | 'csv';\n\nconst VALID_FORMATS: readonly string[] = ['table', 'json', 'csv'];\n\nexport interface FormatOptions extends TableFormatOptions {}\n\n/**\n * Resolve the effective output format from CLI options.\n * Throws if --json and --format conflict, or if format value is invalid.\n */\nexport function resolveFormat(opts: {\n json?: boolean;\n format?: string;\n}): OutputFormat {\n const hasJson = opts.json === true;\n const hasFormat = opts.format != null && opts.format !== undefined;\n\n // Validate format value\n if (hasFormat && !VALID_FORMATS.includes(opts.format as string)) {\n throw new Error(\n `Invalid format: \"${opts.format}\". Supported formats: ${VALID_FORMATS.join(', ')}`\n );\n }\n\n if (hasJson && hasFormat && opts.format !== 'json') {\n throw new Error(\n `Conflicting options: --json cannot be used with --format ${opts.format}. Use one or the other.`\n );\n }\n\n if (hasJson) return 'json';\n if (hasFormat) return opts.format as OutputFormat;\n return 'table';\n}\n\n/**\n * Format row data as a string in the specified format.\n * Note: JSON mode should be handled separately per-command to preserve payload structure.\n */\nexport function formatOutput(\n rows: Record<string, string>[],\n format: OutputFormat,\n options?: FormatOptions\n): string {\n switch (format) {\n case 'csv':\n return formatCsv(rows);\n case 'json':\n return JSON.stringify(rows, null, 2);\n default:\n return formatTableEnhanced(rows, options);\n }\n}\n\nexport { formatCsv } from './csv.js';\nexport type { TableColumnOptions, TableFormatOptions } from './table.js';\n// Re-export for convenience\nexport { formatTableEnhanced } from './table.js';\n","import { getAuthToken } from './auth.js';\nimport { getAuthConfig } from './config.js';\nimport { AuthError } from './errors.js';\n\n/**\n * Guard that throws AuthError if not authenticated.\n * Checks RUSH_API_KEY env and stored CAS token (including expiry).\n */\nexport function requireAuth(): void {\n const token = getAuthToken();\n if (!token) {\n throw new AuthError();\n }\n // Check expiry for stored tokens (env API keys never expire client-side)\n if (!process.env.RUSH_API_KEY) {\n const auth = getAuthConfig();\n if (auth.expiresAt && Date.now() > auth.expiresAt) {\n // CAS tokens with refresh_token can still be renewed lazily\n if (auth.method === 'cas' && auth.refreshToken) {\n return;\n }\n throw new AuthError(\n 'Token expired. Run `rush-ai auth login` to re-authenticate.'\n );\n }\n }\n}\n","import type { Command } from 'commander';\nimport { formatOutput, resolveFormat } from '../../output/format.js';\nimport { output } from '../../output/logger.js';\nimport { createClient } from '../../util/client.js';\nimport { ApiError } from '../../util/errors.js';\nimport { requireAuth } from '../../util/require-auth.js';\n\n/** Matches DbAgent from the real API */\ninterface ApiAgent {\n id: string;\n name: string;\n description: string | null;\n capabilities: string[] | null;\n skills: string[] | null;\n mcp_servers: unknown[] | null;\n status: string;\n visibility: string;\n provider_type: string;\n provider_model: string | null;\n system_prompt: string | null;\n created_at: string;\n updated_at: string;\n created_by_id: string | null;\n is_builtin: boolean;\n}\n\ninterface AgentListResponse {\n agents: ApiAgent[];\n pagination: {\n total: number;\n page: number;\n limit: number;\n totalPages: number;\n };\n}\n\ninterface AgentDetailResponse {\n agent: ApiAgent;\n}\n\ninterface AgentCandidateItem {\n id: string;\n name: string;\n status: string;\n visibility: string;\n created_at: string;\n}\n\ninterface AgentCandidatesBody {\n error: string;\n candidates: AgentCandidateItem[];\n}\n\nexport function registerAgentCommand(program: Command): void {\n const agent = program\n .command('agent')\n .description('Manage and inspect agents');\n\n agent\n .command('list')\n .alias('ls')\n .description('List available agents')\n .action(async () => {\n requireAuth();\n const format = resolveFormat(program.opts());\n const client = createClient();\n const { data } = await client.get<AgentListResponse>('/api/agents');\n\n if (format === 'json') {\n output.log(JSON.stringify(data, null, 2));\n return;\n }\n\n if (data.agents.length === 0) {\n output.info('No agents found.');\n return;\n }\n\n const total = data.pagination?.total ?? data.agents.length;\n output.log(output.bold(`Agents (${total} total):`));\n output.newline();\n\n const rows = data.agents.map((a) => ({\n Name: a.name,\n Description: truncate(a.description ?? '', 50),\n Status: a.status,\n Skills: String(a.skills?.length ?? 0),\n MCP: String(a.mcp_servers?.length ?? 0),\n }));\n\n output.log(\n formatOutput(rows, format, {\n columns: { Description: { maxWidth: 50 } },\n })\n );\n });\n\n agent\n .command('info')\n .description('Show agent details')\n .argument('<name>', 'Agent name or ID')\n .action(async (nameOrId: string) => {\n requireAuth();\n const format = resolveFormat(program.opts());\n const client = createClient();\n\n let data: AgentDetailResponse;\n try {\n ({ data } = await client.get<AgentDetailResponse>(\n `/api/agents/${encodeURIComponent(nameOrId)}`\n ));\n } catch (err: unknown) {\n if (err instanceof ApiError && err.status === 409) {\n let parsed: AgentCandidatesBody | undefined;\n try {\n parsed = JSON.parse(err.meta.body as string);\n } catch {\n // body 不是合法 JSON,走默认错误处理\n }\n\n // 运行时守卫:确保 candidates 是合法数组且每项有必要字段\n const candidates = parsed?.candidates;\n const isValid =\n Array.isArray(candidates) &&\n candidates.length > 0 &&\n candidates.every(\n (c) => typeof c.id === 'string' && typeof c.name === 'string'\n );\n\n if (isValid) {\n if (format === 'json') {\n output.log(JSON.stringify(parsed, null, 2));\n process.exitCode = 1;\n return;\n }\n\n output.error(`Multiple agents found with name \"${nameOrId}\":`);\n output.newline();\n for (const c of candidates!) {\n const date = c.created_at?.split('T')[0] ?? '';\n output.dim(` ${c.id} ${c.name} ${c.status ?? ''} ${date}`);\n }\n output.newline();\n output.info(`Use agent ID to specify: rush agent info <id>`);\n process.exitCode = 1;\n return;\n }\n }\n throw err;\n }\n\n const a = data.agent;\n\n if (format === 'json') {\n output.log(JSON.stringify(a, null, 2));\n return;\n }\n\n output.log(output.bold(a.name));\n output.log(` ID: ${a.id}`);\n output.log(` Description: ${a.description ?? '(none)'}`);\n output.log(` Status: ${a.status}`);\n output.log(` Visibility: ${a.visibility}`);\n output.log(\n ` Provider: ${a.provider_type}${a.provider_model ? ` (${a.provider_model})` : ''}`\n );\n output.log(` Capabilities: ${a.capabilities?.join(', ') || 'none'}`);\n output.newline();\n\n if (a.skills && a.skills.length > 0) {\n output.log(output.bold(' Skills:'));\n for (const skill of a.skills) {\n output.log(` - ${skill}`);\n }\n output.newline();\n }\n\n if (a.mcp_servers && a.mcp_servers.length > 0) {\n output.log(output.bold(` MCP Servers (${a.mcp_servers.length}):`));\n for (const mcp of a.mcp_servers) {\n if (typeof mcp === 'object' && mcp !== null) {\n const m = mcp as Record<string, unknown>;\n const name = String(m.serverName ?? m.name ?? 'unknown');\n const disabled = m.disabled ? ' (disabled)' : '';\n output.log(` - ${name}${disabled}`);\n } else {\n output.log(` - ${JSON.stringify(mcp)}`);\n }\n }\n output.newline();\n }\n\n output.dim(` Updated: ${new Date(a.updated_at).toLocaleString()}`);\n });\n}\n\nfunction truncate(str: string, max: number): string {\n if (str.length <= max) return str;\n return `${str.slice(0, max - 3)}...`;\n}\n","import { randomBytes } from 'node:crypto';\nimport { createServer } from 'node:http';\nimport type { AddressInfo } from 'node:net';\nimport open from 'open';\nimport { output } from '../../output/logger.js';\nimport { getGlobalConfig, setAuthConfig } from '../../util/config.js';\nimport { AuthError } from '../../util/errors.js';\n\ninterface TokenResponse {\n token: string;\n token_id: string;\n expires_at: string;\n}\n\nfunction getApiBaseUrl(): string {\n return process.env.RUSH_API_URL ?? getGlobalConfig().api;\n}\n\nexport async function loginViaBrowser(jsonMode?: boolean): Promise<void> {\n const baseUrl = getApiBaseUrl();\n const state = randomBytes(16).toString('hex');\n\n return new Promise<void>((resolve, reject) => {\n const server = createServer(async (req, res) => {\n try {\n const url = new URL(req.url ?? '/', 'http://localhost');\n\n if (url.pathname !== '/callback') {\n res.writeHead(404);\n res.end('Not found');\n return;\n }\n\n const code = url.searchParams.get('code');\n const returnedState = url.searchParams.get('state');\n const error = url.searchParams.get('error');\n\n if (error) {\n const desc = url.searchParams.get('error_description') ?? '认证失败';\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(\n getHtmlPage(\n '认证失败',\n `错误:${desc}。你可以关闭此页面。`,\n baseUrl\n )\n );\n server.close();\n reject(new AuthError(`Browser authentication failed: ${desc}`));\n return;\n }\n\n if (!code || returnedState !== state) {\n res.writeHead(400, { 'Content-Type': 'text/html' });\n res.end(\n getHtmlPage(\n '认证失败',\n '回调参数无效,请重新登录。你可以关闭此页面。',\n baseUrl\n )\n );\n server.close();\n reject(\n new AuthError('Invalid callback: missing code or state mismatch')\n );\n return;\n }\n\n // Exchange code for Platform Token\n const tokenUrl = `${baseUrl}/api/cli/auth/token`;\n const tokenResponse = await fetch(tokenUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ code, state }),\n });\n\n if (!tokenResponse.ok) {\n const errorText = await tokenResponse\n .text()\n .catch(() => 'Unknown error');\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(\n getHtmlPage(\n '认证失败',\n 'Token 交换失败,请重试。你可以关闭此页面。',\n baseUrl\n )\n );\n server.close();\n reject(new AuthError(`Token exchange failed: ${errorText}`));\n return;\n }\n\n const tokenData = (await tokenResponse.json()) as TokenResponse;\n\n const expiresAt = tokenData.expires_at\n ? new Date(tokenData.expires_at).getTime()\n : null;\n\n setAuthConfig({\n token: tokenData.token,\n expiresAt,\n refreshToken: null,\n method: 'platform_token',\n tokenId: tokenData.token_id,\n });\n\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(\n getHtmlPage(\n '认证成功',\n '你已成功登录,可以关闭此页面并返回终端。',\n baseUrl,\n expiresAt ?? undefined\n )\n );\n\n server.close();\n\n if (jsonMode) {\n output.log(\n JSON.stringify({\n status: 'authenticated',\n method: 'platform_token',\n expiresAt,\n })\n );\n } else {\n output.success('Logged in successfully.');\n if (expiresAt) {\n output.dim(\n `Token expires: ${new Date(expiresAt).toLocaleString()}`\n );\n }\n }\n\n resolve();\n } catch (err) {\n server.close();\n reject(\n err instanceof AuthError\n ? err\n : new AuthError(\n `Authentication error: ${err instanceof Error ? err.message : 'Unknown'}`\n )\n );\n }\n });\n\n server.listen(0, '127.0.0.1', () => {\n const { port } = server.address() as AddressInfo;\n\n const authUrl = `${baseUrl}/api/cli/auth/authorize?callback_port=${port}&state=${encodeURIComponent(state)}`;\n\n if (!jsonMode) {\n output.log('Opening browser for authentication...');\n output.dim(\"If the browser doesn't open, visit:\");\n output.dim(authUrl);\n output.newline();\n output.dim('Waiting for authentication...');\n }\n\n open(authUrl).catch(() => {\n if (!jsonMode) {\n output.warn(\n 'Could not open browser. Please visit the URL above manually.'\n );\n }\n });\n });\n\n // Timeout after 5 minutes\n const timeoutId = setTimeout(() => {\n server.close();\n reject(new AuthError('Authentication timed out after 5 minutes'));\n }, 300_000);\n\n server.on('close', () => clearTimeout(timeoutId));\n });\n}\n\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#x27;');\n}\n\nfunction getHtmlPage(\n title: string,\n message: string,\n serverUrl: string,\n expiresAt?: number\n): string {\n const metaLines: string[] = [\n `<span class=\"label\">服务器</span> <span class=\"value\">${escapeHtml(serverUrl)}</span>`,\n ];\n if (expiresAt) {\n metaLines.push(\n `<span class=\"label\">有效期至</span> <span class=\"value\">${escapeHtml(new Date(expiresAt).toLocaleString('zh-CN'))}</span>`\n );\n }\n const metaHtml = metaLines\n .map((line) => `<div class=\"meta-row\">${line}</div>`)\n .join('\\n ');\n\n return `<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head><meta charset=\"utf-8\"><title>Rush CLI - ${escapeHtml(title)}</title>\n<style>\n body { font-family: -apple-system, BlinkMacSystemFont, \"PingFang SC\", \"Microsoft YaHei\", sans-serif; display: flex; align-items: center; justify-content: center; height: 100vh; margin: 0; background: #f5f5f5; }\n .card { background: white; border-radius: 12px; padding: 40px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); text-align: center; max-width: 420px; }\n h1 { color: #333; font-size: 1.5em; margin-bottom: 8px; }\n p { color: #666; line-height: 1.6; }\n .meta { margin-top: 16px; padding-top: 16px; border-top: 1px solid #eee; text-align: left; }\n .meta-row { color: #888; font-size: 0.85em; line-height: 2; }\n .meta-row .label { color: #999; }\n .meta-row .value { color: #555; font-family: \"SF Mono\", Menlo, monospace; }\n</style>\n</head>\n<body>\n <div class=\"card\">\n <h1>${escapeHtml(title)}</h1>\n <p>${escapeHtml(message)}</p>\n <div class=\"meta\">\n ${metaHtml}\n </div>\n </div>\n</body>\n</html>`;\n}\n","import type { Command } from 'commander';\nimport { output } from '../../output/logger.js';\nimport { getAuthMethod } from '../../util/auth.js';\nimport {\n revokeCurrentSession,\n verifyCurrentAuthSession,\n} from '../../util/auth-session.js';\nimport {\n clearAuthConfig,\n getAuthConfig,\n getConfigDir,\n isLoggedIn,\n setAuthConfig,\n} from '../../util/config.js';\nimport { RushError } from '../../util/errors.js';\nimport { loginViaBrowser } from './browser-login.js';\n\nexport function registerAuthCommand(program: Command): void {\n const auth = program.command('auth').description('Manage authentication');\n\n auth\n .command('login')\n .description('Log in to the Rush platform')\n .option('--api-key <key>', 'Authenticate with an API key instead of CAS')\n .option('--no-verify', 'Skip online validation for API key login')\n .action(async (options: { apiKey?: string; verify?: boolean }) => {\n const jsonMode = program.opts().json;\n\n if (options.apiKey) {\n setAuthConfig({\n token: options.apiKey,\n expiresAt: null,\n refreshToken: null,\n method: 'api_key',\n });\n\n let verification:\n | Awaited<ReturnType<typeof verifyCurrentAuthSession>>\n | undefined;\n if (options.verify !== false) {\n verification = await verifyCurrentAuthSession();\n if (!verification.valid) {\n clearAuthConfig();\n throw new RushError(\n `API key validation failed: ${verification.message ?? 'invalid credentials'}`,\n {},\n 'AUTH_ERROR'\n );\n }\n }\n\n if (jsonMode) {\n output.log(\n JSON.stringify({\n status: 'authenticated',\n method: 'api_key',\n verified: options.verify !== false,\n ...(verification ? { serverStatus: verification.status } : {}),\n })\n );\n } else {\n output.success('Authenticated with API key.');\n if (options.verify !== false) {\n output.dim('Server validation: OK');\n }\n }\n return;\n }\n\n // CAS PKCE flow\n if (isLoggedIn()) {\n if (jsonMode) {\n output.log(JSON.stringify({ status: 'already_authenticated' }));\n } else {\n output.warn('You are already logged in.');\n output.dim('Run `rush-ai auth logout` first to log out.');\n }\n return;\n }\n\n await loginViaBrowser(jsonMode);\n });\n\n auth\n .command('status')\n .description('Show the current authentication status')\n .option('--verify', 'Validate the current credential against the server')\n .action(async (options: { verify?: boolean }) => {\n const jsonMode = program.opts().json;\n const method = getAuthMethod();\n const authConfig = getAuthConfig();\n // Consider authenticated if: env API key set, OR stored token is valid\n const loggedIn =\n method !== null && (method === 'api_key' || isLoggedIn());\n const verification =\n loggedIn && options.verify ? await verifyCurrentAuthSession() : null;\n\n if (jsonMode) {\n output.log(\n JSON.stringify({\n authenticated: loggedIn,\n method: method ?? null,\n expiresAt: authConfig.expiresAt,\n hasRefreshToken: Boolean(authConfig.refreshToken),\n configDir: getConfigDir(),\n ...(verification\n ? {\n serverAuthenticated: verification.valid,\n serverStatus: verification.status,\n serverMessage: verification.message,\n }\n : {}),\n })\n );\n } else {\n if (loggedIn) {\n output.success(`Authenticated via ${method ?? 'token'}`);\n if (authConfig.expiresAt) {\n const expiresDate = new Date(authConfig.expiresAt).toLocaleString();\n output.dim(`Token expires: ${expiresDate}`);\n }\n if (authConfig.refreshToken) {\n output.dim('Refresh token: available');\n }\n } else {\n output.warn('Not authenticated.');\n output.dim('Run `rush-ai auth login` to log in.');\n }\n if (verification) {\n if (verification.valid) {\n output.dim('Server validation: OK');\n } else {\n output.warn(\n `Server validation failed: ${verification.message ?? 'token rejected'}`\n );\n }\n }\n output.dim(`Config: ${getConfigDir()}`);\n }\n });\n\n auth\n .command('logout')\n .description('Log out and clear stored credentials')\n .option('--no-revoke', 'Skip best-effort CAS revoke request')\n .action(async (options: { revoke?: boolean }) => {\n const jsonMode = program.opts().json;\n const authConfig = getAuthConfig();\n\n const hasToken = authConfig.token !== null;\n if (!hasToken) {\n if (jsonMode) {\n output.log(JSON.stringify({ status: 'not_authenticated' }));\n } else {\n output.warn('You are not currently logged in.');\n }\n return;\n }\n\n const shouldRevoke =\n options.revoke !== false &&\n (authConfig.method === 'cas' || authConfig.method === 'platform_token');\n const revoked = shouldRevoke ? await revokeCurrentSession() : false;\n\n clearAuthConfig();\n if (jsonMode) {\n output.log(\n JSON.stringify({\n status: 'logged_out',\n ...(shouldRevoke ? { revoked } : {}),\n })\n );\n } else {\n output.success('Logged out successfully.');\n if (shouldRevoke) {\n if (revoked) {\n output.dim('Remote token revoked.');\n } else {\n output.warn(\n 'Could not confirm remote revoke. Local credentials were cleared.'\n );\n }\n }\n }\n });\n}\n","import { resolve } from 'node:path';\nimport chalk from 'chalk';\nimport type { Command } from 'commander';\nimport { output } from '../../output/logger.js';\nimport { checkDatabase } from './checks/database.js';\nimport { checkFramework, detectFramework } from './checks/framework.js';\nimport { checkLockFile, detectPackageManager } from './checks/lock-file.js';\nimport { checkPackageJson } from './checks/package-json.js';\nimport { checkPortEnv } from './checks/port-env.js';\nimport type { DeployCheck, DeployCheckReport } from './types.js';\n\nfunction severityIcon(severity: DeployCheck['severity']): string {\n switch (severity) {\n case 'error':\n return chalk.red('✗');\n case 'warning':\n return chalk.yellow('!');\n case 'info':\n return chalk.dim('·');\n }\n}\n\nfunction displayResults(report: DeployCheckReport): void {\n output.newline();\n output.log(chalk.bold(' Rush Deploy Check'));\n output.log(\n chalk.dim(\n ` Framework: ${report.framework} | Package Manager: ${report.packageManager ?? 'unknown'}`\n )\n );\n output.newline();\n\n const grouped = {\n error: report.checks.filter((c) => c.severity === 'error'),\n warning: report.checks.filter((c) => c.severity === 'warning'),\n info: report.checks.filter((c) => c.severity === 'info'),\n };\n\n for (const [severity, checks] of Object.entries(grouped)) {\n if (checks.length === 0) continue;\n for (const check of checks) {\n const icon = severityIcon(check.severity);\n output.log(` ${icon} ${check.message}`);\n if (check.fix && severity !== 'info') {\n output.log(chalk.dim(` → ${check.fix}`));\n }\n }\n }\n\n output.newline();\n\n const { errors, warnings } = report.summary;\n const parts: string[] = [];\n if (errors > 0) parts.push(chalk.red(`${errors} errors`));\n if (warnings > 0) parts.push(chalk.yellow(`${warnings} warnings`));\n if (errors === 0 && warnings === 0)\n parts.push(chalk.green('All checks passed'));\n output.log(` ${parts.join(', ')}`);\n\n if (report.deployable) {\n output.newline();\n output.log(\n chalk.green(' Ready to deploy! Run `rush-ai task deploy` to proceed.')\n );\n } else {\n output.newline();\n output.log(chalk.red(' Fix the errors above before deploying.'));\n }\n\n output.newline();\n}\n\nexport function runChecks(projectPath: string): DeployCheckReport {\n const framework = detectFramework(projectPath);\n const packageManager = detectPackageManager(projectPath);\n\n const checks: DeployCheck[] = [\n ...checkPackageJson(projectPath),\n ...checkFramework(projectPath),\n ...checkLockFile(projectPath),\n ...checkPortEnv(projectPath, framework),\n ];\n\n const { checks: dbChecks, info: dbInfo } = checkDatabase(\n projectPath,\n framework\n );\n checks.push(...dbChecks);\n\n const errors = checks.filter((c) => c.severity === 'error').length;\n const warnings = checks.filter((c) => c.severity === 'warning').length;\n const info = checks.filter((c) => c.severity === 'info').length;\n\n return {\n framework,\n packageManager,\n database: dbInfo,\n checks,\n summary: { errors, warnings, info },\n deployable: errors === 0,\n };\n}\n\nexport function registerCheckCommand(program: Command): void {\n program\n .command('check')\n .description('Check if the current project is ready for Rush deployment')\n .option('-p, --path <dir>', 'Project directory to check', '.')\n .action(async (opts: { path: string }) => {\n const projectPath = resolve(opts.path);\n const jsonMode = program.opts().json;\n\n const report = runChecks(projectPath);\n\n if (jsonMode) {\n output.log(JSON.stringify(report, null, 2));\n } else {\n displayResults(report);\n }\n\n if (!report.deployable) {\n process.exit(1);\n }\n });\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { DatabaseInfo, DeployCheck } from '../types.js';\nimport type { FrameworkType } from './framework.js';\n\nconst PLACEHOLDER_PATTERNS = [\n 'your-',\n 'placeholder',\n 'xxx',\n 'example',\n '<',\n '>',\n '${',\n 'todo',\n];\n\nfunction isPlaceholder(value: string): boolean {\n const lower = value.toLowerCase();\n return PLACEHOLDER_PATTERNS.some((p) => lower.includes(p));\n}\n\nfunction parseEnvFile(filePath: string): Record<string, string> {\n if (!existsSync(filePath)) return {};\n try {\n const content = readFileSync(filePath, 'utf-8');\n const vars: Record<string, string> = {};\n for (const line of content.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n const match = trimmed.match(/^([^=]+)=(.*)$/);\n if (match) vars[match[1]] = match[2];\n }\n return vars;\n } catch {\n return {};\n }\n}\n\nexport function checkDatabase(\n projectPath: string,\n framework: FrameworkType\n): { checks: DeployCheck[]; info: DatabaseInfo } {\n const defaultInfo: DatabaseInfo = {\n detected: false,\n type: null,\n autoCreate: false,\n };\n\n if (framework !== 'nextjs') {\n return {\n checks: [],\n info: defaultInfo,\n };\n }\n\n const checks: DeployCheck[] = [];\n const envVars = parseEnvFile(join(projectPath, '.env.local'));\n\n const postgresUrl = envVars.USER_POSTGRESQL_URL;\n if (\n postgresUrl &&\n !isPlaceholder(postgresUrl) &&\n (postgresUrl.startsWith('postgresql://') ||\n postgresUrl.startsWith('postgres://'))\n ) {\n checks.push({\n name: 'database_config',\n severity: 'info',\n message:\n 'Valid PostgreSQL config found in .env.local — Rush will use your existing database',\n });\n return {\n checks,\n info: { detected: true, type: 'postgresql', autoCreate: false },\n };\n }\n\n const supabaseUrl = envVars.SUPABASE_URL;\n const supabaseKey = envVars.SUPABASE_SERVICE_ROLE_KEY || envVars.SUPABASE_KEY;\n if (\n supabaseUrl &&\n supabaseKey &&\n !isPlaceholder(supabaseUrl) &&\n !isPlaceholder(supabaseKey) &&\n supabaseUrl.startsWith('https://') &&\n supabaseKey.length > 20\n ) {\n checks.push({\n name: 'database_config',\n severity: 'info',\n message:\n 'Valid Supabase config found in .env.local — Rush will use your existing database',\n });\n return {\n checks,\n info: { detected: true, type: 'supabase', autoCreate: false },\n };\n }\n\n // Next.js project without valid database config → Rush will auto-create\n const hasPlaceholder =\n (postgresUrl && isPlaceholder(postgresUrl)) ||\n (supabaseUrl && isPlaceholder(supabaseUrl));\n\n if (hasPlaceholder) {\n checks.push({\n name: 'database_config',\n severity: 'warning',\n message:\n 'Database env vars in .env.local contain placeholder values — Rush will auto-create a Supabase database and overwrite them',\n fix: 'Either set real database credentials or remove the placeholder values',\n });\n } else {\n checks.push({\n name: 'database_config',\n severity: 'info',\n message:\n 'No database config detected — Rush will auto-create a Supabase database for this Next.js project',\n });\n }\n\n return {\n checks,\n info: { detected: false, type: null, autoCreate: true },\n };\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { DeployCheck } from '../types.js';\n\nexport type FrameworkType = 'nextjs' | 'vite' | 'unknown';\n\nconst NEXT_CONFIG_FILES = [\n 'next.config.js',\n 'next.config.ts',\n 'next.config.mjs',\n];\n\nconst VITE_CONFIG_FILES = ['vite.config.ts', 'vite.config.js'];\n\nexport function detectFramework(projectPath: string): FrameworkType {\n const pkgPath = join(projectPath, 'package.json');\n if (!existsSync(pkgPath)) return 'unknown';\n\n try {\n const raw = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n const deps = { ...raw.dependencies, ...raw.devDependencies };\n if (deps.next) return 'nextjs';\n if (\n deps.vite ||\n VITE_CONFIG_FILES.some((f) => existsSync(join(projectPath, f)))\n ) {\n return 'vite';\n }\n return 'unknown';\n } catch {\n return 'unknown';\n }\n}\n\nexport function checkFramework(projectPath: string): DeployCheck[] {\n const checks: DeployCheck[] = [];\n const framework = detectFramework(projectPath);\n\n checks.push({\n name: 'framework_detected',\n severity: 'info',\n message: `Detected framework: ${framework}`,\n });\n\n if (framework === 'nextjs') {\n const hasConfig = NEXT_CONFIG_FILES.some((f) =>\n existsSync(join(projectPath, f))\n );\n if (!hasConfig) {\n checks.push({\n name: 'config_file',\n severity: 'warning',\n message: 'No next.config.js/ts/mjs found',\n fix: 'Create a next.config.js file',\n });\n }\n } else if (framework === 'vite') {\n const hasConfig = VITE_CONFIG_FILES.some((f) =>\n existsSync(join(projectPath, f))\n );\n if (hasConfig) {\n checks.push({\n name: 'config_file',\n severity: 'info',\n message: 'Vite config file found',\n });\n }\n\n if (existsSync(join(projectPath, 'index.html'))) {\n checks.push({\n name: 'index_html',\n severity: 'info',\n message: 'index.html found (Vite entry point)',\n });\n } else {\n checks.push({\n name: 'index_html',\n severity: 'warning',\n message:\n 'index.html not found — Vite projects typically need this as entry point',\n fix: 'Create an index.html at the project root',\n });\n }\n }\n\n return checks;\n}\n","import { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { DeployCheck } from '../types.js';\n\nexport type PackageManagerType = 'pnpm' | 'yarn' | 'npm' | null;\n\nexport function detectPackageManager(projectPath: string): PackageManagerType {\n if (existsSync(join(projectPath, 'pnpm-lock.yaml'))) return 'pnpm';\n if (existsSync(join(projectPath, 'yarn.lock'))) return 'yarn';\n if (existsSync(join(projectPath, 'package-lock.json'))) return 'npm';\n return null;\n}\n\nexport function checkLockFile(projectPath: string): DeployCheck[] {\n const checks: DeployCheck[] = [];\n const pm = detectPackageManager(projectPath);\n\n if (pm) {\n checks.push({\n name: 'lock_file_exists',\n severity: 'info',\n message: `Package manager: ${pm}`,\n });\n } else {\n checks.push({\n name: 'lock_file_exists',\n severity: 'warning',\n message:\n 'No lock file found (pnpm-lock.yaml, yarn.lock, or package-lock.json)',\n fix: 'Run `npm install` to generate package-lock.json',\n autoFixable: true,\n });\n }\n\n return checks;\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { DeployCheck } from '../types.js';\n\nexport interface PackageJsonInfo {\n exists: boolean;\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n}\n\nexport function readPackageJson(projectPath: string): PackageJsonInfo {\n const pkgPath = join(projectPath, 'package.json');\n if (!existsSync(pkgPath)) {\n return { exists: false };\n }\n try {\n const raw = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n return {\n exists: true,\n scripts: raw.scripts,\n dependencies: raw.dependencies,\n devDependencies: raw.devDependencies,\n };\n } catch {\n return { exists: false };\n }\n}\n\nexport function checkPackageJson(projectPath: string): DeployCheck[] {\n const checks: DeployCheck[] = [];\n const pkg = readPackageJson(projectPath);\n\n if (!pkg.exists) {\n checks.push({\n name: 'package_json_exists',\n severity: 'error',\n message: 'package.json not found',\n fix: 'Run `npm init -y` to create one',\n });\n return checks;\n }\n\n if (!pkg.scripts?.dev) {\n checks.push({\n name: 'scripts_dev',\n severity: 'error',\n message: 'Missing \"dev\" script in package.json',\n fix: 'Add a dev script (e.g., \"dev\": \"vite\" or \"dev\": \"next dev\")',\n autoFixable: true,\n });\n }\n\n if (!pkg.scripts?.build) {\n checks.push({\n name: 'scripts_build',\n severity: 'warning',\n message:\n 'Missing \"build\" script in package.json — deployment may skip build step',\n fix: 'Add a build script (e.g., \"build\": \"vite build\" or \"build\": \"next build\")',\n autoFixable: true,\n });\n }\n\n if (pkg.scripts?.build) {\n const build = pkg.scripts.build;\n if (/^(?:vue-)?tsc\\s.*&&/.test(build)) {\n checks.push({\n name: 'build_tsc_prefix',\n severity: 'info',\n message: `Build script starts with tsc: \"${build}\" — Rush will auto-strip the tsc check during build`,\n });\n }\n }\n\n return checks;\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { DeployCheck } from '../types.js';\nimport type { FrameworkType } from './framework.js';\n\nconst VITE_CONFIG_FILES = ['vite.config.ts', 'vite.config.js'];\n\nfunction readDevScript(projectPath: string): string | null {\n const pkgPath = join(projectPath, 'package.json');\n if (!existsSync(pkgPath)) return null;\n try {\n const raw = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n return raw.scripts?.dev ?? null;\n } catch {\n return null;\n }\n}\n\nfunction viteConfigReadsPort(projectPath: string): boolean {\n for (const file of VITE_CONFIG_FILES) {\n const filePath = join(projectPath, file);\n if (!existsSync(filePath)) continue;\n try {\n const content = readFileSync(filePath, 'utf-8');\n if (/process\\.env\\.PORT/.test(content)) return true;\n if (/env\\s*\\(\\s*['\"]PORT['\"]\\s*\\)/.test(content)) return true;\n } catch {\n // ignore read errors\n }\n }\n return false;\n}\n\nfunction devScriptReadsPort(devScript: string): boolean {\n if (/\\$PORT|\\$\\{PORT\\}|%PORT%/.test(devScript)) return true;\n if (/--port\\s+\\$/.test(devScript)) return true;\n return false;\n}\n\nexport function checkPortEnv(\n projectPath: string,\n framework: FrameworkType\n): DeployCheck[] {\n const checks: DeployCheck[] = [];\n\n if (framework === 'nextjs') {\n checks.push({\n name: 'port_env',\n severity: 'info',\n message: 'Next.js natively supports PORT env — no config change needed',\n });\n return checks;\n }\n\n if (framework === 'vite') {\n if (viteConfigReadsPort(projectPath)) {\n checks.push({\n name: 'port_env',\n severity: 'info',\n message: 'Vite config reads process.env.PORT',\n });\n return checks;\n }\n\n const devScript = readDevScript(projectPath);\n if (devScript && devScriptReadsPort(devScript)) {\n checks.push({\n name: 'port_env',\n severity: 'info',\n message: 'Dev script references PORT',\n });\n return checks;\n }\n\n checks.push({\n name: 'port_env',\n severity: 'error',\n message:\n 'Vite config does not read process.env.PORT — Rush Pod passes PORT=8000',\n fix: 'Add `server: { port: parseInt(process.env.PORT || \"5173\") }` to vite.config.ts',\n autoFixable: true,\n });\n return checks;\n }\n\n // Unknown framework — check dev script heuristically\n const devScript = readDevScript(projectPath);\n if (devScript && devScriptReadsPort(devScript)) {\n checks.push({\n name: 'port_env',\n severity: 'info',\n message: 'Dev script references PORT',\n });\n } else {\n checks.push({\n name: 'port_env',\n severity: 'error',\n message: 'Dev server must read PORT env var — Rush Pod passes PORT=8000',\n fix: 'Ensure your dev server reads process.env.PORT or accepts --port $PORT',\n autoFixable: false,\n });\n }\n\n return checks;\n}\n","import { existsSync } from 'node:fs';\nimport { appendFile, mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { basename, dirname, join } from 'node:path';\nimport type { Command } from 'commander';\nimport { output } from '../../output/logger.js';\n\nconst MARKER_BEGIN = '###-begin-rush-ai-completion-###';\nconst MARKER_END = '###-end-rush-ai-completion-###';\n\nconst COMPLETION_SCRIPTS: Record<string, string> = {\n bash: `\n${MARKER_BEGIN}\n_rush_cli_completion() {\n local cur=\"\\${COMP_WORDS[COMP_CWORD]}\"\n local prev=\"\\${COMP_WORDS[COMP_CWORD-1]}\"\n local cmds=\"auth agent task mcp plugin completion config doctor\"\n\n case \"$prev\" in\n rush-ai) COMPREPLY=( $(compgen -W \"$cmds\" -- \"$cur\") ) ;;\n auth) COMPREPLY=( $(compgen -W \"login logout status\" -- \"$cur\") ) ;;\n agent) COMPREPLY=( $(compgen -W \"list info\" -- \"$cur\") ) ;;\n task) COMPREPLY=( $(compgen -W \"run create status result list watch cancel\" -- \"$cur\") ) ;;\n plugin) COMPREPLY=( $(compgen -W \"install list status update uninstall\" -- \"$cur\") ) ;;\n completion) COMPREPLY=( $(compgen -W \"install bash zsh fish\" -- \"$cur\") ) ;;\n config) COMPREPLY=( $(compgen -W \"show set use create delete list\" -- \"$cur\") ) ;;\n esac\n}\ncomplete -F _rush_cli_completion rush-ai\n${MARKER_END}`.trimStart(),\n\n zsh: `\n${MARKER_BEGIN}\n_rush_cli_completion() {\n local -a cmds\n cmds=(\n 'auth:Authentication commands'\n 'agent:Agent management'\n 'task:Task operations'\n 'mcp:MCP server'\n 'plugin:Plugin management'\n 'completion:Shell completion'\n 'config:Configuration management'\n 'doctor:System diagnostics'\n )\n _describe 'command' cmds\n}\ncompdef _rush_cli_completion rush-ai\n${MARKER_END}`.trimStart(),\n\n fish: `\n${MARKER_BEGIN}\ncomplete -c rush-ai -n '__fish_use_subcommand' -a auth -d 'Authentication'\ncomplete -c rush-ai -n '__fish_use_subcommand' -a agent -d 'Agent management'\ncomplete -c rush-ai -n '__fish_use_subcommand' -a task -d 'Task operations'\ncomplete -c rush-ai -n '__fish_use_subcommand' -a mcp -d 'MCP server'\ncomplete -c rush-ai -n '__fish_use_subcommand' -a plugin -d 'Plugin management'\ncomplete -c rush-ai -n '__fish_use_subcommand' -a completion -d 'Shell completion'\ncomplete -c rush-ai -n '__fish_use_subcommand' -a config -d 'Configuration management'\ncomplete -c rush-ai -n '__fish_use_subcommand' -a doctor -d 'System diagnostics'\ncomplete -c rush-ai -n '__fish_seen_subcommand_from auth' -a 'login logout status'\ncomplete -c rush-ai -n '__fish_seen_subcommand_from agent' -a 'list info'\ncomplete -c rush-ai -n '__fish_seen_subcommand_from task' -a 'run create status result list watch cancel'\ncomplete -c rush-ai -n '__fish_seen_subcommand_from plugin' -a 'install list status update uninstall'\ncomplete -c rush-ai -n '__fish_seen_subcommand_from completion' -a 'install bash zsh fish'\ncomplete -c rush-ai -n '__fish_seen_subcommand_from config' -a 'show set use create delete list'\n${MARKER_END}`.trimStart(),\n};\n\nfunction detectShell(): string | null {\n const shell = process.env.SHELL;\n if (!shell) return null;\n const name = basename(shell);\n return COMPLETION_SCRIPTS[name] ? name : null;\n}\n\nfunction getShellRcFile(shell: string): string {\n const home = homedir();\n switch (shell) {\n case 'bash':\n return existsSync(join(home, '.bashrc'))\n ? join(home, '.bashrc')\n : join(home, '.bash_profile');\n case 'zsh':\n return join(home, '.zshrc');\n case 'fish':\n return join(home, '.config', 'fish', 'completions', 'rush-ai.fish');\n default:\n throw new Error(`Unsupported shell: ${shell}`);\n }\n}\n\nexport function registerCompletionCommand(program: Command): void {\n const completion = program\n .command('completion')\n .description('Shell completion utilities');\n\n // Print completion script to stdout\n completion\n .command('bash')\n .description('Print bash completion script')\n .action(() => {\n output.log(COMPLETION_SCRIPTS.bash);\n });\n\n completion\n .command('zsh')\n .description('Print zsh completion script')\n .action(() => {\n output.log(COMPLETION_SCRIPTS.zsh);\n });\n\n completion\n .command('fish')\n .description('Print fish completion script')\n .action(() => {\n output.log(COMPLETION_SCRIPTS.fish);\n });\n\n // Auto-install subcommand\n completion\n .command('install')\n .description('Auto-install shell completion to your shell rc file')\n .option('--shell <shell>', 'Shell type (auto-detect if omitted)')\n .action(async (opts: { shell?: string }) => {\n const shell = opts.shell ?? detectShell();\n if (!shell) {\n output.error('Could not detect shell. Use --shell <bash|zsh|fish>.');\n process.exit(1);\n }\n\n if (!COMPLETION_SCRIPTS[shell]) {\n output.error(\n `Unsupported shell: ${shell}. Supported: bash, zsh, fish.`\n );\n process.exit(1);\n }\n\n const script = COMPLETION_SCRIPTS[shell];\n const rcFile = getShellRcFile(shell);\n\n // Fish: write standalone completion file\n if (shell === 'fish') {\n try {\n await mkdir(dirname(rcFile), { recursive: true });\n await writeFile(rcFile, script + '\\n');\n output.success(`Fish completion installed to ${rcFile}`);\n } catch {\n output.error(`Failed to write to ${rcFile}`);\n output.dim(\n ' You can manually add the following to your fish completions:'\n );\n output.log(script);\n }\n return;\n }\n\n // Bash/Zsh: append to rc file (idempotent)\n try {\n const existing = await readFile(rcFile, 'utf-8');\n if (existing.includes(MARKER_BEGIN)) {\n output.info(`Completion already installed in ${rcFile}`);\n return;\n }\n } catch {\n // File doesn't exist — will be created by appendFile\n }\n\n try {\n await appendFile(rcFile, '\\n' + script + '\\n');\n output.success(`Completion installed to ${rcFile}`);\n output.dim(\n ` Run \\`source ${rcFile}\\` or restart your shell to activate.`\n );\n } catch {\n output.error(`Failed to write to ${rcFile}`);\n output.dim(\n ' You can manually add the following to your shell rc file:'\n );\n output.log(script);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { formatTable } from '../../output/format.js';\nimport { output } from '../../output/logger.js';\nimport {\n createProfile,\n deleteProfile,\n getActiveProfile,\n getAuthConfig,\n getConfigDir,\n getGlobalConfig,\n getProfileAuth,\n getProfileConfig,\n listProfiles,\n setActiveProfile,\n setGlobalConfig,\n} from '../../util/config.js';\n\nconst SETTABLE_KEYS = ['api', 'collectMetrics', 'currentTeam'] as const;\ntype SettableKey = (typeof SETTABLE_KEYS)[number];\n\nfunction maskToken(token: string | null): string {\n if (!token) return '(none)';\n if (token.length <= 8) return '****';\n return `${token.slice(0, 4)}...****`;\n}\n\nexport function registerConfigCommand(program: Command): void {\n const config = program\n .command('config')\n .description('Manage CLI configuration and profiles');\n\n config\n .command('show')\n .description('Show current configuration')\n .action(() => {\n const jsonMode = program.opts().json;\n const profile = getActiveProfile();\n const globalConf = getGlobalConfig();\n const authConf = getAuthConfig();\n const configDir = getConfigDir();\n\n const apiOverride = process.env.RUSH_API_URL;\n const profileOverride = process.env.RUSH_PROFILE;\n\n if (jsonMode) {\n output.log(\n JSON.stringify(\n {\n profile,\n api: apiOverride ?? globalConf.api,\n apiOverridden: Boolean(apiOverride),\n profileOverridden: Boolean(profileOverride),\n authMethod: authConf.method,\n collectMetrics: globalConf.collectMetrics,\n currentTeam: globalConf.currentTeam,\n configDir,\n },\n null,\n 2\n )\n );\n return;\n }\n\n output.log(output.bold('Configuration'));\n output.newline();\n\n const profileLabel = profileOverride\n ? `${profile} (overridden by RUSH_PROFILE env)`\n : profile;\n output.log(` Active profile: ${profileLabel}`);\n\n const apiLabel = apiOverride\n ? `${apiOverride} (overridden by RUSH_API_URL env)`\n : globalConf.api;\n output.log(` API: ${apiLabel}`);\n\n output.log(\n ` Auth method: ${authConf.method ?? '(not authenticated)'}`\n );\n output.log(` Token: ${maskToken(authConf.token)}`);\n output.log(\n ` Metrics: ${globalConf.collectMetrics ? 'enabled' : 'disabled'}`\n );\n output.log(` Config dir: ${configDir}`);\n });\n\n config\n .command('set')\n .description('Set a configuration value')\n .argument('<key>', `Config key (${SETTABLE_KEYS.join(', ')})`)\n .argument('<value>', 'Config value')\n .action((key: string, value: string) => {\n const jsonMode = program.opts().json;\n const profile = getActiveProfile();\n\n if (!SETTABLE_KEYS.includes(key as SettableKey)) {\n output.error(\n `Unknown config key '${key}'. Valid keys: ${SETTABLE_KEYS.join(', ')}`\n );\n process.exit(1);\n }\n\n let typedValue: unknown = value;\n\n if (key === 'collectMetrics') {\n if (value !== 'true' && value !== 'false') {\n output.error(\"'collectMetrics' must be 'true' or 'false'.\");\n process.exit(1);\n }\n typedValue = value === 'true';\n }\n\n if (key === 'currentTeam' && value === 'null') {\n typedValue = null;\n }\n\n setGlobalConfig({ [key]: typedValue });\n\n if (jsonMode) {\n output.log(JSON.stringify({ key, value: typedValue, profile }));\n } else {\n output.success(\n `Updated '${key}' to '${String(typedValue)}' (profile: ${profile})`\n );\n }\n });\n\n config\n .command('use')\n .description('Switch active profile')\n .argument('<profile>', 'Profile name to switch to')\n .action((profileName: string) => {\n const jsonMode = program.opts().json;\n\n try {\n setActiveProfile(profileName);\n } catch (err) {\n output.error(\n err instanceof Error ? err.message : 'Failed to switch profile'\n );\n const available = listProfiles();\n if (!jsonMode) {\n output.dim(`Available profiles: ${available.join(', ')}`);\n output.dim(\n `Run \\`rush-ai config create ${profileName}\\` to create it.`\n );\n }\n process.exit(1);\n }\n\n const globalConf = getGlobalConfig();\n\n if (jsonMode) {\n output.log(\n JSON.stringify({\n profile: profileName,\n api: globalConf.api,\n })\n );\n } else {\n output.success(`Switched to profile '${profileName}'`);\n output.dim(`API: ${globalConf.api}`);\n }\n });\n\n config\n .command('create')\n .description('Create a new profile')\n .argument('<profile>', 'Profile name')\n .option('--api <url>', 'API base URL')\n .action((profileName: string, options: { api?: string }) => {\n const jsonMode = program.opts().json;\n\n try {\n createProfile(\n profileName,\n options.api ? { api: options.api } : undefined\n );\n } catch (err) {\n output.error(\n err instanceof Error ? err.message : 'Failed to create profile'\n );\n process.exit(1);\n }\n\n if (jsonMode) {\n output.log(JSON.stringify({ profile: profileName, created: true }));\n } else {\n output.success(`Created profile '${profileName}'`);\n output.dim(\n `Run \\`rush-ai config use ${profileName}\\` to switch to it.`\n );\n }\n });\n\n config\n .command('delete')\n .description('Delete a profile')\n .argument('<profile>', 'Profile name to delete')\n .action((profileName: string) => {\n const jsonMode = program.opts().json;\n\n try {\n deleteProfile(profileName);\n } catch (err) {\n output.error(\n err instanceof Error ? err.message : 'Failed to delete profile'\n );\n process.exit(1);\n }\n\n if (jsonMode) {\n output.log(JSON.stringify({ profile: profileName, deleted: true }));\n } else {\n output.success(`Deleted profile '${profileName}'`);\n }\n });\n\n config\n .command('list')\n .alias('ls')\n .description('List all profiles')\n .action(() => {\n const jsonMode = program.opts().json;\n const profiles = listProfiles();\n const active = getActiveProfile();\n\n if (jsonMode) {\n const data = profiles.map((name) => {\n const conf = getProfileConfig(name);\n const auth = getProfileAuth(name);\n return {\n name,\n active: name === active,\n api: conf?.api ?? '',\n authMethod: auth.method,\n loggedIn: Boolean(auth.token),\n };\n });\n output.log(JSON.stringify(data, null, 2));\n return;\n }\n\n if (profiles.length === 0) {\n output.info('No profiles configured.');\n return;\n }\n\n const rows = profiles.map((name) => {\n const conf = getProfileConfig(name);\n const auth = getProfileAuth(name);\n const marker = name === active ? '*' : ' ';\n const authStatus = auth.token\n ? `${auth.method ?? 'unknown'} (logged in)`\n : 'not authenticated';\n return {\n ' ': marker,\n Profile: name,\n API: conf?.api ?? '',\n Auth: authStatus,\n };\n });\n\n output.log(formatTable(rows));\n });\n}\n","import chalk from 'chalk';\nimport type { Command } from 'commander';\nimport { output } from '../../output/logger.js';\nimport { checkAuth } from './checks/auth.js';\nimport { checkConfig } from './checks/config.js';\nimport { checkConnectivity } from './checks/connectivity.js';\nimport { checkEnvironment } from './checks/environment.js';\nimport { checkPlugins } from './checks/plugins.js';\nimport type { CheckRunner, DoctorCheck } from './types.js';\n\nconst CHECK_RUNNERS: CheckRunner[] = [\n checkEnvironment,\n checkAuth,\n checkConnectivity,\n checkConfig,\n checkPlugins,\n];\n\nasync function runAllChecks(): Promise<DoctorCheck[]> {\n const checks: DoctorCheck[] = [];\n for (const runner of CHECK_RUNNERS) {\n try {\n const results = await runner();\n checks.push(...results);\n } catch (err) {\n // Isolate runner failures so remaining checks still run\n checks.push({\n name: 'runner_error',\n group: 'Environment',\n status: 'fail',\n label: 'Check error',\n value: `A check group failed: ${err instanceof Error ? err.message : 'unknown error'}`,\n });\n }\n }\n return checks;\n}\n\nfunction getSummary(checks: DoctorCheck[]): {\n pass: number;\n warn: number;\n fail: number;\n} {\n let pass = 0;\n let warn = 0;\n let fail = 0;\n for (const c of checks) {\n if (c.status === 'pass') pass++;\n else if (c.status === 'warn') warn++;\n else if (c.status === 'fail') fail++;\n // info is excluded from summary\n }\n return { pass, warn, fail };\n}\n\nfunction statusIcon(status: DoctorCheck['status']): string {\n switch (status) {\n case 'pass':\n return chalk.green('✓');\n case 'warn':\n return chalk.yellow('!');\n case 'fail':\n return chalk.red('✗');\n case 'info':\n return chalk.dim('·');\n }\n}\n\nconst LABEL_WIDTH = 20;\n\nfunction displayResults(checks: DoctorCheck[]): void {\n // Group checks\n const groups = new Map<string, DoctorCheck[]>();\n for (const check of checks) {\n const existing = groups.get(check.group) ?? [];\n existing.push(check);\n groups.set(check.group, existing);\n }\n\n output.newline();\n\n for (const [groupName, groupChecks] of groups) {\n output.log(` ${chalk.bold(groupName)}`);\n for (const check of groupChecks) {\n const icon = statusIcon(check.status);\n const label = check.label.padEnd(LABEL_WIDTH);\n output.log(` ${icon} ${label} ${check.value}`);\n }\n output.log('');\n }\n\n const summary = getSummary(checks);\n const parts: string[] = [];\n parts.push(chalk.green(`${summary.pass} passed`));\n if (summary.warn > 0) parts.push(chalk.yellow(`${summary.warn} warnings`));\n if (summary.fail > 0) parts.push(chalk.red(`${summary.fail} failed`));\n if (summary.warn === 0 && summary.fail === 0) {\n parts.push('0 warnings');\n parts.push('0 failed');\n }\n output.log(` ${chalk.bold('Summary:')} ${parts.join(', ')}`);\n\n if (summary.fail > 0 || summary.warn > 0) {\n const fixable = checks.filter(\n (c) => c.status !== 'pass' && c.status !== 'info' && c.autoFix\n );\n if (fixable.length > 0) {\n output.log(\n chalk.dim(` Run \\`rush-ai doctor --fix\\` to attempt auto-fixes.`)\n );\n }\n }\n\n output.log('');\n}\n\nfunction outputJson(checks: DoctorCheck[]): void {\n const summary = getSummary(checks);\n const result = {\n checks: checks.map((c) => ({\n name: c.name,\n group: c.group,\n status: c.status,\n label: c.label,\n value: c.value,\n ...(c.fix ? { fix: c.fix } : {}),\n })),\n summary,\n };\n output.log(JSON.stringify(result, null, 2));\n}\n\nasync function runAutoFixes(checks: DoctorCheck[]): Promise<void> {\n const fixable = checks.filter(\n (c) => c.status !== 'pass' && c.status !== 'info' && c.autoFix\n );\n\n if (fixable.length === 0) {\n output.info('No auto-fixable issues found.');\n return;\n }\n\n output.newline();\n for (const check of fixable) {\n output.info(`Fixing: ${check.label}...`);\n try {\n await check.autoFix!();\n output.success(`Fixed: ${check.label}`);\n } catch (err) {\n output.error(\n `Failed to fix ${check.label}: ${err instanceof Error ? err.message : 'unknown error'}`\n );\n }\n }\n output.newline();\n}\n\nexport function registerDoctorCommand(program: Command): void {\n program\n .command('doctor')\n .description('Diagnose environment, auth, and connectivity issues')\n .option('--fix', 'Attempt to auto-fix detected issues')\n .action(async (opts: { fix?: boolean }) => {\n const jsonMode = program.opts().json;\n\n let checks = await runAllChecks();\n\n if (opts.fix) {\n await runAutoFixes(checks);\n // Re-run all checks after fixes\n checks = await runAllChecks();\n }\n\n if (jsonMode) {\n outputJson(checks);\n } else {\n displayResults(checks);\n }\n\n const hasFail = checks.some((c) => c.status === 'fail');\n if (hasFail) {\n process.exit(1);\n }\n });\n}\n","import { getAuthMethod } from '../../../util/auth.js';\nimport { getAuthConfig } from '../../../util/config.js';\nimport type { CheckRunner, DoctorCheck } from '../types.js';\n\nexport const checkAuth: CheckRunner = async () => {\n const checks: DoctorCheck[] = [];\n const method = getAuthMethod();\n\n // Auth method\n if (method === 'platform_token') {\n checks.push({\n name: 'auth_method',\n group: 'Authentication',\n status: 'pass',\n label: 'Auth method',\n value: 'Platform Token (browser login)',\n });\n } else if (method === 'cas') {\n checks.push({\n name: 'auth_method',\n group: 'Authentication',\n status: 'pass',\n label: 'Auth method',\n value: 'CAS PKCE',\n });\n } else if (method === 'api_key') {\n checks.push({\n name: 'auth_method',\n group: 'Authentication',\n status: 'pass',\n label: 'Auth method',\n value: 'API Key',\n });\n } else {\n checks.push({\n name: 'auth_method',\n group: 'Authentication',\n status: 'warn',\n label: 'Auth method',\n value: 'Not authenticated',\n fix: 'Run `rush-ai auth login` to authenticate',\n });\n }\n\n // Token status — depends on auth method\n if (method === 'api_key') {\n checks.push({\n name: 'token_status',\n group: 'Authentication',\n status: 'info',\n label: 'Token status',\n value: 'Using API key auth',\n });\n } else if (method === 'cas' || method === 'platform_token') {\n const auth = getAuthConfig();\n if (auth.token && auth.expiresAt) {\n const remaining = auth.expiresAt - Date.now();\n if (remaining > 0) {\n const hours = Math.floor(remaining / (1000 * 60 * 60));\n const minutes = Math.floor(\n (remaining % (1000 * 60 * 60)) / (1000 * 60)\n );\n const timeStr = hours > 0 ? `${hours}h ${minutes}m` : `${minutes}m`;\n checks.push({\n name: 'token_status',\n group: 'Authentication',\n status: 'pass',\n label: 'Token status',\n value: `Valid (expires in ${timeStr})`,\n });\n } else {\n checks.push({\n name: 'token_status',\n group: 'Authentication',\n status: 'warn',\n label: 'Token status',\n value: 'Expired',\n fix: 'Run `rush-ai auth login` to re-authenticate',\n });\n }\n } else if (auth.token) {\n // Token exists but no expiry info\n checks.push({\n name: 'token_status',\n group: 'Authentication',\n status: 'pass',\n label: 'Token status',\n value: 'Valid (no expiry set)',\n });\n } else {\n checks.push({\n name: 'token_status',\n group: 'Authentication',\n status: 'warn',\n label: 'Token status',\n value: 'No token found',\n fix: 'Run `rush-ai auth login` to authenticate',\n });\n }\n } else {\n // Not authenticated\n checks.push({\n name: 'token_status',\n group: 'Authentication',\n status: 'warn',\n label: 'Token status',\n value: 'Not authenticated',\n fix: 'Run `rush-ai auth login` to authenticate',\n });\n }\n\n // API Key env\n const apiKey = process.env.RUSH_API_KEY;\n checks.push({\n name: 'api_key',\n group: 'Authentication',\n status: 'info',\n label: 'API Key',\n value: apiKey ? 'Set (RUSH_API_KEY)' : 'Not set',\n });\n\n return checks;\n};\n","import { accessSync, constants, existsSync, mkdirSync } from 'node:fs';\nimport {\n getAuthConfig,\n getConfigDir,\n getGlobalConfig,\n} from '../../../util/config.js';\nimport type { CheckRunner, DoctorCheck } from '../types.js';\n\nexport const checkConfig: CheckRunner = async () => {\n const checks: DoctorCheck[] = [];\n const configDir = getConfigDir();\n\n // Config directory existence + writability\n const dirExists = existsSync(configDir);\n let writable = false;\n if (dirExists) {\n try {\n accessSync(configDir, constants.W_OK);\n writable = true;\n } catch {\n // not writable\n }\n }\n\n if (dirExists && writable) {\n checks.push({\n name: 'config_dir',\n group: 'Configuration',\n status: 'pass',\n label: 'Config directory',\n value: configDir,\n });\n } else if (dirExists && !writable) {\n checks.push({\n name: 'config_dir',\n group: 'Configuration',\n status: 'fail',\n label: 'Config directory',\n value: `${configDir} (not writable)`,\n fix: `Check permissions on ${configDir}`,\n });\n } else {\n checks.push({\n name: 'config_dir',\n group: 'Configuration',\n status: 'fail',\n label: 'Config directory',\n value: `${configDir} (not found)`,\n fix: `Run \\`rush-ai doctor --fix\\` to create it`,\n autoFix: async () => {\n mkdirSync(configDir, { recursive: true });\n },\n });\n }\n\n // Config files validity\n try {\n getGlobalConfig();\n getAuthConfig();\n checks.push({\n name: 'config_validity',\n group: 'Configuration',\n status: 'pass',\n label: 'Config files',\n value: 'Valid',\n });\n } catch (err) {\n checks.push({\n name: 'config_validity',\n group: 'Configuration',\n status: 'fail',\n label: 'Config files',\n value: `Error: ${err instanceof Error ? err.message : 'unknown'}`,\n fix: 'Check config files in ' + configDir,\n });\n }\n\n // API URL\n try {\n const config = getGlobalConfig();\n checks.push({\n name: 'api_url',\n group: 'Configuration',\n status: 'info',\n label: 'API URL',\n value: config.api,\n });\n } catch {\n checks.push({\n name: 'api_url',\n group: 'Configuration',\n status: 'warn',\n label: 'API URL',\n value: 'Unable to read',\n });\n }\n\n return checks;\n};\n","import { getGlobalConfig } from '../../../util/config.js';\nimport type { CheckRunner, DoctorCheck } from '../types.js';\n\nexport const checkConnectivity: CheckRunner = async () => {\n const checks: DoctorCheck[] = [];\n const config = getGlobalConfig();\n const apiUrl = process.env.RUSH_API_URL ?? config.api;\n\n // API endpoint — raw fetch without auth, measure RTT\n try {\n const start = Date.now();\n const response = await fetch(apiUrl, {\n method: 'HEAD',\n signal: AbortSignal.timeout(5000),\n });\n const rtt = Date.now() - start;\n\n // Any HTTP response (even 401/403) means the server is reachable\n checks.push({\n name: 'api_endpoint',\n group: 'Connectivity',\n status: 'pass',\n label: 'API endpoint',\n value: `${apiUrl} (${rtt}ms, HTTP ${response.status})`,\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Unknown error';\n const isTimeout = message.includes('timeout') || message.includes('abort');\n checks.push({\n name: 'api_endpoint',\n group: 'Connectivity',\n status: 'fail',\n label: 'API endpoint',\n value: isTimeout\n ? `${apiUrl} (timeout after 5s)`\n : `${apiUrl} (${message})`,\n fix: 'Check your network connection and API URL in config',\n });\n }\n\n // Proxy environment variables\n const httpProxy = process.env.HTTP_PROXY || process.env.http_proxy;\n const httpsProxy = process.env.HTTPS_PROXY || process.env.https_proxy;\n\n if (httpProxy || httpsProxy) {\n const parts: string[] = [];\n if (httpProxy) parts.push(`HTTP_PROXY=${maskUrl(httpProxy)}`);\n if (httpsProxy) parts.push(`HTTPS_PROXY=${maskUrl(httpsProxy)}`);\n checks.push({\n name: 'proxy',\n group: 'Connectivity',\n status: 'info',\n label: 'Proxy',\n value: parts.join(', '),\n });\n } else {\n checks.push({\n name: 'proxy',\n group: 'Connectivity',\n status: 'info',\n label: 'Proxy',\n value: 'Not configured',\n });\n }\n\n return checks;\n};\n\n/** Mask proxy URL credentials: http://user:pass@host → http://***@host */\nfunction maskUrl(url: string): string {\n try {\n const parsed = new URL(url);\n if (parsed.username || parsed.password) {\n parsed.username = '***';\n parsed.password = '';\n return parsed.toString().replace(/\\/$/, '');\n }\n // URL parsed but no standard credentials detected — check for @ in raw string\n // (non-standard schemes like `foo:user@host` won't expose username/password)\n if (url.includes('@')) {\n return url.replace(/[^/@]+@/, '***@');\n }\n return parsed.toString().replace(/\\/$/, '');\n } catch {\n // If URL parsing fails, strip anything that looks like credentials\n if (url.includes('@')) {\n return url.replace(/[^/@]+@/, '***@');\n }\n return url;\n }\n}\n","import { execFileSync } from 'node:child_process';\nimport { arch, platform, release, type } from 'node:os';\nimport { VERSION } from '../../../version.js';\nimport type { CheckRunner, DoctorCheck } from '../types.js';\n\nfunction formatOS(): string {\n const p = platform();\n const r = release();\n const a = arch();\n\n let osName: string;\n switch (p) {\n case 'darwin':\n osName = 'macOS';\n break;\n case 'win32':\n osName = 'Windows';\n break;\n case 'linux':\n osName = 'Linux';\n break;\n default:\n osName = type();\n }\n\n return `${osName} ${r} (${p} ${a})`;\n}\n\nconst KNOWN_SHELLS = ['bash', 'zsh', 'fish', 'sh', 'dash', 'ksh', 'tcsh'];\n\nfunction detectShell(): { name: string; version: string | null } {\n const shell = process.env.SHELL;\n if (!shell) {\n return { name: 'unknown', version: null };\n }\n\n const name = shell.split('/').pop() ?? shell;\n\n // Only execute known shells to avoid running arbitrary binaries\n if (!KNOWN_SHELLS.includes(name)) {\n return { name, version: null };\n }\n\n let version: string | null = null;\n\n try {\n const raw = execFileSync(shell, ['--version'], {\n timeout: 3000,\n stdio: ['pipe', 'pipe', 'pipe'],\n encoding: 'utf-8',\n });\n // Extract first line, try to find version number\n const firstLine = raw.split('\\n')[0] ?? '';\n const match = firstLine.match(/(\\d+\\.\\d+[\\d.]*)/);\n version = match?.[1] ?? null;\n } catch {\n // Some shells (e.g. fish) use --version differently, or may fail\n }\n\n return { name, version };\n}\n\nexport const checkEnvironment: CheckRunner = async () => {\n const checks: DoctorCheck[] = [];\n\n // CLI version\n checks.push({\n name: 'cli_version',\n group: 'Environment',\n status: 'info',\n label: 'CLI version',\n value: VERSION,\n });\n\n // Node.js version\n const nodeVersion = process.version;\n const major = parseInt(nodeVersion.slice(1), 10);\n const nodeOk = major >= 18;\n checks.push({\n name: 'node_version',\n group: 'Environment',\n status: nodeOk ? 'pass' : 'fail',\n label: 'Node.js version',\n value: `${nodeVersion}${nodeOk ? '' : ' (>=18.0.0 required)'}`,\n fix: nodeOk ? undefined : 'Upgrade Node.js to version 18 or higher',\n });\n\n // OS\n checks.push({\n name: 'os',\n group: 'Environment',\n status: 'info',\n label: 'OS',\n value: formatOS(),\n });\n\n // Shell\n const shell = detectShell();\n const shellValue =\n shell.name === 'unknown'\n ? 'Unknown'\n : shell.version\n ? `${shell.name} ${shell.version}`\n : shell.name;\n checks.push({\n name: 'shell',\n group: 'Environment',\n status: shell.name === 'unknown' ? 'warn' : 'pass',\n label: 'Shell',\n value: shellValue,\n });\n\n // Terminal\n const terminal = process.env.TERM_PROGRAM ?? 'Unknown';\n checks.push({\n name: 'terminal',\n group: 'Environment',\n status: 'info',\n label: 'Terminal',\n value: terminal,\n });\n\n return checks;\n};\n","import { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { resolve } from 'node:path';\nimport { getGlobalConfig } from '../../../util/config.js';\nimport type { CheckRunner, DoctorCheck } from '../types.js';\n\ninterface PluginManifest {\n name: string;\n version: string;\n type: 'claude-code' | 'cursor';\n installedAt: string;\n}\n\ninterface InstalledPlugins {\n plugins: Record<string, PluginManifest>;\n}\n\nconst PLUGINS_FILE = resolve(homedir(), '.rush', 'plugins', 'installed.json');\n\n/** Map plugin type to its MCP config file path */\nconst MCP_CONFIG_PATHS: Record<string, string> = {\n 'claude-code': resolve(homedir(), '.claude', 'settings.json'),\n cursor: resolve(homedir(), '.cursor', 'mcp.json'),\n};\n\nfunction safeReadJson<T>(filePath: string, fallback: T): T {\n if (!existsSync(filePath)) return fallback;\n try {\n return JSON.parse(readFileSync(filePath, 'utf-8')) as T;\n } catch {\n return fallback;\n }\n}\n\nfunction injectMcpConfig(configPath: string): void {\n const config = safeReadJson<Record<string, unknown>>(configPath, {});\n const mcpServers = (config.mcpServers ?? {}) as Record<string, unknown>;\n const globalConfig = getGlobalConfig();\n\n mcpServers.rush = {\n command: 'rush-ai',\n args: ['mcp', 'serve'],\n env: {\n RUSH_API_URL: globalConfig.api,\n },\n };\n config.mcpServers = mcpServers;\n writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf-8');\n}\n\nfunction checkMcpForPlugin(\n name: string,\n manifest: PluginManifest\n): DoctorCheck {\n const configPath = MCP_CONFIG_PATHS[manifest.type];\n if (!configPath) {\n return {\n name: `plugin_${name}`,\n group: 'Plugins',\n status: 'warn',\n label: name,\n value: `Installed (v${manifest.version}), unknown type: ${manifest.type}`,\n };\n }\n\n if (!existsSync(configPath)) {\n return {\n name: `plugin_${name}`,\n group: 'Plugins',\n status: 'warn',\n label: name,\n value: `Installed, MCP config missing (${configPath})`,\n fix: `Run \\`rush-ai plugin install ${name}\\``,\n autoFix: async () => {\n injectMcpConfig(configPath);\n },\n };\n }\n\n try {\n const config = JSON.parse(readFileSync(configPath, 'utf-8'));\n const servers = config.mcpServers as Record<string, unknown> | undefined;\n\n if (!servers || !('rush' in servers)) {\n return {\n name: `plugin_${name}`,\n group: 'Plugins',\n status: 'warn',\n label: name,\n value: 'Installed, MCP server not configured',\n fix: `Run \\`rush-ai doctor --fix\\` to inject MCP config`,\n autoFix: async () => {\n injectMcpConfig(configPath);\n },\n };\n }\n\n const rushServer = servers.rush as Record<string, unknown>;\n const command = rushServer?.command as string | undefined;\n\n if (command !== 'rush-ai') {\n return {\n name: `plugin_${name}`,\n group: 'Plugins',\n status: 'warn',\n label: name,\n value: `Installed, MCP command is \"${command}\" (expected \"rush-ai\")`,\n fix: `Run \\`rush-ai plugin update ${name}\\``,\n };\n }\n\n return {\n name: `plugin_${name}`,\n group: 'Plugins',\n status: 'pass',\n label: name,\n value: `Installed (v${manifest.version}), MCP config valid`,\n };\n } catch {\n return {\n name: `plugin_${name}`,\n group: 'Plugins',\n status: 'warn',\n label: name,\n value: `Installed, failed to parse MCP config`,\n fix: `Check ${configPath} for JSON syntax errors`,\n };\n }\n}\n\nexport const checkPlugins: CheckRunner = async () => {\n const data = safeReadJson<InstalledPlugins>(PLUGINS_FILE, { plugins: {} });\n const plugins =\n data &&\n typeof data === 'object' &&\n data.plugins &&\n typeof data.plugins === 'object'\n ? data.plugins\n : {};\n const entries = Object.entries(plugins);\n\n if (entries.length === 0) {\n return [\n {\n name: 'plugins_none',\n group: 'Plugins',\n status: 'info',\n label: 'Plugins',\n value: 'No plugins installed',\n },\n ];\n }\n\n return entries.map(([name, manifest]) => checkMcpForPlugin(name, manifest));\n};\n","import type { Command } from 'commander';\nimport { formatOutput, resolveFormat } from '../../output/format.js';\nimport { output } from '../../output/logger.js';\nimport { createClient } from '../../util/client.js';\nimport { ApiError } from '../../util/errors.js';\nimport { requireAuth } from '../../util/require-auth.js';\n\n/** MCP server as returned by GET /api/mcp-registry */\nexport interface McpServer {\n id: string;\n name: string;\n displayName: string;\n description: string;\n transportType: string;\n category: string;\n tags: string[];\n author: string;\n tools: Array<{ name: string; description: string }> | null;\n validationStatus: {\n status: string;\n errorCode?: string;\n errorMessage?: string;\n lastCheckedAt?: string;\n } | null;\n visibility: string;\n starCount: number;\n isBuiltin: boolean;\n}\n\n/** GET /api/mcp-registry response */\ninterface McpListApiResponse {\n success: boolean;\n data: McpServer[];\n meta?: {\n pagination?: {\n currentPage: number;\n totalPages: number;\n totalItems: number;\n itemsPerPage: number;\n hasNext: boolean;\n hasPrevious: boolean;\n };\n };\n}\n\n/** GET /api/mcp-registry/[id] response */\ninterface McpDetailApiResponse {\n success: boolean;\n data: McpServer;\n}\n\nfunction formatValidationStatus(vs: McpServer['validationStatus']): string {\n if (!vs) return '-';\n switch (vs.status) {\n case 'verified':\n return '✓ verified';\n case 'pending':\n return '… pending';\n case 'credential_required':\n return '⚠ credential required';\n case 'failed':\n return `✗ ${vs.errorCode || 'failed'}`;\n default:\n return vs.status;\n }\n}\n\nfunction truncate(str: string, max: number): string {\n if (str.length <= max) return str;\n return `${str.slice(0, max - 3)}...`;\n}\n\nexport function registerMcpCommand(program: Command): void {\n const mcp = program\n .command('mcp')\n .description('MCP server and platform MCP discovery');\n\n mcp\n .command('serve')\n .description('Start the MCP stdio server')\n .action(async () => {\n const { startMcpServer } = await import('./server.js');\n await startMcpServer();\n });\n\n mcp\n .command('list')\n .alias('ls')\n .description('List available MCP servers on the platform')\n .option('-c, --category <category>', 'Filter by category')\n .option('-t, --tag <tag>', 'Filter by tag')\n .option('-s, --search <query>', 'Search by name or description')\n .option('--transport <type>', 'Filter by transport type (stdio|sse|http)')\n .option(\n '-l, --limit <number>',\n 'Max results per page (default: 50, max: 100)',\n '50'\n )\n .option('-p, --page <number>', 'Page number (default: 1)', '1')\n .action(async (opts) => {\n requireAuth();\n const format = resolveFormat(program.opts());\n const client = createClient();\n\n const params = new URLSearchParams();\n if (opts.category) params.set('category', opts.category);\n if (opts.tag) params.set('tag', opts.tag);\n if (opts.search) params.set('search', opts.search);\n if (opts.transport) params.set('transport', opts.transport);\n const parsedLimit = parseInt(opts.limit, 10);\n params.set(\n 'limit',\n String(\n Math.min(\n Math.max(Number.isFinite(parsedLimit) ? parsedLimit : 50, 1),\n 100\n )\n )\n );\n const parsedPage = parseInt(opts.page, 10);\n params.set(\n 'page',\n String(Math.max(Number.isFinite(parsedPage) ? parsedPage : 1, 1))\n );\n\n const { data } = await client.get<McpListApiResponse>(\n `/api/mcp-registry?${params.toString()}`\n );\n\n const servers = data.data;\n const pagination = data.meta?.pagination;\n\n if (format === 'json') {\n output.log(JSON.stringify(data, null, 2));\n return;\n }\n\n if (servers.length === 0) {\n output.info('No MCP servers found.');\n return;\n }\n\n const totalItems = pagination?.totalItems ?? servers.length;\n output.log(output.bold(`MCP Servers (${totalItems} total):`));\n output.newline();\n\n const rows = servers.map((m) => ({\n ID: m.id,\n 'Display Name': truncate(m.displayName, 30),\n Category: m.category || '-',\n Transport: m.transportType || '-',\n Tools: String(m.tools?.length ?? 0),\n Status: formatValidationStatus(m.validationStatus),\n }));\n\n output.log(\n formatOutput(rows, format, {\n columns: { 'Display Name': { maxWidth: 30 } },\n })\n );\n\n // Show pagination hint if there are more pages\n if (pagination && pagination.hasNext) {\n output.newline();\n output.dim(\n `Page ${pagination.currentPage} of ${pagination.totalPages}. Use --page ${pagination.currentPage + 1} to see more.`\n );\n }\n });\n\n mcp\n .command('list-tools <server-id>')\n .description('List tools provided by an MCP server')\n .action(async (serverId: string) => {\n requireAuth();\n const format = resolveFormat(program.opts());\n const client = createClient();\n\n let data: McpDetailApiResponse;\n try {\n ({ data } = await client.get<McpDetailApiResponse>(\n `/api/mcp-registry/${encodeURIComponent(serverId)}`\n ));\n } catch (err) {\n if (err instanceof ApiError && err.status === 404) {\n output.error(`MCP server '${serverId}' not found.`);\n process.exitCode = 1;\n return;\n }\n throw err;\n }\n\n const server = data.data;\n\n if (format === 'json') {\n output.log(JSON.stringify(server, null, 2));\n return;\n }\n\n // Server summary header\n output.log(output.bold(`${server.displayName} (${server.id})`));\n output.log(` Category: ${server.category || '-'}`);\n output.log(` Transport: ${server.transportType || '-'}`);\n output.log(` Author: ${server.author || '-'}`);\n output.log(\n ` Status: ${formatValidationStatus(server.validationStatus)}`\n );\n output.newline();\n\n const tools = server.tools ?? [];\n if (tools.length === 0) {\n output.info('No tools defined for this MCP server.');\n return;\n }\n\n output.log(output.bold(`Tools (${tools.length}):`));\n output.newline();\n\n const rows = tools.map((t) => ({\n 'Tool Name': t.name || '-',\n Description: truncate(t.description || '', 60),\n }));\n\n output.log(\n formatOutput(rows, format, {\n columns: { Description: { maxWidth: 60 } },\n })\n );\n });\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { resolve } from 'node:path';\nimport chalk from 'chalk';\nimport type { Command } from 'commander';\nimport { formatOutput, resolveFormat } from '../../output/format.js';\nimport { output } from '../../output/logger.js';\nimport { getGlobalConfig } from '../../util/config.js';\nimport { RushError } from '../../util/errors.js';\nimport {\n getAdapter,\n getAdapterDescriptions,\n getAvailableAdapters,\n} from './adapters/index.js';\nimport { installAssets, uninstallAssets } from './assets.js';\nimport { runDoctorChecks } from './doctor.js';\nimport { runPreflightChecks } from './preflight.js';\nimport { runVerification, type VerifyResult } from './verify.js';\n\n// ─── Schema & Migration ────────────────────────────────────────\n\nconst CURRENT_SCHEMA_VERSION = 2;\n\ninterface PluginManifestV2 {\n name: string;\n version: string;\n type: string;\n installedAt: string;\n cli_version: string;\n adapter: string;\n}\n\ninterface InstalledPluginsV2 {\n schema_version: number;\n plugins: Record<string, PluginManifestV2>;\n}\n\nconst PLUGINS_DIR = resolve(homedir(), '.rush', 'plugins');\nconst PLUGINS_FILE = resolve(PLUGINS_DIR, 'installed.json');\n\nfunction safeReadJson<T>(filePath: string, fallback: T): T {\n if (!existsSync(filePath)) return fallback;\n try {\n return JSON.parse(readFileSync(filePath, 'utf-8')) as T;\n } catch {\n return fallback;\n }\n}\n\n/**\n * Load installed plugins with optional automatic schema migration.\n * If the stored schema is older and autoMigrate is true, migrate and write back once.\n * Pass autoMigrate=false for read-only callers (e.g. list, status).\n */\nfunction loadInstalledPlugins(autoMigrate = true): InstalledPluginsV2 {\n const raw = safeReadJson<Record<string, unknown>>(PLUGINS_FILE, {\n plugins: {},\n });\n const schemaVersion = (raw.schema_version as number) ?? 0;\n\n if (schemaVersion < CURRENT_SCHEMA_VERSION) {\n const migrated = migrateInstalledPlugins(raw);\n if (autoMigrate) {\n // One-time write-back to avoid repeated migration\n saveInstalledPlugins(migrated);\n }\n return migrated;\n }\n\n return raw as unknown as InstalledPluginsV2;\n}\n\nfunction saveInstalledPlugins(data: InstalledPluginsV2): void {\n if (!existsSync(PLUGINS_DIR)) {\n mkdirSync(PLUGINS_DIR, { recursive: true });\n }\n writeFileSync(PLUGINS_FILE, JSON.stringify(data, null, 2), 'utf-8');\n}\n\n/**\n * Migrate installed.json from any older schema to CURRENT_SCHEMA_VERSION.\n */\nfunction migrateInstalledPlugins(\n data: Record<string, unknown>\n): InstalledPluginsV2 {\n const result: InstalledPluginsV2 = {\n schema_version: CURRENT_SCHEMA_VERSION,\n plugins: {},\n };\n\n const oldPlugins = (data.plugins ?? {}) as Record<\n string,\n Record<string, unknown>\n >;\n\n for (const [name, manifest] of Object.entries(oldPlugins)) {\n result.plugins[name] = {\n name: (manifest.name as string) ?? name,\n version: (manifest.version as string) ?? '0.1.0',\n type: (manifest.type as string) ?? name,\n installedAt: (manifest.installedAt as string) ?? new Date().toISOString(),\n cli_version: (manifest.cli_version as string) ?? 'unknown',\n adapter:\n (manifest.adapter as string) ??\n (manifest.type === 'claude-code'\n ? 'claude-code'\n : ((manifest.type as string) ?? name)),\n };\n }\n\n return result;\n}\n\n// ─── Plugin Assets Source ──────────────────────────────────────\n\n/**\n * Resolve path to bundled plugin assets.\n * At build time, tsup copies rush-plugin assets to dist/plugin-assets/.\n * At dev time, resolve from the monorepo.\n */\nfunction resolvePluginAssetsDir(): string | null {\n const baseDir = import.meta.dirname ?? __dirname;\n\n if (!baseDir) {\n output.dim(\n ' Warning: Could not resolve plugin assets directory (import.meta.dirname and __dirname are both unavailable)'\n );\n return null;\n }\n\n // 1. Try bundled path (dist/plugin-assets/)\n const bundled = resolve(baseDir, 'plugin-assets');\n if (existsSync(bundled)) return bundled;\n\n // 2. Try monorepo path (../../rush-plugin/)\n const monorepo = resolve(baseDir, '..', '..', '..', '..', 'rush-plugin');\n if (existsSync(monorepo)) return monorepo;\n\n return null;\n}\n\n// ─── CLI Version ───────────────────────────────────────────────\n\nfunction getCliVersion(): string {\n try {\n const pkgPath = resolve(\n import.meta.dirname ?? __dirname,\n '..',\n '..',\n 'package.json'\n );\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n return pkg.version ?? '0.2.0';\n } catch {\n return '0.2.0';\n }\n}\n\n// ─── Command Registration ──────────────────────────────────────\n\nexport function registerPluginCommand(program: Command): void {\n const plugin = program.command('plugin').description('Manage IDE plugins');\n\n // ─── plugin list ───────────────────────────────────────────\n\n plugin\n .command('list')\n .alias('ls')\n .description('List available and installed plugins')\n .action(() => {\n const format = resolveFormat(program.opts());\n const installed = loadInstalledPlugins(false);\n const adapters = getAdapterDescriptions();\n\n const plugins = adapters.map((a) => ({\n name: a.name,\n description: a.description,\n version: a.version,\n installed: a.name in installed.plugins,\n installedVersion: installed.plugins[a.name]?.version ?? null,\n }));\n\n if (format === 'json') {\n output.log(JSON.stringify({ plugins }, null, 2));\n return;\n }\n\n output.log(output.bold('Available plugins:'));\n output.newline();\n\n const rows = plugins.map((p) => ({\n Name: p.name,\n Version: p.version,\n Status: p.installed ? 'installed' : 'available',\n Description: p.description,\n }));\n\n output.log(\n formatOutput(rows, format, {\n columns: { Description: { maxWidth: 60 } },\n })\n );\n });\n\n // ─── plugin install ────────────────────────────────────────\n\n plugin\n .command('install')\n .description('Install a plugin')\n .argument('<name>', `Plugin name (${getAvailableAdapters().join(' | ')})`)\n .option('--force', 'Skip preflight checks and overwrite modified assets')\n .option('--strict-preflight', 'Fail on preflight warnings (for CI)')\n .action(\n async (\n name: string,\n options: { force?: boolean; strictPreflight?: boolean }\n ) => {\n const format = resolveFormat(program.opts());\n const adapter = getAdapter(name);\n\n if (!adapter) {\n throw new RushError(\n `Unknown plugin: ${name}. Available: ${getAvailableAdapters().join(', ')}`\n );\n }\n\n const installed = loadInstalledPlugins();\n if (installed.plugins[name]) {\n if (format === 'json') {\n output.log(JSON.stringify({ status: 'already_installed', name }));\n } else {\n output.warn(`Plugin \"${name}\" is already installed.`);\n output.dim('Use `rush-ai plugin update` to update.');\n }\n return;\n }\n\n // Preflight checks\n if (!options.force) {\n const preflightOk = await runPreflightChecks({\n strict: options.strictPreflight ?? false,\n json: format === 'json',\n });\n if (!preflightOk) {\n output.newline();\n output.dim('Use --force to skip preflight checks.');\n process.exit(1);\n }\n }\n\n // Inject MCP config via adapter\n const config = getGlobalConfig();\n const existing = adapter.readConfig();\n const updated = adapter.injectMcpConfig(existing, config.api);\n adapter.writeConfig(updated);\n output.dim(` MCP config injected into ${adapter.configPath()}`);\n\n // Install plugin assets (SKILL.md, commands/, rules/) — only for claude-code\n const cliVersion = getCliVersion();\n if (name === 'claude-code') {\n const assetsDir = resolvePluginAssetsDir();\n if (assetsDir) {\n installAssets({\n pluginName: name,\n sourceDir: assetsDir,\n cliVersion,\n force: options.force,\n });\n output.dim(' Plugin assets installed');\n }\n }\n\n // Save manifest\n installed.plugins[name] = {\n name,\n version: adapter.version,\n type: name,\n installedAt: new Date().toISOString(),\n cli_version: cliVersion,\n adapter: adapter.name,\n };\n saveInstalledPlugins(installed);\n\n // Post-install verification\n if (format !== 'json') {\n output.newline();\n output.info('Post-install verification...');\n const verifyResults = await runVerification({\n mode: 'install',\n pluginName: name,\n adapter,\n });\n printVerifyResults(verifyResults);\n\n const hasFail = verifyResults.some((r) => r.status === 'fail');\n if (hasFail) {\n output.newline();\n output.warn(\n 'Some checks failed. Plugin is installed but may not work correctly.'\n );\n output.dim('Run `rush-ai plugin doctor` for detailed diagnostics.');\n }\n }\n\n if (format === 'json') {\n output.log(\n JSON.stringify({\n status: 'installed',\n name,\n version: adapter.version,\n })\n );\n } else {\n output.newline();\n output.success(`Plugin \"${name}\" installed.`);\n }\n }\n );\n\n // ─── plugin status ─────────────────────────────────────────\n\n plugin\n .command('status')\n .description('Show plugin status')\n .argument('<name>', 'Plugin name')\n .action((name: string) => {\n const format = resolveFormat(program.opts());\n const installed = loadInstalledPlugins(false);\n const manifest = installed.plugins[name];\n\n if (format === 'json') {\n output.log(\n JSON.stringify(\n manifest\n ? { ...manifest, installed: true }\n : { name, installed: false }\n )\n );\n } else if (manifest) {\n output.log(output.bold(name));\n output.log(` Version: ${manifest.version}`);\n output.log(` Type: ${manifest.type}`);\n output.log(` CLI version: ${manifest.cli_version}`);\n output.log(` Adapter: ${manifest.adapter}`);\n output.log(\n ` Installed: ${new Date(manifest.installedAt).toLocaleString()}`\n );\n } else {\n output.warn(`Plugin \"${name}\" is not installed.`);\n }\n });\n\n // ─── plugin update ─────────────────────────────────────────\n\n plugin\n .command('update')\n .description('Update a plugin')\n .argument('<name>', 'Plugin name')\n .option('--force', 'Overwrite modified assets')\n .action(async (name: string, options: { force?: boolean }) => {\n const format = resolveFormat(program.opts());\n const installed = loadInstalledPlugins();\n const manifest = installed.plugins[name];\n\n if (!manifest) {\n throw new RushError(`Plugin \"${name}\" is not installed.`);\n }\n\n const adapter = getAdapter(name);\n if (!adapter) {\n throw new RushError(`Unknown plugin: ${name}`);\n }\n\n // Re-inject MCP config\n const config = getGlobalConfig();\n const existing = adapter.readConfig();\n const updated = adapter.injectMcpConfig(existing, config.api);\n adapter.writeConfig(updated);\n\n // Re-install assets (only for claude-code)\n const cliVersion = getCliVersion();\n if (name === 'claude-code') {\n const assetsDir = resolvePluginAssetsDir();\n if (assetsDir) {\n installAssets({\n pluginName: name,\n sourceDir: assetsDir,\n cliVersion,\n force: options.force,\n });\n }\n }\n\n installed.plugins[name] = {\n ...manifest,\n version: adapter.version,\n installedAt: new Date().toISOString(),\n cli_version: cliVersion,\n adapter: adapter.name,\n };\n saveInstalledPlugins(installed);\n\n if (format === 'json') {\n output.log(\n JSON.stringify({\n status: 'updated',\n name,\n version: adapter.version,\n })\n );\n } else {\n output.success(`Plugin \"${name}\" updated to v${adapter.version}.`);\n }\n });\n\n // ─── plugin uninstall ──────────────────────────────────────\n\n plugin\n .command('uninstall')\n .description('Uninstall a plugin')\n .argument('<name>', 'Plugin name')\n .action((name: string) => {\n const format = resolveFormat(program.opts());\n const installed = loadInstalledPlugins();\n\n if (!installed.plugins[name]) {\n if (format === 'json') {\n output.log(JSON.stringify({ status: 'not_installed', name }));\n } else {\n output.warn(`Plugin \"${name}\" is not installed.`);\n }\n return;\n }\n\n // Remove MCP config via adapter\n const adapter = getAdapter(name);\n if (adapter) {\n const config = adapter.readConfig();\n const cleaned = adapter.removeMcpConfig(config);\n adapter.writeConfig(cleaned);\n }\n\n // Remove plugin assets\n uninstallAssets(name);\n\n delete installed.plugins[name];\n saveInstalledPlugins(installed);\n\n if (format === 'json') {\n output.log(JSON.stringify({ status: 'uninstalled', name }));\n } else {\n output.success(`Plugin \"${name}\" uninstalled.`);\n }\n });\n\n // ─── plugin doctor ─────────────────────────────────────────\n\n plugin\n .command('doctor')\n .description('Diagnose plugin configuration issues')\n .argument('[name]', 'Plugin name (diagnose specific plugin)')\n .action(async (name?: string) => {\n const format = resolveFormat(program.opts());\n const installed = loadInstalledPlugins();\n\n // Determine which plugins to check\n const pluginNames = name\n ? [name]\n : Object.keys(installed.plugins).length > 0\n ? Object.keys(installed.plugins)\n : getAvailableAdapters();\n\n if (format === 'json') {\n // JSON mode: use unified verify for richer output\n const jsonOutput = [];\n for (const pluginName of pluginNames) {\n const adapter = getAdapter(pluginName);\n if (adapter) {\n const results = await runVerification({\n mode: 'doctor',\n pluginName,\n adapter,\n });\n const summary = { pass: 0, warn: 0, fail: 0 };\n for (const r of results) summary[r.status]++;\n jsonOutput.push({\n plugin: pluginName,\n checks: results.map((r) => ({\n name: r.name,\n stage: r.stage,\n status: r.status,\n detail: r.detail,\n ...(r.fix ? { fix: r.fix } : {}),\n })),\n summary,\n });\n }\n }\n output.log(\n JSON.stringify(\n jsonOutput.length === 1 ? jsonOutput[0] : jsonOutput,\n null,\n 2\n )\n );\n return;\n }\n\n // Human-readable mode: use existing doctor checks + verify\n for (const pluginName of pluginNames) {\n const manifest = installed.plugins[pluginName];\n const adapter = getAdapter(pluginName);\n\n output.log(output.bold(`Plugin Doctor — ${pluginName}`));\n output.newline();\n\n // Run legacy doctor checks for backwards compatibility\n const checks = await runDoctorChecks({\n pluginName,\n manifest: manifest ?? null,\n pluginInfo: adapter\n ? {\n description: adapter.description,\n types: [adapter.name],\n version: adapter.version,\n }\n : null,\n });\n\n let pass = 0;\n let warn = 0;\n let fail = 0;\n\n for (const check of checks) {\n const icon =\n check.status === 'pass'\n ? chalk.green('[PASS]')\n : check.status === 'warn'\n ? chalk.yellow('[WARN]')\n : chalk.red('[FAIL]');\n output.log(` ${icon} ${check.label}: ${check.detail}`);\n if (check.fix) {\n output.dim(` Fix: ${check.fix}`);\n }\n if (check.status === 'pass') pass++;\n else if (check.status === 'warn') warn++;\n else fail++;\n }\n\n output.newline();\n const parts: string[] = [];\n if (pass > 0) parts.push(`${pass} passed`);\n if (warn > 0) parts.push(`${warn} warning${warn > 1 ? 's' : ''}`);\n if (fail > 0) parts.push(`${fail} failed`);\n output.log(parts.join(', '));\n output.newline();\n }\n });\n}\n\n// ─── Helpers ───────────────────────────────────────────────────\n\nfunction printVerifyResults(results: VerifyResult[]): void {\n for (const r of results) {\n const icon =\n r.status === 'pass'\n ? chalk.green('[PASS]')\n : r.status === 'warn'\n ? chalk.yellow('[WARN]')\n : chalk.red('[FAIL]');\n output.log(` ${icon} ${r.label}: ${r.detail}`);\n if (r.fix) {\n output.dim(` Fix: ${r.fix}`);\n }\n }\n}\n","import { existsSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { resolve } from 'node:path';\nimport { BaseJsonAdapter } from './base.js';\n\nexport class ClaudeCodeAdapter extends BaseJsonAdapter {\n readonly name = 'claude-code';\n readonly description =\n 'Claude Code integration (MCP config + SKILL.md + commands)';\n readonly version = '0.2.0';\n\n protected readonly configDir = resolve(homedir(), '.claude');\n protected readonly configFile = 'settings.json';\n\n detect(): boolean {\n return existsSync(this.configDir);\n }\n}\n","import {\n copyFileSync,\n existsSync,\n mkdirSync,\n readFileSync,\n writeFileSync,\n} from 'node:fs';\nimport { resolve } from 'node:path';\nimport type { IdeAdapter } from './types.js';\n\n/**\n * Abstract base class for JSON-file-based IDE adapters.\n * Subclasses must provide configDir and configFile; all\n * shared read/validate/inject/remove/write/configPath logic lives here.\n */\nexport abstract class BaseJsonAdapter implements IdeAdapter {\n abstract readonly name: string;\n abstract readonly description: string;\n abstract readonly version: string;\n\n /** Absolute path to the IDE's config directory (e.g. ~/.claude) */\n protected abstract readonly configDir: string;\n\n /** Config file name relative to configDir (e.g. settings.json) */\n protected abstract readonly configFile: string;\n\n detect(): boolean {\n return existsSync(this.configDir);\n }\n\n readConfig(): Record<string, unknown> {\n const file = this.configPath();\n if (!existsSync(file)) return {};\n try {\n return JSON.parse(readFileSync(file, 'utf-8'));\n } catch (err) {\n throw new Error(\n `Failed to parse ${file}: ${err instanceof Error ? err.message : 'invalid JSON'}`\n );\n }\n }\n\n validateConfig(config: Record<string, unknown>): boolean {\n return (\n config !== null && typeof config === 'object' && !Array.isArray(config)\n );\n }\n\n injectMcpConfig(\n config: Record<string, unknown>,\n apiUrl: string\n ): Record<string, unknown> {\n const mcpServers = (config.mcpServers ?? {}) as Record<string, unknown>;\n mcpServers.rush = {\n command: 'rush-ai',\n args: ['mcp', 'serve'],\n env: {\n RUSH_API_URL: apiUrl,\n },\n };\n return { ...config, mcpServers };\n }\n\n removeMcpConfig(config: Record<string, unknown>): Record<string, unknown> {\n const mcpServers = config.mcpServers as Record<string, unknown> | undefined;\n if (mcpServers && 'rush' in mcpServers) {\n delete mcpServers.rush;\n }\n return config;\n }\n\n writeConfig(config: Record<string, unknown>): void {\n const file = this.configPath();\n if (!existsSync(this.configDir)) {\n mkdirSync(this.configDir, { recursive: true });\n }\n if (existsSync(file)) {\n copyFileSync(file, `${file}.bak`);\n }\n writeFileSync(file, JSON.stringify(config, null, 2), 'utf-8');\n }\n\n configPath(): string {\n return resolve(this.configDir, this.configFile);\n }\n}\n","import { existsSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { resolve } from 'node:path';\nimport { BaseJsonAdapter } from './base.js';\n\nexport class CursorAdapter extends BaseJsonAdapter {\n readonly name = 'cursor';\n readonly description = 'Cursor integration (MCP config)';\n readonly version = '0.2.0';\n\n protected readonly configDir = resolve(homedir(), '.cursor');\n protected readonly configFile = 'mcp.json';\n\n detect(): boolean {\n return existsSync(this.configDir);\n }\n}\n","import { ClaudeCodeAdapter } from './claude-code.js';\nimport { CursorAdapter } from './cursor.js';\nimport type { IdeAdapter } from './types.js';\n\nexport { BaseJsonAdapter } from './base.js';\nexport { ClaudeCodeAdapter } from './claude-code.js';\nexport { CursorAdapter } from './cursor.js';\nexport type { IdeAdapter } from './types.js';\n\n/** Registry of all supported IDE adapters */\nconst ADAPTER_REGISTRY: Record<string, () => IdeAdapter> = {\n 'claude-code': () => new ClaudeCodeAdapter(),\n cursor: () => new CursorAdapter(),\n};\n\n/** Get an adapter instance by plugin name */\nexport function getAdapter(name: string): IdeAdapter | null {\n const factory = ADAPTER_REGISTRY[name];\n return factory ? factory() : null;\n}\n\n/** Get all available adapter names */\nexport function getAvailableAdapters(): string[] {\n return Object.keys(ADAPTER_REGISTRY);\n}\n\n/** Get adapter descriptions for `plugin list` */\nexport function getAdapterDescriptions(): Array<{\n name: string;\n description: string;\n version: string;\n}> {\n return Object.entries(ADAPTER_REGISTRY).map(([name, factory]) => {\n const adapter = factory();\n return {\n name,\n description: adapter.description,\n version: adapter.version,\n };\n });\n}\n","import { createHash } from 'node:crypto';\nimport {\n copyFileSync,\n existsSync,\n lstatSync,\n mkdirSync,\n readdirSync,\n readFileSync,\n readlinkSync,\n rmSync,\n symlinkSync,\n unlinkSync,\n writeFileSync,\n} from 'node:fs';\nimport { homedir } from 'node:os';\nimport { dirname, join, relative, resolve } from 'node:path';\nimport { output } from '../../output/logger.js';\n\n/** Current schema version for asset manifests */\nconst ASSET_SCHEMA_VERSION = 1;\n\nexport interface AssetFileEntry {\n /** Relative path within the plugin assets */\n path: string;\n /** SHA256 checksum of the file content */\n checksum: string;\n /** Absolute path where the file is installed */\n target: string;\n /** Type of installation: file copy or symlink */\n type: 'file' | 'symlink';\n}\n\nexport interface PluginAssetManifest {\n schema_version: number;\n version: string;\n cli_version: string;\n owner: 'rush-ai';\n files: AssetFileEntry[];\n installedAt: string;\n}\n\nconst PLUGINS_BASE = resolve(homedir(), '.rush', 'plugins');\n\nfunction getAssetManifestPath(pluginName: string): string {\n return resolve(PLUGINS_BASE, pluginName, 'asset-manifest.json');\n}\n\nfunction getAssetStorePath(pluginName: string): string {\n return resolve(PLUGINS_BASE, pluginName, 'assets');\n}\n\nfunction computeChecksum(filePath: string): string {\n const content = readFileSync(filePath);\n return createHash('sha256').update(content).digest('hex');\n}\n\n/**\n * Load an existing asset manifest, or null if not found.\n */\nexport function loadAssetManifest(\n pluginName: string\n): PluginAssetManifest | null {\n const manifestPath = getAssetManifestPath(pluginName);\n if (!existsSync(manifestPath)) return null;\n try {\n return JSON.parse(readFileSync(manifestPath, 'utf-8'));\n } catch {\n return null;\n }\n}\n\n/**\n * Install plugin assets from a source directory to the target locations.\n *\n * - Copies files to ~/.rush/plugins/<name>/assets/\n * - Creates symlinks to ~/.claude/skills/<skill-name>/\n * - Writes asset-manifest.json\n */\nexport function installAssets(options: {\n pluginName: string;\n sourceDir: string;\n cliVersion: string;\n force?: boolean;\n}): PluginAssetManifest {\n const { pluginName, sourceDir, cliVersion, force = false } = options;\n const storePath = getAssetStorePath(pluginName);\n const manifestPath = getAssetManifestPath(pluginName);\n\n // Ensure directories\n mkdirSync(storePath, { recursive: true });\n\n const files: AssetFileEntry[] = [];\n const existing = loadAssetManifest(pluginName);\n\n // Collect all files from source directory\n const sourceFiles = collectFiles(sourceDir);\n\n for (const relPath of sourceFiles) {\n const srcFile = resolve(sourceDir, relPath);\n const destFile = resolve(storePath, relPath);\n const newChecksum = computeChecksum(srcFile);\n\n // Check if target already exists and was modified by user\n if (existsSync(destFile) && !force && existing) {\n const existingEntry = existing.files.find((f) => f.path === relPath);\n if (existingEntry) {\n const currentChecksum = computeChecksum(destFile);\n if (\n currentChecksum !== existingEntry.checksum &&\n currentChecksum !== newChecksum\n ) {\n output.warn(\n ` Skipping ${relPath}: modified by user (use --force to overwrite)`\n );\n // Keep existing entry\n files.push({\n ...existingEntry,\n checksum: currentChecksum,\n });\n continue;\n }\n }\n }\n\n // Copy file\n mkdirSync(dirname(destFile), { recursive: true });\n copyFileSync(srcFile, destFile);\n\n files.push({\n path: relPath,\n checksum: newChecksum,\n target: destFile,\n type: 'file',\n });\n }\n\n // Create symlink for SKILL.md → ~/.claude/skills/rush-task/\n const skillTarget = resolve(homedir(), '.claude', 'skills', 'rush-task');\n if (!existsSync(skillTarget)) {\n mkdirSync(dirname(skillTarget), { recursive: true });\n try {\n symlinkSync(storePath, skillTarget, 'dir');\n files.push({\n path: '_symlink_skill',\n checksum: '',\n target: skillTarget,\n type: 'symlink',\n });\n } catch {\n // Symlink might fail on some systems; fall back to info message\n output.dim(\n ` Note: Could not create symlink at ${skillTarget}. You may need to manually link the skill.`\n );\n }\n } else {\n // Check if it's already our symlink (target must point to our store)\n try {\n const stat = lstatSync(skillTarget);\n if (stat.isSymbolicLink()) {\n const linkTarget = readlinkSync(skillTarget);\n if (linkTarget === storePath || resolve(linkTarget) === storePath) {\n files.push({\n path: '_symlink_skill',\n checksum: '',\n target: skillTarget,\n type: 'symlink',\n });\n } else {\n // Symlink exists but points to a different location — conflict\n output.warn(\n ` Skipping symlink at ${skillTarget}: already points to a different location (${linkTarget})`\n );\n }\n } else {\n // Path exists but is not a symlink — conflict\n output.warn(\n ` Skipping symlink at ${skillTarget}: path already exists and is not a symlink`\n );\n }\n } catch {\n // ignore\n }\n }\n\n // Write manifest\n const manifest: PluginAssetManifest = {\n schema_version: ASSET_SCHEMA_VERSION,\n version: options.cliVersion,\n cli_version: cliVersion,\n owner: 'rush-ai',\n files,\n installedAt: new Date().toISOString(),\n };\n\n writeFileSync(manifestPath, JSON.stringify(manifest, null, 2), 'utf-8');\n\n return manifest;\n}\n\n/**\n * Allowed path prefixes for asset deletion.\n * Prevents a tampered manifest from causing out-of-bounds file removal.\n */\nconst ALLOWED_DELETE_PREFIXES = [\n resolve(homedir(), '.rush', 'plugins'),\n resolve(homedir(), '.claude', 'skills'),\n];\n\nfunction isPathAllowed(targetPath: string): boolean {\n const resolved = resolve(targetPath);\n return ALLOWED_DELETE_PREFIXES.some((prefix) =>\n resolved.startsWith(`${prefix}/`)\n );\n}\n\n/**\n * Uninstall plugin assets safely.\n *\n * - Only removes files tracked in the asset manifest\n * - Path whitelist: only allows deletion under ~/.rush/plugins/ and ~/.claude/skills/\n * - For files: verifies checksum before deletion (skip if modified)\n * - For symlinks: only unlinks, doesn't delete target\n */\nexport function uninstallAssets(pluginName: string): void {\n const manifest = loadAssetManifest(pluginName);\n if (!manifest) return;\n\n // Validate manifest owner\n if (manifest.owner !== 'rush-ai') {\n output.warn(\n ` Skipping asset removal: manifest owner \"${manifest.owner}\" is not \"rush-ai\"`\n );\n return;\n }\n\n for (const entry of manifest.files) {\n if (!existsSync(entry.target)) continue;\n\n // Path whitelist check — refuse to delete outside allowed directories\n if (!isPathAllowed(entry.target)) {\n output.warn(\n ` Refusing to delete ${entry.target}: outside allowed directories`\n );\n continue;\n }\n\n if (entry.type === 'symlink') {\n try {\n const stat = lstatSync(entry.target);\n if (stat.isSymbolicLink()) {\n unlinkSync(entry.target);\n }\n } catch {\n // ignore\n }\n } else if (entry.type === 'file') {\n // Only delete if checksum matches (owner check)\n try {\n const currentChecksum = computeChecksum(entry.target);\n if (currentChecksum === entry.checksum) {\n rmSync(entry.target);\n } else {\n output.warn(\n ` Skipping ${entry.path}: file was modified after installation`\n );\n }\n } catch {\n // ignore\n }\n }\n }\n\n // Remove manifest and assets directory if empty\n const manifestPath = getAssetManifestPath(pluginName);\n if (existsSync(manifestPath)) {\n rmSync(manifestPath);\n }\n\n const storePath = getAssetStorePath(pluginName);\n try {\n const remaining = readdirSync(storePath);\n if (remaining.length === 0) {\n rmSync(storePath, { recursive: true });\n }\n } catch {\n // ignore\n }\n}\n\n/**\n * Recursively collect all file paths relative to a directory.\n */\nfunction collectFiles(dir: string, base?: string): string[] {\n const files: string[] = [];\n const baseDir = base ?? dir;\n\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n files.push(...collectFiles(fullPath, baseDir));\n } else if (entry.isFile()) {\n files.push(relative(baseDir, fullPath));\n }\n }\n\n return files;\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport path from 'node:path';\nimport { getAuthToken } from '../../util/auth.js';\nimport { createClient } from '../../util/client.js';\n\nexport interface DoctorCheckResult {\n name: string;\n label: string;\n status: 'pass' | 'warn' | 'fail';\n detail: string;\n fix?: string;\n}\n\ninterface DoctorContext {\n pluginName: string;\n manifest: {\n name: string;\n version: string;\n type: string;\n installedAt: string;\n } | null;\n pluginInfo: { description: string; types: string[]; version: string } | null;\n}\n\nfunction findCliInPath(): string | null {\n const pathDirs = (process.env.PATH || '').split(path.delimiter);\n for (const dir of pathDirs) {\n const candidate = path.join(dir, 'rush-ai');\n if (existsSync(candidate)) return candidate;\n }\n return null;\n}\n\nfunction checkCliInPath(): DoctorCheckResult {\n const found = findCliInPath();\n if (found) {\n return {\n name: 'cli_in_path',\n label: 'CLI in PATH',\n status: 'pass',\n detail: `rush-ai found at ${found}`,\n };\n }\n return {\n name: 'cli_in_path',\n label: 'CLI in PATH',\n status: 'warn',\n detail: 'rush-ai not found in PATH',\n fix: 'Ensure rush-ai is installed globally or add its directory to PATH',\n };\n}\n\nfunction checkAuth(): DoctorCheckResult {\n try {\n const token = getAuthToken();\n if (token) {\n return {\n name: 'auth_status',\n label: 'Authentication',\n status: 'pass',\n detail: 'Authenticated',\n };\n }\n } catch {\n // fall through\n }\n return {\n name: 'auth_status',\n label: 'Authentication',\n status: 'warn',\n detail: 'Not authenticated',\n fix: 'Run `rush-ai auth login` to authenticate',\n };\n}\n\nasync function checkApiConnectivity(): Promise<DoctorCheckResult> {\n try {\n const client = createClient();\n await client.get('/api/agents?limit=1');\n return {\n name: 'api_connectivity',\n label: 'API connectivity',\n status: 'pass',\n detail: 'API is reachable',\n };\n } catch {\n return {\n name: 'api_connectivity',\n label: 'API connectivity',\n status: 'warn',\n detail: 'API is unreachable',\n fix: 'Check your network connection and API URL in ~/.rush/config.json',\n };\n }\n}\n\nfunction checkPluginInstalled(ctx: DoctorContext): DoctorCheckResult {\n if (ctx.manifest) {\n return {\n name: 'plugin_installed',\n label: 'Plugin installed',\n status: 'pass',\n detail: `v${ctx.manifest.version} (installed ${new Date(ctx.manifest.installedAt).toLocaleDateString()})`,\n };\n }\n return {\n name: 'plugin_installed',\n label: 'Plugin installed',\n status: 'fail',\n detail: 'Not installed',\n fix: `Run \\`rush-ai plugin install ${ctx.pluginName}\\``,\n };\n}\n\nfunction checkMcpConfig(ctx: DoctorContext): DoctorCheckResult {\n const type = ctx.manifest?.type ?? ctx.pluginInfo?.types?.[0];\n\n let configPath: string;\n if (type === 'claude-code') {\n configPath = path.resolve(homedir(), '.claude', 'settings.json');\n } else if (type === 'cursor') {\n configPath = path.resolve(homedir(), '.cursor', 'mcp.json');\n } else {\n return {\n name: 'mcp_config',\n label: 'MCP config',\n status: 'warn',\n detail: `Unknown plugin type: ${type}`,\n };\n }\n\n if (!existsSync(configPath)) {\n return {\n name: 'mcp_config',\n label: 'MCP config',\n status: 'fail',\n detail: `Config file not found: ${configPath}`,\n fix: `Run \\`rush-ai plugin install ${ctx.pluginName}\\``,\n };\n }\n\n try {\n const config = JSON.parse(readFileSync(configPath, 'utf-8'));\n const servers = config.mcpServers as Record<string, unknown> | undefined;\n if (servers && 'rush' in servers) {\n const rushServer = servers.rush as Record<string, unknown>;\n const command = rushServer?.command as string | undefined;\n if (command === 'rush-ai') {\n return {\n name: 'mcp_config',\n label: 'MCP config',\n status: 'pass',\n detail: 'rush MCP server configured correctly',\n };\n }\n return {\n name: 'mcp_config',\n label: 'MCP config',\n status: 'warn',\n detail: `rush server configured, but command is \"${command}\" (expected \"rush-ai\")`,\n fix: `Run \\`rush-ai plugin update ${ctx.pluginName}\\``,\n };\n }\n return {\n name: 'mcp_config',\n label: 'MCP config',\n status: 'fail',\n detail: 'rush MCP server not found in config',\n fix: `Run \\`rush-ai plugin install ${ctx.pluginName}\\``,\n };\n } catch {\n return {\n name: 'mcp_config',\n label: 'MCP config',\n status: 'fail',\n detail: `Failed to parse config: ${configPath}`,\n fix: 'Check file for JSON syntax errors',\n };\n }\n}\n\nfunction checkVersionMatch(ctx: DoctorContext): DoctorCheckResult {\n if (!ctx.manifest || !ctx.pluginInfo) {\n return {\n name: 'version_match',\n label: 'Version',\n status: 'warn',\n detail: 'Cannot check version (plugin not installed or unknown)',\n };\n }\n\n if (ctx.manifest.version === ctx.pluginInfo.version) {\n return {\n name: 'version_match',\n label: 'Version',\n status: 'pass',\n detail: `Up to date (v${ctx.manifest.version})`,\n };\n }\n\n return {\n name: 'version_match',\n label: 'Version',\n status: 'warn',\n detail: `Installed v${ctx.manifest.version}, latest v${ctx.pluginInfo.version}`,\n fix: `Run \\`rush-ai plugin update ${ctx.pluginName}\\``,\n };\n}\n\nexport async function runDoctorChecks(\n ctx: DoctorContext\n): Promise<DoctorCheckResult[]> {\n const results: DoctorCheckResult[] = [];\n\n results.push(checkCliInPath());\n results.push(checkAuth());\n results.push(await checkApiConnectivity());\n results.push(checkPluginInstalled(ctx));\n results.push(checkMcpConfig(ctx));\n results.push(checkVersionMatch(ctx));\n\n return results;\n}\n","import { accessSync, constants, existsSync, mkdirSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport path from 'node:path';\nimport chalk from 'chalk';\nimport { output } from '../../output/logger.js';\nimport { getAuthToken } from '../../util/auth.js';\nimport { createClient } from '../../util/client.js';\n\ninterface PreflightOptions {\n strict: boolean;\n json: boolean;\n}\n\ninterface PreflightResult {\n name: string;\n status: 'pass' | 'warn' | 'fail';\n detail: string;\n}\n\nexport async function runPreflightChecks(\n options: PreflightOptions\n): Promise<boolean> {\n const results: PreflightResult[] = [];\n\n // 1. Auth check\n try {\n const token = getAuthToken();\n if (token) {\n results.push({\n name: 'Authentication',\n status: 'pass',\n detail: 'Authenticated',\n });\n } else {\n results.push({\n name: 'Authentication',\n status: options.strict ? 'fail' : 'warn',\n detail: 'Not authenticated. MCP server may not work until you login.',\n });\n }\n } catch {\n results.push({\n name: 'Authentication',\n status: options.strict ? 'fail' : 'warn',\n detail: 'Not authenticated. MCP server may not work until you login.',\n });\n }\n\n // 2. API connectivity\n try {\n const client = createClient();\n await client.get('/api/agents?limit=1');\n results.push({\n name: 'API connectivity',\n status: 'pass',\n detail: 'API is reachable',\n });\n } catch {\n results.push({\n name: 'API connectivity',\n status: options.strict ? 'fail' : 'warn',\n detail:\n 'API is unreachable. MCP server may not work until API is reachable.',\n });\n }\n\n // 3. Config dir writable (always fatal if fails)\n const rushDir = path.resolve(homedir(), '.rush');\n try {\n // Ensure directory exists\n if (!existsSync(rushDir)) {\n mkdirSync(rushDir, { recursive: true });\n }\n // Check write permission\n accessSync(rushDir, constants.W_OK);\n results.push({\n name: 'Config directory',\n status: 'pass',\n detail: `Config directory is writable: ${rushDir}`,\n });\n } catch {\n results.push({\n name: 'Config directory',\n status: 'fail',\n detail: `Config directory is not writable: ${rushDir}`,\n });\n }\n\n // Output results\n if (options.json) {\n output.log(JSON.stringify({ preflight: results }, null, 2));\n } else {\n output.info('Preflight checks...');\n for (const r of results) {\n const icon =\n r.status === 'pass'\n ? chalk.green('[PASS]')\n : r.status === 'warn'\n ? chalk.yellow('[WARN]')\n : chalk.red('[FAIL]');\n output.log(` ${icon} ${r.name}: ${r.detail}`);\n }\n }\n\n // Return false only if there are failures\n return !results.some((r) => r.status === 'fail');\n}\n","import { execFileSync } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { getAuthToken } from '../../util/auth.js';\nimport type { IdeAdapter } from './adapters/types.js';\n\nexport interface VerifyResult {\n name: string;\n label: string;\n stage: 'cli' | 'config' | 'mcp-tools' | 'api' | 'auth';\n status: 'pass' | 'warn' | 'fail';\n detail: string;\n fix?: string;\n}\n\n/**\n * Unified verification logic shared by `plugin install` and `plugin doctor`.\n *\n * - install mode: Phase 1 (local) must pass; Phase 2 (API) failures are warnings.\n * - doctor mode: All phases run with full severity.\n */\nexport async function runVerification(options: {\n mode: 'install' | 'doctor';\n pluginName: string;\n adapter: IdeAdapter;\n}): Promise<VerifyResult[]> {\n const results: VerifyResult[] = [];\n\n // 1. Config file check (via adapter)\n results.push(checkConfigFile(options.adapter));\n\n // 2. MCP connectivity check (two-phase)\n const mcpResults = await verifyMcpConnectivity(options.mode);\n results.push(...mcpResults);\n\n // 3. Auth status check\n results.push(checkAuthStatus());\n\n return results;\n}\n\nfunction checkConfigFile(adapter: IdeAdapter): VerifyResult {\n const configFile = adapter.configPath();\n\n if (!existsSync(configFile)) {\n return {\n name: 'config_file',\n label: 'IDE config',\n stage: 'config',\n status: 'warn',\n detail: `Config file not found: ${configFile}`,\n fix: `Run \\`rush-ai plugin install ${adapter.name}\\``,\n };\n }\n\n try {\n const config = adapter.readConfig();\n if (!adapter.validateConfig(config)) {\n return {\n name: 'config_file',\n label: 'IDE config',\n stage: 'config',\n status: 'fail',\n detail: `Invalid config format: ${configFile}`,\n fix: 'Check file for JSON syntax errors',\n };\n }\n\n // Check if rush MCP server is configured\n const mcpServers = config.mcpServers as Record<string, unknown> | undefined;\n if (mcpServers && 'rush' in mcpServers) {\n return {\n name: 'config_file',\n label: 'IDE config',\n stage: 'config',\n status: 'pass',\n detail: 'Rush MCP server configured',\n };\n }\n\n return {\n name: 'config_file',\n label: 'IDE config',\n stage: 'config',\n status: 'fail',\n detail: 'Rush MCP server not found in config',\n fix: `Run \\`rush-ai plugin install ${adapter.name}\\``,\n };\n } catch {\n return {\n name: 'config_file',\n label: 'IDE config',\n stage: 'config',\n status: 'fail',\n detail: `Failed to read config: ${configFile}`,\n fix: 'Check file for JSON syntax errors',\n };\n }\n}\n\n/**\n * Two-phase MCP connectivity verification:\n *\n * Phase 1 (local): Check that rush-ai can start and expose MCP tools.\n * - install mode: fail → install fails\n * - doctor mode: fail → fail\n *\n * Phase 2 (API): Check that the MCP server can reach the Rush API.\n * - install mode: fail → warn only\n * - doctor mode: fail → fail\n */\nasync function verifyMcpConnectivity(\n mode: 'install' | 'doctor'\n): Promise<VerifyResult[]> {\n const results: VerifyResult[] = [];\n\n // Phase 1: Local MCP handshake\n try {\n // Try to run rush-ai with a quick check (version)\n execFileSync('rush-ai', ['--version'], {\n timeout: 5000,\n stdio: 'pipe',\n });\n\n results.push({\n name: 'mcp_cli_exec',\n label: 'CLI executable',\n stage: 'cli',\n status: 'pass',\n detail: 'rush-ai executable responds',\n });\n } catch (err) {\n results.push({\n name: 'mcp_cli_exec',\n label: 'CLI executable',\n stage: 'cli',\n status: 'fail',\n detail: `rush-ai failed to execute: ${err instanceof Error ? err.message : 'unknown error'}`,\n fix: 'Ensure rush-ai is installed and accessible in PATH',\n });\n // Phase 1 failed — skip Phase 2\n return results;\n }\n\n // Phase 2: API connectivity (via direct HTTP check)\n try {\n const { createClient } = await import('../../util/client.js');\n const client = createClient();\n await client.get('/api/agents?limit=1');\n\n results.push({\n name: 'mcp_api',\n label: 'API connectivity',\n stage: 'api',\n status: 'pass',\n detail: 'Rush API is reachable',\n });\n } catch {\n results.push({\n name: 'mcp_api',\n label: 'API connectivity',\n stage: 'api',\n status: mode === 'install' ? 'warn' : 'fail',\n detail:\n mode === 'install'\n ? 'API unreachable (install will continue, but MCP tools may not work until resolved)'\n : 'API unreachable',\n fix: 'Check network connection or run `rush-ai auth login`',\n });\n }\n\n return results;\n}\n\nfunction checkAuthStatus(): VerifyResult {\n try {\n const token = getAuthToken();\n if (token) {\n return {\n name: 'auth_status',\n label: 'Authentication',\n stage: 'auth',\n status: 'pass',\n detail: 'Authenticated',\n };\n }\n } catch {\n // fall through\n }\n return {\n name: 'auth_status',\n label: 'Authentication',\n stage: 'auth',\n status: 'warn',\n detail: 'Not authenticated',\n fix: 'Run `rush-ai auth login` to authenticate',\n };\n}\n","import { createWriteStream } from 'node:fs';\nimport { mkdir } from 'node:fs/promises';\nimport path from 'node:path';\nimport { Readable } from 'node:stream';\nimport { pipeline } from 'node:stream/promises';\nimport type { Command } from 'commander';\nimport { colorizeDiff, containsDiff } from '../../output/diff.js';\nimport { formatOutput, resolveFormat } from '../../output/format.js';\nimport { output } from '../../output/logger.js';\nimport { isCIMode } from '../../util/ci.js';\nimport { createClient } from '../../util/client.js';\nimport { RushError, TaskFailedError } from '../../util/errors.js';\nimport { requireAuth } from '../../util/require-auth.js';\nimport { consumeSSEStreamWithReconnect } from '../../util/sse.js';\nimport { readStdinIfPiped } from '../../util/stdin.js';\n\ninterface TaskCreateResponse {\n id: string;\n status: string;\n}\n\ninterface TaskResult {\n id: string;\n name?: string;\n status: 'pending' | 'running' | 'completed' | 'failed' | 'cancelled';\n agent: string;\n prompt: string;\n result?: unknown;\n error?: string;\n template?: string | null;\n podImageName?: string | null;\n previewUrl?: string | null;\n gitRepoUrl?: string | null;\n deployedProductionUrl?: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\ninterface TaskListResponse {\n tasks: TaskResult[];\n total: number;\n}\n\ninterface TaskFile {\n id: string;\n filePath: string;\n fileName: string;\n ossPath?: string;\n ossUrl?: string;\n category: string;\n source: string;\n timestamp?: number;\n url?: string;\n conversationId?: string;\n}\n\ninterface TaskFilesResponse {\n files: TaskFile[];\n totalCount: number;\n}\n\ninterface ConversationInfo {\n id: string;\n title: string | null;\n model: string;\n message_count: number;\n created_at: string;\n updated_at: string;\n created_by_name: string | null;\n}\n\ninterface ConversationsResponse {\n conversations: ConversationInfo[];\n}\n\ninterface UIMessagePart {\n type: string;\n text?: string;\n toolName?: string;\n state?: string;\n reasoning?: string;\n}\n\ninterface UIMessage {\n id: string;\n role: string;\n content: string;\n parts?: UIMessagePart[];\n createdAt?: string | number;\n metadata?: Record<string, unknown>;\n}\n\ninterface MessagesResponse {\n messages: UIMessage[];\n metadata?: {\n id: string;\n title?: string;\n createdAt?: string;\n updatedAt?: string;\n messageCount?: number;\n };\n}\n\nconst MAX_TEXT_LENGTH = 500;\n\n/**\n * Truncate text to MAX_TEXT_LENGTH characters, appending \"...\" if truncated.\n */\nfunction truncateText(text: string): string {\n if (text.length <= MAX_TEXT_LENGTH) return text;\n return text.slice(0, MAX_TEXT_LENGTH) + '...';\n}\n\n/**\n * Extract a short summary of tool invocations from message parts.\n * Returns something like: \"Write(src/App.tsx), Bash(npm run build)\"\n */\nfunction summarizeTools(parts: UIMessagePart[]): string {\n const toolParts = parts.filter(\n (p) => p.type === 'tool-invocation' || p.type.startsWith('tool-')\n );\n if (toolParts.length === 0) return '';\n return toolParts\n .map((p) => {\n if (p.toolName) return p.toolName;\n if (p.type.startsWith('tool-')) return p.type.slice(5);\n return 'unknown';\n })\n .join(', ');\n}\n\n/**\n * Format a timestamp for display.\n */\nfunction formatTimestamp(ts: string | number | undefined): string {\n if (!ts) return '';\n const d = new Date(ts);\n return d.toLocaleString();\n}\n\n/**\n * Render messages in human-readable format.\n */\nfunction renderMessages(\n messages: UIMessage[],\n conversationId: string,\n compact: boolean\n): void {\n output.log(\n output.bold(`Conversation ${conversationId} — ${messages.length} messages`)\n );\n output.newline();\n\n for (const msg of messages) {\n const ts = formatTimestamp(msg.createdAt);\n output.log(`[${msg.role}] ${ts}`);\n\n // Collect text content\n const textParts = (msg.parts ?? []).filter(\n (p) => p.type === 'text' && p.text\n );\n if (textParts.length > 0) {\n for (const tp of textParts) {\n output.log(` ${truncateText(tp.text!)}`);\n }\n } else if (msg.content) {\n output.log(` ${truncateText(msg.content)}`);\n }\n\n // Show tool summary for assistant messages (unless compact)\n if (!compact && msg.role === 'assistant' && msg.parts) {\n const toolSummary = summarizeTools(msg.parts);\n if (toolSummary) {\n output.dim(` Tools: ${toolSummary}`);\n }\n }\n\n output.newline();\n }\n}\n\nconst VALID_CATEGORIES = ['code', 'image', 'document', 'other'];\n\n/**\n * Sanitize a file path to prevent path traversal attacks.\n * Returns null if the path is unsafe.\n */\nfunction sanitizeFilePath(filePath: string, outputDir: string): string | null {\n // Strip leading slashes and drive letters\n let stripped = filePath.replace(/^[/\\\\]+/, '').replace(/^[a-zA-Z]:/, '');\n // Remove any .. components\n stripped = stripped\n .split('/')\n .filter((seg) => seg !== '..' && seg !== '.')\n .join('/');\n\n if (!stripped) return null;\n\n const resolvedOutput = path.resolve(outputDir);\n const target = path.resolve(resolvedOutput, stripped);\n const rel = path.relative(resolvedOutput, target);\n\n // Reject if relative path escapes the output directory\n if (rel.startsWith('..') || path.isAbsolute(rel)) {\n return null;\n }\n\n return target;\n}\n\n/**\n * Download a file via the API proxy (handles private OSS buckets).\n * Falls back to direct URL fetch if ossPath is not available.\n */\nasync function downloadFile(\n file: { ossPath?: string; ossUrl?: string },\n destPath: string,\n client: ReturnType<typeof createClient>\n): Promise<void> {\n let response: Response | null = null;\n\n if (file.ossPath) {\n try {\n const proxyResponse = await client.fetchRaw(\n `/api/files/oss-preview?action=file&path=${encodeURIComponent(file.ossPath)}`\n );\n if (proxyResponse.ok) {\n response = proxyResponse;\n }\n } catch {\n // Proxy failed, will fallback to ossUrl\n }\n }\n\n if (!response && file.ossUrl) {\n response = await fetch(file.ossUrl);\n }\n\n if (!response) {\n throw new Error('No download path available');\n }\n\n if (!response.ok) {\n throw new Error(\n `Download failed: ${response.status} ${response.statusText}`\n );\n }\n if (!response.body) {\n throw new Error('No response body');\n }\n\n await mkdir(path.dirname(destPath), { recursive: true });\n\n const nodeStream = Readable.fromWeb(\n response.body as import('node:stream/web').ReadableStream\n );\n const fileStream = createWriteStream(destPath);\n await pipeline(nodeStream, fileStream);\n}\n\n/**\n * Build a file category summary string, e.g. \"8 code, 2 image, 2 document\"\n */\nfunction buildCategorySummary(files: TaskFile[]): string {\n const counts: Record<string, number> = {};\n for (const f of files) {\n counts[f.category] = (counts[f.category] || 0) + 1;\n }\n return Object.entries(counts)\n .map(([cat, count]) => `${count} ${cat}`)\n .join(', ');\n}\n\nimport { registerDeploySubcommand } from './deploy.js';\n\nexport function registerTaskCommand(program: Command): void {\n const task = program.command('task').description('Create and manage tasks');\n\n registerDeploySubcommand(task, program);\n\n task\n .command('create')\n .description('Create a task asynchronously')\n .requiredOption('-a, --agent <name>', 'Agent name to execute the task')\n .option('-p, --prompt <text>', 'Task prompt')\n .option('--skills <skills>', 'Comma-separated skills to add', commaSplit)\n .option('--mcp <servers>', 'Comma-separated MCP servers to add', commaSplit)\n .action(\n async (options: {\n agent: string;\n prompt?: string;\n skills?: string[];\n mcp?: string[];\n }) => {\n requireAuth();\n const format = resolveFormat(program.opts());\n const client = createClient();\n\n const prompt = options.prompt ?? (await readStdinIfPiped());\n if (!prompt) {\n throw new RushError(\n 'No prompt provided. Use --prompt or pipe via stdin.'\n );\n }\n\n const { data } = await client.post<TaskCreateResponse>('/api/tasks', {\n agent: options.agent,\n prompt,\n skills: options.skills,\n mcpServers: options.mcp,\n });\n\n if (format === 'json') {\n output.log(JSON.stringify(data, null, 2));\n } else {\n output.success(`Task created: ${data.id}`);\n output.dim(`Status: ${data.status}`);\n output.dim(\n `Run \\`rush-ai task status ${data.id}\\` to check progress.`\n );\n }\n }\n );\n\n task\n .command('send')\n .description('Send a message to an existing task')\n .argument('<id>', 'Task ID (project ID)')\n .option('-p, --prompt <text>', 'Message to send')\n .option('--skills <skills>', 'Comma-separated skills to add', commaSplit)\n .option('--mcp <servers>', 'Comma-separated MCP servers to add', commaSplit)\n .action(\n async (\n id: string,\n options: {\n prompt?: string;\n skills?: string[];\n mcp?: string[];\n }\n ) => {\n requireAuth();\n const format = resolveFormat(program.opts());\n const client = createClient();\n\n const prompt = options.prompt ?? (await readStdinIfPiped());\n if (!prompt) {\n throw new RushError(\n 'No prompt provided. Use --prompt or pipe via stdin.'\n );\n }\n\n const { data } = await client.post<TaskCreateResponse>(\n `/api/tasks/${encodeURIComponent(id)}/send`,\n {\n prompt,\n skills: options.skills,\n mcpServers: options.mcp,\n }\n );\n\n if (format === 'json') {\n output.log(JSON.stringify(data, null, 2));\n } else {\n output.success(`Message sent to task: ${data.id}`);\n output.dim(`Status: ${data.status}`);\n output.dim(\n `Run \\`rush-ai task watch ${data.id}\\` to follow progress.`\n );\n }\n }\n );\n\n task\n .command('status')\n .description('Check task status')\n .argument('<id>', 'Task ID')\n .action(async (id: string) => {\n requireAuth();\n const format = resolveFormat(program.opts());\n const client = createClient();\n const { data } = await client.get<TaskResult>(\n `/api/tasks/${encodeURIComponent(id)}`\n );\n\n if (format === 'json') {\n output.log(JSON.stringify(data, null, 2));\n } else {\n output.log(output.bold(`Task ${data.id}`));\n output.log(` Agent: ${data.agent}`);\n output.log(` Status: ${data.status}`);\n if (data.template) {\n output.log(` Template: ${data.template}`);\n }\n if (data.podImageName) {\n output.log(` Image: ${data.podImageName}`);\n }\n output.log(` Created: ${new Date(data.createdAt).toLocaleString()}`);\n output.log(` Updated: ${new Date(data.updatedAt).toLocaleString()}`);\n if (data.previewUrl) {\n output.log(` Preview: ${data.previewUrl}`);\n }\n if (data.gitRepoUrl) {\n output.log(` Git: ${data.gitRepoUrl}`);\n }\n if (data.deployedProductionUrl) {\n output.log(` Production: ${data.deployedProductionUrl}`);\n }\n if (data.error) {\n output.error(` Error: ${data.error}`);\n }\n }\n\n // In CI mode, a failed task should produce a non-zero exit code\n if (isCIMode(program.opts()) && data.status === 'failed') {\n throw new TaskFailedError(\n `Task ${id} failed: ${data.error ?? 'unknown error'}`,\n { taskId: id, status: data.status }\n );\n }\n });\n\n task\n .command('result')\n .description('Get task result')\n .argument('<id>', 'Task ID')\n .action(async (id: string) => {\n requireAuth();\n const format = resolveFormat(program.opts());\n const client = createClient();\n const { data } = await client.get<{ result: unknown }>(\n `/api/tasks/${encodeURIComponent(id)}/result`\n );\n\n // Try to fetch file summary (non-blocking)\n let filesSummary: { totalCount: number; summary: string } | null = null;\n try {\n const { data: filesData } = await client.get<TaskFilesResponse>(\n `/api/chat/${encodeURIComponent(id)}/files`\n );\n if (filesData.totalCount > 0) {\n filesSummary = {\n totalCount: filesData.totalCount,\n summary: buildCategorySummary(filesData.files),\n };\n }\n } catch {\n // Silently degrade - file summary is an enhancement\n }\n\n if (format === 'json') {\n output.log(\n JSON.stringify(\n { ...data, filesSummary: filesSummary ?? undefined },\n null,\n 2\n )\n );\n } else {\n if (typeof data.result === 'string') {\n output.log(\n containsDiff(data.result) ? colorizeDiff(data.result) : data.result\n );\n } else {\n output.log(JSON.stringify(data.result, null, 2));\n }\n\n if (filesSummary) {\n output.newline();\n output.dim(\n `Files: ${filesSummary.totalCount} files (${filesSummary.summary})`\n );\n output.dim(`Run \\`rush-ai task files ${id}\\` to view details.`);\n }\n }\n });\n\n task\n .command('files')\n .description('List and download task artifact files')\n .argument('<id>', 'Task ID')\n .option('--download <path>', 'Download a specific file by its path')\n .option('--download-all', 'Download all files')\n .option('-o, --output <dir>', 'Output directory for downloads')\n .option(\n '-c, --category <type>',\n 'Filter by category: code, image, document, other'\n )\n .action(\n async (\n id: string,\n options: {\n download?: string;\n downloadAll?: boolean;\n output?: string;\n category?: string;\n }\n ) => {\n requireAuth();\n const format = resolveFormat(program.opts());\n const client = createClient();\n\n const { data } = await client.get<TaskFilesResponse>(\n `/api/chat/${encodeURIComponent(id)}/files`\n );\n\n let files = data.files;\n\n // Filter by category\n if (options.category && VALID_CATEGORIES.includes(options.category)) {\n files = files.filter((f) => f.category === options.category);\n } else if (options.category) {\n output.warn(\n `Unknown category \"${options.category}\". Showing all files.`\n );\n }\n\n // Single file download\n if (options.download) {\n const file = files.find(\n (f) =>\n f.filePath === options.download || f.fileName === options.download\n );\n if (!file) {\n output.error(`File not found: ${options.download}`);\n process.exit(1);\n }\n if (!file.ossPath && !file.ossUrl) {\n output.error(`File \"${file.fileName}\" has no download path.`);\n process.exit(1);\n }\n\n const outputDir = options.output || '.';\n const destPath = sanitizeFilePath(file.filePath, outputDir);\n if (!destPath) {\n output.error(`Unsafe file path: ${file.filePath}`);\n process.exit(1);\n }\n\n await downloadFile(file, destPath, client);\n\n if (format === 'json') {\n output.log(\n JSON.stringify(\n { downloaded: file.filePath, dest: destPath },\n null,\n 2\n )\n );\n } else {\n output.success(`Downloaded: ${file.filePath} -> ${destPath}`);\n }\n return;\n }\n\n // Batch download\n if (options.downloadAll) {\n const outputDir = options.output || `task-files-${id.slice(0, 8)}`;\n let downloaded = 0;\n let skipped = 0;\n let failed = 0;\n\n for (const file of files) {\n if (!file.ossPath && !file.ossUrl) {\n skipped++;\n if (format !== 'json') {\n output.dim(` Skipped (no download path): ${file.filePath}`);\n }\n continue;\n }\n\n const destPath = sanitizeFilePath(file.filePath, outputDir);\n if (!destPath) {\n skipped++;\n if (format !== 'json') {\n output.warn(` Skipped (unsafe path): ${file.filePath}`);\n }\n continue;\n }\n\n try {\n await downloadFile(file, destPath, client);\n downloaded++;\n if (format !== 'json') {\n output.dim(` Downloaded: ${file.filePath}`);\n }\n } catch {\n failed++;\n if (format !== 'json') {\n output.warn(` Failed: ${file.filePath}`);\n }\n }\n }\n\n if (format === 'json') {\n output.log(\n JSON.stringify(\n { outputDir, downloaded, skipped, failed, total: files.length },\n null,\n 2\n )\n );\n } else {\n output.newline();\n output.success(\n `Downloaded ${downloaded}/${files.length} files to ${outputDir}`\n );\n if (skipped > 0) {\n output.dim(\n ` ${skipped} skipped (no download URL or unsafe path)`\n );\n }\n if (failed > 0) {\n output.warn(` ${failed} failed`);\n }\n }\n return;\n }\n\n // Default: list files\n if (format === 'json') {\n output.log(\n JSON.stringify({ files, totalCount: files.length }, null, 2)\n );\n return;\n }\n\n if (files.length === 0) {\n output.info('No files found.');\n return;\n }\n\n output.log(output.bold(`Files (${files.length} total):`));\n output.newline();\n\n const rows = files.map((f) => ({\n Name: f.fileName,\n Category: f.category,\n Source: f.source,\n Path: f.filePath,\n }));\n\n output.log(formatOutput(rows, format));\n }\n );\n\n task\n .command('messages')\n .description('View conversation messages for a task')\n .argument('<id>', 'Task ID (project ID)')\n .option('-c, --conversation <id>', 'Specific conversation ID')\n .option('--last <n>', 'Show only last N messages')\n .option('--role <role>', 'Filter by role (user, assistant, system)')\n .option('--compact', 'Text-only output, no tool details or reasoning')\n .action(\n async (\n id: string,\n options: {\n conversation?: string;\n last?: string;\n role?: string;\n compact?: boolean;\n }\n ) => {\n requireAuth();\n const format = resolveFormat(program.opts());\n const client = createClient();\n\n let conversationId = options.conversation;\n\n // If no conversation ID provided, fetch the latest one\n if (!conversationId) {\n const { data: convData } = await client.get<ConversationsResponse>(\n `/api/chat/${encodeURIComponent(id)}/conversations`\n );\n\n if (!convData.conversations || convData.conversations.length === 0) {\n if (format === 'json') {\n output.log(\n JSON.stringify({ messages: [], conversationId: null }, null, 2)\n );\n } else {\n output.info('No conversations found for this task.');\n }\n return;\n }\n\n conversationId = convData.conversations[0].id;\n }\n\n const { data } = await client.get<MessagesResponse>(\n `/api/chat/${encodeURIComponent(id)}/conversations/${encodeURIComponent(conversationId)}`\n );\n\n let messages = data.messages ?? [];\n\n if (messages.length === 0) {\n if (format === 'json') {\n output.log(\n JSON.stringify({ messages: [], conversationId }, null, 2)\n );\n } else {\n output.info('No messages in this conversation.');\n }\n return;\n }\n\n // Filter by role\n if (options.role) {\n messages = messages.filter((m) => m.role === options.role);\n }\n\n // Limit to last N messages\n if (options.last) {\n const n = parseInt(options.last, 10);\n if (!isNaN(n) && n > 0) {\n messages = messages.slice(-n);\n }\n }\n\n if (format === 'json') {\n output.log(\n JSON.stringify(\n { messages, conversationId, metadata: data.metadata },\n null,\n 2\n )\n );\n } else {\n renderMessages(messages, conversationId, !!options.compact);\n }\n }\n );\n\n task\n .command('list')\n .alias('ls')\n .description('List tasks')\n .option('-l, --limit <limit>', 'Maximum number of tasks', '20')\n .option('-s, --status <status>', 'Filter by status')\n .action(async (options: { limit?: string; status?: string }) => {\n requireAuth();\n const format = resolveFormat(program.opts());\n const client = createClient();\n\n const params = new URLSearchParams();\n if (options.limit) params.set('limit', options.limit);\n if (options.status) params.set('status', options.status);\n\n const { data } = await client.get<TaskListResponse>(\n `/api/tasks?${params.toString()}`\n );\n\n if (format === 'json') {\n output.log(JSON.stringify(data, null, 2));\n return;\n }\n\n if (data.tasks.length === 0) {\n output.info('No tasks found.');\n return;\n }\n\n output.log(output.bold(`Tasks (${data.total} total):`));\n output.newline();\n\n const rows = data.tasks.map((t) => ({\n ID: t.id,\n Name: t.name ?? '',\n Agent: t.agent,\n Status: t.status,\n Created: new Date(t.createdAt).toLocaleString(),\n }));\n\n output.log(formatOutput(rows, format));\n });\n\n task\n .command('watch')\n .description('Watch task execution in real-time')\n .argument('<id>', 'Task ID')\n .action(async (id: string) => {\n requireAuth();\n const format = resolveFormat(program.opts());\n const client = createClient();\n\n if (format !== 'json') {\n output.log(output.bold(`Watching task ${id}...`));\n output.newline();\n }\n\n const TERMINAL_STATUSES = ['completed', 'failed', 'cancelled'];\n\n const connectFn = async () => {\n const response = await client.fetchRaw(\n `/api/tasks/${encodeURIComponent(id)}/events`,\n { method: 'GET' }\n );\n if (!response.body) {\n throw new Error('No response body for SSE');\n }\n return response.body;\n };\n\n let finalStatus = '';\n\n await consumeSSEStreamWithReconnect(\n connectFn,\n (event) => {\n if (format === 'json') {\n output.log(JSON.stringify(event));\n } else {\n renderTaskEvent(event);\n }\n if (event.type === 'status') {\n finalStatus = event.data;\n }\n },\n {\n isTerminal: (event) =>\n event.type === 'status' && TERMINAL_STATUSES.includes(event.data),\n onReconnect: (attempt) => {\n if (format !== 'json') {\n output.dim(\n `\\u27F3 SSE connection lost. Reconnecting (${attempt}/5)...`\n );\n }\n },\n }\n );\n\n if (format !== 'json') {\n output.newline();\n if (finalStatus === 'completed') {\n output.success('Task completed.');\n } else if (finalStatus === 'failed') {\n output.error('Task failed.');\n } else if (finalStatus === 'cancelled') {\n output.info('Task cancelled.');\n }\n }\n });\n\n task\n .command('cancel')\n .description('Cancel a running task')\n .argument('<id>', 'Task ID')\n .action(async (id: string) => {\n requireAuth();\n const format = resolveFormat(program.opts());\n const client = createClient();\n\n await client.delete(`/api/tasks/${encodeURIComponent(id)}`);\n\n if (format === 'json') {\n output.log(JSON.stringify({ id, status: 'cancelled' }));\n } else {\n output.success(`Task ${id} cancelled.`);\n }\n });\n}\n\nfunction commaSplit(value: string): string[] {\n return value\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n}\n\nfunction renderTaskEvent(event: { type: string; data: string }): void {\n switch (event.type) {\n case 'status':\n output.info(`Status: ${event.data}`);\n break;\n case 'content':\n process.stdout.write(event.data);\n break;\n case 'error':\n output.error(event.data || 'Unknown error');\n break;\n case 'progress':\n output.dim(`Progress: ${event.data}`);\n break;\n case 'raw':\n process.stdout.write(event.data);\n break;\n default:\n output.dim(JSON.stringify(event));\n }\n}\n","import chalk from 'chalk';\n\n/** Detect whether text contains unified diff content. */\nexport function containsDiff(text: string): boolean {\n return /^@@\\s+-\\d+/m.test(text) || /^---\\s+a\\//m.test(text);\n}\n\n/** Colorize unified diff lines. */\nexport function colorizeDiff(text: string): string {\n return text\n .split('\\n')\n .map((line) => {\n if (line.startsWith('+++') || line.startsWith('---'))\n return chalk.bold(line);\n if (line.startsWith('+')) return chalk.green(line);\n if (line.startsWith('-')) return chalk.red(line);\n if (line.startsWith('@@')) return chalk.cyan(line);\n return line;\n })\n .join('\\n');\n}\n","/**\n * CI mode detection utility.\n *\n * CI mode is activated by any of:\n * - `--ci` CLI flag\n * - `CI` environment variable (set by GitHub Actions, GitLab CI, etc.)\n * - `RUSH_CI` environment variable (explicit opt-in)\n */\n\n/**\n * Strict env-var truthy check.\n * Returns true only for '1', 'true', 'yes' (case-insensitive).\n */\nfunction isEnvTruthy(value: string | undefined): boolean {\n if (!value) return false;\n return ['1', 'true', 'yes'].includes(value.trim().toLowerCase());\n}\n\n/**\n * Detect CI mode from CLI flag or environment variables.\n *\n * The `process.argv` check runs unconditionally as a reliable fallback\n * that works even before Commander parses (e.g. in early error paths).\n */\nexport function isCIMode(programOpts?: { ci?: boolean }): boolean {\n if (process.argv.includes('--ci')) return true;\n if (programOpts?.ci) return true;\n if (isEnvTruthy(process.env.CI)) return true;\n if (isEnvTruthy(process.env.RUSH_CI)) return true;\n return false;\n}\n","/**\n * Read stdin if data is being piped (non-TTY).\n * Returns null if stdin is a TTY (interactive mode).\n */\nexport async function readStdinIfPiped(): Promise<string | null> {\n if (process.stdin.isTTY) {\n return null;\n }\n\n return new Promise<string>((resolve, reject) => {\n const chunks: Buffer[] = [];\n\n process.stdin.on('data', (chunk: Buffer) => {\n chunks.push(chunk);\n });\n\n process.stdin.on('end', () => {\n resolve(Buffer.concat(chunks).toString('utf-8').trim());\n });\n\n process.stdin.on('error', reject);\n });\n}\n","import { resolve } from 'node:path';\nimport chalk from 'chalk';\nimport type { Command } from 'commander';\nimport { resolveFormat } from '../../output/format.js';\nimport { output } from '../../output/logger.js';\nimport { createClient } from '../../util/client.js';\nimport { RushError } from '../../util/errors.js';\nimport {\n gitAddAndCommit,\n gitInit,\n gitPushUrl,\n hasUncommittedChanges,\n isGitRepo,\n} from '../../util/git.js';\nimport { requireAuth } from '../../util/require-auth.js';\nimport { runChecks } from '../check/index.js';\n\ninterface DeployCliResponse {\n success: boolean;\n projectId: string;\n gitPushUrl: string;\n podChatUrl: string;\n podPreviewUrl: string;\n}\n\ninterface PodReadyResponse {\n success: boolean;\n data: { ready: boolean; message: string };\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n\nfunction maskToken(url: string): string {\n return url.replace(/:([^@]{4})[^@]*@/, ':$1****@');\n}\n\nexport function registerDeploySubcommand(\n task: Command,\n program: Command\n): void {\n task\n .command('deploy')\n .description('Deploy a local project to Rush platform')\n .option('-n, --name <name>', 'Project name')\n .option('-p, --path <dir>', 'Project directory', '.')\n .action(async (opts: { name?: string; path: string }) => {\n requireAuth();\n const format = resolveFormat(program.opts());\n const client = createClient();\n const projectPath = resolve(opts.path);\n\n // Step 1: Run checks\n if (format !== 'json') {\n output.info('Checking project readiness...');\n }\n\n const report = runChecks(projectPath);\n if (!report.deployable) {\n if (format === 'json') {\n output.log(\n JSON.stringify(\n { error: 'Project has errors that must be fixed', report },\n null,\n 2\n )\n );\n } else {\n output.error(\n 'Project has errors that must be fixed before deploying.'\n );\n output.dim('Run `rush-ai check` for details.');\n }\n process.exit(1);\n }\n\n // Step 2: Create project + get git push URL\n if (format !== 'json') {\n output.info('Creating Rush project...');\n }\n\n const projectName = opts.name || `deploy-${Date.now().toString(36)}`;\n const { data } = await client.post<DeployCliResponse>(\n '/api/projects/deploy-cli',\n {\n name: projectName,\n framework: report.framework,\n packageManager: report.packageManager,\n }\n );\n\n if (!data.success || !data.gitPushUrl) {\n throw new RushError(\n 'Failed to create project — no git push URL returned'\n );\n }\n\n if (format !== 'json') {\n output.success(`Project created: ${data.projectId}`);\n }\n\n // Step 3: Git operations\n if (format !== 'json') {\n output.info('Pushing code to Rush...');\n }\n\n if (!isGitRepo(projectPath)) {\n gitInit(projectPath);\n }\n\n if (hasUncommittedChanges(projectPath)) {\n gitAddAndCommit(projectPath, 'deploy to rush');\n }\n\n // Push directly to URL without persisting token in .git/config\n const pushResult = gitPushUrl(projectPath, data.gitPushUrl);\n if (!pushResult.success) {\n if (format === 'json') {\n output.log(\n JSON.stringify(\n {\n error: 'Git push failed',\n details: pushResult.stderr,\n projectId: data.projectId,\n },\n null,\n 2\n )\n );\n } else {\n output.error('Git push failed:');\n output.log(pushResult.stderr);\n output.dim(\n 'Check your VPN connection and network. The project was created but code was not pushed.'\n );\n output.dim(`Project ID: ${data.projectId}`);\n }\n process.exit(1);\n }\n\n if (format !== 'json') {\n output.success('Code pushed successfully');\n }\n\n // Step 4: Trigger init-clone\n if (format !== 'json') {\n output.info('Initializing project on Rush...');\n }\n\n try {\n await client.post(\n `/api/projects/${encodeURIComponent(data.projectId)}/init-clone`,\n {\n projectId: data.projectId,\n sourceProjectId: data.projectId,\n }\n );\n } catch {\n if (format !== 'json') {\n output.warn(\n 'Init-clone request failed — the pod may auto-initialize on startup'\n );\n }\n }\n\n // Step 5: Poll for pod readiness\n if (format !== 'json') {\n output.info('Waiting for project to be ready...');\n }\n\n const maxWait = 150_000;\n const pollInterval = 3_000;\n const startTime = Date.now();\n let ready = false;\n\n while (Date.now() - startTime < maxWait) {\n try {\n const { data: readyData } = await client.get<PodReadyResponse>(\n `/api/projects/${encodeURIComponent(data.projectId)}/pod-ready`\n );\n if (readyData?.data?.ready) {\n ready = true;\n break;\n }\n } catch {\n // ignore polling errors\n }\n await sleep(pollInterval);\n }\n\n // Step 6: Output result\n const result = {\n projectId: data.projectId,\n previewUrl: data.podPreviewUrl,\n chatUrl: data.podChatUrl,\n status: ready ? 'ready' : 'timeout',\n gitRemote: maskToken(data.gitPushUrl),\n };\n\n if (format === 'json') {\n output.log(JSON.stringify(result, null, 2));\n } else {\n output.newline();\n if (ready) {\n output.success('Deployment complete!');\n } else {\n output.warn('Pod is still starting up — it may take another minute.');\n }\n output.log(` ${chalk.bold('Project ID:')} ${result.projectId}`);\n output.log(` ${chalk.bold('Preview:')} ${result.previewUrl}`);\n output.log(` ${chalk.bold('Chat:')} ${result.chatUrl}`);\n output.log(` ${chalk.bold('Git remote:')} ${result.gitRemote}`);\n output.newline();\n }\n });\n}\n","import { execFileSync } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\n\nexport function isGitRepo(projectPath: string): boolean {\n return existsSync(join(projectPath, '.git'));\n}\n\nexport function gitInit(projectPath: string): void {\n execFileSync('git', ['init'], { cwd: projectPath, stdio: 'pipe' });\n}\n\nexport function hasUncommittedChanges(projectPath: string): boolean {\n try {\n const status = execFileSync('git', ['status', '--porcelain'], {\n cwd: projectPath,\n encoding: 'utf-8',\n });\n return status.trim().length > 0;\n } catch {\n return false;\n }\n}\n\nexport function gitAddAndCommit(projectPath: string, message: string): void {\n execFileSync('git', ['add', '-A'], { cwd: projectPath, stdio: 'pipe' });\n execFileSync('git', ['commit', '-m', message, '--allow-empty'], {\n cwd: projectPath,\n stdio: 'pipe',\n env: {\n ...process.env,\n GIT_AUTHOR_NAME: process.env.GIT_AUTHOR_NAME || 'rush-ai',\n GIT_AUTHOR_EMAIL: process.env.GIT_AUTHOR_EMAIL || 'rush-ai@rush.dev',\n GIT_COMMITTER_NAME: process.env.GIT_COMMITTER_NAME || 'rush-ai',\n GIT_COMMITTER_EMAIL:\n process.env.GIT_COMMITTER_EMAIL || 'rush-ai@rush.dev',\n },\n });\n}\n\nexport function setRemote(\n projectPath: string,\n remoteName: string,\n url: string\n): void {\n try {\n const remotes = execFileSync('git', ['remote'], {\n cwd: projectPath,\n encoding: 'utf-8',\n });\n if (remotes.split('\\n').includes(remoteName)) {\n execFileSync('git', ['remote', 'set-url', remoteName, url], {\n cwd: projectPath,\n stdio: 'pipe',\n });\n } else {\n execFileSync('git', ['remote', 'add', remoteName, url], {\n cwd: projectPath,\n stdio: 'pipe',\n });\n }\n } catch {\n execFileSync('git', ['remote', 'add', remoteName, url], {\n cwd: projectPath,\n stdio: 'pipe',\n });\n }\n}\n\nexport function gitPushUrl(\n projectPath: string,\n url: string\n): { success: boolean; stderr: string } {\n try {\n execFileSync('git', ['push', url, 'HEAD:main', '--force'], {\n cwd: projectPath,\n stdio: 'pipe',\n timeout: 300_000,\n maxBuffer: 10 * 1024 * 1024,\n });\n return { success: true, stderr: '' };\n } catch (err: unknown) {\n const rawStderr =\n err && typeof err === 'object' && 'stderr' in err\n ? String((err as { stderr: Buffer }).stderr)\n : 'unknown error';\n return { success: false, stderr: sanitizeGitOutput(rawStderr) };\n }\n}\n\nexport function sanitizeGitOutput(text: string): string {\n return text.replace(/https?:\\/\\/[^@]*@/g, 'https://***@');\n}\n","import type { Command } from 'commander';\nimport { registerAgentCommand } from './agent/index.js';\nimport { registerAuthCommand } from './auth/index.js';\nimport { registerCheckCommand } from './check/index.js';\nimport { registerCompletionCommand } from './completion/index.js';\nimport { registerConfigCommand } from './config/index.js';\nimport { registerDoctorCommand } from './doctor/index.js';\nimport { registerMcpCommand } from './mcp/index.js';\nimport { registerPluginCommand } from './plugin/index.js';\nimport { registerTaskCommand } from './task/index.js';\n\nexport function registerCommands(program: Command): void {\n registerAuthCommand(program);\n registerAgentCommand(program);\n registerTaskCommand(program);\n registerCheckCommand(program);\n registerMcpCommand(program);\n registerPluginCommand(program);\n registerCompletionCommand(program);\n registerConfigCommand(program);\n registerDoctorCommand(program);\n}\n","import { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { dirname, join } from 'node:path';\nimport { output } from '../output/logger.js';\n\nconst CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000;\nconst FETCH_TIMEOUT_MS = 3000;\nconst REGISTRY_URL = 'https://registry.npmjs.org/rush-ai/latest';\n\nfunction parseVersion(v: string): number[] | null {\n const segments = v.replace(/^v/, '').split('-')[0].split('.').map(Number);\n if (segments.some((n) => Number.isNaN(n))) return null;\n return segments;\n}\n\nfunction isNewerVersion(current: string, latest: string): boolean {\n const c = parseVersion(current);\n const l = parseVersion(latest);\n if (!c || !l) return false;\n for (let i = 0; i < Math.max(c.length, l.length); i++) {\n const cv = c[i] ?? 0;\n const lv = l[i] ?? 0;\n if (lv > cv) return true;\n if (lv < cv) return false;\n }\n return false;\n}\n\nasync function writeLastCheck(checkFile: string): Promise<void> {\n try {\n await mkdir(dirname(checkFile), { recursive: true });\n await writeFile(checkFile, JSON.stringify({ lastCheck: Date.now() }));\n } catch {\n // Truly silent — filesystem may not be writable\n }\n}\n\nexport async function checkForUpdate(currentVersion: string): Promise<void> {\n const rushDir = join(homedir(), '.rush');\n const checkFile = join(rushDir, 'update-check.json');\n\n try {\n if (process.env.CI) return;\n\n let lastCheck = 0;\n try {\n const data = JSON.parse(await readFile(checkFile, 'utf-8'));\n lastCheck = data.lastCheck ?? 0;\n } catch {\n // Missing or corrupt — will check\n }\n\n if (Date.now() - lastCheck < CHECK_INTERVAL_MS) return;\n\n // Write lastCheck immediately to prevent retry storms on failure\n await writeLastCheck(checkFile);\n\n const response = await fetch(REGISTRY_URL, {\n signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),\n });\n if (!response.ok) return;\n\n const { version: latest } = (await response.json()) as {\n version: string;\n };\n\n if (isNewerVersion(currentVersion, latest)) {\n output.newline();\n output.warn(\n `Update available: ${currentVersion} → ${latest}\\n` +\n ` Run \\`npm update -g rush-ai\\` to update.`\n );\n }\n } catch {\n // Silent — never block CLI usage.\n // lastCheck was already written above, so next invocation won't retry.\n }\n}\n"],"mappings":"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","names":["chalk","truncate","resolve","chalk","existsSync","readFileSync","join","existsSync","join","existsSync","readFileSync","join","existsSync","readFileSync","join","VITE_CONFIG_FILES","devScript","chalk","existsSync","join","existsSync","join","chalk","existsSync","existsSync","detectShell","existsSync","readFileSync","homedir","resolve","resolve","homedir","existsSync","readFileSync","chalk","displayResults","truncate","existsSync","mkdirSync","readFileSync","writeFileSync","homedir","resolve","chalk","existsSync","homedir","resolve","existsSync","mkdirSync","readFileSync","writeFileSync","resolve","resolve","homedir","existsSync","existsSync","homedir","resolve","resolve","homedir","existsSync","copyFileSync","existsSync","mkdirSync","readFileSync","writeFileSync","homedir","dirname","join","resolve","resolve","homedir","readFileSync","existsSync","mkdirSync","dirname","copyFileSync","writeFileSync","join","existsSync","readFileSync","homedir","existsSync","checkAuth","type","homedir","readFileSync","accessSync","constants","existsSync","mkdirSync","homedir","path","chalk","path","homedir","existsSync","mkdirSync","accessSync","constants","chalk","execFileSync","existsSync","existsSync","execFileSync","createClient","resolve","homedir","PLUGINS_FILE","safeReadJson","existsSync","readFileSync","mkdirSync","writeFileSync","chalk","mkdir","path","chalk","resolve","resolve","chalk","execFileSync","existsSync","join","execFileSync","maskToken","resolve","chalk","path","mkdir","mkdir","readFile","writeFile","homedir","dirname","join","mkdir","dirname","writeFile","join","homedir","readFile","chalk"]}