lynxprompt 0.3.0 ā 0.4.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 +1435 -243
- package/dist/index.js.map +1 -1
- package/package.json +16 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/commands/login.ts","../src/config.ts","../src/api.ts","../src/commands/logout.ts","../src/commands/whoami.ts","../src/commands/list.ts","../src/commands/pull.ts","../src/utils/blueprint-tracker.ts","../src/commands/push.ts","../src/commands/init.ts","../src/utils/agent-detector.ts","../src/utils/agents.ts","../src/utils/detect.ts","../src/commands/wizard.ts","../src/utils/generator.ts","../src/commands/search.ts","../src/commands/status.ts","../src/commands/sync.ts","../src/commands/agents.ts","../src/commands/check.ts","../src/commands/diff.ts","../src/commands/link.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { loginCommand } from \"./commands/login.js\";\nimport { logoutCommand } from \"./commands/logout.js\";\nimport { whoamiCommand } from \"./commands/whoami.js\";\nimport { listCommand } from \"./commands/list.js\";\nimport { pullCommand } from \"./commands/pull.js\";\nimport { pushCommand } from \"./commands/push.js\";\nimport { initCommand } from \"./commands/init.js\";\nimport { wizardCommand } from \"./commands/wizard.js\";\nimport { searchCommand } from \"./commands/search.js\";\nimport { statusCommand } from \"./commands/status.js\";\nimport { syncCommand } from \"./commands/sync.js\";\nimport { agentsCommand } from \"./commands/agents.js\";\nimport { checkCommand } from \"./commands/check.js\";\nimport { diffCommand } from \"./commands/diff.js\";\nimport { linkCommand, unlinkCommand } from \"./commands/link.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"lynxprompt\")\n .description(\"CLI for LynxPrompt - Generate AI IDE configuration files\")\n .version(\"0.3.0\");\n\n// ============================================\n// Primary Commands (most users need these)\n// ============================================\n\n// Wizard - the main command for most users\nprogram\n .command(\"wizard\")\n .description(\"Generate AI IDE configuration (recommended for most users)\")\n .option(\"-n, --name <name>\", \"Project name\")\n .option(\"-d, --description <description>\", \"Project description\")\n .option(\"-s, --stack <stack>\", \"Tech stack (comma-separated)\")\n .option(\"-f, --format <format>\", \"Output format: agents, cursor, or comma-separated for multiple\")\n .option(\"-p, --platforms <platforms>\", \"Alias for --format (deprecated)\")\n .option(\"--persona <persona>\", \"AI persona (fullstack, backend, frontend, devops, data, security)\")\n .option(\"--boundaries <level>\", \"Boundary preset (conservative, standard, permissive)\")\n .option(\"-y, --yes\", \"Skip prompts, use defaults (generates AGENTS.md)\")\n .action(wizardCommand);\n\n// Check - validation for CI/CD\nprogram\n .command(\"check\")\n .description(\"Validate AI configuration files (for CI/CD)\")\n .option(\"--ci\", \"CI mode - exit codes only (0=pass, 1=fail)\")\n .action(checkCommand);\n\n// Status - show what's configured\nprogram\n .command(\"status\")\n .description(\"Show current AI configuration and tracked blueprints\")\n .action(statusCommand);\n\n// ============================================\n// Blueprint Commands (marketplace integration)\n// ============================================\n\nprogram\n .command(\"pull <id>\")\n .description(\"Download and track a blueprint from the marketplace\")\n .option(\"-o, --output <path>\", \"Output directory\", \".\")\n .option(\"-y, --yes\", \"Overwrite existing files without prompting\")\n .option(\"--preview\", \"Preview content without downloading\")\n .option(\"--no-track\", \"Don't track the blueprint for future syncs\")\n .action(pullCommand);\n\nprogram\n .command(\"search <query>\")\n .description(\"Search public blueprints in the marketplace\")\n .option(\"-l, --limit <number>\", \"Number of results\", \"20\")\n .action(searchCommand);\n\nprogram\n .command(\"list\")\n .description(\"List your blueprints\")\n .option(\"-l, --limit <number>\", \"Number of results\", \"20\")\n .option(\"-v, --visibility <visibility>\", \"Filter: PRIVATE, TEAM, PUBLIC, or all\")\n .action(listCommand);\n\nprogram\n .command(\"push [file]\")\n .description(\"Push local file to LynxPrompt cloud as a blueprint\")\n .option(\"-n, --name <name>\", \"Blueprint name\")\n .option(\"-d, --description <desc>\", \"Blueprint description\")\n .option(\"-v, --visibility <vis>\", \"Visibility: PRIVATE, TEAM, or PUBLIC\", \"PRIVATE\")\n .option(\"-t, --tags <tags>\", \"Tags (comma-separated)\")\n .option(\"-y, --yes\", \"Skip prompts\")\n .action(pushCommand);\n\n// Link/Unlink - connect local files to cloud blueprints\nprogram\n .command(\"link [file] [blueprint-id]\")\n .description(\"Link a local file to a cloud blueprint for tracking\")\n .option(\"--list\", \"List all tracked blueprints\")\n .action(linkCommand);\n\nprogram\n .command(\"unlink <file>\")\n .description(\"Disconnect a local file from its cloud blueprint\")\n .action(unlinkCommand);\n\n// Diff - compare local with remote\nprogram\n .command(\"diff [blueprint-id]\")\n .description(\"Show changes between local and remote blueprint\")\n .option(\"--local\", \"Compare .lynxprompt/rules/ with exported files\")\n .action(diffCommand);\n\n// ============================================\n// Advanced Commands (power users)\n// ============================================\n\n// Init - advanced multi-editor setup\nprogram\n .command(\"init\")\n .description(\"Initialize .lynxprompt/ for multi-editor sync (advanced)\")\n .option(\"-y, --yes\", \"Skip prompts and use defaults\")\n .option(\"-f, --force\", \"Re-initialize even if already initialized\")\n .action(initCommand);\n\n// Sync - export rules to all agents\nprogram\n .command(\"sync\")\n .description(\"Sync .lynxprompt/rules/ to all configured agents\")\n .option(\"--dry-run\", \"Preview changes without writing files\")\n .option(\"-f, --force\", \"Skip prompts (for CI/automation)\")\n .action(syncCommand);\n\n// Agents - manage which agents to sync to\nprogram\n .command(\"agents [action] [agent]\")\n .description(\"Manage AI agents (list, enable, disable, detect)\")\n .option(\"-i, --interactive\", \"Interactive agent selection\")\n .action(agentsCommand);\n\n// ============================================\n// Auth Commands\n// ============================================\n\nprogram\n .command(\"login\")\n .description(\"Authenticate with LynxPrompt (opens browser)\")\n .action(loginCommand);\n\nprogram\n .command(\"logout\")\n .description(\"Log out and remove stored credentials\")\n .action(logoutCommand);\n\nprogram\n .command(\"whoami\")\n .description(\"Show current authenticated user\")\n .action(whoamiCommand);\n\n// ============================================\n// Help formatting\n// ============================================\n\nprogram.addHelpText(\n \"beforeAll\",\n `\n${chalk.cyan(\"š± LynxPrompt CLI\")} ${chalk.gray(\"(also available as: lynxp)\")}\n${chalk.gray(\"Generate AI IDE configuration files from your terminal\")}\n`\n);\n\nprogram.addHelpText(\n \"after\",\n `\n${chalk.cyan(\"Quick Start:\")}\n ${chalk.white(\"$ lynxp wizard\")} ${chalk.gray(\"Generate config interactively\")}\n ${chalk.white(\"$ lynxp wizard -y\")} ${chalk.gray(\"Generate AGENTS.md with defaults\")}\n ${chalk.white(\"$ lynxp wizard -f cursor\")} ${chalk.gray(\"Generate .cursor/rules/\")}\n\n${chalk.cyan(\"Marketplace:\")}\n ${chalk.white(\"$ lynxp search nextjs\")} ${chalk.gray(\"Search blueprints\")}\n ${chalk.white(\"$ lynxp pull bp_abc123\")} ${chalk.gray(\"Download and track a blueprint\")}\n ${chalk.white(\"$ lynxp push\")} ${chalk.gray(\"Push local file to cloud\")}\n ${chalk.white(\"$ lynxp link --list\")} ${chalk.gray(\"Show tracked blueprints\")}\n\n${chalk.cyan(\"Blueprint Tracking:\")}\n ${chalk.white(\"$ lynxp link AGENTS.md bp_xyz\")} ${chalk.gray(\"Link existing file to blueprint\")}\n ${chalk.white(\"$ lynxp unlink AGENTS.md\")} ${chalk.gray(\"Disconnect from cloud\")}\n ${chalk.white(\"$ lynxp diff bp_abc123\")} ${chalk.gray(\"Show changes vs cloud version\")}\n\n${chalk.cyan(\"CI/CD:\")}\n ${chalk.white(\"$ lynxp check --ci\")} ${chalk.gray(\"Validate config (exit code)\")}\n\n${chalk.gray(\"Docs: https://lynxprompt.com/docs/cli\")}\n`\n);\n\nprogram.parse();\n","import chalk from \"chalk\";\nimport ora from \"ora\";\nimport { api, ApiRequestError } from \"../api.js\";\nimport { setToken, setUser, isAuthenticated, getApiUrl } from \"../config.js\";\n\nexport async function loginCommand(): Promise<void> {\n if (isAuthenticated()) {\n console.log(\n chalk.yellow(\n \"You are already logged in. Use 'lynxprompt logout' first to switch accounts.\"\n )\n );\n return;\n }\n\n const spinner = ora(\"Initializing authentication...\").start();\n\n try {\n // Initialize CLI session\n const session = await api.initCliSession();\n spinner.stop();\n\n console.log();\n console.log(chalk.cyan(\"š Opening browser to authenticate...\"));\n console.log(chalk.gray(` ${session.auth_url}`));\n console.log();\n\n // Try to open the browser\n const openBrowser = await tryOpenBrowser(session.auth_url);\n if (!openBrowser) {\n console.log(\n chalk.yellow(\"Could not open browser automatically. Please open the URL above manually.\")\n );\n }\n\n // Poll for completion\n const pollSpinner = ora(\"Waiting for authentication...\").start();\n \n const maxWaitTime = 5 * 60 * 1000; // 5 minutes\n const pollInterval = 2000; // 2 seconds\n const startTime = Date.now();\n\n while (Date.now() - startTime < maxWaitTime) {\n await sleep(pollInterval);\n\n try {\n const result = await api.pollCliSession(session.session_id);\n\n if (result.status === \"completed\" && result.token && result.user) {\n pollSpinner.succeed(\"Authentication successful!\");\n \n // Store credentials\n setToken(result.token);\n setUser(result.user);\n\n console.log();\n console.log(chalk.green(`ā
Logged in as ${chalk.bold(result.user.email)}`));\n console.log(chalk.gray(` Plan: ${result.user.plan}`));\n console.log(chalk.gray(` Token stored securely in config`));\n console.log();\n console.log(chalk.cyan(\"You're ready to use LynxPrompt CLI!\"));\n return;\n }\n\n if (result.status === \"expired\") {\n pollSpinner.fail(\"Authentication session expired. Please try again.\");\n return;\n }\n\n // status === \"pending\", continue polling\n } catch (error) {\n // Ignore polling errors, keep trying\n }\n }\n\n pollSpinner.fail(\"Authentication timed out. Please try again.\");\n } catch (error) {\n spinner.fail(\"Failed to initialize authentication\");\n \n if (error instanceof ApiRequestError) {\n console.error(chalk.red(`Error: ${error.message}`));\n if (error.statusCode === 503) {\n console.error(chalk.gray(\"The server may be temporarily unavailable. Please try again later.\"));\n }\n } else {\n console.error(chalk.red(\"An unexpected error occurred.\"));\n console.error(chalk.gray(\"Make sure you have internet connectivity and try again.\"));\n }\n process.exit(1);\n }\n}\n\nasync function tryOpenBrowser(url: string): Promise<boolean> {\n try {\n // Dynamic import for open package\n const { default: open } = await import(\"open\");\n await open(url);\n return true;\n } catch {\n // If open package is not available or fails, try native commands\n const { exec } = await import(\"child_process\");\n const { promisify } = await import(\"util\");\n const execAsync = promisify(exec);\n\n const platform = process.platform;\n let command: string;\n\n if (platform === \"darwin\") {\n command = `open \"${url}\"`;\n } else if (platform === \"win32\") {\n command = `start \"\" \"${url}\"`;\n } else {\n command = `xdg-open \"${url}\"`;\n }\n\n try {\n await execAsync(command);\n return true;\n } catch {\n return false;\n }\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n\n","import Conf from \"conf\";\n\ninterface ConfigSchema {\n token?: string;\n apiUrl: string;\n user?: {\n id: string;\n email: string;\n name: string | null;\n plan: string;\n };\n}\n\nconst config = new Conf<ConfigSchema>({\n projectName: \"lynxprompt\",\n schema: {\n token: {\n type: \"string\",\n },\n apiUrl: {\n type: \"string\",\n default: \"https://lynxprompt.com\",\n },\n user: {\n type: \"object\",\n properties: {\n id: { type: \"string\" },\n email: { type: \"string\" },\n name: { type: [\"string\", \"null\"] },\n plan: { type: \"string\" },\n },\n },\n },\n defaults: {\n apiUrl: \"https://lynxprompt.com\",\n },\n});\n\nexport function getToken(): string | undefined {\n // Environment variable takes precedence\n const envToken = process.env.LYNXPROMPT_TOKEN;\n if (envToken) {\n return envToken;\n }\n return config.get(\"token\");\n}\n\nexport function setToken(token: string): void {\n config.set(\"token\", token);\n}\n\nexport function clearToken(): void {\n config.delete(\"token\");\n config.delete(\"user\");\n}\n\nexport function getApiUrl(): string {\n // Allow override via environment variable\n const envUrl = process.env.LYNXPROMPT_API_URL;\n if (envUrl) {\n return envUrl;\n }\n return config.get(\"apiUrl\");\n}\n\nexport function setApiUrl(url: string): void {\n config.set(\"apiUrl\", url);\n}\n\nexport function getUser(): ConfigSchema[\"user\"] | undefined {\n return config.get(\"user\");\n}\n\nexport function setUser(user: ConfigSchema[\"user\"]): void {\n config.set(\"user\", user);\n}\n\nexport function isAuthenticated(): boolean {\n return !!getToken();\n}\n\nexport function getConfigPath(): string {\n return config.path;\n}\n\n","import { getToken, getApiUrl } from \"./config.js\";\n\nexport interface ApiError {\n error: string;\n message?: string;\n expired_at?: string;\n}\n\nexport interface Blueprint {\n id: string;\n name: string;\n description: string | null;\n type: string;\n tier: string;\n category: string;\n tags: string[];\n visibility: \"PRIVATE\" | \"TEAM\" | \"PUBLIC\";\n downloads: number;\n favorites: number;\n price: number | null;\n currency: string | null;\n created_at: string;\n updated_at: string;\n content?: string;\n}\n\nexport interface BlueprintsResponse {\n blueprints: Blueprint[];\n total: number;\n limit: number;\n offset: number;\n has_more: boolean;\n}\n\nexport interface UserResponse {\n user: {\n id: string;\n email: string;\n name: string | null;\n display_name: string | null;\n persona: string | null;\n skill_level: string | null;\n subscription: {\n plan: string;\n status: string | null;\n interval: string | null;\n current_period_end: string | null;\n };\n stats: {\n blueprints_count: number;\n };\n created_at: string;\n };\n}\n\nexport interface CliSessionResponse {\n session_id: string;\n auth_url: string;\n expires_at: string;\n}\n\nexport interface CliPollResponse {\n status: \"pending\" | \"completed\" | \"expired\";\n token?: string;\n user?: {\n id: string;\n email: string;\n name: string | null;\n plan: string;\n };\n}\n\nexport interface SearchResult {\n id: string;\n name: string;\n description: string;\n author: string;\n authorId?: string;\n downloads: number;\n likes: number;\n tags: string[];\n tier: string;\n category: string;\n isOfficial: boolean;\n aiAssisted: boolean;\n price: number | null;\n discountedPrice: number | null;\n currency: string;\n}\n\nexport interface SearchResponse {\n templates: SearchResult[];\n popularTags: string[];\n total: number;\n hasMore: boolean;\n}\n\nclass ApiClient {\n private getHeaders(): HeadersInit {\n const token = getToken();\n const headers: HeadersInit = {\n \"Content-Type\": \"application/json\",\n };\n if (token) {\n headers[\"Authorization\"] = `Bearer ${token}`;\n }\n return headers;\n }\n\n private async request<T>(\n endpoint: string,\n options: RequestInit = {}\n ): Promise<T> {\n const baseUrl = getApiUrl();\n const url = `${baseUrl}${endpoint}`;\n\n const response = await fetch(url, {\n ...options,\n headers: {\n ...this.getHeaders(),\n ...options.headers,\n },\n });\n\n const data = await response.json();\n\n if (!response.ok) {\n const error = data as ApiError;\n throw new ApiRequestError(\n error.message || error.error || \"Request failed\",\n response.status,\n error\n );\n }\n\n return data as T;\n }\n\n // Auth endpoints\n async initCliSession(): Promise<CliSessionResponse> {\n return this.request<CliSessionResponse>(\"/api/cli-auth/init\", {\n method: \"POST\",\n });\n }\n\n async pollCliSession(sessionId: string): Promise<CliPollResponse> {\n return this.request<CliPollResponse>(\n `/api/cli-auth/poll?session=${sessionId}`\n );\n }\n\n // User endpoints\n async getUser(): Promise<UserResponse> {\n return this.request<UserResponse>(\"/api/v1/user\");\n }\n\n // Blueprint endpoints\n async listBlueprints(options: {\n limit?: number;\n offset?: number;\n visibility?: string;\n } = {}): Promise<BlueprintsResponse> {\n const params = new URLSearchParams();\n if (options.limit) params.set(\"limit\", options.limit.toString());\n if (options.offset) params.set(\"offset\", options.offset.toString());\n if (options.visibility) params.set(\"visibility\", options.visibility);\n\n const query = params.toString();\n return this.request<BlueprintsResponse>(\n `/api/v1/blueprints${query ? `?${query}` : \"\"}`\n );\n }\n\n async getBlueprint(id: string): Promise<{ blueprint: Blueprint }> {\n // IDs can be:\n // - bp_xxx (v1 blueprint IDs)\n // - usr_xxx (user template IDs from marketplace)\n // - plain ID (needs bp_ prefix for v1 API)\n \n // For usr_ IDs, use the public blueprint endpoint (not v1)\n // This endpoint returns the blueprint directly, not wrapped\n if (id.startsWith(\"usr_\")) {\n const blueprint = await this.request<Blueprint>(`/api/blueprints/${id}`);\n // Map isPublic to visibility for consistency\n const visibility = (blueprint as any).isPublic ? \"PUBLIC\" : \"PRIVATE\";\n return { blueprint: { ...blueprint, visibility, type: (blueprint as any).tier || \"GENERIC\" } };\n }\n \n // For v1 blueprints, ensure bp_ prefix\n const apiId = id.startsWith(\"bp_\") ? id : `bp_${id}`;\n return this.request<{ blueprint: Blueprint }>(`/api/v1/blueprints/${apiId}`);\n }\n\n async searchBlueprints(query: string, limit: number = 20): Promise<SearchResponse> {\n const params = new URLSearchParams({\n q: query,\n limit: limit.toString(),\n });\n return this.request<SearchResponse>(`/api/blueprints?${params}`);\n }\n\n async createBlueprint(data: {\n name: string;\n description: string;\n content: string;\n visibility: \"PRIVATE\" | \"TEAM\" | \"PUBLIC\";\n tags?: string[];\n }): Promise<{ blueprint: Blueprint }> {\n return this.request<{ blueprint: Blueprint }>(\"/api/v1/blueprints\", {\n method: \"POST\",\n body: JSON.stringify(data),\n });\n }\n\n async updateBlueprint(\n id: string,\n data: {\n name?: string;\n description?: string;\n content?: string;\n visibility?: \"PRIVATE\" | \"TEAM\" | \"PUBLIC\";\n tags?: string[];\n }\n ): Promise<{ blueprint: Blueprint }> {\n const apiId = id.startsWith(\"bp_\") ? id : `bp_${id}`;\n return this.request<{ blueprint: Blueprint }>(`/api/v1/blueprints/${apiId}`, {\n method: \"PUT\",\n body: JSON.stringify(data),\n });\n }\n}\n\nexport class ApiRequestError extends Error {\n constructor(\n message: string,\n public statusCode: number,\n public response: ApiError\n ) {\n super(message);\n this.name = \"ApiRequestError\";\n }\n}\n\nexport const api = new ApiClient();\n\n\n","import chalk from \"chalk\";\nimport { clearToken, isAuthenticated, getUser } from \"../config.js\";\n\nexport async function logoutCommand(): Promise<void> {\n if (!isAuthenticated()) {\n console.log(chalk.yellow(\"You are not currently logged in.\"));\n return;\n }\n\n const user = getUser();\n const email = user?.email || \"unknown\";\n\n clearToken();\n\n console.log(chalk.green(`ā Logged out from ${chalk.bold(email)}`));\n console.log(chalk.gray(\" Removed stored credentials\"));\n}\n\n\n","import chalk from \"chalk\";\nimport ora from \"ora\";\nimport { api, ApiRequestError } from \"../api.js\";\nimport { isAuthenticated, getUser, setUser } from \"../config.js\";\n\nexport async function whoamiCommand(): Promise<void> {\n if (!isAuthenticated()) {\n console.log(chalk.yellow(\"Not logged in. Run 'lynxprompt login' to authenticate.\"));\n process.exit(1);\n }\n\n const spinner = ora(\"Fetching user info...\").start();\n\n try {\n const { user } = await api.getUser();\n spinner.stop();\n\n // Update cached user info\n setUser({\n id: user.id,\n email: user.email,\n name: user.name,\n plan: user.subscription.plan,\n });\n\n console.log();\n console.log(chalk.cyan(\"š± LynxPrompt Account\"));\n console.log();\n console.log(` ${chalk.gray(\"Email:\")} ${chalk.bold(user.email)}`);\n if (user.name) {\n console.log(` ${chalk.gray(\"Name:\")} ${user.name}`);\n }\n if (user.display_name) {\n console.log(` ${chalk.gray(\"Display:\")} ${user.display_name}`);\n }\n console.log(` ${chalk.gray(\"Plan:\")} ${formatPlan(user.subscription.plan)}`);\n if (user.subscription.status) {\n console.log(` ${chalk.gray(\"Status:\")} ${user.subscription.status}`);\n }\n if (user.subscription.current_period_end) {\n const endDate = new Date(user.subscription.current_period_end);\n console.log(` ${chalk.gray(\"Renews:\")} ${endDate.toLocaleDateString()}`);\n }\n console.log();\n console.log(` ${chalk.gray(\"Blueprints:\")} ${user.stats.blueprints_count}`);\n console.log(` ${chalk.gray(\"Member since:\")} ${new Date(user.created_at).toLocaleDateString()}`);\n console.log();\n } catch (error) {\n spinner.fail(\"Failed to fetch user info\");\n\n if (error instanceof ApiRequestError) {\n if (error.statusCode === 401) {\n console.error(chalk.red(\"Your session has expired. Please run 'lynxprompt login' again.\"));\n } else if (error.statusCode === 403) {\n console.error(chalk.red(\"API access requires Pro, Max, or Teams subscription.\"));\n console.error(chalk.gray(\"Upgrade at https://lynxprompt.com/pricing\"));\n } else {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n } else {\n console.error(chalk.red(\"An unexpected error occurred.\"));\n }\n process.exit(1);\n }\n}\n\nfunction formatPlan(plan: string): string {\n const planColors: Record<string, (s: string) => string> = {\n FREE: chalk.gray,\n PRO: chalk.blue,\n MAX: chalk.magenta,\n TEAMS: chalk.cyan,\n };\n \n const colorFn = planColors[plan] || chalk.white;\n return colorFn(plan);\n}\n\n\n","import chalk from \"chalk\";\nimport ora from \"ora\";\nimport { api, ApiRequestError, Blueprint } from \"../api.js\";\nimport { isAuthenticated } from \"../config.js\";\n\ninterface ListOptions {\n limit: string;\n visibility?: string;\n}\n\nexport async function listCommand(options: ListOptions): Promise<void> {\n if (!isAuthenticated()) {\n console.log(chalk.yellow(\"Not logged in. Run 'lynxprompt login' to authenticate.\"));\n process.exit(1);\n }\n\n const spinner = ora(\"Fetching your blueprints...\").start();\n\n try {\n const limit = parseInt(options.limit, 10) || 20;\n const { blueprints, total, has_more } = await api.listBlueprints({\n limit,\n visibility: options.visibility,\n });\n\n spinner.stop();\n\n if (blueprints.length === 0) {\n console.log();\n console.log(chalk.yellow(\"No blueprints found.\"));\n console.log(chalk.gray(\"Create your first blueprint at https://lynxprompt.com/blueprints/create\"));\n console.log(chalk.gray(\"Or run 'lynxprompt init' to generate one from the CLI!\"));\n return;\n }\n\n console.log();\n console.log(chalk.cyan(`š± Your Blueprints (${total} total)`));\n console.log();\n\n for (const bp of blueprints) {\n printBlueprint(bp);\n }\n\n if (has_more) {\n console.log(chalk.gray(`Showing ${blueprints.length} of ${total}. Use --limit to see more.`));\n }\n } catch (error) {\n spinner.fail(\"Failed to fetch blueprints\");\n handleApiError(error);\n }\n}\n\nfunction printBlueprint(bp: Blueprint): void {\n const visibilityIcon = {\n PRIVATE: \"š\",\n TEAM: \"š„\",\n PUBLIC: \"š\",\n }[bp.visibility] || \"š\";\n\n const tierBadge = {\n SIMPLE: chalk.gray(\"[Basic]\"),\n INTERMEDIATE: chalk.blue(\"[Pro]\"),\n ADVANCED: chalk.magenta(\"[Max]\"),\n }[bp.tier] || \"\";\n\n console.log(` ${visibilityIcon} ${chalk.bold(bp.name)} ${tierBadge}`);\n console.log(` ${chalk.cyan(bp.id)}`);\n if (bp.description) {\n console.log(` ${chalk.gray(truncate(bp.description, 60))}`);\n }\n console.log(` ${chalk.gray(`ā${bp.downloads}`)} ${chalk.gray(`ā„${bp.favorites}`)} ${formatTags(bp.tags)}`);\n console.log();\n}\n\nfunction formatTags(tags: string[]): string {\n if (!tags || tags.length === 0) return \"\";\n return tags.slice(0, 3).map((t) => chalk.gray(`#${t}`)).join(\" \");\n}\n\nfunction truncate(str: string, maxLength: number): string {\n if (str.length <= maxLength) return str;\n return str.slice(0, maxLength - 3) + \"...\";\n}\n\nfunction handleApiError(error: unknown): void {\n if (error instanceof ApiRequestError) {\n if (error.statusCode === 401) {\n console.error(chalk.red(\"Your session has expired. Please run 'lynxprompt login' again.\"));\n } else if (error.statusCode === 403) {\n console.error(chalk.red(\"API access requires Pro, Max, or Teams subscription.\"));\n console.error(chalk.gray(\"Upgrade at https://lynxprompt.com/pricing\"));\n } else {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n } else {\n console.error(chalk.red(\"An unexpected error occurred.\"));\n }\n process.exit(1);\n}\n\n\n","import chalk from \"chalk\";\nimport ora from \"ora\";\nimport prompts from \"prompts\";\nimport { api, ApiRequestError, Blueprint } from \"../api.js\";\nimport { isAuthenticated } from \"../config.js\";\nimport { writeFile, access, mkdir, readFile } from \"fs/promises\";\nimport { join, dirname } from \"path\";\nimport { existsSync } from \"fs\";\nimport {\n trackBlueprint,\n findBlueprintByFile,\n hasLocalChanges,\n type BlueprintSource,\n} from \"../utils/blueprint-tracker.js\";\n\ninterface PullOptions {\n output: string;\n yes?: boolean;\n preview?: boolean;\n track?: boolean; // Track the blueprint for future syncs (default: true)\n}\n\n// Mapping of blueprint types to filenames\nconst TYPE_TO_FILENAME: Record<string, string> = {\n AGENTS_MD: \"AGENTS.md\",\n CURSOR_RULES: \".cursor/rules/project.mdc\",\n COPILOT_INSTRUCTIONS: \".github/copilot-instructions.md\",\n WINDSURF_RULES: \".windsurfrules\",\n ZED_INSTRUCTIONS: \".zed/instructions.md\",\n CLAUDE_MD: \"CLAUDE.md\",\n GENERIC: \"ai-config.md\",\n};\n\n// Determine blueprint source from visibility\nfunction getSourceFromVisibility(visibility: Blueprint[\"visibility\"]): BlueprintSource {\n switch (visibility) {\n case \"PUBLIC\":\n return \"marketplace\";\n case \"TEAM\":\n return \"team\";\n case \"PRIVATE\":\n return \"private\";\n default:\n return \"marketplace\";\n }\n}\n\nexport async function pullCommand(\n id: string,\n options: PullOptions\n): Promise<void> {\n // Public marketplace blueprints (usr_ IDs) don't require authentication\n // Only v1 blueprints (bp_ IDs) require login\n const isPublicBlueprint = id.startsWith(\"usr_\");\n \n if (!isPublicBlueprint && !isAuthenticated()) {\n console.log(\n chalk.yellow(\"Not logged in. Run 'lynxp login' to authenticate.\")\n );\n console.log(\n chalk.gray(\"Note: Public marketplace blueprints (usr_...) can be downloaded without login.\")\n );\n process.exit(1);\n }\n\n const cwd = process.cwd();\n const spinner = ora(`Fetching blueprint ${chalk.cyan(id)}...`).start();\n\n try {\n const { blueprint } = await api.getBlueprint(id);\n spinner.stop();\n\n if (!blueprint.content) {\n console.error(chalk.red(\"ā Blueprint has no content.\"));\n process.exit(1);\n }\n\n const source = getSourceFromVisibility(blueprint.visibility);\n const isMarketplace = source === \"marketplace\";\n\n console.log();\n console.log(chalk.cyan(`š± Blueprint: ${chalk.bold(blueprint.name)}`));\n if (blueprint.description) {\n console.log(chalk.gray(` ${blueprint.description}`));\n }\n console.log(chalk.gray(` Type: ${blueprint.type} ⢠Tier: ${blueprint.tier} ⢠Visibility: ${blueprint.visibility}`));\n \n // Show source type info\n if (isMarketplace) {\n console.log(chalk.yellow(` š¦ Marketplace blueprint (read-only - changes won't sync back)`));\n } else if (source === \"team\") {\n console.log(chalk.blue(` š„ Team blueprint (can sync changes)`));\n } else if (source === \"private\") {\n console.log(chalk.green(` š Private blueprint (can sync changes)`));\n }\n console.log();\n\n // Preview mode - show content without writing\n if (options.preview) {\n console.log(chalk.gray(\"ā\".repeat(60)));\n console.log();\n \n // Show first 50 lines with syntax highlighting hints\n const lines = blueprint.content.split(\"\\n\");\n const previewLines = lines.slice(0, 50);\n \n for (const line of previewLines) {\n if (line.startsWith(\"#\")) {\n console.log(chalk.cyan(line));\n } else if (line.startsWith(\">\")) {\n console.log(chalk.gray(line));\n } else if (line.startsWith(\"- \") || line.startsWith(\"* \")) {\n console.log(chalk.white(line));\n } else if (line.startsWith(\"```\")) {\n console.log(chalk.yellow(line));\n } else {\n console.log(line);\n }\n }\n \n if (lines.length > 50) {\n console.log();\n console.log(chalk.gray(`... ${lines.length - 50} more lines`));\n }\n \n console.log();\n console.log(chalk.gray(\"ā\".repeat(60)));\n console.log();\n console.log(chalk.gray(\"Run without --preview to download this blueprint.\"));\n return;\n }\n\n // Determine output filename\n const filename = TYPE_TO_FILENAME[blueprint.type] || \"ai-config.md\";\n const outputPath = join(options.output, filename);\n\n // Check if file exists and show diff preview\n let localContent: string | null = null;\n if (existsSync(outputPath)) {\n try {\n localContent = await readFile(outputPath, \"utf-8\");\n } catch {\n // Can't read local file\n }\n }\n\n // Check if this file is already tracked\n const existingTracked = await findBlueprintByFile(cwd, filename);\n if (existingTracked && existingTracked.id !== id) {\n console.log(chalk.yellow(`ā This file is already linked to a different blueprint: ${existingTracked.id}`));\n if (!options.yes) {\n const { proceed } = await prompts({\n type: \"confirm\",\n name: \"proceed\",\n message: \"Replace the link with the new blueprint?\",\n initial: false,\n });\n if (!proceed) {\n console.log(chalk.gray(\"Cancelled.\"));\n return;\n }\n }\n }\n\n if (localContent && !options.yes) {\n // Show what will change\n const localLines = localContent.split(\"\\n\").length;\n const remoteLines = blueprint.content.split(\"\\n\").length;\n \n console.log(chalk.yellow(`ā File exists: ${outputPath}`));\n console.log(chalk.gray(` Local: ${localLines} lines`));\n console.log(chalk.gray(` Remote: ${remoteLines} lines`));\n console.log();\n\n const response = await prompts({\n type: \"select\",\n name: \"action\",\n message: \"What would you like to do?\",\n choices: [\n { title: \"Overwrite with remote version\", value: \"overwrite\" },\n { title: \"Preview remote content first\", value: \"preview\" },\n { title: \"Cancel\", value: \"cancel\" },\n ],\n });\n\n if (response.action === \"cancel\" || !response.action) {\n console.log(chalk.gray(\"Cancelled.\"));\n return;\n }\n\n if (response.action === \"preview\") {\n // Show preview\n console.log();\n console.log(chalk.gray(\"ā\".repeat(60)));\n console.log();\n \n const lines = blueprint.content.split(\"\\n\").slice(0, 30);\n for (const line of lines) {\n if (line.startsWith(\"#\")) {\n console.log(chalk.cyan(line));\n } else {\n console.log(line);\n }\n }\n \n if (blueprint.content.split(\"\\n\").length > 30) {\n console.log(chalk.gray(`... ${blueprint.content.split(\"\\n\").length - 30} more lines`));\n }\n \n console.log();\n console.log(chalk.gray(\"ā\".repeat(60)));\n console.log();\n\n const confirmResponse = await prompts({\n type: \"confirm\",\n name: \"confirm\",\n message: \"Download and overwrite local file?\",\n initial: false,\n });\n\n if (!confirmResponse.confirm) {\n console.log(chalk.gray(\"Cancelled.\"));\n return;\n }\n }\n }\n\n // Create directory if needed\n const dir = dirname(outputPath);\n if (dir !== \".\") {\n await mkdir(dir, { recursive: true });\n }\n\n // Write the file\n await writeFile(outputPath, blueprint.content, \"utf-8\");\n\n // Track the blueprint (default behavior unless --no-track)\n if (options.track !== false) {\n await trackBlueprint(cwd, {\n id: blueprint.id,\n name: blueprint.name,\n file: filename,\n content: blueprint.content,\n source,\n });\n }\n\n console.log(chalk.green(`ā
Downloaded: ${chalk.bold(outputPath)}`));\n \n // Show tracking info\n if (options.track !== false) {\n console.log(chalk.gray(` Linked to: ${blueprint.id}`));\n if (isMarketplace) {\n console.log(chalk.gray(` Updates: Run 'lynxp pull ${id}' to sync updates`));\n } else {\n console.log(chalk.gray(` Sync: Run 'lynxp push ${filename}' to push changes`));\n }\n }\n console.log();\n\n // Show helpful next steps\n const editorHint = getEditorHint(blueprint.type);\n if (editorHint) {\n console.log(chalk.gray(`š” ${editorHint}`));\n console.log();\n }\n\n // Additional tips\n console.log(chalk.gray(\"Tips:\"));\n console.log(chalk.gray(` ⢠Run 'lynxp status' to see tracked blueprints`));\n console.log(chalk.gray(` ⢠Run 'lynxp diff ${id}' to see changes between local and remote`));\n if (isMarketplace) {\n console.log(chalk.gray(` ⢠Run 'lynxp unlink ${filename}' to disconnect and make editable`));\n }\n console.log();\n } catch (error) {\n spinner.fail(\"Failed to pull blueprint\");\n handleApiError(error);\n }\n}\n\nfunction getEditorHint(type: string): string | null {\n switch (type) {\n case \"CURSOR_RULES\":\n return \"This file will be automatically read by Cursor.\";\n case \"COPILOT_INSTRUCTIONS\":\n return \"This file will be read by GitHub Copilot in VS Code.\";\n case \"AGENTS_MD\":\n return \"This AGENTS.md file works with Claude Code, Cursor, and other AI agents.\";\n case \"WINDSURF_RULES\":\n return \"This file will be automatically read by Windsurf.\";\n case \"ZED_INSTRUCTIONS\":\n return \"This file will be read by Zed's AI assistant.\";\n case \"CLAUDE_MD\":\n return \"This CLAUDE.md file will be read by Claude Code.\";\n default:\n return null;\n }\n}\n\nfunction handleApiError(error: unknown): void {\n if (error instanceof ApiRequestError) {\n if (error.statusCode === 401) {\n console.error(\n chalk.red(\"ā Your session has expired. Please run 'lynxp login' again.\")\n );\n } else if (error.statusCode === 403) {\n console.error(\n chalk.red(\"ā You don't have access to this blueprint.\")\n );\n console.error(\n chalk.gray(\n \" This might be a private blueprint or require a higher subscription tier.\"\n )\n );\n } else if (error.statusCode === 404) {\n console.error(chalk.red(\"ā Blueprint not found.\"));\n console.error(\n chalk.gray(\n \" Make sure you have the correct blueprint ID. Use 'lynxp list' to see your blueprints.\"\n )\n );\n } else {\n console.error(chalk.red(`ā Error: ${error.message}`));\n }\n } else {\n console.error(chalk.red(\"ā An unexpected error occurred.\"));\n }\n process.exit(1);\n}\n","/**\n * Blueprint Tracker\n * \n * Tracks which blueprints have been pulled from LynxPrompt cloud and their sync status.\n * Enables:\n * - Detecting if a local file came from a cloud blueprint\n * - Syncing updates from upstream blueprints\n * - Prompting users when they try to modify marketplace blueprints\n * - Managing team/private blueprint versions\n * \n * Storage: .lynxprompt/blueprints.yml\n */\n\nimport { readFile, writeFile, mkdir, access } from \"fs/promises\";\nimport { join, dirname } from \"path\";\nimport { createHash } from \"crypto\";\nimport * as yaml from \"yaml\";\n\n// Blueprint source types\nexport type BlueprintSource = \"marketplace\" | \"team\" | \"private\" | \"local\";\n\n// Tracked blueprint metadata\nexport interface TrackedBlueprint {\n id: string; // Blueprint ID (e.g., bp_abc123)\n source: BlueprintSource; // Where the blueprint came from\n file: string; // Local file path relative to project root\n name: string; // Blueprint name for display\n pulledAt: string; // ISO timestamp of last pull\n checksum: string; // SHA-256 of content when pulled (to detect local changes)\n version?: string; // Blueprint version (if available)\n editable: boolean; // Can the user push changes back?\n canPull: boolean; // Can pull updates from upstream?\n}\n\n// Blueprints file structure\nexport interface BlueprintsConfig {\n version: \"1\";\n blueprints: TrackedBlueprint[];\n}\n\nconst BLUEPRINTS_FILE = \".lynxprompt/blueprints.yml\";\n\n/**\n * Calculate SHA-256 checksum of content\n */\nexport function calculateChecksum(content: string): string {\n return createHash(\"sha256\").update(content).digest(\"hex\").substring(0, 16);\n}\n\n/**\n * Load blueprints configuration\n */\nexport async function loadBlueprints(cwd: string): Promise<BlueprintsConfig> {\n const filePath = join(cwd, BLUEPRINTS_FILE);\n \n try {\n await access(filePath);\n const content = await readFile(filePath, \"utf-8\");\n const config = yaml.parse(content) as BlueprintsConfig;\n return config || { version: \"1\", blueprints: [] };\n } catch {\n return { version: \"1\", blueprints: [] };\n }\n}\n\n/**\n * Save blueprints configuration\n */\nexport async function saveBlueprints(cwd: string, config: BlueprintsConfig): Promise<void> {\n const filePath = join(cwd, BLUEPRINTS_FILE);\n const dir = dirname(filePath);\n \n await mkdir(dir, { recursive: true });\n \n const content = yaml.stringify(config, {\n lineWidth: 0,\n singleQuote: false,\n });\n \n await writeFile(filePath, content, \"utf-8\");\n}\n\n/**\n * Track a pulled blueprint\n */\nexport async function trackBlueprint(\n cwd: string,\n blueprint: {\n id: string;\n name: string;\n file: string;\n content: string;\n source: BlueprintSource;\n version?: string;\n }\n): Promise<void> {\n const config = await loadBlueprints(cwd);\n \n // Remove existing entry for same file if exists\n config.blueprints = config.blueprints.filter(b => b.file !== blueprint.file);\n \n // Determine editability based on source\n const editable = blueprint.source !== \"marketplace\";\n const canPull = true; // All tracked blueprints can pull updates\n \n config.blueprints.push({\n id: blueprint.id,\n source: blueprint.source,\n file: blueprint.file,\n name: blueprint.name,\n pulledAt: new Date().toISOString(),\n checksum: calculateChecksum(blueprint.content),\n version: blueprint.version,\n editable,\n canPull,\n });\n \n await saveBlueprints(cwd, config);\n}\n\n/**\n * Find tracked blueprint by file path\n */\nexport async function findBlueprintByFile(cwd: string, file: string): Promise<TrackedBlueprint | null> {\n const config = await loadBlueprints(cwd);\n return config.blueprints.find(b => b.file === file) || null;\n}\n\n/**\n * Find tracked blueprint by ID\n */\nexport async function findBlueprintById(cwd: string, id: string): Promise<TrackedBlueprint | null> {\n const config = await loadBlueprints(cwd);\n return config.blueprints.find(b => b.id === id) || null;\n}\n\n/**\n * Check if local file has been modified since pull\n */\nexport async function hasLocalChanges(cwd: string, tracked: TrackedBlueprint): Promise<boolean> {\n try {\n const filePath = join(cwd, tracked.file);\n const content = await readFile(filePath, \"utf-8\");\n const currentChecksum = calculateChecksum(content);\n return currentChecksum !== tracked.checksum;\n } catch {\n return false;\n }\n}\n\n/**\n * Update checksum after syncing\n */\nexport async function updateChecksum(cwd: string, file: string, content: string): Promise<void> {\n const config = await loadBlueprints(cwd);\n const blueprint = config.blueprints.find(b => b.file === file);\n \n if (blueprint) {\n blueprint.checksum = calculateChecksum(content);\n blueprint.pulledAt = new Date().toISOString();\n await saveBlueprints(cwd, config);\n }\n}\n\n/**\n * Untrack a blueprint (disconnect from cloud)\n */\nexport async function untrackBlueprint(cwd: string, file: string): Promise<boolean> {\n const config = await loadBlueprints(cwd);\n const initialCount = config.blueprints.length;\n config.blueprints = config.blueprints.filter(b => b.file !== file);\n \n if (config.blueprints.length < initialCount) {\n await saveBlueprints(cwd, config);\n return true;\n }\n return false;\n}\n\n/**\n * Link an existing local file to a cloud blueprint\n */\nexport async function linkBlueprint(\n cwd: string,\n file: string,\n blueprintId: string,\n blueprintName: string,\n source: BlueprintSource\n): Promise<void> {\n try {\n const filePath = join(cwd, file);\n const content = await readFile(filePath, \"utf-8\");\n \n await trackBlueprint(cwd, {\n id: blueprintId,\n name: blueprintName,\n file,\n content,\n source,\n });\n } catch (error) {\n throw new Error(`Could not read file ${file} to link`);\n }\n}\n\n/**\n * Get all tracked blueprints\n */\nexport async function getAllTrackedBlueprints(cwd: string): Promise<TrackedBlueprint[]> {\n const config = await loadBlueprints(cwd);\n return config.blueprints;\n}\n\n/**\n * Check sync status of all tracked blueprints\n */\nexport async function checkSyncStatus(cwd: string): Promise<Array<{\n blueprint: TrackedBlueprint;\n localModified: boolean;\n fileExists: boolean;\n}>> {\n const config = await loadBlueprints(cwd);\n const results = [];\n \n for (const blueprint of config.blueprints) {\n const filePath = join(cwd, blueprint.file);\n let fileExists = false;\n let localModified = false;\n \n try {\n await access(filePath);\n fileExists = true;\n localModified = await hasLocalChanges(cwd, blueprint);\n } catch {\n fileExists = false;\n }\n \n results.push({ blueprint, localModified, fileExists });\n }\n \n return results;\n}\n\n","import chalk from \"chalk\";\nimport ora from \"ora\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport prompts from \"prompts\";\nimport { api, ApiRequestError } from \"../api.js\";\nimport { isAuthenticated } from \"../config.js\";\nimport {\n findBlueprintByFile,\n trackBlueprint,\n updateChecksum,\n} from \"../utils/blueprint-tracker.js\";\n\ninterface PushOptions {\n name?: string;\n description?: string;\n visibility?: string;\n tags?: string;\n yes?: boolean;\n}\n\nexport async function pushCommand(\n fileArg: string | undefined,\n options: PushOptions\n): Promise<void> {\n const cwd = process.cwd();\n\n // Check authentication\n if (!isAuthenticated()) {\n console.log(chalk.yellow(\"You need to be logged in to push blueprints.\"));\n console.log(chalk.gray(\"Run 'lynxp login' to authenticate.\"));\n process.exit(1);\n }\n\n // Find the file to push\n const file = fileArg || findDefaultFile();\n if (!file) {\n console.log(chalk.red(\"No AI configuration file found.\"));\n console.log(\n chalk.gray(\"Specify a file or run in a directory with AGENTS.md, CLAUDE.md, etc.\")\n );\n process.exit(1);\n }\n\n if (!fs.existsSync(file)) {\n console.log(chalk.red(`File not found: ${file}`));\n process.exit(1);\n }\n\n const content = fs.readFileSync(file, \"utf-8\");\n const filename = path.basename(file);\n\n // Check if file is already linked to a blueprint\n const linked = await findBlueprintByFile(cwd, file);\n\n if (linked) {\n // Update existing blueprint\n await updateBlueprint(cwd, file, linked.id, content, options);\n } else {\n // Create new blueprint or link to existing\n await createOrLinkBlueprint(cwd, file, filename, content, options);\n }\n}\n\nasync function updateBlueprint(\n cwd: string,\n file: string,\n blueprintId: string,\n content: string,\n options: PushOptions\n): Promise<void> {\n console.log(chalk.cyan(`\\nš¤ Updating blueprint ${chalk.bold(blueprintId)}...`));\n console.log(chalk.gray(` File: ${file}`));\n\n if (!options.yes) {\n const confirm = await prompts({\n type: \"confirm\",\n name: \"value\",\n message: `Push changes to ${blueprintId}?`,\n initial: true,\n });\n\n if (!confirm.value) {\n console.log(chalk.yellow(\"Push cancelled.\"));\n return;\n }\n }\n\n const spinner = ora(\"Pushing changes...\").start();\n\n try {\n const result = await api.updateBlueprint(blueprintId, { content });\n spinner.succeed(\"Blueprint updated!\");\n\n // Update local tracking\n await updateChecksum(cwd, file, content);\n\n console.log();\n console.log(chalk.green(`ā
Successfully updated ${chalk.bold(result.blueprint.name)}`));\n console.log(chalk.gray(` ID: ${blueprintId}`));\n console.log(chalk.gray(` View: https://lynxprompt.com/templates/${blueprintId.replace(\"bp_\", \"\")}`));\n } catch (error) {\n spinner.fail(\"Failed to update blueprint\");\n handleError(error);\n }\n}\n\nasync function createOrLinkBlueprint(\n cwd: string,\n file: string,\n filename: string,\n content: string,\n options: PushOptions\n): Promise<void> {\n console.log(chalk.cyan(\"\\nš¤ Push new blueprint\"));\n console.log(chalk.gray(` File: ${file}`));\n\n // Ask for details if not provided\n let name = options.name;\n let description = options.description;\n let visibility = options.visibility || \"PRIVATE\";\n let tags = options.tags ? options.tags.split(\",\").map((t) => t.trim()) : [];\n\n if (!options.yes) {\n const responses = await prompts([\n {\n type: name ? null : \"text\",\n name: \"name\",\n message: \"Blueprint name:\",\n initial: filename.replace(/\\.(md|mdc|json|yml|yaml)$/, \"\"),\n validate: (v) => v.length > 0 || \"Name is required\",\n },\n {\n type: description ? null : \"text\",\n name: \"description\",\n message: \"Description:\",\n initial: \"\",\n },\n {\n type: \"select\",\n name: \"visibility\",\n message: \"Visibility:\",\n choices: [\n { title: \"Private (only you)\", value: \"PRIVATE\" },\n { title: \"Team (your team members)\", value: \"TEAM\" },\n { title: \"Public (visible to everyone)\", value: \"PUBLIC\" },\n ],\n initial: 0,\n },\n {\n type: \"text\",\n name: \"tags\",\n message: \"Tags (comma-separated):\",\n initial: \"\",\n },\n ]);\n\n if (!responses.name && !name) {\n console.log(chalk.yellow(\"Push cancelled.\"));\n return;\n }\n\n name = name || responses.name;\n description = description || responses.description || \"\";\n visibility = responses.visibility || visibility;\n tags = responses.tags ? responses.tags.split(\",\").map((t: string) => t.trim()).filter(Boolean) : tags;\n }\n\n if (!name) {\n name = filename.replace(/\\.(md|mdc|json|yml|yaml)$/, \"\");\n }\n\n const spinner = ora(\"Creating blueprint...\").start();\n\n try {\n const result = await api.createBlueprint({\n name,\n description: description || \"\",\n content,\n visibility: visibility as \"PRIVATE\" | \"TEAM\" | \"PUBLIC\",\n tags,\n });\n\n spinner.succeed(\"Blueprint created!\");\n\n // Track the blueprint locally\n await trackBlueprint(cwd, {\n id: result.blueprint.id,\n name: result.blueprint.name,\n file,\n content,\n source: \"private\",\n });\n\n console.log();\n console.log(chalk.green(`ā
Created blueprint ${chalk.bold(result.blueprint.name)}`));\n console.log(chalk.gray(` ID: ${result.blueprint.id}`));\n console.log(chalk.gray(` Visibility: ${visibility}`));\n if (visibility === \"PUBLIC\") {\n console.log(chalk.gray(` View: https://lynxprompt.com/templates/${result.blueprint.id.replace(\"bp_\", \"\")}`));\n }\n console.log();\n console.log(chalk.cyan(\"The file is now linked. Future 'lynxp push' will update this blueprint.\"));\n } catch (error) {\n spinner.fail(\"Failed to create blueprint\");\n handleError(error);\n }\n}\n\nfunction findDefaultFile(): string | null {\n const candidates = [\n \"AGENTS.md\",\n \"CLAUDE.md\",\n \".cursor/rules/project.mdc\",\n \".github/copilot-instructions.md\",\n \".windsurfrules\",\n \"AIDER.md\",\n \"GEMINI.md\",\n \".clinerules\",\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n }\n\n return null;\n}\n\nfunction handleError(error: unknown): void {\n if (error instanceof ApiRequestError) {\n console.error(chalk.red(`Error: ${error.message}`));\n if (error.statusCode === 401) {\n console.error(chalk.gray(\"Your session may have expired. Run 'lynxp login' to re-authenticate.\"));\n } else if (error.statusCode === 403) {\n console.error(chalk.gray(\"You don't have permission to modify this blueprint.\"));\n } else if (error.statusCode === 404) {\n console.error(chalk.gray(\"Blueprint not found. It may have been deleted.\"));\n }\n } else {\n console.error(chalk.red(\"An unexpected error occurred.\"));\n }\n process.exit(1);\n}\n","import chalk from \"chalk\";\nimport prompts from \"prompts\";\nimport ora from \"ora\";\nimport { writeFile, mkdir, readFile, access, readdir } from \"fs/promises\";\nimport { join, dirname, basename } from \"path\";\nimport { existsSync } from \"fs\";\nimport * as yaml from \"yaml\";\nimport { detectAgents } from \"../utils/agent-detector.js\";\nimport { detectProject } from \"../utils/detect.js\";\nimport { getPopularAgents, AGENTS } from \"../utils/agents.js\";\n\ninterface InitOptions {\n yes?: boolean;\n force?: boolean;\n}\n\n// LynxPrompt paths\nconst LYNXPROMPT_DIR = \".lynxprompt\";\nconst LYNXPROMPT_CONFIG = \".lynxprompt/conf.yml\";\nconst LYNXPROMPT_RULES = \".lynxprompt/rules\";\n\n// Common AI agent config files\nconst AGENT_FILES = [\n { name: \"AGENTS.md\", agent: \"Universal (AGENTS.md)\" },\n { name: \"CLAUDE.md\", agent: \"Claude Code\" },\n { name: \".windsurfrules\", agent: \"Windsurf\" },\n { name: \".clinerules\", agent: \"Cline\" },\n { name: \".goosehints\", agent: \"Goose\" },\n { name: \"AIDER.md\", agent: \"Aider\" },\n { name: \".github/copilot-instructions.md\", agent: \"GitHub Copilot\" },\n { name: \".zed/instructions.md\", agent: \"Zed\" },\n];\n\n// Directory-based AI agent configs\nconst AGENT_DIRS = [\n { path: \".cursor/rules\", agent: \"Cursor\" },\n { path: \".amazonq/rules\", agent: \"Amazon Q\" },\n { path: \".augment/rules\", agent: \"Augment Code\" },\n];\n\ninterface DetectedFile {\n path: string;\n agent: string;\n content?: string;\n}\n\n/**\n * Scan for existing AI agent configuration files\n */\nasync function scanForExistingFiles(cwd: string): Promise<DetectedFile[]> {\n const detected: DetectedFile[] = [];\n\n // Check single files\n for (const file of AGENT_FILES) {\n const filePath = join(cwd, file.name);\n if (existsSync(filePath)) {\n try {\n const content = await readFile(filePath, \"utf-8\");\n detected.push({ path: file.name, agent: file.agent, content });\n } catch {\n detected.push({ path: file.name, agent: file.agent });\n }\n }\n }\n\n // Check directories\n for (const dir of AGENT_DIRS) {\n const dirPath = join(cwd, dir.path);\n if (existsSync(dirPath)) {\n detected.push({ path: dir.path, agent: dir.agent });\n }\n }\n\n return detected;\n}\n\n/**\n * Create starter AGENTS.md content\n */\nfunction createStarterAgentsMd(projectName: string): string {\n return `# ${projectName} - AI Agent Instructions\n\n> Edit this file to customize how AI agents work with your codebase.\n> This is the source of truth for all AI assistants in this project.\n\n## Project Overview\n\nDescribe your project here. What does it do? What are its main features?\n\n## Tech Stack\n\nList the technologies used in this project:\n\n- Language: (e.g., TypeScript, Python, Go)\n- Framework: (e.g., Next.js, FastAPI, Rails)\n- Database: (e.g., PostgreSQL, MongoDB)\n- Other tools: (e.g., Docker, Kubernetes)\n\n## Code Style\n\nFollow these conventions:\n\n- Write clean, readable code\n- Use descriptive variable and function names\n- Keep functions focused and testable\n- Add comments for complex logic only\n\n## Commands\n\n\\`\\`\\`bash\n# Build\nnpm run build\n\n# Test\nnpm test\n\n# Lint\nnpm run lint\n\n# Dev server\nnpm run dev\n\\`\\`\\`\n\n## Boundaries\n\n### ā
Always (do without asking)\n\n- Read any file in the project\n- Modify files in src/ or lib/\n- Run build, test, and lint commands\n- Create test files\n\n### ā ļø Ask First\n\n- Add new dependencies\n- Modify configuration files\n- Create new modules or directories\n\n### š« Never\n\n- Modify .env files or secrets\n- Delete critical files without backup\n- Force push to git\n- Expose sensitive information\n\n---\n\n*Managed by [LynxPrompt](https://lynxprompt.com)*\n`;\n}\n\n/**\n * Create default LynxPrompt configuration\n */\nfunction createDefaultConfig(exporters: string[] = [\"agents\"]): string {\n const config = {\n version: \"1\",\n exporters,\n sources: [\n {\n type: \"local\",\n path: \".lynxprompt/rules\",\n },\n ],\n };\n return yaml.stringify(config);\n}\n\n/**\n * Create README for .lynxprompt directory\n */\nfunction createLynxpromptReadme(): string {\n return `# .lynxprompt\n\nThis directory contains your LynxPrompt configuration and rules.\n\n> **Note**: This is an advanced setup for managing rules across multiple AI editors.\n> Most users should use \\`lynxp wizard\\` instead for simple, direct file generation.\n\n## Directory structure\n\n- **\\`rules/\\`** - Your AI rules. Edit files here, then sync to agents.\n- **\\`conf.yml\\`** - Configuration file (exporters, sources, options)\n\n## Editing rules\n\nAdd markdown files to \\`rules/\\`:\n\n\\`\\`\\`markdown\n# My Rule\n\nDescription of what this rule does...\n\\`\\`\\`\n\n## Syncing\n\nAfter editing rules, run:\n\n\\`\\`\\`bash\nlynxp sync\n\\`\\`\\`\n\nThis exports your rules to the configured agent formats (AGENTS.md, .cursor/rules/, etc.)\n\n## More information\n\n- Docs: https://lynxprompt.com/docs/cli\n- Support: https://lynxprompt.com/support\n`;\n}\n\nexport async function initCommand(options: InitOptions): Promise<void> {\n console.log();\n console.log(chalk.cyan(\"š± LynxPrompt Init\"));\n console.log(chalk.gray(\"Advanced mode: Multi-editor rule management\"));\n console.log();\n\n // Show suggestion for simple use case\n if (!options.yes && !options.force) {\n console.log(chalk.yellow(\"š” Tip: Most users should use 'lynxp wizard' instead.\"));\n console.log(chalk.gray(\" The wizard generates files directly without the .lynxprompt/ folder.\"));\n console.log();\n \n const { proceed } = await prompts({\n type: \"confirm\",\n name: \"proceed\",\n message: \"Continue with advanced setup?\",\n initial: false,\n });\n\n if (!proceed) {\n console.log();\n console.log(chalk.gray(\"Run 'lynxp wizard' for simple file generation.\"));\n return;\n }\n console.log();\n }\n\n const cwd = process.cwd();\n const projectName = basename(cwd);\n const lynxpromptDir = join(cwd, LYNXPROMPT_DIR);\n const configPath = join(cwd, LYNXPROMPT_CONFIG);\n const rulesDir = join(cwd, LYNXPROMPT_RULES);\n\n // Check if already initialized\n if (existsSync(configPath) && !options.force) {\n console.log(chalk.yellow(\"LynxPrompt is already initialized in this project.\"));\n console.log(chalk.gray(`Config: ${LYNXPROMPT_CONFIG}`));\n console.log(chalk.gray(`Rules: ${LYNXPROMPT_RULES}/`));\n console.log();\n console.log(chalk.gray(\"Run 'lynxp sync' to export rules to your agents.\"));\n console.log(chalk.gray(\"Run 'lynxp wizard' to generate new configurations.\"));\n return;\n }\n\n // Detect project and agents\n const spinner = ora(\"Scanning project...\").start();\n const [projectInfo, agentDetection] = await Promise.all([\n detectProject(cwd),\n Promise.resolve(detectAgents(cwd)),\n ]);\n const existingFiles = await scanForExistingFiles(cwd);\n spinner.stop();\n\n // Show detected project info\n if (projectInfo) {\n console.log(chalk.green(\"ā Detected project:\"));\n if (projectInfo.name) console.log(chalk.gray(` Name: ${projectInfo.name}`));\n if (projectInfo.stack.length > 0) console.log(chalk.gray(` Stack: ${projectInfo.stack.join(\", \")}`));\n if (projectInfo.packageManager) console.log(chalk.gray(` Package manager: ${projectInfo.packageManager}`));\n console.log();\n }\n\n // Show detected agents\n if (agentDetection.detected.length > 0) {\n console.log(chalk.green(`ā Detected ${agentDetection.detected.length} AI agent${agentDetection.detected.length === 1 ? \"\" : \"s\"}:`));\n for (const detected of agentDetection.detected) {\n const rules = detected.ruleCount > 0 ? chalk.gray(` (${detected.ruleCount} sections)`) : \"\";\n console.log(` ${chalk.cyan(\"ā¢\")} ${detected.agent.name}${rules}`);\n }\n console.log();\n }\n\n if (existingFiles.length > 0) {\n console.log(chalk.green(\"ā Found existing AI configuration files:\"));\n for (const file of existingFiles) {\n console.log(` ${chalk.cyan(file.path)} ${chalk.gray(`(${file.agent})`)}`);\n }\n console.log();\n\n if (!options.yes) {\n const { action } = await prompts({\n type: \"select\",\n name: \"action\",\n message: \"What would you like to do?\",\n choices: [\n { title: \"Import existing files to .lynxprompt/rules/\", value: \"import\" },\n { title: \"Start fresh (keep existing files, create new rules)\", value: \"fresh\" },\n { title: \"Cancel\", value: \"cancel\" },\n ],\n });\n\n if (action === \"cancel\" || !action) {\n console.log(chalk.gray(\"Cancelled.\"));\n return;\n }\n\n if (action === \"import\") {\n // Import existing files\n await mkdir(rulesDir, { recursive: true });\n \n let importedCount = 0;\n for (const file of existingFiles) {\n if (file.content) {\n const ruleName = file.path.replace(/^\\./, \"\").replace(/\\//g, \"-\").replace(/\\.md$/, \"\") + \".md\";\n const rulePath = join(rulesDir, ruleName);\n await writeFile(rulePath, file.content, \"utf-8\");\n console.log(chalk.gray(` Imported: ${file.path} ā .lynxprompt/rules/${ruleName}`));\n importedCount++;\n }\n }\n \n if (importedCount === 0) {\n // Create starter if no files could be imported\n const starterPath = join(rulesDir, \"agents.md\");\n await writeFile(starterPath, createStarterAgentsMd(projectName), \"utf-8\");\n console.log(chalk.gray(\" Created starter: .lynxprompt/rules/agents.md\"));\n }\n } else {\n // Fresh start - create starter\n await mkdir(rulesDir, { recursive: true });\n const starterPath = join(rulesDir, \"agents.md\");\n await writeFile(starterPath, createStarterAgentsMd(projectName), \"utf-8\");\n console.log(chalk.gray(\"Created starter: .lynxprompt/rules/agents.md\"));\n }\n } else {\n // Non-interactive: import existing files\n await mkdir(rulesDir, { recursive: true });\n for (const file of existingFiles) {\n if (file.content) {\n const ruleName = file.path.replace(/^\\./, \"\").replace(/\\//g, \"-\").replace(/\\.md$/, \"\") + \".md\";\n const rulePath = join(rulesDir, ruleName);\n await writeFile(rulePath, file.content, \"utf-8\");\n }\n }\n }\n } else {\n // No existing files found\n console.log(chalk.gray(\"No existing AI configuration files found.\"));\n console.log();\n\n if (!options.yes) {\n const { create } = await prompts({\n type: \"confirm\",\n name: \"create\",\n message: \"Create a starter template?\",\n initial: true,\n });\n\n if (!create) {\n console.log(chalk.gray(\"Cancelled.\"));\n return;\n }\n }\n\n // Create rules directory and starter file\n await mkdir(rulesDir, { recursive: true });\n const starterPath = join(rulesDir, \"agents.md\");\n await writeFile(starterPath, createStarterAgentsMd(projectName), \"utf-8\");\n console.log(chalk.gray(\"Created: .lynxprompt/rules/agents.md\"));\n }\n\n // Determine which exporters to enable\n let exporters: string[] = [];\n \n if (agentDetection.detected.length > 0) {\n // Use detected agents\n exporters = agentDetection.detected.map((d) => d.agent.id);\n \n // If more than 3 detected, ask which to enable (unless --yes)\n if (agentDetection.detected.length > 3 && !options.yes) {\n const { selected } = await prompts({\n type: \"multiselect\",\n name: \"selected\",\n message: \"Select agents to enable:\",\n choices: agentDetection.detected.map((d) => ({\n title: d.agent.name,\n value: d.agent.id,\n selected: true,\n })),\n hint: \"- Space to toggle, Enter to confirm\",\n });\n \n if (selected && selected.length > 0) {\n exporters = selected;\n }\n }\n } else {\n // Default to AGENTS.md (universal format)\n exporters = [\"agents\"];\n \n // Offer to select popular agents if interactive\n if (!options.yes) {\n const popular = getPopularAgents();\n const { selected } = await prompts({\n type: \"multiselect\",\n name: \"selected\",\n message: \"Select AI agents to sync to:\",\n choices: popular.map((a) => ({\n title: `${a.name} - ${a.description}`,\n value: a.id,\n selected: a.id === \"agents\", // Default select AGENTS.md\n })),\n hint: \"- Space to toggle, Enter to confirm\",\n });\n \n if (selected && selected.length > 0) {\n exporters = selected;\n }\n }\n }\n\n console.log(chalk.gray(`Enabling ${exporters.length} exporter${exporters.length === 1 ? \"\" : \"s\"}: ${exporters.join(\", \")}`));\n\n // Create config file\n await mkdir(dirname(configPath), { recursive: true });\n await writeFile(configPath, createDefaultConfig(exporters), \"utf-8\");\n\n // Create README\n const readmePath = join(lynxpromptDir, \"README.md\");\n await writeFile(readmePath, createLynxpromptReadme(), \"utf-8\");\n\n // Create .gitignore for local state\n const gitignorePath = join(lynxpromptDir, \".gitignore\");\n const gitignoreContent = `# Local state files\n.cache/\n.backups/\n`;\n await writeFile(gitignorePath, gitignoreContent, \"utf-8\");\n\n console.log();\n console.log(chalk.green(\"ā
LynxPrompt initialized!\"));\n console.log();\n console.log(chalk.gray(\"Created:\"));\n console.log(chalk.gray(` ${LYNXPROMPT_CONFIG} - Configuration`));\n console.log(chalk.gray(` ${LYNXPROMPT_RULES}/ - Your rules (edit here)`));\n console.log();\n console.log(chalk.cyan(\"Next steps:\"));\n console.log(chalk.gray(\" 1. Edit your rules in .lynxprompt/rules/\"));\n console.log(chalk.gray(\" 2. Run 'lynxp sync' to export to your AI agents\"));\n console.log(chalk.gray(\" 3. Or run 'lynxp agents' to manage which agents to sync to\"));\n console.log();\n}\n","/**\n * Agent detection for LynxPrompt\n * Scans the project to detect which AI agents are in use\n */\n\nimport { existsSync, readdirSync, readFileSync, statSync } from \"fs\";\nimport { join, relative } from \"path\";\nimport { AGENTS, type AgentDefinition, getAgentDisplayName } from \"./agents.js\";\n\nexport interface DetectedAgent {\n /** Agent definition */\n agent: AgentDefinition;\n /** Files/directories found */\n files: string[];\n /** Whether the files have content (not empty) */\n hasContent: boolean;\n /** Approximate rule/section count */\n ruleCount: number;\n}\n\nexport interface DetectionResult {\n /** All detected agents with their files */\n detected: DetectedAgent[];\n /** Popular agents that were detected */\n popularDetected: DetectedAgent[];\n /** Agents that could be imported (have content) */\n importable: DetectedAgent[];\n /** Summary for display */\n summary: string;\n}\n\n/**\n * Detect all AI coding agents in the project\n * @param cwd - Directory to scan (defaults to process.cwd())\n */\nexport function detectAgents(cwd: string = process.cwd()): DetectionResult {\n const detected: DetectedAgent[] = [];\n\n for (const agent of AGENTS) {\n const result = detectAgent(cwd, agent);\n if (result) {\n detected.push(result);\n }\n }\n\n const popularDetected = detected.filter((d) => d.agent.popular);\n const importable = detected.filter((d) => d.hasContent);\n\n // Build summary\n let summary: string;\n if (detected.length === 0) {\n summary = \"No AI agent configuration files detected\";\n } else if (detected.length === 1) {\n summary = `Found ${getAgentDisplayName(detected[0].agent.id)} configuration`;\n } else {\n const names = detected.slice(0, 3).map((d) => d.agent.name);\n const more = detected.length > 3 ? ` +${detected.length - 3} more` : \"\";\n summary = `Found ${detected.length} agents: ${names.join(\", \")}${more}`;\n }\n\n return { detected, popularDetected, importable, summary };\n}\n\n/**\n * Detect a single agent\n */\nfunction detectAgent(cwd: string, agent: AgentDefinition): DetectedAgent | null {\n const files: string[] = [];\n let hasContent = false;\n let ruleCount = 0;\n\n for (const pattern of agent.patterns) {\n const fullPath = join(cwd, pattern);\n\n if (!existsSync(fullPath)) {\n continue;\n }\n\n const stats = statSync(fullPath);\n\n if (stats.isDirectory()) {\n // Scan directory for rule files\n const dirFiles = scanDirectory(fullPath, agent.format);\n if (dirFiles.length > 0) {\n files.push(pattern);\n hasContent = true;\n ruleCount += dirFiles.reduce((sum, f) => sum + f.sections, 0);\n }\n } else if (stats.isFile()) {\n files.push(pattern);\n const content = safeReadFile(fullPath);\n if (content && content.trim().length > 0) {\n hasContent = true;\n ruleCount += countSections(content);\n }\n }\n }\n\n if (files.length === 0) {\n return null;\n }\n\n return { agent, files, hasContent, ruleCount };\n}\n\ninterface ScannedFile {\n path: string;\n sections: number;\n}\n\n/**\n * Scan a directory for rule files\n */\nfunction scanDirectory(dirPath: string, format: string): ScannedFile[] {\n const results: ScannedFile[] = [];\n\n try {\n const entries = readdirSync(dirPath, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isFile()) continue;\n\n // Check file extension based on format\n const name = entry.name.toLowerCase();\n const isRuleFile =\n (format === \"mdc\" && name.endsWith(\".mdc\")) ||\n (format === \"markdown\" && name.endsWith(\".md\")) ||\n (format === \"json\" && name.endsWith(\".json\")) ||\n (format === \"yaml\" && (name.endsWith(\".yml\") || name.endsWith(\".yaml\")));\n\n if (!isRuleFile) continue;\n\n const filePath = join(dirPath, entry.name);\n const content = safeReadFile(filePath);\n if (content && content.trim().length > 0) {\n results.push({\n path: filePath,\n sections: countSections(content),\n });\n }\n }\n } catch {\n // Directory not readable\n }\n\n return results;\n}\n\n/**\n * Count sections/rules in content (by counting markdown headings)\n */\nfunction countSections(content: string): number {\n const headings = content.match(/^#{1,6}\\s+.+$/gm);\n return headings ? headings.length : (content.trim().length > 0 ? 1 : 0);\n}\n\n/**\n * Safely read a file\n */\nfunction safeReadFile(path: string): string | null {\n try {\n return readFileSync(path, \"utf-8\");\n } catch {\n return null;\n }\n}\n\n/**\n * Get a simple list of detected agent names\n */\nexport function getDetectedAgentNames(cwd: string = process.cwd()): string[] {\n const result = detectAgents(cwd);\n return result.detected.map((d) => d.agent.id);\n}\n\n/**\n * Check if a specific agent is detected\n */\nexport function isAgentDetected(agentId: string, cwd: string = process.cwd()): boolean {\n const result = detectAgents(cwd);\n return result.detected.some((d) => d.agent.id === agentId);\n}\n\n/**\n * Get recommended agents based on detection\n * Returns detected agents, or popular defaults if none detected\n */\nexport function getRecommendedAgents(cwd: string = process.cwd()): AgentDefinition[] {\n const result = detectAgents(cwd);\n \n if (result.detected.length > 0) {\n return result.detected.map((d) => d.agent);\n }\n\n // Default to popular agents\n return AGENTS.filter((a) => a.popular).slice(0, 2);\n}\n\n/**\n * Format detection results for display\n */\nexport function formatDetectionResults(result: DetectionResult): string {\n if (result.detected.length === 0) {\n return \"No AI agent configuration files found.\\n\\nRun 'lynxp wizard' to create your first configuration.\";\n }\n\n const lines: string[] = [\n `Found ${result.detected.length} AI agent${result.detected.length === 1 ? \"\" : \"s\"}:`,\n \"\",\n ];\n\n for (const detected of result.detected) {\n const icon = detected.hasContent ? \"ā\" : \"ā\";\n const rules = detected.ruleCount > 0 ? ` (${detected.ruleCount} sections)` : \"\";\n lines.push(` ${icon} ${detected.agent.name}${rules}`);\n for (const file of detected.files) {\n lines.push(` āā ${file}`);\n }\n }\n\n if (result.importable.length > 0) {\n lines.push(\"\");\n lines.push(`${result.importable.length} can be imported into LynxPrompt.`);\n }\n\n return lines.join(\"\\n\");\n}\n\n","/**\n * Comprehensive agent definitions for LynxPrompt\n * Supports 40+ AI coding agents with simple, discoverable patterns\n */\n\nexport interface AgentDefinition {\n /** Unique identifier */\n id: string;\n /** Human-readable name */\n name: string;\n /** Short description */\n description: string;\n /** File/directory patterns to detect this agent */\n patterns: string[];\n /** Output file path when exporting */\n output: string;\n /** Output format type */\n format: \"markdown\" | \"mdc\" | \"json\" | \"yaml\" | \"toml\" | \"text\";\n /** Category for grouping */\n category: \"popular\" | \"markdown\" | \"config\" | \"mcp\" | \"directory\";\n /** Whether this is a commonly used agent */\n popular?: boolean;\n}\n\n/**\n * All supported AI coding agents\n * Organized by popularity and format type\n */\nexport const AGENTS: AgentDefinition[] = [\n // === POPULAR AGENTS ===\n {\n id: \"cursor\",\n name: \"Cursor\",\n description: \"AI-powered code editor with .cursor/rules/ support\",\n patterns: [\".cursor/rules/\"],\n output: \".cursor/rules/\",\n format: \"mdc\",\n category: \"popular\",\n popular: true,\n },\n {\n id: \"agents\",\n name: \"AGENTS.md\",\n description: \"Universal format for Claude Code, GitHub Copilot, Aider, and others\",\n patterns: [\"AGENTS.md\"],\n output: \"AGENTS.md\",\n format: \"markdown\",\n category: \"popular\",\n popular: true,\n },\n {\n id: \"claude\",\n name: \"Claude Code\",\n description: \"Anthropic's Claude with CLAUDE.md support\",\n patterns: [\"CLAUDE.md\"],\n output: \"CLAUDE.md\",\n format: \"markdown\",\n category: \"popular\",\n popular: true,\n },\n {\n id: \"copilot\",\n name: \"GitHub Copilot\",\n description: \"GitHub's AI pair programmer\",\n patterns: [\".github/copilot-instructions.md\"],\n output: \".github/copilot-instructions.md\",\n format: \"markdown\",\n category: \"popular\",\n popular: true,\n },\n {\n id: \"windsurf\",\n name: \"Windsurf\",\n description: \"Codeium's AI IDE with .windsurfrules support\",\n patterns: [\".windsurfrules\", \".windsurf/rules/\"],\n output: \".windsurfrules\",\n format: \"text\",\n category: \"popular\",\n popular: true,\n },\n\n // === MARKDOWN FORMAT AGENTS ===\n {\n id: \"gemini\",\n name: \"Gemini\",\n description: \"Google's Gemini AI assistant\",\n patterns: [\"GEMINI.md\"],\n output: \"GEMINI.md\",\n format: \"markdown\",\n category: \"markdown\",\n },\n {\n id: \"warp\",\n name: \"Warp AI\",\n description: \"Warp terminal's AI assistant\",\n patterns: [\"WARP.md\"],\n output: \"WARP.md\",\n format: \"markdown\",\n category: \"markdown\",\n },\n {\n id: \"zed\",\n name: \"Zed\",\n description: \"High-performance code editor with AI features\",\n patterns: [\".zed/instructions.md\", \"ZED.md\"],\n output: \".zed/instructions.md\",\n format: \"markdown\",\n category: \"markdown\",\n },\n {\n id: \"crush\",\n name: \"Crush\",\n description: \"AI coding assistant\",\n patterns: [\"CRUSH.md\"],\n output: \"CRUSH.md\",\n format: \"markdown\",\n category: \"markdown\",\n },\n {\n id: \"junie\",\n name: \"Junie\",\n description: \"JetBrains' AI coding assistant\",\n patterns: [\".junie/guidelines.md\"],\n output: \".junie/guidelines.md\",\n format: \"markdown\",\n category: \"markdown\",\n },\n {\n id: \"openhands\",\n name: \"OpenHands\",\n description: \"Open-source AI coding agent\",\n patterns: [\".openhands/microagents/repo.md\"],\n output: \".openhands/microagents/repo.md\",\n format: \"markdown\",\n category: \"markdown\",\n },\n\n // === PLAIN TEXT FORMAT ===\n {\n id: \"cline\",\n name: \"Cline\",\n description: \"VS Code AI assistant extension\",\n patterns: [\".clinerules\"],\n output: \".clinerules\",\n format: \"text\",\n category: \"config\",\n },\n {\n id: \"goose\",\n name: \"Goose\",\n description: \"Block's AI coding assistant\",\n patterns: [\".goosehints\"],\n output: \".goosehints\",\n format: \"text\",\n category: \"config\",\n },\n {\n id: \"aider\",\n name: \"Aider\",\n description: \"AI pair programming in your terminal\",\n patterns: [\".aider.conf.yml\", \"AIDER.md\"],\n output: \"AIDER.md\",\n format: \"markdown\",\n category: \"config\",\n },\n\n // === DIRECTORY-BASED AGENTS ===\n {\n id: \"amazonq\",\n name: \"Amazon Q\",\n description: \"AWS's AI coding assistant\",\n patterns: [\".amazonq/rules/\"],\n output: \".amazonq/rules/\",\n format: \"mdc\",\n category: \"directory\",\n },\n {\n id: \"augmentcode\",\n name: \"Augment Code\",\n description: \"AI code augmentation tool\",\n patterns: [\".augment/rules/\"],\n output: \".augment/rules/\",\n format: \"mdc\",\n category: \"directory\",\n },\n {\n id: \"kilocode\",\n name: \"Kilocode\",\n description: \"AI-powered code generation\",\n patterns: [\".kilocode/rules/\"],\n output: \".kilocode/rules/\",\n format: \"mdc\",\n category: \"directory\",\n },\n {\n id: \"kiro\",\n name: \"Kiro\",\n description: \"AWS's spec-driven AI coding agent\",\n patterns: [\".kiro/steering/\"],\n output: \".kiro/steering/\",\n format: \"mdc\",\n category: \"directory\",\n },\n {\n id: \"trae-ai\",\n name: \"Trae AI\",\n description: \"ByteDance's AI coding assistant\",\n patterns: [\".trae/rules/\"],\n output: \".trae/rules/\",\n format: \"mdc\",\n category: \"directory\",\n },\n {\n id: \"firebase-studio\",\n name: \"Firebase Studio\",\n description: \"Google's Firebase development environment\",\n patterns: [\".idx/\"],\n output: \".idx/\",\n format: \"mdc\",\n category: \"directory\",\n },\n {\n id: \"roocode\",\n name: \"Roo Code\",\n description: \"AI coding assistant for VS Code\",\n patterns: [\".roo/rules/\"],\n output: \".roo/rules/\",\n format: \"mdc\",\n category: \"directory\",\n },\n\n // === JSON/CONFIG FORMAT ===\n {\n id: \"firebender\",\n name: \"Firebender\",\n description: \"AI code transformation tool\",\n patterns: [\"firebender.json\"],\n output: \"firebender.json\",\n format: \"json\",\n category: \"config\",\n },\n {\n id: \"opencode\",\n name: \"Open Code\",\n description: \"Open-source AI coding tool\",\n patterns: [\"opencode.json\"],\n output: \"opencode.json\",\n format: \"json\",\n category: \"config\",\n },\n\n // === MCP (Model Context Protocol) AGENTS ===\n {\n id: \"vscode-mcp\",\n name: \"VS Code MCP\",\n description: \"VS Code with Model Context Protocol\",\n patterns: [\".vscode/mcp.json\"],\n output: \".vscode/mcp.json\",\n format: \"json\",\n category: \"mcp\",\n },\n {\n id: \"cursor-mcp\",\n name: \"Cursor MCP\",\n description: \"Cursor with Model Context Protocol\",\n patterns: [\".cursor/mcp.json\"],\n output: \".cursor/mcp.json\",\n format: \"json\",\n category: \"mcp\",\n },\n {\n id: \"root-mcp\",\n name: \"Root MCP\",\n description: \"Root-level MCP config for Claude Code, Aider\",\n patterns: [\".mcp.json\"],\n output: \".mcp.json\",\n format: \"json\",\n category: \"mcp\",\n },\n {\n id: \"windsurf-mcp\",\n name: \"Windsurf MCP\",\n description: \"Windsurf with Model Context Protocol\",\n patterns: [\".windsurf/mcp_config.json\"],\n output: \".windsurf/mcp_config.json\",\n format: \"json\",\n category: \"mcp\",\n },\n];\n\n/**\n * Get agent by ID\n */\nexport function getAgent(id: string): AgentDefinition | undefined {\n return AGENTS.find((a) => a.id === id);\n}\n\n/**\n * Get all popular agents (commonly used)\n */\nexport function getPopularAgents(): AgentDefinition[] {\n return AGENTS.filter((a) => a.popular);\n}\n\n/**\n * Get agents by category\n */\nexport function getAgentsByCategory(category: AgentDefinition[\"category\"]): AgentDefinition[] {\n return AGENTS.filter((a) => a.category === category);\n}\n\n/**\n * Get all agent IDs\n */\nexport function getAllAgentIds(): string[] {\n return AGENTS.map((a) => a.id);\n}\n\n/**\n * Get display name for an agent\n */\nexport function getAgentDisplayName(id: string): string {\n const agent = getAgent(id);\n return agent?.name ?? id;\n}\n\n","import { readFile, access, readdir } from \"fs/promises\";\nimport { join } from \"path\";\n\nexport interface DetectedProject {\n name: string | null;\n stack: string[];\n commands: {\n build?: string;\n test?: string;\n lint?: string;\n dev?: string;\n format?: string;\n };\n packageManager: \"npm\" | \"yarn\" | \"pnpm\" | \"bun\" | null;\n type: \"monorepo\" | \"library\" | \"application\" | \"unknown\";\n description?: string;\n}\n\n// Framework detection patterns\nconst JS_FRAMEWORK_PATTERNS: Record<string, string[]> = {\n nextjs: [\"next\"],\n react: [\"react\", \"react-dom\"],\n vue: [\"vue\"],\n angular: [\"@angular/core\"],\n svelte: [\"svelte\", \"@sveltejs/kit\"],\n solid: [\"solid-js\"],\n remix: [\"@remix-run/react\"],\n astro: [\"astro\"],\n nuxt: [\"nuxt\"],\n gatsby: [\"gatsby\"],\n};\n\nconst JS_TOOL_PATTERNS: Record<string, string[]> = {\n typescript: [\"typescript\"],\n tailwind: [\"tailwindcss\"],\n prisma: [\"prisma\", \"@prisma/client\"],\n drizzle: [\"drizzle-orm\"],\n express: [\"express\"],\n fastify: [\"fastify\"],\n hono: [\"hono\"],\n elysia: [\"elysia\"],\n trpc: [\"@trpc/server\"],\n graphql: [\"graphql\", \"@apollo/server\"],\n jest: [\"jest\"],\n vitest: [\"vitest\"],\n playwright: [\"@playwright/test\"],\n cypress: [\"cypress\"],\n eslint: [\"eslint\"],\n biome: [\"@biomejs/biome\"],\n prettier: [\"prettier\"],\n vite: [\"vite\"],\n webpack: [\"webpack\"],\n turbo: [\"turbo\"],\n};\n\nexport async function detectProject(cwd: string): Promise<DetectedProject | null> {\n const detected: DetectedProject = {\n name: null,\n stack: [],\n commands: {},\n packageManager: null,\n type: \"unknown\",\n };\n\n // Try to detect from package.json (Node.js projects)\n const packageJsonPath = join(cwd, \"package.json\");\n if (await fileExists(packageJsonPath)) {\n try {\n const content = await readFile(packageJsonPath, \"utf-8\");\n const pkg = JSON.parse(content);\n \n detected.name = pkg.name || null;\n detected.description = pkg.description;\n \n // Detect if it's a monorepo\n if (pkg.workspaces || await fileExists(join(cwd, \"pnpm-workspace.yaml\"))) {\n detected.type = \"monorepo\";\n } else if (pkg.main || pkg.exports) {\n detected.type = \"library\";\n } else {\n detected.type = \"application\";\n }\n \n // Detect stack from dependencies\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n \n // Detect frameworks\n for (const [framework, deps] of Object.entries(JS_FRAMEWORK_PATTERNS)) {\n if (deps.some(dep => allDeps[dep])) {\n detected.stack.push(framework);\n }\n }\n\n // Detect tools\n for (const [tool, deps] of Object.entries(JS_TOOL_PATTERNS)) {\n if (deps.some(dep => allDeps[dep])) {\n detected.stack.push(tool);\n }\n }\n\n // If no framework detected but has main/src, assume vanilla JS/TS\n if (detected.stack.length === 0 || (detected.stack.length === 1 && detected.stack[0] === \"typescript\")) {\n detected.stack.unshift(\"javascript\");\n }\n \n // Detect commands from scripts\n if (pkg.scripts) {\n detected.commands.build = pkg.scripts.build;\n detected.commands.test = pkg.scripts.test;\n detected.commands.lint = pkg.scripts.lint || pkg.scripts[\"lint:check\"];\n detected.commands.dev = pkg.scripts.dev || pkg.scripts.start || pkg.scripts.serve;\n detected.commands.format = pkg.scripts.format || pkg.scripts.prettier;\n }\n\n // Detect package manager from lockfiles\n if (await fileExists(join(cwd, \"pnpm-lock.yaml\"))) {\n detected.packageManager = \"pnpm\";\n } else if (await fileExists(join(cwd, \"yarn.lock\"))) {\n detected.packageManager = \"yarn\";\n } else if (await fileExists(join(cwd, \"bun.lockb\"))) {\n detected.packageManager = \"bun\";\n } else if (await fileExists(join(cwd, \"package-lock.json\"))) {\n detected.packageManager = \"npm\";\n }\n\n // Add package manager prefix to commands if detected\n if (detected.packageManager && detected.packageManager !== \"npm\") {\n const pm = detected.packageManager;\n for (const [key, value] of Object.entries(detected.commands)) {\n if (value && !value.startsWith(pm) && !value.startsWith(\"npx\")) {\n // Commands are already script names, prefix with package manager\n detected.commands[key as keyof typeof detected.commands] = `${pm} run ${value}`;\n }\n }\n } else if (detected.commands) {\n // Prefix with npm run\n for (const [key, value] of Object.entries(detected.commands)) {\n if (value && !value.startsWith(\"npm\") && !value.startsWith(\"npx\")) {\n detected.commands[key as keyof typeof detected.commands] = `npm run ${value}`;\n }\n }\n }\n\n // Fix: commands should be the actual script names for display\n if (pkg.scripts) {\n detected.commands.build = pkg.scripts.build ? \"build\" : undefined;\n detected.commands.test = pkg.scripts.test ? \"test\" : undefined;\n detected.commands.lint = pkg.scripts.lint ? \"lint\" : (pkg.scripts[\"lint:check\"] ? \"lint:check\" : undefined);\n detected.commands.dev = pkg.scripts.dev ? \"dev\" : (pkg.scripts.start ? \"start\" : (pkg.scripts.serve ? \"serve\" : undefined));\n }\n\n return detected;\n } catch {\n // Failed to parse package.json\n }\n }\n\n // Try to detect from pyproject.toml (Python projects)\n const pyprojectPath = join(cwd, \"pyproject.toml\");\n if (await fileExists(pyprojectPath)) {\n try {\n const content = await readFile(pyprojectPath, \"utf-8\");\n \n detected.stack.push(\"python\");\n detected.type = \"application\";\n \n // Extract project name (basic TOML parsing)\n const nameMatch = content.match(/name\\s*=\\s*\"([^\"]+)\"/);\n if (nameMatch) detected.name = nameMatch[1];\n \n // Detect frameworks and tools\n if (content.includes(\"fastapi\")) detected.stack.push(\"fastapi\");\n if (content.includes(\"django\")) detected.stack.push(\"django\");\n if (content.includes(\"flask\")) detected.stack.push(\"flask\");\n if (content.includes(\"pydantic\")) detected.stack.push(\"pydantic\");\n if (content.includes(\"sqlalchemy\")) detected.stack.push(\"sqlalchemy\");\n if (content.includes(\"pytest\")) detected.stack.push(\"pytest\");\n if (content.includes(\"ruff\")) detected.stack.push(\"ruff\");\n if (content.includes(\"mypy\")) detected.stack.push(\"mypy\");\n \n // Common Python commands\n detected.commands.test = \"pytest\";\n detected.commands.lint = \"ruff check .\";\n \n // Check if using poetry or uv\n if (content.includes(\"[tool.poetry]\")) {\n detected.packageManager = \"yarn\"; // Closest analogy\n detected.commands.dev = \"poetry run python -m uvicorn main:app --reload\";\n } else if (await fileExists(join(cwd, \"uv.lock\"))) {\n detected.commands.dev = \"uv run python main.py\";\n }\n \n return detected;\n } catch {\n // Failed to parse pyproject.toml\n }\n }\n\n // Try to detect from requirements.txt (Python projects)\n const requirementsPath = join(cwd, \"requirements.txt\");\n if (await fileExists(requirementsPath)) {\n try {\n const content = await readFile(requirementsPath, \"utf-8\");\n \n detected.stack.push(\"python\");\n detected.type = \"application\";\n \n if (content.toLowerCase().includes(\"fastapi\")) detected.stack.push(\"fastapi\");\n if (content.toLowerCase().includes(\"django\")) detected.stack.push(\"django\");\n if (content.toLowerCase().includes(\"flask\")) detected.stack.push(\"flask\");\n \n detected.commands.test = \"pytest\";\n detected.commands.lint = \"ruff check .\";\n \n return detected;\n } catch {\n // Failed to read requirements.txt\n }\n }\n\n // Try to detect from Cargo.toml (Rust projects)\n const cargoPath = join(cwd, \"Cargo.toml\");\n if (await fileExists(cargoPath)) {\n try {\n const content = await readFile(cargoPath, \"utf-8\");\n \n detected.stack.push(\"rust\");\n detected.type = \"application\";\n \n // Extract project name\n const nameMatch = content.match(/name\\s*=\\s*\"([^\"]+)\"/);\n if (nameMatch) detected.name = nameMatch[1];\n \n // Detect common crates\n if (content.includes(\"actix-web\")) detected.stack.push(\"actix\");\n if (content.includes(\"axum\")) detected.stack.push(\"axum\");\n if (content.includes(\"tokio\")) detected.stack.push(\"tokio\");\n if (content.includes(\"serde\")) detected.stack.push(\"serde\");\n if (content.includes(\"sqlx\")) detected.stack.push(\"sqlx\");\n \n detected.commands.build = \"cargo build\";\n detected.commands.test = \"cargo test\";\n detected.commands.lint = \"cargo clippy\";\n detected.commands.dev = \"cargo run\";\n \n return detected;\n } catch {\n // Failed to parse Cargo.toml\n }\n }\n\n // Try to detect from go.mod (Go projects)\n const goModPath = join(cwd, \"go.mod\");\n if (await fileExists(goModPath)) {\n try {\n const content = await readFile(goModPath, \"utf-8\");\n \n detected.stack.push(\"go\");\n detected.type = \"application\";\n \n // Extract module name\n const moduleMatch = content.match(/module\\s+(\\S+)/);\n if (moduleMatch) {\n const parts = moduleMatch[1].split(\"/\");\n detected.name = parts[parts.length - 1];\n }\n \n // Detect common frameworks\n if (content.includes(\"gin-gonic/gin\")) detected.stack.push(\"gin\");\n if (content.includes(\"gofiber/fiber\")) detected.stack.push(\"fiber\");\n if (content.includes(\"labstack/echo\")) detected.stack.push(\"echo\");\n if (content.includes(\"gorm.io/gorm\")) detected.stack.push(\"gorm\");\n \n detected.commands.build = \"go build\";\n detected.commands.test = \"go test ./...\";\n detected.commands.lint = \"golangci-lint run\";\n detected.commands.dev = \"go run .\";\n \n return detected;\n } catch {\n // Failed to parse go.mod\n }\n }\n\n // Try to detect from Makefile\n const makefilePath = join(cwd, \"Makefile\");\n if (await fileExists(makefilePath)) {\n try {\n const content = await readFile(makefilePath, \"utf-8\");\n \n // Extract targets\n if (content.includes(\"build:\")) detected.commands.build = \"make build\";\n if (content.includes(\"test:\")) detected.commands.test = \"make test\";\n if (content.includes(\"lint:\")) detected.commands.lint = \"make lint\";\n if (content.includes(\"dev:\")) detected.commands.dev = \"make dev\";\n if (content.includes(\"run:\")) detected.commands.dev = detected.commands.dev || \"make run\";\n \n if (Object.keys(detected.commands).length > 0) {\n detected.type = \"application\";\n return detected;\n }\n } catch {\n // Failed to read Makefile\n }\n }\n\n // Try to detect from Docker\n if (await fileExists(join(cwd, \"Dockerfile\")) || await fileExists(join(cwd, \"docker-compose.yml\"))) {\n detected.stack.push(\"docker\");\n detected.type = \"application\";\n }\n\n return detected.stack.length > 0 || detected.name ? detected : null;\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n","import chalk from \"chalk\";\nimport prompts from \"prompts\";\nimport ora from \"ora\";\nimport { writeFile, mkdir, readFile, access } from \"fs/promises\";\nimport { join, dirname } from \"path\";\nimport { detectProject } from \"../utils/detect.js\";\nimport { generateConfig, GenerateOptions } from \"../utils/generator.js\";\n\ninterface WizardOptions {\n name?: string;\n description?: string;\n stack?: string;\n platforms?: string;\n format?: string;\n persona?: string;\n boundaries?: string;\n preset?: string;\n yes?: boolean;\n}\n\n// Output format options - simplified for most users\nconst OUTPUT_FORMATS = [\n {\n title: \"AGENTS.md (Universal)\",\n value: \"agents\",\n description: \"Works with Claude Code, GitHub Copilot, Aider, and most AI editors\",\n recommended: true,\n },\n {\n title: \"Cursor (.cursor/rules/)\",\n value: \"cursor\",\n description: \"Cursor IDE with MDC format\",\n },\n {\n title: \"Multiple formats\",\n value: \"multiple\",\n description: \"Select multiple AI editors to generate for\",\n },\n];\n\n// Tech stack options\nconst TECH_STACKS = [\n { title: \"TypeScript\", value: \"typescript\" },\n { title: \"JavaScript\", value: \"javascript\" },\n { title: \"Python\", value: \"python\" },\n { title: \"Go\", value: \"go\" },\n { title: \"Rust\", value: \"rust\" },\n { title: \"Java\", value: \"java\" },\n { title: \"C#/.NET\", value: \"csharp\" },\n { title: \"Ruby\", value: \"ruby\" },\n { title: \"PHP\", value: \"php\" },\n { title: \"Swift\", value: \"swift\" },\n];\n\nconst FRAMEWORKS = [\n { title: \"React\", value: \"react\" },\n { title: \"Next.js\", value: \"nextjs\" },\n { title: \"Vue.js\", value: \"vue\" },\n { title: \"Angular\", value: \"angular\" },\n { title: \"Svelte\", value: \"svelte\" },\n { title: \"Express\", value: \"express\" },\n { title: \"FastAPI\", value: \"fastapi\" },\n { title: \"Django\", value: \"django\" },\n { title: \"Flask\", value: \"flask\" },\n { title: \"Spring Boot\", value: \"spring\" },\n { title: \"Rails\", value: \"rails\" },\n { title: \"Laravel\", value: \"laravel\" },\n];\n\n// Platform options (for multiple format selection)\nconst PLATFORMS = [\n { title: \"AGENTS.md (Universal)\", value: \"agents\", filename: \"AGENTS.md\" },\n { title: \"Cursor (.cursor/rules/)\", value: \"cursor\", filename: \".cursor/rules/project.mdc\" },\n { title: \"Claude Code (CLAUDE.md)\", value: \"claude\", filename: \"CLAUDE.md\" },\n { title: \"GitHub Copilot\", value: \"copilot\", filename: \".github/copilot-instructions.md\" },\n { title: \"Windsurf (.windsurfrules)\", value: \"windsurf\", filename: \".windsurfrules\" },\n { title: \"Zed\", value: \"zed\", filename: \".zed/instructions.md\" },\n];\n\n// Persona options\nconst PERSONAS = [\n { title: \"Full-Stack Developer - Complete application setups\", value: \"fullstack\" },\n { title: \"Backend Developer - APIs, databases, microservices\", value: \"backend\" },\n { title: \"Frontend Developer - UI, components, styling\", value: \"frontend\" },\n { title: \"DevOps Engineer - Infrastructure, CI/CD, containers\", value: \"devops\" },\n { title: \"Data Engineer - Pipelines, ETL, databases\", value: \"data\" },\n { title: \"Security Engineer - Secure code, vulnerabilities\", value: \"security\" },\n { title: \"Custom...\", value: \"custom\" },\n];\n\n// Boundary presets\nconst BOUNDARY_PRESETS = [\n {\n title: \"Standard - Balance of freedom and safety (recommended)\",\n value: \"standard\",\n always: [\"Read any file\", \"Modify files in src/\", \"Run build/test/lint\", \"Create test files\"],\n askFirst: [\"Add new dependencies\", \"Modify config files\", \"Create new modules\"],\n never: [\"Delete production data\", \"Modify .env secrets\", \"Force push\"],\n },\n {\n title: \"Conservative - Ask before most changes\",\n value: \"conservative\",\n always: [\"Read any file\", \"Run lint/format commands\"],\n askFirst: [\"Modify any file\", \"Add dependencies\", \"Create files\", \"Run tests\"],\n never: [\"Delete files\", \"Modify .env\", \"Push to git\"],\n },\n {\n title: \"Permissive - AI can modify freely within src/\",\n value: \"permissive\",\n always: [\"Modify any file in src/\", \"Run any script\", \"Add dependencies\", \"Create files\"],\n askFirst: [\"Modify root configs\", \"Delete directories\"],\n never: [\"Modify .env\", \"Access external APIs without confirmation\"],\n },\n];\n\nexport async function wizardCommand(options: WizardOptions): Promise<void> {\n console.log();\n console.log(chalk.cyan(\"š± LynxPrompt Wizard\"));\n console.log(chalk.gray(\"Generate AI IDE configuration in seconds\"));\n console.log();\n\n // Try to detect project info\n const detected = await detectProject(process.cwd());\n \n if (detected) {\n console.log(chalk.green(\"ā Detected project:\"));\n if (detected.name) console.log(chalk.gray(` Name: ${detected.name}`));\n if (detected.stack.length > 0) console.log(chalk.gray(` Stack: ${detected.stack.join(\", \")}`));\n if (detected.packageManager) console.log(chalk.gray(` Package manager: ${detected.packageManager}`));\n if (detected.commands.build) console.log(chalk.gray(` Build: ${detected.commands.build}`));\n if (detected.commands.test) console.log(chalk.gray(` Test: ${detected.commands.test}`));\n console.log();\n }\n\n let config: GenerateOptions;\n\n // Non-interactive mode with --yes flag\n if (options.yes) {\n // Determine platforms from format flag or defaults\n let platforms: string[];\n if (options.format) {\n platforms = options.format.split(\",\").map(f => f.trim());\n } else if (options.platforms) {\n platforms = options.platforms.split(\",\").map(p => p.trim());\n } else {\n platforms = [\"agents\"]; // Default to AGENTS.md\n }\n\n config = {\n name: options.name || detected?.name || \"my-project\",\n description: options.description || \"\",\n stack: options.stack?.split(\",\").map(s => s.trim()) || detected?.stack || [],\n platforms,\n persona: options.persona || \"fullstack\",\n boundaries: options.boundaries as \"conservative\" | \"standard\" | \"permissive\" || \"standard\",\n commands: detected?.commands || {},\n };\n } else {\n // Interactive mode\n config = await runInteractiveWizard(options, detected);\n }\n\n // Generate and write files\n const spinner = ora(\"Generating configuration...\").start();\n \n try {\n const files = generateConfig(config);\n spinner.stop();\n\n console.log();\n console.log(chalk.green(\"ā
Generated:\"));\n \n for (const [filename, content] of Object.entries(files)) {\n const outputPath = join(process.cwd(), filename);\n \n // Check if file exists\n let exists = false;\n try {\n await access(outputPath);\n exists = true;\n } catch {\n // File doesn't exist\n }\n\n // Ask to overwrite if exists and not in --yes mode\n if (exists && !options.yes) {\n const response = await prompts({\n type: \"confirm\",\n name: \"overwrite\",\n message: `${filename} already exists. Overwrite?`,\n initial: false,\n });\n \n if (!response.overwrite) {\n console.log(chalk.yellow(` Skipped: ${filename}`));\n continue;\n }\n }\n\n // Create directory if needed\n const dir = dirname(outputPath);\n if (dir !== \".\") {\n await mkdir(dir, { recursive: true });\n }\n\n await writeFile(outputPath, content, \"utf-8\");\n console.log(` ${chalk.cyan(filename)}`);\n }\n\n console.log();\n console.log(chalk.gray(\"Your AI assistant will now follow these instructions.\"));\n console.log();\n console.log(chalk.gray(\"Tips:\"));\n console.log(chalk.gray(\" ⢠Edit the generated file anytime to customize rules\"));\n console.log(chalk.gray(\" ⢠Run 'lynxp wizard' again to regenerate\"));\n console.log(chalk.gray(\" ⢠Run 'lynxp check' to validate your configuration\"));\n console.log();\n } catch (error) {\n spinner.fail(\"Failed to generate files\");\n console.error(chalk.red(\"\\nā An error occurred while generating configuration files.\"));\n if (error instanceof Error) {\n console.error(chalk.gray(` ${error.message}`));\n }\n console.error(chalk.gray(\"\\nTry running with --yes flag for default settings.\"));\n process.exit(1);\n }\n}\n\nasync function runInteractiveWizard(\n options: WizardOptions,\n detected: Awaited<ReturnType<typeof detectProject>> | null\n): Promise<GenerateOptions> {\n const answers: Record<string, unknown> = {};\n\n // Step 1: Output format (simplified - most important decision first)\n let platforms: string[];\n \n if (options.format) {\n // Format provided via flag\n platforms = options.format.split(\",\").map(f => f.trim());\n } else {\n const formatResponse = await prompts({\n type: \"select\",\n name: \"format\",\n message: \"Select output format:\",\n choices: OUTPUT_FORMATS.map(f => ({\n title: f.recommended ? `${f.title} ${chalk.green(\"(recommended)\")}` : f.title,\n value: f.value,\n description: f.description,\n })),\n initial: 0, // AGENTS.md is default\n });\n\n if (formatResponse.format === \"multiple\") {\n // Show multi-select for platforms\n const platformResponse = await prompts({\n type: \"multiselect\",\n name: \"platforms\",\n message: \"Select AI editors:\",\n choices: PLATFORMS.map(p => ({ title: p.title, value: p.value })),\n hint: \"- Space to select, Enter to confirm\",\n min: 1,\n });\n platforms = platformResponse.platforms || [\"agents\"];\n } else {\n platforms = [formatResponse.format || \"agents\"];\n }\n }\n answers.platforms = platforms;\n\n // Step 2: Project name\n const nameResponse = await prompts({\n type: \"text\",\n name: \"name\",\n message: \"Project name:\",\n initial: options.name || detected?.name || \"my-project\",\n });\n answers.name = nameResponse.name || \"my-project\";\n\n // Step 3: Quick description (optional)\n const descResponse = await prompts({\n type: \"text\",\n name: \"description\",\n message: \"Brief description (optional):\",\n initial: options.description || \"\",\n });\n answers.description = descResponse.description || \"\";\n\n // Step 4: Tech stack (pre-select detected)\n const allStackOptions = [...TECH_STACKS, ...FRAMEWORKS];\n const detectedStackSet = new Set(detected?.stack || []);\n \n const stackResponse = await prompts({\n type: \"multiselect\",\n name: \"stack\",\n message: \"Tech stack:\",\n choices: allStackOptions.map(s => ({\n title: s.title,\n value: s.value,\n selected: detectedStackSet.has(s.value),\n })),\n hint: \"- Space to select, Enter to confirm\",\n });\n answers.stack = stackResponse.stack || [];\n\n // Step 5: Persona (simplified - fullstack is default)\n const personaResponse = await prompts({\n type: \"select\",\n name: \"persona\",\n message: \"AI persona:\",\n choices: PERSONAS,\n initial: 0, // Full-stack by default\n });\n \n if (personaResponse.persona === \"custom\") {\n const customPersona = await prompts({\n type: \"text\",\n name: \"value\",\n message: \"Describe the custom persona:\",\n });\n answers.persona = customPersona.value || \"fullstack\";\n } else {\n answers.persona = personaResponse.persona || \"fullstack\";\n }\n\n // Step 6: Boundaries (standard is default)\n const boundaryResponse = await prompts({\n type: \"select\",\n name: \"boundaries\",\n message: \"AI boundaries:\",\n choices: BOUNDARY_PRESETS.map(b => ({ title: b.title, value: b.value })),\n initial: 0, // Standard by default\n });\n answers.boundaries = boundaryResponse.boundaries || \"standard\";\n\n // Step 7: Commands (auto-detected, quick confirm)\n if (detected?.commands && Object.keys(detected.commands).length > 0) {\n console.log();\n console.log(chalk.gray(\"Auto-detected commands:\"));\n if (detected.commands.build) console.log(chalk.gray(` Build: ${detected.commands.build}`));\n if (detected.commands.test) console.log(chalk.gray(` Test: ${detected.commands.test}`));\n if (detected.commands.lint) console.log(chalk.gray(` Lint: ${detected.commands.lint}`));\n if (detected.commands.dev) console.log(chalk.gray(` Dev: ${detected.commands.dev}`));\n \n const editCommands = await prompts({\n type: \"confirm\",\n name: \"edit\",\n message: \"Edit commands?\",\n initial: false,\n });\n\n if (editCommands.edit) {\n const commandsResponse = await prompts([\n { type: \"text\", name: \"build\", message: \"Build:\", initial: detected.commands.build },\n { type: \"text\", name: \"test\", message: \"Test:\", initial: detected.commands.test },\n { type: \"text\", name: \"lint\", message: \"Lint:\", initial: detected.commands.lint },\n { type: \"text\", name: \"dev\", message: \"Dev:\", initial: detected.commands.dev },\n ]);\n answers.commands = commandsResponse;\n } else {\n answers.commands = detected.commands;\n }\n } else {\n answers.commands = {};\n }\n\n return {\n name: answers.name as string,\n description: answers.description as string,\n stack: answers.stack as string[],\n platforms: answers.platforms as string[],\n persona: answers.persona as string,\n boundaries: answers.boundaries as \"conservative\" | \"standard\" | \"permissive\",\n commands: answers.commands as Record<string, string>,\n };\n}\n","export interface GenerateOptions {\n name: string;\n description: string;\n stack: string[];\n platforms: string[];\n persona: string;\n boundaries: \"conservative\" | \"standard\" | \"permissive\";\n commands: {\n build?: string;\n test?: string;\n lint?: string;\n dev?: string;\n };\n}\n\n// Platform to filename mapping\nconst PLATFORM_FILES: Record<string, string> = {\n agents: \"AGENTS.md\",\n cursor: \".cursor/rules/project.mdc\",\n claude: \"CLAUDE.md\",\n copilot: \".github/copilot-instructions.md\",\n windsurf: \".windsurfrules\",\n zed: \".zed/instructions.md\",\n};\n\n// Persona descriptions\nconst PERSONA_DESCRIPTIONS: Record<string, string> = {\n backend: \"a senior backend developer specializing in APIs, databases, and microservices architecture\",\n frontend: \"a senior frontend developer specializing in UI components, styling, and user experience\",\n fullstack: \"a senior full-stack developer capable of working across the entire application stack\",\n devops: \"a DevOps engineer specializing in infrastructure, CI/CD pipelines, and containerization\",\n data: \"a data engineer specializing in data pipelines, ETL processes, and database optimization\",\n security: \"a security engineer focused on secure coding practices and vulnerability prevention\",\n};\n\n// Stack display names\nconst STACK_NAMES: Record<string, string> = {\n typescript: \"TypeScript\",\n javascript: \"JavaScript\",\n python: \"Python\",\n go: \"Go\",\n rust: \"Rust\",\n java: \"Java\",\n csharp: \"C#/.NET\",\n ruby: \"Ruby\",\n php: \"PHP\",\n swift: \"Swift\",\n react: \"React\",\n nextjs: \"Next.js\",\n vue: \"Vue.js\",\n angular: \"Angular\",\n svelte: \"Svelte\",\n express: \"Express.js\",\n fastapi: \"FastAPI\",\n django: \"Django\",\n flask: \"Flask\",\n spring: \"Spring Boot\",\n rails: \"Ruby on Rails\",\n laravel: \"Laravel\",\n prisma: \"Prisma\",\n tailwind: \"Tailwind CSS\",\n fastify: \"Fastify\",\n};\n\n// Boundary presets\nconst BOUNDARIES: Record<string, { always: string[]; askFirst: string[]; never: string[] }> = {\n conservative: {\n always: [\"Read any file in the project\", \"Run lint and format commands\"],\n askFirst: [\n \"Modify any source file\",\n \"Add new dependencies\",\n \"Create new files\",\n \"Run test commands\",\n \"Modify configuration files\",\n ],\n never: [\n \"Delete any files\",\n \"Modify .env or secret files\",\n \"Push to git or make commits\",\n \"Access external APIs or services\",\n ],\n },\n standard: {\n always: [\n \"Read any file in the project\",\n \"Modify files in src/ or lib/\",\n \"Run build, test, and lint commands\",\n \"Create test files\",\n \"Fix linting errors automatically\",\n ],\n askFirst: [\n \"Add new dependencies to package.json\",\n \"Modify configuration files at root level\",\n \"Create new modules or directories\",\n \"Refactor code structure significantly\",\n ],\n never: [\n \"Modify .env files or secrets\",\n \"Delete critical files without backup\",\n \"Force push to git\",\n \"Expose sensitive information in logs\",\n ],\n },\n permissive: {\n always: [\n \"Modify any file in src/ or lib/\",\n \"Run any build, test, or dev scripts\",\n \"Add or update dependencies\",\n \"Create new files and directories\",\n \"Refactor and reorganize code\",\n ],\n askFirst: [\n \"Modify root-level configuration files\",\n \"Delete directories\",\n \"Make breaking changes to public APIs\",\n ],\n never: [\n \"Modify .env files directly\",\n \"Commit secrets or credentials\",\n \"Access production databases\",\n ],\n },\n};\n\nexport function generateConfig(options: GenerateOptions): Record<string, string> {\n const files: Record<string, string> = {};\n\n for (const platform of options.platforms) {\n const filename = PLATFORM_FILES[platform];\n if (filename) {\n files[filename] = generateFileContent(options, platform);\n }\n }\n\n return files;\n}\n\nfunction generateFileContent(options: GenerateOptions, platform: string): string {\n const sections: string[] = [];\n const isMdc = platform === \"cursor\"; // Cursor uses MDC format (Markdown with YAML frontmatter)\n const isPlainText = platform === \"windsurf\"; // Windsurf uses plain text\n const isMarkdown = !isMdc && !isPlainText;\n \n // MDC frontmatter for Cursor\n if (isMdc) {\n sections.push(\"---\");\n sections.push(`description: \"${options.name} - AI coding rules\"`);\n sections.push('globs: [\"**/*\"]');\n sections.push(\"alwaysApply: true\");\n sections.push(\"---\");\n sections.push(\"\");\n sections.push(`# ${options.name} - AI Assistant Configuration`);\n sections.push(\"\");\n }\n \n // Header for regular markdown\n if (isMarkdown) {\n sections.push(`# ${options.name} - AI Assistant Configuration`);\n sections.push(\"\");\n }\n\n // Persona section\n const personaDesc = PERSONA_DESCRIPTIONS[options.persona] || options.persona;\n if (isMarkdown || isMdc) {\n sections.push(\"## Persona\");\n sections.push(\"\");\n sections.push(`You are ${personaDesc}. You assist developers working on ${options.name}.`);\n } else {\n sections.push(`You are ${personaDesc}. You assist developers working on ${options.name}.`);\n }\n \n if (options.description) {\n sections.push(\"\");\n sections.push(`Project description: ${options.description}`);\n }\n sections.push(\"\");\n\n // Tech Stack section\n if (options.stack.length > 0) {\n if (isMarkdown || isMdc) {\n sections.push(\"## Tech Stack\");\n sections.push(\"\");\n } else {\n sections.push(\"Tech Stack:\");\n }\n \n const stackList = options.stack.map(s => STACK_NAMES[s] || s);\n if (isMarkdown || isMdc) {\n for (const tech of stackList) {\n sections.push(`- ${tech}`);\n }\n } else {\n sections.push(stackList.join(\", \"));\n }\n sections.push(\"\");\n }\n\n // Commands section\n const hasCommands = Object.values(options.commands).some(Boolean);\n if (hasCommands) {\n if (isMarkdown || isMdc) {\n sections.push(\"## Commands\");\n sections.push(\"\");\n sections.push(\"Use these commands for common tasks:\");\n sections.push(\"\");\n sections.push(\"```bash\");\n } else {\n sections.push(\"Commands:\");\n }\n \n if (options.commands.build) {\n sections.push((isMarkdown || isMdc) ? `# Build: ${options.commands.build}` : `- Build: ${options.commands.build}`);\n }\n if (options.commands.test) {\n sections.push((isMarkdown || isMdc) ? `# Test: ${options.commands.test}` : `- Test: ${options.commands.test}`);\n }\n if (options.commands.lint) {\n sections.push((isMarkdown || isMdc) ? `# Lint: ${options.commands.lint}` : `- Lint: ${options.commands.lint}`);\n }\n if (options.commands.dev) {\n sections.push((isMarkdown || isMdc) ? `# Dev: ${options.commands.dev}` : `- Dev: ${options.commands.dev}`);\n }\n \n if (isMarkdown || isMdc) {\n sections.push(\"```\");\n }\n sections.push(\"\");\n }\n\n // Boundaries section\n const boundaries = BOUNDARIES[options.boundaries];\n if (boundaries) {\n if (isMarkdown || isMdc) {\n sections.push(\"## Boundaries\");\n sections.push(\"\");\n \n sections.push(\"### ā
Always (do without asking)\");\n sections.push(\"\");\n for (const item of boundaries.always) {\n sections.push(`- ${item}`);\n }\n sections.push(\"\");\n \n sections.push(\"### ā ļø Ask First\");\n sections.push(\"\");\n for (const item of boundaries.askFirst) {\n sections.push(`- ${item}`);\n }\n sections.push(\"\");\n \n sections.push(\"### š« Never\");\n sections.push(\"\");\n for (const item of boundaries.never) {\n sections.push(`- ${item}`);\n }\n } else {\n sections.push(\"Boundaries:\");\n sections.push(\"\");\n sections.push(\"ALWAYS (do without asking):\");\n for (const item of boundaries.always) {\n sections.push(`- ${item}`);\n }\n sections.push(\"\");\n sections.push(\"ASK FIRST:\");\n for (const item of boundaries.askFirst) {\n sections.push(`- ${item}`);\n }\n sections.push(\"\");\n sections.push(\"NEVER:\");\n for (const item of boundaries.never) {\n sections.push(`- ${item}`);\n }\n }\n sections.push(\"\");\n }\n\n // Code Style section (basic guidelines based on stack)\n if (isMarkdown || isMdc) {\n sections.push(\"## Code Style\");\n sections.push(\"\");\n sections.push(\"Follow these conventions:\");\n sections.push(\"\");\n \n if (options.stack.includes(\"typescript\") || options.stack.includes(\"javascript\")) {\n sections.push(\"- Use TypeScript strict mode when available\");\n sections.push(\"- Prefer const over let, avoid var\");\n sections.push(\"- Use async/await over raw promises\");\n sections.push(\"- Use descriptive variable and function names\");\n }\n \n if (options.stack.includes(\"react\") || options.stack.includes(\"nextjs\")) {\n sections.push(\"- Use functional components with hooks\");\n sections.push(\"- Keep components small and focused\");\n sections.push(\"- Colocate related files (component, styles, tests)\");\n }\n \n if (options.stack.includes(\"python\")) {\n sections.push(\"- Follow PEP 8 style guidelines\");\n sections.push(\"- Use type hints for function signatures\");\n sections.push(\"- Prefer f-strings for string formatting\");\n }\n \n if (options.stack.includes(\"go\")) {\n sections.push(\"- Follow Go conventions (gofmt, golint)\");\n sections.push(\"- Use meaningful package names\");\n sections.push(\"- Handle errors explicitly\");\n }\n \n if (options.stack.includes(\"rust\")) {\n sections.push(\"- Follow Rust conventions (clippy)\");\n sections.push(\"- Use idiomatic Rust patterns\");\n sections.push(\"- Prefer Result over panic\");\n }\n\n // Generic guidelines\n sections.push(\"- Write self-documenting code\");\n sections.push(\"- Add comments for complex logic only\");\n sections.push(\"- Keep functions focused and testable\");\n sections.push(\"\");\n }\n\n // Footer\n if (isMarkdown || isMdc) {\n sections.push(\"---\");\n sections.push(\"\");\n sections.push(`*Generated by [LynxPrompt](https://lynxprompt.com) CLI*`);\n }\n\n return sections.join(\"\\n\");\n}\n\n\n","import chalk from \"chalk\";\nimport ora from \"ora\";\nimport { api, ApiRequestError, SearchResult } from \"../api.js\";\n\ninterface SearchOptions {\n limit: string;\n}\n\nexport async function searchCommand(\n query: string,\n options: SearchOptions\n): Promise<void> {\n const spinner = ora(`Searching for \"${query}\"...`).start();\n\n try {\n const limit = parseInt(options.limit, 10) || 20;\n const { templates, total, hasMore } = await api.searchBlueprints(query, limit);\n spinner.stop();\n\n if (templates.length === 0) {\n console.log();\n console.log(chalk.yellow(`No blueprints found for \"${query}\".`));\n console.log(chalk.gray(\"Try different keywords or browse at https://lynxprompt.com/blueprints\"));\n return;\n }\n\n console.log();\n console.log(chalk.cyan(`š Search Results for \"${query}\" (${total} found)`));\n console.log();\n\n for (const result of templates) {\n printSearchResult(result);\n }\n\n if (hasMore) {\n console.log(chalk.gray(`Showing ${templates.length} of ${total}. Use --limit to see more.`));\n }\n\n console.log();\n console.log(chalk.gray(\"Use 'lynxprompt pull <id>' to download a blueprint.\"));\n } catch (error) {\n spinner.fail(\"Search failed\");\n handleApiError(error);\n }\n}\n\nfunction printSearchResult(result: SearchResult): void {\n const priceInfo = result.price ? chalk.yellow(`ā¬${(result.price / 100).toFixed(2)}`) : chalk.green(\"Free\");\n const officialBadge = result.isOfficial ? chalk.magenta(\" ā
Official\") : \"\";\n \n console.log(` ${chalk.bold(result.name)}${officialBadge}`);\n console.log(` ${chalk.cyan(result.id)} ⢠${priceInfo}`);\n if (result.description) {\n console.log(` ${chalk.gray(truncate(result.description, 60))}`);\n }\n console.log(` ${chalk.gray(`by ${result.author}`)} ⢠${chalk.gray(`ā${result.downloads}`)} ${chalk.gray(`ā„${result.likes}`)}`);\n if (result.tags && result.tags.length > 0) {\n console.log(` ${formatTags(result.tags)}`);\n }\n console.log();\n}\n\nfunction formatTags(tags: string[]): string {\n return tags.slice(0, 4).map((t) => chalk.gray(`#${t}`)).join(\" \");\n}\n\nfunction truncate(str: string, maxLength: number): string {\n if (str.length <= maxLength) return str;\n return str.slice(0, maxLength - 3) + \"...\";\n}\n\nfunction handleApiError(error: unknown): void {\n if (error instanceof ApiRequestError) {\n console.error(chalk.red(`Error: ${error.message}`));\n } else {\n console.error(chalk.red(\"An unexpected error occurred.\"));\n }\n process.exit(1);\n}\n\n\n","import chalk from \"chalk\";\nimport { access, readFile, readdir, stat } from \"fs/promises\";\nimport { join } from \"path\";\nimport { existsSync } from \"fs\";\nimport { checkSyncStatus, loadBlueprints } from \"../utils/blueprint-tracker.js\";\n\n// AI config files to look for\nconst CONFIG_FILES = [\n { path: \"AGENTS.md\", name: \"AGENTS.md\", platform: \"Claude Code, Cursor, AI Agents\" },\n { path: \"CLAUDE.md\", name: \"CLAUDE.md\", platform: \"Claude Code\" },\n { path: \".github/copilot-instructions.md\", name: \"Copilot Instructions\", platform: \"GitHub Copilot\" },\n { path: \".windsurfrules\", name: \".windsurfrules\", platform: \"Windsurf\" },\n { path: \".zed/instructions.md\", name: \"Zed Instructions\", platform: \"Zed\" },\n { path: \".clinerules\", name: \".clinerules\", platform: \"Cline\" },\n { path: \".goosehints\", name: \".goosehints\", platform: \"Goose\" },\n { path: \"AIDER.md\", name: \"AIDER.md\", platform: \"Aider\" },\n];\n\n// Directory-based configs\nconst CONFIG_DIRS = [\n { path: \".cursor/rules\", name: \".cursor/rules/\", platform: \"Cursor\" },\n { path: \".amazonq/rules\", name: \".amazonq/rules/\", platform: \"Amazon Q\" },\n { path: \".augment/rules\", name: \".augment/rules/\", platform: \"Augment Code\" },\n];\n\nexport async function statusCommand(): Promise<void> {\n const cwd = process.cwd();\n \n console.log();\n console.log(chalk.cyan(\"š± LynxPrompt Status\"));\n console.log(chalk.gray(` Directory: ${cwd}`));\n console.log();\n\n // Check for .lynxprompt folder\n const lynxpromptExists = existsSync(join(cwd, \".lynxprompt\"));\n if (lynxpromptExists) {\n console.log(chalk.green(\"ā LynxPrompt initialized\"));\n \n // Show config summary\n const configPath = join(cwd, \".lynxprompt/conf.yml\");\n if (existsSync(configPath)) {\n try {\n const content = await readFile(configPath, \"utf-8\");\n const { parse } = await import(\"yaml\");\n const config = parse(content);\n if (config?.exporters?.length > 0) {\n console.log(chalk.gray(` Exporters: ${config.exporters.join(\", \")}`));\n }\n } catch {\n // Ignore parse errors\n }\n }\n console.log();\n }\n\n // Show tracked blueprints\n const trackedStatus = await checkSyncStatus(cwd);\n if (trackedStatus.length > 0) {\n console.log(chalk.cyan(\"š¦ Tracked Blueprints\"));\n console.log();\n \n for (const { blueprint, localModified, fileExists } of trackedStatus) {\n const statusIcon = !fileExists\n ? chalk.red(\"ā\")\n : localModified\n ? chalk.yellow(\"ā\")\n : chalk.green(\"ā\");\n \n const sourceLabel = {\n marketplace: chalk.gray(\"[marketplace]\"),\n team: chalk.blue(\"[team]\"),\n private: chalk.green(\"[private]\"),\n local: chalk.gray(\"[local]\"),\n }[blueprint.source];\n\n console.log(` ${statusIcon} ${chalk.bold(blueprint.file)} ${sourceLabel}`);\n console.log(` ${chalk.gray(`ID: ${blueprint.id} ⢠${blueprint.name}`)}`);\n \n if (!fileExists) {\n console.log(chalk.red(` ā File missing - run 'lynxp pull ${blueprint.id}' to restore`));\n } else if (localModified) {\n if (blueprint.source === \"marketplace\") {\n console.log(chalk.yellow(` ā Local changes (marketplace = read-only, won't sync back)`));\n } else {\n console.log(chalk.yellow(` ā Local changes - run 'lynxp push ${blueprint.file}' to sync`));\n }\n }\n console.log();\n }\n }\n\n // Show AI config files\n console.log(chalk.cyan(\"š AI Config Files\"));\n console.log();\n\n let foundAny = false;\n\n // Check single files\n for (const config of CONFIG_FILES) {\n const filePath = join(cwd, config.path);\n try {\n await access(filePath);\n const content = await readFile(filePath, \"utf-8\");\n const lines = content.split(\"\\n\").length;\n const size = formatBytes(content.length);\n\n foundAny = true;\n \n // Check if this file is tracked\n const tracked = trackedStatus.find(t => t.blueprint.file === config.path);\n const trackedLabel = tracked ? chalk.cyan(\" (tracked)\") : \"\";\n \n console.log(` ${chalk.green(\"ā\")} ${chalk.bold(config.name)}${trackedLabel}`);\n console.log(` ${chalk.gray(`Platform: ${config.platform}`)}`);\n console.log(` ${chalk.gray(`Size: ${size} (${lines} lines)`)}`);\n \n // Show first non-empty, non-comment line as preview\n const preview = getPreview(content);\n if (preview) {\n console.log(` ${chalk.gray(`Preview: ${preview}`)}`);\n }\n console.log();\n } catch {\n // File doesn't exist, skip\n }\n }\n\n // Check directories\n for (const config of CONFIG_DIRS) {\n const dirPath = join(cwd, config.path);\n if (existsSync(dirPath)) {\n try {\n const files = await readdir(dirPath);\n const ruleFiles = files.filter(f => f.endsWith(\".md\") || f.endsWith(\".mdc\"));\n \n if (ruleFiles.length > 0) {\n foundAny = true;\n console.log(` ${chalk.green(\"ā\")} ${chalk.bold(config.name)}`);\n console.log(` ${chalk.gray(`Platform: ${config.platform}`)}`);\n console.log(` ${chalk.gray(`Rules: ${ruleFiles.length} file${ruleFiles.length === 1 ? \"\" : \"s\"}`)}`);\n \n // List rule files\n for (const file of ruleFiles.slice(0, 3)) {\n console.log(` ${chalk.gray(` ⢠${file}`)}`);\n }\n if (ruleFiles.length > 3) {\n console.log(` ${chalk.gray(` ... and ${ruleFiles.length - 3} more`)}`);\n }\n console.log();\n }\n } catch {\n // Can't read directory\n }\n }\n }\n\n if (!foundAny) {\n console.log(chalk.yellow(\" No AI configuration files found.\"));\n console.log();\n console.log(chalk.gray(\" Get started:\"));\n console.log(chalk.gray(\" lynxp wizard Generate a configuration\"));\n console.log(chalk.gray(\" lynxp pull <id> Download from marketplace\"));\n console.log(chalk.gray(\" lynxp search <query> Search for blueprints\"));\n } else {\n console.log(chalk.gray(\"Commands:\"));\n console.log(chalk.gray(\" lynxp wizard Regenerate configuration\"));\n console.log(chalk.gray(\" lynxp check Validate files\"));\n console.log(chalk.gray(\" lynxp link --list Show tracked blueprints\"));\n }\n console.log();\n}\n\nfunction getPreview(content: string): string | null {\n const lines = content.split(\"\\n\");\n for (const line of lines) {\n const trimmed = line.trim();\n if (\n trimmed &&\n !trimmed.startsWith(\"#\") &&\n !trimmed.startsWith(\"//\") &&\n !trimmed.startsWith(\"<!--\") &&\n !trimmed.startsWith(\"---\") &&\n !trimmed.startsWith(\">\")\n ) {\n return truncate(trimmed, 50);\n }\n }\n return null;\n}\n\nfunction truncate(str: string, maxLength: number): string {\n if (str.length <= maxLength) return str;\n return str.slice(0, maxLength - 3) + \"...\";\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n","/**\n * Sync command - export rules to all configured agents\n * \n * This is the core of LynxPrompt CLI: one command to sync your rules\n * to all AI coding agents you use.\n * \n * Usage:\n * lynxp sync - Sync rules to configured agents\n * lynxp sync --dry-run - Preview changes without writing\n * lynxp sync --force - Skip prompts (for CI)\n */\n\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport prompts from \"prompts\";\nimport { readFile, writeFile, mkdir, access, readdir } from \"fs/promises\";\nimport { join, dirname, basename } from \"path\";\nimport { existsSync } from \"fs\";\nimport * as yaml from \"yaml\";\nimport { AGENTS, getAgent, type AgentDefinition } from \"../utils/agents.js\";\n\ninterface SyncOptions {\n dryRun?: boolean;\n force?: boolean;\n}\n\ninterface LynxPromptConfig {\n version: string;\n exporters: string[];\n sources: Array<{\n type: string;\n path: string;\n }>;\n}\n\ninterface SyncResult {\n written: string[];\n skipped: string[];\n errors: string[];\n}\n\n// Paths\nconst LYNXPROMPT_DIR = \".lynxprompt\";\nconst CONFIG_FILE = \".lynxprompt/conf.yml\";\nconst RULES_DIR = \".lynxprompt/rules\";\n\nexport async function syncCommand(options: SyncOptions = {}): Promise<void> {\n console.log();\n console.log(chalk.cyan(\"š± LynxPrompt Sync\"));\n console.log();\n\n const cwd = process.cwd();\n\n // Check if initialized\n const configPath = join(cwd, CONFIG_FILE);\n if (!existsSync(configPath)) {\n console.log(chalk.yellow(\"LynxPrompt is not initialized in this project.\"));\n console.log();\n console.log(chalk.gray(\"Run 'lynxp init' first to set up LynxPrompt.\"));\n return;\n }\n\n // Load config\n const spinner = ora(\"Loading configuration...\").start();\n let config: LynxPromptConfig;\n \n try {\n const configContent = await readFile(configPath, \"utf-8\");\n config = yaml.parse(configContent) as LynxPromptConfig;\n spinner.succeed(\"Configuration loaded\");\n } catch (error) {\n spinner.fail(\"Failed to load configuration\");\n console.log(chalk.red(\"Could not parse .lynxprompt/conf.yml\"));\n return;\n }\n\n // Check exporters\n if (!config.exporters || config.exporters.length === 0) {\n console.log(chalk.yellow(\"No exporters configured.\"));\n console.log();\n console.log(chalk.gray(\"Add exporters to .lynxprompt/conf.yml or run 'lynxp agents enable <agent>'\"));\n return;\n }\n\n // Validate exporters\n const validExporters: AgentDefinition[] = [];\n const invalidExporters: string[] = [];\n\n for (const exporterId of config.exporters) {\n const agent = getAgent(exporterId);\n if (agent) {\n validExporters.push(agent);\n } else {\n invalidExporters.push(exporterId);\n }\n }\n\n if (invalidExporters.length > 0) {\n console.log(chalk.yellow(`Unknown exporters: ${invalidExporters.join(\", \")}`));\n }\n\n if (validExporters.length === 0) {\n console.log(chalk.red(\"No valid exporters configured.\"));\n return;\n }\n\n console.log(chalk.gray(`Exporters: ${validExporters.map((e) => e.name).join(\", \")}`));\n console.log();\n\n // Load rules\n const rulesPath = join(cwd, RULES_DIR);\n if (!existsSync(rulesPath)) {\n console.log(chalk.yellow(\"No rules found.\"));\n console.log(chalk.gray(`Create rules in ${RULES_DIR}/ to sync them.`));\n return;\n }\n\n const rulesContent = await loadRules(rulesPath);\n if (!rulesContent) {\n console.log(chalk.yellow(\"No rule files found in .lynxprompt/rules/\"));\n return;\n }\n\n console.log(chalk.gray(`Loaded ${rulesContent.fileCount} rule file${rulesContent.fileCount === 1 ? \"\" : \"s\"}`));\n console.log();\n\n // Dry run mode\n if (options.dryRun) {\n console.log(chalk.cyan(\"Dry run - no files will be written\"));\n console.log();\n console.log(\"Would write:\");\n for (const exporter of validExporters) {\n console.log(chalk.gray(` ${exporter.output}`));\n }\n console.log();\n return;\n }\n\n // Confirm if not forced\n if (!options.force) {\n const { confirm } = await prompts({\n type: \"confirm\",\n name: \"confirm\",\n message: `Sync to ${validExporters.length} agent${validExporters.length === 1 ? \"\" : \"s\"}?`,\n initial: true,\n });\n\n if (!confirm) {\n console.log(chalk.gray(\"Cancelled.\"));\n return;\n }\n }\n\n // Sync to each exporter\n const result: SyncResult = { written: [], skipped: [], errors: [] };\n const syncSpinner = ora(\"Syncing rules...\").start();\n\n for (const exporter of validExporters) {\n try {\n await syncToAgent(cwd, exporter, rulesContent.combined);\n result.written.push(exporter.output);\n } catch (error) {\n result.errors.push(`${exporter.id}: ${error instanceof Error ? error.message : \"Unknown error\"}`);\n }\n }\n\n syncSpinner.stop();\n\n // Show results\n if (result.written.length > 0) {\n console.log(chalk.green(`ā Synced to ${result.written.length} agent${result.written.length === 1 ? \"\" : \"s\"}:`));\n for (const file of result.written) {\n console.log(chalk.gray(` ${file}`));\n }\n }\n\n if (result.errors.length > 0) {\n console.log();\n console.log(chalk.red(\"Errors:\"));\n for (const error of result.errors) {\n console.log(chalk.red(` ${error}`));\n }\n }\n\n console.log();\n}\n\ninterface RulesContent {\n combined: string;\n files: Array<{ name: string; content: string }>;\n fileCount: number;\n}\n\n/**\n * Load and combine all rules from the rules directory\n */\nasync function loadRules(rulesPath: string): Promise<RulesContent | null> {\n const files: Array<{ name: string; content: string }> = [];\n\n try {\n const entries = await readdir(rulesPath, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isFile()) continue;\n if (!entry.name.endsWith(\".md\")) continue;\n\n const filePath = join(rulesPath, entry.name);\n const content = await readFile(filePath, \"utf-8\");\n \n if (content.trim()) {\n files.push({ name: entry.name, content: content.trim() });\n }\n }\n } catch {\n return null;\n }\n\n if (files.length === 0) {\n return null;\n }\n\n // Combine all rules with separators\n const combined = files\n .map((f) => f.content)\n .join(\"\\n\\n---\\n\\n\");\n\n return { combined, files, fileCount: files.length };\n}\n\n/**\n * Sync rules to a specific agent\n */\nasync function syncToAgent(\n cwd: string,\n agent: AgentDefinition,\n content: string\n): Promise<void> {\n const outputPath = join(cwd, agent.output);\n\n // Handle directory-based agents\n if (agent.output.endsWith(\"/\")) {\n await syncToDirectory(cwd, agent, content);\n return;\n }\n\n // Handle file-based agents\n const formatted = formatForAgent(agent, content);\n \n // Ensure directory exists\n const dir = dirname(outputPath);\n if (dir !== \".\") {\n await mkdir(dir, { recursive: true });\n }\n\n await writeFile(outputPath, formatted, \"utf-8\");\n}\n\n/**\n * Sync to a directory-based agent (like Cursor's .cursor/rules/)\n */\nasync function syncToDirectory(\n cwd: string,\n agent: AgentDefinition,\n content: string\n): Promise<void> {\n const outputDir = join(cwd, agent.output);\n await mkdir(outputDir, { recursive: true });\n\n // For directory-based agents, write a single combined file\n const extension = agent.format === \"mdc\" ? \".mdc\" : \".md\";\n const filename = `lynxprompt-rules${extension}`;\n const outputPath = join(outputDir, filename);\n\n const formatted = formatForAgent(agent, content);\n await writeFile(outputPath, formatted, \"utf-8\");\n}\n\n/**\n * Format content for a specific agent's format\n */\nfunction formatForAgent(agent: AgentDefinition, content: string): string {\n switch (agent.format) {\n case \"mdc\":\n return formatAsMdc(content, agent);\n case \"markdown\":\n return formatAsMarkdown(content, agent);\n case \"json\":\n return formatAsJson(content, agent);\n case \"text\":\n return content;\n default:\n return content;\n }\n}\n\n/**\n * Format as MDC (Cursor's format with YAML frontmatter)\n */\nfunction formatAsMdc(content: string, agent: AgentDefinition): string {\n const frontmatter = yaml.stringify({\n description: \"LynxPrompt rules - AI coding guidelines\",\n globs: [\"**/*\"],\n alwaysApply: true,\n });\n\n return `---\\n${frontmatter}---\\n\\n${content}`;\n}\n\n/**\n * Format as Markdown with header\n */\nfunction formatAsMarkdown(content: string, agent: AgentDefinition): string {\n const header = `# AI Coding Rules\\n\\n> Generated by [LynxPrompt](https://lynxprompt.com)\\n\\n`;\n return header + content;\n}\n\n/**\n * Format as JSON (for config-based agents)\n */\nfunction formatAsJson(content: string, agent: AgentDefinition): string {\n return JSON.stringify(\n {\n $schema: \"https://lynxprompt.com/schemas/rules.json\",\n version: \"1.0\",\n rules: content,\n meta: {\n generator: \"lynxprompt\",\n url: \"https://lynxprompt.com\",\n },\n },\n null,\n 2\n );\n}\n\n","/**\n * Agents command - manage which AI agents to sync to\n * \n * Simple, intuitive agent management:\n * lynxp agents - List all agents and their status\n * lynxp agents enable X - Enable an agent\n * lynxp agents disable X - Disable an agent\n * lynxp agents detect - Auto-detect agents in project\n */\n\nimport chalk from \"chalk\";\nimport prompts from \"prompts\";\nimport { readFile, writeFile } from \"fs/promises\";\nimport { join } from \"path\";\nimport { existsSync } from \"fs\";\nimport * as yaml from \"yaml\";\nimport { \n AGENTS, \n getAgent, \n getPopularAgents, \n getAgentsByCategory,\n type AgentDefinition \n} from \"../utils/agents.js\";\nimport { detectAgents, formatDetectionResults } from \"../utils/agent-detector.js\";\n\ninterface AgentsOptions {\n interactive?: boolean;\n}\n\n// Config paths\nconst CONFIG_FILE = \".lynxprompt/conf.yml\";\n\ninterface LynxPromptConfig {\n version: string;\n exporters: string[];\n sources: Array<{\n type: string;\n path: string;\n }>;\n}\n\nexport async function agentsCommand(\n action?: string,\n agentId?: string,\n options: AgentsOptions = {}\n): Promise<void> {\n console.log();\n\n switch (action) {\n case \"enable\":\n await enableAgent(agentId, options);\n break;\n case \"disable\":\n await disableAgent(agentId);\n break;\n case \"detect\":\n await detectAgentsInProject();\n break;\n case \"list\":\n default:\n await listAgents();\n break;\n }\n}\n\n/**\n * List all agents with their status\n */\nasync function listAgents(): Promise<void> {\n console.log(chalk.cyan(\"š± LynxPrompt Agents\"));\n console.log();\n\n const config = await loadConfig();\n const enabledSet = new Set(config?.exporters ?? []);\n const detection = detectAgents();\n\n // Show enabled agents first\n if (enabledSet.size > 0) {\n console.log(chalk.green(\"Enabled:\"));\n for (const id of enabledSet) {\n const agent = getAgent(id);\n const detected = detection.detected.find((d) => d.agent.id === id);\n const status = detected ? chalk.gray(\"(detected)\") : \"\";\n console.log(` ${chalk.green(\"ā\")} ${agent?.name ?? id} ${status}`);\n }\n console.log();\n }\n\n // Show detected but not enabled\n const detectedNotEnabled = detection.detected.filter(\n (d) => !enabledSet.has(d.agent.id)\n );\n if (detectedNotEnabled.length > 0) {\n console.log(chalk.yellow(\"Detected (not enabled):\"));\n for (const detected of detectedNotEnabled) {\n const rules = detected.ruleCount > 0 ? chalk.gray(` (${detected.ruleCount} rules)`) : \"\";\n console.log(` ${chalk.yellow(\"ā\")} ${detected.agent.name}${rules}`);\n }\n console.log();\n }\n\n // Show popular available\n const popular = getPopularAgents().filter(\n (a) => !enabledSet.has(a.id) && !detectedNotEnabled.some((d) => d.agent.id === a.id)\n );\n if (popular.length > 0) {\n console.log(chalk.gray(\"Popular (available):\"));\n for (const agent of popular) {\n console.log(` ${chalk.gray(\"-\")} ${agent.name} - ${agent.description}`);\n }\n console.log();\n }\n\n // Summary and help\n console.log(chalk.gray(`Total: ${AGENTS.length} agents supported`));\n console.log();\n console.log(chalk.gray(\"Commands:\"));\n console.log(chalk.gray(\" lynxp agents enable <agent> Enable an agent\"));\n console.log(chalk.gray(\" lynxp agents disable <agent> Disable an agent\"));\n console.log(chalk.gray(\" lynxp agents detect Auto-detect agents\"));\n console.log();\n}\n\n/**\n * Enable an agent\n */\nasync function enableAgent(agentId?: string, options: AgentsOptions = {}): Promise<void> {\n const cwd = process.cwd();\n const configPath = join(cwd, CONFIG_FILE);\n\n if (!existsSync(configPath)) {\n console.log(chalk.yellow(\"LynxPrompt not initialized. Run 'lynxp init' first.\"));\n return;\n }\n\n let config = await loadConfig();\n if (!config) {\n console.log(chalk.red(\"Could not load configuration.\"));\n return;\n }\n\n // Interactive mode - select from all agents\n if (!agentId || options.interactive) {\n const enabledSet = new Set(config.exporters ?? []);\n \n const choices = AGENTS.map((agent) => ({\n title: `${agent.name} - ${agent.description}`,\n value: agent.id,\n selected: enabledSet.has(agent.id),\n }));\n\n const { selected } = await prompts({\n type: \"multiselect\",\n name: \"selected\",\n message: \"Select agents to enable:\",\n choices,\n hint: \"- Space to select, Enter to confirm\",\n });\n\n if (!selected || selected.length === 0) {\n console.log(chalk.yellow(\"No agents selected.\"));\n return;\n }\n\n config.exporters = selected;\n await saveConfig(config);\n \n console.log(chalk.green(`ā Enabled ${selected.length} agent${selected.length === 1 ? \"\" : \"s\"}`));\n console.log();\n console.log(chalk.gray(\"Run 'lynxp sync' to sync your rules.\"));\n return;\n }\n\n // Enable specific agent\n const agent = getAgent(agentId);\n if (!agent) {\n // Fuzzy search for similar names\n const similar = AGENTS.filter((a) => \n a.id.includes(agentId.toLowerCase()) || \n a.name.toLowerCase().includes(agentId.toLowerCase())\n );\n \n console.log(chalk.red(`Unknown agent: ${agentId}`));\n if (similar.length > 0) {\n console.log();\n console.log(chalk.gray(\"Did you mean:\"));\n for (const a of similar.slice(0, 5)) {\n console.log(chalk.gray(` ${a.id} - ${a.name}`));\n }\n }\n return;\n }\n\n if (!config.exporters) {\n config.exporters = [];\n }\n\n if (config.exporters.includes(agent.id)) {\n console.log(chalk.yellow(`${agent.name} is already enabled.`));\n return;\n }\n\n config.exporters.push(agent.id);\n await saveConfig(config);\n\n console.log(chalk.green(`ā Enabled ${agent.name}`));\n console.log();\n console.log(chalk.gray(`Output: ${agent.output}`));\n console.log(chalk.gray(\"Run 'lynxp sync' to sync your rules.\"));\n}\n\n/**\n * Disable an agent\n */\nasync function disableAgent(agentId?: string): Promise<void> {\n if (!agentId) {\n console.log(chalk.yellow(\"Usage: lynxp agents disable <agent>\"));\n return;\n }\n\n const cwd = process.cwd();\n const configPath = join(cwd, CONFIG_FILE);\n\n if (!existsSync(configPath)) {\n console.log(chalk.yellow(\"LynxPrompt not initialized. Run 'lynxp init' first.\"));\n return;\n }\n\n const config = await loadConfig();\n if (!config) {\n console.log(chalk.red(\"Could not load configuration.\"));\n return;\n }\n\n if (!config.exporters || !config.exporters.includes(agentId)) {\n const agent = getAgent(agentId);\n console.log(chalk.yellow(`${agent?.name ?? agentId} is not enabled.`));\n return;\n }\n\n // Prevent disabling last agent\n if (config.exporters.length === 1) {\n console.log(chalk.yellow(\"Cannot disable the last agent. At least one must be enabled.\"));\n return;\n }\n\n config.exporters = config.exporters.filter((e) => e !== agentId);\n await saveConfig(config);\n\n const agent = getAgent(agentId);\n console.log(chalk.green(`ā Disabled ${agent?.name ?? agentId}`));\n}\n\n/**\n * Auto-detect agents in project\n */\nasync function detectAgentsInProject(): Promise<void> {\n console.log(chalk.cyan(\"š Detecting AI agents...\"));\n console.log();\n\n const detection = detectAgents();\n console.log(formatDetectionResults(detection));\n console.log();\n\n if (detection.detected.length === 0) {\n return;\n }\n\n // Offer to enable detected agents\n const config = await loadConfig();\n const enabledSet = new Set(config?.exporters ?? []);\n const newAgents = detection.detected.filter((d) => !enabledSet.has(d.agent.id));\n\n if (newAgents.length === 0) {\n console.log(chalk.gray(\"All detected agents are already enabled.\"));\n return;\n }\n\n const { enable } = await prompts({\n type: \"confirm\",\n name: \"enable\",\n message: `Enable ${newAgents.length} detected agent${newAgents.length === 1 ? \"\" : \"s\"}?`,\n initial: true,\n });\n\n if (enable && config) {\n config.exporters = [\n ...(config.exporters ?? []),\n ...newAgents.map((d) => d.agent.id),\n ];\n await saveConfig(config);\n console.log(chalk.green(`ā Enabled ${newAgents.length} agent${newAgents.length === 1 ? \"\" : \"s\"}`));\n }\n}\n\n/**\n * Load config file\n */\nasync function loadConfig(): Promise<LynxPromptConfig | null> {\n const cwd = process.cwd();\n const configPath = join(cwd, CONFIG_FILE);\n\n if (!existsSync(configPath)) {\n return null;\n }\n\n try {\n const content = await readFile(configPath, \"utf-8\");\n return yaml.parse(content) as LynxPromptConfig;\n } catch {\n return null;\n }\n}\n\n/**\n * Save config file\n */\nasync function saveConfig(config: LynxPromptConfig): Promise<void> {\n const cwd = process.cwd();\n const configPath = join(cwd, CONFIG_FILE);\n \n const content = yaml.stringify(config);\n await writeFile(configPath, content, \"utf-8\");\n}\n\n","/**\n * Check command - validate AI configuration files\n * \n * Validates configuration files for CI/CD pipelines and pre-commit hooks.\n * \n * Usage:\n * lynxp check - Interactive validation with detailed output\n * lynxp check --ci - CI mode with exit codes (0 = pass, 1 = fail)\n */\n\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { readFile, access, readdir, stat } from \"fs/promises\";\nimport { join } from \"path\";\nimport { existsSync } from \"fs\";\nimport * as yaml from \"yaml\";\n\ninterface CheckOptions {\n ci?: boolean;\n}\n\ninterface ValidationResult {\n valid: boolean;\n errors: string[];\n warnings: string[];\n files: string[];\n}\n\n// Known AI config files\nconst CONFIG_FILES = [\n { path: \"AGENTS.md\", name: \"AGENTS.md\" },\n { path: \"CLAUDE.md\", name: \"CLAUDE.md\" },\n { path: \".github/copilot-instructions.md\", name: \"GitHub Copilot\" },\n { path: \".windsurfrules\", name: \"Windsurf\" },\n { path: \".clinerules\", name: \"Cline\" },\n { path: \".goosehints\", name: \"Goose\" },\n { path: \".zed/instructions.md\", name: \"Zed\" },\n];\n\nconst CONFIG_DIRS = [\n { path: \".cursor/rules\", name: \"Cursor\" },\n { path: \".lynxprompt\", name: \"LynxPrompt\" },\n];\n\n/**\n * Validate markdown content for common issues\n */\nfunction validateMarkdown(content: string, filename: string): { errors: string[]; warnings: string[] } {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n // Check for empty content\n if (!content.trim()) {\n errors.push(`${filename}: File is empty`);\n return { errors, warnings };\n }\n\n // Check for minimum content\n if (content.trim().length < 50) {\n warnings.push(`${filename}: Content seems too short (< 50 chars)`);\n }\n\n // Check for header\n if (!content.includes(\"#\")) {\n warnings.push(`${filename}: No markdown headers found`);\n }\n\n // Check for common placeholder text\n const placeholders = [\n \"TODO\",\n \"FIXME\",\n \"YOUR_\",\n \"REPLACE_\",\n \"[INSERT\",\n \"example.com\",\n ];\n \n for (const placeholder of placeholders) {\n if (content.includes(placeholder)) {\n warnings.push(`${filename}: Contains placeholder text \"${placeholder}\"`);\n }\n }\n\n // Check for potential secrets (basic patterns)\n const secretPatterns = [\n /sk[_-][a-zA-Z0-9]{20,}/, // Stripe-like keys\n /ghp_[a-zA-Z0-9]{36}/, // GitHub tokens\n /api[_-]?key[_-]?=\\s*[a-zA-Z0-9]{20,}/i,\n ];\n\n for (const pattern of secretPatterns) {\n if (pattern.test(content)) {\n errors.push(`${filename}: Potential secret/API key detected - DO NOT commit secrets!`);\n break;\n }\n }\n\n return { errors, warnings };\n}\n\n/**\n * Validate LynxPrompt configuration\n */\nasync function validateLynxPromptConfig(cwd: string): Promise<{ errors: string[]; warnings: string[] }> {\n const errors: string[] = [];\n const warnings: string[] = [];\n \n const configPath = join(cwd, \".lynxprompt/conf.yml\");\n \n if (!existsSync(configPath)) {\n return { errors, warnings };\n }\n\n try {\n const content = await readFile(configPath, \"utf-8\");\n const config = yaml.parse(content);\n\n // Check version\n if (!config.version) {\n warnings.push(\".lynxprompt/conf.yml: Missing 'version' field\");\n }\n\n // Check exporters\n if (!config.exporters || !Array.isArray(config.exporters)) {\n errors.push(\".lynxprompt/conf.yml: Missing or invalid 'exporters' field\");\n } else if (config.exporters.length === 0) {\n warnings.push(\".lynxprompt/conf.yml: No exporters configured\");\n }\n\n // Check sources\n if (!config.sources || !Array.isArray(config.sources)) {\n errors.push(\".lynxprompt/conf.yml: Missing or invalid 'sources' field\");\n } else {\n for (const source of config.sources) {\n if (source.type === \"local\" && source.path) {\n const sourcePath = join(cwd, source.path);\n if (!existsSync(sourcePath)) {\n errors.push(`.lynxprompt/conf.yml: Source path not found: ${source.path}`);\n }\n }\n }\n }\n } catch (error) {\n errors.push(`.lynxprompt/conf.yml: Invalid YAML syntax - ${error instanceof Error ? error.message : \"parse error\"}`);\n }\n\n return { errors, warnings };\n}\n\n/**\n * Validate MDC files (Cursor format)\n */\nfunction validateMdc(content: string, filename: string): { errors: string[]; warnings: string[] } {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n // Check for frontmatter\n if (!content.startsWith(\"---\")) {\n warnings.push(`${filename}: Missing YAML frontmatter`);\n } else {\n // Try to parse frontmatter\n const frontmatterEnd = content.indexOf(\"---\", 3);\n if (frontmatterEnd === -1) {\n errors.push(`${filename}: Unclosed YAML frontmatter`);\n } else {\n const frontmatter = content.substring(3, frontmatterEnd).trim();\n try {\n yaml.parse(frontmatter);\n } catch {\n errors.push(`${filename}: Invalid YAML frontmatter`);\n }\n }\n }\n\n // Also run standard markdown validation on content after frontmatter\n const bodyStart = content.indexOf(\"---\", 3);\n if (bodyStart !== -1) {\n const body = content.substring(bodyStart + 3).trim();\n const mdResult = validateMarkdown(body, filename);\n // Only add body-related warnings, not errors (frontmatter is the critical part for MDC)\n warnings.push(...mdResult.warnings);\n }\n\n return { errors, warnings };\n}\n\nexport async function checkCommand(options: CheckOptions = {}): Promise<void> {\n const isCi = options.ci;\n const cwd = process.cwd();\n\n if (!isCi) {\n console.log();\n console.log(chalk.cyan(\"š± LynxPrompt Check\"));\n console.log();\n }\n\n const result: ValidationResult = {\n valid: true,\n errors: [],\n warnings: [],\n files: [],\n };\n\n const spinner = !isCi ? ora(\"Scanning for configuration files...\").start() : null;\n\n // Check for config files\n for (const file of CONFIG_FILES) {\n const filePath = join(cwd, file.path);\n if (existsSync(filePath)) {\n result.files.push(file.path);\n try {\n const content = await readFile(filePath, \"utf-8\");\n const validation = validateMarkdown(content, file.path);\n result.errors.push(...validation.errors);\n result.warnings.push(...validation.warnings);\n } catch (error) {\n result.errors.push(`${file.path}: Could not read file`);\n }\n }\n }\n\n // Check for config directories\n for (const dir of CONFIG_DIRS) {\n const dirPath = join(cwd, dir.path);\n if (existsSync(dirPath)) {\n try {\n const files = await readdir(dirPath);\n for (const file of files) {\n const filePath = join(dirPath, file);\n const fileStat = await stat(filePath);\n \n if (fileStat.isFile()) {\n result.files.push(`${dir.path}/${file}`);\n const content = await readFile(filePath, \"utf-8\");\n \n // Use MDC validation for .mdc files\n if (file.endsWith(\".mdc\")) {\n const validation = validateMdc(content, `${dir.path}/${file}`);\n result.errors.push(...validation.errors);\n result.warnings.push(...validation.warnings);\n } else if (file.endsWith(\".md\")) {\n const validation = validateMarkdown(content, `${dir.path}/${file}`);\n result.errors.push(...validation.errors);\n result.warnings.push(...validation.warnings);\n }\n }\n }\n } catch {\n // Directory exists but can't be read\n }\n }\n }\n\n // Check LynxPrompt config\n const lynxpromptValidation = await validateLynxPromptConfig(cwd);\n result.errors.push(...lynxpromptValidation.errors);\n result.warnings.push(...lynxpromptValidation.warnings);\n\n spinner?.stop();\n\n // Determine overall result\n result.valid = result.errors.length === 0;\n\n // Output results\n if (isCi) {\n // CI mode - minimal output, use exit codes\n if (!result.valid) {\n console.error(\"ā Validation failed\");\n for (const error of result.errors) {\n console.error(` ${error}`);\n }\n process.exit(1);\n } else if (result.files.length === 0) {\n console.error(\"ā No configuration files found\");\n process.exit(1);\n } else {\n console.log(\"ā Validation passed\");\n if (result.warnings.length > 0) {\n console.log(` (${result.warnings.length} warning${result.warnings.length === 1 ? \"\" : \"s\"})`);\n }\n process.exit(0);\n }\n } else {\n // Interactive mode - detailed output\n if (result.files.length === 0) {\n console.log(chalk.yellow(\"ā No AI configuration files found.\"));\n console.log();\n console.log(chalk.gray(\"Run 'lynxp wizard' to create a configuration.\"));\n return;\n }\n\n console.log(chalk.green(`ā Found ${result.files.length} configuration file${result.files.length === 1 ? \"\" : \"s\"}:`));\n for (const file of result.files) {\n console.log(chalk.gray(` ${file}`));\n }\n console.log();\n\n if (result.errors.length > 0) {\n console.log(chalk.red(`ā ${result.errors.length} error${result.errors.length === 1 ? \"\" : \"s\"}:`));\n for (const error of result.errors) {\n console.log(chalk.red(` ${error}`));\n }\n console.log();\n }\n\n if (result.warnings.length > 0) {\n console.log(chalk.yellow(`ā ${result.warnings.length} warning${result.warnings.length === 1 ? \"\" : \"s\"}:`));\n for (const warning of result.warnings) {\n console.log(chalk.yellow(` ${warning}`));\n }\n console.log();\n }\n\n if (result.valid) {\n console.log(chalk.green(\"ā
Validation passed!\"));\n } else {\n console.log(chalk.red(\"ā Validation failed. Fix the errors above.\"));\n }\n console.log();\n }\n}\n\n","/**\n * Diff command - show changes between local and remote blueprints\n * \n * Compares local AI configuration files with a remote blueprint from LynxPrompt.\n * Useful for seeing what changes have been made locally or what would change\n * if you pulled a blueprint.\n * \n * Usage:\n * lynxp diff <blueprint-id> - Compare local files with remote blueprint\n * lynxp diff --local - Show diff between .lynxprompt/rules/ and exported files\n */\n\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { readFile } from \"fs/promises\";\nimport { join } from \"path\";\nimport { existsSync } from \"fs\";\nimport { isAuthenticated } from \"../config.js\";\nimport { api, ApiRequestError } from \"../api.js\";\n\ninterface DiffOptions {\n local?: boolean;\n}\n\n/**\n * Simple line-by-line diff implementation\n * Returns added (+), removed (-), and unchanged lines\n */\nfunction computeDiff(oldText: string, newText: string): Array<{ type: \"add\" | \"remove\" | \"same\"; line: string }> {\n const oldLines = oldText.split(\"\\n\");\n const newLines = newText.split(\"\\n\");\n const result: Array<{ type: \"add\" | \"remove\" | \"same\"; line: string }> = [];\n\n // Simple LCS-based diff\n const lcs = longestCommonSubsequence(oldLines, newLines);\n \n let oldIndex = 0;\n let newIndex = 0;\n let lcsIndex = 0;\n\n while (oldIndex < oldLines.length || newIndex < newLines.length) {\n if (lcsIndex < lcs.length && oldIndex < oldLines.length && oldLines[oldIndex] === lcs[lcsIndex]) {\n if (newIndex < newLines.length && newLines[newIndex] === lcs[lcsIndex]) {\n // Line is in both - unchanged\n result.push({ type: \"same\", line: oldLines[oldIndex] });\n oldIndex++;\n newIndex++;\n lcsIndex++;\n } else {\n // Line is in new but not in LCS position - added\n result.push({ type: \"add\", line: newLines[newIndex] });\n newIndex++;\n }\n } else if (oldIndex < oldLines.length && (lcsIndex >= lcs.length || oldLines[oldIndex] !== lcs[lcsIndex])) {\n // Line is in old but not in LCS - removed\n result.push({ type: \"remove\", line: oldLines[oldIndex] });\n oldIndex++;\n } else if (newIndex < newLines.length) {\n // Line is in new but not in old - added\n result.push({ type: \"add\", line: newLines[newIndex] });\n newIndex++;\n }\n }\n\n return result;\n}\n\n/**\n * Find the longest common subsequence of lines\n */\nfunction longestCommonSubsequence(a: string[], b: string[]): string[] {\n const m = a.length;\n const n = b.length;\n const dp: number[][] = Array(m + 1).fill(null).map(() => Array(n + 1).fill(0));\n\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n if (a[i - 1] === b[j - 1]) {\n dp[i][j] = dp[i - 1][j - 1] + 1;\n } else {\n dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);\n }\n }\n }\n\n // Backtrack to find the LCS\n const lcs: string[] = [];\n let i = m;\n let j = n;\n while (i > 0 && j > 0) {\n if (a[i - 1] === b[j - 1]) {\n lcs.unshift(a[i - 1]);\n i--;\n j--;\n } else if (dp[i - 1][j] > dp[i][j - 1]) {\n i--;\n } else {\n j--;\n }\n }\n\n return lcs;\n}\n\n/**\n * Format diff output with colors\n */\nfunction formatDiff(diff: Array<{ type: \"add\" | \"remove\" | \"same\"; line: string }>, contextLines: number = 3): string {\n const output: string[] = [];\n let lastPrintedIndex = -1;\n let inHunk = false;\n \n // Find sections with changes\n const changeIndices = diff.map((d, i) => d.type !== \"same\" ? i : -1).filter(i => i !== -1);\n \n if (changeIndices.length === 0) {\n return chalk.gray(\" (no changes)\");\n }\n\n for (let i = 0; i < diff.length; i++) {\n const item = diff[i];\n const nearChange = changeIndices.some(ci => Math.abs(ci - i) <= contextLines);\n\n if (nearChange) {\n // Print separator if there's a gap\n if (lastPrintedIndex !== -1 && i - lastPrintedIndex > 1) {\n output.push(chalk.gray(\" ...\"));\n }\n\n // Format the line based on type\n if (item.type === \"add\") {\n output.push(chalk.green(`+ ${item.line}`));\n } else if (item.type === \"remove\") {\n output.push(chalk.red(`- ${item.line}`));\n } else {\n output.push(chalk.gray(` ${item.line}`));\n }\n lastPrintedIndex = i;\n }\n }\n\n return output.join(\"\\n\");\n}\n\n/**\n * Get summary statistics for a diff\n */\nfunction getDiffStats(diff: Array<{ type: \"add\" | \"remove\" | \"same\"; line: string }>): { added: number; removed: number; unchanged: number } {\n return {\n added: diff.filter(d => d.type === \"add\").length,\n removed: diff.filter(d => d.type === \"remove\").length,\n unchanged: diff.filter(d => d.type === \"same\").length,\n };\n}\n\nexport async function diffCommand(blueprintId?: string, options: DiffOptions = {}): Promise<void> {\n console.log();\n console.log(chalk.cyan(\"š± LynxPrompt Diff\"));\n console.log();\n\n const cwd = process.cwd();\n\n // Local diff mode - compare .lynxprompt/rules/ with exported files\n if (options.local) {\n await diffLocal(cwd);\n return;\n }\n\n // Remote diff mode - compare local with remote blueprint\n if (!blueprintId) {\n console.log(chalk.red(\"ā Please provide a blueprint ID to compare with.\"));\n console.log();\n console.log(chalk.gray(\"Usage:\"));\n console.log(chalk.gray(\" lynxp diff <blueprint-id> Compare local with remote blueprint\"));\n console.log(chalk.gray(\" lynxp diff --local Compare .lynxprompt/rules/ with exports\"));\n return;\n }\n\n // Check if logged in\n if (!isAuthenticated()) {\n console.log(chalk.yellow(\"ā Not logged in. Some blueprints may not be accessible.\"));\n console.log(chalk.gray(\"Run 'lynxp login' to authenticate.\"));\n console.log();\n }\n\n const spinner = ora(\"Fetching blueprint...\").start();\n\n try {\n const { blueprint } = await api.getBlueprint(blueprintId);\n spinner.stop();\n\n if (!blueprint || !blueprint.content) {\n console.log(chalk.red(`ā Blueprint not found or has no content: ${blueprintId}`));\n return;\n }\n\n console.log(chalk.green(`ā Blueprint: ${blueprint.name || blueprintId}`));\n if (blueprint.description) {\n console.log(chalk.gray(` ${blueprint.description}`));\n }\n console.log();\n\n // Determine local file path based on blueprint type\n const localPaths = [\n \"AGENTS.md\",\n \"CLAUDE.md\",\n \".cursor/rules/project.mdc\",\n \".github/copilot-instructions.md\",\n \".windsurfrules\",\n ];\n\n let localContent: string | null = null;\n let localPath: string | null = null;\n\n for (const path of localPaths) {\n const fullPath = join(cwd, path);\n if (existsSync(fullPath)) {\n try {\n localContent = await readFile(fullPath, \"utf-8\");\n localPath = path;\n break;\n } catch {\n // Continue to next path\n }\n }\n }\n\n if (!localContent) {\n console.log(chalk.yellow(\"ā No local AI configuration file found.\"));\n console.log(chalk.gray(\"Run 'lynxp wizard' to create one, or 'lynxp pull' to download the blueprint.\"));\n return;\n }\n\n console.log(chalk.gray(`Comparing with: ${localPath}`));\n console.log();\n\n // Compute and display diff\n const diff = computeDiff(blueprint.content, localContent);\n const stats = getDiffStats(diff);\n\n if (stats.added === 0 && stats.removed === 0) {\n console.log(chalk.green(\"ā Files are identical!\"));\n } else {\n console.log(chalk.gray(\"Changes (remote ā local):\"));\n console.log();\n console.log(formatDiff(diff));\n console.log();\n console.log(chalk.gray(`Summary: ${chalk.green(`+${stats.added}`)} ${chalk.red(`-${stats.removed}`)} lines changed`));\n }\n console.log();\n\n } catch (error) {\n spinner.stop();\n if (error instanceof ApiRequestError) {\n if (error.statusCode === 401) {\n console.log(chalk.red(\"ā Authentication required. Run 'lynxp login' first.\"));\n } else if (error.statusCode === 404) {\n console.log(chalk.red(`ā Blueprint not found: ${blueprintId}`));\n } else if (error.statusCode === 403) {\n console.log(chalk.red(\"ā Access denied to this blueprint.\"));\n } else {\n console.log(chalk.red(`ā API error: ${error.message}`));\n }\n } else {\n console.log(chalk.red(\"ā Failed to fetch blueprint\"));\n if (error instanceof Error) {\n console.log(chalk.gray(` ${error.message}`));\n }\n }\n }\n}\n\n/**\n * Compare .lynxprompt/rules/ with exported agent files\n */\nasync function diffLocal(cwd: string): Promise<void> {\n const rulesDir = join(cwd, \".lynxprompt/rules\");\n \n if (!existsSync(rulesDir)) {\n console.log(chalk.yellow(\"ā No .lynxprompt/rules/ directory found.\"));\n console.log(chalk.gray(\"Run 'lynxp init' to set up the advanced workflow, or 'lynxp wizard' for simple file generation.\"));\n return;\n }\n\n console.log(chalk.gray(\"Comparing .lynxprompt/rules/ with exported files...\"));\n console.log();\n\n // Read the rules file(s)\n const rulesPath = join(rulesDir, \"agents.md\");\n if (!existsSync(rulesPath)) {\n console.log(chalk.yellow(\"ā No rules files found in .lynxprompt/rules/\"));\n return;\n }\n\n let rulesContent: string;\n try {\n rulesContent = await readFile(rulesPath, \"utf-8\");\n } catch {\n console.log(chalk.red(\"ā Could not read .lynxprompt/rules/agents.md\"));\n return;\n }\n\n // Compare with each exported file\n const exportedFiles = [\n { path: \"AGENTS.md\", name: \"AGENTS.md\" },\n { path: \".cursor/rules/lynxprompt-rules.mdc\", name: \"Cursor\" },\n ];\n\n let hasChanges = false;\n\n for (const file of exportedFiles) {\n const filePath = join(cwd, file.path);\n if (existsSync(filePath)) {\n try {\n const exportedContent = await readFile(filePath, \"utf-8\");\n \n // For MDC files, strip frontmatter for comparison\n let compareContent = exportedContent;\n if (file.path.endsWith(\".mdc\")) {\n const frontmatterEnd = exportedContent.indexOf(\"---\", 3);\n if (frontmatterEnd !== -1) {\n compareContent = exportedContent.substring(frontmatterEnd + 3).trim();\n }\n }\n\n // Strip headers added by sync\n compareContent = compareContent\n .replace(/^# AI Coding Rules\\n\\n> Generated by \\[LynxPrompt\\].*\\n\\n/m, \"\")\n .trim();\n\n const diff = computeDiff(rulesContent.trim(), compareContent);\n const stats = getDiffStats(diff);\n\n if (stats.added > 0 || stats.removed > 0) {\n hasChanges = true;\n console.log(chalk.yellow(`ā ${file.name} differs from source:`));\n console.log(formatDiff(diff));\n console.log(chalk.gray(` ${chalk.green(`+${stats.added}`)} ${chalk.red(`-${stats.removed}`)} lines`));\n console.log();\n } else {\n console.log(chalk.green(`ā ${file.name} is in sync`));\n }\n } catch {\n // File exists but couldn't be read\n }\n }\n }\n\n if (!hasChanges) {\n console.log();\n console.log(chalk.green(\"ā All exported files are in sync with .lynxprompt/rules/\"));\n } else {\n console.log();\n console.log(chalk.gray(\"Run 'lynxp sync' to update exported files from .lynxprompt/rules/\"));\n }\n console.log();\n}\n\n","/**\n * Link command - connect a local file to a cloud blueprint\n * \n * This is for when a user has a local file that matches a cloud blueprint\n * and wants to start tracking it without overwriting the local version.\n * \n * Usage:\n * lynxp link <file> <blueprint-id> - Link local file to cloud blueprint\n * lynxp link --list - List all tracked blueprints\n * lynxp unlink <file> - Disconnect a file from its blueprint\n */\n\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport prompts from \"prompts\";\nimport { api, ApiRequestError, Blueprint } from \"../api.js\";\nimport { isAuthenticated } from \"../config.js\";\nimport { readFile, access } from \"fs/promises\";\nimport { join } from \"path\";\nimport { existsSync } from \"fs\";\nimport {\n linkBlueprint,\n untrackBlueprint,\n findBlueprintByFile,\n getAllTrackedBlueprints,\n checkSyncStatus,\n type BlueprintSource,\n} from \"../utils/blueprint-tracker.js\";\n\ninterface LinkOptions {\n list?: boolean;\n}\n\n// Determine blueprint source from visibility\nfunction getSourceFromVisibility(visibility: Blueprint[\"visibility\"]): BlueprintSource {\n switch (visibility) {\n case \"PUBLIC\":\n return \"marketplace\";\n case \"TEAM\":\n return \"team\";\n case \"PRIVATE\":\n return \"private\";\n default:\n return \"marketplace\";\n }\n}\n\nexport async function linkCommand(\n file?: string,\n blueprintId?: string,\n options: LinkOptions = {}\n): Promise<void> {\n const cwd = process.cwd();\n\n // List tracked blueprints\n if (options.list) {\n await listTrackedBlueprints(cwd);\n return;\n }\n\n if (!file) {\n console.log(chalk.red(\"ā Please provide a file path to link.\"));\n console.log();\n console.log(chalk.gray(\"Usage:\"));\n console.log(chalk.gray(\" lynxp link <file> <blueprint-id> Link a local file to a cloud blueprint\"));\n console.log(chalk.gray(\" lynxp link --list List all tracked blueprints\"));\n console.log();\n console.log(chalk.gray(\"Example:\"));\n console.log(chalk.gray(\" lynxp link AGENTS.md bp_abc123\"));\n return;\n }\n\n if (!blueprintId) {\n console.log(chalk.red(\"ā Please provide a blueprint ID to link to.\"));\n console.log();\n console.log(chalk.gray(\"Usage: lynxp link <file> <blueprint-id>\"));\n console.log(chalk.gray(\"Example: lynxp link AGENTS.md bp_abc123\"));\n console.log();\n console.log(chalk.gray(\"To find blueprint IDs:\"));\n console.log(chalk.gray(\" lynxp list - Show your blueprints\"));\n console.log(chalk.gray(\" lynxp search <query> - Search marketplace\"));\n return;\n }\n\n // Check if file exists\n const filePath = join(cwd, file);\n if (!existsSync(filePath)) {\n console.log(chalk.red(`ā File not found: ${file}`));\n return;\n }\n\n // Check if already linked\n const existing = await findBlueprintByFile(cwd, file);\n if (existing) {\n console.log(chalk.yellow(`ā This file is already linked to: ${existing.id}`));\n const { proceed } = await prompts({\n type: \"confirm\",\n name: \"proceed\",\n message: \"Replace the existing link?\",\n initial: false,\n });\n if (!proceed) {\n console.log(chalk.gray(\"Cancelled.\"));\n return;\n }\n }\n\n // Check authentication\n if (!isAuthenticated()) {\n console.log(\n chalk.yellow(\"Not logged in. Run 'lynxp login' to authenticate.\")\n );\n process.exit(1);\n }\n\n // Fetch blueprint info\n const spinner = ora(`Fetching blueprint ${chalk.cyan(blueprintId)}...`).start();\n\n try {\n const { blueprint } = await api.getBlueprint(blueprintId);\n spinner.stop();\n\n const source = getSourceFromVisibility(blueprint.visibility);\n const isMarketplace = source === \"marketplace\";\n\n console.log();\n console.log(chalk.cyan(`š± Blueprint: ${chalk.bold(blueprint.name)}`));\n if (blueprint.description) {\n console.log(chalk.gray(` ${blueprint.description}`));\n }\n console.log(chalk.gray(` Visibility: ${blueprint.visibility}`));\n console.log();\n\n // Show warning for marketplace blueprints\n if (isMarketplace) {\n console.log(chalk.yellow(\"ā This is a marketplace blueprint.\"));\n console.log(chalk.gray(\" Your local changes will NOT sync back to the cloud.\"));\n console.log(chalk.gray(\" To make changes, you'll need to create your own copy.\"));\n console.log();\n }\n\n // Confirm linking\n const { confirm } = await prompts({\n type: \"confirm\",\n name: \"confirm\",\n message: `Link ${chalk.cyan(file)} to ${chalk.cyan(blueprint.name)}?`,\n initial: true,\n });\n\n if (!confirm) {\n console.log(chalk.gray(\"Cancelled.\"));\n return;\n }\n\n // Link the file\n await linkBlueprint(cwd, file, blueprint.id, blueprint.name, source);\n\n console.log();\n console.log(chalk.green(`ā
Linked: ${file} ā ${blueprint.id}`));\n console.log();\n\n // Show next steps\n console.log(chalk.gray(\"Next steps:\"));\n console.log(chalk.gray(` ⢠Run 'lynxp pull ${blueprintId}' to update local file from cloud`));\n console.log(chalk.gray(` ⢠Run 'lynxp diff ${blueprintId}' to see differences`));\n console.log(chalk.gray(` ⢠Run 'lynxp status' to see all tracked blueprints`));\n if (!isMarketplace) {\n console.log(chalk.gray(` ⢠Run 'lynxp push ${file}' to push local changes to cloud`));\n }\n console.log();\n\n } catch (error) {\n spinner.stop();\n if (error instanceof ApiRequestError) {\n if (error.statusCode === 404) {\n console.log(chalk.red(`ā Blueprint not found: ${blueprintId}`));\n console.log(chalk.gray(\" Make sure the ID is correct. Use 'lynxp list' or 'lynxp search' to find blueprints.\"));\n } else if (error.statusCode === 403) {\n console.log(chalk.red(\"ā You don't have access to this blueprint.\"));\n } else {\n console.log(chalk.red(`ā Error: ${error.message}`));\n }\n } else {\n console.log(chalk.red(\"ā An unexpected error occurred.\"));\n }\n }\n}\n\nexport async function unlinkCommand(file?: string): Promise<void> {\n const cwd = process.cwd();\n\n if (!file) {\n console.log(chalk.red(\"ā Please provide a file path to unlink.\"));\n console.log();\n console.log(chalk.gray(\"Usage: lynxp unlink <file>\"));\n console.log(chalk.gray(\"Example: lynxp unlink AGENTS.md\"));\n return;\n }\n\n // Check if file is tracked\n const tracked = await findBlueprintByFile(cwd, file);\n if (!tracked) {\n console.log(chalk.yellow(`ā File is not linked to any blueprint: ${file}`));\n return;\n }\n\n console.log();\n console.log(chalk.cyan(`Currently linked to: ${tracked.id}`));\n console.log(chalk.gray(` Name: ${tracked.name}`));\n console.log(chalk.gray(` Source: ${tracked.source}`));\n console.log();\n\n const { confirm } = await prompts({\n type: \"confirm\",\n name: \"confirm\",\n message: `Unlink ${chalk.cyan(file)} from ${chalk.cyan(tracked.name)}?`,\n initial: true,\n });\n\n if (!confirm) {\n console.log(chalk.gray(\"Cancelled.\"));\n return;\n }\n\n const success = await untrackBlueprint(cwd, file);\n \n if (success) {\n console.log();\n console.log(chalk.green(`ā
Unlinked: ${file}`));\n console.log(chalk.gray(\" The file is now a standalone local file.\"));\n console.log(chalk.gray(\" It will no longer receive updates from the cloud blueprint.\"));\n console.log();\n } else {\n console.log(chalk.red(\"ā Failed to unlink file.\"));\n }\n}\n\nasync function listTrackedBlueprints(cwd: string): Promise<void> {\n console.log();\n console.log(chalk.cyan(\"š± Tracked Blueprints\"));\n console.log();\n\n const status = await checkSyncStatus(cwd);\n\n if (status.length === 0) {\n console.log(chalk.gray(\"No blueprints are currently tracked.\"));\n console.log();\n console.log(chalk.gray(\"To track a blueprint:\"));\n console.log(chalk.gray(\" lynxp pull <blueprint-id> Download and track a blueprint\"));\n console.log(chalk.gray(\" lynxp link <file> <id> Link an existing file to a blueprint\"));\n return;\n }\n\n for (const { blueprint, localModified, fileExists } of status) {\n const statusIcon = !fileExists\n ? chalk.red(\"ā\")\n : localModified\n ? chalk.yellow(\"ā\")\n : chalk.green(\"ā\");\n \n const sourceLabel = {\n marketplace: chalk.gray(\"[marketplace]\"),\n team: chalk.blue(\"[team]\"),\n private: chalk.green(\"[private]\"),\n local: chalk.gray(\"[local]\"),\n }[blueprint.source];\n\n console.log(`${statusIcon} ${chalk.cyan(blueprint.file)}`);\n console.log(` ${sourceLabel} ${blueprint.name}`);\n console.log(` ${chalk.gray(`ID: ${blueprint.id}`)}`);\n \n if (!fileExists) {\n console.log(chalk.red(` ā File not found`));\n } else if (localModified) {\n console.log(chalk.yellow(` ā Local changes detected`));\n }\n \n console.log();\n }\n\n console.log(chalk.gray(\"Legend:\"));\n console.log(chalk.gray(` ${chalk.green(\"ā\")} In sync ${chalk.yellow(\"ā\")} Modified locally ${chalk.red(\"ā\")} Missing`));\n console.log();\n}\n\n"],"mappings":"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","names":["chalk","chalk","chalk","chalk","ora","chalk","ora","chalk","ora","chalk","ora","chalk","ora","writeFile","mkdir","readFile","join","dirname","config","config","config","fileExists","chalk","ora","join","readFile","dirname","mkdir","writeFile","handleApiError","chalk","ora","prompts","chalk","prompts","ora","chalk","prompts","ora","writeFile","mkdir","readFile","join","dirname","existsSync","yaml","existsSync","join","join","existsSync","path","readFile","access","join","path","join","existsSync","readFile","config","chalk","prompts","ora","mkdir","writeFile","dirname","chalk","prompts","ora","writeFile","mkdir","access","join","dirname","chalk","config","ora","join","access","prompts","dirname","mkdir","writeFile","chalk","ora","ora","chalk","handleApiError","truncate","formatTags","chalk","access","readFile","readdir","join","existsSync","chalk","existsSync","join","readFile","parse","config","fileExists","access","readdir","truncate","chalk","ora","prompts","readFile","writeFile","mkdir","readdir","join","dirname","existsSync","yaml","chalk","join","existsSync","ora","config","readFile","prompts","readdir","dirname","mkdir","writeFile","chalk","prompts","readFile","writeFile","join","existsSync","yaml","CONFIG_FILE","chalk","config","join","existsSync","agent","prompts","readFile","writeFile","chalk","ora","readFile","readdir","stat","join","existsSync","yaml","CONFIG_FILES","CONFIG_DIRS","config","chalk","ora","readFile","join","existsSync","i","j","chalk","ora","path","join","existsSync","readFile","chalk","ora","prompts","join","existsSync","getSourceFromVisibility","chalk","join","existsSync","prompts","ora","fileExists","chalk"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/commands/login.ts","../src/config.ts","../src/api.ts","../src/commands/logout.ts","../src/commands/whoami.ts","../src/commands/list.ts","../src/commands/pull.ts","../src/utils/blueprint-tracker.ts","../src/commands/push.ts","../src/commands/init.ts","../src/utils/agent-detector.ts","../src/utils/agents.ts","../src/utils/detect.ts","../src/commands/wizard.ts","../src/utils/generator.ts","../src/commands/search.ts","../src/commands/status.ts","../src/commands/sync.ts","../src/commands/agents.ts","../src/commands/check.ts","../src/commands/diff.ts","../src/commands/link.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { loginCommand } from \"./commands/login.js\";\nimport { logoutCommand } from \"./commands/logout.js\";\nimport { whoamiCommand } from \"./commands/whoami.js\";\nimport { listCommand } from \"./commands/list.js\";\nimport { pullCommand } from \"./commands/pull.js\";\nimport { pushCommand } from \"./commands/push.js\";\nimport { initCommand } from \"./commands/init.js\";\nimport { wizardCommand } from \"./commands/wizard.js\";\nimport { searchCommand } from \"./commands/search.js\";\nimport { statusCommand } from \"./commands/status.js\";\nimport { syncCommand } from \"./commands/sync.js\";\nimport { agentsCommand } from \"./commands/agents.js\";\nimport { checkCommand } from \"./commands/check.js\";\nimport { diffCommand } from \"./commands/diff.js\";\nimport { linkCommand, unlinkCommand } from \"./commands/link.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"lynxprompt\")\n .description(\"CLI for LynxPrompt - Generate AI IDE configuration files\")\n .version(\"0.3.0\");\n\n// ============================================\n// Primary Commands (most users need these)\n// ============================================\n\n// Wizard - the main command for most users\nprogram\n .command(\"wizard\")\n .description(\"Generate AI IDE configuration (recommended for most users)\")\n .option(\"-n, --name <name>\", \"Project name\")\n .option(\"-d, --description <description>\", \"Project description\")\n .option(\"-s, --stack <stack>\", \"Tech stack (comma-separated)\")\n .option(\"-f, --format <format>\", \"Output format: agents, cursor, or comma-separated for multiple\")\n .option(\"-p, --platforms <platforms>\", \"Alias for --format (deprecated)\")\n .option(\"--persona <persona>\", \"AI persona (fullstack, backend, frontend, devops, data, security)\")\n .option(\"--boundaries <level>\", \"Boundary preset (conservative, standard, permissive)\")\n .option(\"-y, --yes\", \"Skip prompts, use defaults (generates AGENTS.md)\")\n .action(wizardCommand);\n\n// Check - validation for CI/CD\nprogram\n .command(\"check\")\n .description(\"Validate AI configuration files (for CI/CD)\")\n .option(\"--ci\", \"CI mode - exit codes only (0=pass, 1=fail)\")\n .action(checkCommand);\n\n// Status - show what's configured\nprogram\n .command(\"status\")\n .description(\"Show current AI configuration and tracked blueprints\")\n .action(statusCommand);\n\n// ============================================\n// Blueprint Commands (marketplace integration)\n// ============================================\n\nprogram\n .command(\"pull <id>\")\n .description(\"Download and track a blueprint from the marketplace\")\n .option(\"-o, --output <path>\", \"Output directory\", \".\")\n .option(\"-y, --yes\", \"Overwrite existing files without prompting\")\n .option(\"--preview\", \"Preview content without downloading\")\n .option(\"--no-track\", \"Don't track the blueprint for future syncs\")\n .action(pullCommand);\n\nprogram\n .command(\"search <query>\")\n .description(\"Search public blueprints in the marketplace\")\n .option(\"-l, --limit <number>\", \"Number of results\", \"20\")\n .action(searchCommand);\n\nprogram\n .command(\"list\")\n .description(\"List your blueprints\")\n .option(\"-l, --limit <number>\", \"Number of results\", \"20\")\n .option(\"-v, --visibility <visibility>\", \"Filter: PRIVATE, TEAM, PUBLIC, or all\")\n .action(listCommand);\n\nprogram\n .command(\"push [file]\")\n .description(\"Push local file to LynxPrompt cloud as a blueprint\")\n .option(\"-n, --name <name>\", \"Blueprint name\")\n .option(\"-d, --description <desc>\", \"Blueprint description\")\n .option(\"-v, --visibility <vis>\", \"Visibility: PRIVATE, TEAM, or PUBLIC\", \"PRIVATE\")\n .option(\"-t, --tags <tags>\", \"Tags (comma-separated)\")\n .option(\"-y, --yes\", \"Skip prompts\")\n .action(pushCommand);\n\n// Link/Unlink - connect local files to cloud blueprints\nprogram\n .command(\"link [file] [blueprint-id]\")\n .description(\"Link a local file to a cloud blueprint for tracking\")\n .option(\"--list\", \"List all tracked blueprints\")\n .action(linkCommand);\n\nprogram\n .command(\"unlink [file]\")\n .description(\"Disconnect a local file from its cloud blueprint\")\n .action(unlinkCommand);\n\n// Diff - compare local with remote\nprogram\n .command(\"diff [file-or-id]\")\n .description(\"Compare tracked files with their cloud blueprints\")\n .option(\"--local\", \"Compare .lynxprompt/rules/ with exported files\")\n .action(diffCommand);\n\n// ============================================\n// Advanced Commands (power users)\n// ============================================\n\n// Init - advanced multi-editor setup\nprogram\n .command(\"init\")\n .description(\"Initialize .lynxprompt/ for multi-editor sync (advanced)\")\n .option(\"-y, --yes\", \"Skip prompts and use defaults\")\n .option(\"-f, --force\", \"Re-initialize even if already initialized\")\n .action(initCommand);\n\n// Sync - export rules to all agents\nprogram\n .command(\"sync\")\n .description(\"Sync .lynxprompt/rules/ to all configured agents\")\n .option(\"--dry-run\", \"Preview changes without writing files\")\n .option(\"-f, --force\", \"Skip prompts (for CI/automation)\")\n .action(syncCommand);\n\n// Agents - manage which agents to sync to\nprogram\n .command(\"agents [action] [agent]\")\n .description(\"Manage AI agents (list, enable, disable, detect)\")\n .option(\"-i, --interactive\", \"Interactive agent selection\")\n .action(agentsCommand);\n\n// ============================================\n// Auth Commands\n// ============================================\n\nprogram\n .command(\"login\")\n .description(\"Authenticate with LynxPrompt (opens browser)\")\n .action(loginCommand);\n\nprogram\n .command(\"logout\")\n .description(\"Log out and remove stored credentials\")\n .action(logoutCommand);\n\nprogram\n .command(\"whoami\")\n .description(\"Show current authenticated user\")\n .action(whoamiCommand);\n\n// ============================================\n// Help formatting\n// ============================================\n\nprogram.addHelpText(\n \"beforeAll\",\n `\n${chalk.cyan(\"š± LynxPrompt CLI\")} ${chalk.gray(\"(also available as: lynxp)\")}\n${chalk.gray(\"Generate AI IDE configuration files from your terminal\")}\n`\n);\n\nprogram.addHelpText(\n \"after\",\n `\n${chalk.cyan(\"Quick Start:\")}\n ${chalk.white(\"$ lynxp wizard\")} ${chalk.gray(\"Generate config interactively\")}\n ${chalk.white(\"$ lynxp wizard -y\")} ${chalk.gray(\"Generate AGENTS.md with defaults\")}\n ${chalk.white(\"$ lynxp wizard -f cursor\")} ${chalk.gray(\"Generate .cursor/rules/\")}\n\n${chalk.cyan(\"Marketplace:\")}\n ${chalk.white(\"$ lynxp search nextjs\")} ${chalk.gray(\"Search blueprints\")}\n ${chalk.white(\"$ lynxp pull bp_abc123\")} ${chalk.gray(\"Download and track a blueprint\")}\n ${chalk.white(\"$ lynxp push\")} ${chalk.gray(\"Push local file to cloud\")}\n ${chalk.white(\"$ lynxp link --list\")} ${chalk.gray(\"Show tracked blueprints\")}\n\n${chalk.cyan(\"Blueprint Tracking:\")}\n ${chalk.white(\"$ lynxp link AGENTS.md bp_xyz\")} ${chalk.gray(\"Link existing file to blueprint\")}\n ${chalk.white(\"$ lynxp unlink AGENTS.md\")} ${chalk.gray(\"Disconnect from cloud\")}\n ${chalk.white(\"$ lynxp diff bp_abc123\")} ${chalk.gray(\"Show changes vs cloud version\")}\n\n${chalk.cyan(\"CI/CD:\")}\n ${chalk.white(\"$ lynxp check --ci\")} ${chalk.gray(\"Validate config (exit code)\")}\n\n${chalk.gray(\"Docs: https://lynxprompt.com/docs/cli\")}\n`\n);\n\nprogram.parse();\n","import chalk from \"chalk\";\nimport ora from \"ora\";\nimport { api, ApiRequestError } from \"../api.js\";\nimport { setToken, setUser, isAuthenticated } from \"../config.js\";\n\nexport async function loginCommand(): Promise<void> {\n if (isAuthenticated()) {\n console.log(\n chalk.yellow(\n \"You are already logged in. Use 'lynxprompt logout' first to switch accounts.\"\n )\n );\n return;\n }\n\n const spinner = ora(\"Initializing authentication...\").start();\n\n try {\n // Initialize CLI session\n const session = await api.initCliSession();\n spinner.stop();\n\n console.log();\n console.log(chalk.cyan(\"š Opening browser to authenticate...\"));\n console.log(chalk.gray(` ${session.auth_url}`));\n console.log();\n\n // Try to open the browser\n const openBrowser = await tryOpenBrowser(session.auth_url);\n if (!openBrowser) {\n console.log(\n chalk.yellow(\"Could not open browser automatically. Please open the URL above manually.\")\n );\n }\n\n // Poll for completion\n const pollSpinner = ora(\"Waiting for authentication...\").start();\n \n const maxWaitTime = 5 * 60 * 1000; // 5 minutes\n const pollInterval = 2000; // 2 seconds\n const startTime = Date.now();\n\n while (Date.now() - startTime < maxWaitTime) {\n await sleep(pollInterval);\n\n try {\n const result = await api.pollCliSession(session.session_id);\n\n if (result.status === \"completed\" && result.token && result.user) {\n pollSpinner.succeed(\"Authentication successful!\");\n \n // Store credentials\n setToken(result.token);\n setUser(result.user);\n\n // Show cool welcome message with plan info\n displayWelcome(result.user);\n return;\n }\n\n if (result.status === \"expired\") {\n pollSpinner.fail(\"Authentication session expired. Please try again.\");\n return;\n }\n\n // status === \"pending\", continue polling\n } catch (error) {\n // Ignore polling errors, keep trying\n }\n }\n\n pollSpinner.fail(\"Authentication timed out. Please try again.\");\n } catch (error) {\n spinner.fail(\"Failed to initialize authentication\");\n \n if (error instanceof ApiRequestError) {\n console.error(chalk.red(`Error: ${error.message}`));\n if (error.statusCode === 503) {\n console.error(chalk.gray(\"The server may be temporarily unavailable. Please try again later.\"));\n }\n } else {\n console.error(chalk.red(\"An unexpected error occurred.\"));\n console.error(chalk.gray(\"Make sure you have internet connectivity and try again.\"));\n }\n process.exit(1);\n }\n}\n\nasync function tryOpenBrowser(url: string): Promise<boolean> {\n try {\n // Dynamic import for open package\n const { default: open } = await import(\"open\");\n await open(url);\n return true;\n } catch {\n // If open package is not available or fails, try native commands\n const { exec } = await import(\"child_process\");\n const { promisify } = await import(\"util\");\n const execAsync = promisify(exec);\n\n const platform = process.platform;\n let command: string;\n\n if (platform === \"darwin\") {\n command = `open \"${url}\"`;\n } else if (platform === \"win32\") {\n command = `start \"\" \"${url}\"`;\n } else {\n command = `xdg-open \"${url}\"`;\n }\n\n try {\n await execAsync(command);\n return true;\n } catch {\n return false;\n }\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\ninterface UserInfo {\n id: string;\n email: string;\n name: string | null;\n plan: string;\n}\n\nfunction displayWelcome(user: UserInfo): void {\n const plan = user.plan?.toUpperCase() || \"FREE\";\n const name = user.name || user.email.split(\"@\")[0];\n \n // Plan colors and emojis\n const planConfig: Record<string, { color: (s: string) => string; emoji: string; badge: string }> = {\n FREE: { color: chalk.gray, emoji: \"š\", badge: \"Free\" },\n PRO: { color: chalk.cyan, emoji: \"ā”\", badge: \"Pro\" },\n MAX: { color: chalk.magenta, emoji: \"š\", badge: \"Max\" },\n TEAMS: { color: chalk.yellow, emoji: \"š„\", badge: \"Teams\" },\n };\n \n const config = planConfig[plan] || planConfig.FREE;\n \n console.log();\n console.log(chalk.bold(\"āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\"));\n console.log(chalk.bold(\"ā\") + \" \" + chalk.bold(\"ā\"));\n console.log(chalk.bold(\"ā\") + chalk.green.bold(` ${config.emoji} Welcome to LynxPrompt CLI!`) + \" \" + chalk.bold(\"ā\"));\n console.log(chalk.bold(\"ā\") + \" \" + chalk.bold(\"ā\"));\n console.log(chalk.bold(\"ā\") + ` ${chalk.white(\"User:\")} ${chalk.bold(name.padEnd(38))}` + chalk.bold(\"ā\"));\n console.log(chalk.bold(\"ā\") + ` ${chalk.white(\"Plan:\")} ${config.color(config.badge.padEnd(38))}` + chalk.bold(\"ā\"));\n console.log(chalk.bold(\"ā\") + \" \" + chalk.bold(\"ā\"));\n console.log(chalk.bold(\"āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\"));\n console.log();\n \n // Show capabilities based on plan\n console.log(chalk.bold(\"š Your CLI Capabilities:\"));\n console.log();\n \n // All users get these\n console.log(chalk.green(\" ā\") + \" \" + chalk.white(\"lynxprompt init\") + chalk.gray(\" - Generate config files\"));\n console.log(chalk.green(\" ā\") + \" \" + chalk.white(\"lynxprompt wizard\") + chalk.gray(\" - Interactive wizard\"));\n console.log(chalk.green(\" ā\") + \" \" + chalk.white(\"lynxprompt list\") + chalk.gray(\" - List your blueprints\"));\n console.log(chalk.green(\" ā\") + \" \" + chalk.white(\"lynxprompt pull <id>\") + chalk.gray(\" - Download blueprints\"));\n console.log(chalk.green(\" ā\") + \" \" + chalk.white(\"lynxprompt push\") + chalk.gray(\" - Upload blueprints to marketplace\"));\n console.log(chalk.green(\" ā\") + \" \" + chalk.white(\"lynxprompt link\") + chalk.gray(\" - Link project to blueprint\"));\n console.log(chalk.green(\" ā\") + \" \" + chalk.white(\"lynxprompt sync\") + chalk.gray(\" - Sync linked blueprints\"));\n console.log(chalk.green(\" ā\") + \" \" + chalk.white(\"lynxprompt diff\") + chalk.gray(\" - Compare local vs remote\"));\n \n // Plan-specific features\n if (plan === \"PRO\" || plan === \"MAX\" || plan === \"TEAMS\") {\n console.log();\n console.log(chalk.cyan(\" ā”\") + \" \" + chalk.white(\"Advanced wizards\") + chalk.gray(\" - More customization options\"));\n console.log(chalk.cyan(\" ā”\") + \" \" + chalk.white(\"Sell blueprints\") + chalk.gray(\" - Monetize your configurations\"));\n }\n \n if (plan === \"MAX\" || plan === \"TEAMS\") {\n console.log(chalk.magenta(\" š\") + \" \" + chalk.white(\"All paid blueprints\") + chalk.gray(\" - Access premium content\"));\n console.log(chalk.magenta(\" š\") + \" \" + chalk.white(\"Priority support\") + chalk.gray(\" - Get help faster\"));\n }\n \n if (plan === \"TEAMS\") {\n console.log(chalk.yellow(\" š„\") + \" \" + chalk.white(\"Team blueprints\") + chalk.gray(\" - Share with your team\"));\n console.log(chalk.yellow(\" š„\") + \" \" + chalk.white(\"SSO integration\") + chalk.gray(\" - Enterprise authentication\"));\n }\n \n console.log();\n console.log(chalk.gray(\"Token stored securely. Run \") + chalk.cyan(\"lynxprompt --help\") + chalk.gray(\" to see all commands.\"));\n console.log();\n}\n\n\n\n\n","import Conf from \"conf\";\n\ninterface ConfigSchema {\n token?: string;\n apiUrl: string;\n user?: {\n id: string;\n email: string;\n name: string | null;\n plan: string;\n };\n}\n\nconst config = new Conf<ConfigSchema>({\n projectName: \"lynxprompt\",\n schema: {\n token: {\n type: \"string\",\n },\n apiUrl: {\n type: \"string\",\n default: \"https://lynxprompt.com\",\n },\n user: {\n type: \"object\",\n properties: {\n id: { type: \"string\" },\n email: { type: \"string\" },\n name: { type: [\"string\", \"null\"] },\n plan: { type: \"string\" },\n },\n },\n },\n defaults: {\n apiUrl: \"https://lynxprompt.com\",\n },\n});\n\nexport function getToken(): string | undefined {\n // Environment variable takes precedence\n const envToken = process.env.LYNXPROMPT_TOKEN;\n if (envToken) {\n return envToken;\n }\n return config.get(\"token\");\n}\n\nexport function setToken(token: string): void {\n config.set(\"token\", token);\n}\n\nexport function clearToken(): void {\n config.delete(\"token\");\n config.delete(\"user\");\n}\n\nexport function getApiUrl(): string {\n // Allow override via environment variable\n const envUrl = process.env.LYNXPROMPT_API_URL;\n if (envUrl) {\n return envUrl;\n }\n return config.get(\"apiUrl\");\n}\n\nexport function setApiUrl(url: string): void {\n config.set(\"apiUrl\", url);\n}\n\nexport function getUser(): ConfigSchema[\"user\"] | undefined {\n return config.get(\"user\");\n}\n\nexport function setUser(user: ConfigSchema[\"user\"]): void {\n config.set(\"user\", user);\n}\n\nexport function isAuthenticated(): boolean {\n return !!getToken();\n}\n\nexport function getConfigPath(): string {\n return config.path;\n}\n\n","import { getToken, getApiUrl } from \"./config.js\";\n\nexport interface ApiError {\n error: string;\n message?: string;\n expired_at?: string;\n}\n\nexport interface Blueprint {\n id: string;\n name: string;\n description: string | null;\n type: string;\n tier: string;\n category: string;\n tags: string[];\n visibility: \"PRIVATE\" | \"TEAM\" | \"PUBLIC\";\n downloads: number;\n favorites: number;\n price: number | null;\n currency: string | null;\n created_at: string;\n updated_at: string;\n content?: string;\n}\n\nexport interface BlueprintsResponse {\n blueprints: Blueprint[];\n total: number;\n limit: number;\n offset: number;\n has_more: boolean;\n}\n\nexport interface UserResponse {\n user: {\n id: string;\n email: string;\n name: string | null;\n display_name: string | null;\n persona: string | null;\n skill_level: string | null;\n subscription: {\n plan: string;\n status: string | null;\n interval: string | null;\n current_period_end: string | null;\n };\n stats: {\n blueprints_count: number;\n };\n created_at: string;\n };\n}\n\nexport interface CliSessionResponse {\n session_id: string;\n auth_url: string;\n expires_at: string;\n}\n\nexport interface CliPollResponse {\n status: \"pending\" | \"completed\" | \"expired\";\n token?: string;\n user?: {\n id: string;\n email: string;\n name: string | null;\n plan: string;\n };\n}\n\nexport interface SearchResult {\n id: string;\n name: string;\n description: string;\n author: string;\n authorId?: string;\n downloads: number;\n likes: number;\n tags: string[];\n tier: string;\n category: string;\n isOfficial: boolean;\n aiAssisted: boolean;\n price: number | null;\n discountedPrice: number | null;\n currency: string;\n}\n\nexport interface SearchResponse {\n templates: SearchResult[];\n popularTags: string[];\n total: number;\n hasMore: boolean;\n}\n\nclass ApiClient {\n private getHeaders(): Record<string, string> {\n const token = getToken();\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (token) {\n headers[\"Authorization\"] = `Bearer ${token}`;\n }\n return headers;\n }\n\n private async request<T>(\n endpoint: string,\n options: RequestInit = {}\n ): Promise<T> {\n const baseUrl = getApiUrl();\n const url = `${baseUrl}${endpoint}`;\n\n const response = await fetch(url, {\n ...options,\n headers: {\n ...this.getHeaders(),\n ...options.headers,\n },\n });\n\n const data = await response.json();\n\n if (!response.ok) {\n const error = data as ApiError;\n throw new ApiRequestError(\n error.message || error.error || \"Request failed\",\n response.status,\n error\n );\n }\n\n return data as T;\n }\n\n // Auth endpoints\n async initCliSession(): Promise<CliSessionResponse> {\n return this.request<CliSessionResponse>(\"/api/cli-auth/init\", {\n method: \"POST\",\n });\n }\n\n async pollCliSession(sessionId: string): Promise<CliPollResponse> {\n return this.request<CliPollResponse>(\n `/api/cli-auth/poll?session=${sessionId}`\n );\n }\n\n // User endpoints\n async getUser(): Promise<UserResponse> {\n return this.request<UserResponse>(\"/api/v1/user\");\n }\n\n // Blueprint endpoints\n async listBlueprints(options: {\n limit?: number;\n offset?: number;\n visibility?: string;\n } = {}): Promise<BlueprintsResponse> {\n const params = new URLSearchParams();\n if (options.limit) params.set(\"limit\", options.limit.toString());\n if (options.offset) params.set(\"offset\", options.offset.toString());\n if (options.visibility) params.set(\"visibility\", options.visibility);\n\n const query = params.toString();\n return this.request<BlueprintsResponse>(\n `/api/v1/blueprints${query ? `?${query}` : \"\"}`\n );\n }\n\n async getBlueprint(id: string): Promise<{ blueprint: Blueprint }> {\n // IDs can be:\n // - bp_xxx (v1 blueprint IDs)\n // - usr_xxx (user template IDs from marketplace)\n // - plain ID (needs bp_ prefix for v1 API)\n \n // For usr_ IDs, use the public blueprint endpoint (not v1)\n // This endpoint returns the blueprint directly, not wrapped\n if (id.startsWith(\"usr_\")) {\n const blueprint = await this.request<Blueprint>(`/api/blueprints/${id}`);\n // Map isPublic to visibility for consistency\n const visibility = (blueprint as any).isPublic ? \"PUBLIC\" : \"PRIVATE\";\n return { blueprint: { ...blueprint, visibility, type: (blueprint as any).tier || \"GENERIC\" } };\n }\n \n // For v1 blueprints, ensure bp_ prefix\n const apiId = id.startsWith(\"bp_\") ? id : `bp_${id}`;\n return this.request<{ blueprint: Blueprint }>(`/api/v1/blueprints/${apiId}`);\n }\n\n async searchBlueprints(query: string, limit: number = 20): Promise<SearchResponse> {\n const params = new URLSearchParams({\n q: query,\n limit: limit.toString(),\n });\n return this.request<SearchResponse>(`/api/blueprints?${params}`);\n }\n\n async createBlueprint(data: {\n name: string;\n description: string;\n content: string;\n visibility: \"PRIVATE\" | \"TEAM\" | \"PUBLIC\";\n tags?: string[];\n }): Promise<{ blueprint: Blueprint }> {\n return this.request<{ blueprint: Blueprint }>(\"/api/v1/blueprints\", {\n method: \"POST\",\n body: JSON.stringify(data),\n });\n }\n\n async updateBlueprint(\n id: string,\n data: {\n name?: string;\n description?: string;\n content?: string;\n visibility?: \"PRIVATE\" | \"TEAM\" | \"PUBLIC\";\n tags?: string[];\n }\n ): Promise<{ blueprint: Blueprint }> {\n const apiId = id.startsWith(\"bp_\") ? id : `bp_${id}`;\n return this.request<{ blueprint: Blueprint }>(`/api/v1/blueprints/${apiId}`, {\n method: \"PUT\",\n body: JSON.stringify(data),\n });\n }\n}\n\nexport class ApiRequestError extends Error {\n constructor(\n message: string,\n public statusCode: number,\n public response: ApiError\n ) {\n super(message);\n this.name = \"ApiRequestError\";\n }\n}\n\nexport const api = new ApiClient();\n\n\n","import chalk from \"chalk\";\nimport { clearToken, isAuthenticated, getUser } from \"../config.js\";\n\nexport async function logoutCommand(): Promise<void> {\n if (!isAuthenticated()) {\n console.log(chalk.yellow(\"You are not currently logged in.\"));\n return;\n }\n\n const user = getUser();\n const email = user?.email || \"unknown\";\n\n clearToken();\n\n console.log(chalk.green(`ā Logged out from ${chalk.bold(email)}`));\n console.log(chalk.gray(\" Removed stored credentials\"));\n}\n\n\n\n\n\n","import chalk from \"chalk\";\nimport ora from \"ora\";\nimport { api, ApiRequestError } from \"../api.js\";\nimport { isAuthenticated, setUser } from \"../config.js\";\n\nexport async function whoamiCommand(): Promise<void> {\n if (!isAuthenticated()) {\n console.log(chalk.yellow(\"Not logged in. Run 'lynxprompt login' to authenticate.\"));\n process.exit(1);\n }\n\n const spinner = ora(\"Fetching user info...\").start();\n\n try {\n const { user } = await api.getUser();\n spinner.stop();\n\n // Update cached user info\n setUser({\n id: user.id,\n email: user.email,\n name: user.name,\n plan: user.subscription.plan,\n });\n\n console.log();\n console.log(chalk.cyan(\"š± LynxPrompt Account\"));\n console.log();\n console.log(` ${chalk.gray(\"Email:\")} ${chalk.bold(user.email)}`);\n if (user.name) {\n console.log(` ${chalk.gray(\"Name:\")} ${user.name}`);\n }\n if (user.display_name) {\n console.log(` ${chalk.gray(\"Display:\")} ${user.display_name}`);\n }\n console.log(` ${chalk.gray(\"Plan:\")} ${formatPlan(user.subscription.plan)}`);\n if (user.subscription.status) {\n console.log(` ${chalk.gray(\"Status:\")} ${user.subscription.status}`);\n }\n if (user.subscription.current_period_end) {\n const endDate = new Date(user.subscription.current_period_end);\n console.log(` ${chalk.gray(\"Renews:\")} ${endDate.toLocaleDateString()}`);\n }\n console.log();\n console.log(` ${chalk.gray(\"Blueprints:\")} ${user.stats.blueprints_count}`);\n console.log(` ${chalk.gray(\"Member since:\")} ${new Date(user.created_at).toLocaleDateString()}`);\n console.log();\n } catch (error) {\n spinner.fail(\"Failed to fetch user info\");\n\n if (error instanceof ApiRequestError) {\n if (error.statusCode === 401) {\n console.error(chalk.red(\"Your session has expired. Please run 'lynxprompt login' again.\"));\n } else if (error.statusCode === 403) {\n console.error(chalk.red(\"API access requires Pro, Max, or Teams subscription.\"));\n console.error(chalk.gray(\"Upgrade at https://lynxprompt.com/pricing\"));\n } else {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n } else {\n console.error(chalk.red(\"An unexpected error occurred.\"));\n }\n process.exit(1);\n }\n}\n\nfunction formatPlan(plan: string): string {\n const planColors: Record<string, (s: string) => string> = {\n FREE: chalk.gray,\n PRO: chalk.blue,\n MAX: chalk.magenta,\n TEAMS: chalk.cyan,\n };\n \n const colorFn = planColors[plan] || chalk.white;\n return colorFn(plan);\n}\n\n\n\n\n","import chalk from \"chalk\";\nimport ora from \"ora\";\nimport { api, ApiRequestError, Blueprint } from \"../api.js\";\nimport { isAuthenticated } from \"../config.js\";\n\ninterface ListOptions {\n limit: string;\n visibility?: string;\n}\n\nexport async function listCommand(options: ListOptions): Promise<void> {\n if (!isAuthenticated()) {\n console.log(chalk.yellow(\"Not logged in. Run 'lynxprompt login' to authenticate.\"));\n process.exit(1);\n }\n\n const spinner = ora(\"Fetching your blueprints...\").start();\n\n try {\n const limit = parseInt(options.limit, 10) || 20;\n const { blueprints, total, has_more } = await api.listBlueprints({\n limit,\n visibility: options.visibility,\n });\n\n spinner.stop();\n\n if (blueprints.length === 0) {\n console.log();\n console.log(chalk.yellow(\"No blueprints found.\"));\n console.log(chalk.gray(\"Create your first blueprint at https://lynxprompt.com/blueprints/create\"));\n console.log(chalk.gray(\"Or run 'lynxprompt init' to generate one from the CLI!\"));\n return;\n }\n\n console.log();\n console.log(chalk.cyan(`š± Your Blueprints (${total} total)`));\n console.log();\n\n for (const bp of blueprints) {\n printBlueprint(bp);\n }\n\n if (has_more) {\n console.log(chalk.gray(`Showing ${blueprints.length} of ${total}. Use --limit to see more.`));\n }\n } catch (error) {\n spinner.fail(\"Failed to fetch blueprints\");\n handleApiError(error);\n }\n}\n\nfunction printBlueprint(bp: Blueprint): void {\n const visibilityIcon = {\n PRIVATE: \"š\",\n TEAM: \"š„\",\n PUBLIC: \"š\",\n }[bp.visibility] || \"š\";\n\n const tierBadge = {\n SIMPLE: chalk.gray(\"[Basic]\"),\n INTERMEDIATE: chalk.blue(\"[Pro]\"),\n ADVANCED: chalk.magenta(\"[Max]\"),\n }[bp.tier] || \"\";\n\n console.log(` ${visibilityIcon} ${chalk.bold(bp.name)} ${tierBadge}`);\n console.log(` ${chalk.cyan(bp.id)}`);\n if (bp.description) {\n console.log(` ${chalk.gray(truncate(bp.description, 60))}`);\n }\n console.log(` ${chalk.gray(`ā${bp.downloads}`)} ${chalk.gray(`ā„${bp.favorites}`)} ${formatTags(bp.tags)}`);\n console.log();\n}\n\nfunction formatTags(tags: string[]): string {\n if (!tags || tags.length === 0) return \"\";\n return tags.slice(0, 3).map((t) => chalk.gray(`#${t}`)).join(\" \");\n}\n\nfunction truncate(str: string, maxLength: number): string {\n if (str.length <= maxLength) return str;\n return str.slice(0, maxLength - 3) + \"...\";\n}\n\nfunction handleApiError(error: unknown): void {\n if (error instanceof ApiRequestError) {\n if (error.statusCode === 401) {\n console.error(chalk.red(\"Your session has expired. Please run 'lynxprompt login' again.\"));\n } else if (error.statusCode === 403) {\n console.error(chalk.red(\"API access requires Pro, Max, or Teams subscription.\"));\n console.error(chalk.gray(\"Upgrade at https://lynxprompt.com/pricing\"));\n } else {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n } else {\n console.error(chalk.red(\"An unexpected error occurred.\"));\n }\n process.exit(1);\n}\n\n\n\n\n\n","import chalk from \"chalk\";\nimport ora from \"ora\";\nimport prompts from \"prompts\";\nimport { api, ApiRequestError, Blueprint } from \"../api.js\";\nimport { isAuthenticated } from \"../config.js\";\nimport { writeFile, mkdir, readFile } from \"fs/promises\";\nimport { join, dirname } from \"path\";\nimport { existsSync } from \"fs\";\nimport {\n trackBlueprint,\n findBlueprintByFile,\n type BlueprintSource,\n} from \"../utils/blueprint-tracker.js\";\n\ninterface PullOptions {\n output: string;\n yes?: boolean;\n preview?: boolean;\n track?: boolean; // Track the blueprint for future syncs (default: true)\n}\n\n// Mapping of blueprint types to filenames\nconst TYPE_TO_FILENAME: Record<string, string> = {\n AGENTS_MD: \"AGENTS.md\",\n CURSOR_RULES: \".cursor/rules/project.mdc\",\n COPILOT_INSTRUCTIONS: \".github/copilot-instructions.md\",\n WINDSURF_RULES: \".windsurfrules\",\n ZED_INSTRUCTIONS: \".zed/instructions.md\",\n CLAUDE_MD: \"CLAUDE.md\",\n GENERIC: \"ai-config.md\",\n};\n\n// Determine blueprint source from visibility\nfunction getSourceFromVisibility(visibility: Blueprint[\"visibility\"]): BlueprintSource {\n switch (visibility) {\n case \"PUBLIC\":\n return \"marketplace\";\n case \"TEAM\":\n return \"team\";\n case \"PRIVATE\":\n return \"private\";\n default:\n return \"marketplace\";\n }\n}\n\nexport async function pullCommand(\n id: string,\n options: PullOptions\n): Promise<void> {\n // Public marketplace blueprints (usr_ IDs) don't require authentication\n // Only v1 blueprints (bp_ IDs) require login\n const isPublicBlueprint = id.startsWith(\"usr_\");\n \n if (!isPublicBlueprint && !isAuthenticated()) {\n console.log(\n chalk.yellow(\"Not logged in. Run 'lynxp login' to authenticate.\")\n );\n console.log(\n chalk.gray(\"Note: Public marketplace blueprints (usr_...) can be downloaded without login.\")\n );\n process.exit(1);\n }\n\n const cwd = process.cwd();\n const spinner = ora(`Fetching blueprint ${chalk.cyan(id)}...`).start();\n\n try {\n const { blueprint } = await api.getBlueprint(id);\n spinner.stop();\n\n if (!blueprint.content) {\n console.error(chalk.red(\"ā Blueprint has no content.\"));\n process.exit(1);\n }\n\n const source = getSourceFromVisibility(blueprint.visibility);\n const isMarketplace = source === \"marketplace\";\n\n console.log();\n console.log(chalk.cyan(`š± Blueprint: ${chalk.bold(blueprint.name)}`));\n if (blueprint.description) {\n console.log(chalk.gray(` ${blueprint.description}`));\n }\n console.log(chalk.gray(` Type: ${blueprint.type} ⢠Tier: ${blueprint.tier} ⢠Visibility: ${blueprint.visibility}`));\n \n // Show source type info\n if (isMarketplace) {\n console.log(chalk.yellow(` š¦ Marketplace blueprint (read-only - changes won't sync back)`));\n } else if (source === \"team\") {\n console.log(chalk.blue(` š„ Team blueprint (can sync changes)`));\n } else if (source === \"private\") {\n console.log(chalk.green(` š Private blueprint (can sync changes)`));\n }\n console.log();\n\n // Preview mode - show content without writing\n if (options.preview) {\n console.log(chalk.gray(\"ā\".repeat(60)));\n console.log();\n \n // Show first 50 lines with syntax highlighting hints\n const lines = blueprint.content.split(\"\\n\");\n const previewLines = lines.slice(0, 50);\n \n for (const line of previewLines) {\n if (line.startsWith(\"#\")) {\n console.log(chalk.cyan(line));\n } else if (line.startsWith(\">\")) {\n console.log(chalk.gray(line));\n } else if (line.startsWith(\"- \") || line.startsWith(\"* \")) {\n console.log(chalk.white(line));\n } else if (line.startsWith(\"```\")) {\n console.log(chalk.yellow(line));\n } else {\n console.log(line);\n }\n }\n \n if (lines.length > 50) {\n console.log();\n console.log(chalk.gray(`... ${lines.length - 50} more lines`));\n }\n \n console.log();\n console.log(chalk.gray(\"ā\".repeat(60)));\n console.log();\n console.log(chalk.gray(\"Run without --preview to download this blueprint.\"));\n return;\n }\n\n // Determine output filename\n const filename = TYPE_TO_FILENAME[blueprint.type] || \"ai-config.md\";\n const outputPath = join(options.output, filename);\n\n // Check if file exists and show diff preview\n let localContent: string | null = null;\n if (existsSync(outputPath)) {\n try {\n localContent = await readFile(outputPath, \"utf-8\");\n } catch {\n // Can't read local file\n }\n }\n\n // Check if this file is already tracked\n const existingTracked = await findBlueprintByFile(cwd, filename);\n if (existingTracked && existingTracked.id !== id) {\n console.log(chalk.yellow(`ā This file is already linked to a different blueprint: ${existingTracked.id}`));\n if (!options.yes) {\n const { proceed } = await prompts({\n type: \"confirm\",\n name: \"proceed\",\n message: \"Replace the link with the new blueprint?\",\n initial: false,\n });\n if (!proceed) {\n console.log(chalk.gray(\"Cancelled.\"));\n return;\n }\n }\n }\n\n if (localContent && !options.yes) {\n // Show what will change\n const localLines = localContent.split(\"\\n\").length;\n const remoteLines = blueprint.content.split(\"\\n\").length;\n \n console.log(chalk.yellow(`ā File exists: ${outputPath}`));\n console.log(chalk.gray(` Local: ${localLines} lines`));\n console.log(chalk.gray(` Remote: ${remoteLines} lines`));\n console.log();\n\n const response = await prompts({\n type: \"select\",\n name: \"action\",\n message: \"What would you like to do?\",\n choices: [\n { title: \"Overwrite with remote version\", value: \"overwrite\" },\n { title: \"Preview remote content first\", value: \"preview\" },\n { title: \"Cancel\", value: \"cancel\" },\n ],\n });\n\n if (response.action === \"cancel\" || !response.action) {\n console.log(chalk.gray(\"Cancelled.\"));\n return;\n }\n\n if (response.action === \"preview\") {\n // Show preview\n console.log();\n console.log(chalk.gray(\"ā\".repeat(60)));\n console.log();\n \n const lines = blueprint.content.split(\"\\n\").slice(0, 30);\n for (const line of lines) {\n if (line.startsWith(\"#\")) {\n console.log(chalk.cyan(line));\n } else {\n console.log(line);\n }\n }\n \n if (blueprint.content.split(\"\\n\").length > 30) {\n console.log(chalk.gray(`... ${blueprint.content.split(\"\\n\").length - 30} more lines`));\n }\n \n console.log();\n console.log(chalk.gray(\"ā\".repeat(60)));\n console.log();\n\n const confirmResponse = await prompts({\n type: \"confirm\",\n name: \"confirm\",\n message: \"Download and overwrite local file?\",\n initial: false,\n });\n\n if (!confirmResponse.confirm) {\n console.log(chalk.gray(\"Cancelled.\"));\n return;\n }\n }\n }\n\n // Create directory if needed\n const dir = dirname(outputPath);\n if (dir !== \".\") {\n await mkdir(dir, { recursive: true });\n }\n\n // Write the file\n await writeFile(outputPath, blueprint.content, \"utf-8\");\n\n // Track the blueprint (default behavior unless --no-track)\n if (options.track !== false) {\n await trackBlueprint(cwd, {\n id: blueprint.id,\n name: blueprint.name,\n file: filename,\n content: blueprint.content,\n source,\n });\n }\n\n console.log(chalk.green(`ā
Downloaded: ${chalk.bold(outputPath)}`));\n \n // Show tracking info\n if (options.track !== false) {\n console.log(chalk.gray(` Linked to: ${blueprint.id}`));\n if (isMarketplace) {\n console.log(chalk.gray(` Updates: Run 'lynxp pull ${id}' to sync updates`));\n } else {\n console.log(chalk.gray(` Sync: Run 'lynxp push ${filename}' to push changes`));\n }\n }\n console.log();\n\n // Show helpful next steps\n const editorHint = getEditorHint(blueprint.type);\n if (editorHint) {\n console.log(chalk.gray(`š” ${editorHint}`));\n console.log();\n }\n\n // Additional tips\n console.log(chalk.gray(\"Tips:\"));\n console.log(chalk.gray(` ⢠Run 'lynxp status' to see tracked blueprints`));\n console.log(chalk.gray(` ⢠Run 'lynxp diff ${id}' to see changes between local and remote`));\n if (isMarketplace) {\n console.log(chalk.gray(` ⢠Run 'lynxp unlink ${filename}' to disconnect and make editable`));\n }\n console.log();\n } catch (error) {\n spinner.fail(\"Failed to pull blueprint\");\n handleApiError(error);\n }\n}\n\nfunction getEditorHint(type: string): string | null {\n switch (type) {\n case \"CURSOR_RULES\":\n return \"This file will be automatically read by Cursor.\";\n case \"COPILOT_INSTRUCTIONS\":\n return \"This file will be read by GitHub Copilot in VS Code.\";\n case \"AGENTS_MD\":\n return \"This AGENTS.md file works with Claude Code, Cursor, and other AI agents.\";\n case \"WINDSURF_RULES\":\n return \"This file will be automatically read by Windsurf.\";\n case \"ZED_INSTRUCTIONS\":\n return \"This file will be read by Zed's AI assistant.\";\n case \"CLAUDE_MD\":\n return \"This CLAUDE.md file will be read by Claude Code.\";\n default:\n return null;\n }\n}\n\nfunction handleApiError(error: unknown): void {\n if (error instanceof ApiRequestError) {\n if (error.statusCode === 401) {\n console.error(\n chalk.red(\"ā Your session has expired. Please run 'lynxp login' again.\")\n );\n } else if (error.statusCode === 403) {\n console.error(\n chalk.red(\"ā You don't have access to this blueprint.\")\n );\n console.error(\n chalk.gray(\n \" This might be a private blueprint or require a higher subscription tier.\"\n )\n );\n } else if (error.statusCode === 404) {\n console.error(chalk.red(\"ā Blueprint not found.\"));\n console.error(\n chalk.gray(\n \" Make sure you have the correct blueprint ID. Use 'lynxp list' to see your blueprints.\"\n )\n );\n } else {\n console.error(chalk.red(`ā Error: ${error.message}`));\n }\n } else {\n console.error(chalk.red(\"ā An unexpected error occurred.\"));\n }\n process.exit(1);\n}\n","/**\n * Blueprint Tracker\n * \n * Tracks which blueprints have been pulled from LynxPrompt cloud and their sync status.\n * Enables:\n * - Detecting if a local file came from a cloud blueprint\n * - Syncing updates from upstream blueprints\n * - Prompting users when they try to modify marketplace blueprints\n * - Managing team/private blueprint versions\n * \n * Storage: .lynxprompt/blueprints.yml\n */\n\nimport { readFile, writeFile, mkdir, access } from \"fs/promises\";\nimport { join, dirname } from \"path\";\nimport { createHash } from \"crypto\";\nimport * as yaml from \"yaml\";\n\n// Blueprint source types\nexport type BlueprintSource = \"marketplace\" | \"team\" | \"private\" | \"local\";\n\n// Tracked blueprint metadata\nexport interface TrackedBlueprint {\n id: string; // Blueprint ID (e.g., bp_abc123)\n source: BlueprintSource; // Where the blueprint came from\n file: string; // Local file path relative to project root\n name: string; // Blueprint name for display\n pulledAt: string; // ISO timestamp of last pull\n checksum: string; // SHA-256 of content when pulled (to detect local changes)\n version?: string; // Blueprint version (if available)\n editable: boolean; // Can the user push changes back?\n canPull: boolean; // Can pull updates from upstream?\n}\n\n// Blueprints file structure\nexport interface BlueprintsConfig {\n version: \"1\";\n blueprints: TrackedBlueprint[];\n}\n\nconst BLUEPRINTS_FILE = \".lynxprompt/blueprints.yml\";\n\n/**\n * Calculate SHA-256 checksum of content\n */\nexport function calculateChecksum(content: string): string {\n return createHash(\"sha256\").update(content).digest(\"hex\").substring(0, 16);\n}\n\n/**\n * Load blueprints configuration\n */\nexport async function loadBlueprints(cwd: string): Promise<BlueprintsConfig> {\n const filePath = join(cwd, BLUEPRINTS_FILE);\n \n try {\n await access(filePath);\n const content = await readFile(filePath, \"utf-8\");\n const config = yaml.parse(content) as BlueprintsConfig;\n return config || { version: \"1\", blueprints: [] };\n } catch {\n return { version: \"1\", blueprints: [] };\n }\n}\n\n/**\n * Save blueprints configuration\n */\nexport async function saveBlueprints(cwd: string, config: BlueprintsConfig): Promise<void> {\n const filePath = join(cwd, BLUEPRINTS_FILE);\n const dir = dirname(filePath);\n \n await mkdir(dir, { recursive: true });\n \n const content = yaml.stringify(config, {\n lineWidth: 0,\n singleQuote: false,\n });\n \n await writeFile(filePath, content, \"utf-8\");\n}\n\n/**\n * Track a pulled blueprint\n */\nexport async function trackBlueprint(\n cwd: string,\n blueprint: {\n id: string;\n name: string;\n file: string;\n content: string;\n source: BlueprintSource;\n version?: string;\n }\n): Promise<void> {\n const config = await loadBlueprints(cwd);\n \n // Remove existing entry for same file if exists\n config.blueprints = config.blueprints.filter(b => b.file !== blueprint.file);\n \n // Determine editability based on source\n const editable = blueprint.source !== \"marketplace\";\n const canPull = true; // All tracked blueprints can pull updates\n \n config.blueprints.push({\n id: blueprint.id,\n source: blueprint.source,\n file: blueprint.file,\n name: blueprint.name,\n pulledAt: new Date().toISOString(),\n checksum: calculateChecksum(blueprint.content),\n version: blueprint.version,\n editable,\n canPull,\n });\n \n await saveBlueprints(cwd, config);\n}\n\n/**\n * Find tracked blueprint by file path\n */\nexport async function findBlueprintByFile(cwd: string, file: string): Promise<TrackedBlueprint | null> {\n const config = await loadBlueprints(cwd);\n return config.blueprints.find(b => b.file === file) || null;\n}\n\n/**\n * Find tracked blueprint by ID\n */\nexport async function findBlueprintById(cwd: string, id: string): Promise<TrackedBlueprint | null> {\n const config = await loadBlueprints(cwd);\n return config.blueprints.find(b => b.id === id) || null;\n}\n\n/**\n * Check if local file has been modified since pull\n */\nexport async function hasLocalChanges(cwd: string, tracked: TrackedBlueprint): Promise<boolean> {\n try {\n const filePath = join(cwd, tracked.file);\n const content = await readFile(filePath, \"utf-8\");\n const currentChecksum = calculateChecksum(content);\n return currentChecksum !== tracked.checksum;\n } catch {\n return false;\n }\n}\n\n/**\n * Update checksum after syncing\n */\nexport async function updateChecksum(cwd: string, file: string, content: string): Promise<void> {\n const config = await loadBlueprints(cwd);\n const blueprint = config.blueprints.find(b => b.file === file);\n \n if (blueprint) {\n blueprint.checksum = calculateChecksum(content);\n blueprint.pulledAt = new Date().toISOString();\n await saveBlueprints(cwd, config);\n }\n}\n\n/**\n * Untrack a blueprint (disconnect from cloud)\n */\nexport async function untrackBlueprint(cwd: string, file: string): Promise<boolean> {\n const config = await loadBlueprints(cwd);\n const initialCount = config.blueprints.length;\n config.blueprints = config.blueprints.filter(b => b.file !== file);\n \n if (config.blueprints.length < initialCount) {\n await saveBlueprints(cwd, config);\n return true;\n }\n return false;\n}\n\n/**\n * Link an existing local file to a cloud blueprint\n */\nexport async function linkBlueprint(\n cwd: string,\n file: string,\n blueprintId: string,\n blueprintName: string,\n source: BlueprintSource\n): Promise<void> {\n try {\n const filePath = join(cwd, file);\n const content = await readFile(filePath, \"utf-8\");\n \n await trackBlueprint(cwd, {\n id: blueprintId,\n name: blueprintName,\n file,\n content,\n source,\n });\n } catch (error) {\n throw new Error(`Could not read file ${file} to link`);\n }\n}\n\n/**\n * Get all tracked blueprints\n */\nexport async function getAllTrackedBlueprints(cwd: string): Promise<TrackedBlueprint[]> {\n const config = await loadBlueprints(cwd);\n return config.blueprints;\n}\n\n/**\n * Check sync status of all tracked blueprints\n */\nexport async function checkSyncStatus(cwd: string): Promise<Array<{\n blueprint: TrackedBlueprint;\n localModified: boolean;\n fileExists: boolean;\n}>> {\n const config = await loadBlueprints(cwd);\n const results = [];\n \n for (const blueprint of config.blueprints) {\n const filePath = join(cwd, blueprint.file);\n let fileExists = false;\n let localModified = false;\n \n try {\n await access(filePath);\n fileExists = true;\n localModified = await hasLocalChanges(cwd, blueprint);\n } catch {\n fileExists = false;\n }\n \n results.push({ blueprint, localModified, fileExists });\n }\n \n return results;\n}\n\n\n\n\n","import chalk from \"chalk\";\nimport ora from \"ora\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport prompts from \"prompts\";\nimport { api, ApiRequestError } from \"../api.js\";\nimport { isAuthenticated } from \"../config.js\";\nimport {\n findBlueprintByFile,\n trackBlueprint,\n updateChecksum,\n} from \"../utils/blueprint-tracker.js\";\n\ninterface PushOptions {\n name?: string;\n description?: string;\n visibility?: string;\n tags?: string;\n yes?: boolean;\n}\n\nexport async function pushCommand(\n fileArg: string | undefined,\n options: PushOptions\n): Promise<void> {\n const cwd = process.cwd();\n\n // Check authentication\n if (!isAuthenticated()) {\n console.log(chalk.yellow(\"You need to be logged in to push blueprints.\"));\n console.log(chalk.gray(\"Run 'lynxp login' to authenticate.\"));\n process.exit(1);\n }\n\n // Find the file to push\n const file = fileArg || findDefaultFile();\n if (!file) {\n console.log(chalk.red(\"No AI configuration file found.\"));\n console.log(\n chalk.gray(\"Specify a file or run in a directory with AGENTS.md, CLAUDE.md, etc.\")\n );\n process.exit(1);\n }\n\n if (!fs.existsSync(file)) {\n console.log(chalk.red(`File not found: ${file}`));\n process.exit(1);\n }\n\n const content = fs.readFileSync(file, \"utf-8\");\n const filename = path.basename(file);\n\n // Check if file is already linked to a blueprint\n const linked = await findBlueprintByFile(cwd, file);\n\n if (linked) {\n // Update existing blueprint\n await updateBlueprint(cwd, file, linked.id, content, options);\n } else {\n // Create new blueprint or link to existing\n await createOrLinkBlueprint(cwd, file, filename, content, options);\n }\n}\n\nasync function updateBlueprint(\n cwd: string,\n file: string,\n blueprintId: string,\n content: string,\n options: PushOptions\n): Promise<void> {\n console.log(chalk.cyan(`\\nš¤ Updating blueprint ${chalk.bold(blueprintId)}...`));\n console.log(chalk.gray(` File: ${file}`));\n\n if (!options.yes) {\n const confirm = await prompts({\n type: \"confirm\",\n name: \"value\",\n message: `Push changes to ${blueprintId}?`,\n initial: true,\n });\n\n if (!confirm.value) {\n console.log(chalk.yellow(\"Push cancelled.\"));\n return;\n }\n }\n\n const spinner = ora(\"Pushing changes...\").start();\n\n try {\n const result = await api.updateBlueprint(blueprintId, { content });\n spinner.succeed(\"Blueprint updated!\");\n\n // Update local tracking\n await updateChecksum(cwd, file, content);\n\n console.log();\n console.log(chalk.green(`ā
Successfully updated ${chalk.bold(result.blueprint.name)}`));\n console.log(chalk.gray(` ID: ${blueprintId}`));\n console.log(chalk.gray(` View: https://lynxprompt.com/templates/${blueprintId.replace(\"bp_\", \"\")}`));\n } catch (error) {\n spinner.fail(\"Failed to update blueprint\");\n handleError(error);\n }\n}\n\nasync function createOrLinkBlueprint(\n cwd: string,\n file: string,\n filename: string,\n content: string,\n options: PushOptions\n): Promise<void> {\n console.log(chalk.cyan(\"\\nš¤ Push new blueprint\"));\n console.log(chalk.gray(` File: ${file}`));\n\n // Ask for details if not provided\n let name = options.name;\n let description = options.description;\n let visibility = options.visibility || \"PRIVATE\";\n let tags = options.tags ? options.tags.split(\",\").map((t) => t.trim()) : [];\n\n if (!options.yes) {\n const responses = await prompts([\n {\n type: name ? null : \"text\",\n name: \"name\",\n message: \"Blueprint name:\",\n initial: filename.replace(/\\.(md|mdc|json|yml|yaml)$/, \"\"),\n validate: (v) => v.length > 0 || \"Name is required\",\n },\n {\n type: description ? null : \"text\",\n name: \"description\",\n message: \"Description:\",\n initial: \"\",\n },\n {\n type: \"select\",\n name: \"visibility\",\n message: \"Visibility:\",\n choices: [\n { title: \"Private (only you)\", value: \"PRIVATE\" },\n { title: \"Team (your team members)\", value: \"TEAM\" },\n { title: \"Public (visible to everyone)\", value: \"PUBLIC\" },\n ],\n initial: 0,\n },\n {\n type: \"text\",\n name: \"tags\",\n message: \"Tags (comma-separated):\",\n initial: \"\",\n },\n ]);\n\n if (!responses.name && !name) {\n console.log(chalk.yellow(\"Push cancelled.\"));\n return;\n }\n\n name = name || responses.name;\n description = description || responses.description || \"\";\n visibility = responses.visibility || visibility;\n tags = responses.tags ? responses.tags.split(\",\").map((t: string) => t.trim()).filter(Boolean) : tags;\n }\n\n if (!name) {\n name = filename.replace(/\\.(md|mdc|json|yml|yaml)$/, \"\");\n }\n\n const spinner = ora(\"Creating blueprint...\").start();\n\n try {\n const result = await api.createBlueprint({\n name,\n description: description || \"\",\n content,\n visibility: visibility as \"PRIVATE\" | \"TEAM\" | \"PUBLIC\",\n tags,\n });\n\n spinner.succeed(\"Blueprint created!\");\n\n // Track the blueprint locally\n await trackBlueprint(cwd, {\n id: result.blueprint.id,\n name: result.blueprint.name,\n file,\n content,\n source: \"private\",\n });\n\n console.log();\n console.log(chalk.green(`ā
Created blueprint ${chalk.bold(result.blueprint.name)}`));\n console.log(chalk.gray(` ID: ${result.blueprint.id}`));\n console.log(chalk.gray(` Visibility: ${visibility}`));\n if (visibility === \"PUBLIC\") {\n console.log(chalk.gray(` View: https://lynxprompt.com/templates/${result.blueprint.id.replace(\"bp_\", \"\")}`));\n }\n console.log();\n console.log(chalk.cyan(\"The file is now linked. Future 'lynxp push' will update this blueprint.\"));\n } catch (error) {\n spinner.fail(\"Failed to create blueprint\");\n handleError(error);\n }\n}\n\nfunction findDefaultFile(): string | null {\n const candidates = [\n \"AGENTS.md\",\n \"CLAUDE.md\",\n \".cursor/rules/project.mdc\",\n \".github/copilot-instructions.md\",\n \".windsurfrules\",\n \"AIDER.md\",\n \"GEMINI.md\",\n \".clinerules\",\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n }\n\n return null;\n}\n\nfunction handleError(error: unknown): void {\n if (error instanceof ApiRequestError) {\n console.error(chalk.red(`Error: ${error.message}`));\n if (error.statusCode === 401) {\n console.error(chalk.gray(\"Your session may have expired. Run 'lynxp login' to re-authenticate.\"));\n } else if (error.statusCode === 403) {\n console.error(chalk.gray(\"You don't have permission to modify this blueprint.\"));\n } else if (error.statusCode === 404) {\n console.error(chalk.gray(\"Blueprint not found. It may have been deleted.\"));\n }\n } else {\n console.error(chalk.red(\"An unexpected error occurred.\"));\n }\n process.exit(1);\n}\n","import chalk from \"chalk\";\nimport prompts from \"prompts\";\nimport ora from \"ora\";\nimport { writeFile, mkdir, readFile } from \"fs/promises\";\nimport { join, dirname, basename } from \"path\";\nimport { existsSync } from \"fs\";\nimport * as yaml from \"yaml\";\nimport { detectAgents } from \"../utils/agent-detector.js\";\nimport { detectProject } from \"../utils/detect.js\";\nimport { getPopularAgents } from \"../utils/agents.js\";\n\ninterface InitOptions {\n yes?: boolean;\n force?: boolean;\n}\n\n// LynxPrompt paths\nconst LYNXPROMPT_DIR = \".lynxprompt\";\nconst LYNXPROMPT_CONFIG = \".lynxprompt/conf.yml\";\nconst LYNXPROMPT_RULES = \".lynxprompt/rules\";\n\n// Common AI agent config files\nconst AGENT_FILES = [\n { name: \"AGENTS.md\", agent: \"Universal (AGENTS.md)\" },\n { name: \"CLAUDE.md\", agent: \"Claude Code\" },\n { name: \".windsurfrules\", agent: \"Windsurf\" },\n { name: \".clinerules\", agent: \"Cline\" },\n { name: \".goosehints\", agent: \"Goose\" },\n { name: \"AIDER.md\", agent: \"Aider\" },\n { name: \".github/copilot-instructions.md\", agent: \"GitHub Copilot\" },\n { name: \".zed/instructions.md\", agent: \"Zed\" },\n];\n\n// Directory-based AI agent configs\nconst AGENT_DIRS = [\n { path: \".cursor/rules\", agent: \"Cursor\" },\n { path: \".amazonq/rules\", agent: \"Amazon Q\" },\n { path: \".augment/rules\", agent: \"Augment Code\" },\n];\n\ninterface DetectedFile {\n path: string;\n agent: string;\n content?: string;\n}\n\n/**\n * Scan for existing AI agent configuration files\n */\nasync function scanForExistingFiles(cwd: string): Promise<DetectedFile[]> {\n const detected: DetectedFile[] = [];\n\n // Check single files\n for (const file of AGENT_FILES) {\n const filePath = join(cwd, file.name);\n if (existsSync(filePath)) {\n try {\n const content = await readFile(filePath, \"utf-8\");\n detected.push({ path: file.name, agent: file.agent, content });\n } catch {\n detected.push({ path: file.name, agent: file.agent });\n }\n }\n }\n\n // Check directories\n for (const dir of AGENT_DIRS) {\n const dirPath = join(cwd, dir.path);\n if (existsSync(dirPath)) {\n detected.push({ path: dir.path, agent: dir.agent });\n }\n }\n\n return detected;\n}\n\n/**\n * Create starter AGENTS.md content\n */\nfunction createStarterAgentsMd(projectName: string): string {\n return `# ${projectName} - AI Agent Instructions\n\n> Edit this file to customize how AI agents work with your codebase.\n> This is the source of truth for all AI assistants in this project.\n\n## Project Overview\n\nDescribe your project here. What does it do? What are its main features?\n\n## Tech Stack\n\nList the technologies used in this project:\n\n- Language: (e.g., TypeScript, Python, Go)\n- Framework: (e.g., Next.js, FastAPI, Rails)\n- Database: (e.g., PostgreSQL, MongoDB)\n- Other tools: (e.g., Docker, Kubernetes)\n\n## Code Style\n\nFollow these conventions:\n\n- Write clean, readable code\n- Use descriptive variable and function names\n- Keep functions focused and testable\n- Add comments for complex logic only\n\n## Commands\n\n\\`\\`\\`bash\n# Build\nnpm run build\n\n# Test\nnpm test\n\n# Lint\nnpm run lint\n\n# Dev server\nnpm run dev\n\\`\\`\\`\n\n## Boundaries\n\n### ā
Always (do without asking)\n\n- Read any file in the project\n- Modify files in src/ or lib/\n- Run build, test, and lint commands\n- Create test files\n\n### ā ļø Ask First\n\n- Add new dependencies\n- Modify configuration files\n- Create new modules or directories\n\n### š« Never\n\n- Modify .env files or secrets\n- Delete critical files without backup\n- Force push to git\n- Expose sensitive information\n\n---\n\n*Managed by [LynxPrompt](https://lynxprompt.com)*\n`;\n}\n\n/**\n * Create default LynxPrompt configuration\n */\nfunction createDefaultConfig(exporters: string[] = [\"agents\"]): string {\n const config = {\n version: \"1\",\n exporters,\n sources: [\n {\n type: \"local\",\n path: \".lynxprompt/rules\",\n },\n ],\n };\n return yaml.stringify(config);\n}\n\n/**\n * Create README for .lynxprompt directory\n */\nfunction createLynxpromptReadme(): string {\n return `# .lynxprompt\n\nThis directory contains your LynxPrompt configuration and rules.\n\n> **Note**: This is an advanced setup for managing rules across multiple AI editors.\n> Most users should use \\`lynxp wizard\\` instead for simple, direct file generation.\n\n## Directory structure\n\n- **\\`rules/\\`** - Your AI rules. Edit files here, then sync to agents.\n- **\\`conf.yml\\`** - Configuration file (exporters, sources, options)\n\n## Editing rules\n\nAdd markdown files to \\`rules/\\`:\n\n\\`\\`\\`markdown\n# My Rule\n\nDescription of what this rule does...\n\\`\\`\\`\n\n## Syncing\n\nAfter editing rules, run:\n\n\\`\\`\\`bash\nlynxp sync\n\\`\\`\\`\n\nThis exports your rules to the configured agent formats (AGENTS.md, .cursor/rules/, etc.)\n\n## More information\n\n- Docs: https://lynxprompt.com/docs/cli\n- Support: https://lynxprompt.com/support\n`;\n}\n\nexport async function initCommand(options: InitOptions): Promise<void> {\n console.log();\n console.log(chalk.cyan(\"š± LynxPrompt Init\"));\n console.log(chalk.gray(\"Advanced mode: Multi-editor rule management\"));\n console.log();\n\n // Show suggestion for simple use case\n if (!options.yes && !options.force) {\n console.log(chalk.yellow(\"š” Tip: Most users should use 'lynxp wizard' instead.\"));\n console.log(chalk.gray(\" The wizard generates files directly without the .lynxprompt/ folder.\"));\n console.log();\n \n const { proceed } = await prompts({\n type: \"confirm\",\n name: \"proceed\",\n message: \"Continue with advanced setup?\",\n initial: false,\n });\n\n if (!proceed) {\n console.log();\n console.log(chalk.gray(\"Run 'lynxp wizard' for simple file generation.\"));\n return;\n }\n console.log();\n }\n\n const cwd = process.cwd();\n const projectName = basename(cwd);\n const lynxpromptDir = join(cwd, LYNXPROMPT_DIR);\n const configPath = join(cwd, LYNXPROMPT_CONFIG);\n const rulesDir = join(cwd, LYNXPROMPT_RULES);\n\n // Check if already initialized\n if (existsSync(configPath) && !options.force) {\n console.log(chalk.yellow(\"LynxPrompt is already initialized in this project.\"));\n console.log(chalk.gray(`Config: ${LYNXPROMPT_CONFIG}`));\n console.log(chalk.gray(`Rules: ${LYNXPROMPT_RULES}/`));\n console.log();\n console.log(chalk.gray(\"Run 'lynxp sync' to export rules to your agents.\"));\n console.log(chalk.gray(\"Run 'lynxp wizard' to generate new configurations.\"));\n return;\n }\n\n // Detect project and agents\n const spinner = ora(\"Scanning project...\").start();\n const [projectInfo, agentDetection] = await Promise.all([\n detectProject(cwd),\n Promise.resolve(detectAgents(cwd)),\n ]);\n const existingFiles = await scanForExistingFiles(cwd);\n spinner.stop();\n\n // Show detected project info\n if (projectInfo) {\n console.log(chalk.green(\"ā Detected project:\"));\n if (projectInfo.name) console.log(chalk.gray(` Name: ${projectInfo.name}`));\n if (projectInfo.stack.length > 0) console.log(chalk.gray(` Stack: ${projectInfo.stack.join(\", \")}`));\n if (projectInfo.packageManager) console.log(chalk.gray(` Package manager: ${projectInfo.packageManager}`));\n console.log();\n }\n\n // Show detected agents\n if (agentDetection.detected.length > 0) {\n console.log(chalk.green(`ā Detected ${agentDetection.detected.length} AI agent${agentDetection.detected.length === 1 ? \"\" : \"s\"}:`));\n for (const detected of agentDetection.detected) {\n const rules = detected.ruleCount > 0 ? chalk.gray(` (${detected.ruleCount} sections)`) : \"\";\n console.log(` ${chalk.cyan(\"ā¢\")} ${detected.agent.name}${rules}`);\n }\n console.log();\n }\n\n if (existingFiles.length > 0) {\n console.log(chalk.green(\"ā Found existing AI configuration files:\"));\n for (const file of existingFiles) {\n console.log(` ${chalk.cyan(file.path)} ${chalk.gray(`(${file.agent})`)}`);\n }\n console.log();\n\n if (!options.yes) {\n const { action } = await prompts({\n type: \"select\",\n name: \"action\",\n message: \"What would you like to do?\",\n choices: [\n { title: \"Import existing files to .lynxprompt/rules/\", value: \"import\" },\n { title: \"Start fresh (keep existing files, create new rules)\", value: \"fresh\" },\n { title: \"Cancel\", value: \"cancel\" },\n ],\n });\n\n if (action === \"cancel\" || !action) {\n console.log(chalk.gray(\"Cancelled.\"));\n return;\n }\n\n if (action === \"import\") {\n // Import existing files\n await mkdir(rulesDir, { recursive: true });\n \n let importedCount = 0;\n for (const file of existingFiles) {\n if (file.content) {\n const ruleName = file.path.replace(/^\\./, \"\").replace(/\\//g, \"-\").replace(/\\.md$/, \"\") + \".md\";\n const rulePath = join(rulesDir, ruleName);\n await writeFile(rulePath, file.content, \"utf-8\");\n console.log(chalk.gray(` Imported: ${file.path} ā .lynxprompt/rules/${ruleName}`));\n importedCount++;\n }\n }\n \n if (importedCount === 0) {\n // Create starter if no files could be imported\n const starterPath = join(rulesDir, \"agents.md\");\n await writeFile(starterPath, createStarterAgentsMd(projectName), \"utf-8\");\n console.log(chalk.gray(\" Created starter: .lynxprompt/rules/agents.md\"));\n }\n } else {\n // Fresh start - create starter\n await mkdir(rulesDir, { recursive: true });\n const starterPath = join(rulesDir, \"agents.md\");\n await writeFile(starterPath, createStarterAgentsMd(projectName), \"utf-8\");\n console.log(chalk.gray(\"Created starter: .lynxprompt/rules/agents.md\"));\n }\n } else {\n // Non-interactive: import existing files\n await mkdir(rulesDir, { recursive: true });\n for (const file of existingFiles) {\n if (file.content) {\n const ruleName = file.path.replace(/^\\./, \"\").replace(/\\//g, \"-\").replace(/\\.md$/, \"\") + \".md\";\n const rulePath = join(rulesDir, ruleName);\n await writeFile(rulePath, file.content, \"utf-8\");\n }\n }\n }\n } else {\n // No existing files found\n console.log(chalk.gray(\"No existing AI configuration files found.\"));\n console.log();\n\n if (!options.yes) {\n const { create } = await prompts({\n type: \"confirm\",\n name: \"create\",\n message: \"Create a starter template?\",\n initial: true,\n });\n\n if (!create) {\n console.log(chalk.gray(\"Cancelled.\"));\n return;\n }\n }\n\n // Create rules directory and starter file\n await mkdir(rulesDir, { recursive: true });\n const starterPath = join(rulesDir, \"agents.md\");\n await writeFile(starterPath, createStarterAgentsMd(projectName), \"utf-8\");\n console.log(chalk.gray(\"Created: .lynxprompt/rules/agents.md\"));\n }\n\n // Determine which exporters to enable\n let exporters: string[] = [];\n \n if (agentDetection.detected.length > 0) {\n // Use detected agents\n exporters = agentDetection.detected.map((d) => d.agent.id);\n \n // If more than 3 detected, ask which to enable (unless --yes)\n if (agentDetection.detected.length > 3 && !options.yes) {\n const { selected } = await prompts({\n type: \"multiselect\",\n name: \"selected\",\n message: \"Select agents to enable:\",\n choices: agentDetection.detected.map((d) => ({\n title: d.agent.name,\n value: d.agent.id,\n selected: true,\n })),\n hint: \"- Space to toggle, Enter to confirm\",\n });\n \n if (selected && selected.length > 0) {\n exporters = selected;\n }\n }\n } else {\n // Default to AGENTS.md (universal format)\n exporters = [\"agents\"];\n \n // Offer to select popular agents if interactive\n if (!options.yes) {\n const popular = getPopularAgents();\n const { selected } = await prompts({\n type: \"multiselect\",\n name: \"selected\",\n message: \"Select AI agents to sync to:\",\n choices: popular.map((a) => ({\n title: `${a.name} - ${a.description}`,\n value: a.id,\n selected: a.id === \"agents\", // Default select AGENTS.md\n })),\n hint: \"- Space to toggle, Enter to confirm\",\n });\n \n if (selected && selected.length > 0) {\n exporters = selected;\n }\n }\n }\n\n console.log(chalk.gray(`Enabling ${exporters.length} exporter${exporters.length === 1 ? \"\" : \"s\"}: ${exporters.join(\", \")}`));\n\n // Create config file\n await mkdir(dirname(configPath), { recursive: true });\n await writeFile(configPath, createDefaultConfig(exporters), \"utf-8\");\n\n // Create README\n const readmePath = join(lynxpromptDir, \"README.md\");\n await writeFile(readmePath, createLynxpromptReadme(), \"utf-8\");\n\n // Create .gitignore for local state\n const gitignorePath = join(lynxpromptDir, \".gitignore\");\n const gitignoreContent = `# Local state files\n.cache/\n.backups/\n`;\n await writeFile(gitignorePath, gitignoreContent, \"utf-8\");\n\n console.log();\n console.log(chalk.green(\"ā
LynxPrompt initialized!\"));\n console.log();\n console.log(chalk.gray(\"Created:\"));\n console.log(chalk.gray(` ${LYNXPROMPT_CONFIG} - Configuration`));\n console.log(chalk.gray(` ${LYNXPROMPT_RULES}/ - Your rules (edit here)`));\n console.log();\n console.log(chalk.cyan(\"Next steps:\"));\n console.log(chalk.gray(\" 1. Edit your rules in .lynxprompt/rules/\"));\n console.log(chalk.gray(\" 2. Run 'lynxp sync' to export to your AI agents\"));\n console.log(chalk.gray(\" 3. Or run 'lynxp agents' to manage which agents to sync to\"));\n console.log();\n}\n","/**\n * Agent detection for LynxPrompt\n * Scans the project to detect which AI agents are in use\n */\n\nimport { existsSync, readdirSync, readFileSync, statSync } from \"fs\";\nimport { join } from \"path\";\nimport { AGENTS, type AgentDefinition, getAgentDisplayName } from \"./agents.js\";\n\nexport interface DetectedAgent {\n /** Agent definition */\n agent: AgentDefinition;\n /** Files/directories found */\n files: string[];\n /** Whether the files have content (not empty) */\n hasContent: boolean;\n /** Approximate rule/section count */\n ruleCount: number;\n}\n\nexport interface DetectionResult {\n /** All detected agents with their files */\n detected: DetectedAgent[];\n /** Popular agents that were detected */\n popularDetected: DetectedAgent[];\n /** Agents that could be imported (have content) */\n importable: DetectedAgent[];\n /** Summary for display */\n summary: string;\n}\n\n/**\n * Detect all AI coding agents in the project\n * @param cwd - Directory to scan (defaults to process.cwd())\n */\nexport function detectAgents(cwd: string = process.cwd()): DetectionResult {\n const detected: DetectedAgent[] = [];\n\n for (const agent of AGENTS) {\n const result = detectAgent(cwd, agent);\n if (result) {\n detected.push(result);\n }\n }\n\n const popularDetected = detected.filter((d) => d.agent.popular);\n const importable = detected.filter((d) => d.hasContent);\n\n // Build summary\n let summary: string;\n if (detected.length === 0) {\n summary = \"No AI agent configuration files detected\";\n } else if (detected.length === 1) {\n summary = `Found ${getAgentDisplayName(detected[0].agent.id)} configuration`;\n } else {\n const names = detected.slice(0, 3).map((d) => d.agent.name);\n const more = detected.length > 3 ? ` +${detected.length - 3} more` : \"\";\n summary = `Found ${detected.length} agents: ${names.join(\", \")}${more}`;\n }\n\n return { detected, popularDetected, importable, summary };\n}\n\n/**\n * Detect a single agent\n */\nfunction detectAgent(cwd: string, agent: AgentDefinition): DetectedAgent | null {\n const files: string[] = [];\n let hasContent = false;\n let ruleCount = 0;\n\n for (const pattern of agent.patterns) {\n const fullPath = join(cwd, pattern);\n\n if (!existsSync(fullPath)) {\n continue;\n }\n\n const stats = statSync(fullPath);\n\n if (stats.isDirectory()) {\n // Scan directory for rule files\n const dirFiles = scanDirectory(fullPath, agent.format);\n if (dirFiles.length > 0) {\n files.push(pattern);\n hasContent = true;\n ruleCount += dirFiles.reduce((sum, f) => sum + f.sections, 0);\n }\n } else if (stats.isFile()) {\n files.push(pattern);\n const content = safeReadFile(fullPath);\n if (content && content.trim().length > 0) {\n hasContent = true;\n ruleCount += countSections(content);\n }\n }\n }\n\n if (files.length === 0) {\n return null;\n }\n\n return { agent, files, hasContent, ruleCount };\n}\n\ninterface ScannedFile {\n path: string;\n sections: number;\n}\n\n/**\n * Scan a directory for rule files\n */\nfunction scanDirectory(dirPath: string, format: string): ScannedFile[] {\n const results: ScannedFile[] = [];\n\n try {\n const entries = readdirSync(dirPath, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isFile()) continue;\n\n // Check file extension based on format\n const name = entry.name.toLowerCase();\n const isRuleFile =\n (format === \"mdc\" && name.endsWith(\".mdc\")) ||\n (format === \"markdown\" && name.endsWith(\".md\")) ||\n (format === \"json\" && name.endsWith(\".json\")) ||\n (format === \"yaml\" && (name.endsWith(\".yml\") || name.endsWith(\".yaml\")));\n\n if (!isRuleFile) continue;\n\n const filePath = join(dirPath, entry.name);\n const content = safeReadFile(filePath);\n if (content && content.trim().length > 0) {\n results.push({\n path: filePath,\n sections: countSections(content),\n });\n }\n }\n } catch {\n // Directory not readable\n }\n\n return results;\n}\n\n/**\n * Count sections/rules in content (by counting markdown headings)\n */\nfunction countSections(content: string): number {\n const headings = content.match(/^#{1,6}\\s+.+$/gm);\n return headings ? headings.length : (content.trim().length > 0 ? 1 : 0);\n}\n\n/**\n * Safely read a file\n */\nfunction safeReadFile(path: string): string | null {\n try {\n return readFileSync(path, \"utf-8\");\n } catch {\n return null;\n }\n}\n\n/**\n * Get a simple list of detected agent names\n */\nexport function getDetectedAgentNames(cwd: string = process.cwd()): string[] {\n const result = detectAgents(cwd);\n return result.detected.map((d) => d.agent.id);\n}\n\n/**\n * Check if a specific agent is detected\n */\nexport function isAgentDetected(agentId: string, cwd: string = process.cwd()): boolean {\n const result = detectAgents(cwd);\n return result.detected.some((d) => d.agent.id === agentId);\n}\n\n/**\n * Get recommended agents based on detection\n * Returns detected agents, or popular defaults if none detected\n */\nexport function getRecommendedAgents(cwd: string = process.cwd()): AgentDefinition[] {\n const result = detectAgents(cwd);\n \n if (result.detected.length > 0) {\n return result.detected.map((d) => d.agent);\n }\n\n // Default to popular agents\n return AGENTS.filter((a) => a.popular).slice(0, 2);\n}\n\n/**\n * Format detection results for display\n */\nexport function formatDetectionResults(result: DetectionResult): string {\n if (result.detected.length === 0) {\n return \"No AI agent configuration files found.\\n\\nRun 'lynxp wizard' to create your first configuration.\";\n }\n\n const lines: string[] = [\n `Found ${result.detected.length} AI agent${result.detected.length === 1 ? \"\" : \"s\"}:`,\n \"\",\n ];\n\n for (const detected of result.detected) {\n const icon = detected.hasContent ? \"ā\" : \"ā\";\n const rules = detected.ruleCount > 0 ? ` (${detected.ruleCount} sections)` : \"\";\n lines.push(` ${icon} ${detected.agent.name}${rules}`);\n for (const file of detected.files) {\n lines.push(` āā ${file}`);\n }\n }\n\n if (result.importable.length > 0) {\n lines.push(\"\");\n lines.push(`${result.importable.length} can be imported into LynxPrompt.`);\n }\n\n return lines.join(\"\\n\");\n}\n\n\n\n","/**\n * Comprehensive agent definitions for LynxPrompt\n * Supports 40+ AI coding agents with simple, discoverable patterns\n */\n\nexport interface AgentDefinition {\n /** Unique identifier */\n id: string;\n /** Human-readable name */\n name: string;\n /** Short description */\n description: string;\n /** File/directory patterns to detect this agent */\n patterns: string[];\n /** Output file path when exporting */\n output: string;\n /** Output format type */\n format: \"markdown\" | \"mdc\" | \"json\" | \"yaml\" | \"toml\" | \"text\";\n /** Category for grouping */\n category: \"popular\" | \"markdown\" | \"config\" | \"mcp\" | \"directory\";\n /** Whether this is a commonly used agent */\n popular?: boolean;\n}\n\n/**\n * All supported AI coding agents\n * Organized by popularity and format type\n */\nexport const AGENTS: AgentDefinition[] = [\n // === POPULAR AGENTS ===\n {\n id: \"cursor\",\n name: \"Cursor\",\n description: \"AI-powered code editor with .cursor/rules/ support\",\n patterns: [\".cursor/rules/\"],\n output: \".cursor/rules/\",\n format: \"mdc\",\n category: \"popular\",\n popular: true,\n },\n {\n id: \"agents\",\n name: \"AGENTS.md\",\n description: \"Universal format for Claude Code, GitHub Copilot, Aider, and others\",\n patterns: [\"AGENTS.md\"],\n output: \"AGENTS.md\",\n format: \"markdown\",\n category: \"popular\",\n popular: true,\n },\n {\n id: \"claude\",\n name: \"Claude Code\",\n description: \"Anthropic's Claude with CLAUDE.md support\",\n patterns: [\"CLAUDE.md\"],\n output: \"CLAUDE.md\",\n format: \"markdown\",\n category: \"popular\",\n popular: true,\n },\n {\n id: \"copilot\",\n name: \"GitHub Copilot\",\n description: \"GitHub's AI pair programmer\",\n patterns: [\".github/copilot-instructions.md\"],\n output: \".github/copilot-instructions.md\",\n format: \"markdown\",\n category: \"popular\",\n popular: true,\n },\n {\n id: \"windsurf\",\n name: \"Windsurf\",\n description: \"Codeium's AI IDE with .windsurfrules support\",\n patterns: [\".windsurfrules\", \".windsurf/rules/\"],\n output: \".windsurfrules\",\n format: \"text\",\n category: \"popular\",\n popular: true,\n },\n\n // === MARKDOWN FORMAT AGENTS ===\n {\n id: \"gemini\",\n name: \"Gemini\",\n description: \"Google's Gemini AI assistant\",\n patterns: [\"GEMINI.md\"],\n output: \"GEMINI.md\",\n format: \"markdown\",\n category: \"markdown\",\n },\n {\n id: \"warp\",\n name: \"Warp AI\",\n description: \"Warp terminal's AI assistant\",\n patterns: [\"WARP.md\"],\n output: \"WARP.md\",\n format: \"markdown\",\n category: \"markdown\",\n },\n {\n id: \"zed\",\n name: \"Zed\",\n description: \"High-performance code editor with AI features\",\n patterns: [\".zed/instructions.md\", \"ZED.md\"],\n output: \".zed/instructions.md\",\n format: \"markdown\",\n category: \"markdown\",\n },\n {\n id: \"crush\",\n name: \"Crush\",\n description: \"AI coding assistant\",\n patterns: [\"CRUSH.md\"],\n output: \"CRUSH.md\",\n format: \"markdown\",\n category: \"markdown\",\n },\n {\n id: \"junie\",\n name: \"Junie\",\n description: \"JetBrains' AI coding assistant\",\n patterns: [\".junie/guidelines.md\"],\n output: \".junie/guidelines.md\",\n format: \"markdown\",\n category: \"markdown\",\n },\n {\n id: \"openhands\",\n name: \"OpenHands\",\n description: \"Open-source AI coding agent\",\n patterns: [\".openhands/microagents/repo.md\"],\n output: \".openhands/microagents/repo.md\",\n format: \"markdown\",\n category: \"markdown\",\n },\n\n // === PLAIN TEXT FORMAT ===\n {\n id: \"cline\",\n name: \"Cline\",\n description: \"VS Code AI assistant extension\",\n patterns: [\".clinerules\"],\n output: \".clinerules\",\n format: \"text\",\n category: \"config\",\n },\n {\n id: \"goose\",\n name: \"Goose\",\n description: \"Block's AI coding assistant\",\n patterns: [\".goosehints\"],\n output: \".goosehints\",\n format: \"text\",\n category: \"config\",\n },\n {\n id: \"aider\",\n name: \"Aider\",\n description: \"AI pair programming in your terminal\",\n patterns: [\".aider.conf.yml\", \"AIDER.md\"],\n output: \"AIDER.md\",\n format: \"markdown\",\n category: \"config\",\n },\n\n // === DIRECTORY-BASED AGENTS ===\n {\n id: \"amazonq\",\n name: \"Amazon Q\",\n description: \"AWS's AI coding assistant\",\n patterns: [\".amazonq/rules/\"],\n output: \".amazonq/rules/\",\n format: \"mdc\",\n category: \"directory\",\n },\n {\n id: \"augmentcode\",\n name: \"Augment Code\",\n description: \"AI code augmentation tool\",\n patterns: [\".augment/rules/\"],\n output: \".augment/rules/\",\n format: \"mdc\",\n category: \"directory\",\n },\n {\n id: \"kilocode\",\n name: \"Kilocode\",\n description: \"AI-powered code generation\",\n patterns: [\".kilocode/rules/\"],\n output: \".kilocode/rules/\",\n format: \"mdc\",\n category: \"directory\",\n },\n {\n id: \"kiro\",\n name: \"Kiro\",\n description: \"AWS's spec-driven AI coding agent\",\n patterns: [\".kiro/steering/\"],\n output: \".kiro/steering/\",\n format: \"mdc\",\n category: \"directory\",\n },\n {\n id: \"trae-ai\",\n name: \"Trae AI\",\n description: \"ByteDance's AI coding assistant\",\n patterns: [\".trae/rules/\"],\n output: \".trae/rules/\",\n format: \"mdc\",\n category: \"directory\",\n },\n {\n id: \"firebase-studio\",\n name: \"Firebase Studio\",\n description: \"Google's Firebase development environment\",\n patterns: [\".idx/\"],\n output: \".idx/\",\n format: \"mdc\",\n category: \"directory\",\n },\n {\n id: \"roocode\",\n name: \"Roo Code\",\n description: \"AI coding assistant for VS Code\",\n patterns: [\".roo/rules/\"],\n output: \".roo/rules/\",\n format: \"mdc\",\n category: \"directory\",\n },\n\n // === JSON/CONFIG FORMAT ===\n {\n id: \"firebender\",\n name: \"Firebender\",\n description: \"AI code transformation tool\",\n patterns: [\"firebender.json\"],\n output: \"firebender.json\",\n format: \"json\",\n category: \"config\",\n },\n {\n id: \"opencode\",\n name: \"Open Code\",\n description: \"Open-source AI coding tool\",\n patterns: [\"opencode.json\"],\n output: \"opencode.json\",\n format: \"json\",\n category: \"config\",\n },\n\n // === MCP (Model Context Protocol) AGENTS ===\n {\n id: \"vscode-mcp\",\n name: \"VS Code MCP\",\n description: \"VS Code with Model Context Protocol\",\n patterns: [\".vscode/mcp.json\"],\n output: \".vscode/mcp.json\",\n format: \"json\",\n category: \"mcp\",\n },\n {\n id: \"cursor-mcp\",\n name: \"Cursor MCP\",\n description: \"Cursor with Model Context Protocol\",\n patterns: [\".cursor/mcp.json\"],\n output: \".cursor/mcp.json\",\n format: \"json\",\n category: \"mcp\",\n },\n {\n id: \"root-mcp\",\n name: \"Root MCP\",\n description: \"Root-level MCP config for Claude Code, Aider\",\n patterns: [\".mcp.json\"],\n output: \".mcp.json\",\n format: \"json\",\n category: \"mcp\",\n },\n {\n id: \"windsurf-mcp\",\n name: \"Windsurf MCP\",\n description: \"Windsurf with Model Context Protocol\",\n patterns: [\".windsurf/mcp_config.json\"],\n output: \".windsurf/mcp_config.json\",\n format: \"json\",\n category: \"mcp\",\n },\n];\n\n/**\n * Get agent by ID\n */\nexport function getAgent(id: string): AgentDefinition | undefined {\n return AGENTS.find((a) => a.id === id);\n}\n\n/**\n * Get all popular agents (commonly used)\n */\nexport function getPopularAgents(): AgentDefinition[] {\n return AGENTS.filter((a) => a.popular);\n}\n\n/**\n * Get agents by category\n */\nexport function getAgentsByCategory(category: AgentDefinition[\"category\"]): AgentDefinition[] {\n return AGENTS.filter((a) => a.category === category);\n}\n\n/**\n * Get all agent IDs\n */\nexport function getAllAgentIds(): string[] {\n return AGENTS.map((a) => a.id);\n}\n\n/**\n * Get display name for an agent\n */\nexport function getAgentDisplayName(id: string): string {\n const agent = getAgent(id);\n return agent?.name ?? id;\n}\n\n\n\n\n","import { readFile, access } from \"fs/promises\";\nimport { join } from \"path\";\n\nexport interface DetectedProject {\n name: string | null;\n stack: string[];\n commands: {\n build?: string;\n test?: string;\n lint?: string;\n dev?: string;\n format?: string;\n };\n packageManager: \"npm\" | \"yarn\" | \"pnpm\" | \"bun\" | null;\n type: \"monorepo\" | \"library\" | \"application\" | \"unknown\";\n description?: string;\n}\n\n// Framework detection patterns\nconst JS_FRAMEWORK_PATTERNS: Record<string, string[]> = {\n nextjs: [\"next\"],\n react: [\"react\", \"react-dom\"],\n vue: [\"vue\"],\n angular: [\"@angular/core\"],\n svelte: [\"svelte\", \"@sveltejs/kit\"],\n solid: [\"solid-js\"],\n remix: [\"@remix-run/react\"],\n astro: [\"astro\"],\n nuxt: [\"nuxt\"],\n gatsby: [\"gatsby\"],\n};\n\nconst JS_TOOL_PATTERNS: Record<string, string[]> = {\n typescript: [\"typescript\"],\n tailwind: [\"tailwindcss\"],\n prisma: [\"prisma\", \"@prisma/client\"],\n drizzle: [\"drizzle-orm\"],\n express: [\"express\"],\n fastify: [\"fastify\"],\n hono: [\"hono\"],\n elysia: [\"elysia\"],\n trpc: [\"@trpc/server\"],\n graphql: [\"graphql\", \"@apollo/server\"],\n jest: [\"jest\"],\n vitest: [\"vitest\"],\n playwright: [\"@playwright/test\"],\n cypress: [\"cypress\"],\n eslint: [\"eslint\"],\n biome: [\"@biomejs/biome\"],\n prettier: [\"prettier\"],\n vite: [\"vite\"],\n webpack: [\"webpack\"],\n turbo: [\"turbo\"],\n};\n\nexport async function detectProject(cwd: string): Promise<DetectedProject | null> {\n const detected: DetectedProject = {\n name: null,\n stack: [],\n commands: {},\n packageManager: null,\n type: \"unknown\",\n };\n\n // Try to detect from package.json (Node.js projects)\n const packageJsonPath = join(cwd, \"package.json\");\n if (await fileExists(packageJsonPath)) {\n try {\n const content = await readFile(packageJsonPath, \"utf-8\");\n const pkg = JSON.parse(content);\n \n detected.name = pkg.name || null;\n detected.description = pkg.description;\n \n // Detect if it's a monorepo\n if (pkg.workspaces || await fileExists(join(cwd, \"pnpm-workspace.yaml\"))) {\n detected.type = \"monorepo\";\n } else if (pkg.main || pkg.exports) {\n detected.type = \"library\";\n } else {\n detected.type = \"application\";\n }\n \n // Detect stack from dependencies\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n \n // Detect frameworks\n for (const [framework, deps] of Object.entries(JS_FRAMEWORK_PATTERNS)) {\n if (deps.some(dep => allDeps[dep])) {\n detected.stack.push(framework);\n }\n }\n\n // Detect tools\n for (const [tool, deps] of Object.entries(JS_TOOL_PATTERNS)) {\n if (deps.some(dep => allDeps[dep])) {\n detected.stack.push(tool);\n }\n }\n\n // If no framework detected but has main/src, assume vanilla JS/TS\n if (detected.stack.length === 0 || (detected.stack.length === 1 && detected.stack[0] === \"typescript\")) {\n detected.stack.unshift(\"javascript\");\n }\n \n // Detect commands from scripts\n if (pkg.scripts) {\n detected.commands.build = pkg.scripts.build;\n detected.commands.test = pkg.scripts.test;\n detected.commands.lint = pkg.scripts.lint || pkg.scripts[\"lint:check\"];\n detected.commands.dev = pkg.scripts.dev || pkg.scripts.start || pkg.scripts.serve;\n detected.commands.format = pkg.scripts.format || pkg.scripts.prettier;\n }\n\n // Detect package manager from lockfiles\n if (await fileExists(join(cwd, \"pnpm-lock.yaml\"))) {\n detected.packageManager = \"pnpm\";\n } else if (await fileExists(join(cwd, \"yarn.lock\"))) {\n detected.packageManager = \"yarn\";\n } else if (await fileExists(join(cwd, \"bun.lockb\"))) {\n detected.packageManager = \"bun\";\n } else if (await fileExists(join(cwd, \"package-lock.json\"))) {\n detected.packageManager = \"npm\";\n }\n\n // Add package manager prefix to commands if detected\n if (detected.packageManager && detected.packageManager !== \"npm\") {\n const pm = detected.packageManager;\n for (const [key, value] of Object.entries(detected.commands)) {\n if (value && !value.startsWith(pm) && !value.startsWith(\"npx\")) {\n // Commands are already script names, prefix with package manager\n detected.commands[key as keyof typeof detected.commands] = `${pm} run ${value}`;\n }\n }\n } else if (detected.commands) {\n // Prefix with npm run\n for (const [key, value] of Object.entries(detected.commands)) {\n if (value && !value.startsWith(\"npm\") && !value.startsWith(\"npx\")) {\n detected.commands[key as keyof typeof detected.commands] = `npm run ${value}`;\n }\n }\n }\n\n // Fix: commands should be the actual script names for display\n if (pkg.scripts) {\n detected.commands.build = pkg.scripts.build ? \"build\" : undefined;\n detected.commands.test = pkg.scripts.test ? \"test\" : undefined;\n detected.commands.lint = pkg.scripts.lint ? \"lint\" : (pkg.scripts[\"lint:check\"] ? \"lint:check\" : undefined);\n detected.commands.dev = pkg.scripts.dev ? \"dev\" : (pkg.scripts.start ? \"start\" : (pkg.scripts.serve ? \"serve\" : undefined));\n }\n\n return detected;\n } catch {\n // Failed to parse package.json\n }\n }\n\n // Try to detect from pyproject.toml (Python projects)\n const pyprojectPath = join(cwd, \"pyproject.toml\");\n if (await fileExists(pyprojectPath)) {\n try {\n const content = await readFile(pyprojectPath, \"utf-8\");\n \n detected.stack.push(\"python\");\n detected.type = \"application\";\n \n // Extract project name (basic TOML parsing)\n const nameMatch = content.match(/name\\s*=\\s*\"([^\"]+)\"/);\n if (nameMatch) detected.name = nameMatch[1];\n \n // Detect frameworks and tools\n if (content.includes(\"fastapi\")) detected.stack.push(\"fastapi\");\n if (content.includes(\"django\")) detected.stack.push(\"django\");\n if (content.includes(\"flask\")) detected.stack.push(\"flask\");\n if (content.includes(\"pydantic\")) detected.stack.push(\"pydantic\");\n if (content.includes(\"sqlalchemy\")) detected.stack.push(\"sqlalchemy\");\n if (content.includes(\"pytest\")) detected.stack.push(\"pytest\");\n if (content.includes(\"ruff\")) detected.stack.push(\"ruff\");\n if (content.includes(\"mypy\")) detected.stack.push(\"mypy\");\n \n // Common Python commands\n detected.commands.test = \"pytest\";\n detected.commands.lint = \"ruff check .\";\n \n // Check if using poetry or uv\n if (content.includes(\"[tool.poetry]\")) {\n detected.packageManager = \"yarn\"; // Closest analogy\n detected.commands.dev = \"poetry run python -m uvicorn main:app --reload\";\n } else if (await fileExists(join(cwd, \"uv.lock\"))) {\n detected.commands.dev = \"uv run python main.py\";\n }\n \n return detected;\n } catch {\n // Failed to parse pyproject.toml\n }\n }\n\n // Try to detect from requirements.txt (Python projects)\n const requirementsPath = join(cwd, \"requirements.txt\");\n if (await fileExists(requirementsPath)) {\n try {\n const content = await readFile(requirementsPath, \"utf-8\");\n \n detected.stack.push(\"python\");\n detected.type = \"application\";\n \n if (content.toLowerCase().includes(\"fastapi\")) detected.stack.push(\"fastapi\");\n if (content.toLowerCase().includes(\"django\")) detected.stack.push(\"django\");\n if (content.toLowerCase().includes(\"flask\")) detected.stack.push(\"flask\");\n \n detected.commands.test = \"pytest\";\n detected.commands.lint = \"ruff check .\";\n \n return detected;\n } catch {\n // Failed to read requirements.txt\n }\n }\n\n // Try to detect from Cargo.toml (Rust projects)\n const cargoPath = join(cwd, \"Cargo.toml\");\n if (await fileExists(cargoPath)) {\n try {\n const content = await readFile(cargoPath, \"utf-8\");\n \n detected.stack.push(\"rust\");\n detected.type = \"application\";\n \n // Extract project name\n const nameMatch = content.match(/name\\s*=\\s*\"([^\"]+)\"/);\n if (nameMatch) detected.name = nameMatch[1];\n \n // Detect common crates\n if (content.includes(\"actix-web\")) detected.stack.push(\"actix\");\n if (content.includes(\"axum\")) detected.stack.push(\"axum\");\n if (content.includes(\"tokio\")) detected.stack.push(\"tokio\");\n if (content.includes(\"serde\")) detected.stack.push(\"serde\");\n if (content.includes(\"sqlx\")) detected.stack.push(\"sqlx\");\n \n detected.commands.build = \"cargo build\";\n detected.commands.test = \"cargo test\";\n detected.commands.lint = \"cargo clippy\";\n detected.commands.dev = \"cargo run\";\n \n return detected;\n } catch {\n // Failed to parse Cargo.toml\n }\n }\n\n // Try to detect from go.mod (Go projects)\n const goModPath = join(cwd, \"go.mod\");\n if (await fileExists(goModPath)) {\n try {\n const content = await readFile(goModPath, \"utf-8\");\n \n detected.stack.push(\"go\");\n detected.type = \"application\";\n \n // Extract module name\n const moduleMatch = content.match(/module\\s+(\\S+)/);\n if (moduleMatch) {\n const parts = moduleMatch[1].split(\"/\");\n detected.name = parts[parts.length - 1];\n }\n \n // Detect common frameworks\n if (content.includes(\"gin-gonic/gin\")) detected.stack.push(\"gin\");\n if (content.includes(\"gofiber/fiber\")) detected.stack.push(\"fiber\");\n if (content.includes(\"labstack/echo\")) detected.stack.push(\"echo\");\n if (content.includes(\"gorm.io/gorm\")) detected.stack.push(\"gorm\");\n \n detected.commands.build = \"go build\";\n detected.commands.test = \"go test ./...\";\n detected.commands.lint = \"golangci-lint run\";\n detected.commands.dev = \"go run .\";\n \n return detected;\n } catch {\n // Failed to parse go.mod\n }\n }\n\n // Try to detect from Makefile\n const makefilePath = join(cwd, \"Makefile\");\n if (await fileExists(makefilePath)) {\n try {\n const content = await readFile(makefilePath, \"utf-8\");\n \n // Extract targets\n if (content.includes(\"build:\")) detected.commands.build = \"make build\";\n if (content.includes(\"test:\")) detected.commands.test = \"make test\";\n if (content.includes(\"lint:\")) detected.commands.lint = \"make lint\";\n if (content.includes(\"dev:\")) detected.commands.dev = \"make dev\";\n if (content.includes(\"run:\")) detected.commands.dev = detected.commands.dev || \"make run\";\n \n if (Object.keys(detected.commands).length > 0) {\n detected.type = \"application\";\n return detected;\n }\n } catch {\n // Failed to read Makefile\n }\n }\n\n // Try to detect from Docker\n if (await fileExists(join(cwd, \"Dockerfile\")) || await fileExists(join(cwd, \"docker-compose.yml\"))) {\n detected.stack.push(\"docker\");\n detected.type = \"application\";\n }\n\n return detected.stack.length > 0 || detected.name ? detected : null;\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n","import chalk from \"chalk\";\nimport prompts from \"prompts\";\nimport ora from \"ora\";\nimport { writeFile, mkdir, access } from \"fs/promises\";\nimport { join, dirname } from \"path\";\nimport { detectProject } from \"../utils/detect.js\";\nimport { generateConfig, GenerateOptions } from \"../utils/generator.js\";\nimport { isAuthenticated, getUser } from \"../config.js\";\n\ninterface WizardOptions {\n name?: string;\n description?: string;\n stack?: string;\n platforms?: string;\n format?: string;\n persona?: string;\n boundaries?: string;\n preset?: string;\n yes?: boolean;\n}\n\n// User tier levels\ntype UserTier = \"free\" | \"pro\" | \"max\" | \"teams\";\n\n// Step tier requirements (matching web wizard exactly)\ntype StepTier = \"basic\" | \"intermediate\" | \"advanced\";\n\ninterface WizardStep {\n id: string;\n title: string;\n icon: string;\n tier: StepTier;\n}\n\n// All 11 wizard steps matching the web UI exactly\nconst WIZARD_STEPS: WizardStep[] = [\n { id: \"format\", title: \"Output Format\", icon: \"š¤\", tier: \"basic\" },\n { id: \"project\", title: \"Project Basics\", icon: \"āØ\", tier: \"basic\" },\n { id: \"tech\", title: \"Tech Stack\", icon: \"š»\", tier: \"basic\" },\n { id: \"repo\", title: \"Repository Setup\", icon: \"š\", tier: \"basic\" },\n { id: \"commands\", title: \"Commands\", icon: \"š\", tier: \"intermediate\" },\n { id: \"code_style\", title: \"Code Style\", icon: \"šŖ\", tier: \"intermediate\" },\n { id: \"ai\", title: \"AI Behavior\", icon: \"š§ \", tier: \"basic\" },\n { id: \"boundaries\", title: \"Boundaries\", icon: \"š”ļø\", tier: \"advanced\" },\n { id: \"testing\", title: \"Testing Strategy\", icon: \"š§Ŗ\", tier: \"advanced\" },\n { id: \"static\", title: \"Static Files\", icon: \"š\", tier: \"advanced\" },\n { id: \"extra\", title: \"Final Details\", icon: \"š¬\", tier: \"basic\" },\n];\n\n// All supported platforms (matches web wizard - 16 total)\nconst ALL_PLATFORMS = [\n { id: \"agents\", name: \"Universal (AGENTS.md)\", file: \"AGENTS.md\", icon: \"š\", note: \"Works with all AI-enabled IDEs\" },\n { id: \"cursor\", name: \"Cursor\", file: \".cursor/rules/\", icon: \"ā”\", note: \"Native project rules format\" },\n { id: \"claude\", name: \"Claude Code\", file: \"CLAUDE.md\", icon: \"š§ \", note: \"Also works with Cursor\" },\n { id: \"copilot\", name: \"GitHub Copilot\", file: \".github/copilot-instructions.md\", icon: \"š\", note: \"VS Code & JetBrains\" },\n { id: \"windsurf\", name: \"Windsurf\", file: \".windsurfrules\", icon: \"š\", note: \"Codeium IDE\" },\n { id: \"zed\", name: \"Zed\", file: \".zed/instructions.md\", icon: \"ā”\", note: \"Zed editor\" },\n { id: \"aider\", name: \"Aider\", file: \".aider.conf.yml\", icon: \"š¤\", note: \"CLI AI pair programming\" },\n { id: \"cline\", name: \"Cline\", file: \".clinerules\", icon: \"š§\", note: \"VS Code extension\" },\n { id: \"continue\", name: \"Continue\", file: \".continue/config.json\", icon: \"ā”ļø\", note: \"Open-source autopilot\" },\n { id: \"cody\", name: \"Sourcegraph Cody\", file: \".cody/config.json\", icon: \"š\", note: \"Context-aware AI\" },\n { id: \"amazonq\", name: \"Amazon Q\", file: \".amazonq/rules/\", icon: \"š¦\", note: \"AWS AI assistant\" },\n { id: \"tabnine\", name: \"Tabnine\", file: \".tabnine.yaml\", icon: \"š\", note: \"AI code completion\" },\n { id: \"supermaven\", name: \"Supermaven\", file: \".supermaven/config.json\", icon: \"š¦ø\", note: \"Fast AI completions\" },\n { id: \"codegpt\", name: \"CodeGPT\", file: \".codegpt/config.json\", icon: \"š¬\", note: \"VS Code AI assistant\" },\n { id: \"void\", name: \"Void\", file: \".void/config.json\", icon: \"š³ļø\", note: \"Open-source Cursor alt\" },\n { id: \"goose\", name: \"Goose\", file: \".goosehints\", icon: \"šŖæ\", note: \"Block AI agent\" },\n];\n\n// Quick output format selection (single choice)\nconst OUTPUT_FORMATS = [\n { title: \"š AGENTS.md (Universal)\", value: \"agents\", description: \"Works with Claude, Copilot, Aider, Devin & more\", recommended: true },\n { title: \"ā” Cursor\", value: \"cursor\", description: \".cursor/rules/ native format\" },\n { title: \"š§ Claude Code\", value: \"claude\", description: \"CLAUDE.md format\" },\n { title: \"š GitHub Copilot\", value: \"copilot\", description: \".github/copilot-instructions.md\" },\n { title: \"š Windsurf\", value: \"windsurf\", description: \".windsurfrules configuration\" },\n { title: \"š¦ Multiple platforms...\", value: \"multiple\", description: \"Select from 16+ supported AI editors\" },\n];\n\n// Languages\nconst LANGUAGES = [\n { title: \"š· TypeScript\", value: \"typescript\" },\n { title: \"š” JavaScript\", value: \"javascript\" },\n { title: \"š Python\", value: \"python\" },\n { title: \"šµ Go\", value: \"go\" },\n { title: \"š¦ Rust\", value: \"rust\" },\n { title: \"ā Java\", value: \"java\" },\n { title: \"š C#/.NET\", value: \"csharp\" },\n { title: \"š Ruby\", value: \"ruby\" },\n { title: \"š PHP\", value: \"php\" },\n { title: \"š Swift\", value: \"swift\" },\n { title: \"š¶ Kotlin\", value: \"kotlin\" },\n { title: \"⬠C/C++\", value: \"cpp\" },\n];\n\n// Frameworks\nconst FRAMEWORKS = [\n { title: \"āļø React\", value: \"react\" },\n { title: \"ā² Next.js\", value: \"nextjs\" },\n { title: \"š Vue.js\", value: \"vue\" },\n { title: \"š
°ļø Angular\", value: \"angular\" },\n { title: \"š„ Svelte\", value: \"svelte\" },\n { title: \"š Express\", value: \"express\" },\n { title: \"ā” FastAPI\", value: \"fastapi\" },\n { title: \"šø Django\", value: \"django\" },\n { title: \"š§Ŗ Flask\", value: \"flask\" },\n { title: \"š Spring\", value: \"spring\" },\n { title: \"š Rails\", value: \"rails\" },\n { title: \"š“ Laravel\", value: \"laravel\" },\n { title: \"šļø NestJS\", value: \"nestjs\" },\n { title: \"ā” Vite\", value: \"vite\" },\n { title: \"š± React Native\", value: \"react-native\" },\n];\n\n// Databases\nconst DATABASES = [\n { title: \"š PostgreSQL\", value: \"postgresql\" },\n { title: \"š¬ MySQL\", value: \"mysql\" },\n { title: \"š MongoDB\", value: \"mongodb\" },\n { title: \"š“ Redis\", value: \"redis\" },\n { title: \"š SQLite\", value: \"sqlite\" },\n { title: \"āļø Supabase\", value: \"supabase\" },\n { title: \"š„ Firebase\", value: \"firebase\" },\n { title: \"š Prisma\", value: \"prisma\" },\n];\n\n// Repository hosts\nconst REPO_HOSTS = [\n { id: \"github\", label: \"GitHub\", icon: \"š\" },\n { id: \"gitlab\", label: \"GitLab\", icon: \"š¦\" },\n { id: \"bitbucket\", label: \"Bitbucket\", icon: \"šŖ£\" },\n { id: \"gitea\", label: \"Gitea\", icon: \"šµ\" },\n { id: \"azure\", label: \"Azure DevOps\", icon: \"āļø\" },\n { id: \"other\", label: \"Other\", icon: \"š¦\" },\n];\n\n// Licenses\nconst LICENSES = [\n { id: \"mit\", label: \"MIT\" },\n { id: \"apache-2.0\", label: \"Apache 2.0\" },\n { id: \"gpl-3.0\", label: \"GPL 3.0\" },\n { id: \"lgpl-3.0\", label: \"LGPL 3.0\" },\n { id: \"agpl-3.0\", label: \"AGPL 3.0\" },\n { id: \"bsd-3\", label: \"BSD 3-Clause\" },\n { id: \"mpl-2.0\", label: \"MPL 2.0\" },\n { id: \"unlicense\", label: \"Unlicense\" },\n { id: \"none\", label: \"None / Proprietary\" },\n];\n\n// Common commands by category\nconst COMMON_COMMANDS = {\n build: [\n \"npm run build\", \"pnpm build\", \"yarn build\", \"bun run build\",\n \"next build\", \"vite build\", \"tsc\", \"tsc --noEmit\",\n \"go build\", \"cargo build\", \"cargo build --release\",\n \"mvn package\", \"gradle build\", \"dotnet build\",\n \"docker build -t app .\", \"docker compose build\",\n ],\n test: [\n \"npm test\", \"pnpm test\", \"yarn test\", \"bun test\",\n \"vitest\", \"vitest run\", \"jest\", \"jest --coverage\",\n \"pytest\", \"pytest --cov\", \"go test ./...\",\n \"cargo test\", \"mvn test\", \"gradle test\",\n \"playwright test\", \"cypress run\",\n ],\n lint: [\n \"npm run lint\", \"pnpm lint\", \"eslint .\", \"eslint . --fix\",\n \"prettier --check .\", \"prettier --write .\",\n \"ruff check\", \"ruff format\", \"black .\", \"flake8\",\n \"golangci-lint run\", \"cargo clippy\", \"rubocop\",\n ],\n dev: [\n \"npm run dev\", \"pnpm dev\", \"yarn dev\", \"bun run dev\",\n \"next dev\", \"vite\", \"vite dev\",\n \"uvicorn main:app --reload\", \"flask run\", \"rails server\",\n \"go run .\", \"cargo run\", \"dotnet run\",\n ],\n};\n\n// Naming conventions\nconst NAMING_CONVENTIONS = [\n { id: \"language_default\", label: \"Follow language conventions\", desc: \"Use idiomatic style\" },\n { id: \"camelCase\", label: \"camelCase\", desc: \"JavaScript, TypeScript, Java\" },\n { id: \"snake_case\", label: \"snake_case\", desc: \"Python, Ruby, Rust, Go\" },\n { id: \"PascalCase\", label: \"PascalCase\", desc: \"C#, .NET classes\" },\n { id: \"kebab-case\", label: \"kebab-case\", desc: \"CSS, HTML, URLs\" },\n];\n\n// Error handling patterns\nconst ERROR_PATTERNS = [\n { id: \"try_catch\", label: \"try/catch blocks\" },\n { id: \"result_types\", label: \"Result/Either types\" },\n { id: \"error_codes\", label: \"Error codes\" },\n { id: \"exceptions\", label: \"Custom exceptions\" },\n { id: \"other\", label: \"Other\" },\n];\n\n// AI Behavior rules\nconst AI_BEHAVIOR_RULES = [\n { id: \"explain_changes\", label: \"Explain changes before making them\", recommended: true },\n { id: \"preserve_style\", label: \"Preserve existing code style\", recommended: true },\n { id: \"minimal_changes\", label: \"Make minimal, focused changes\", recommended: true },\n { id: \"no_comments\", label: \"Avoid adding unnecessary comments\", recommended: false },\n { id: \"prefer_simple\", label: \"Prefer simpler solutions\", recommended: true },\n { id: \"test_first\", label: \"Write tests before implementation\", recommended: false },\n { id: \"no_console\", label: \"Remove console.log/print before committing\", recommended: false },\n { id: \"type_strict\", label: \"Be strict with types (no any/Any)\", recommended: false },\n];\n\n// Important files to read\nconst IMPORTANT_FILES = [\n { id: \"readme\", label: \"README.md\", icon: \"š\" },\n { id: \"package\", label: \"package.json / pyproject.toml\", icon: \"š¦\" },\n { id: \"tsconfig\", label: \"tsconfig.json / config files\", icon: \"āļø\" },\n { id: \"architecture\", label: \"ARCHITECTURE.md\", icon: \"šļø\" },\n { id: \"contributing\", label: \"CONTRIBUTING.md\", icon: \"š¤\" },\n];\n\n// Boundary presets\nconst BOUNDARY_PRESETS = [\n {\n title: \"š¢ Standard\",\n value: \"standard\",\n description: \"Balanced freedom & safety\",\n always: [\"Read any file\", \"Modify files in src/\", \"Run build/test/lint\", \"Create test files\"],\n askFirst: [\"Add new dependencies\", \"Modify config files\", \"Create new modules\"],\n never: [\"Delete production data\", \"Modify .env secrets\", \"Force push\"],\n },\n {\n title: \"š” Conservative\",\n value: \"conservative\",\n description: \"Ask before most changes\",\n always: [\"Read any file\", \"Run lint/format commands\"],\n askFirst: [\"Modify any file\", \"Add dependencies\", \"Create files\", \"Run tests\"],\n never: [\"Delete files\", \"Modify .env\", \"Push to git\"],\n },\n {\n title: \"š Permissive\",\n value: \"permissive\",\n description: \"AI can modify freely\",\n always: [\"Modify any file in src/\", \"Run any script\", \"Add dependencies\", \"Create files\"],\n askFirst: [\"Modify root configs\", \"Delete directories\"],\n never: [\"Modify .env\", \"Access external APIs without confirmation\"],\n },\n];\n\n// Detailed boundary options\nconst BOUNDARY_OPTIONS = [\n \"Delete files\",\n \"Create new files\",\n \"Rename/move files\",\n \"Rewrite large sections\",\n \"Refactor architecture\",\n \"Change dependencies\",\n \"Modify database schema\",\n \"Update API contracts\",\n \"Touch CI pipelines\",\n \"Modify Docker config\",\n \"Change environment vars\",\n \"Update docs automatically\",\n \"Edit README\",\n \"Handle secrets/credentials\",\n \"Modify auth logic\",\n \"Delete failing tests\",\n \"Skip tests temporarily\",\n];\n\n// Testing frameworks\nconst TEST_FRAMEWORKS = [\n \"jest\", \"vitest\", \"mocha\", \"ava\", \"tap\",\n \"pytest\", \"unittest\", \"nose2\",\n \"go test\", \"testify\",\n \"cargo test\", \"rstest\",\n \"junit\", \"testng\", \"spock\",\n \"rspec\", \"minitest\",\n \"phpunit\", \"pest\",\n \"playwright\", \"cypress\", \"puppeteer\", \"selenium\",\n];\n\n// Test levels\nconst TEST_LEVELS = [\n { id: \"smoke\", label: \"Smoke\", desc: \"Quick sanity checks\" },\n { id: \"unit\", label: \"Unit\", desc: \"Individual functions/components\" },\n { id: \"integration\", label: \"Integration\", desc: \"Component interactions\" },\n { id: \"e2e\", label: \"E2E\", desc: \"Full user flows\" },\n];\n\n// Project types\nconst PROJECT_TYPES = [\n { id: \"work\", label: \"Work\", icon: \"š¼\", description: \"Professional/enterprise project\" },\n { id: \"leisure\", label: \"Leisure\", icon: \"š®\", description: \"Personal/hobby project\" },\n { id: \"opensource\", label: \"Open Source\", icon: \"š\", description: \"Community-driven project\" },\n { id: \"learning\", label: \"Learning\", icon: \"š\", description: \"Educational/experimental\" },\n];\n\n// Check if user tier can access a step\nfunction canAccessTier(userTier: UserTier, requiredTier: StepTier): boolean {\n const tierLevels = { free: 0, pro: 1, max: 2, teams: 2 };\n const requiredLevels = { basic: 0, intermediate: 1, advanced: 2 };\n return tierLevels[userTier] >= requiredLevels[requiredTier];\n}\n\n// Get tier badge\nfunction getTierBadge(tier: StepTier): { label: string; color: typeof chalk.cyan } | null {\n switch (tier) {\n case \"intermediate\":\n return { label: \"PRO\", color: chalk.cyan };\n case \"advanced\":\n return { label: \"MAX\", color: chalk.magenta };\n default:\n return null;\n }\n}\n\n// Get available steps for user tier\nfunction getAvailableSteps(userTier: UserTier): WizardStep[] {\n return WIZARD_STEPS.filter(step => canAccessTier(userTier, step.tier));\n}\n\n// Box drawing helper\nfunction printBox(lines: string[], color: typeof chalk.cyan = chalk.gray): void {\n const maxLen = Math.max(...lines.map(l => l.replace(/\\x1b\\[[0-9;]*m/g, \"\").length));\n const top = \"ā\" + \"ā\".repeat(maxLen + 2) + \"ā\";\n const bottom = \"ā\" + \"ā\".repeat(maxLen + 2) + \"ā\";\n \n console.log(color(top));\n for (const line of lines) {\n const stripped = line.replace(/\\x1b\\[[0-9;]*m/g, \"\");\n const padding = \" \".repeat(maxLen - stripped.length);\n console.log(color(\"ā \") + line + padding + color(\" ā\"));\n }\n console.log(color(bottom));\n}\n\n// Step indicator with tier info\nfunction showStep(current: number, step: WizardStep, userTier: UserTier): void {\n const availableSteps = getAvailableSteps(userTier);\n const total = availableSteps.length;\n const progress = \"ā\".repeat(current) + \"ā\".repeat(total - current);\n const badge = getTierBadge(step.tier);\n \n console.log();\n let stepLine = chalk.cyan(` ${progress} Step ${current}/${total}: ${step.icon} ${step.title}`);\n if (badge) {\n stepLine += \" \" + badge.color(`[${badge.label}]`);\n }\n console.log(stepLine);\n console.log();\n}\n\n// Show wizard steps overview with tier indicators\nfunction showWizardOverview(userTier: UserTier): void {\n console.log(chalk.bold(\" š Wizard Steps Overview:\"));\n console.log();\n \n let stepNum = 1;\n for (const step of WIZARD_STEPS) {\n const canAccess = canAccessTier(userTier, step.tier);\n const badge = getTierBadge(step.tier);\n \n if (canAccess) {\n let line = chalk.green(` ${stepNum.toString().padStart(2)}. ā ${step.icon} ${step.title}`);\n if (badge) {\n line += \" \" + badge.color(`[${badge.label}]`);\n }\n console.log(line);\n stepNum++;\n } else {\n // Show locked steps with visual distinction\n let line = chalk.gray(` ā š ${step.icon} ${step.title}`);\n if (badge) {\n line += \" \" + badge.color.dim(`[${badge.label}]`);\n }\n console.log(line);\n }\n }\n console.log();\n}\n\n// Configure prompts to handle cancellation\nconst promptConfig = {\n onCancel: () => {\n console.log(chalk.yellow(\"\\n Cancelled. Run 'lynxp wizard' anytime to restart.\\n\"));\n process.exit(0);\n },\n};\n\nexport async function wizardCommand(options: WizardOptions): Promise<void> {\n console.log();\n console.log(chalk.cyan.bold(\" š± LynxPrompt Wizard\"));\n console.log(chalk.gray(\" Generate AI IDE configuration in seconds\"));\n console.log();\n\n // Check authentication and determine tier\n const authenticated = isAuthenticated();\n const user = getUser();\n const userPlanRaw = user?.plan?.toLowerCase() || \"free\";\n const userTier: UserTier = [\"pro\", \"max\", \"teams\"].includes(userPlanRaw) \n ? (userPlanRaw as UserTier) \n : \"free\";\n const userPlanDisplay = user?.plan?.toUpperCase() || \"FREE\";\n \n if (!authenticated) {\n // Show login notice for guests\n console.log(chalk.yellow(\"āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\"));\n console.log(chalk.yellow(\"ā\") + chalk.white(\" š” \") + chalk.gray(\"Log in for full wizard features:\") + \" \" + chalk.yellow(\"ā\"));\n console.log(chalk.yellow(\"ā\") + \" \" + chalk.yellow(\"ā\"));\n console.log(chalk.yellow(\"ā\") + chalk.gray(\" ⢠\") + chalk.white(\"Commands & Code Style\") + chalk.cyan(\" [PRO]\") + \" \" + chalk.yellow(\"ā\"));\n console.log(chalk.yellow(\"ā\") + chalk.gray(\" ⢠\") + chalk.white(\"Boundaries, Testing, Static Files\") + chalk.magenta(\" [MAX]\") + \" \" + chalk.yellow(\"ā\"));\n console.log(chalk.yellow(\"ā\") + chalk.gray(\" ⢠\") + chalk.white(\"Push configs to cloud\") + chalk.gray(\" (lynxp push)\") + \" \" + chalk.yellow(\"ā\"));\n console.log(chalk.yellow(\"ā\") + chalk.gray(\" ⢠\") + chalk.white(\"Sync across devices\") + chalk.gray(\" (lynxp sync)\") + \" \" + chalk.yellow(\"ā\"));\n console.log(chalk.yellow(\"ā\") + \" \" + chalk.yellow(\"ā\"));\n console.log(chalk.yellow(\"ā\") + chalk.cyan(\" Run: lynxp login\") + \" \" + chalk.yellow(\"ā\"));\n console.log(chalk.yellow(\"āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\"));\n console.log();\n } else {\n // Show logged-in status with plan\n const planEmoji = userTier === \"teams\" ? \"š„\" : userTier === \"max\" ? \"š\" : userTier === \"pro\" ? \"ā”\" : \"š\";\n console.log(chalk.green(` ā Logged in as ${chalk.bold(user?.name || user?.email)} ${planEmoji} ${chalk.gray(userPlanDisplay)}`));\n console.log();\n }\n\n // Show wizard steps overview\n showWizardOverview(userTier);\n \n // Count accessible steps\n const accessibleSteps = getAvailableSteps(userTier);\n const lockedSteps = WIZARD_STEPS.length - accessibleSteps.length;\n \n if (lockedSteps > 0) {\n console.log(chalk.gray(` ${lockedSteps} step${lockedSteps > 1 ? 's' : ''} locked. Upgrade at ${chalk.cyan(\"https://lynxprompt.com/pricing\")}`));\n console.log();\n }\n\n // Try to detect project info\n const detected = await detectProject(process.cwd());\n \n if (detected) {\n const detectedInfo = [\n chalk.green(\"ā Project detected\"),\n ];\n if (detected.name) detectedInfo.push(chalk.gray(` Name: ${detected.name}`));\n if (detected.stack.length > 0) detectedInfo.push(chalk.gray(` Stack: ${detected.stack.join(\", \")}`));\n if (detected.packageManager) detectedInfo.push(chalk.gray(` Package manager: ${detected.packageManager}`));\n \n printBox(detectedInfo, chalk.gray);\n console.log();\n }\n\n let config: GenerateOptions;\n\n // Non-interactive mode with --yes flag\n if (options.yes) {\n let platforms: string[];\n if (options.format) {\n platforms = options.format.split(\",\").map(f => f.trim());\n } else if (options.platforms) {\n platforms = options.platforms.split(\",\").map(p => p.trim());\n } else {\n platforms = [\"agents\"];\n }\n\n config = {\n name: options.name || detected?.name || \"my-project\",\n description: options.description || \"\",\n stack: options.stack?.split(\",\").map(s => s.trim()) || detected?.stack || [],\n platforms,\n persona: options.persona || \"fullstack\",\n boundaries: options.boundaries as \"conservative\" | \"standard\" | \"permissive\" || \"standard\",\n commands: detected?.commands || {},\n };\n } else {\n // Interactive mode\n config = await runInteractiveWizard(options, detected, userTier);\n }\n\n // Generate and write files\n const spinner = ora(\"Generating configuration...\").start();\n \n try {\n const files = generateConfig(config);\n spinner.stop();\n\n console.log();\n console.log(chalk.green.bold(\" ā
Generated:\"));\n console.log();\n \n for (const [filename, content] of Object.entries(files)) {\n const outputPath = join(process.cwd(), filename);\n \n // Check if file exists\n let exists = false;\n try {\n await access(outputPath);\n exists = true;\n } catch {\n // File doesn't exist\n }\n\n // Ask to overwrite if exists and not in --yes mode\n if (exists && !options.yes) {\n const response = await prompts({\n type: \"confirm\",\n name: \"overwrite\",\n message: `${filename} already exists. Overwrite?`,\n initial: false,\n });\n \n if (!response.overwrite) {\n console.log(chalk.yellow(` āļø Skipped: ${filename}`));\n continue;\n }\n }\n\n // Create directory if needed\n const dir = dirname(outputPath);\n if (dir !== \".\") {\n await mkdir(dir, { recursive: true });\n }\n\n await writeFile(outputPath, content, \"utf-8\");\n console.log(` ${chalk.cyan(\"ā\")} ${chalk.bold(filename)}`);\n }\n\n console.log();\n \n // Build next steps based on auth status\n const nextStepsLines = [\n chalk.gray(\"Your AI assistant will now follow these instructions.\"),\n \"\",\n chalk.gray(\"Next steps:\"),\n chalk.cyan(\" lynxp check \") + chalk.gray(\"Validate configuration\"),\n ];\n \n if (authenticated) {\n nextStepsLines.push(chalk.cyan(\" lynxp push \") + chalk.gray(\"Upload to cloud\"));\n nextStepsLines.push(chalk.cyan(\" lynxp link \") + chalk.gray(\"Link to a blueprint\"));\n nextStepsLines.push(chalk.cyan(\" lynxp sync \") + chalk.gray(\"Sync with linked blueprint\"));\n } else {\n nextStepsLines.push(chalk.gray(\" lynxp login \") + chalk.yellow(\"Log in to push & sync\"));\n }\n \n nextStepsLines.push(chalk.cyan(\" lynxp status \") + chalk.gray(\"View current setup\"));\n \n printBox(nextStepsLines, chalk.gray);\n console.log();\n \n } catch (error) {\n spinner.fail(\"Failed to generate files\");\n console.error(chalk.red(\"\\nā An error occurred while generating configuration files.\"));\n if (error instanceof Error) {\n console.error(chalk.gray(` ${error.message}`));\n }\n console.error(chalk.gray(\"\\nTry running with --yes flag for default settings.\"));\n process.exit(1);\n }\n}\n\nasync function runInteractiveWizard(\n options: WizardOptions,\n detected: Awaited<ReturnType<typeof detectProject>> | null,\n userTier: UserTier\n): Promise<GenerateOptions> {\n const answers: Record<string, unknown> = {};\n const availableSteps = getAvailableSteps(userTier);\n let currentStepNum = 0;\n\n // Helper to get current step info and increment counter\n const getCurrentStep = (stepId: string) => {\n const step = availableSteps.find(s => s.id === stepId);\n if (step) {\n currentStepNum++;\n return step;\n }\n return null;\n };\n\n // āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n // STEP 1: Output Format (basic - all users)\n // āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n const formatStep = getCurrentStep(\"format\")!;\n showStep(currentStepNum, formatStep, userTier);\n \n let platforms: string[];\n \n if (options.format) {\n platforms = options.format.split(\",\").map(f => f.trim());\n console.log(chalk.gray(` Using format from flag: ${platforms.join(\", \")}`));\n } else {\n const formatResponse = await prompts({\n type: \"select\",\n name: \"format\",\n message: chalk.white(\"Where will you use this?\"),\n choices: OUTPUT_FORMATS.map(f => ({\n title: f.recommended \n ? `${f.title} ${chalk.green.bold(\"ā
recommended\")}`\n : f.title,\n value: f.value,\n description: chalk.gray(f.description),\n })),\n initial: 0,\n hint: chalk.gray(\"āā navigate ⢠enter select\"),\n }, promptConfig);\n\n if (formatResponse.format === \"multiple\") {\n console.log();\n console.log(chalk.gray(\" Select the AI editors you want to generate config for:\"));\n console.log();\n const platformResponse = await prompts({\n type: \"multiselect\",\n name: \"platforms\",\n message: chalk.white(\"Select AI editors (16 supported):\"),\n choices: ALL_PLATFORMS.map(p => ({ \n title: `${p.icon} ${p.name}`,\n value: p.id,\n description: chalk.gray(p.note),\n })),\n hint: chalk.gray(\"space select ⢠a toggle all ⢠enter confirm\"),\n min: 1,\n instructions: false,\n }, promptConfig);\n platforms = platformResponse.platforms || [\"agents\"];\n console.log(chalk.green(` ā Selected ${platforms.length} platform${platforms.length === 1 ? \"\" : \"s\"}`));\n } else {\n platforms = [formatResponse.format || \"agents\"];\n }\n }\n answers.platforms = platforms;\n\n // āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n // STEP 2: Project Basics (basic - all users)\n // āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n const projectStep = getCurrentStep(\"project\")!;\n showStep(currentStepNum, projectStep, userTier);\n\n const nameResponse = await prompts({\n type: \"text\",\n name: \"name\",\n message: chalk.white(\"Project name:\"),\n initial: options.name || detected?.name || \"my-project\",\n hint: chalk.gray(\"Used in the generated config header\"),\n }, promptConfig);\n answers.name = nameResponse.name || \"my-project\";\n\n const descResponse = await prompts({\n type: \"text\",\n name: \"description\",\n message: chalk.white(\"Brief description:\"),\n initial: options.description || \"\",\n hint: chalk.gray(\"optional - helps AI understand context\"),\n }, promptConfig);\n answers.description = descResponse.description || \"\";\n\n // Project type\n const typeResponse = await prompts({\n type: \"select\",\n name: \"projectType\",\n message: chalk.white(\"Project type:\"),\n choices: PROJECT_TYPES.map(t => ({\n title: `${t.icon} ${t.label}`,\n value: t.id,\n description: chalk.gray(t.description),\n })),\n initial: 0,\n }, promptConfig);\n answers.projectType = typeResponse.projectType || \"work\";\n\n // āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n // STEP 3: Tech Stack (basic - all users)\n // āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n const techStep = getCurrentStep(\"tech\")!;\n showStep(currentStepNum, techStep, userTier);\n\n const allStackOptions = [...LANGUAGES, ...FRAMEWORKS, ...DATABASES];\n const detectedStackSet = new Set(detected?.stack || []);\n \n if (detectedStackSet.size > 0) {\n console.log(chalk.gray(` Auto-selected: ${detected?.stack?.join(\", \")}`));\n console.log();\n }\n\n const stackResponse = await prompts({\n type: \"multiselect\",\n name: \"stack\",\n message: chalk.white(\"Languages, frameworks & databases:\"),\n choices: allStackOptions.map(s => ({\n title: s.title,\n value: s.value,\n selected: detectedStackSet.has(s.value),\n })),\n hint: chalk.gray(\"space select ⢠a toggle all ⢠enter confirm\"),\n instructions: false,\n }, promptConfig);\n answers.stack = stackResponse.stack || [];\n\n // āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n // STEP 4: Repository Setup (basic - all users)\n // āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n const repoStep = getCurrentStep(\"repo\")!;\n showStep(currentStepNum, repoStep, userTier);\n\n const repoHostResponse = await prompts({\n type: \"select\",\n name: \"repoHost\",\n message: chalk.white(\"Repository host:\"),\n choices: REPO_HOSTS.map(h => ({\n title: `${h.icon} ${h.label}`,\n value: h.id,\n })),\n initial: 0,\n }, promptConfig);\n answers.repoHost = repoHostResponse.repoHost || \"github\";\n\n const visibilityResponse = await prompts({\n type: \"toggle\",\n name: \"isPublic\",\n message: chalk.white(\"Public repository?\"),\n initial: false,\n active: \"Yes\",\n inactive: \"No\",\n }, promptConfig);\n answers.isPublic = visibilityResponse.isPublic || false;\n\n const licenseResponse = await prompts({\n type: \"select\",\n name: \"license\",\n message: chalk.white(\"License:\"),\n choices: LICENSES.map(l => ({\n title: l.label,\n value: l.id,\n })),\n initial: 0,\n }, promptConfig);\n answers.license = licenseResponse.license || \"mit\";\n\n const conventionalResponse = await prompts({\n type: \"toggle\",\n name: \"conventionalCommits\",\n message: chalk.white(\"Use Conventional Commits?\"),\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n }, promptConfig);\n answers.conventionalCommits = conventionalResponse.conventionalCommits ?? true;\n\n // āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n // STEP 5: Commands (intermediate - Pro+)\n // āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n if (canAccessTier(userTier, \"intermediate\")) {\n const commandsStep = getCurrentStep(\"commands\")!;\n showStep(currentStepNum, commandsStep, userTier);\n\n console.log(chalk.gray(\" Select common commands for your project:\"));\n console.log();\n\n // Build commands\n const buildResponse = await prompts({\n type: \"multiselect\",\n name: \"build\",\n message: chalk.white(\"Build commands:\"),\n choices: COMMON_COMMANDS.build.slice(0, 12).map(c => ({\n title: chalk.cyan(c),\n value: c,\n selected: detected?.commands?.build === c,\n })),\n hint: chalk.gray(\"space select ⢠enter confirm\"),\n instructions: false,\n }, promptConfig);\n\n // Test commands\n const testResponse = await prompts({\n type: \"multiselect\",\n name: \"test\",\n message: chalk.white(\"Test commands:\"),\n choices: COMMON_COMMANDS.test.slice(0, 12).map(c => ({\n title: chalk.yellow(c),\n value: c,\n selected: detected?.commands?.test === c,\n })),\n hint: chalk.gray(\"space select ⢠enter confirm\"),\n instructions: false,\n }, promptConfig);\n\n // Lint commands\n const lintResponse = await prompts({\n type: \"multiselect\",\n name: \"lint\",\n message: chalk.white(\"Lint/format commands:\"),\n choices: COMMON_COMMANDS.lint.slice(0, 12).map(c => ({\n title: chalk.green(c),\n value: c,\n selected: detected?.commands?.lint === c,\n })),\n hint: chalk.gray(\"space select ⢠enter confirm\"),\n instructions: false,\n }, promptConfig);\n\n // Dev commands\n const devResponse = await prompts({\n type: \"multiselect\",\n name: \"dev\",\n message: chalk.white(\"Dev server commands:\"),\n choices: COMMON_COMMANDS.dev.slice(0, 12).map(c => ({\n title: chalk.magenta(c),\n value: c,\n selected: detected?.commands?.dev === c,\n })),\n hint: chalk.gray(\"space select ⢠enter confirm\"),\n instructions: false,\n }, promptConfig);\n\n answers.commands = {\n build: buildResponse.build || [],\n test: testResponse.test || [],\n lint: lintResponse.lint || [],\n dev: devResponse.dev || [],\n };\n\n // Custom command\n const customCmdResponse = await prompts({\n type: \"text\",\n name: \"custom\",\n message: chalk.white(\"Additional custom command (optional):\"),\n hint: chalk.gray(\"e.g., npm run migrate, make deploy\"),\n }, promptConfig);\n if (customCmdResponse.custom) {\n (answers.commands as Record<string, unknown>).custom = customCmdResponse.custom;\n }\n } else {\n answers.commands = detected?.commands || {};\n }\n\n // āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n // STEP 6: Code Style (intermediate - Pro+)\n // āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n if (canAccessTier(userTier, \"intermediate\")) {\n const styleStep = getCurrentStep(\"code_style\")!;\n showStep(currentStepNum, styleStep, userTier);\n\n const namingResponse = await prompts({\n type: \"select\",\n name: \"naming\",\n message: chalk.white(\"Naming convention:\"),\n choices: NAMING_CONVENTIONS.map(n => ({\n title: n.label,\n value: n.id,\n description: chalk.gray(n.desc),\n })),\n initial: 0,\n }, promptConfig);\n answers.namingConvention = namingResponse.naming || \"language_default\";\n\n const errorResponse = await prompts({\n type: \"select\",\n name: \"errorHandling\",\n message: chalk.white(\"Error handling pattern:\"),\n choices: ERROR_PATTERNS.map(e => ({\n title: e.label,\n value: e.id,\n })),\n initial: 0,\n }, promptConfig);\n answers.errorHandling = errorResponse.errorHandling || \"try_catch\";\n\n const styleNotesResponse = await prompts({\n type: \"text\",\n name: \"styleNotes\",\n message: chalk.white(\"Additional style notes (optional):\"),\n hint: chalk.gray(\"e.g., prefer named exports, max line length 100\"),\n }, promptConfig);\n answers.styleNotes = styleNotesResponse.styleNotes || \"\";\n }\n\n // āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n // STEP 7: AI Behavior (basic - all users)\n // āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n const aiStep = getCurrentStep(\"ai\")!;\n showStep(currentStepNum, aiStep, userTier);\n\n const aiBehaviorResponse = await prompts({\n type: \"multiselect\",\n name: \"aiBehavior\",\n message: chalk.white(\"AI behavior rules:\"),\n choices: AI_BEHAVIOR_RULES.map(r => ({\n title: r.recommended \n ? `${r.label} ${chalk.green(\"ā
\")}`\n : r.label,\n value: r.id,\n selected: r.recommended,\n })),\n hint: chalk.gray(\"space select ⢠enter confirm\"),\n instructions: false,\n }, promptConfig);\n answers.aiBehavior = aiBehaviorResponse.aiBehavior || [];\n\n const importantFilesResponse = await prompts({\n type: \"multiselect\",\n name: \"importantFiles\",\n message: chalk.white(\"Important files AI should read:\"),\n choices: IMPORTANT_FILES.map(f => ({\n title: `${f.icon} ${f.label}`,\n value: f.id,\n selected: f.id === \"readme\" || f.id === \"package\",\n })),\n hint: chalk.gray(\"space select ⢠enter confirm\"),\n instructions: false,\n }, promptConfig);\n answers.importantFiles = importantFilesResponse.importantFiles || [];\n\n const selfImproveResponse = await prompts({\n type: \"toggle\",\n name: \"selfImprove\",\n message: chalk.white(\"Enable self-improving blueprint?\"),\n initial: false,\n active: \"Yes\",\n inactive: \"No\",\n }, promptConfig);\n answers.selfImprove = selfImproveResponse.selfImprove || false;\n\n // āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n // STEP 8: Boundaries (advanced - Max+)\n // āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n if (canAccessTier(userTier, \"advanced\")) {\n const boundariesStep = getCurrentStep(\"boundaries\")!;\n showStep(currentStepNum, boundariesStep, userTier);\n\n const presetResponse = await prompts({\n type: \"select\",\n name: \"boundaryPreset\",\n message: chalk.white(\"Boundary preset:\"),\n choices: BOUNDARY_PRESETS.map(b => ({\n title: b.title,\n value: b.value,\n description: chalk.gray(b.description),\n })),\n initial: 0,\n }, promptConfig);\n answers.boundaries = presetResponse.boundaryPreset || \"standard\";\n\n const selectedPreset = BOUNDARY_PRESETS.find(b => b.value === answers.boundaries);\n if (selectedPreset) {\n console.log();\n console.log(chalk.gray(\" Preset details:\"));\n console.log(chalk.green(` ā Always: ${selectedPreset.always.slice(0, 3).join(\", \")}`));\n console.log(chalk.yellow(` ? Ask: ${selectedPreset.askFirst.slice(0, 2).join(\", \")}`));\n console.log(chalk.red(` ā Never: ${selectedPreset.never.slice(0, 2).join(\", \")}`));\n }\n\n // Customize boundaries?\n const customizeResponse = await prompts({\n type: \"toggle\",\n name: \"customize\",\n message: chalk.white(\"Customize specific boundaries?\"),\n initial: false,\n active: \"Yes\",\n inactive: \"No\",\n }, promptConfig);\n\n if (customizeResponse.customize) {\n console.log();\n console.log(chalk.gray(\" Select actions AI should NEVER do:\"));\n const neverResponse = await prompts({\n type: \"multiselect\",\n name: \"never\",\n message: chalk.white(\"Never allow:\"),\n choices: BOUNDARY_OPTIONS.map(o => ({\n title: chalk.red(o),\n value: o,\n selected: selectedPreset?.never.includes(o),\n })),\n instructions: false,\n }, promptConfig);\n answers.boundaryNever = neverResponse.never || [];\n\n console.log(chalk.gray(\" Select actions AI should ASK before doing:\"));\n const askResponse = await prompts({\n type: \"multiselect\",\n name: \"ask\",\n message: chalk.white(\"Ask first:\"),\n choices: BOUNDARY_OPTIONS\n .filter(o => !(answers.boundaryNever as string[])?.includes(o))\n .map(o => ({\n title: chalk.yellow(o),\n value: o,\n selected: selectedPreset?.askFirst.includes(o),\n })),\n instructions: false,\n }, promptConfig);\n answers.boundaryAsk = askResponse.ask || [];\n }\n } else {\n answers.boundaries = options.boundaries || \"standard\";\n }\n\n // āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n // STEP 9: Testing Strategy (advanced - Max+)\n // āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n if (canAccessTier(userTier, \"advanced\")) {\n const testingStep = getCurrentStep(\"testing\")!;\n showStep(currentStepNum, testingStep, userTier);\n\n const testLevelsResponse = await prompts({\n type: \"multiselect\",\n name: \"testLevels\",\n message: chalk.white(\"Test levels:\"),\n choices: TEST_LEVELS.map(l => ({\n title: `${l.label} - ${chalk.gray(l.desc)}`,\n value: l.id,\n selected: l.id === \"unit\" || l.id === \"integration\",\n })),\n instructions: false,\n }, promptConfig);\n answers.testLevels = testLevelsResponse.testLevels || [];\n\n // Detect test framework from stack\n const detectedFrameworks = (answers.stack as string[])?.includes(\"typescript\") || \n (answers.stack as string[])?.includes(\"javascript\")\n ? [\"jest\", \"vitest\"]\n : (answers.stack as string[])?.includes(\"python\")\n ? [\"pytest\"]\n : [];\n\n const testFrameworkResponse = await prompts({\n type: \"multiselect\",\n name: \"testFrameworks\",\n message: chalk.white(\"Testing frameworks:\"),\n choices: TEST_FRAMEWORKS.slice(0, 16).map(f => ({\n title: f,\n value: f,\n selected: detectedFrameworks.includes(f),\n })),\n hint: chalk.gray(\"space select ⢠enter confirm\"),\n instructions: false,\n }, promptConfig);\n answers.testFrameworks = testFrameworkResponse.testFrameworks || [];\n\n const coverageResponse = await prompts({\n type: \"number\",\n name: \"coverage\",\n message: chalk.white(\"Target code coverage (%):\"),\n initial: 80,\n min: 0,\n max: 100,\n }, promptConfig);\n answers.coverageTarget = coverageResponse.coverage ?? 80;\n\n const testNotesResponse = await prompts({\n type: \"text\",\n name: \"testNotes\",\n message: chalk.white(\"Testing notes (optional):\"),\n hint: chalk.gray(\"e.g., run e2e on main only, use msw for mocking\"),\n }, promptConfig);\n answers.testNotes = testNotesResponse.testNotes || \"\";\n }\n\n // āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n // STEP 10: Static Files (advanced - Max+)\n // āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n if (canAccessTier(userTier, \"advanced\")) {\n const staticStep = getCurrentStep(\"static\")!;\n showStep(currentStepNum, staticStep, userTier);\n\n console.log(chalk.gray(\" Generate additional project files:\"));\n console.log();\n\n const staticFilesResponse = await prompts({\n type: \"multiselect\",\n name: \"staticFiles\",\n message: chalk.white(\"Include static files:\"),\n choices: [\n { title: \"š .editorconfig\", value: \"editorconfig\", description: chalk.gray(\"Consistent code formatting\") },\n { title: \"š¤ CONTRIBUTING.md\", value: \"contributing\", description: chalk.gray(\"Contributor guidelines\") },\n { title: \"š CODE_OF_CONDUCT.md\", value: \"codeOfConduct\", description: chalk.gray(\"Community standards\") },\n { title: \"š SECURITY.md\", value: \"security\", description: chalk.gray(\"Vulnerability reporting\") },\n { title: \"šŗļø ROADMAP.md\", value: \"roadmap\", description: chalk.gray(\"Project roadmap\") },\n { title: \"š .gitignore\", value: \"gitignore\", description: chalk.gray(\"Git ignore patterns\"), selected: true },\n ],\n hint: chalk.gray(\"space select ⢠enter confirm\"),\n instructions: false,\n }, promptConfig);\n answers.staticFiles = staticFilesResponse.staticFiles || [];\n\n // If GitHub + public, offer FUNDING.yml\n if (answers.repoHost === \"github\" && answers.isPublic) {\n const fundingResponse = await prompts({\n type: \"toggle\",\n name: \"funding\",\n message: chalk.white(\"Generate FUNDING.yml for GitHub Sponsors?\"),\n initial: false,\n active: \"Yes\",\n inactive: \"No\",\n }, promptConfig);\n answers.includeFunding = fundingResponse.funding || false;\n }\n }\n\n // āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n // STEP 11: Final Details / Extra (basic - all users)\n // āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n const extraStep = getCurrentStep(\"extra\")!;\n showStep(currentStepNum, extraStep, userTier);\n\n // AI persona\n const personaResponse = await prompts({\n type: \"select\",\n name: \"persona\",\n message: chalk.white(\"AI assistant persona:\"),\n choices: [\n { title: \"š§āš» Full-Stack Developer\", value: \"fullstack\", description: chalk.gray(\"Complete application development\") },\n { title: \"āļø Backend Developer\", value: \"backend\", description: chalk.gray(\"APIs, databases, services\") },\n { title: \"šØ Frontend Developer\", value: \"frontend\", description: chalk.gray(\"UI, components, styling\") },\n { title: \"š DevOps Engineer\", value: \"devops\", description: chalk.gray(\"Infrastructure, CI/CD\") },\n { title: \"š Data Engineer\", value: \"data\", description: chalk.gray(\"Pipelines, ETL, analytics\") },\n { title: \"š Security Engineer\", value: \"security\", description: chalk.gray(\"Secure code, auditing\") },\n { title: \"āļø Custom...\", value: \"custom\", description: chalk.gray(\"Define your own\") },\n ],\n initial: 0,\n }, promptConfig);\n \n if (personaResponse.persona === \"custom\") {\n const customPersona = await prompts({\n type: \"text\",\n name: \"value\",\n message: chalk.white(\"Describe the custom persona:\"),\n hint: chalk.gray(\"e.g., 'ML engineer focused on PyTorch'\"),\n }, promptConfig);\n answers.persona = customPersona.value || \"fullstack\";\n } else {\n answers.persona = personaResponse.persona || \"fullstack\";\n }\n\n // Anything else\n const extraNotesResponse = await prompts({\n type: \"text\",\n name: \"extraNotes\",\n message: chalk.white(\"Anything else AI should know? (optional):\"),\n hint: chalk.gray(\"Special requirements, gotchas, team conventions...\"),\n }, promptConfig);\n answers.extraNotes = extraNotesResponse.extraNotes || \"\";\n\n // āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n // BUILD FINAL CONFIG\n // āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n console.log();\n console.log(chalk.green(\" ā
All steps completed!\"));\n console.log();\n\n return {\n name: answers.name as string,\n description: answers.description as string,\n stack: answers.stack as string[],\n platforms: answers.platforms as string[],\n persona: answers.persona as string,\n boundaries: answers.boundaries as \"conservative\" | \"standard\" | \"permissive\",\n commands: typeof answers.commands === \"object\" ? answers.commands as Record<string, string> : (detected?.commands || {}),\n // Extended config for Pro/Max users\n projectType: answers.projectType as string,\n repoHost: answers.repoHost as string,\n isPublic: answers.isPublic as boolean,\n license: answers.license as string,\n conventionalCommits: answers.conventionalCommits as boolean,\n namingConvention: answers.namingConvention as string,\n errorHandling: answers.errorHandling as string,\n styleNotes: answers.styleNotes as string,\n aiBehavior: answers.aiBehavior as string[],\n importantFiles: answers.importantFiles as string[],\n selfImprove: answers.selfImprove as boolean,\n boundaryNever: answers.boundaryNever as string[],\n boundaryAsk: answers.boundaryAsk as string[],\n testLevels: answers.testLevels as string[],\n testFrameworks: answers.testFrameworks as string[],\n coverageTarget: answers.coverageTarget as number,\n testNotes: answers.testNotes as string,\n staticFiles: answers.staticFiles as string[],\n includeFunding: answers.includeFunding as boolean,\n extraNotes: answers.extraNotes as string,\n };\n}\n","export interface GenerateOptions {\n name: string;\n description: string;\n stack: string[];\n platforms: string[];\n persona: string;\n boundaries: \"conservative\" | \"standard\" | \"permissive\";\n commands: Record<string, string | string[]>;\n // Extended options for Pro/Max users\n projectType?: string;\n repoHost?: string;\n isPublic?: boolean;\n license?: string;\n conventionalCommits?: boolean;\n namingConvention?: string;\n errorHandling?: string;\n styleNotes?: string;\n aiBehavior?: string[];\n importantFiles?: string[];\n selfImprove?: boolean;\n boundaryNever?: string[];\n boundaryAsk?: string[];\n testLevels?: string[];\n testFrameworks?: string[];\n coverageTarget?: number;\n testNotes?: string;\n staticFiles?: string[];\n includeFunding?: boolean;\n extraNotes?: string;\n}\n\n// Platform to filename mapping (all 16 platforms)\nconst PLATFORM_FILES: Record<string, string> = {\n agents: \"AGENTS.md\",\n cursor: \".cursor/rules/project.mdc\",\n claude: \"CLAUDE.md\",\n copilot: \".github/copilot-instructions.md\",\n windsurf: \".windsurfrules\",\n zed: \".zed/instructions.md\",\n aider: \".aider.conf.yml\",\n cline: \".clinerules\",\n continue: \".continue/rules.md\",\n cody: \".cody/rules.md\",\n amazonq: \".amazonq/rules/project.md\",\n tabnine: \".tabnine.yaml\",\n supermaven: \".supermaven/rules.md\",\n codegpt: \".codegpt/rules.md\",\n void: \".void/rules.md\",\n goose: \".goosehints\",\n};\n\n// Persona descriptions\nconst PERSONA_DESCRIPTIONS: Record<string, string> = {\n backend: \"a senior backend developer specializing in APIs, databases, and microservices architecture\",\n frontend: \"a senior frontend developer specializing in UI components, styling, and user experience\",\n fullstack: \"a senior full-stack developer capable of working across the entire application stack\",\n devops: \"a DevOps engineer specializing in infrastructure, CI/CD pipelines, and containerization\",\n data: \"a data engineer specializing in data pipelines, ETL processes, and database optimization\",\n security: \"a security engineer focused on secure coding practices and vulnerability prevention\",\n};\n\n// Stack display names\nconst STACK_NAMES: Record<string, string> = {\n typescript: \"TypeScript\",\n javascript: \"JavaScript\",\n python: \"Python\",\n go: \"Go\",\n rust: \"Rust\",\n java: \"Java\",\n csharp: \"C#/.NET\",\n ruby: \"Ruby\",\n php: \"PHP\",\n swift: \"Swift\",\n kotlin: \"Kotlin\",\n cpp: \"C/C++\",\n react: \"React\",\n nextjs: \"Next.js\",\n vue: \"Vue.js\",\n angular: \"Angular\",\n svelte: \"Svelte\",\n express: \"Express.js\",\n fastapi: \"FastAPI\",\n django: \"Django\",\n flask: \"Flask\",\n spring: \"Spring Boot\",\n rails: \"Ruby on Rails\",\n laravel: \"Laravel\",\n nestjs: \"NestJS\",\n vite: \"Vite\",\n \"react-native\": \"React Native\",\n postgresql: \"PostgreSQL\",\n mysql: \"MySQL\",\n mongodb: \"MongoDB\",\n redis: \"Redis\",\n sqlite: \"SQLite\",\n supabase: \"Supabase\",\n firebase: \"Firebase\",\n prisma: \"Prisma\",\n tailwind: \"Tailwind CSS\",\n fastify: \"Fastify\",\n};\n\n// Naming convention descriptions\nconst NAMING_DESCRIPTIONS: Record<string, string> = {\n language_default: \"follow idiomatic conventions for the primary language\",\n camelCase: \"use camelCase for variables and functions\",\n snake_case: \"use snake_case for variables and functions\",\n PascalCase: \"use PascalCase for classes and types\",\n \"kebab-case\": \"use kebab-case for file names and CSS classes\",\n};\n\n// AI behavior rule descriptions\nconst AI_BEHAVIOR_DESCRIPTIONS: Record<string, string> = {\n explain_changes: \"Always explain what changes you're making and why before implementing them\",\n preserve_style: \"Preserve and follow the existing code style in the project\",\n minimal_changes: \"Make minimal, focused changes - avoid unnecessary refactoring\",\n no_comments: \"Avoid adding unnecessary comments; code should be self-documenting\",\n prefer_simple: \"Prefer simpler solutions over clever ones\",\n test_first: \"Write tests before implementing new functionality (TDD)\",\n no_console: \"Remove console.log/print statements before committing\",\n type_strict: \"Be strict with types - avoid any/Any/Object types\",\n};\n\n// Important files descriptions\nconst IMPORTANT_FILES_PATHS: Record<string, string> = {\n readme: \"README.md\",\n package: \"package.json or pyproject.toml\",\n tsconfig: \"tsconfig.json or similar config\",\n architecture: \"ARCHITECTURE.md\",\n contributing: \"CONTRIBUTING.md\",\n};\n\n// Boundary presets\nconst BOUNDARIES: Record<string, { always: string[]; askFirst: string[]; never: string[] }> = {\n conservative: {\n always: [\"Read any file in the project\", \"Run lint and format commands\"],\n askFirst: [\n \"Modify any source file\",\n \"Add new dependencies\",\n \"Create new files\",\n \"Run test commands\",\n \"Modify configuration files\",\n ],\n never: [\n \"Delete any files\",\n \"Modify .env or secret files\",\n \"Push to git or make commits\",\n \"Access external APIs or services\",\n ],\n },\n standard: {\n always: [\n \"Read any file in the project\",\n \"Modify files in src/ or lib/\",\n \"Run build, test, and lint commands\",\n \"Create test files\",\n \"Fix linting errors automatically\",\n ],\n askFirst: [\n \"Add new dependencies to package.json\",\n \"Modify configuration files at root level\",\n \"Create new modules or directories\",\n \"Refactor code structure significantly\",\n ],\n never: [\n \"Modify .env files or secrets\",\n \"Delete critical files without backup\",\n \"Force push to git\",\n \"Expose sensitive information in logs\",\n ],\n },\n permissive: {\n always: [\n \"Modify any file in src/ or lib/\",\n \"Run any build, test, or dev scripts\",\n \"Add or update dependencies\",\n \"Create new files and directories\",\n \"Refactor and reorganize code\",\n ],\n askFirst: [\n \"Modify root-level configuration files\",\n \"Delete directories\",\n \"Make breaking changes to public APIs\",\n ],\n never: [\n \"Modify .env files directly\",\n \"Commit secrets or credentials\",\n \"Access production databases\",\n ],\n },\n};\n\n// Test level descriptions\nconst TEST_LEVEL_DESCRIPTIONS: Record<string, string> = {\n smoke: \"Quick sanity checks for critical paths\",\n unit: \"Unit tests for individual functions and components\",\n integration: \"Integration tests for component interactions\",\n e2e: \"End-to-end tests for full user flows\",\n};\n\nexport function generateConfig(options: GenerateOptions): Record<string, string> {\n const files: Record<string, string> = {};\n\n for (const platform of options.platforms) {\n const filename = PLATFORM_FILES[platform];\n if (filename) {\n files[filename] = generateFileContent(options, platform);\n }\n }\n\n return files;\n}\n\nfunction generateFileContent(options: GenerateOptions, platform: string): string {\n const sections: string[] = [];\n const isMdc = platform === \"cursor\";\n const isYaml = platform === \"aider\" || platform === \"tabnine\";\n const isPlainText = platform === \"windsurf\" || platform === \"cline\" || platform === \"goose\";\n const isMarkdown = !isMdc && !isYaml && !isPlainText;\n \n // Handle YAML formats\n if (isYaml) {\n return generateYamlConfig(options, platform);\n }\n \n // MDC frontmatter for Cursor\n if (isMdc) {\n sections.push(\"---\");\n sections.push(`description: \"${options.name} - AI coding rules\"`);\n sections.push('globs: [\"**/*\"]');\n sections.push(\"alwaysApply: true\");\n sections.push(\"---\");\n sections.push(\"\");\n sections.push(`# ${options.name} - AI Assistant Configuration`);\n sections.push(\"\");\n }\n \n // Header for regular markdown\n if (isMarkdown) {\n sections.push(`# ${options.name} - AI Assistant Configuration`);\n sections.push(\"\");\n }\n\n // Project type context\n if (options.projectType) {\n const typeContexts: Record<string, string> = {\n work: \"This is a professional/enterprise project. Follow strict procedures and maintain high code quality.\",\n leisure: \"This is a personal/hobby project. Feel free to be more experimental and creative.\",\n opensource: \"This is an open-source project. Consider community guidelines and contribution standards.\",\n learning: \"This is an educational project. Explain concepts and be patient with learning-focused approaches.\",\n };\n if (typeContexts[options.projectType]) {\n if (isMarkdown || isMdc) {\n sections.push(`> **Project Context:** ${typeContexts[options.projectType]}`);\n sections.push(\"\");\n } else {\n sections.push(`Project Context: ${typeContexts[options.projectType]}`);\n sections.push(\"\");\n }\n }\n }\n\n // Persona section\n const personaDesc = PERSONA_DESCRIPTIONS[options.persona] || options.persona;\n if (isMarkdown || isMdc) {\n sections.push(\"## Persona\");\n sections.push(\"\");\n sections.push(`You are ${personaDesc}. You assist developers working on ${options.name}.`);\n } else {\n sections.push(`You are ${personaDesc}. You assist developers working on ${options.name}.`);\n }\n \n if (options.description) {\n sections.push(\"\");\n sections.push(`Project description: ${options.description}`);\n }\n sections.push(\"\");\n\n // Tech Stack section\n if (options.stack.length > 0) {\n if (isMarkdown || isMdc) {\n sections.push(\"## Tech Stack\");\n sections.push(\"\");\n } else {\n sections.push(\"Tech Stack:\");\n }\n \n const stackList = options.stack.map(s => STACK_NAMES[s] || s);\n if (isMarkdown || isMdc) {\n for (const tech of stackList) {\n sections.push(`- ${tech}`);\n }\n } else {\n sections.push(stackList.join(\", \"));\n }\n sections.push(\"\");\n }\n\n // Repository info\n if (options.repoHost || options.license || options.conventionalCommits) {\n if (isMarkdown || isMdc) {\n sections.push(\"## Repository\");\n sections.push(\"\");\n if (options.repoHost) {\n sections.push(`- **Host:** ${options.repoHost.charAt(0).toUpperCase() + options.repoHost.slice(1)}`);\n }\n if (options.license && options.license !== \"none\") {\n sections.push(`- **License:** ${options.license.toUpperCase()}`);\n }\n if (options.conventionalCommits) {\n sections.push(\"- **Commits:** Follow [Conventional Commits](https://conventionalcommits.org) format\");\n }\n sections.push(\"\");\n }\n }\n\n // Commands section\n const hasCommands = options.commands && Object.values(options.commands).some(v => \n Array.isArray(v) ? v.length > 0 : Boolean(v)\n );\n if (hasCommands) {\n if (isMarkdown || isMdc) {\n sections.push(\"## Commands\");\n sections.push(\"\");\n sections.push(\"Use these commands for common tasks:\");\n sections.push(\"\");\n sections.push(\"```bash\");\n } else {\n sections.push(\"Commands:\");\n }\n \n const cmdCategories = [\"build\", \"test\", \"lint\", \"dev\", \"custom\"];\n for (const cat of cmdCategories) {\n const cmd = options.commands[cat];\n if (cmd) {\n const cmds = Array.isArray(cmd) ? cmd : [cmd];\n for (const c of cmds) {\n if (c) {\n const label = cat.charAt(0).toUpperCase() + cat.slice(1);\n sections.push((isMarkdown || isMdc) ? `# ${label}: ${c}` : `- ${label}: ${c}`);\n }\n }\n }\n }\n \n if (isMarkdown || isMdc) {\n sections.push(\"```\");\n }\n sections.push(\"\");\n }\n\n // AI Behavior section\n if (options.aiBehavior && options.aiBehavior.length > 0) {\n if (isMarkdown || isMdc) {\n sections.push(\"## AI Behavior Rules\");\n sections.push(\"\");\n for (const rule of options.aiBehavior) {\n const desc = AI_BEHAVIOR_DESCRIPTIONS[rule];\n if (desc) {\n sections.push(`- ${desc}`);\n }\n }\n sections.push(\"\");\n }\n }\n\n // Important files\n if (options.importantFiles && options.importantFiles.length > 0) {\n if (isMarkdown || isMdc) {\n sections.push(\"## Important Files to Read\");\n sections.push(\"\");\n sections.push(\"Always read these files first to understand the project context:\");\n sections.push(\"\");\n for (const file of options.importantFiles) {\n const path = IMPORTANT_FILES_PATHS[file];\n if (path) {\n sections.push(`- \\`${path}\\``);\n }\n }\n sections.push(\"\");\n }\n }\n\n // Self-improving blueprint\n if (options.selfImprove) {\n if (isMarkdown || isMdc) {\n sections.push(\"## Self-Improving Blueprint\");\n sections.push(\"\");\n sections.push(\"> **Auto-update enabled:** As you work on this project, track patterns and update this configuration file to better reflect the project's conventions and preferences.\");\n sections.push(\"\");\n }\n }\n\n // Boundaries section\n let boundaries = BOUNDARIES[options.boundaries];\n \n // Apply custom boundaries if provided\n if (options.boundaryNever?.length || options.boundaryAsk?.length) {\n boundaries = {\n ...boundaries,\n never: options.boundaryNever?.length ? options.boundaryNever : boundaries.never,\n askFirst: options.boundaryAsk?.length ? options.boundaryAsk : boundaries.askFirst,\n };\n }\n \n if (boundaries) {\n if (isMarkdown || isMdc) {\n sections.push(\"## Boundaries\");\n sections.push(\"\");\n \n sections.push(\"### ā
Always (do without asking)\");\n sections.push(\"\");\n for (const item of boundaries.always) {\n sections.push(`- ${item}`);\n }\n sections.push(\"\");\n \n sections.push(\"### ā ļø Ask First\");\n sections.push(\"\");\n for (const item of boundaries.askFirst) {\n sections.push(`- ${item}`);\n }\n sections.push(\"\");\n \n sections.push(\"### š« Never\");\n sections.push(\"\");\n for (const item of boundaries.never) {\n sections.push(`- ${item}`);\n }\n } else {\n sections.push(\"Boundaries:\");\n sections.push(\"\");\n sections.push(\"ALWAYS (do without asking):\");\n for (const item of boundaries.always) {\n sections.push(`- ${item}`);\n }\n sections.push(\"\");\n sections.push(\"ASK FIRST:\");\n for (const item of boundaries.askFirst) {\n sections.push(`- ${item}`);\n }\n sections.push(\"\");\n sections.push(\"NEVER:\");\n for (const item of boundaries.never) {\n sections.push(`- ${item}`);\n }\n }\n sections.push(\"\");\n }\n\n // Code Style section\n if (isMarkdown || isMdc) {\n sections.push(\"## Code Style\");\n sections.push(\"\");\n \n // Naming convention\n if (options.namingConvention) {\n const namingDesc = NAMING_DESCRIPTIONS[options.namingConvention];\n if (namingDesc) {\n sections.push(`- **Naming:** ${namingDesc}`);\n }\n }\n \n // Error handling\n if (options.errorHandling) {\n const errorStyles: Record<string, string> = {\n try_catch: \"Use try/catch blocks for error handling\",\n result_types: \"Use Result/Either types for error handling\",\n error_codes: \"Use error codes with proper documentation\",\n exceptions: \"Use custom exception classes\",\n };\n if (errorStyles[options.errorHandling]) {\n sections.push(`- **Errors:** ${errorStyles[options.errorHandling]}`);\n }\n }\n \n // Style notes\n if (options.styleNotes) {\n sections.push(`- **Notes:** ${options.styleNotes}`);\n }\n \n sections.push(\"\");\n sections.push(\"Follow these conventions:\");\n sections.push(\"\");\n \n if (options.stack.includes(\"typescript\") || options.stack.includes(\"javascript\")) {\n sections.push(\"- Use TypeScript strict mode when available\");\n sections.push(\"- Prefer const over let, avoid var\");\n sections.push(\"- Use async/await over raw promises\");\n sections.push(\"- Use descriptive variable and function names\");\n }\n \n if (options.stack.includes(\"react\") || options.stack.includes(\"nextjs\")) {\n sections.push(\"- Use functional components with hooks\");\n sections.push(\"- Keep components small and focused\");\n sections.push(\"- Colocate related files (component, styles, tests)\");\n }\n \n if (options.stack.includes(\"python\")) {\n sections.push(\"- Follow PEP 8 style guidelines\");\n sections.push(\"- Use type hints for function signatures\");\n sections.push(\"- Prefer f-strings for string formatting\");\n }\n \n if (options.stack.includes(\"go\")) {\n sections.push(\"- Follow Go conventions (gofmt, golint)\");\n sections.push(\"- Use meaningful package names\");\n sections.push(\"- Handle errors explicitly\");\n }\n \n if (options.stack.includes(\"rust\")) {\n sections.push(\"- Follow Rust conventions (clippy)\");\n sections.push(\"- Use idiomatic Rust patterns\");\n sections.push(\"- Prefer Result over panic\");\n }\n\n // Generic guidelines\n sections.push(\"- Write self-documenting code\");\n sections.push(\"- Add comments for complex logic only\");\n sections.push(\"- Keep functions focused and testable\");\n sections.push(\"\");\n }\n\n // Testing Strategy section\n if (options.testLevels?.length || options.testFrameworks?.length || options.coverageTarget) {\n if (isMarkdown || isMdc) {\n sections.push(\"## Testing Strategy\");\n sections.push(\"\");\n \n if (options.testLevels?.length) {\n sections.push(\"### Test Levels\");\n sections.push(\"\");\n for (const level of options.testLevels) {\n const desc = TEST_LEVEL_DESCRIPTIONS[level];\n if (desc) {\n sections.push(`- **${level.charAt(0).toUpperCase() + level.slice(1)}:** ${desc}`);\n }\n }\n sections.push(\"\");\n }\n \n if (options.testFrameworks?.length) {\n sections.push(\"### Frameworks\");\n sections.push(\"\");\n sections.push(`Use: ${options.testFrameworks.join(\", \")}`);\n sections.push(\"\");\n }\n \n if (options.coverageTarget) {\n sections.push(`### Coverage Target: ${options.coverageTarget}%`);\n sections.push(\"\");\n }\n \n if (options.testNotes) {\n sections.push(`**Notes:** ${options.testNotes}`);\n sections.push(\"\");\n }\n }\n }\n\n // Extra notes\n if (options.extraNotes) {\n if (isMarkdown || isMdc) {\n sections.push(\"## Additional Notes\");\n sections.push(\"\");\n sections.push(options.extraNotes);\n sections.push(\"\");\n } else {\n sections.push(\"Additional Notes:\");\n sections.push(options.extraNotes);\n sections.push(\"\");\n }\n }\n\n // Footer\n if (isMarkdown || isMdc) {\n sections.push(\"---\");\n sections.push(\"\");\n sections.push(`*Generated by [LynxPrompt](https://lynxprompt.com) CLI*`);\n }\n\n return sections.join(\"\\n\");\n}\n\nfunction generateYamlConfig(options: GenerateOptions, platform: string): string {\n const lines: string[] = [];\n \n if (platform === \"aider\") {\n lines.push(\"# Aider configuration\");\n lines.push(`# Project: ${options.name}`);\n lines.push(\"\");\n lines.push(\"# Model settings\");\n lines.push(\"model: gpt-4\");\n lines.push(\"\");\n lines.push(\"# Code style\");\n if (options.stack.includes(\"typescript\") || options.stack.includes(\"javascript\")) {\n lines.push(\"auto-lint: true\");\n }\n lines.push(\"\");\n lines.push(\"# Custom instructions\");\n lines.push(\"read:\");\n lines.push(\" - README.md\");\n if (options.importantFiles?.includes(\"architecture\")) {\n lines.push(\" - ARCHITECTURE.md\");\n }\n } else if (platform === \"tabnine\") {\n lines.push(\"# Tabnine configuration\");\n lines.push(`# Project: ${options.name}`);\n lines.push(\"\");\n lines.push(\"version: 1.0.0\");\n lines.push(\"\");\n lines.push(\"project:\");\n lines.push(` name: ${options.name}`);\n if (options.description) {\n lines.push(` description: \"${options.description}\"`);\n }\n lines.push(\"\");\n lines.push(\"context:\");\n lines.push(\" include:\");\n lines.push(' - \"**/*.ts\"');\n lines.push(' - \"**/*.js\"');\n lines.push(' - \"**/*.py\"');\n }\n \n lines.push(\"\");\n lines.push(`# Generated by LynxPrompt CLI`);\n \n return lines.join(\"\\n\");\n}\n","import chalk from \"chalk\";\nimport ora from \"ora\";\nimport { api, ApiRequestError, SearchResult } from \"../api.js\";\n\ninterface SearchOptions {\n limit: string;\n}\n\nexport async function searchCommand(\n query: string,\n options: SearchOptions\n): Promise<void> {\n const spinner = ora(`Searching for \"${query}\"...`).start();\n\n try {\n const limit = parseInt(options.limit, 10) || 20;\n const { templates, total, hasMore } = await api.searchBlueprints(query, limit);\n spinner.stop();\n\n if (templates.length === 0) {\n console.log();\n console.log(chalk.yellow(`No blueprints found for \"${query}\".`));\n console.log(chalk.gray(\"Try different keywords or browse at https://lynxprompt.com/blueprints\"));\n return;\n }\n\n console.log();\n console.log(chalk.cyan(`š Search Results for \"${query}\" (${total} found)`));\n console.log();\n\n for (const result of templates) {\n printSearchResult(result);\n }\n\n if (hasMore) {\n console.log(chalk.gray(`Showing ${templates.length} of ${total}. Use --limit to see more.`));\n }\n\n console.log();\n console.log(chalk.gray(\"Use 'lynxprompt pull <id>' to download a blueprint.\"));\n } catch (error) {\n spinner.fail(\"Search failed\");\n handleApiError(error);\n }\n}\n\nfunction printSearchResult(result: SearchResult): void {\n const priceInfo = result.price ? chalk.yellow(`ā¬${(result.price / 100).toFixed(2)}`) : chalk.green(\"Free\");\n const officialBadge = result.isOfficial ? chalk.magenta(\" ā
Official\") : \"\";\n \n console.log(` ${chalk.bold(result.name)}${officialBadge}`);\n console.log(` ${chalk.cyan(result.id)} ⢠${priceInfo}`);\n if (result.description) {\n console.log(` ${chalk.gray(truncate(result.description, 60))}`);\n }\n console.log(` ${chalk.gray(`by ${result.author}`)} ⢠${chalk.gray(`ā${result.downloads}`)} ${chalk.gray(`ā„${result.likes}`)}`);\n if (result.tags && result.tags.length > 0) {\n console.log(` ${formatTags(result.tags)}`);\n }\n console.log();\n}\n\nfunction formatTags(tags: string[]): string {\n return tags.slice(0, 4).map((t) => chalk.gray(`#${t}`)).join(\" \");\n}\n\nfunction truncate(str: string, maxLength: number): string {\n if (str.length <= maxLength) return str;\n return str.slice(0, maxLength - 3) + \"...\";\n}\n\nfunction handleApiError(error: unknown): void {\n if (error instanceof ApiRequestError) {\n console.error(chalk.red(`Error: ${error.message}`));\n } else {\n console.error(chalk.red(\"An unexpected error occurred.\"));\n }\n process.exit(1);\n}\n\n\n","import chalk from \"chalk\";\nimport { readFile, readdir, access } from \"fs/promises\";\nimport { join } from \"path\";\nimport { existsSync } from \"fs\";\nimport { checkSyncStatus } from \"../utils/blueprint-tracker.js\";\n\n// AI config files to look for\nconst CONFIG_FILES = [\n { path: \"AGENTS.md\", name: \"AGENTS.md\", platform: \"Claude Code, Cursor, AI Agents\" },\n { path: \"CLAUDE.md\", name: \"CLAUDE.md\", platform: \"Claude Code\" },\n { path: \".github/copilot-instructions.md\", name: \"Copilot Instructions\", platform: \"GitHub Copilot\" },\n { path: \".windsurfrules\", name: \".windsurfrules\", platform: \"Windsurf\" },\n { path: \".zed/instructions.md\", name: \"Zed Instructions\", platform: \"Zed\" },\n { path: \".clinerules\", name: \".clinerules\", platform: \"Cline\" },\n { path: \".goosehints\", name: \".goosehints\", platform: \"Goose\" },\n { path: \"AIDER.md\", name: \"AIDER.md\", platform: \"Aider\" },\n];\n\n// Directory-based configs\nconst CONFIG_DIRS = [\n { path: \".cursor/rules\", name: \".cursor/rules/\", platform: \"Cursor\" },\n { path: \".amazonq/rules\", name: \".amazonq/rules/\", platform: \"Amazon Q\" },\n { path: \".augment/rules\", name: \".augment/rules/\", platform: \"Augment Code\" },\n];\n\nexport async function statusCommand(): Promise<void> {\n const cwd = process.cwd();\n \n console.log();\n console.log(chalk.cyan(\"š± LynxPrompt Status\"));\n console.log(chalk.gray(` Directory: ${cwd}`));\n console.log();\n\n // Check for .lynxprompt folder\n const lynxpromptExists = existsSync(join(cwd, \".lynxprompt\"));\n if (lynxpromptExists) {\n console.log(chalk.green(\"ā LynxPrompt initialized\"));\n \n // Show config summary\n const configPath = join(cwd, \".lynxprompt/conf.yml\");\n if (existsSync(configPath)) {\n try {\n const content = await readFile(configPath, \"utf-8\");\n const { parse } = await import(\"yaml\");\n const config = parse(content);\n if (config?.exporters?.length > 0) {\n console.log(chalk.gray(` Exporters: ${config.exporters.join(\", \")}`));\n }\n } catch {\n // Ignore parse errors\n }\n }\n console.log();\n }\n\n // Show tracked blueprints\n const trackedStatus = await checkSyncStatus(cwd);\n if (trackedStatus.length > 0) {\n console.log(chalk.cyan(\"š¦ Tracked Blueprints\"));\n console.log();\n \n for (const { blueprint, localModified, fileExists } of trackedStatus) {\n const statusIcon = !fileExists\n ? chalk.red(\"ā\")\n : localModified\n ? chalk.yellow(\"ā\")\n : chalk.green(\"ā\");\n \n const sourceLabel = {\n marketplace: chalk.gray(\"[marketplace]\"),\n team: chalk.blue(\"[team]\"),\n private: chalk.green(\"[private]\"),\n local: chalk.gray(\"[local]\"),\n }[blueprint.source];\n\n console.log(` ${statusIcon} ${chalk.bold(blueprint.file)} ${sourceLabel}`);\n console.log(` ${chalk.gray(`ID: ${blueprint.id} ⢠${blueprint.name}`)}`);\n \n if (!fileExists) {\n console.log(chalk.red(` ā File missing - run 'lynxp pull ${blueprint.id}' to restore`));\n } else if (localModified) {\n if (blueprint.source === \"marketplace\") {\n console.log(chalk.yellow(` ā Local changes (marketplace = read-only, won't sync back)`));\n } else {\n console.log(chalk.yellow(` ā Local changes - run 'lynxp push ${blueprint.file}' to sync`));\n }\n }\n console.log();\n }\n }\n\n // Show AI config files\n console.log(chalk.cyan(\"š AI Config Files\"));\n console.log();\n\n let foundAny = false;\n\n // Check single files\n for (const config of CONFIG_FILES) {\n const filePath = join(cwd, config.path);\n try {\n await access(filePath);\n const content = await readFile(filePath, \"utf-8\");\n const lines = content.split(\"\\n\").length;\n const size = formatBytes(content.length);\n\n foundAny = true;\n \n // Check if this file is tracked\n const tracked = trackedStatus.find(t => t.blueprint.file === config.path);\n const trackedLabel = tracked ? chalk.cyan(\" (tracked)\") : \"\";\n \n console.log(` ${chalk.green(\"ā\")} ${chalk.bold(config.name)}${trackedLabel}`);\n console.log(` ${chalk.gray(`Platform: ${config.platform}`)}`);\n console.log(` ${chalk.gray(`Size: ${size} (${lines} lines)`)}`);\n \n // Show first non-empty, non-comment line as preview\n const preview = getPreview(content);\n if (preview) {\n console.log(` ${chalk.gray(`Preview: ${preview}`)}`);\n }\n console.log();\n } catch {\n // File doesn't exist, skip\n }\n }\n\n // Check directories\n for (const config of CONFIG_DIRS) {\n const dirPath = join(cwd, config.path);\n if (existsSync(dirPath)) {\n try {\n const files = await readdir(dirPath);\n const ruleFiles = files.filter(f => f.endsWith(\".md\") || f.endsWith(\".mdc\"));\n \n if (ruleFiles.length > 0) {\n foundAny = true;\n console.log(` ${chalk.green(\"ā\")} ${chalk.bold(config.name)}`);\n console.log(` ${chalk.gray(`Platform: ${config.platform}`)}`);\n console.log(` ${chalk.gray(`Rules: ${ruleFiles.length} file${ruleFiles.length === 1 ? \"\" : \"s\"}`)}`);\n \n // List rule files\n for (const file of ruleFiles.slice(0, 3)) {\n console.log(` ${chalk.gray(` ⢠${file}`)}`);\n }\n if (ruleFiles.length > 3) {\n console.log(` ${chalk.gray(` ... and ${ruleFiles.length - 3} more`)}`);\n }\n console.log();\n }\n } catch {\n // Can't read directory\n }\n }\n }\n\n if (!foundAny) {\n console.log(chalk.yellow(\" No AI configuration files found.\"));\n console.log();\n console.log(chalk.gray(\" Get started:\"));\n console.log(chalk.gray(\" lynxp wizard Generate a configuration\"));\n console.log(chalk.gray(\" lynxp pull <id> Download from marketplace\"));\n console.log(chalk.gray(\" lynxp search <query> Search for blueprints\"));\n } else {\n console.log(chalk.gray(\"Commands:\"));\n console.log(chalk.gray(\" lynxp wizard Regenerate configuration\"));\n console.log(chalk.gray(\" lynxp check Validate files\"));\n console.log(chalk.gray(\" lynxp link --list Show tracked blueprints\"));\n }\n console.log();\n}\n\nfunction getPreview(content: string): string | null {\n const lines = content.split(\"\\n\");\n for (const line of lines) {\n const trimmed = line.trim();\n if (\n trimmed &&\n !trimmed.startsWith(\"#\") &&\n !trimmed.startsWith(\"//\") &&\n !trimmed.startsWith(\"<!--\") &&\n !trimmed.startsWith(\"---\") &&\n !trimmed.startsWith(\">\")\n ) {\n return truncate(trimmed, 50);\n }\n }\n return null;\n}\n\nfunction truncate(str: string, maxLength: number): string {\n if (str.length <= maxLength) return str;\n return str.slice(0, maxLength - 3) + \"...\";\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n","/**\n * Sync command - export rules to all configured agents\n * \n * This is the core of LynxPrompt CLI: one command to sync your rules\n * to all AI coding agents you use.\n * \n * Usage:\n * lynxp sync - Sync rules to configured agents\n * lynxp sync --dry-run - Preview changes without writing\n * lynxp sync --force - Skip prompts (for CI)\n */\n\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport prompts from \"prompts\";\nimport { readFile, writeFile, mkdir, readdir } from \"fs/promises\";\nimport { join, dirname } from \"path\";\nimport { existsSync } from \"fs\";\nimport * as yaml from \"yaml\";\nimport { getAgent, type AgentDefinition } from \"../utils/agents.js\";\n\ninterface SyncOptions {\n dryRun?: boolean;\n force?: boolean;\n}\n\ninterface LynxPromptConfig {\n version: string;\n exporters: string[];\n sources: Array<{\n type: string;\n path: string;\n }>;\n}\n\ninterface SyncResult {\n written: string[];\n skipped: string[];\n errors: string[];\n}\n\n// Paths\nconst CONFIG_FILE = \".lynxprompt/conf.yml\";\nconst RULES_DIR = \".lynxprompt/rules\";\n\nexport async function syncCommand(options: SyncOptions = {}): Promise<void> {\n console.log();\n console.log(chalk.cyan(\"š± LynxPrompt Sync\"));\n console.log();\n\n const cwd = process.cwd();\n\n // Check if initialized\n const configPath = join(cwd, CONFIG_FILE);\n if (!existsSync(configPath)) {\n console.log(chalk.yellow(\"LynxPrompt is not initialized in this project.\"));\n console.log();\n console.log(chalk.gray(\"Run 'lynxp init' first to set up LynxPrompt.\"));\n return;\n }\n\n // Load config\n const spinner = ora(\"Loading configuration...\").start();\n let config: LynxPromptConfig;\n \n try {\n const configContent = await readFile(configPath, \"utf-8\");\n config = yaml.parse(configContent) as LynxPromptConfig;\n spinner.succeed(\"Configuration loaded\");\n } catch (error) {\n spinner.fail(\"Failed to load configuration\");\n console.log(chalk.red(\"Could not parse .lynxprompt/conf.yml\"));\n return;\n }\n\n // Check exporters\n if (!config.exporters || config.exporters.length === 0) {\n console.log(chalk.yellow(\"No exporters configured.\"));\n console.log();\n console.log(chalk.gray(\"Add exporters to .lynxprompt/conf.yml or run 'lynxp agents enable <agent>'\"));\n return;\n }\n\n // Validate exporters\n const validExporters: AgentDefinition[] = [];\n const invalidExporters: string[] = [];\n\n for (const exporterId of config.exporters) {\n const agent = getAgent(exporterId);\n if (agent) {\n validExporters.push(agent);\n } else {\n invalidExporters.push(exporterId);\n }\n }\n\n if (invalidExporters.length > 0) {\n console.log(chalk.yellow(`Unknown exporters: ${invalidExporters.join(\", \")}`));\n }\n\n if (validExporters.length === 0) {\n console.log(chalk.red(\"No valid exporters configured.\"));\n return;\n }\n\n console.log(chalk.gray(`Exporters: ${validExporters.map((e) => e.name).join(\", \")}`));\n console.log();\n\n // Load rules\n const rulesPath = join(cwd, RULES_DIR);\n if (!existsSync(rulesPath)) {\n console.log(chalk.yellow(\"No rules found.\"));\n console.log(chalk.gray(`Create rules in ${RULES_DIR}/ to sync them.`));\n return;\n }\n\n const rulesContent = await loadRules(rulesPath);\n if (!rulesContent) {\n console.log(chalk.yellow(\"No rule files found in .lynxprompt/rules/\"));\n return;\n }\n\n console.log(chalk.gray(`Loaded ${rulesContent.fileCount} rule file${rulesContent.fileCount === 1 ? \"\" : \"s\"}`));\n console.log();\n\n // Dry run mode\n if (options.dryRun) {\n console.log(chalk.cyan(\"Dry run - no files will be written\"));\n console.log();\n console.log(\"Would write:\");\n for (const exporter of validExporters) {\n console.log(chalk.gray(` ${exporter.output}`));\n }\n console.log();\n return;\n }\n\n // Confirm if not forced\n if (!options.force) {\n const { confirm } = await prompts({\n type: \"confirm\",\n name: \"confirm\",\n message: `Sync to ${validExporters.length} agent${validExporters.length === 1 ? \"\" : \"s\"}?`,\n initial: true,\n });\n\n if (!confirm) {\n console.log(chalk.gray(\"Cancelled.\"));\n return;\n }\n }\n\n // Sync to each exporter\n const result: SyncResult = { written: [], skipped: [], errors: [] };\n const syncSpinner = ora(\"Syncing rules...\").start();\n\n for (const exporter of validExporters) {\n try {\n await syncToAgent(cwd, exporter, rulesContent.combined);\n result.written.push(exporter.output);\n } catch (error) {\n result.errors.push(`${exporter.id}: ${error instanceof Error ? error.message : \"Unknown error\"}`);\n }\n }\n\n syncSpinner.stop();\n\n // Show results\n if (result.written.length > 0) {\n console.log(chalk.green(`ā Synced to ${result.written.length} agent${result.written.length === 1 ? \"\" : \"s\"}:`));\n for (const file of result.written) {\n console.log(chalk.gray(` ${file}`));\n }\n }\n\n if (result.errors.length > 0) {\n console.log();\n console.log(chalk.red(\"Errors:\"));\n for (const error of result.errors) {\n console.log(chalk.red(` ${error}`));\n }\n }\n\n console.log();\n}\n\ninterface RulesContent {\n combined: string;\n files: Array<{ name: string; content: string }>;\n fileCount: number;\n}\n\n/**\n * Load and combine all rules from the rules directory\n */\nasync function loadRules(rulesPath: string): Promise<RulesContent | null> {\n const files: Array<{ name: string; content: string }> = [];\n\n try {\n const entries = await readdir(rulesPath, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isFile()) continue;\n if (!entry.name.endsWith(\".md\")) continue;\n\n const filePath = join(rulesPath, entry.name);\n const content = await readFile(filePath, \"utf-8\");\n \n if (content.trim()) {\n files.push({ name: entry.name, content: content.trim() });\n }\n }\n } catch {\n return null;\n }\n\n if (files.length === 0) {\n return null;\n }\n\n // Combine all rules with separators\n const combined = files\n .map((f) => f.content)\n .join(\"\\n\\n---\\n\\n\");\n\n return { combined, files, fileCount: files.length };\n}\n\n/**\n * Sync rules to a specific agent\n */\nasync function syncToAgent(\n cwd: string,\n agent: AgentDefinition,\n content: string\n): Promise<void> {\n const outputPath = join(cwd, agent.output);\n\n // Handle directory-based agents\n if (agent.output.endsWith(\"/\")) {\n await syncToDirectory(cwd, agent, content);\n return;\n }\n\n // Handle file-based agents\n const formatted = formatForAgent(agent, content);\n \n // Ensure directory exists\n const dir = dirname(outputPath);\n if (dir !== \".\") {\n await mkdir(dir, { recursive: true });\n }\n\n await writeFile(outputPath, formatted, \"utf-8\");\n}\n\n/**\n * Sync to a directory-based agent (like Cursor's .cursor/rules/)\n */\nasync function syncToDirectory(\n cwd: string,\n agent: AgentDefinition,\n content: string\n): Promise<void> {\n const outputDir = join(cwd, agent.output);\n await mkdir(outputDir, { recursive: true });\n\n // For directory-based agents, write a single combined file\n const extension = agent.format === \"mdc\" ? \".mdc\" : \".md\";\n const filename = `lynxprompt-rules${extension}`;\n const outputPath = join(outputDir, filename);\n\n const formatted = formatForAgent(agent, content);\n await writeFile(outputPath, formatted, \"utf-8\");\n}\n\n/**\n * Format content for a specific agent's format\n */\nfunction formatForAgent(agent: AgentDefinition, content: string): string {\n switch (agent.format) {\n case \"mdc\":\n return formatAsMdc(content, agent);\n case \"markdown\":\n return formatAsMarkdown(content, agent);\n case \"json\":\n return formatAsJson(content, agent);\n case \"text\":\n return content;\n default:\n return content;\n }\n}\n\n/**\n * Format as MDC (Cursor's format with YAML frontmatter)\n */\nfunction formatAsMdc(content: string, _agent: AgentDefinition): string {\n const frontmatter = yaml.stringify({\n description: \"LynxPrompt rules - AI coding guidelines\",\n globs: [\"**/*\"],\n alwaysApply: true,\n });\n\n return `---\\n${frontmatter}---\\n\\n${content}`;\n}\n\n/**\n * Format as Markdown with header\n */\nfunction formatAsMarkdown(content: string, _agent: AgentDefinition): string {\n const header = `# AI Coding Rules\\n\\n> Generated by [LynxPrompt](https://lynxprompt.com)\\n\\n`;\n return header + content;\n}\n\n/**\n * Format as JSON (for config-based agents)\n */\nfunction formatAsJson(content: string, _agent: AgentDefinition): string {\n return JSON.stringify(\n {\n $schema: \"https://lynxprompt.com/schemas/rules.json\",\n version: \"1.0\",\n rules: content,\n meta: {\n generator: \"lynxprompt\",\n url: \"https://lynxprompt.com\",\n },\n },\n null,\n 2\n );\n}\n\n\n\n","/**\n * Agents command - manage which AI agents to sync to\n * \n * Simple, intuitive agent management:\n * lynxp agents - List all agents and their status\n * lynxp agents enable X - Enable an agent\n * lynxp agents disable X - Disable an agent\n * lynxp agents detect - Auto-detect agents in project\n */\n\nimport chalk from \"chalk\";\nimport prompts from \"prompts\";\nimport { readFile, writeFile } from \"fs/promises\";\nimport { join } from \"path\";\nimport { existsSync } from \"fs\";\nimport * as yaml from \"yaml\";\nimport { \n AGENTS, \n getAgent, \n getPopularAgents \n} from \"../utils/agents.js\";\nimport { detectAgents, formatDetectionResults } from \"../utils/agent-detector.js\";\n\ninterface AgentsOptions {\n interactive?: boolean;\n}\n\n// Config paths\nconst CONFIG_FILE = \".lynxprompt/conf.yml\";\n\ninterface LynxPromptConfig {\n version: string;\n exporters: string[];\n sources: Array<{\n type: string;\n path: string;\n }>;\n}\n\nexport async function agentsCommand(\n action?: string,\n agentId?: string,\n options: AgentsOptions = {}\n): Promise<void> {\n console.log();\n\n switch (action) {\n case \"enable\":\n await enableAgent(agentId, options);\n break;\n case \"disable\":\n await disableAgent(agentId);\n break;\n case \"detect\":\n await detectAgentsInProject();\n break;\n case \"list\":\n default:\n await listAgents();\n break;\n }\n}\n\n/**\n * List all agents with their status\n */\nasync function listAgents(): Promise<void> {\n console.log(chalk.cyan(\"š± LynxPrompt Agents\"));\n console.log();\n\n const config = await loadConfig();\n const enabledSet = new Set(config?.exporters ?? []);\n const detection = detectAgents();\n\n // Show enabled agents first\n if (enabledSet.size > 0) {\n console.log(chalk.green(\"Enabled:\"));\n for (const id of enabledSet) {\n const agent = getAgent(id);\n const detected = detection.detected.find((d) => d.agent.id === id);\n const status = detected ? chalk.gray(\"(detected)\") : \"\";\n console.log(` ${chalk.green(\"ā\")} ${agent?.name ?? id} ${status}`);\n }\n console.log();\n }\n\n // Show detected but not enabled\n const detectedNotEnabled = detection.detected.filter(\n (d) => !enabledSet.has(d.agent.id)\n );\n if (detectedNotEnabled.length > 0) {\n console.log(chalk.yellow(\"Detected (not enabled):\"));\n for (const detected of detectedNotEnabled) {\n const rules = detected.ruleCount > 0 ? chalk.gray(` (${detected.ruleCount} rules)`) : \"\";\n console.log(` ${chalk.yellow(\"ā\")} ${detected.agent.name}${rules}`);\n }\n console.log();\n }\n\n // Show popular available\n const popular = getPopularAgents().filter(\n (a) => !enabledSet.has(a.id) && !detectedNotEnabled.some((d) => d.agent.id === a.id)\n );\n if (popular.length > 0) {\n console.log(chalk.gray(\"Popular (available):\"));\n for (const agent of popular) {\n console.log(` ${chalk.gray(\"-\")} ${agent.name} - ${agent.description}`);\n }\n console.log();\n }\n\n // Summary and help\n console.log(chalk.gray(`Total: ${AGENTS.length} agents supported`));\n console.log();\n console.log(chalk.gray(\"Commands:\"));\n console.log(chalk.gray(\" lynxp agents enable <agent> Enable an agent\"));\n console.log(chalk.gray(\" lynxp agents disable <agent> Disable an agent\"));\n console.log(chalk.gray(\" lynxp agents detect Auto-detect agents\"));\n console.log();\n}\n\n/**\n * Enable an agent\n */\nasync function enableAgent(agentId?: string, options: AgentsOptions = {}): Promise<void> {\n const cwd = process.cwd();\n const configPath = join(cwd, CONFIG_FILE);\n\n if (!existsSync(configPath)) {\n console.log(chalk.yellow(\"LynxPrompt not initialized. Run 'lynxp init' first.\"));\n return;\n }\n\n let config = await loadConfig();\n if (!config) {\n console.log(chalk.red(\"Could not load configuration.\"));\n return;\n }\n\n // Interactive mode - select from all agents\n if (!agentId || options.interactive) {\n const enabledSet = new Set(config.exporters ?? []);\n \n const choices = AGENTS.map((agent) => ({\n title: `${agent.name} - ${agent.description}`,\n value: agent.id,\n selected: enabledSet.has(agent.id),\n }));\n\n const { selected } = await prompts({\n type: \"multiselect\",\n name: \"selected\",\n message: \"Select agents to enable:\",\n choices,\n hint: \"- Space to select, Enter to confirm\",\n });\n\n if (!selected || selected.length === 0) {\n console.log(chalk.yellow(\"No agents selected.\"));\n return;\n }\n\n config.exporters = selected;\n await saveConfig(config);\n \n console.log(chalk.green(`ā Enabled ${selected.length} agent${selected.length === 1 ? \"\" : \"s\"}`));\n console.log();\n console.log(chalk.gray(\"Run 'lynxp sync' to sync your rules.\"));\n return;\n }\n\n // Enable specific agent\n const agent = getAgent(agentId);\n if (!agent) {\n // Fuzzy search for similar names\n const similar = AGENTS.filter((a) => \n a.id.includes(agentId.toLowerCase()) || \n a.name.toLowerCase().includes(agentId.toLowerCase())\n );\n \n console.log(chalk.red(`Unknown agent: ${agentId}`));\n if (similar.length > 0) {\n console.log();\n console.log(chalk.gray(\"Did you mean:\"));\n for (const a of similar.slice(0, 5)) {\n console.log(chalk.gray(` ${a.id} - ${a.name}`));\n }\n }\n return;\n }\n\n if (!config.exporters) {\n config.exporters = [];\n }\n\n if (config.exporters.includes(agent.id)) {\n console.log(chalk.yellow(`${agent.name} is already enabled.`));\n return;\n }\n\n config.exporters.push(agent.id);\n await saveConfig(config);\n\n console.log(chalk.green(`ā Enabled ${agent.name}`));\n console.log();\n console.log(chalk.gray(`Output: ${agent.output}`));\n console.log(chalk.gray(\"Run 'lynxp sync' to sync your rules.\"));\n}\n\n/**\n * Disable an agent\n */\nasync function disableAgent(agentId?: string): Promise<void> {\n if (!agentId) {\n console.log(chalk.yellow(\"Usage: lynxp agents disable <agent>\"));\n return;\n }\n\n const cwd = process.cwd();\n const configPath = join(cwd, CONFIG_FILE);\n\n if (!existsSync(configPath)) {\n console.log(chalk.yellow(\"LynxPrompt not initialized. Run 'lynxp init' first.\"));\n return;\n }\n\n const config = await loadConfig();\n if (!config) {\n console.log(chalk.red(\"Could not load configuration.\"));\n return;\n }\n\n if (!config.exporters || !config.exporters.includes(agentId)) {\n const agent = getAgent(agentId);\n console.log(chalk.yellow(`${agent?.name ?? agentId} is not enabled.`));\n return;\n }\n\n // Prevent disabling last agent\n if (config.exporters.length === 1) {\n console.log(chalk.yellow(\"Cannot disable the last agent. At least one must be enabled.\"));\n return;\n }\n\n config.exporters = config.exporters.filter((e) => e !== agentId);\n await saveConfig(config);\n\n const agent = getAgent(agentId);\n console.log(chalk.green(`ā Disabled ${agent?.name ?? agentId}`));\n}\n\n/**\n * Auto-detect agents in project\n */\nasync function detectAgentsInProject(): Promise<void> {\n console.log(chalk.cyan(\"š Detecting AI agents...\"));\n console.log();\n\n const detection = detectAgents();\n console.log(formatDetectionResults(detection));\n console.log();\n\n if (detection.detected.length === 0) {\n return;\n }\n\n // Offer to enable detected agents\n const config = await loadConfig();\n const enabledSet = new Set(config?.exporters ?? []);\n const newAgents = detection.detected.filter((d) => !enabledSet.has(d.agent.id));\n\n if (newAgents.length === 0) {\n console.log(chalk.gray(\"All detected agents are already enabled.\"));\n return;\n }\n\n const { enable } = await prompts({\n type: \"confirm\",\n name: \"enable\",\n message: `Enable ${newAgents.length} detected agent${newAgents.length === 1 ? \"\" : \"s\"}?`,\n initial: true,\n });\n\n if (enable && config) {\n config.exporters = [\n ...(config.exporters ?? []),\n ...newAgents.map((d) => d.agent.id),\n ];\n await saveConfig(config);\n console.log(chalk.green(`ā Enabled ${newAgents.length} agent${newAgents.length === 1 ? \"\" : \"s\"}`));\n }\n}\n\n/**\n * Load config file\n */\nasync function loadConfig(): Promise<LynxPromptConfig | null> {\n const cwd = process.cwd();\n const configPath = join(cwd, CONFIG_FILE);\n\n if (!existsSync(configPath)) {\n return null;\n }\n\n try {\n const content = await readFile(configPath, \"utf-8\");\n return yaml.parse(content) as LynxPromptConfig;\n } catch {\n return null;\n }\n}\n\n/**\n * Save config file\n */\nasync function saveConfig(config: LynxPromptConfig): Promise<void> {\n const cwd = process.cwd();\n const configPath = join(cwd, CONFIG_FILE);\n \n const content = yaml.stringify(config);\n await writeFile(configPath, content, \"utf-8\");\n}\n\n\n\n","/**\n * Check command - validate AI configuration files\n * \n * Validates configuration files for CI/CD pipelines and pre-commit hooks.\n * \n * Usage:\n * lynxp check - Interactive validation with detailed output\n * lynxp check --ci - CI mode with exit codes (0 = pass, 1 = fail)\n */\n\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { readFile, readdir, stat } from \"fs/promises\";\nimport { join } from \"path\";\nimport { existsSync } from \"fs\";\nimport * as yaml from \"yaml\";\n\ninterface CheckOptions {\n ci?: boolean;\n}\n\ninterface ValidationResult {\n valid: boolean;\n errors: string[];\n warnings: string[];\n files: string[];\n}\n\n// Known AI config files\nconst CONFIG_FILES = [\n { path: \"AGENTS.md\", name: \"AGENTS.md\" },\n { path: \"CLAUDE.md\", name: \"CLAUDE.md\" },\n { path: \".github/copilot-instructions.md\", name: \"GitHub Copilot\" },\n { path: \".windsurfrules\", name: \"Windsurf\" },\n { path: \".clinerules\", name: \"Cline\" },\n { path: \".goosehints\", name: \"Goose\" },\n { path: \".zed/instructions.md\", name: \"Zed\" },\n];\n\nconst CONFIG_DIRS = [\n { path: \".cursor/rules\", name: \"Cursor\" },\n { path: \".lynxprompt\", name: \"LynxPrompt\" },\n];\n\n/**\n * Validate markdown content for common issues\n */\nfunction validateMarkdown(content: string, filename: string): { errors: string[]; warnings: string[] } {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n // Check for empty content\n if (!content.trim()) {\n errors.push(`${filename}: File is empty`);\n return { errors, warnings };\n }\n\n // Check for minimum content\n if (content.trim().length < 50) {\n warnings.push(`${filename}: Content seems too short (< 50 chars)`);\n }\n\n // Check for header\n if (!content.includes(\"#\")) {\n warnings.push(`${filename}: No markdown headers found`);\n }\n\n // Check for common placeholder text\n const placeholders = [\n \"TODO\",\n \"FIXME\",\n \"YOUR_\",\n \"REPLACE_\",\n \"[INSERT\",\n \"example.com\",\n ];\n \n for (const placeholder of placeholders) {\n if (content.includes(placeholder)) {\n warnings.push(`${filename}: Contains placeholder text \"${placeholder}\"`);\n }\n }\n\n // Check for potential secrets (basic patterns)\n const secretPatterns = [\n /sk[_-][a-zA-Z0-9]{20,}/, // Stripe-like keys\n /ghp_[a-zA-Z0-9]{36}/, // GitHub tokens\n /api[_-]?key[_-]?=\\s*[a-zA-Z0-9]{20,}/i,\n ];\n\n for (const pattern of secretPatterns) {\n if (pattern.test(content)) {\n errors.push(`${filename}: Potential secret/API key detected - DO NOT commit secrets!`);\n break;\n }\n }\n\n return { errors, warnings };\n}\n\n/**\n * Validate LynxPrompt configuration\n */\nasync function validateLynxPromptConfig(cwd: string): Promise<{ errors: string[]; warnings: string[] }> {\n const errors: string[] = [];\n const warnings: string[] = [];\n \n const configPath = join(cwd, \".lynxprompt/conf.yml\");\n \n if (!existsSync(configPath)) {\n return { errors, warnings };\n }\n\n try {\n const content = await readFile(configPath, \"utf-8\");\n const config = yaml.parse(content);\n\n // Check version\n if (!config.version) {\n warnings.push(\".lynxprompt/conf.yml: Missing 'version' field\");\n }\n\n // Check exporters\n if (!config.exporters || !Array.isArray(config.exporters)) {\n errors.push(\".lynxprompt/conf.yml: Missing or invalid 'exporters' field\");\n } else if (config.exporters.length === 0) {\n warnings.push(\".lynxprompt/conf.yml: No exporters configured\");\n }\n\n // Check sources\n if (!config.sources || !Array.isArray(config.sources)) {\n errors.push(\".lynxprompt/conf.yml: Missing or invalid 'sources' field\");\n } else {\n for (const source of config.sources) {\n if (source.type === \"local\" && source.path) {\n const sourcePath = join(cwd, source.path);\n if (!existsSync(sourcePath)) {\n errors.push(`.lynxprompt/conf.yml: Source path not found: ${source.path}`);\n }\n }\n }\n }\n } catch (error) {\n errors.push(`.lynxprompt/conf.yml: Invalid YAML syntax - ${error instanceof Error ? error.message : \"parse error\"}`);\n }\n\n return { errors, warnings };\n}\n\n/**\n * Validate MDC files (Cursor format)\n */\nfunction validateMdc(content: string, filename: string): { errors: string[]; warnings: string[] } {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n // Check for frontmatter\n if (!content.startsWith(\"---\")) {\n warnings.push(`${filename}: Missing YAML frontmatter`);\n } else {\n // Try to parse frontmatter\n const frontmatterEnd = content.indexOf(\"---\", 3);\n if (frontmatterEnd === -1) {\n errors.push(`${filename}: Unclosed YAML frontmatter`);\n } else {\n const frontmatter = content.substring(3, frontmatterEnd).trim();\n try {\n yaml.parse(frontmatter);\n } catch {\n errors.push(`${filename}: Invalid YAML frontmatter`);\n }\n }\n }\n\n // Also run standard markdown validation on content after frontmatter\n const bodyStart = content.indexOf(\"---\", 3);\n if (bodyStart !== -1) {\n const body = content.substring(bodyStart + 3).trim();\n const mdResult = validateMarkdown(body, filename);\n // Only add body-related warnings, not errors (frontmatter is the critical part for MDC)\n warnings.push(...mdResult.warnings);\n }\n\n return { errors, warnings };\n}\n\nexport async function checkCommand(options: CheckOptions = {}): Promise<void> {\n const isCi = options.ci;\n const cwd = process.cwd();\n\n if (!isCi) {\n console.log();\n console.log(chalk.cyan(\"š± LynxPrompt Check\"));\n console.log();\n }\n\n const result: ValidationResult = {\n valid: true,\n errors: [],\n warnings: [],\n files: [],\n };\n\n const spinner = !isCi ? ora(\"Scanning for configuration files...\").start() : null;\n\n // Check for config files\n for (const file of CONFIG_FILES) {\n const filePath = join(cwd, file.path);\n if (existsSync(filePath)) {\n result.files.push(file.path);\n try {\n const content = await readFile(filePath, \"utf-8\");\n const validation = validateMarkdown(content, file.path);\n result.errors.push(...validation.errors);\n result.warnings.push(...validation.warnings);\n } catch (error) {\n result.errors.push(`${file.path}: Could not read file`);\n }\n }\n }\n\n // Check for config directories\n for (const dir of CONFIG_DIRS) {\n const dirPath = join(cwd, dir.path);\n if (existsSync(dirPath)) {\n try {\n const files = await readdir(dirPath);\n for (const file of files) {\n const filePath = join(dirPath, file);\n const fileStat = await stat(filePath);\n \n if (fileStat.isFile()) {\n result.files.push(`${dir.path}/${file}`);\n const content = await readFile(filePath, \"utf-8\");\n \n // Use MDC validation for .mdc files\n if (file.endsWith(\".mdc\")) {\n const validation = validateMdc(content, `${dir.path}/${file}`);\n result.errors.push(...validation.errors);\n result.warnings.push(...validation.warnings);\n } else if (file.endsWith(\".md\")) {\n const validation = validateMarkdown(content, `${dir.path}/${file}`);\n result.errors.push(...validation.errors);\n result.warnings.push(...validation.warnings);\n }\n }\n }\n } catch {\n // Directory exists but can't be read\n }\n }\n }\n\n // Check LynxPrompt config\n const lynxpromptValidation = await validateLynxPromptConfig(cwd);\n result.errors.push(...lynxpromptValidation.errors);\n result.warnings.push(...lynxpromptValidation.warnings);\n\n spinner?.stop();\n\n // Determine overall result\n result.valid = result.errors.length === 0;\n\n // Output results\n if (isCi) {\n // CI mode - minimal output, use exit codes\n if (!result.valid) {\n console.error(\"ā Validation failed\");\n for (const error of result.errors) {\n console.error(` ${error}`);\n }\n process.exit(1);\n } else if (result.files.length === 0) {\n console.error(\"ā No configuration files found\");\n process.exit(1);\n } else {\n console.log(\"ā Validation passed\");\n if (result.warnings.length > 0) {\n console.log(` (${result.warnings.length} warning${result.warnings.length === 1 ? \"\" : \"s\"})`);\n }\n process.exit(0);\n }\n } else {\n // Interactive mode - detailed output\n if (result.files.length === 0) {\n console.log(chalk.yellow(\"ā No AI configuration files found.\"));\n console.log();\n console.log(chalk.gray(\"Run 'lynxp wizard' to create a configuration.\"));\n return;\n }\n\n console.log(chalk.green(`ā Found ${result.files.length} configuration file${result.files.length === 1 ? \"\" : \"s\"}:`));\n for (const file of result.files) {\n console.log(chalk.gray(` ${file}`));\n }\n console.log();\n\n if (result.errors.length > 0) {\n console.log(chalk.red(`ā ${result.errors.length} error${result.errors.length === 1 ? \"\" : \"s\"}:`));\n for (const error of result.errors) {\n console.log(chalk.red(` ${error}`));\n }\n console.log();\n }\n\n if (result.warnings.length > 0) {\n console.log(chalk.yellow(`ā ${result.warnings.length} warning${result.warnings.length === 1 ? \"\" : \"s\"}:`));\n for (const warning of result.warnings) {\n console.log(chalk.yellow(` ${warning}`));\n }\n console.log();\n }\n\n if (result.valid) {\n console.log(chalk.green(\"ā
Validation passed!\"));\n } else {\n console.log(chalk.red(\"ā Validation failed. Fix the errors above.\"));\n }\n console.log();\n }\n}\n\n\n\n","/**\n * Diff command - show changes between local and remote blueprints\n * \n * Compares local AI configuration files with their linked cloud blueprints.\n * If no blueprint is linked, prompts user to link one first.\n * \n * Usage:\n * lynxp diff - Compare all tracked files with their cloud blueprints\n * lynxp diff <file> - Compare specific file with its linked blueprint\n * lynxp diff --local - Show diff between .lynxprompt/rules/ and exported files\n */\n\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { readFile } from \"fs/promises\";\nimport { join } from \"path\";\nimport { existsSync } from \"fs\";\nimport { isAuthenticated } from \"../config.js\";\nimport { api, ApiRequestError } from \"../api.js\";\nimport { checkSyncStatus, findBlueprintByFile } from \"../utils/blueprint-tracker.js\";\n\ninterface DiffOptions {\n local?: boolean;\n}\n\n/**\n * Simple line-by-line diff implementation\n * Returns added (+), removed (-), and unchanged lines\n */\nfunction computeDiff(oldText: string, newText: string): Array<{ type: \"add\" | \"remove\" | \"same\"; line: string }> {\n const oldLines = oldText.split(\"\\n\");\n const newLines = newText.split(\"\\n\");\n const result: Array<{ type: \"add\" | \"remove\" | \"same\"; line: string }> = [];\n\n // Simple LCS-based diff\n const lcs = longestCommonSubsequence(oldLines, newLines);\n \n let oldIndex = 0;\n let newIndex = 0;\n let lcsIndex = 0;\n\n while (oldIndex < oldLines.length || newIndex < newLines.length) {\n if (lcsIndex < lcs.length && oldIndex < oldLines.length && oldLines[oldIndex] === lcs[lcsIndex]) {\n if (newIndex < newLines.length && newLines[newIndex] === lcs[lcsIndex]) {\n // Line is in both - unchanged\n result.push({ type: \"same\", line: oldLines[oldIndex] });\n oldIndex++;\n newIndex++;\n lcsIndex++;\n } else {\n // Line is in new but not in LCS position - added\n result.push({ type: \"add\", line: newLines[newIndex] });\n newIndex++;\n }\n } else if (oldIndex < oldLines.length && (lcsIndex >= lcs.length || oldLines[oldIndex] !== lcs[lcsIndex])) {\n // Line is in old but not in LCS - removed\n result.push({ type: \"remove\", line: oldLines[oldIndex] });\n oldIndex++;\n } else if (newIndex < newLines.length) {\n // Line is in new but not in old - added\n result.push({ type: \"add\", line: newLines[newIndex] });\n newIndex++;\n }\n }\n\n return result;\n}\n\n/**\n * Find the longest common subsequence of lines\n */\nfunction longestCommonSubsequence(a: string[], b: string[]): string[] {\n const m = a.length;\n const n = b.length;\n const dp: number[][] = Array(m + 1).fill(null).map(() => Array(n + 1).fill(0));\n\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n if (a[i - 1] === b[j - 1]) {\n dp[i][j] = dp[i - 1][j - 1] + 1;\n } else {\n dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);\n }\n }\n }\n\n // Backtrack to find the LCS\n const lcs: string[] = [];\n let i = m;\n let j = n;\n while (i > 0 && j > 0) {\n if (a[i - 1] === b[j - 1]) {\n lcs.unshift(a[i - 1]);\n i--;\n j--;\n } else if (dp[i - 1][j] > dp[i][j - 1]) {\n i--;\n } else {\n j--;\n }\n }\n\n return lcs;\n}\n\n/**\n * Format diff output with colors\n */\nfunction formatDiff(diff: Array<{ type: \"add\" | \"remove\" | \"same\"; line: string }>, contextLines: number = 3): string {\n const output: string[] = [];\n let lastPrintedIndex = -1;\n \n // Find sections with changes\n const changeIndices = diff.map((d, i) => d.type !== \"same\" ? i : -1).filter(i => i !== -1);\n \n if (changeIndices.length === 0) {\n return chalk.gray(\" (no changes)\");\n }\n\n for (let i = 0; i < diff.length; i++) {\n const item = diff[i];\n const nearChange = changeIndices.some(ci => Math.abs(ci - i) <= contextLines);\n\n if (nearChange) {\n // Print separator if there's a gap\n if (lastPrintedIndex !== -1 && i - lastPrintedIndex > 1) {\n output.push(chalk.gray(\" ...\"));\n }\n\n // Format the line based on type\n if (item.type === \"add\") {\n output.push(chalk.green(`+ ${item.line}`));\n } else if (item.type === \"remove\") {\n output.push(chalk.red(`- ${item.line}`));\n } else {\n output.push(chalk.gray(` ${item.line}`));\n }\n lastPrintedIndex = i;\n }\n }\n\n return output.join(\"\\n\");\n}\n\n/**\n * Get summary statistics for a diff\n */\nfunction getDiffStats(diff: Array<{ type: \"add\" | \"remove\" | \"same\"; line: string }>): { added: number; removed: number; unchanged: number } {\n return {\n added: diff.filter(d => d.type === \"add\").length,\n removed: diff.filter(d => d.type === \"remove\").length,\n unchanged: diff.filter(d => d.type === \"same\").length,\n };\n}\n\nexport async function diffCommand(fileOrId?: string, options: DiffOptions = {}): Promise<void> {\n console.log();\n console.log(chalk.cyan(\"š± LynxPrompt Diff\"));\n console.log();\n\n const cwd = process.cwd();\n\n // Local diff mode - compare .lynxprompt/rules/ with exported files\n if (options.local) {\n await diffLocal(cwd);\n return;\n }\n\n // Check for tracked blueprints first\n const trackedFiles = await checkSyncStatus(cwd);\n \n // If a specific file or blueprint ID is given\n if (fileOrId) {\n // Check if it's a tracked file\n const tracked = await findBlueprintByFile(cwd, fileOrId);\n if (tracked) {\n await diffFileWithBlueprint(cwd, fileOrId, tracked.id);\n return;\n }\n \n // Otherwise treat it as a blueprint ID\n await diffWithBlueprintId(cwd, fileOrId);\n return;\n }\n\n // No argument given - show diff for all tracked files\n if (trackedFiles.length === 0) {\n console.log(chalk.yellow(\"No tracked blueprints found.\"));\n console.log();\n console.log(chalk.gray(\"To track a blueprint and compare changes:\"));\n console.log(chalk.gray(\" 1. Pull a blueprint: lynxp pull <blueprint-id>\"));\n console.log(chalk.gray(\" 2. Or link an existing file: lynxp link\"));\n console.log();\n console.log(chalk.gray(\"Other options:\"));\n console.log(chalk.gray(\" lynxp diff --local Compare .lynxprompt/rules/ with exported files\"));\n return;\n }\n\n // Show diff for all tracked files\n let hasChanges = false;\n \n for (const { blueprint, localModified, fileExists } of trackedFiles) {\n if (!fileExists) {\n console.log(chalk.red(`ā ${blueprint.file} - file not found`));\n continue;\n }\n \n console.log(chalk.cyan(`š ${blueprint.file}`));\n console.log(chalk.gray(` Linked to: ${blueprint.name} (${blueprint.id})`));\n \n if (localModified) {\n hasChanges = true;\n await diffFileWithBlueprint(cwd, blueprint.file, blueprint.id, true);\n } else {\n console.log(chalk.green(\" ā In sync with cloud\"));\n }\n console.log();\n }\n \n if (!hasChanges) {\n console.log(chalk.green(\"ā All tracked files are in sync with their cloud blueprints!\"));\n } else {\n console.log(chalk.gray(\"To push local changes: lynxp push\"));\n console.log(chalk.gray(\"To pull cloud changes: lynxp pull <id>\"));\n }\n console.log();\n}\n\n/**\n * Compare a specific file with its linked blueprint\n */\nasync function diffFileWithBlueprint(cwd: string, file: string, blueprintId: string, compact: boolean = false): Promise<void> {\n const filePath = join(cwd, file);\n \n if (!existsSync(filePath)) {\n console.log(chalk.red(`ā File not found: ${file}`));\n return;\n }\n\n const spinner = compact ? null : ora(\"Fetching blueprint...\").start();\n\n try {\n const { blueprint } = await api.getBlueprint(blueprintId);\n spinner?.stop();\n\n if (!blueprint || !blueprint.content) {\n console.log(chalk.red(`ā Blueprint has no content`));\n return;\n }\n\n const localContent = await readFile(filePath, \"utf-8\");\n const diff = computeDiff(blueprint.content, localContent);\n const stats = getDiffStats(diff);\n\n if (stats.added === 0 && stats.removed === 0) {\n if (!compact) {\n console.log(chalk.green(\"ā Files are identical!\"));\n }\n } else {\n if (!compact) {\n console.log(chalk.gray(\"Changes (cloud ā local):\"));\n console.log();\n }\n console.log(formatDiff(diff));\n console.log(chalk.gray(` ${chalk.green(`+${stats.added}`)} ${chalk.red(`-${stats.removed}`)} lines`));\n }\n\n } catch (error) {\n spinner?.stop();\n if (error instanceof ApiRequestError) {\n console.log(chalk.red(`ā Could not fetch blueprint: ${error.message}`));\n } else {\n console.log(chalk.red(\"ā Failed to compare\"));\n }\n }\n}\n\n/**\n * Compare with a specific blueprint ID (legacy behavior)\n */\nasync function diffWithBlueprintId(cwd: string, blueprintId: string): Promise<void> {\n // Check if logged in\n if (!isAuthenticated()) {\n console.log(chalk.yellow(\"ā Not logged in. Some blueprints may not be accessible.\"));\n console.log(chalk.gray(\"Run 'lynxp login' to authenticate.\"));\n console.log();\n }\n\n const spinner = ora(\"Fetching blueprint...\").start();\n\n try {\n const { blueprint } = await api.getBlueprint(blueprintId);\n spinner.stop();\n\n if (!blueprint || !blueprint.content) {\n console.log(chalk.red(`ā Blueprint not found or has no content: ${blueprintId}`));\n return;\n }\n\n console.log(chalk.green(`ā Blueprint: ${blueprint.name || blueprintId}`));\n if (blueprint.description) {\n console.log(chalk.gray(` ${blueprint.description}`));\n }\n console.log();\n\n // Determine local file path based on blueprint type\n const localPaths = [\n \"AGENTS.md\",\n \"CLAUDE.md\",\n \".cursor/rules/project.mdc\",\n \".github/copilot-instructions.md\",\n \".windsurfrules\",\n ];\n\n let localContent: string | null = null;\n let localPath: string | null = null;\n\n for (const path of localPaths) {\n const fullPath = join(cwd, path);\n if (existsSync(fullPath)) {\n try {\n localContent = await readFile(fullPath, \"utf-8\");\n localPath = path;\n break;\n } catch {\n // Continue to next path\n }\n }\n }\n\n if (!localContent) {\n console.log(chalk.yellow(\"ā No local AI configuration file found.\"));\n console.log(chalk.gray(\"Run 'lynxp wizard' to create one, or 'lynxp pull' to download the blueprint.\"));\n return;\n }\n\n console.log(chalk.gray(`Comparing with: ${localPath}`));\n console.log();\n\n // Compute and display diff\n const diff = computeDiff(blueprint.content, localContent);\n const stats = getDiffStats(diff);\n\n if (stats.added === 0 && stats.removed === 0) {\n console.log(chalk.green(\"ā Files are identical!\"));\n } else {\n console.log(chalk.gray(\"Changes (remote ā local):\"));\n console.log();\n console.log(formatDiff(diff));\n console.log();\n console.log(chalk.gray(`Summary: ${chalk.green(`+${stats.added}`)} ${chalk.red(`-${stats.removed}`)} lines changed`));\n }\n console.log();\n\n } catch (error) {\n spinner.stop();\n if (error instanceof ApiRequestError) {\n if (error.statusCode === 401) {\n console.log(chalk.red(\"ā Authentication required. Run 'lynxp login' first.\"));\n } else if (error.statusCode === 404) {\n console.log(chalk.red(`ā Blueprint not found: ${blueprintId}`));\n } else if (error.statusCode === 403) {\n console.log(chalk.red(\"ā Access denied to this blueprint.\"));\n } else {\n console.log(chalk.red(`ā API error: ${error.message}`));\n }\n } else {\n console.log(chalk.red(\"ā Failed to fetch blueprint\"));\n if (error instanceof Error) {\n console.log(chalk.gray(` ${error.message}`));\n }\n }\n }\n}\n\n/**\n * Compare .lynxprompt/rules/ with exported agent files\n */\nasync function diffLocal(cwd: string): Promise<void> {\n const rulesDir = join(cwd, \".lynxprompt/rules\");\n \n if (!existsSync(rulesDir)) {\n console.log(chalk.yellow(\"ā No .lynxprompt/rules/ directory found.\"));\n console.log(chalk.gray(\"Run 'lynxp init' to set up the advanced workflow, or 'lynxp wizard' for simple file generation.\"));\n return;\n }\n\n console.log(chalk.gray(\"Comparing .lynxprompt/rules/ with exported files...\"));\n console.log();\n\n // Read the rules file(s)\n const rulesPath = join(rulesDir, \"agents.md\");\n if (!existsSync(rulesPath)) {\n console.log(chalk.yellow(\"ā No rules files found in .lynxprompt/rules/\"));\n return;\n }\n\n let rulesContent: string;\n try {\n rulesContent = await readFile(rulesPath, \"utf-8\");\n } catch {\n console.log(chalk.red(\"ā Could not read .lynxprompt/rules/agents.md\"));\n return;\n }\n\n // Compare with each exported file\n const exportedFiles = [\n { path: \"AGENTS.md\", name: \"AGENTS.md\" },\n { path: \".cursor/rules/lynxprompt-rules.mdc\", name: \"Cursor\" },\n ];\n\n let hasChanges = false;\n\n for (const file of exportedFiles) {\n const filePath = join(cwd, file.path);\n if (existsSync(filePath)) {\n try {\n const exportedContent = await readFile(filePath, \"utf-8\");\n \n // For MDC files, strip frontmatter for comparison\n let compareContent = exportedContent;\n if (file.path.endsWith(\".mdc\")) {\n const frontmatterEnd = exportedContent.indexOf(\"---\", 3);\n if (frontmatterEnd !== -1) {\n compareContent = exportedContent.substring(frontmatterEnd + 3).trim();\n }\n }\n\n // Strip headers added by sync\n compareContent = compareContent\n .replace(/^# AI Coding Rules\\n\\n> Generated by \\[LynxPrompt\\].*\\n\\n/m, \"\")\n .trim();\n\n const diff = computeDiff(rulesContent.trim(), compareContent);\n const stats = getDiffStats(diff);\n\n if (stats.added > 0 || stats.removed > 0) {\n hasChanges = true;\n console.log(chalk.yellow(`ā ${file.name} differs from source:`));\n console.log(formatDiff(diff));\n console.log(chalk.gray(` ${chalk.green(`+${stats.added}`)} ${chalk.red(`-${stats.removed}`)} lines`));\n console.log();\n } else {\n console.log(chalk.green(`ā ${file.name} is in sync`));\n }\n } catch {\n // File exists but couldn't be read\n }\n }\n }\n\n if (!hasChanges) {\n console.log();\n console.log(chalk.green(\"ā All exported files are in sync with .lynxprompt/rules/\"));\n } else {\n console.log();\n console.log(chalk.gray(\"Run 'lynxp sync' to update exported files from .lynxprompt/rules/\"));\n }\n console.log();\n}\n\n","/**\n * Link command - connect a local file to a cloud blueprint\n * \n * This is for when a user has a local file that matches a cloud blueprint\n * and wants to start tracking it without overwriting the local version.\n * \n * Usage:\n * lynxp link - Interactive mode (recommended)\n * lynxp link <file> <blueprint-id> - Link local file to cloud blueprint\n * lynxp link --list - List all tracked blueprints\n * lynxp unlink - Interactive mode (recommended)\n * lynxp unlink <file> - Disconnect a file from its blueprint\n */\n\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport prompts from \"prompts\";\nimport { api, ApiRequestError, Blueprint } from \"../api.js\";\nimport { isAuthenticated } from \"../config.js\";\nimport { join } from \"path\";\nimport { existsSync } from \"fs\";\nimport {\n linkBlueprint,\n untrackBlueprint,\n findBlueprintByFile,\n checkSyncStatus,\n type BlueprintSource,\n} from \"../utils/blueprint-tracker.js\";\n\ninterface LinkOptions {\n list?: boolean;\n}\n\n// Determine blueprint source from visibility\nfunction getSourceFromVisibility(visibility: Blueprint[\"visibility\"]): BlueprintSource {\n switch (visibility) {\n case \"PUBLIC\":\n return \"marketplace\";\n case \"TEAM\":\n return \"team\";\n case \"PRIVATE\":\n return \"private\";\n default:\n return \"marketplace\";\n }\n}\n\nexport async function linkCommand(\n fileArg?: string,\n blueprintIdArg?: string,\n options: LinkOptions = {}\n): Promise<void> {\n const cwd = process.cwd();\n\n // List tracked blueprints\n if (options.list) {\n await listTrackedBlueprints(cwd);\n return;\n }\n\n console.log();\n console.log(chalk.cyan(\"š± Link File to Blueprint\"));\n console.log();\n\n let file: string;\n let blueprintId: string | undefined = blueprintIdArg;\n\n // Interactive mode - guide the user through linking\n if (!fileArg) {\n // Find AI config files in the project\n const configFiles = [\n \"AGENTS.md\",\n \"CLAUDE.md\",\n \".cursor/rules/project.mdc\",\n \".github/copilot-instructions.md\",\n \".windsurfrules\",\n \".zed/instructions.md\",\n \".clinerules\",\n ];\n\n const foundFiles = configFiles.filter(f => existsSync(join(cwd, f)));\n\n if (foundFiles.length === 0) {\n console.log(chalk.yellow(\"No AI configuration files found in this directory.\"));\n console.log();\n console.log(chalk.gray(\"Create one first:\"));\n console.log(chalk.gray(\" lynxp wizard Generate a new config file\"));\n console.log(chalk.gray(\" lynxp pull <id> Download from marketplace\"));\n return;\n }\n\n // Let user select which file to link\n const { selectedFile } = await prompts({\n type: \"select\",\n name: \"selectedFile\",\n message: \"Which file do you want to link to a cloud blueprint?\",\n choices: foundFiles.map(f => ({\n title: f,\n value: f,\n description: \"Local file exists\",\n })),\n });\n\n if (!selectedFile) {\n console.log(chalk.gray(\"Cancelled.\"));\n return;\n }\n\n file = selectedFile;\n } else {\n file = fileArg;\n }\n\n // Check if file exists\n const filePath = join(cwd, file);\n if (!existsSync(filePath)) {\n console.log(chalk.red(`ā File not found: ${file}`));\n return;\n }\n\n // Check if already linked\n const existing = await findBlueprintByFile(cwd, file);\n if (existing) {\n console.log(chalk.yellow(`This file is already linked to: ${existing.name}`));\n console.log(chalk.gray(` ID: ${existing.id}`));\n console.log();\n const { proceed } = await prompts({\n type: \"confirm\",\n name: \"proceed\",\n message: \"Replace the existing link?\",\n initial: false,\n });\n if (!proceed) {\n console.log(chalk.gray(\"Cancelled.\"));\n return;\n }\n }\n\n // Interactive mode - help find the blueprint\n if (!blueprintId) {\n // Check authentication\n if (!isAuthenticated()) {\n console.log(chalk.yellow(\"You need to login to access your blueprints.\"));\n const { doLogin } = await prompts({\n type: \"confirm\",\n name: \"doLogin\",\n message: \"Login now?\",\n initial: true,\n });\n if (doLogin) {\n console.log(chalk.gray(\"Run 'lynxp login' in another terminal, then come back here.\"));\n return;\n }\n console.log(chalk.gray(\"Cancelled.\"));\n return;\n }\n\n // Let user choose how to find the blueprint\n const { searchMethod } = await prompts({\n type: \"select\",\n name: \"searchMethod\",\n message: \"How do you want to find the blueprint?\",\n choices: [\n { title: \"š From my blueprints\", value: \"list\" },\n { title: \"š Search marketplace\", value: \"search\" },\n { title: \"š¢ Enter ID directly\", value: \"manual\" },\n ],\n });\n\n if (!searchMethod) {\n console.log(chalk.gray(\"Cancelled.\"));\n return;\n }\n\n if (searchMethod === \"list\") {\n // Fetch user's blueprints\n const spinner = ora(\"Fetching your blueprints...\").start();\n try {\n const { blueprints } = await api.listBlueprints();\n spinner.stop();\n\n if (!blueprints || blueprints.length === 0) {\n console.log(chalk.yellow(\"You don't have any blueprints yet.\"));\n console.log(chalk.gray(\"Create one with 'lynxp push' or search the marketplace.\"));\n return;\n }\n\n const { selected } = await prompts({\n type: \"select\",\n name: \"selected\",\n message: \"Select a blueprint:\",\n choices: blueprints.map(b => ({\n title: b.name,\n value: b.id,\n description: b.description?.substring(0, 50) || \"\",\n })),\n });\n\n if (!selected) {\n console.log(chalk.gray(\"Cancelled.\"));\n return;\n }\n blueprintId = selected;\n } catch {\n spinner.stop();\n console.log(chalk.red(\"ā Could not fetch blueprints\"));\n return;\n }\n } else if (searchMethod === \"search\") {\n const { query } = await prompts({\n type: \"text\",\n name: \"query\",\n message: \"Search for:\",\n });\n\n if (!query) {\n console.log(chalk.gray(\"Cancelled.\"));\n return;\n }\n\n const spinner = ora(`Searching for \"${query}\"...`).start();\n try {\n const results = await api.searchBlueprints(query, 10);\n spinner.stop();\n\n if (!results.templates || results.templates.length === 0) {\n console.log(chalk.yellow(`No blueprints found for \"${query}\"`));\n return;\n }\n\n const { selected } = await prompts({\n type: \"select\",\n name: \"selected\",\n message: \"Select a blueprint:\",\n choices: results.templates.map(b => ({\n title: `${b.name} (ā
${b.likes})`,\n value: b.id,\n description: b.author ? `by ${b.author}` : \"\",\n })),\n });\n\n if (!selected) {\n console.log(chalk.gray(\"Cancelled.\"));\n return;\n }\n blueprintId = selected;\n } catch {\n spinner.stop();\n console.log(chalk.red(\"ā Search failed\"));\n return;\n }\n } else {\n const { manualId } = await prompts({\n type: \"text\",\n name: \"manualId\",\n message: \"Enter blueprint ID:\",\n });\n\n if (!manualId) {\n console.log(chalk.gray(\"Cancelled.\"));\n return;\n }\n blueprintId = manualId;\n }\n }\n\n // At this point we must have both file and blueprintId\n if (!blueprintId) {\n console.log(chalk.red(\"ā No blueprint ID provided.\"));\n return;\n }\n\n // Fetch blueprint info and link\n const spinner = ora(`Fetching blueprint ${chalk.cyan(blueprintId)}...`).start();\n\n try {\n const { blueprint } = await api.getBlueprint(blueprintId);\n spinner.stop();\n\n const source = getSourceFromVisibility(blueprint.visibility);\n const isMarketplace = source === \"marketplace\";\n\n console.log();\n console.log(chalk.cyan(`š± Blueprint: ${chalk.bold(blueprint.name)}`));\n if (blueprint.description) {\n console.log(chalk.gray(` ${blueprint.description}`));\n }\n console.log(chalk.gray(` Visibility: ${blueprint.visibility}`));\n console.log();\n\n // Show warning for marketplace blueprints\n if (isMarketplace) {\n console.log(chalk.yellow(\"ā This is a marketplace blueprint.\"));\n console.log(chalk.gray(\" Your local changes will NOT sync back to the cloud.\"));\n console.log(chalk.gray(\" To make changes, you'll need to create your own copy.\"));\n console.log();\n }\n\n // Confirm linking\n const { confirm } = await prompts({\n type: \"confirm\",\n name: \"confirm\",\n message: `Link ${chalk.cyan(file)} to ${chalk.cyan(blueprint.name)}?`,\n initial: true,\n });\n\n if (!confirm) {\n console.log(chalk.gray(\"Cancelled.\"));\n return;\n }\n\n // Link the file\n await linkBlueprint(cwd, file, blueprint.id, blueprint.name, source);\n\n console.log();\n console.log(chalk.green(`ā
Linked: ${file} ā ${blueprint.id}`));\n console.log();\n\n // Show next steps\n console.log(chalk.gray(\"Next steps:\"));\n console.log(chalk.gray(` ⢠Run 'lynxp diff' to see differences`));\n console.log(chalk.gray(` ⢠Run 'lynxp status' to see all tracked blueprints`));\n if (!isMarketplace) {\n console.log(chalk.gray(` ⢠Run 'lynxp push' to push local changes to cloud`));\n }\n console.log();\n\n } catch (error) {\n spinner.stop();\n if (error instanceof ApiRequestError) {\n if (error.statusCode === 404) {\n console.log(chalk.red(`ā Blueprint not found: ${blueprintId}`));\n console.log(chalk.gray(\" Make sure the ID is correct. Use 'lynxp list' or 'lynxp search' to find blueprints.\"));\n } else if (error.statusCode === 403) {\n console.log(chalk.red(\"ā You don't have access to this blueprint.\"));\n } else {\n console.log(chalk.red(`ā Error: ${error.message}`));\n }\n } else {\n console.log(chalk.red(\"ā An unexpected error occurred.\"));\n }\n }\n}\n\nexport async function unlinkCommand(fileArg?: string): Promise<void> {\n const cwd = process.cwd();\n\n console.log();\n console.log(chalk.cyan(\"š± Unlink File from Blueprint\"));\n console.log();\n\n let file: string;\n\n // Interactive mode - show tracked files and let user select\n if (!fileArg) {\n const status = await checkSyncStatus(cwd);\n \n if (status.length === 0) {\n console.log(chalk.yellow(\"No files are currently linked to blueprints.\"));\n return;\n }\n\n const { selectedFile } = await prompts({\n type: \"select\",\n name: \"selectedFile\",\n message: \"Which file do you want to unlink?\",\n choices: status.map(({ blueprint }) => ({\n title: blueprint.file,\n value: blueprint.file,\n description: `${blueprint.name} (${blueprint.source})`,\n })),\n });\n\n if (!selectedFile) {\n console.log(chalk.gray(\"Cancelled.\"));\n return;\n }\n file = selectedFile;\n } else {\n file = fileArg;\n }\n\n // Check if file is tracked\n const tracked = await findBlueprintByFile(cwd, file);\n if (!tracked) {\n console.log(chalk.yellow(`File is not linked to any blueprint: ${file}`));\n return;\n }\n\n console.log(chalk.gray(`Currently linked to: ${tracked.name}`));\n console.log(chalk.gray(` ID: ${tracked.id}`));\n console.log(chalk.gray(` Source: ${tracked.source}`));\n console.log();\n\n const { confirm } = await prompts({\n type: \"confirm\",\n name: \"confirm\",\n message: `Unlink ${chalk.cyan(file)} from ${chalk.cyan(tracked.name)}?`,\n initial: true,\n });\n\n if (!confirm) {\n console.log(chalk.gray(\"Cancelled.\"));\n return;\n }\n\n const success = await untrackBlueprint(cwd, file);\n \n if (success) {\n console.log();\n console.log(chalk.green(`ā
Unlinked: ${file}`));\n console.log(chalk.gray(\" The file is now standalone. Changes won't sync with the cloud.\"));\n console.log();\n } else {\n console.log(chalk.red(\"ā Failed to unlink file.\"));\n }\n}\n\nasync function listTrackedBlueprints(cwd: string): Promise<void> {\n console.log();\n console.log(chalk.cyan(\"š± Tracked Blueprints\"));\n console.log();\n\n const status = await checkSyncStatus(cwd);\n\n if (status.length === 0) {\n console.log(chalk.gray(\"No blueprints are currently tracked.\"));\n console.log();\n console.log(chalk.gray(\"To track a blueprint:\"));\n console.log(chalk.gray(\" lynxp pull <blueprint-id> Download and track a blueprint\"));\n console.log(chalk.gray(\" lynxp link Link an existing file to a blueprint\"));\n return;\n }\n\n for (const { blueprint, localModified, fileExists } of status) {\n const statusIcon = !fileExists\n ? chalk.red(\"ā\")\n : localModified\n ? chalk.yellow(\"ā\")\n : chalk.green(\"ā\");\n \n const sourceLabel = {\n marketplace: chalk.gray(\"[marketplace]\"),\n team: chalk.blue(\"[team]\"),\n private: chalk.green(\"[private]\"),\n local: chalk.gray(\"[local]\"),\n }[blueprint.source];\n\n console.log(`${statusIcon} ${chalk.cyan(blueprint.file)}`);\n console.log(` ${sourceLabel} ${blueprint.name}`);\n console.log(` ${chalk.gray(`ID: ${blueprint.id}`)}`);\n \n if (!fileExists) {\n console.log(chalk.red(` ā File not found`));\n } else if (localModified) {\n console.log(chalk.yellow(` ā Local changes detected`));\n }\n \n console.log();\n }\n\n console.log(chalk.gray(\"Legend:\"));\n console.log(chalk.gray(` ${chalk.green(\"ā\")} In sync ${chalk.yellow(\"ā\")} Modified locally ${chalk.red(\"ā\")} Missing`));\n console.log();\n}\n"],"mappings":"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","names":["chalk","config","chalk","chalk","chalk","ora","chalk","ora","chalk","ora","chalk","ora","chalk","ora","writeFile","mkdir","readFile","join","dirname","config","config","config","fileExists","chalk","ora","join","readFile","dirname","mkdir","writeFile","handleApiError","chalk","ora","prompts","chalk","prompts","ora","chalk","prompts","ora","writeFile","mkdir","readFile","join","dirname","existsSync","yaml","existsSync","join","join","existsSync","path","readFile","access","join","path","join","existsSync","readFile","config","chalk","prompts","ora","mkdir","writeFile","dirname","chalk","prompts","ora","writeFile","mkdir","access","join","dirname","path","chalk","config","ora","join","access","prompts","dirname","mkdir","writeFile","chalk","ora","ora","chalk","handleApiError","truncate","formatTags","chalk","readFile","access","join","existsSync","chalk","existsSync","join","readFile","parse","config","fileExists","access","truncate","chalk","ora","prompts","readFile","writeFile","mkdir","readdir","join","dirname","existsSync","yaml","chalk","join","existsSync","ora","config","readFile","prompts","readdir","dirname","mkdir","writeFile","chalk","prompts","readFile","writeFile","join","existsSync","yaml","CONFIG_FILE","chalk","config","join","existsSync","agent","prompts","readFile","writeFile","chalk","ora","readFile","readdir","join","existsSync","yaml","CONFIG_FILES","CONFIG_DIRS","config","chalk","ora","readFile","join","existsSync","i","j","chalk","fileExists","join","existsSync","ora","readFile","path","chalk","ora","prompts","join","existsSync","getSourceFromVisibility","chalk","existsSync","join","prompts","spinner","ora","fileExists","chalk"]}
|