lynxprompt 1.2.12 → 1.2.13
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 +95 -47
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/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/wizard.ts","../src/utils/detect.ts","../src/utils/generator.ts","../src/commands/search.ts","../src/commands/status.ts","../src/commands/check.ts","../src/commands/diff.ts","../src/commands/link.ts","../src/commands/analyze.ts","../src/commands/convert.ts","../src/commands/merge.ts","../src/commands/import.ts","../src/commands/hierarchies.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 { wizardCommand } from \"./commands/wizard.js\";\nimport { searchCommand } from \"./commands/search.js\";\nimport { statusCommand } from \"./commands/status.js\";\nimport { checkCommand } from \"./commands/check.js\";\nimport { diffCommand } from \"./commands/diff.js\";\nimport { linkCommand, unlinkCommand } from \"./commands/link.js\";\nimport { analyzeCommand } from \"./commands/analyze.js\";\nimport { convertCommand } from \"./commands/convert.js\";\nimport { mergeCommand } from \"./commands/merge.js\";\nimport { importCommand } from \"./commands/import.js\";\nimport { hierarchiesCommand } from \"./commands/hierarchies.js\";\n\n// CLI version injected at build time via tsup.config.ts define option\nconst CLI_VERSION = process.env.CLI_VERSION || \"0.0.0\";\n\nconst program = new Command();\n\nprogram\n .name(\"lynxprompt\")\n .description(\"CLI for LynxPrompt - Generate AI IDE configuration files\")\n .version(CLI_VERSION);\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 // New arguments\n .option(\"-o, --output <dir>\", \"Output directory (default: current directory)\")\n .option(\"--repo-url <url>\", \"Analyze remote repository URL (GitHub/GitLab supported)\")\n .option(\"--blueprint\", \"Generate with [[VARIABLE|default]] placeholders for templates\")\n .option(\"--license <type>\", \"License type (mit, apache-2.0, gpl-3.0, etc.)\")\n .option(\"--ci-cd <platform>\", \"CI/CD platform (github_actions, gitlab_ci, jenkins, etc.)\")\n .option(\"--project-type <type>\", \"Project type (work, leisure, opensource, learning)\")\n .option(\"--detect-only\", \"Only detect project info, don't generate files\")\n .option(\"--load-draft <name>\", \"Load a saved wizard draft\")\n .option(\"--save-draft <name>\", \"Save wizard state as a draft (auto-saves at end)\")\n .option(\"--vars <values>\", \"Fill variables: VAR1=value1,VAR2=value2\")\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// Analyze - standalone project analyzer\nprogram\n .command(\"analyze\")\n .description(\"Analyze project configuration without generating files\")\n .option(\"-r, --remote <url>\", \"Analyze a remote repository (GitHub/GitLab)\")\n .option(\"-j, --json\", \"Output as JSON (for scripting)\")\n .action(analyzeCommand);\n\n// Convert - format conversion\nprogram\n .command(\"convert [source] <target>\")\n .description(\"Convert AI config between formats (e.g., AGENTS.md → cursor)\")\n .option(\"-o, --output <file>\", \"Output filename\")\n .option(\"-f, --force\", \"Overwrite existing output file\")\n .action(convertCommand);\n\n// Merge - combine multiple configs\nprogram\n .command(\"merge <files...>\")\n .description(\"Merge multiple AI configuration files into one\")\n .option(\"-o, --output <file>\", \"Output filename (default: merged.md)\")\n .option(\"-s, --strategy <type>\", \"Merge strategy: concat, sections, smart (default: smart)\")\n .option(\"-f, --force\", \"Overwrite existing output file\")\n .option(\"-i, --interactive\", \"Review and select sections to include\")\n .action(mergeCommand);\n\n// Import - scan for existing AGENTS.md files (monorepo support)\nprogram\n .command(\"import [path]\")\n .description(\"Scan and import AGENTS.md files from a repository\")\n .option(\"--dry-run\", \"Preview what would be imported without changes\")\n .option(\"--no-recursive\", \"Don't scan subdirectories\")\n .option(\"--depth <n>\", \"Max directory depth to scan\", \"10\")\n .option(\"--pattern <file>\", \"Custom config filename to look for\")\n .option(\"--link\", \"Link imported files to cloud (requires login)\")\n .option(\"-v, --verbose\", \"Show detailed section information\")\n .option(\"-j, --json\", \"Output as JSON\")\n .action(importCommand);\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 a blueprint (bp_xxx) or entire hierarchy (ha_xxx)\")\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 .option(\"-f, --force\", \"Force push (overwrite remote changes)\")\n .action(pushCommand);\n\nprogram\n .command(\"hierarchies\")\n .description(\"List your blueprint hierarchies (monorepo groupings)\")\n .option(\"-l, --limit <number>\", \"Number of results\", \"50\")\n .option(\"-j, --json\", \"Output as JSON\")\n .action(hierarchiesCommand);\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// 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 ${chalk.white(\"$ lynxp wizard --blueprint\")} ${chalk.gray(\"Generate with [[VAR|default]] placeholders\")}\n\n${chalk.cyan(\"Analysis & Tools:\")}\n ${chalk.white(\"$ lynxp analyze\")} ${chalk.gray(\"Analyze project tech stack\")}\n ${chalk.white(\"$ lynxp analyze -r <url>\")} ${chalk.gray(\"Analyze remote repository\")}\n ${chalk.white(\"$ lynxp import\")} ${chalk.gray(\"Scan repo for AGENTS.md files\")}\n ${chalk.white(\"$ lynxp import --dry-run\")} ${chalk.gray(\"Preview monorepo hierarchy\")}\n ${chalk.white(\"$ lynxp convert AGENTS.md cursor\")} ${chalk.gray(\"Convert to Cursor format\")}\n ${chalk.white(\"$ lynxp merge a.md b.md -o out.md\")} ${chalk.gray(\"Merge multiple configs\")}\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 pull ha_xyz789\")} ${chalk.gray(\"Download entire hierarchy\")}\n ${chalk.white(\"$ lynxp push\")} ${chalk.gray(\"Push local file to cloud\")}\n ${chalk.white(\"$ lynxp hierarchies\")} ${chalk.gray(\"List your hierarchies\")}\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 - simplified to Users and Teams only\n const planConfig: Record<string, { color: (s: string) => string; emoji: string; badge: string }> = {\n FREE: { color: chalk.gray, emoji: \"🆓\", badge: \"Users\" },\n TEAMS: { color: chalk.cyan, emoji: \"👥\", badge: \"Teams\" },\n };\n \n // Map legacy PRO/MAX to FREE (Users)\n const effectivePlan = plan === \"PRO\" || plan === \"MAX\" ? \"FREE\" : plan;\n const config = planConfig[effectivePlan] || planConfig.FREE;\n const W = 46; // inner width (46 to make square with 48 total)\n const b = chalk.bold;\n const pad = (s: string, len: number) => s + \" \".repeat(Math.max(0, len - s.length));\n \n console.log();\n console.log(b(\"┌\" + \"─\".repeat(W) + \"┐\"));\n console.log(b(\"│\") + \" \".repeat(W) + b(\"│\"));\n console.log(b(\"│\") + pad(` ${config.emoji} Welcome to LynxPrompt CLI!`, W) + b(\"│\"));\n console.log(b(\"│\") + \" \".repeat(W) + b(\"│\"));\n console.log(b(\"│\") + pad(` User: ${name}`, W) + b(\"│\"));\n console.log(b(\"│\") + pad(` Plan: ${config.badge}`, W) + b(\"│\"));\n console.log(b(\"│\") + \" \".repeat(W) + b(\"│\"));\n console.log(b(\"└\" + \"─\".repeat(W) + \"┘\"));\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(\"lynxp wizard\") + chalk.gray(\" - Interactive config wizard\"));\n console.log(chalk.green(\" ✓\") + \" \" + chalk.white(\"lynxp list\") + chalk.gray(\" - List your blueprints\"));\n console.log(chalk.green(\" ✓\") + \" \" + chalk.white(\"lynxp pull <id>\") + chalk.gray(\" - Download blueprints\"));\n console.log(chalk.green(\" ✓\") + \" \" + chalk.white(\"lynxp push\") + chalk.gray(\" - Upload blueprints to marketplace\"));\n console.log(chalk.green(\" ✓\") + \" \" + chalk.white(\"lynxp link\") + chalk.gray(\" - Link project to blueprint\"));\n console.log(chalk.green(\" ✓\") + \" \" + chalk.white(\"lynxp diff\") + chalk.gray(\" - Compare local vs cloud\"));\n console.log(chalk.green(\" ✓\") + \" \" + chalk.white(\"lynxp whoami\") + chalk.gray(\" - Show account info\"));\n console.log(chalk.green(\" ✓\") + \" \" + chalk.white(\"lynxp logout\") + chalk.gray(\" - Sign out of CLI\"));\n \n // Plan-specific features - Teams users get extra features\n if (effectivePlan === \"TEAMS\") {\n console.log();\n console.log(chalk.cyan(\" ⚡\") + \" \" + chalk.white(\"AI-powered editing\") + chalk.gray(\" - AI assistant for configs\"));\n console.log(chalk.cyan(\" 👥\") + \" \" + chalk.white(\"Team blueprints\") + chalk.gray(\" - Share with your team\"));\n console.log(chalk.cyan(\" 👥\") + \" \" + chalk.white(\"SSO integration\") + chalk.gray(\" - Enterprise authentication\"));\n }\n \n console.log();\n console.log(chalk.gray(\"Token stored securely. Run \") + chalk.cyan(\"lynxp --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 // Hierarchy fields for monorepo AGENTS.md support\n hierarchy_id?: string | null;\n parent_id?: string | null;\n repository_path?: string | null;\n content_checksum?: string | null;\n}\n\nexport interface Hierarchy {\n id: string;\n name: string;\n description: string | null;\n repository_root: string;\n blueprint_count?: number;\n created_at: string;\n updated_at: string;\n}\n\nexport interface HierarchyDetail extends Hierarchy {\n blueprints: Blueprint[];\n tree: BlueprintTreeNode[];\n total_blueprints: number;\n}\n\nexport interface BlueprintTreeNode extends Blueprint {\n children: BlueprintTreeNode[];\n}\n\nexport interface HierarchiesResponse {\n hierarchies: Hierarchy[];\n total: number;\n limit: number;\n offset: number;\n has_more: boolean;\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 (standard blueprint IDs)\n // - usr_xxx (legacy prefix, still supported)\n // - plain ID (needs bp_ prefix for v1 API)\n \n // Ensure bp_ prefix for v1 API (supports both bp_ and usr_ on server)\n let apiId = id;\n if (!id.startsWith(\"bp_\") && !id.startsWith(\"usr_\")) {\n apiId = `bp_${id}`;\n }\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 // Hierarchy fields for monorepo AGENTS.md support\n hierarchy_id?: string | null;\n parent_id?: string | null;\n repository_path?: string | null;\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 expected_checksum?: string; // For optimistic locking\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 // Hierarchy endpoints\n async listHierarchies(options: {\n limit?: number;\n offset?: number;\n } = {}): Promise<HierarchiesResponse> {\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\n const query = params.toString();\n return this.request<HierarchiesResponse>(\n `/api/v1/hierarchies${query ? `?${query}` : \"\"}`\n );\n }\n\n async getHierarchy(id: string): Promise<{ hierarchy: Hierarchy; blueprints: Blueprint[]; tree: BlueprintTreeNode[]; total_blueprints: number }> {\n // Ensure ha_ prefix for hierarchy IDs\n let apiId = id;\n if (!id.startsWith(\"ha_\")) {\n apiId = `ha_${id}`;\n }\n return this.request<{ hierarchy: Hierarchy; blueprints: Blueprint[]; tree: BlueprintTreeNode[]; total_blueprints: number }>(`/api/v1/hierarchies/${apiId}`);\n }\n\n async createHierarchy(data: {\n name: string;\n repository_root: string;\n description?: string;\n }): Promise<{ hierarchy: Hierarchy }> {\n return this.request<{ hierarchy: Hierarchy }>(\"/api/v1/hierarchies\", {\n method: \"POST\",\n body: JSON.stringify(data),\n });\n }\n\n async deleteHierarchy(id: string): Promise<{ success: boolean; message: string }> {\n const apiId = id.startsWith(\"ha_\") ? id : `ha_${id}`;\n return this.request<{ success: boolean; message: string }>(`/api/v1/hierarchies/${apiId}`, {\n method: \"DELETE\",\n });\n }\n\n // AI endpoints\n async aiEditBlueprint(data: {\n content?: string;\n instruction: string;\n mode: \"blueprint\" | \"wizard\";\n }): Promise<{ content: string; usage?: object }> {\n return this.request<{ content: string; usage?: object }>(\"/api/ai/edit-blueprint\", {\n method: \"POST\",\n body: JSON.stringify(data),\n });\n }\n\n // User preferences endpoints\n async saveWizardPreferences(data: {\n commands?: Record<string, string | string[]>;\n codeStyle?: {\n naming?: string;\n errorHandling?: string;\n loggingConventions?: string;\n loggingConventionsOther?: string;\n notes?: string;\n };\n boundaries?: {\n always?: string[];\n never?: string[];\n ask?: string[];\n };\n testing?: {\n levels?: string[];\n frameworks?: string[];\n coverage?: number;\n notes?: string;\n };\n }): Promise<{ saved: number }> {\n // Convert structured data to the array format expected by the API\n const preferences: Array<{ category: string; key: string; value: string; isDefault?: boolean }> = [];\n\n // Commands\n if (data.commands) {\n for (const [key, value] of Object.entries(data.commands)) {\n const strValue = Array.isArray(value) ? value.join(\", \") : value;\n if (strValue) {\n preferences.push({ category: \"commands\", key, value: strValue, isDefault: true });\n }\n }\n }\n\n // Code style\n if (data.codeStyle) {\n if (data.codeStyle.naming) {\n preferences.push({ category: \"code_style\", key: \"naming\", value: data.codeStyle.naming, isDefault: true });\n }\n if (data.codeStyle.errorHandling) {\n preferences.push({ category: \"code_style\", key: \"errorHandling\", value: data.codeStyle.errorHandling, isDefault: true });\n }\n if (data.codeStyle.loggingConventions) {\n preferences.push({ category: \"code_style\", key: \"loggingConventions\", value: data.codeStyle.loggingConventions, isDefault: true });\n }\n if (data.codeStyle.loggingConventionsOther) {\n preferences.push({ category: \"code_style\", key: \"loggingConventionsOther\", value: data.codeStyle.loggingConventionsOther, isDefault: true });\n }\n if (data.codeStyle.notes) {\n preferences.push({ category: \"code_style\", key: \"notes\", value: data.codeStyle.notes, isDefault: true });\n }\n }\n\n // Boundaries\n if (data.boundaries) {\n if (data.boundaries.always?.length) {\n preferences.push({ category: \"boundaries\", key: \"always\", value: JSON.stringify(data.boundaries.always), isDefault: true });\n }\n if (data.boundaries.never?.length) {\n preferences.push({ category: \"boundaries\", key: \"never\", value: JSON.stringify(data.boundaries.never), isDefault: true });\n }\n if (data.boundaries.ask?.length) {\n preferences.push({ category: \"boundaries\", key: \"ask\", value: JSON.stringify(data.boundaries.ask), isDefault: true });\n }\n }\n\n // Testing\n if (data.testing) {\n if (data.testing.levels?.length) {\n preferences.push({ category: \"testing\", key: \"levels\", value: JSON.stringify(data.testing.levels), isDefault: true });\n }\n if (data.testing.frameworks?.length) {\n preferences.push({ category: \"testing\", key: \"frameworks\", value: JSON.stringify(data.testing.frameworks), isDefault: true });\n }\n if (data.testing.coverage !== undefined) {\n preferences.push({ category: \"testing\", key: \"coverage\", value: String(data.testing.coverage), isDefault: true });\n }\n if (data.testing.notes) {\n preferences.push({ category: \"testing\", key: \"notes\", value: data.testing.notes, isDefault: true });\n }\n }\n\n if (preferences.length === 0) {\n return { saved: 0 };\n }\n\n return this.request<{ saved: number }>(\"/api/user/wizard-preferences\", {\n method: \"POST\",\n body: JSON.stringify(preferences),\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\n\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 error. Please check your subscription.\"));\n console.error(chalk.gray(\"Visit https://lynxprompt.com/pricing for plan details.\"));\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 TEAMS: chalk.cyan,\n };\n \n // Map legacy PRO/MAX to FREE display\n const displayPlan = plan === \"PRO\" || plan === \"MAX\" ? \"FREE\" : plan;\n const displayName = displayPlan === \"FREE\" ? \"Users\" : displayPlan;\n const colorFn = planColors[displayPlan] || chalk.white;\n return colorFn(displayName);\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(\"[Standard]\"),\n ADVANCED: chalk.cyan(\"[Advanced]\"),\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 error. Please check your subscription.\"));\n console.error(chalk.gray(\"Visit https://lynxprompt.com/pricing for plan details.\"));\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\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\n/**\n * Check if an ID is a hierarchy ID\n */\nfunction isHierarchyId(id: string): boolean {\n return id.startsWith(\"ha_\");\n}\n\nexport async function pullCommand(\n id: string,\n options: PullOptions\n): Promise<void> {\n // Check authentication - require login for API access\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 // Check if pulling a hierarchy\n if (isHierarchyId(id)) {\n await pullHierarchy(id, options);\n } else {\n await pullBlueprint(id, options);\n }\n}\n\n/**\n * Pull an entire hierarchy with all its blueprints\n */\nasync function pullHierarchy(\n id: string,\n options: PullOptions\n): Promise<void> {\n const cwd = process.cwd();\n const spinner = ora(`Fetching hierarchy ${chalk.cyan(id)}...`).start();\n\n try {\n const response = await api.getHierarchy(id);\n const { hierarchy, blueprints } = response;\n spinner.stop();\n\n console.log();\n console.log(chalk.cyan(`📁 Hierarchy: ${chalk.bold(hierarchy.name)}`));\n if (hierarchy.description) {\n console.log(chalk.gray(` ${hierarchy.description}`));\n }\n console.log(chalk.gray(` Repository: ${hierarchy.repository_root}`));\n console.log(chalk.gray(` Blueprints: ${blueprints.length}`));\n console.log();\n\n // Preview mode - show hierarchy structure without downloading\n if (options.preview) {\n console.log(chalk.yellow(\"📋 Hierarchy structure:\"));\n console.log();\n \n for (const bp of blueprints) {\n const indent = bp.parent_id ? \" ↳ \" : \" \";\n const path = bp.repository_path || TYPE_TO_FILENAME[bp.type] || \"unknown\";\n console.log(chalk.gray(`${indent}${path}`));\n console.log(chalk.gray(`${indent} └─ ${bp.name} (${bp.id})`));\n }\n \n console.log();\n console.log(chalk.gray(\"Run without --preview to download this hierarchy.\"));\n return;\n }\n\n // Confirm before downloading\n if (!options.yes && blueprints.length > 1) {\n const { proceed } = await prompts({\n type: \"confirm\",\n name: \"proceed\",\n message: `Download ${blueprints.length} blueprints to ${options.output}?`,\n initial: true,\n });\n if (!proceed) {\n console.log(chalk.gray(\"Cancelled.\"));\n return;\n }\n }\n\n console.log(chalk.cyan(\"📥 Downloading blueprints...\"));\n console.log();\n\n let downloaded = 0;\n let skipped = 0;\n\n for (const bp of blueprints) {\n // Determine output path - use repository_path if available\n const filename = bp.repository_path || TYPE_TO_FILENAME[bp.type] || \"ai-config.md\";\n const outputPath = join(options.output, filename);\n\n // Check if file exists\n if (existsSync(outputPath) && !options.yes) {\n const { overwrite } = await prompts({\n type: \"confirm\",\n name: \"overwrite\",\n message: `File exists: ${filename}. Overwrite?`,\n initial: false,\n });\n if (!overwrite) {\n console.log(chalk.gray(` ⏭ Skipped: ${filename}`));\n skipped++;\n continue;\n }\n }\n\n // Fetch full blueprint content\n const { blueprint } = await api.getBlueprint(bp.id);\n \n if (!blueprint.content) {\n console.log(chalk.yellow(` ⚠ No content: ${filename}`));\n skipped++;\n continue;\n }\n\n // Create directory if needed\n const dir = dirname(outputPath);\n if (dir !== \".\" && dir !== options.output) {\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 with hierarchy info\n if (options.track !== false) {\n const source = getSourceFromVisibility(blueprint.visibility);\n await trackBlueprint(cwd, {\n id: blueprint.id,\n name: blueprint.name,\n file: filename,\n content: blueprint.content,\n source,\n hierarchyId: id,\n hierarchyName: hierarchy.name,\n repositoryPath: bp.repository_path || undefined,\n });\n }\n\n console.log(chalk.green(` ✓ ${filename}`));\n downloaded++;\n }\n\n console.log();\n console.log(chalk.green(`✅ Downloaded ${downloaded} blueprint(s)`));\n if (skipped > 0) {\n console.log(chalk.gray(` Skipped: ${skipped}`));\n }\n console.log();\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 sync' to push local changes`));\n console.log(chalk.gray(` • Run 'lynxp pull ${id}' again to refresh all files`));\n console.log();\n } catch (error) {\n spinner.fail(\"Failed to pull hierarchy\");\n handleApiError(error);\n }\n}\n\n/**\n * Pull a single blueprint\n */\nasync function pullBlueprint(\n id: string,\n options: PullOptions\n): Promise<void> {\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 hierarchy info if present\n if (blueprint.hierarchy_id) {\n console.log(chalk.blue(` 📁 Part of hierarchy: ${blueprint.hierarchy_id}`));\n if (blueprint.repository_path) {\n console.log(chalk.gray(` Path in hierarchy: ${blueprint.repository_path}`));\n }\n }\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 - use repository_path if available for hierarchy blueprints\n const filename = blueprint.repository_path || 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 hierarchyId: blueprint.hierarchy_id || undefined,\n repositoryPath: blueprint.repository_path || undefined,\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 (blueprint.content_checksum) {\n console.log(chalk.gray(` Checksum: ${blueprint.content_checksum}`));\n }\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 or hierarchy.\")\n );\n console.error(\n chalk.gray(\n \" This might be a private resource or require a higher subscription tier.\"\n )\n );\n } else if (error.statusCode === 404) {\n console.error(chalk.red(\"✗ Blueprint or hierarchy not found.\"));\n console.error(\n chalk.gray(\n \" Make sure you have the correct ID. Use 'lynxp list' or 'lynxp hierarchies' to see your resources.\"\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 // Hierarchy info (optional)\n hierarchyId?: string; // Hierarchy ID (e.g., ha_xyz789)\n hierarchyName?: string; // Hierarchy name for display\n repositoryPath?: string; // Path within hierarchy (e.g., \"packages/core/AGENTS.md\")\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 hierarchyId?: string;\n hierarchyName?: string;\n repositoryPath?: 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 hierarchyId: blueprint.hierarchyId,\n hierarchyName: blueprint.hierarchyName,\n repositoryPath: blueprint.repositoryPath,\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\n\n\n\n\n\n","import chalk from \"chalk\";\nimport ora from \"ora\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport { createHash } from \"crypto\";\nimport prompts from \"prompts\";\nimport { api, ApiRequestError } from \"../api.js\";\nimport { isAuthenticated } from \"../config.js\";\nimport {\n findBlueprintByFile,\n trackBlueprint,\n updateChecksum,\n loadBlueprints,\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 force?: boolean;\n}\n\ninterface HierarchyInfo {\n repositoryPath: string | null;\n hierarchyId: string | null;\n parentId: string | null;\n repositoryRoot: string; // Used to create/find hierarchy\n}\n\ninterface DiscoveredFile {\n path: string; // Relative path from cwd\n absolutePath: string;\n isRoot: boolean; // Is this the root AGENTS.md?\n}\n\n/**\n * Scan for AGENTS.md files in current directory and subdirectories\n */\nfunction scanForAgentFiles(cwd: string, maxDepth: number = 5): DiscoveredFile[] {\n const results: DiscoveredFile[] = [];\n \n function scan(dir: string, depth: number) {\n if (depth > maxDepth) return;\n \n try {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n \n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n \n // Skip common non-project directories\n if (entry.isDirectory()) {\n if ([\"node_modules\", \".git\", \"dist\", \"build\", \".next\", \"__pycache__\", \"venv\", \".venv\"].includes(entry.name)) {\n continue;\n }\n scan(fullPath, depth + 1);\n } else if (entry.name === \"AGENTS.md\") {\n const relativePath = path.relative(cwd, fullPath);\n results.push({\n path: relativePath,\n absolutePath: fullPath,\n isRoot: relativePath === \"AGENTS.md\",\n });\n }\n }\n } catch {\n // Ignore directories we can't read\n }\n }\n \n scan(cwd, 0);\n \n // Sort: root first, then alphabetically by path\n results.sort((a, b) => {\n if (a.isRoot && !b.isRoot) return -1;\n if (!a.isRoot && b.isRoot) return 1;\n return a.path.localeCompare(b.path);\n });\n \n return results;\n}\n\n/**\n * Detect hierarchy info for a file being pushed\n * Creates or gets a hierarchy for the repository\n */\nasync function detectHierarchyInfo(cwd: string, file: string): Promise<HierarchyInfo> {\n const repositoryRoot = createRepositoryRoot(cwd);\n const result: HierarchyInfo = {\n repositoryPath: null,\n hierarchyId: null,\n parentId: null,\n repositoryRoot,\n };\n\n try {\n const relativePath = path.relative(cwd, path.resolve(file));\n \n // Check if file is in a subdirectory (potential monorepo child)\n if (relativePath.includes(path.sep) && !relativePath.startsWith(\"..\")) {\n result.repositoryPath = relativePath;\n \n // Check if there's an AGENTS.md at the root that was already pushed\n const rootAgentsMd = path.join(cwd, \"AGENTS.md\");\n if (fs.existsSync(rootAgentsMd) && path.resolve(file) !== rootAgentsMd) {\n const blueprints = await loadBlueprints(cwd);\n const parentBlueprint = blueprints.blueprints.find(\n b => b.file === \"AGENTS.md\"\n );\n if (parentBlueprint) {\n result.parentId = parentBlueprint.id;\n }\n }\n } else if (relativePath === \"AGENTS.md\" || relativePath === path.basename(file)) {\n // Root-level file\n result.repositoryPath = relativePath;\n }\n } catch {\n // Silently fail - hierarchy detection is optional\n }\n\n return result;\n}\n\n/**\n * Ensure a hierarchy exists for the repository and return its ID\n */\nasync function ensureHierarchy(_cwd: string, repositoryRoot: string, name: string): Promise<string | null> {\n try {\n // Try to create or get existing hierarchy\n const response = await api.createHierarchy({\n name,\n repository_root: repositoryRoot,\n });\n return response.hierarchy.id;\n } catch (error) {\n // If it fails, hierarchy feature might not be available\n console.log(chalk.gray(\" Note: Hierarchy creation skipped\"));\n return null;\n }\n}\n\n/**\n * Create a stable repository root identifier from a path\n */\nfunction createRepositoryRoot(rootPath: string): string {\n // Try to get git remote URL first\n try {\n const gitConfigPath = path.join(rootPath, \".git\", \"config\");\n if (fs.existsSync(gitConfigPath)) {\n const gitConfig = fs.readFileSync(gitConfigPath, \"utf-8\");\n const urlMatch = gitConfig.match(/url = (.+)/);\n if (urlMatch) {\n // Hash the git URL for consistent identification\n return createHash(\"sha256\").update(urlMatch[1].trim()).digest(\"hex\").substring(0, 16);\n }\n }\n } catch {\n // Fall through to path-based hashing\n }\n \n // Fall back to hashing the absolute path\n return createHash(\"sha256\").update(path.resolve(rootPath)).digest(\"hex\").substring(0, 16);\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, linked.checksum);\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 expectedChecksum?: string\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 updateData: { content: string; expected_checksum?: string } = { content };\n \n // Include expected checksum for optimistic locking (unless force)\n if (expectedChecksum && !options.force) {\n updateData.expected_checksum = expectedChecksum;\n }\n\n const result = await api.updateBlueprint(blueprintId, updateData);\n spinner.succeed(\"Blueprint updated!\");\n\n // Update local tracking with new checksum\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 if (result.blueprint.content_checksum) {\n console.log(chalk.gray(` Checksum: ${result.blueprint.content_checksum}`));\n }\n console.log(chalk.gray(` View: https://lynxprompt.com/templates/${blueprintId.replace(\"bp_\", \"\")}`));\n } catch (error) {\n spinner.fail(\"Failed to update blueprint\");\n \n // Handle optimistic locking conflict\n if (error instanceof ApiRequestError && error.statusCode === 409) {\n console.log();\n console.log(chalk.yellow(\"⚠ Conflict: The blueprint has been modified since you last pulled it.\"));\n console.log(chalk.gray(\" Someone else may have pushed changes.\"));\n console.log();\n console.log(chalk.gray(\"Options:\"));\n console.log(chalk.gray(\" 1. Run 'lynxp pull \" + blueprintId + \"' to get the latest version\"));\n console.log(chalk.gray(\" 2. Run 'lynxp push --force' to overwrite remote changes\"));\n process.exit(1);\n }\n \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 // Check if pushing AGENTS.md and scan for more AGENTS.md files\n const isAgentsMd = filename === \"AGENTS.md\";\n \n if (isAgentsMd) {\n const discoveredFiles = scanForAgentFiles(cwd);\n \n // If we found multiple AGENTS.md files, offer to create hierarchy\n if (discoveredFiles.length > 1) {\n console.log();\n console.log(chalk.cyan(`📁 Found ${discoveredFiles.length} AGENTS.md files:`));\n console.log();\n for (const f of discoveredFiles) {\n const icon = f.isRoot ? \"📄\" : \" └─\";\n console.log(chalk.gray(` ${icon} ${f.path}`));\n }\n console.log();\n \n let shouldCreateHierarchy = options.yes; // Auto-create if -y flag\n \n if (!options.yes) {\n const { createHierarchy } = await prompts({\n type: \"confirm\",\n name: \"createHierarchy\",\n message: `Create a hierarchy with all ${discoveredFiles.length} AGENTS.md files?`,\n initial: true,\n });\n shouldCreateHierarchy = createHierarchy;\n } else {\n console.log(chalk.cyan(`Auto-creating hierarchy with ${discoveredFiles.length} files...`));\n }\n \n if (shouldCreateHierarchy) {\n await pushHierarchy(cwd, discoveredFiles, options);\n return;\n }\n \n console.log(chalk.gray(\"Proceeding with single file push...\"));\n }\n }\n\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 // Detect hierarchy info for monorepo support\n const hierarchyInfo = await detectHierarchyInfo(cwd, file);\n \n // If we have hierarchy info, ensure a hierarchy exists\n let hierarchyId: string | null = null;\n if (hierarchyInfo.repositoryPath) {\n hierarchyId = await ensureHierarchy(cwd, hierarchyInfo.repositoryRoot, path.basename(cwd));\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 // Include hierarchy info if detected\n hierarchy_id: hierarchyId,\n parent_id: hierarchyInfo.parentId,\n repository_path: hierarchyInfo.repositoryPath,\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 hierarchyId: hierarchyId || undefined,\n repositoryPath: hierarchyInfo.repositoryPath || undefined,\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 (hierarchyInfo.repositoryPath) {\n console.log(chalk.gray(` Path: ${hierarchyInfo.repositoryPath}`));\n }\n if (result.blueprint.hierarchy_id) {\n console.log(chalk.gray(` Hierarchy: ${result.blueprint.hierarchy_id}`));\n }\n if (hierarchyInfo.parentId) {\n console.log(chalk.cyan(` ↳ Linked to parent blueprint: ${hierarchyInfo.parentId}`));\n }\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\n/**\n * Push multiple AGENTS.md files as a hierarchy\n */\nasync function pushHierarchy(\n cwd: string,\n files: DiscoveredFile[],\n options: PushOptions\n): Promise<void> {\n // Get hierarchy name\n let hierarchyName = options.name || path.basename(cwd);\n let visibility = options.visibility || \"PRIVATE\";\n \n if (!options.yes) {\n const responses = await prompts([\n {\n type: \"text\",\n name: \"name\",\n message: \"Hierarchy name:\",\n initial: hierarchyName,\n validate: (v) => v.length > 0 || \"Name is required\",\n },\n {\n type: \"select\",\n name: \"visibility\",\n message: \"Visibility for all blueprints:\",\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 \n if (!responses.name) {\n console.log(chalk.yellow(\"Push cancelled.\"));\n return;\n }\n \n hierarchyName = responses.name;\n visibility = responses.visibility || visibility;\n }\n \n console.log();\n console.log(chalk.cyan(`📁 Creating hierarchy \"${hierarchyName}\" with ${files.length} files...`));\n console.log();\n \n // Create repository root identifier\n const repositoryRoot = createRepositoryRoot(cwd);\n \n // Create hierarchy first\n let hierarchyId: string;\n try {\n const hierarchyResponse = await api.createHierarchy({\n name: hierarchyName,\n repository_root: repositoryRoot,\n });\n hierarchyId = hierarchyResponse.hierarchy.id;\n console.log(chalk.green(`✓ Created hierarchy: ${hierarchyId}`));\n } catch (error) {\n console.log(chalk.red(\"Failed to create hierarchy\"));\n handleError(error);\n return;\n }\n \n // Upload each file\n let rootBlueprintId: string | null = null;\n let successCount = 0;\n let failCount = 0;\n \n for (const file of files) {\n const spinner = ora(`Uploading ${file.path}...`).start();\n \n try {\n const content = fs.readFileSync(file.absolutePath, \"utf-8\");\n \n // Generate name from path\n let blueprintName: string;\n if (file.isRoot) {\n blueprintName = hierarchyName;\n } else {\n // Use folder name or derive from path\n const dirname = path.dirname(file.path);\n blueprintName = dirname.replace(/[/\\\\]/g, \" / \");\n }\n \n const result = await api.createBlueprint({\n name: blueprintName,\n description: \"\",\n content,\n visibility: visibility as \"PRIVATE\" | \"TEAM\" | \"PUBLIC\",\n tags: [],\n hierarchy_id: hierarchyId,\n parent_id: file.isRoot ? null : rootBlueprintId,\n repository_path: file.path,\n });\n \n // Track root blueprint ID for linking children\n if (file.isRoot) {\n rootBlueprintId = result.blueprint.id;\n }\n \n // Track locally\n await trackBlueprint(cwd, {\n id: result.blueprint.id,\n name: blueprintName,\n file: file.path,\n content,\n source: \"private\",\n hierarchyId,\n hierarchyName,\n repositoryPath: file.path,\n });\n \n spinner.succeed(`${file.path} → ${result.blueprint.id}`);\n successCount++;\n } catch (error) {\n spinner.fail(`${file.path} failed`);\n if (error instanceof ApiRequestError) {\n console.log(chalk.red(` Error: ${error.message}`));\n }\n failCount++;\n }\n }\n \n console.log();\n console.log(chalk.green(`✅ Hierarchy created successfully!`));\n console.log(chalk.gray(` Hierarchy: ${hierarchyId}`));\n console.log(chalk.gray(` Name: ${hierarchyName}`));\n console.log(chalk.gray(` Blueprints: ${successCount} uploaded${failCount > 0 ? `, ${failCount} failed` : \"\"}`));\n console.log();\n console.log(chalk.cyan(\"Tips:\"));\n console.log(chalk.gray(` • Run 'lynxp status' to see all tracked blueprints`));\n console.log(chalk.gray(` • Run 'lynxp pull ${hierarchyId}' to download the entire hierarchy`));\n console.log(chalk.gray(` • Run 'lynxp push' in any subfolder to update individual blueprints`));\n console.log();\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 * as readline from \"readline\";\nimport * as os from \"os\";\nimport { writeFile, mkdir, access, readFile } from \"fs/promises\";\nimport { join, dirname } from \"path\";\nimport { detectProject, detectFromRemoteUrl, isGitUrl } from \"../utils/detect.js\";\nimport { generateConfig, GenerateOptions, parseVariablesString } from \"../utils/generator.js\";\nimport { isAuthenticated, getUser } from \"../config.js\";\nimport { api, ApiRequestError } from \"../api.js\";\n\n// Draft management - local storage in .lynxprompt/drafts/\nconst DRAFTS_DIR = \".lynxprompt/drafts\";\n\n// CLI version injected at build time via tsup.config.ts\n// Falls back to \"unknown\" if not defined (shouldn't happen in production builds)\nconst CLI_VERSION: string = process.env.CLI_VERSION || \"unknown\";\n\ninterface WizardDraft {\n name: string;\n savedAt: string;\n config: Record<string, unknown>;\n stepReached?: number;\n // Version tracking - added to detect draft/tool version mismatches\n source: \"cli\" | \"web\";\n version: string;\n}\n\nasync function saveDraftLocally(name: string, config: Record<string, unknown>, stepReached?: number): Promise<void> {\n const draftsPath = join(process.cwd(), DRAFTS_DIR);\n await mkdir(draftsPath, { recursive: true });\n \n const draft: WizardDraft = {\n name,\n savedAt: new Date().toISOString(),\n config,\n stepReached,\n source: \"cli\",\n version: CLI_VERSION,\n };\n \n const filename = `${name.replace(/[^a-zA-Z0-9-_]/g, \"_\")}.json`;\n await writeFile(join(draftsPath, filename), JSON.stringify(draft, null, 2), \"utf-8\");\n}\n\nasync function loadDraftLocally(name: string): Promise<WizardDraft | null> {\n try {\n const filename = `${name.replace(/[^a-zA-Z0-9-_]/g, \"_\")}.json`;\n const filepath = join(process.cwd(), DRAFTS_DIR, filename);\n const content = await readFile(filepath, \"utf-8\");\n return JSON.parse(content);\n } catch {\n return null;\n }\n}\n\nasync function listLocalDrafts(): Promise<string[]> {\n try {\n const draftsPath = join(process.cwd(), DRAFTS_DIR);\n await access(draftsPath);\n const files = await import(\"fs/promises\").then(fs => fs.readdir(draftsPath));\n return files\n .filter(f => f.endsWith(\".json\"))\n .map(f => f.replace(\".json\", \"\"));\n } catch {\n return [];\n }\n}\n\n// File paths for static files detection\nconst STATIC_FILE_PATHS: Record<string, string> = {\n editorconfig: \".editorconfig\",\n contributing: \"CONTRIBUTING.md\",\n codeOfConduct: \"CODE_OF_CONDUCT.md\",\n security: \"SECURITY.md\",\n roadmap: \"ROADMAP.md\",\n gitignore: \".gitignore\",\n funding: \".github/FUNDING.yml\",\n license: \"LICENSE\",\n readme: \"README.md\",\n architecture: \"ARCHITECTURE.md\",\n changelog: \"CHANGELOG.md\",\n};\n\n// Check if a file exists and read its content\nasync function readExistingFile(filePath: string): Promise<string | null> {\n try {\n await access(filePath);\n const content = await readFile(filePath, \"utf-8\");\n return content;\n } catch {\n return null;\n }\n}\n\n// Multi-line input reader using EOF terminator\nasync function readMultilineInput(prompt: string): Promise<string> {\n console.log(chalk.white(prompt));\n console.log(chalk.gray(\" (Paste your content, then type EOF on a new line and press Enter to finish)\"));\n console.log(chalk.gray(\" (Press Enter twice to skip)\"));\n console.log();\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n const lines: string[] = [];\n let emptyLineCount = 0;\n\n rl.on(\"line\", (line) => {\n if (line.trim() === \"EOF\") {\n rl.close();\n resolve(lines.join(\"\\n\"));\n return;\n }\n \n if (line === \"\") {\n emptyLineCount++;\n if (emptyLineCount >= 2 && lines.length === 0) {\n // Two empty lines at start = skip\n rl.close();\n resolve(\"\");\n return;\n }\n } else {\n emptyLineCount = 0;\n }\n \n lines.push(line);\n });\n\n rl.on(\"close\", () => {\n resolve(lines.join(\"\\n\"));\n });\n });\n}\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 // New options\n output?: string;\n repoUrl?: string;\n blueprint?: boolean;\n license?: string;\n ciCd?: string;\n projectType?: string;\n detectOnly?: boolean;\n loadDraft?: string;\n saveDraft?: string;\n vars?: string;\n // Internal: for resuming from a draft\n _resumeFromStep?: number;\n _draftAnswers?: Record<string, unknown>;\n}\n\n// User tier levels - simplified to just Users and Teams\ntype UserTier = \"users\" | \"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: \"security\", title: \"Security\", icon: \"🔐\", tier: \"basic\" }, // NEW: Security step (FREE)\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/**\n * All supported platforms (30+ and growing!)\n * \n * IMPORTANT: Keep in sync with src/lib/platforms.ts (the single source of truth)\n * When adding new platforms, update both files!\n */\nconst ALL_PLATFORMS = [\n // Popular platforms\n { id: \"universal\", name: \"Universal (AGENTS.md)\", file: \"AGENTS.md\", icon: \"🌐\", note: \"Works with Claude Code, Copilot, Aider, and many others\" },\n { id: \"cursor\", name: \"Cursor\", file: \".cursor/rules/\", icon: \"⚡\", note: \"AI-powered code editor with native rules\" },\n { id: \"claude\", name: \"Claude Code\", file: \"CLAUDE.md\", icon: \"🧠\", note: \"Anthropic's agentic coding tool\" },\n { id: \"copilot\", name: \"GitHub Copilot\", file: \".github/copilot-instructions.md\", icon: \"🐙\", note: \"GitHub's AI pair programmer\" },\n { id: \"windsurf\", name: \"Windsurf\", file: \".windsurfrules\", icon: \"🏄\", note: \"Codeium's AI-native IDE\" },\n // AI IDEs\n { id: \"antigravity\", name: \"Antigravity\", file: \"GEMINI.md\", icon: \"💎\", note: \"Google's Gemini-powered IDE\" },\n { id: \"zed\", name: \"Zed\", file: \".zed/instructions.md\", icon: \"⚡\", note: \"High-performance editor with AI\" },\n { id: \"void\", name: \"Void\", file: \".void/config.json\", icon: \"🕳️\", note: \"Open-source Cursor alternative\" },\n { id: \"trae\", name: \"Trae AI\", file: \".trae/rules/\", icon: \"🔷\", note: \"ByteDance's AI IDE\" },\n { id: \"firebase\", name: \"Firebase Studio\", file: \".idx/\", icon: \"🔥\", note: \"Google's cloud IDE\" },\n // Editor extensions\n { id: \"cline\", name: \"Cline\", file: \".clinerules\", icon: \"🔧\", note: \"Autonomous coding agent for VS Code\" },\n { id: \"roocode\", name: \"Roo Code\", file: \".roo/rules/\", icon: \"🦘\", note: \"AI coding assistant for VS Code\" },\n { id: \"continue\", name: \"Continue\", file: \".continue/config.json\", icon: \"➡️\", note: \"Open-source AI autopilot\" },\n { id: \"cody\", name: \"Sourcegraph Cody\", file: \".cody/config.json\", icon: \"🔍\", note: \"Context-aware 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 code completions\" },\n { id: \"codegpt\", name: \"CodeGPT\", file: \".codegpt/config.json\", icon: \"💬\", note: \"VS Code AI assistant\" },\n { id: \"amazonq\", name: \"Amazon Q\", file: \".amazonq/rules/\", icon: \"📦\", note: \"AWS AI coding companion\" },\n { id: \"augment\", name: \"Augment Code\", file: \".augment/rules/\", icon: \"🔮\", note: \"AI code augmentation\" },\n { id: \"kilocode\", name: \"Kilo Code\", file: \".kilocode/rules/\", icon: \"📊\", note: \"AI code generation\" },\n { id: \"junie\", name: \"Junie\", file: \".junie/guidelines.md\", icon: \"🎯\", note: \"JetBrains AI assistant\" },\n { id: \"kiro\", name: \"Kiro\", file: \".kiro/steering/\", icon: \"🚀\", note: \"AWS spec-driven agent\" },\n // CLI tools\n { id: \"aider\", name: \"Aider\", file: \"AIDER.md\", icon: \"🤖\", note: \"AI pair programming in terminal\" },\n { id: \"goose\", name: \"Goose\", file: \".goosehints\", icon: \"🪿\", note: \"Block's AI coding agent\" },\n { id: \"warp\", name: \"Warp AI\", file: \"WARP.md\", icon: \"🚀\", note: \"AI-powered terminal\" },\n { id: \"gemini-cli\", name: \"Gemini CLI\", file: \"GEMINI.md\", icon: \"💎\", note: \"Google's Gemini in terminal\" },\n { id: \"opencode\", name: \"Open Code\", file: \"opencode.json\", icon: \"🔓\", note: \"Open-source AI coding\" },\n // Other\n { id: \"openhands\", name: \"OpenHands\", file: \".openhands/microagents/repo.md\", icon: \"🤲\", note: \"Open-source AI agent\" },\n { id: \"crush\", name: \"Crush\", file: \"CRUSH.md\", icon: \"💥\", note: \"AI coding assistant\" },\n { id: \"firebender\", name: \"Firebender\", file: \"firebender.json\", icon: \"🔥\", note: \"AI code transformation\" },\n];\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// Package managers (JS/TS only)\nconst PACKAGE_MANAGERS = [\n { title: \"📦 npm\", value: \"npm\", desc: \"Node Package Manager (default)\" },\n { title: \"🧶 Yarn\", value: \"yarn\", desc: \"Fast, reliable, and secure\" },\n { title: \"📀 pnpm\", value: \"pnpm\", desc: \"Fast, disk space efficient\" },\n { title: \"🥟 Bun\", value: \"bun\", desc: \"All-in-one JS runtime + PM\" },\n];\n\n// JS/TS Runtimes\nconst JS_RUNTIMES = [\n { title: \"🟢 Node.js\", value: \"node\", desc: \"Standard JavaScript runtime\" },\n { title: \"🦕 Deno\", value: \"deno\", desc: \"Secure runtime with TypeScript\" },\n { title: \"🥟 Bun\", value: \"bun\", desc: \"Fast all-in-one JS runtime\" },\n];\n\n// Monorepo tools\nconst MONOREPO_TOOLS = [\n { title: \"📁 None\", value: \"\", desc: \"Single package repository\" },\n { title: \"⚡ Turborepo\", value: \"turborepo\", desc: \"High-performance build system\" },\n { title: \"🔷 Nx\", value: \"nx\", desc: \"Smart, extensible build framework\" },\n { title: \"🐉 Lerna\", value: \"lerna\", desc: \"Multi-package repositories\" },\n { title: \"📀 pnpm Workspaces\", value: \"pnpm_workspaces\", desc: \"Native pnpm monorepo\" },\n { title: \"🧶 Yarn Workspaces\", value: \"yarn_workspaces\", desc: \"Native Yarn monorepo\" },\n { title: \"📦 npm Workspaces\", value: \"npm_workspaces\", desc: \"Native npm monorepo\" },\n];\n\n// ORMs by language\nconst ORM_OPTIONS = [\n { title: \"📝 None / Raw SQL\", value: \"\", langs: [] },\n // JavaScript/TypeScript\n { title: \"🔷 Prisma\", value: \"prisma\", langs: [\"javascript\", \"typescript\"] },\n { title: \"💧 Drizzle\", value: \"drizzle\", langs: [\"javascript\", \"typescript\"] },\n { title: \"🔶 TypeORM\", value: \"typeorm\", langs: [\"javascript\", \"typescript\"] },\n { title: \"📘 Sequelize\", value: \"sequelize\", langs: [\"javascript\", \"typescript\"] },\n { title: \"🔧 Knex.js\", value: \"knex\", langs: [\"javascript\", \"typescript\"] },\n { title: \"🎯 Kysely\", value: \"kysely\", langs: [\"javascript\", \"typescript\"] },\n // Python\n { title: \"🐍 SQLAlchemy\", value: \"sqlalchemy\", langs: [\"python\"] },\n { title: \"🎸 Django ORM\", value: \"django_orm\", langs: [\"python\"] },\n { title: \"🐢 Tortoise ORM\", value: \"tortoise\", langs: [\"python\"] },\n { title: \"⚡ SQLModel\", value: \"sqlmodel\", langs: [\"python\"] },\n // Go\n { title: \"🐹 GORM\", value: \"gorm\", langs: [\"go\"] },\n { title: \"🏗️ Ent\", value: \"ent\", langs: [\"go\"] },\n { title: \"📝 sqlc\", value: \"sqlc\", langs: [\"go\"] },\n // Rust\n { title: \"🦀 Diesel\", value: \"diesel\", langs: [\"rust\"] },\n { title: \"🌊 SeaORM\", value: \"sea-orm\", langs: [\"rust\"] },\n { title: \"📦 SQLx\", value: \"sqlx\", langs: [\"rust\"] },\n // Java/Kotlin\n { title: \"☕ Hibernate\", value: \"hibernate\", langs: [\"java\", \"kotlin\"] },\n { title: \"🎵 jOOQ\", value: \"jooq\", langs: [\"java\", \"kotlin\"] },\n // .NET\n { title: \"🔷 Entity Framework\", value: \"ef_core\", langs: [\"csharp\"] },\n { title: \"⚡ Dapper\", value: \"dapper\", langs: [\"csharp\"] },\n // Ruby\n { title: \"💎 ActiveRecord\", value: \"activerecord\", langs: [\"ruby\"] },\n // PHP\n { title: \"🐘 Eloquent\", value: \"eloquent\", langs: [\"php\"] },\n { title: \"📖 Doctrine\", value: \"doctrine\", langs: [\"php\"] },\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// CI/CD platforms\nconst CICD_OPTIONS = [\n { id: \"github_actions\", label: \"GitHub Actions\", icon: \"🐙\" },\n { id: \"gitlab_ci\", label: \"GitLab CI\", icon: \"🦊\" },\n { id: \"jenkins\", label: \"Jenkins\", icon: \"🔧\" },\n { id: \"circleci\", label: \"CircleCI\", icon: \"⚫\" },\n { id: \"travis\", label: \"Travis CI\", icon: \"🔨\" },\n { id: \"azure_devops\", label: \"Azure DevOps\", icon: \"☁️\" },\n { id: \"bitbucket\", label: \"Bitbucket Pipelines\", icon: \"🪣\" },\n { id: \"teamcity\", label: \"TeamCity\", icon: \"🏢\" },\n { id: \"drone\", label: \"Drone\", icon: \"🚁\" },\n { id: \"buildkite\", label: \"Buildkite\", icon: \"🧱\" },\n];\n\n// Deployment targets - ensure consistent icon spacing\nconst DEPLOYMENT_TARGETS = [\n { id: \"vercel\", label: \"Vercel\", icon: \"▲ \" },\n { id: \"netlify\", label: \"Netlify\", icon: \"🌐\" },\n { id: \"aws\", label: \"AWS\", icon: \"☁️ \" },\n { id: \"gcp\", label: \"Google Cloud\", icon: \"🌈\" },\n { id: \"azure\", label: \"Azure\", icon: \"🔷\" },\n { id: \"docker\", label: \"Docker\", icon: \"🐳\" },\n { id: \"kubernetes\", label: \"Kubernetes\", icon: \"☸️ \" },\n { id: \"heroku\", label: \"Heroku\", icon: \"🟣\" },\n { id: \"digitalocean\", label: \"DigitalOcean\", icon: \"🔵\" },\n { id: \"railway\", label: \"Railway\", icon: \"🚂\" },\n { id: \"fly\", label: \"Fly.io\", icon: \"✈️ \" },\n { id: \"cloudflare\", label: \"Cloudflare\", icon: \"🔶\" },\n];\n\n// Container registries\nconst CONTAINER_REGISTRIES = [\n { id: \"dockerhub\", label: \"Docker Hub\", icon: \"🐳\" },\n { id: \"ghcr\", label: \"GitHub Container Registry\", icon: \"🐙\" },\n { id: \"gcr\", label: \"Google Container Registry\", icon: \"🌈\" },\n { id: \"ecr\", label: \"AWS ECR\", icon: \"☁️\" },\n { id: \"acr\", label: \"Azure Container Registry\", icon: \"🔷\" },\n { id: \"quay\", label: \"Quay.io\", icon: \"🔴\" },\n { id: \"gitlab\", label: \"GitLab Registry\", icon: \"🦊\" },\n { id: \"custom\", label: \"Custom/Self-hosted\", icon: \"🏠\" },\n];\n\n// Common commands by category - expanded to match WebUI\nconst COMMON_COMMANDS = {\n build: [\n // JavaScript/Node\n \"npm run build\", \"pnpm build\", \"yarn build\", \"bun run build\",\n \"next build\", \"vite build\", \"tsc\", \"tsc --noEmit\",\n \"esbuild\", \"rollup -c\", \"webpack\", \"parcel build\",\n // Python\n \"python setup.py build\", \"pip install -e .\", \"poetry build\", \"pdm build\", \"hatch build\",\n // Go\n \"go build\", \"go build ./...\", \"go install\",\n // Rust\n \"cargo build\", \"cargo build --release\",\n // Java/JVM\n \"mvn package\", \"mvn clean install\", \"gradle build\",\n // .NET\n \"dotnet build\", \"dotnet publish\",\n // Ruby\n \"bundle exec rake build\", \"gem build\",\n // PHP\n \"composer install\", \"composer dump-autoload\",\n // Docker\n \"docker build -t app .\", \"docker compose build\",\n // Make\n \"make\", \"make build\", \"make all\",\n ],\n test: [\n // JavaScript/Node\n \"npm test\", \"pnpm test\", \"yarn test\", \"bun test\",\n \"vitest\", \"vitest run\", \"jest\", \"jest --coverage\",\n \"mocha\", \"ava\", \"tap\",\n // E2E\n \"playwright test\", \"cypress run\", \"cypress open\",\n \"puppeteer\", \"selenium\",\n // Python\n \"pytest\", \"pytest --cov\", \"pytest -xvs\",\n \"unittest\", \"nose2\", \"hypothesis\",\n // Go\n \"go test ./...\", \"go test -v ./...\", \"go test -race ./...\",\n // Rust\n \"cargo test\", \"cargo test --release\",\n // Java/JVM\n \"mvn test\", \"gradle test\", \"mvn verify\",\n // .NET\n \"dotnet test\",\n // Ruby\n \"bundle exec rspec\", \"rake test\",\n // PHP\n \"phpunit\", \"pest\",\n // Docker\n \"docker compose run test\",\n ],\n lint: [\n // JavaScript/Node\n \"npm run lint\", \"pnpm lint\", \"eslint .\", \"eslint . --fix\",\n \"prettier --check .\", \"prettier --write .\",\n \"biome check\", \"biome check --apply\",\n // Python\n \"ruff check\", \"ruff check --fix\", \"ruff format\",\n \"black .\", \"black --check .\",\n \"flake8\", \"pylint\", \"mypy .\",\n // Go\n \"golangci-lint run\", \"go fmt ./...\", \"go vet ./...\",\n // Rust\n \"cargo clippy\", \"cargo fmt\", \"cargo fmt --check\",\n // Java\n \"mvn checkstyle:check\", \"gradle spotlessCheck\",\n // Ruby\n \"rubocop\", \"rubocop -a\",\n // PHP\n \"php-cs-fixer fix\", \"phpcs\", \"phpstan analyse\",\n // General\n \"pre-commit run --all-files\",\n ],\n dev: [\n // JavaScript/Node\n \"npm run dev\", \"pnpm dev\", \"yarn dev\", \"bun run dev\",\n \"next dev\", \"vite\", \"vite dev\",\n \"nodemon\", \"ts-node-dev\",\n // Python\n \"uvicorn main:app --reload\", \"flask run\", \"python manage.py runserver\",\n \"gunicorn --reload\", \"hypercorn --reload\",\n // Go\n \"go run .\", \"air\", \"reflex\",\n // Rust\n \"cargo run\", \"cargo watch -x run\",\n // Java\n \"mvn spring-boot:run\", \"gradle bootRun\",\n // .NET\n \"dotnet run\", \"dotnet watch run\",\n // Ruby\n \"rails server\", \"bundle exec rails s\",\n // PHP\n \"php artisan serve\", \"symfony server:start\",\n // Docker\n \"docker compose up\", \"docker compose up -d\",\n ],\n format: [\n // JavaScript/Node\n \"prettier --write .\", \"npm run format\", \"pnpm format\",\n \"biome format --write .\", \"dprint fmt\",\n // Python\n \"black .\", \"ruff format .\", \"isort .\", \"autopep8 --in-place -r .\",\n // Go\n \"go fmt ./...\", \"gofmt -w .\", \"goimports -w .\",\n // Rust\n \"cargo fmt\",\n // Other\n \"shfmt -w .\", \"terraform fmt -recursive\",\n ],\n typecheck: [\n // TypeScript\n \"tsc --noEmit\", \"npm run typecheck\", \"pnpm typecheck\",\n \"vue-tsc --noEmit\", \"tsc -b\",\n // Python\n \"mypy .\", \"pyright\", \"pyre check\",\n // Go\n \"go vet ./...\", \"staticcheck ./...\",\n // Rust\n \"cargo check\",\n ],\n clean: [\n // JavaScript/Node\n \"npm run clean\", \"rm -rf node_modules\", \"rm -rf dist\",\n \"rm -rf .next\", \"rm -rf build\", \"rm -rf coverage\",\n // Python\n \"rm -rf __pycache__\", \"find . -name '*.pyc' -delete\",\n // Go\n \"go clean -cache\", \"go clean -testcache\",\n // Rust\n \"cargo clean\",\n // Docker\n \"docker system prune -af\", \"docker compose down -v\",\n // Make\n \"make clean\",\n ],\n preCommit: [\n // JavaScript\n \"npx husky install\", \"pnpm dlx husky install\", \"lefthook install\",\n \"lint-staged\", \"npx lint-staged\", \"simple-git-hooks\",\n // Python\n \"pre-commit install\", \"pre-commit run --all-files\",\n ],\n additional: [\n // Database\n \"npm run db:push\", \"npm run db:migrate\", \"prisma migrate dev\",\n \"alembic upgrade head\", \"flask db upgrade\",\n \"rails db:migrate\", \"rake db:migrate\",\n // Codegen\n \"npm run codegen\", \"graphql-codegen\", \"prisma generate\",\n // Docs\n \"npm run docs\", \"mkdocs serve\", \"sphinx-build\",\n // Deploy\n \"npm run deploy\", \"vercel\", \"netlify deploy\",\n \"flyctl deploy\", \"railway up\",\n ],\n};\n\n// Naming conventions - \"Follow language conventions\" is the recommended default\nconst NAMING_CONVENTIONS = [\n { id: \"language_default\", label: \"Follow language conventions\", desc: \"Use idiomatic style (recommended)\" },\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// Logging conventions - matching WebUI\nconst LOGGING_OPTIONS = [\n { id: \"structured_json\", label: \"Structured JSON\" },\n { id: \"console_log\", label: \"Console.log (dev)\" },\n { id: \"log_levels\", label: \"Log Levels (debug/info/warn/error)\" },\n { id: \"pino\", label: \"Pino\" },\n { id: \"winston\", label: \"Winston\" },\n { id: \"bunyan\", label: \"Bunyan\" },\n { id: \"python_logging\", label: \"Python logging\" },\n { id: \"log4j\", label: \"Log4j / SLF4J\" },\n { id: \"serilog\", label: \"Serilog\" },\n { id: \"opentelemetry\", label: \"OpenTelemetry\" },\n { id: \"other\", label: \"Other\" },\n];\n\n// AI Behavior rules - matching WebUI (security moved to dedicated Security step)\nconst AI_BEHAVIOR_RULES = [\n { id: \"always_debug_after_build\", label: \"Always Debug After Building\", description: \"AI should build and run code locally to verify changes work before suggesting them as complete\", recommended: true },\n { id: \"check_logs_after_build\", label: \"Check Logs After Build/Commit\", description: \"AI should review build output, test logs, and error messages to catch issues early\", recommended: true },\n { id: \"run_tests_before_commit\", label: \"Run Tests Before Commit\", description: \"AI must run the test suite and ensure all tests pass before suggesting a commit\", recommended: true },\n { id: \"follow_existing_patterns\", label: \"Follow Existing Patterns\", description: \"AI should study existing code and follow the same naming, structure, and conventions used in the codebase\", recommended: true },\n { id: \"ask_before_large_refactors\", label: \"Ask Before Large Refactors\", description: \"AI should always ask for explicit approval before making significant architectural changes or refactoring multiple files\", recommended: true },\n];\n\n// ═══════════════════════════════════════════════════════════════\n// SECURITY OPTIONS (FREE tier - new dedicated section)\n// ═══════════════════════════════════════════════════════════════\n\n// Secrets management strategies\nconst SECRETS_MANAGEMENT_OPTIONS = [\n { id: \"env_vars\", label: \"Environment Variables\", description: \"Use .env files locally, env vars in prod\", recommended: true },\n { id: \"dotenv\", label: \"dotenv / dotenvx\", description: \"Load .env files with dotenv library\" },\n { id: \"vault\", label: \"HashiCorp Vault\", description: \"Enterprise secrets management\" },\n { id: \"aws_secrets\", label: \"AWS Secrets Manager\", description: \"AWS native secrets storage\" },\n { id: \"aws_ssm\", label: \"AWS SSM Parameter Store\", description: \"AWS Systems Manager parameters\" },\n { id: \"gcp_secrets\", label: \"GCP Secret Manager\", description: \"Google Cloud secrets storage\" },\n { id: \"azure_keyvault\", label: \"Azure Key Vault\", description: \"Azure secrets and keys\" },\n { id: \"infisical\", label: \"Infisical\", description: \"Open-source secrets management\" },\n { id: \"doppler\", label: \"Doppler\", description: \"Universal secrets platform\" },\n { id: \"1password\", label: \"1Password Secrets Automation\", description: \"1Password for teams/CI\" },\n { id: \"bitwarden\", label: \"Bitwarden Secrets Manager\", description: \"Bitwarden for secrets\" },\n { id: \"sops\", label: \"SOPS (Mozilla)\", description: \"Encrypted files with KMS\" },\n { id: \"age\", label: \"age encryption\", description: \"Simple file encryption\" },\n { id: \"sealed_secrets\", label: \"Sealed Secrets (K8s)\", description: \"Kubernetes encrypted secrets\" },\n { id: \"external_secrets\", label: \"External Secrets Operator\", description: \"K8s external secrets sync\" },\n { id: \"git_crypt\", label: \"git-crypt\", description: \"Transparent file encryption in git\" },\n { id: \"chamber\", label: \"Chamber\", description: \"AWS SSM-based secrets tool\" },\n { id: \"berglas\", label: \"Berglas\", description: \"GCP secrets CLI tool\" },\n { id: \"other\", label: \"Other\", description: \"Custom secrets management\" },\n];\n\n// Security tooling (scanning, dependency updates, etc.)\nconst SECURITY_TOOLING_OPTIONS = [\n { id: \"dependabot\", label: \"Dependabot\", description: \"GitHub dependency updates\", recommended: true },\n { id: \"renovate\", label: \"Renovate\", description: \"Multi-platform dependency updates\", recommended: true },\n { id: \"snyk\", label: \"Snyk\", description: \"Vulnerability scanning & fixing\" },\n { id: \"sonarqube\", label: \"SonarQube / SonarCloud\", description: \"Code quality & security\" },\n { id: \"codeql\", label: \"CodeQL\", description: \"GitHub semantic code analysis\" },\n { id: \"semgrep\", label: \"Semgrep\", description: \"Static analysis with custom rules\" },\n { id: \"trivy\", label: \"Trivy\", description: \"Container & IaC vulnerability scanner\" },\n { id: \"grype\", label: \"Grype\", description: \"Container image vulnerability scanner\" },\n { id: \"checkov\", label: \"Checkov\", description: \"IaC security scanning\" },\n { id: \"tfsec\", label: \"tfsec\", description: \"Terraform security scanner\" },\n { id: \"kics\", label: \"KICS\", description: \"IaC security scanning\" },\n { id: \"gitleaks\", label: \"Gitleaks\", description: \"Secret detection in git repos\" },\n { id: \"trufflehog\", label: \"TruffleHog\", description: \"Secret scanning in code\" },\n { id: \"detect_secrets\", label: \"detect-secrets (Yelp)\", description: \"Pre-commit secret detection\" },\n { id: \"bandit\", label: \"Bandit\", description: \"Python security linter\" },\n { id: \"brakeman\", label: \"Brakeman\", description: \"Ruby on Rails security scanner\" },\n { id: \"gosec\", label: \"gosec\", description: \"Go security checker\" },\n { id: \"npm_audit\", label: \"npm audit / yarn audit\", description: \"Node.js vulnerability check\" },\n { id: \"pip_audit\", label: \"pip-audit\", description: \"Python dependency audit\" },\n { id: \"safety\", label: \"Safety\", description: \"Python dependency checker\" },\n { id: \"bundler_audit\", label: \"bundler-audit\", description: \"Ruby gem vulnerability checker\" },\n { id: \"owasp_dependency_check\", label: \"OWASP Dependency-Check\", description: \"Known vulnerability detection\" },\n { id: \"ossf_scorecard\", label: \"OSSF Scorecard\", description: \"Open source security metrics\" },\n { id: \"socket\", label: \"Socket.dev\", description: \"Supply chain security\" },\n { id: \"mend\", label: \"Mend (WhiteSource)\", description: \"Open source security platform\" },\n { id: \"fossa\", label: \"FOSSA\", description: \"License & security compliance\" },\n { id: \"other\", label: \"Other\", description: \"Custom security tooling\" },\n];\n\n// Authentication patterns\nconst AUTH_PATTERNS_OPTIONS = [\n { id: \"oauth2\", label: \"OAuth 2.0\", description: \"Standard authorization framework\", recommended: true },\n { id: \"oidc\", label: \"OpenID Connect (OIDC)\", description: \"Identity layer on OAuth 2.0\", recommended: true },\n { id: \"jwt\", label: \"JWT (JSON Web Tokens)\", description: \"Stateless token authentication\" },\n { id: \"session\", label: \"Session-based Auth\", description: \"Server-side session management\" },\n { id: \"api_keys\", label: \"API Keys\", description: \"Simple API authentication\" },\n { id: \"basic_auth\", label: \"Basic Authentication\", description: \"Username/password (HTTPS only)\" },\n { id: \"bearer_token\", label: \"Bearer Tokens\", description: \"Token-based API auth\" },\n { id: \"mfa_totp\", label: \"MFA / TOTP\", description: \"Multi-factor with time-based OTP\" },\n { id: \"passkeys\", label: \"Passkeys / WebAuthn\", description: \"Passwordless authentication\" },\n { id: \"saml\", label: \"SAML 2.0\", description: \"Enterprise SSO protocol\" },\n { id: \"ldap\", label: \"LDAP / Active Directory\", description: \"Directory-based auth\" },\n { id: \"mutual_tls\", label: \"Mutual TLS (mTLS)\", description: \"Certificate-based auth\" },\n { id: \"auth0\", label: \"Auth0\", description: \"Identity platform\" },\n { id: \"clerk\", label: \"Clerk\", description: \"User management platform\" },\n { id: \"firebase_auth\", label: \"Firebase Auth\", description: \"Google auth service\" },\n { id: \"supabase_auth\", label: \"Supabase Auth\", description: \"Supabase auth service\" },\n { id: \"keycloak\", label: \"Keycloak\", description: \"Open source IAM\" },\n { id: \"okta\", label: \"Okta\", description: \"Enterprise identity\" },\n { id: \"cognito\", label: \"AWS Cognito\", description: \"AWS user pools\" },\n { id: \"workos\", label: \"WorkOS\", description: \"Enterprise SSO\" },\n { id: \"other\", label: \"Other\", description: \"Custom auth pattern\" },\n];\n\n// Data handling policies\nconst DATA_HANDLING_OPTIONS = [\n { id: \"encryption_at_rest\", label: \"Encryption at Rest\", description: \"Encrypt stored data\", recommended: true },\n { id: \"encryption_in_transit\", label: \"Encryption in Transit (TLS)\", description: \"HTTPS/TLS for all connections\", recommended: true },\n { id: \"pii_handling\", label: \"PII Data Handling\", description: \"Special handling for personal data\" },\n { id: \"gdpr_compliance\", label: \"GDPR Compliance\", description: \"EU data protection rules\" },\n { id: \"ccpa_compliance\", label: \"CCPA Compliance\", description: \"California privacy law\" },\n { id: \"hipaa_compliance\", label: \"HIPAA Compliance\", description: \"Healthcare data protection\" },\n { id: \"soc2_compliance\", label: \"SOC 2 Compliance\", description: \"Service organization controls\" },\n { id: \"pci_dss\", label: \"PCI-DSS Compliance\", description: \"Payment card data security\" },\n { id: \"data_masking\", label: \"Data Masking / Anonymization\", description: \"Hide sensitive data in logs/exports\" },\n { id: \"data_retention\", label: \"Data Retention Policies\", description: \"Automatic data expiration\" },\n { id: \"audit_logging\", label: \"Audit Logging\", description: \"Track data access and changes\" },\n { id: \"backup_encryption\", label: \"Encrypted Backups\", description: \"Encrypt backup data\" },\n { id: \"key_rotation\", label: \"Key Rotation\", description: \"Regular encryption key updates\" },\n { id: \"zero_trust\", label: \"Zero Trust Architecture\", description: \"Never trust, always verify\" },\n { id: \"least_privilege\", label: \"Least Privilege Access\", description: \"Minimal permissions\" },\n { id: \"rbac\", label: \"RBAC (Role-Based Access)\", description: \"Permission by role\" },\n { id: \"abac\", label: \"ABAC (Attribute-Based Access)\", description: \"Fine-grained access control\" },\n { id: \"data_classification\", label: \"Data Classification\", description: \"Classify data sensitivity levels\" },\n { id: \"dlp\", label: \"DLP (Data Loss Prevention)\", description: \"Prevent data leakage\" },\n { id: \"other\", label: \"Other\", description: \"Custom data handling\" },\n];\n\n// Important files to read - ensure consistent spacing after icons\n// Important files AI should read first (NOT AI config files - those are what we're creating)\n// Matching WebUI wizard options\nconst IMPORTANT_FILES = [\n { id: \"readme\", label: \"README.md\", icon: \"📖\", description: \"Project overview, setup instructions, and documentation\" },\n { id: \"package_json\", label: \"package.json\", icon: \"📦\", description: \"Dependencies, scripts, and project metadata\" },\n { id: \"changelog\", label: \"CHANGELOG.md\", icon: \"📝\", description: \"Version history and release notes\" },\n { id: \"contributing\", label: \"CONTRIBUTING.md\", icon: \"🤝\", description: \"Contribution guidelines and code standards\" },\n { id: \"makefile\", label: \"Makefile\", icon: \"🔧\", description: \"Build commands and automation tasks\" },\n { id: \"dockerfile\", label: \"Dockerfile\", icon: \"🐳\", description: \"Container configuration and build steps\" },\n { id: \"docker_compose\", label: \"docker-compose.yml\", icon: \"🐳\", description: \"Multi-container setup and services\" },\n { id: \"env_example\", label: \".env.example\", icon: \"🔐\", description: \"Environment variables template\" },\n { id: \"openapi\", label: \"openapi.yaml / swagger.json\", icon: \"📡\", description: \"API specification and endpoints\" },\n { id: \"architecture_md\", label: \"ARCHITECTURE.md\", icon: \"🏗️\", description: \"System architecture and design decisions\" },\n { id: \"api_docs\", label: \"API documentation\", icon: \"📚\", description: \"API reference and usage examples\" },\n { id: \"database_schema\", label: \"Database schema / migrations\", icon: \"🗄️\", description: \"Database structure and migration files\" },\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 - expanded to match WebUI\nconst TEST_FRAMEWORKS = [\n // JavaScript/TypeScript\n \"jest\", \"vitest\", \"mocha\", \"ava\", \"tap\", \"bun:test\",\n // E2E/Integration\n \"playwright\", \"cypress\", \"puppeteer\", \"selenium\", \"webdriverio\", \"testcafe\",\n // React/Frontend\n \"rtl\", \"enzyme\", \"storybook\", \"chromatic\",\n // API/Mocking\n \"msw\", \"supertest\", \"pact\", \"dredd\", \"karate\", \"postman\", \"insomnia\",\n // Python\n \"pytest\", \"unittest\", \"nose2\", \"hypothesis\", \"behave\", \"robot\",\n // Go\n \"go-test\", \"testify\", \"ginkgo\", \"gomega\",\n // Java/JVM\n \"junit\", \"testng\", \"mockito\", \"spock\", \"cucumber-jvm\",\n // Ruby\n \"rspec\", \"minitest\", \"capybara\", \"factory_bot\",\n // .NET\n \"xunit\", \"nunit\", \"mstest\", \"specflow\",\n // Infrastructure/DevOps\n \"terratest\", \"conftest\", \"opa\", \"inspec\", \"serverspec\", \"molecule\", \"kitchen\", \"goss\",\n // Kubernetes\n \"kubetest\", \"kuttl\", \"chainsaw\", \"helm-unittest\",\n // Security\n \"owasp-zap\", \"burpsuite\", \"nuclei\", \"semgrep\",\n // Load/Performance\n \"k6\", \"locust\", \"jmeter\", \"artillery\", \"gatling\", \"vegeta\", \"wrk\", \"ab\",\n // Chaos Engineering\n \"chaos-mesh\", \"litmus\", \"gremlin\", \"toxiproxy\",\n // Contract Testing\n \"spring-cloud-contract\", \"specmatic\",\n // BDD\n \"cucumber\", \"gauge\", \"concordion\",\n // Mutation Testing\n \"stryker\", \"pitest\", \"mutmut\",\n // Fuzzing\n \"go-fuzz\", \"afl\", \"libfuzzer\", \"jazzer\",\n // PHP\n \"phpunit\", \"pest\", \"codeception\",\n // Rust\n \"cargo-test\", \"rstest\", \"proptest\",\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// Development environment (OS) - can be multi-select\nconst DEV_OS_OPTIONS = [\n { id: \"macos\", label: \"macOS\", icon: \"🍎\" },\n { id: \"linux\", label: \"Linux\", icon: \"🐧\" },\n { id: \"windows\", label: \"Windows\", icon: \"🪟\" },\n { id: \"wsl\", label: \"WSL\", icon: \"🐧\" },\n { id: \"remote\", label: \"Remote/SSH\", icon: \"☁️\" },\n { id: \"devcontainer\", label: \"Dev Container\", icon: \"📦\" },\n { id: \"codespaces\", label: \"GitHub Codespaces\", icon: \"☁️\" },\n];\n\n// Detect current OS\nfunction detectCurrentOS(): string {\n const platform = os.platform();\n if (platform === \"darwin\") return \"macos\";\n if (platform === \"linux\") return \"linux\";\n if (platform === \"win32\") return \"windows\";\n return \"\";\n}\n\n// Architecture patterns\nconst ARCHITECTURE_PATTERNS = [\n { id: \"monolith\", label: \"Monolith\" },\n { id: \"microservices\", label: \"Microservices\" },\n { id: \"serverless\", label: \"Serverless\" },\n { id: \"mvc\", label: \"MVC\" },\n { id: \"layered\", label: \"Layered/N-tier\" },\n { id: \"event_driven\", label: \"Event-driven\" },\n { id: \"modular\", label: \"Modular monolith\" },\n { id: \"other\", label: \"Other\" },\n];\n\n// All users can access all wizard steps\nfunction canAccessTier(_userTier: UserTier, _requiredTier: StepTier): boolean {\n // All users get full wizard access - only AI features are restricted to Teams\n return true;\n}\n\n// Helper to sort choices with selected items first\ninterface Choice {\n title: string;\n value: string;\n selected?: boolean;\n description?: string;\n}\n\nfunction sortSelectedFirst<T extends Choice>(choices: T[]): T[] {\n return [...choices].sort((a, b) => {\n if (a.selected && !b.selected) return -1;\n if (!a.selected && b.selected) return 1;\n return 0;\n });\n}\n\n// Check if user can access AI features (Teams only)\nfunction canAccessAI(userTier: UserTier): boolean {\n return userTier === \"teams\";\n}\n\n// AI assistant for text fields\nasync function aiAssist(instruction: string, existingContent?: string): Promise<string | null> {\n const spinner = ora(\"AI is thinking...\").start();\n \n try {\n const response = await api.aiEditBlueprint({\n content: existingContent,\n instruction,\n mode: existingContent ? \"blueprint\" : \"wizard\",\n });\n spinner.succeed(\"AI suggestion ready\");\n return response.content;\n } catch (error) {\n if (error instanceof ApiRequestError) {\n if (error.statusCode === 403) {\n spinner.fail(\"AI editing requires Teams subscription\");\n } else if (error.statusCode === 429) {\n spinner.fail(\"Rate limit reached. Please wait a moment.\");\n } else {\n spinner.fail(`AI error: ${error.message}`);\n }\n } else {\n spinner.fail(\"Failed to get AI suggestion\");\n }\n return null;\n }\n}\n\n// Tier badges removed - all wizard steps are now available to all users\nfunction getTierBadge(_tier: StepTier): { label: string; color: typeof chalk.cyan } | null {\n // No badges needed - all users have full wizard access\n return null;\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 and highlighted current step\nfunction showStep(current: number, step: WizardStep, userTier: UserTier): void {\n const availableSteps = getAvailableSteps(userTier);\n const total = availableSteps.length;\n \n // Build progress bar with current step highlighted\n let progressBar = \"\";\n for (let i = 1; i <= total; i++) {\n if (i < current) {\n progressBar += chalk.green(\"●\"); // Completed\n } else if (i === current) {\n progressBar += chalk.cyan.bold(\"◉\"); // Current (highlighted)\n } else {\n progressBar += chalk.gray(\"○\"); // Upcoming\n }\n }\n \n const badge = getTierBadge(step.tier);\n \n console.log();\n console.log(chalk.gray(\" ═\".repeat(30)));\n let stepLine = ` ${progressBar} ${chalk.cyan.bold(`Step ${current}/${total}`)}: ${step.icon} ${chalk.bold(step.title)}`;\n if (badge) {\n stepLine += \" \" + badge.color(`[${badge.label}]`);\n }\n console.log(stepLine);\n console.log(chalk.gray(\" ═\".repeat(30)));\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// Global wizard state for saving draft on exit\nlet wizardState: {\n inProgress: boolean;\n answers: Record<string, unknown>;\n stepReached: number;\n} = {\n inProgress: false,\n answers: {},\n stepReached: 0,\n};\n\n// Save draft function for SIGINT handler\nasync function saveDraftOnExit(): Promise<void> {\n if (!wizardState.inProgress || Object.keys(wizardState.answers).length === 0) {\n return;\n }\n \n try {\n const timestamp = new Date().toISOString().replace(/[:.]/g, \"-\").slice(0, 19);\n const draftName = `autosave-${timestamp}`;\n \n console.log();\n console.log(chalk.yellow(` 💾 Saving wizard state to draft: ${draftName}...`));\n \n await saveDraftLocally(draftName, wizardState.answers, wizardState.stepReached);\n \n console.log(chalk.green(` ✓ Draft saved! Resume with: lynxp wizard --load-draft ${draftName}`));\n console.log(chalk.gray(` Saved at step ${wizardState.stepReached}`));\n console.log();\n } catch (err) {\n console.log(chalk.red(` ✗ Could not save draft: ${err instanceof Error ? err.message : \"unknown error\"}`));\n }\n}\n\n// Configure prompts to handle cancellation\nconst promptConfig = {\n onCancel: async () => {\n await saveDraftOnExit();\n console.log(chalk.yellow(\"\\n Cancelled. Run 'lynxp wizard' anytime to restart.\\n\"));\n process.exit(0);\n },\n};\n\n// Register SIGINT handler for Ctrl+C\nprocess.on(\"SIGINT\", async () => {\n await saveDraftOnExit();\n console.log(chalk.yellow(\"\\n Interrupted. Run 'lynxp wizard' anytime to restart.\\n\"));\n process.exit(0);\n});\n\nexport async function wizardCommand(options: WizardOptions): Promise<void> {\n try {\n await runWizardWithDraftProtection(options);\n } catch (error) {\n // On any unexpected error, try to save the draft\n await saveDraftOnExit();\n \n console.error(chalk.red(\"\\n ✗ An unexpected error occurred:\"));\n if (error instanceof Error) {\n console.error(chalk.gray(` ${error.message}`));\n }\n console.log();\n \n if (wizardState.stepReached > 0) {\n console.log(chalk.yellow(\" Your progress has been saved. Resume with the draft command shown above.\"));\n }\n console.log();\n process.exit(1);\n }\n}\n\nasync function runWizardWithDraftProtection(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 // Handle --load-draft option\n if (options.loadDraft) {\n const draft = await loadDraftLocally(options.loadDraft);\n if (draft) {\n const stepInfo = draft.stepReached ? ` at step ${draft.stepReached}` : \"\";\n const sourceInfo = draft.source ? ` [${draft.source}]` : \"\";\n const versionInfo = draft.version ? ` v${draft.version}` : \"\";\n console.log(chalk.green(` ✓ Loaded draft: ${draft.name}${sourceInfo}${versionInfo} (saved ${new Date(draft.savedAt).toLocaleString()}${stepInfo})`));\n \n // Check for version mismatch warnings\n if (draft.source && draft.source !== \"cli\") {\n console.log(chalk.yellow(` ⚠ This draft was created with the ${draft.source.toUpperCase()}. Some features may differ.`));\n }\n if (draft.version && draft.version !== CLI_VERSION) {\n // Compare major.minor versions for compatibility warning\n const draftMajorMinor = draft.version.split(\".\").slice(0, 2).join(\".\");\n const cliMajorMinor = CLI_VERSION.split(\".\").slice(0, 2).join(\".\");\n if (draftMajorMinor !== cliMajorMinor) {\n console.log(chalk.yellow(` ⚠ Draft was created with v${draft.version}, current CLI is v${CLI_VERSION}. Some options may have changed.`));\n }\n }\n console.log();\n // Store draft answers and resume step for use in interactive wizard\n options._draftAnswers = draft.config;\n options._resumeFromStep = draft.stepReached;\n // Also merge basic options (name, description, etc.)\n if (draft.config.name) options.name = draft.config.name as string;\n if (draft.config.description) options.description = draft.config.description as string;\n } else {\n const availableDrafts = await listLocalDrafts();\n console.log(chalk.red(` ✗ Draft \"${options.loadDraft}\" not found.`));\n if (availableDrafts.length > 0) {\n console.log(chalk.gray(` Available drafts: ${availableDrafts.join(\", \")}`));\n }\n console.log();\n }\n }\n\n // Handle --repo-url for direct remote analysis\n if (options.repoUrl) {\n const spinner = ora(\"Analyzing remote repository...\").start();\n const detected = await detectFromRemoteUrl(options.repoUrl);\n if (detected) {\n spinner.succeed(\"Remote repository analyzed\");\n // Pre-fill options from detected\n if (!options.name && detected.name) options.name = detected.name;\n if (!options.description && detected.description) options.description = detected.description;\n if (!options.stack && detected.stack.length > 0) options.stack = detected.stack.join(\",\");\n if (!options.license && detected.license) options.license = detected.license;\n if (detected.cicd) options.ciCd = detected.cicd;\n } else {\n spinner.fail(\"Could not analyze repository\");\n }\n console.log();\n }\n\n // Handle --detect-only mode\n if (options.detectOnly) {\n const detected = options.repoUrl \n ? await detectFromRemoteUrl(options.repoUrl)\n : await detectProject(process.cwd());\n \n if (detected) {\n console.log(chalk.green.bold(\" 📊 Project Analysis\"));\n console.log();\n console.log(chalk.white(` Name: ${detected.name || \"unknown\"}`));\n if (detected.description) console.log(chalk.gray(` Description: ${detected.description}`));\n console.log(chalk.white(` Type: ${detected.isOpenSource ? \"Open Source\" : detected.type}`));\n console.log(chalk.white(` Stack: ${detected.stack.join(\", \") || \"none detected\"}`));\n if (detected.databases && detected.databases.length > 0) {\n console.log(chalk.white(` Databases: ${detected.databases.join(\", \")}`));\n }\n if (detected.packageManager) console.log(chalk.white(` Package Manager: ${detected.packageManager}`));\n if (detected.repoHost) console.log(chalk.white(` Host: ${detected.repoHost}`));\n if (detected.license) console.log(chalk.white(` License: ${detected.license.toUpperCase()}`));\n if (detected.cicd) console.log(chalk.white(` CI/CD: ${detected.cicd.replace(\"_\", \" \")}`));\n if (detected.hasDocker) {\n const dockerInfo = detected.containerRegistry \n ? `detected (registry: ${detected.containerRegistry})`\n : \"detected\";\n console.log(chalk.white(` Docker: ${dockerInfo}`));\n }\n if (detected.testFramework) console.log(chalk.white(` Test Framework: ${detected.testFramework}`));\n if (detected.existingFiles && detected.existingFiles.length > 0) {\n const filesDisplay = detected.existingFiles.length > 3\n ? `${detected.existingFiles.slice(0, 3).join(\", \")}... (+${detected.existingFiles.length - 3})`\n : detected.existingFiles.join(\", \");\n console.log(chalk.white(` Static files found: ${detected.existingFiles.length} (${filesDisplay})`));\n }\n if (detected.commands) {\n console.log(chalk.white(` 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 console.log();\n } else {\n console.log(chalk.yellow(\" No project detected.\"));\n console.log();\n }\n return; // Exit without generating\n }\n\n // Blueprint mode hint\n if (options.blueprint) {\n console.log(chalk.magenta(\" 📋 Template Mode: Generating with [[VARIABLE|default]] placeholders\"));\n console.log();\n }\n\n // Check authentication and determine tier\n const authenticated = isAuthenticated();\n const user = getUser();\n const userPlanRaw = user?.plan?.toLowerCase() || \"free\";\n // Map legacy pro/max to users (free), only teams is a paid tier now\n const userTier: UserTier = userPlanRaw === \"teams\" ? \"teams\" : \"users\";\n const userPlanDisplay = userTier === \"teams\" ? \"TEAMS\" : \"USERS\";\n \n if (!authenticated) {\n // Show login notice for guests (box width: 55 inner chars)\n const W = 55;\n const y = chalk.yellow;\n const pad = (s: string, len: number) => s + \" \".repeat(Math.max(0, len - s.length));\n \n console.log(y(\"┌\" + \"─\".repeat(W) + \"┐\"));\n console.log(y(\"│\") + pad(\" 💡 Log in for full wizard features:\", W - 1) + y(\"│\"));\n console.log(y(\"│\") + \" \".repeat(W) + y(\"│\"));\n console.log(y(\"│\") + pad(\" • Full wizard with all steps\", W) + y(\"│\"));\n console.log(y(\"│\") + pad(\" • Auto-detect from repos [TEAMS]\", W) + y(\"│\"));\n console.log(y(\"│\") + pad(\" • AI assistant for configs [TEAMS]\", W) + y(\"│\"));\n console.log(y(\"│\") + pad(\" • Save preferences to your profile\", W) + y(\"│\"));\n console.log(y(\"│\") + pad(\" • Push configs to cloud (lynxp push)\", W) + y(\"│\"));\n console.log(y(\"│\") + pad(\" • Share across devices (lynxp push/pull)\", W) + y(\"│\"));\n console.log(y(\"│\") + \" \".repeat(W) + y(\"│\"));\n console.log(y(\"│\") + pad(\" Run: \" + chalk.cyan(\"lynxp login\"), W + 10) + y(\"│\")); // +10 for chalk codes\n console.log(y(\"└\" + \"─\".repeat(W) + \"┘\"));\n console.log();\n } else {\n // Show logged-in status with plan\n const planEmoji = userTier === \"teams\" ? \"👥\" : \"🆓\";\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 // Show draft save hint\n console.log(chalk.gray(` 💾 Tip: Type 'save:draftname' anytime to save progress locally`));\n console.log();\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 from current directory first\n let detected = await detectProject(process.cwd());\n \n // Show local detection results if found\n if (detected) {\n const detectedInfo = [\n chalk.green(\"✓ Local 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 } else {\n console.log(chalk.gray(\" No project detected in current directory.\"));\n console.log();\n }\n \n // Always offer to analyze a repository (available to all users)\n // Skip if --yes flag is used (non-interactive mode)\n const canDetectRemote = !options.yes;\n \n if (canDetectRemote) {\n console.log();\n console.log(chalk.magenta.bold(\" ┌───────────────────────────────────────────────┐\"));\n console.log(chalk.magenta.bold(\" │ ✨ AUTO-DETECT FROM REPOSITORY │\"));\n console.log(chalk.magenta.bold(\" └───────────────────────────────────────────────┘\"));\n console.log(chalk.gray(\" Analyze any local path, GitHub/GitLab URL, or private repo with credentials.\"));\n console.log(chalk.gray(\" We'll detect: languages, frameworks, commands, license, CI/CD, and more!\"));\n console.log();\n \n const remoteResponse = await prompts({\n type: \"confirm\",\n name: \"useRemote\",\n message: detected \n ? chalk.white(\"🔍 Analyze a different repository instead?\")\n : chalk.white(\"🔍 Analyze a repository (local path or URL)?\"),\n initial: false, // Default to No - user must explicitly choose Yes\n }, promptConfig);\n \n if (remoteResponse.useRemote) {\n const urlResponse = await prompts({\n type: \"text\",\n name: \"url\",\n message: chalk.white(\"Enter local path or repository URL:\"),\n hint: chalk.gray(\"/path/to/project or https://github.com/user/repo\"),\n validate: (v) => {\n if (!v || v.trim() === \"\") return \"Please enter a path or URL\";\n // Accept local paths (start with /, ~, or .)\n if (v.startsWith(\"/\") || v.startsWith(\"~\") || v.startsWith(\".\")) return true;\n // Accept git URLs\n if (isGitUrl(v)) return true;\n return \"Please enter a valid local path or Git URL\";\n },\n }, promptConfig);\n \n if (urlResponse.url) {\n const inputPath = urlResponse.url.trim();\n const isLocalPath = inputPath.startsWith(\"/\") || inputPath.startsWith(\"~\") || inputPath.startsWith(\".\");\n \n if (isLocalPath) {\n // Expand ~ to home directory\n const { homedir } = await import(\"os\");\n const resolvedPath = inputPath.startsWith(\"~\") \n ? inputPath.replace(\"~\", homedir())\n : inputPath.startsWith(\".\")\n ? join(process.cwd(), inputPath)\n : inputPath;\n \n const localSpinner = ora(`Analyzing local repository at ${resolvedPath}...`).start();\n const localDetected = await detectProject(resolvedPath);\n \n if (localDetected) {\n detected = localDetected;\n localSpinner.succeed(\"Local repository analyzed\");\n \n // Show local detection results\n const detectedInfo = [\n chalk.green(\"✓ Local 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 } else {\n localSpinner.fail(\"Could not analyze directory (no recognizable project structure)\");\n }\n } else {\n // Remote URL analysis\n const host = inputPath.toLowerCase().includes(\"github\") ? \"GitHub API\" \n : inputPath.toLowerCase().includes(\"gitlab\") ? \"GitLab API\" \n : \"shallow clone\";\n const remoteSpinner = ora(`Analyzing remote repository via ${host}...`).start();\n const remoteDetected = await detectFromRemoteUrl(inputPath);\n \n if (remoteDetected) {\n detected = remoteDetected;\n remoteSpinner.succeed(\"Remote repository analyzed\");\n \n // Show remote detection results (aligned with WebUI output)\n const detectedInfo = [\n chalk.green(\"✓ Remote project detected\"),\n ];\n if (detected.name) detectedInfo.push(chalk.gray(` Name: ${detected.name}`));\n if (detected.isOpenSource) detectedInfo.push(chalk.gray(` Type: Open Source`));\n if (detected.stack.length > 0) detectedInfo.push(chalk.gray(` Stack: ${detected.stack.join(\", \")}`));\n if (detected.databases && detected.databases.length > 0) {\n detectedInfo.push(chalk.gray(` Databases: ${detected.databases.join(\", \")}`));\n }\n if (detected.license) detectedInfo.push(chalk.gray(` License: ${detected.license.toUpperCase()}`));\n if (detected.repoHost) detectedInfo.push(chalk.gray(` Host: ${detected.repoHost}`));\n if (detected.cicd) detectedInfo.push(chalk.gray(` CI/CD: ${detected.cicd.replace(\"_\", \" \")}`));\n if (detected.hasDocker) {\n const dockerInfo = detected.containerRegistry \n ? `detected (registry: ${detected.containerRegistry})`\n : \"detected\";\n detectedInfo.push(chalk.gray(` Docker: ${dockerInfo}`));\n }\n if (detected.existingFiles && detected.existingFiles.length > 0) {\n const filesDisplay = detected.existingFiles.length > 3\n ? `${detected.existingFiles.slice(0, 3).join(\", \")}...`\n : detected.existingFiles.join(\", \");\n detectedInfo.push(chalk.gray(` Static files found: ${detected.existingFiles.length} (${filesDisplay})`));\n }\n if (detected.repoUrl) detectedInfo.push(chalk.gray(` Source: ${detected.repoUrl}`));\n \n printBox(detectedInfo, chalk.gray);\n console.log();\n } else {\n remoteSpinner.fail(\"Could not analyze repository (may be private or inaccessible)\");\n }\n }\n }\n }\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 // Add blueprint mode and variables to config\n const variables = options.vars ? parseVariablesString(options.vars) : undefined;\n // Don't pass enableAutoUpdate/blueprintId to generator yet - we'll add curl header after saving\n const finalConfig = {\n ...config,\n blueprintMode: options.blueprint || config.blueprintMode || false,\n variables,\n enableAutoUpdate: false, // Don't generate curl header yet\n };\n \n let files = generateConfig(finalConfig);\n \n // If enableAutoUpdate is true, save blueprint to cloud first\n let savedBlueprintId: string | null = null;\n if (config.enableAutoUpdate && api) {\n spinner.text = \"Saving blueprint to cloud...\";\n try {\n const mainFile = Object.entries(files)[0];\n if (mainFile) {\n const [_fileName, content] = mainFile;\n const response = await api.createBlueprint({\n name: config.name || \"My AI Config\",\n description: config.description || \"Generated with LynxPrompt CLI\",\n content: content,\n visibility: \"PRIVATE\",\n });\n savedBlueprintId = response.blueprint.id;\n \n // Now regenerate with the real blueprint ID to include curl header\n const configWithAutoUpdate = {\n ...finalConfig,\n enableAutoUpdate: true,\n blueprintId: savedBlueprintId,\n };\n files = generateConfig(configWithAutoUpdate);\n \n console.log(chalk.green(` ✓ Blueprint saved: ${savedBlueprintId}`));\n }\n } catch (saveError) {\n spinner.stop();\n console.log(chalk.yellow(\"\\n ⚠️ Could not save blueprint to cloud\"));\n if (saveError instanceof Error) {\n console.log(chalk.gray(` ${saveError.message}`));\n }\n console.log(chalk.gray(\" Continuing without auto-update curl command...\"));\n // Continue without auto-update\n }\n }\n \n spinner.stop();\n\n console.log();\n console.log(chalk.green.bold(\" ✅ Generated:\"));\n console.log();\n \n // Determine output directory\n const outputDir = options.output || process.cwd();\n \n for (const [filename, content] of Object.entries(files)) {\n const outputPath = join(outputDir, 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 diff \") + chalk.gray(\"Compare with cloud 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 // Save draft if requested\n if (options.saveDraft) {\n try {\n await saveDraftLocally(options.saveDraft, config as unknown as Record<string, unknown>);\n console.log(chalk.green(` 💾 Draft saved as \"${options.saveDraft}\"`));\n console.log(chalk.gray(` Load later with: lynxp wizard --load-draft ${options.saveDraft}`));\n console.log();\n } catch (err) {\n console.log(chalk.yellow(` ⚠️ Could not save draft: ${err instanceof Error ? err.message : \"unknown error\"}`));\n }\n }\n\n // Offer to save preferences to profile (logged-in users only)\n if (authenticated && !options.yes) {\n console.log();\n const savePrefsResponse = await prompts({\n type: \"confirm\",\n name: \"savePrefs\",\n message: chalk.white(\"Save these preferences to your profile for next time?\"),\n initial: true,\n });\n\n if (savePrefsResponse.savePrefs) {\n // Retry loop for saving preferences\n let saved = false;\n let attempts = 0;\n const maxAttempts = 3;\n \n while (!saved && attempts < maxAttempts) {\n attempts++;\n const saveSpinner = ora(\"Saving preferences to your profile...\").start();\n try {\n // Save wizard preferences via API\n await api.saveWizardPreferences({\n commands: config.commands,\n codeStyle: {\n naming: config.namingConvention,\n errorHandling: config.errorHandling,\n loggingConventions: config.loggingConventions,\n loggingConventionsOther: config.loggingConventionsOther,\n notes: config.styleNotes,\n },\n boundaries: {\n always: config.boundaryAlways,\n never: config.boundaryNever,\n ask: config.boundaryAsk,\n },\n testing: {\n levels: config.testLevels,\n frameworks: config.testFrameworks,\n coverage: config.coverageTarget,\n notes: config.testNotes,\n },\n });\n saveSpinner.succeed(\"Preferences saved to your profile\");\n saved = true;\n } catch (err) {\n saveSpinner.fail(\"Could not save preferences\");\n let errorType = \"unknown\";\n \n if (err instanceof ApiRequestError) {\n if (err.statusCode === 401) {\n console.log(chalk.yellow(\" Your session may have expired. Try: lynxp login\"));\n break; // Don't retry auth errors\n } else {\n console.log(chalk.gray(` ${err.message} (status: ${err.statusCode})`));\n errorType = \"api\";\n }\n } else if (err instanceof Error) {\n if (err.message.includes(\"fetch failed\") || err.message.includes(\"ENOTFOUND\")) {\n console.log(chalk.yellow(\" Network error. Check your internet connection.\"));\n errorType = \"network\";\n } else {\n console.log(chalk.gray(` ${err.message}`));\n }\n }\n \n // Ask if user wants to retry (for network/api errors)\n if (errorType === \"network\" || errorType === \"api\") {\n if (attempts < maxAttempts) {\n const retryResponse = await prompts({\n type: \"confirm\",\n name: \"retry\",\n message: chalk.white(\"Would you like to retry?\"),\n initial: true,\n });\n \n if (!retryResponse.retry) {\n console.log(chalk.gray(\" Skipping preference save. Your config files are still generated.\"));\n break;\n }\n } else {\n console.log(chalk.gray(` Max retries (${maxAttempts}) reached. Your config files are still generated.`));\n }\n } else {\n break; // Don't retry unknown errors\n }\n }\n }\n }\n }\n \n } catch (error) {\n spinner.fail(\"Failed to generate files\");\n \n // Try to save draft even on generation error\n await saveDraftOnExit();\n \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 \n if (wizardState.stepReached > 0) {\n console.log(chalk.yellow(\"\\n Your wizard progress has been saved to a draft.\"));\n }\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 // Load answers from draft if resuming\n const answers: Record<string, unknown> = options._draftAnswers ? { ...options._draftAnswers } : {};\n const resumeFromStep = options._resumeFromStep || 0;\n const availableSteps = getAvailableSteps(userTier);\n let currentStepNum = 0;\n\n // Initialize global state for draft saving on exit\n wizardState.inProgress = true;\n wizardState.answers = answers;\n wizardState.stepReached = resumeFromStep;\n\n // Show resume message if loading from draft\n if (resumeFromStep > 0 && Object.keys(answers).length > 0) {\n console.log(chalk.cyan(` 📋 Resuming from step ${resumeFromStep}...`));\n console.log(chalk.gray(\" Previously saved answers:\"));\n // Show key saved values\n if (answers.name) console.log(chalk.gray(` • Name: ${answers.name}`));\n if (answers.platforms) console.log(chalk.gray(` • Platforms: ${(answers.platforms as string[]).join(\", \")}`));\n if (answers.stack) console.log(chalk.gray(` • Stack: ${(answers.stack as string[]).slice(0, 5).join(\", \")}${(answers.stack as string[]).length > 5 ? \"...\" : \"\"}`));\n console.log();\n console.log(chalk.yellow(\" Steps 1-\" + (resumeFromStep - 1) + \" will use saved values. Continuing from step \" + resumeFromStep + \".\"));\n console.log();\n }\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 wizardState.stepReached = currentStepNum;\n return step;\n }\n return null;\n };\n\n // Helper to check if we should skip this step (already completed in draft)\n const shouldSkipStep = (stepNum: number) => {\n return resumeFromStep > 0 && stepNum < resumeFromStep;\n };\n\n // ═══════════════════════════════════════════════════════════════\n // STEP 1: Output Format (basic - all users)\n // ═══════════════════════════════════════════════════════════════\n const formatStep = getCurrentStep(\"format\")!;\n \n let platforms: string[];\n \n if (shouldSkipStep(currentStepNum) && answers.platforms) {\n // Use saved answer from draft\n platforms = answers.platforms as string[];\n console.log(chalk.gray(` Step 1 (Output Format): Using saved platforms: ${platforms.join(\", \")}`));\n } else if (options.format) {\n showStep(currentStepNum, formatStep, userTier);\n platforms = options.format.split(\",\").map(f => f.trim());\n console.log(chalk.gray(` Using format from flag: ${platforms.join(\", \")}`));\n } else {\n showStep(currentStepNum, formatStep, userTier);\n // Multi-select by default - user can select one or more platforms\n console.log(chalk.gray(\" Select the AI editors you want to generate config for:\"));\n console.log(chalk.gray(\" (AGENTS.md is recommended - works with most AI tools)\"));\n console.log(chalk.gray(\" Type to search/filter the list.\"));\n console.log();\n \n const platformResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"platforms\",\n message: chalk.white(\"Select AI editors (type to search):\"),\n choices: ALL_PLATFORMS.map(p => ({ \n title: p.id === \"agents\" \n ? `${p.icon} ${p.name} ${chalk.green.bold(\"★ recommended\")}`\n : `${p.icon} ${p.name}`,\n value: p.id,\n description: chalk.gray(p.note),\n selected: p.id === \"agents\", // Pre-select AGENTS.md\n })),\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n min: 1,\n instructions: false,\n }, promptConfig);\n \n platforms = platformResponse.platforms || [\"agents\"];\n console.log(chalk.green(` ✓ Selected ${platforms.length} platform${platforms.length === 1 ? \"\" : \"s\"}`));\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 || detected?.description || \"\",\n hint: detected?.description \n ? chalk.green(\"(pre-filled from repo About)\")\n : chalk.gray(\"optional - helps AI understand context\"),\n }, promptConfig);\n answers.description = descResponse.description || \"\";\n\n // Project type - pre-select open-source if detected from public repo\n const isDetectedOpenSource = detected?.isPublicRepo === true;\n const projectTypeChoices = [\n { title: chalk.gray(\"⏭ Skip\"), value: \"\" },\n ...PROJECT_TYPES.map(t => ({\n title: (t.id === \"opensource\" && isDetectedOpenSource)\n ? `${t.icon} ${t.label} ${chalk.green(\"(detected)\")}`\n : `${t.icon} ${t.label}`,\n value: t.id,\n description: chalk.gray(t.description),\n })),\n ];\n const defaultProjectTypeIdx = isDetectedOpenSource \n ? projectTypeChoices.findIndex(c => c.value === \"opensource\")\n : 0;\n \n const typeResponse = await prompts({\n type: \"select\",\n name: \"projectType\",\n message: chalk.white(\"Project type:\"),\n choices: projectTypeChoices,\n initial: defaultProjectTypeIdx > 0 ? defaultProjectTypeIdx : 0,\n }, promptConfig);\n answers.projectType = typeResponse.projectType || \"\";\n\n // Development environment(s) - multi-select with current OS pre-selected and labeled\n const currentOS = detectCurrentOS();\n const devOsResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"devOS\",\n message: chalk.white(\"Development environment(s) (type to search):\"),\n choices: DEV_OS_OPTIONS.map(o => ({\n title: o.id === currentOS \n ? `${o.icon} ${o.label} ${chalk.green(\"(detected by your current system)\")}`\n : `${o.icon} ${o.label}`,\n value: o.id,\n selected: o.id === currentOS, // Pre-select current OS\n })),\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n answers.devOS = devOsResponse.devOS || [];\n\n // Architecture pattern\n const archResponse = await prompts({\n type: \"select\",\n name: \"architecture\",\n message: chalk.white(\"Architecture pattern:\"),\n choices: [\n { title: chalk.gray(\"⏭ Skip\"), value: \"\" },\n ...ARCHITECTURE_PATTERNS.map(a => ({\n title: a.label,\n value: a.id,\n })),\n ],\n initial: 0,\n }, promptConfig);\n answers.architecture = archResponse.architecture || \"\";\n \n // If \"other\" selected, ask for custom input\n if (answers.architecture === \"other\") {\n const customArchResponse = await prompts({\n type: \"text\",\n name: \"customArchitecture\",\n message: chalk.white(\"Describe your architecture pattern:\"),\n hint: chalk.gray(\"e.g., CQRS, Hexagonal, Clean Architecture\"),\n }, promptConfig);\n answers.architectureOther = customArchResponse.customArchitecture || \"\";\n }\n\n // Blueprint Template Mode - available for all users\n console.log();\n console.log(chalk.yellow(\" 🧩 Blueprint Template Mode\"));\n console.log(chalk.gray(\" Create a reusable template with [[VARIABLE|default]] placeholders\"));\n console.log(chalk.gray(\" that others can customize when using your blueprint.\"));\n console.log();\n \n const blueprintResponse = await prompts({\n type: \"toggle\",\n name: \"blueprintMode\",\n message: chalk.white(\"Create as Blueprint Template?\"),\n initial: false,\n active: \"Yes\",\n inactive: \"No\",\n }, promptConfig);\n answers.blueprintMode = blueprintResponse.blueprintMode || false;\n \n if (answers.blueprintMode) {\n console.log(chalk.green(\" ✓ Blueprint mode enabled - values will use [[VARIABLE|default]] syntax\"));\n }\n\n // ═══════════════════════════════════════════════════════════════\n // STEP 3: Tech Stack (basic - all users)\n // ═══════════════════════════════════════════════════════════════\n const techStep = getCurrentStep(\"tech\")!;\n showStep(currentStepNum, techStep, userTier);\n\n // Let AI decide option - default to Yes\n const letAiResponse = await prompts({\n type: \"toggle\",\n name: \"letAiDecide\",\n message: chalk.white(\"Let AI help choose additional technologies?\"),\n initial: true, // Default to Yes\n active: \"Yes\",\n inactive: \"No\",\n }, promptConfig);\n answers.letAiDecide = letAiResponse.letAiDecide ?? true;\n\n console.log();\n console.log(chalk.gray(\" Select your tech stack (type to search/filter):\"));\n console.log();\n\n // Show detected stack as hint\n if (detected?.stack && detected.stack.length > 0) {\n console.log(chalk.green(` ✓ Detected in project: ${detected.stack.join(\", \")}`));\n console.log();\n }\n\n // Languages - autocomplete multiselect for searchability\n const languageChoices = sortSelectedFirst(LANGUAGES.map(s => {\n const isDetected = detected?.stack?.includes(s.value);\n return {\n title: isDetected ? `${s.title} ${chalk.green(\"(detected)\")}` : s.title,\n value: s.value,\n selected: isDetected,\n };\n }));\n const languageResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"languages\",\n message: chalk.white(\"Languages (type to search):\"),\n choices: languageChoices,\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n const selectedLanguages = languageResponse.languages || [];\n\n // Frameworks - separate selection like WebUI\n const frameworkChoices = sortSelectedFirst(FRAMEWORKS.map(s => {\n const isDetected = detected?.stack?.includes(s.value);\n return {\n title: isDetected ? `${s.title} ${chalk.green(\"(detected)\")}` : s.title,\n value: s.value,\n selected: isDetected,\n };\n }));\n const frameworkResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"frameworks\",\n message: chalk.white(\"Frameworks (type to search):\"),\n choices: frameworkChoices,\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n const selectedFrameworks = frameworkResponse.frameworks || [];\n\n // Databases\n const databaseChoices = sortSelectedFirst(DATABASES.map(s => {\n const isDetected = detected?.stack?.includes(s.value);\n return {\n title: isDetected ? `${s.title} ${chalk.green(\"(detected)\")}` : s.title,\n value: s.value,\n selected: isDetected,\n };\n }));\n const databaseResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"databases\",\n message: chalk.white(\"Databases (type to search):\"),\n choices: databaseChoices,\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n const selectedDatabases = databaseResponse.databases || [];\n\n // JS/TS specific options\n const hasJsTs = selectedLanguages.includes(\"javascript\") || selectedLanguages.includes(\"typescript\");\n \n if (hasJsTs) {\n console.log();\n console.log(chalk.cyan(\" 📦 JavaScript/TypeScript Options\"));\n console.log();\n \n // Package Manager\n const pmResponse = await prompts({\n type: \"select\",\n name: \"packageManager\",\n message: chalk.white(\"Package manager:\"),\n choices: PACKAGE_MANAGERS.map(pm => ({\n title: `${pm.title} - ${chalk.gray(pm.desc)}`,\n value: pm.value,\n })),\n initial: 0,\n }, promptConfig);\n answers.packageManager = pmResponse.packageManager || \"npm\";\n\n // JS Runtime\n const runtimeResponse = await prompts({\n type: \"select\",\n name: \"jsRuntime\",\n message: chalk.white(\"JavaScript runtime:\"),\n choices: JS_RUNTIMES.map(rt => ({\n title: `${rt.title} - ${chalk.gray(rt.desc)}`,\n value: rt.value,\n })),\n initial: 0,\n }, promptConfig);\n answers.jsRuntime = runtimeResponse.jsRuntime || \"node\";\n\n // Monorepo\n const monoResponse = await prompts({\n type: \"select\",\n name: \"monorepoTool\",\n message: chalk.white(\"Monorepo tool:\"),\n choices: MONOREPO_TOOLS.map(mt => ({\n title: `${mt.title} - ${chalk.gray(mt.desc)}`,\n value: mt.value,\n })),\n initial: 0,\n }, promptConfig);\n answers.monorepoTool = monoResponse.monorepoTool || \"\";\n }\n\n // ORM selection (if databases selected)\n if (selectedDatabases.length > 0) {\n console.log();\n console.log(chalk.cyan(\" 🔗 ORM / Database Library\"));\n console.log();\n \n // Filter ORMs by selected languages\n const relevantOrms = ORM_OPTIONS.filter(orm => \n orm.langs.length === 0 || orm.langs.some(l => selectedLanguages.includes(l))\n );\n \n const ormResponse = await prompts({\n type: \"select\",\n name: \"orm\",\n message: chalk.white(\"ORM / Database library:\"),\n choices: relevantOrms.map(orm => ({ title: orm.title, value: orm.value })),\n initial: 0,\n }, promptConfig);\n answers.orm = ormResponse.orm || \"\";\n }\n\n // Combine all stack selections\n answers.stack = [...selectedLanguages, ...selectedFrameworks, ...selectedDatabases];\n\n // ═══════════════════════════════════════════════════════════════\n // STEP 4: Repository Setup (basic - all users)\n // ═══════════════════════════════════════════════════════════════\n const repoStep = getCurrentStep(\"repo\")!;\n showStep(currentStepNum, repoStep, userTier);\n\n // Show detected repository info\n if (detected?.repoHost || detected?.license || detected?.cicd) {\n console.log(chalk.green(\" ✓ Auto-detected from your project:\"));\n if (detected.repoHost) console.log(chalk.gray(` • Repository: ${detected.repoHost}${detected.repoUrl ? ` (${detected.repoUrl})` : \"\"}`));\n if (detected.license) console.log(chalk.gray(` • License: ${detected.license}`));\n if (detected.cicd) console.log(chalk.gray(` • CI/CD: ${detected.cicd}`));\n console.log();\n }\n\n // Find initial index for detected repo host\n const repoHostChoices = [\n { title: chalk.gray(\"⏭ Skip\"), value: \"\" },\n ...REPO_HOSTS.map(h => ({\n title: detected?.repoHost === h.id \n ? `${h.icon} ${h.label} ${chalk.green(\"(detected)\")}`\n : `${h.icon} ${h.label}`,\n value: h.id,\n })),\n ];\n const detectedRepoIndex = detected?.repoHost \n ? repoHostChoices.findIndex(c => c.value === detected.repoHost)\n : 0;\n\n const repoHostResponse = await prompts({\n type: \"select\",\n name: \"repoHost\",\n message: chalk.white(\"Repository host:\"),\n choices: repoHostChoices,\n initial: detectedRepoIndex > 0 ? detectedRepoIndex : 0,\n }, promptConfig);\n answers.repoHost = repoHostResponse.repoHost || \"\";\n\n const visibilityResponse = await prompts({\n type: \"toggle\",\n name: \"isPublic\",\n message: chalk.white(\"Public repository?\"),\n initial: true, // Default Yes\n active: \"Yes\",\n inactive: \"No\",\n }, promptConfig);\n answers.isPublic = visibilityResponse.isPublic ?? true;\n\n // Find initial index for detected license\n const licenseChoices = [\n { title: chalk.gray(\"⏭ Skip\"), value: \"\" },\n ...LICENSES.map(l => ({\n title: detected?.license === l.id\n ? `${l.label} ${chalk.green(\"(detected)\")}`\n : l.label,\n value: l.id,\n })),\n ];\n const detectedLicenseIndex = detected?.license\n ? licenseChoices.findIndex(c => c.value === detected.license)\n : 0;\n\n const licenseResponse = await prompts({\n type: \"select\",\n name: \"license\",\n message: chalk.white(\"License:\"),\n choices: licenseChoices,\n initial: detectedLicenseIndex > 0 ? detectedLicenseIndex : 0,\n }, promptConfig);\n answers.license = licenseResponse.license || \"\";\n\n const conventionalResponse = await prompts({\n type: \"toggle\",\n name: \"conventionalCommits\",\n message: chalk.white(\"Use Conventional Commits?\"),\n initial: true, // Default Yes\n active: \"Yes\",\n inactive: \"No\",\n }, promptConfig);\n answers.conventionalCommits = conventionalResponse.conventionalCommits ?? true;\n\n const semverResponse = await prompts({\n type: \"toggle\",\n name: \"semver\",\n message: chalk.white(\"Use Semantic Versioning?\"),\n initial: true, // Default Yes\n active: \"Yes\",\n inactive: \"No\",\n }, promptConfig);\n answers.semver = semverResponse.semver ?? true;\n\n // Conditional semver options\n if (answers.semver) {\n const tagFormatResponse = await prompts({\n type: \"select\",\n name: \"versionTagFormat\",\n message: chalk.white(\"Version tag format:\"),\n choices: [\n { title: \"v-prefix (v1.0.0)\", value: \"v_prefix\" },\n { title: \"No prefix (1.0.0)\", value: \"no_prefix\" },\n { title: \"Package prefix (@pkg/v1.0.0)\", value: \"package_prefix\" },\n { title: \"Date-based (2024.01.15)\", value: \"date_based\" },\n { title: \"Custom format\", value: \"custom\" },\n ],\n initial: 0,\n }, promptConfig);\n answers.versionTagFormat = tagFormatResponse.versionTagFormat || \"v_prefix\";\n\n const changelogResponse = await prompts({\n type: \"select\",\n name: \"changelogTool\",\n message: chalk.white(\"Changelog management:\"),\n choices: [\n { title: \"Manual\", value: \"manual\" },\n { title: \"Conventional Changelog\", value: \"conventional_changelog\" },\n { title: \"Release Please\", value: \"release_please\" },\n { title: \"Semantic Release\", value: \"semantic_release\" },\n { title: \"Changesets\", value: \"changesets\" },\n { title: \"GitHub Releases\", value: \"github_releases\" },\n { title: \"Keep a Changelog\", value: \"keep_a_changelog\" },\n { title: \"Other\", value: \"other\" },\n ],\n initial: 0,\n }, promptConfig);\n answers.changelogTool = changelogResponse.changelogTool || \"manual\";\n }\n\n // Commit signing\n const signingResponse = await prompts({\n type: \"toggle\",\n name: \"commitSigning\",\n message: chalk.white(\"Require commit signing (GPG/SSH)?\"),\n initial: false,\n active: \"Yes\",\n inactive: \"No\",\n }, promptConfig);\n answers.commitSigning = signingResponse.commitSigning ?? false;\n\n // Branch strategy\n const branchStrategyResponse = await prompts({\n type: \"select\",\n name: \"branchStrategy\",\n message: chalk.white(\"Branch strategy:\"),\n choices: [\n { title: \"🌊 GitHub Flow - Simple: main + feature branches\", value: \"github_flow\" },\n { title: \"🌳 Gitflow - develop, feature, release, hotfix branches\", value: \"gitflow\" },\n { title: \"🚂 Trunk-Based - Short-lived branches, continuous integration\", value: \"trunk_based\" },\n { title: \"🦊 GitLab Flow - Environment branches (staging, production)\", value: \"gitlab_flow\" },\n { title: \"🚀 Release Flow - main + release branches\", value: \"release_flow\" },\n ],\n initial: 0,\n }, promptConfig);\n answers.branchStrategy = branchStrategyResponse.branchStrategy || \"github_flow\";\n\n // Default branch\n const defaultBranchResponse = await prompts({\n type: \"select\",\n name: \"defaultBranch\",\n message: chalk.white(\"Default branch name:\"),\n choices: [\n { title: \"main\", value: \"main\" },\n { title: \"master\", value: \"master\" },\n { title: \"develop\", value: \"develop\" },\n { title: \"trunk\", value: \"trunk\" },\n ],\n initial: 0,\n }, promptConfig);\n answers.defaultBranch = defaultBranchResponse.defaultBranch || \"main\";\n\n // Commit workflow preference\n const commitWorkflowResponse = await prompts({\n type: \"select\",\n name: \"commitWorkflow\",\n message: chalk.white(\"Commit workflow preference:\"),\n choices: [\n { title: \"🔀 Branch + PR - Create branches and open pull requests\", value: \"branch_pr\" },\n { title: \"⬆️ Direct to main - Commit directly to main/master branch\", value: \"direct_main\" },\n ],\n initial: 0, // Default to branch + PR\n }, promptConfig);\n answers.commitWorkflow = commitWorkflowResponse.commitWorkflow || \"branch_pr\";\n\n // Dependabot/Renovate moved to Security step\n\n // CI/CD Platform - use detected value if available\n const cicdChoices = [\n { title: chalk.gray(\"⏭ Skip\"), value: \"\" },\n ...CICD_OPTIONS.map(c => ({\n title: detected?.cicd === c.id\n ? `${c.icon} ${c.label} ${chalk.green(\"(detected)\")}`\n : `${c.icon} ${c.label}`,\n value: c.id,\n })),\n ];\n const detectedCicdIndex = detected?.cicd\n ? cicdChoices.findIndex(c => c.value === detected.cicd)\n : 0;\n\n const cicdResponse = await prompts({\n type: \"select\",\n name: \"cicd\",\n message: chalk.white(\"CI/CD Platform:\"),\n choices: cicdChoices,\n initial: detectedCicdIndex > 0 ? detectedCicdIndex : 0,\n }, promptConfig);\n answers.cicd = cicdResponse.cicd || \"\";\n\n // Deployment targets - pre-select Docker if Dockerfile detected (with search)\n const deployChoices = sortSelectedFirst(DEPLOYMENT_TARGETS.map(t => ({\n title: (t.id === \"docker\" && detected?.hasDocker)\n ? `${t.icon}${t.label} ${chalk.green(\"(detected)\")}`\n : `${t.icon}${t.label}`,\n selected: t.id === \"docker\" && detected?.hasDocker,\n value: t.id,\n })));\n const deployResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"deploymentTargets\",\n message: chalk.white(\"Deployment targets (type to search):\"),\n choices: deployChoices,\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n answers.deploymentTargets = deployResponse.deploymentTargets || [];\n\n // Container build - default to Yes if Docker is selected in deployment targets\n const dockerSelected = (answers.deploymentTargets as string[] || []).includes(\"docker\");\n const containerResponse = await prompts({\n type: \"toggle\",\n name: \"buildContainer\",\n message: chalk.white(\"Build container images (Docker)?\"),\n initial: dockerSelected, // Default Yes if Docker selected\n active: \"Yes\",\n inactive: \"No\",\n }, promptConfig);\n answers.buildContainer = containerResponse.buildContainer ?? dockerSelected;\n\n // Container registry (if building containers)\n if (answers.buildContainer) {\n const registryResponse = await prompts({\n type: \"select\",\n name: \"containerRegistry\",\n message: chalk.white(\"Container registry:\"),\n choices: [\n { title: chalk.gray(\"⏭ Skip\"), value: \"\" },\n ...CONTAINER_REGISTRIES.map(r => ({\n title: `${r.icon} ${r.label}`,\n value: r.id,\n })),\n ],\n initial: 0,\n }, promptConfig);\n answers.containerRegistry = registryResponse.containerRegistry || \"\";\n \n // If custom/self-hosted registry selected, ask for URL\n if (answers.containerRegistry === \"custom\") {\n const customRegistryResponse = await prompts({\n type: \"text\",\n name: \"customRegistryUrl\",\n message: chalk.white(\"Container registry URL:\"),\n hint: chalk.gray(\"e.g., registry.example.com:5000\"),\n validate: (v) => v.trim() ? true : \"Please enter a registry URL\",\n }, promptConfig);\n answers.customRegistryUrl = customRegistryResponse.customRegistryUrl || \"\";\n }\n }\n\n // Example repository URL\n console.log();\n console.log(chalk.gray(\" 📚 Point the AI to a well-structured public repository as a reference.\"));\n console.log(chalk.gray(\" The AI will study its code patterns, architecture, and conventions to better assist you.\"));\n const exampleRepoResponse = await prompts({\n type: \"text\",\n name: \"exampleRepoUrl\",\n message: chalk.white(\"Reference repository URL (optional):\"),\n hint: chalk.gray(\"e.g., https://github.com/vercel/next.js\"),\n }, promptConfig);\n answers.exampleRepoUrl = exampleRepoResponse.exampleRepoUrl || \"\";\n\n // External documentation URL\n console.log();\n console.log(chalk.gray(\" 📖 Link to your team's external documentation for project context.\"));\n console.log(chalk.gray(\" The AI will read these docs to understand your project's domain and conventions.\"));\n const docsUrlResponse = await prompts({\n type: \"text\",\n name: \"documentationUrl\",\n message: chalk.white(\"External docs URL (optional):\"),\n hint: chalk.gray(\"e.g., Confluence, Notion, GitBook, internal wiki\"),\n }, promptConfig);\n answers.documentationUrl = docsUrlResponse.documentationUrl || \"\";\n\n // ═══════════════════════════════════════════════════════════════\n // STEP 5: Security (basic - FREE tier for all users)\n // ═══════════════════════════════════════════════════════════════\n const securityStep = getCurrentStep(\"security\")!;\n showStep(currentStepNum, securityStep, userTier);\n\n // 1. Authentication Providers (login methods)\n console.log();\n console.log(chalk.cyan(\" 1️⃣ Authentication Providers\"));\n console.log(chalk.gray(\" Which login methods should your app support?\"));\n console.log();\n\n const authProvidersResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"authProviders\",\n message: chalk.white(\"Auth providers (type to search):\"),\n choices: [\n { title: \"Email/Password\", value: \"email_password\", description: chalk.gray(\"Traditional credentials\") },\n { title: \"Google\", value: \"google\", description: chalk.gray(\"Google OAuth\") },\n { title: \"GitHub\", value: \"github\", description: chalk.gray(\"GitHub OAuth\") },\n { title: \"GitLab\", value: \"gitlab\", description: chalk.gray(\"GitLab OAuth\") },\n { title: \"Microsoft\", value: \"microsoft\", description: chalk.gray(\"Azure AD / Microsoft\") },\n { title: \"Apple\", value: \"apple\", description: chalk.gray(\"Sign in with Apple\") },\n { title: \"Facebook\", value: \"facebook\", description: chalk.gray(\"Facebook Login\") },\n { title: \"Twitter/X\", value: \"twitter\", description: chalk.gray(\"Twitter OAuth\") },\n { title: \"LinkedIn\", value: \"linkedin\", description: chalk.gray(\"LinkedIn OAuth\") },\n { title: \"Discord\", value: \"discord\", description: chalk.gray(\"Discord OAuth\") },\n { title: \"Slack\", value: \"slack\", description: chalk.gray(\"Slack OAuth\") },\n { title: \"Magic Link\", value: \"magic_link\", description: chalk.gray(\"Email magic links\") },\n { title: \"SMS OTP\", value: \"sms_otp\", description: chalk.gray(\"SMS verification codes\") },\n { title: \"Passkeys/WebAuthn\", value: \"passkeys\", description: chalk.gray(\"Passwordless biometric\") },\n { title: \"SAML SSO\", value: \"saml_sso\", description: chalk.gray(\"Enterprise SAML\") },\n { title: \"Generic OIDC\", value: \"oidc_generic\", description: chalk.gray(\"Custom OIDC provider\") },\n { title: \"LDAP/AD\", value: \"ldap\", description: chalk.gray(\"Directory services\") },\n { title: \"Other\", value: \"other\", description: chalk.gray(\"Custom provider\") },\n ],\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n answers.authProviders = authProvidersResponse.authProviders || [];\n\n // 2. Secrets Management\n console.log();\n console.log(chalk.cyan(\" 2️⃣ Secrets Management\"));\n console.log(chalk.gray(\" How do you manage secrets and credentials?\"));\n console.log();\n\n const secretsResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"secretsManagement\",\n message: chalk.white(\"Secrets management strategies (type to search):\"),\n choices: SECRETS_MANAGEMENT_OPTIONS.map(opt => ({\n title: opt.recommended \n ? `${opt.label} ${chalk.green(\"★ recommended\")}`\n : opt.label,\n value: opt.id,\n description: chalk.gray(opt.description),\n selected: opt.recommended,\n })),\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n answers.secretsManagement = secretsResponse.secretsManagement || [];\n\n // If \"other\" selected, ask for custom input\n if ((answers.secretsManagement as string[]).includes(\"other\")) {\n const customSecretsResponse = await prompts({\n type: \"text\",\n name: \"customSecretsManagement\",\n message: chalk.white(\"Describe your secrets management approach:\"),\n hint: chalk.gray(\"e.g., custom KMS integration, proprietary vault\"),\n }, promptConfig);\n answers.secretsManagementOther = customSecretsResponse.customSecretsManagement || \"\";\n }\n\n // 3. Security Tooling (includes Dependabot/Renovate - multi-select, searchable)\n console.log();\n console.log(chalk.cyan(\" 3️⃣ Security Tooling\"));\n console.log(chalk.gray(\" Security scanning, dependency updates, and vulnerability detection.\"));\n console.log();\n \n const securityToolingResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"securityTooling\",\n message: chalk.white(\"Security tools (type to search):\"),\n choices: SECURITY_TOOLING_OPTIONS.map(opt => ({\n title: opt.recommended \n ? `${opt.label} ${chalk.green(\"★ recommended\")}`\n : opt.label,\n value: opt.id,\n description: chalk.gray(opt.description),\n selected: opt.recommended,\n })),\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n answers.securityTooling = securityToolingResponse.securityTooling || [];\n\n // If \"other\" selected, ask for custom input\n if ((answers.securityTooling as string[]).includes(\"other\")) {\n const customSecurityToolingResponse = await prompts({\n type: \"text\",\n name: \"customSecurityTooling\",\n message: chalk.white(\"Describe your security tooling:\"),\n hint: chalk.gray(\"e.g., custom SAST tool, internal vulnerability scanner\"),\n }, promptConfig);\n answers.securityToolingOther = customSecurityToolingResponse.customSecurityTooling || \"\";\n }\n\n // 4. Authentication Patterns (multi-select, searchable)\n console.log();\n console.log(chalk.cyan(\" 4️⃣ Authentication Patterns\"));\n console.log(chalk.gray(\" How users and services authenticate with your application.\"));\n console.log();\n \n const authPatternsResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"authPatterns\",\n message: chalk.white(\"Auth patterns (type to search):\"),\n choices: AUTH_PATTERNS_OPTIONS.map(opt => ({\n title: opt.recommended \n ? `${opt.label} ${chalk.green(\"★ recommended\")}`\n : opt.label,\n value: opt.id,\n description: chalk.gray(opt.description),\n })),\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n answers.authPatterns = authPatternsResponse.authPatterns || [];\n\n // If \"other\" selected, ask for custom input\n if ((answers.authPatterns as string[]).includes(\"other\")) {\n const customAuthResponse = await prompts({\n type: \"text\",\n name: \"customAuthPatterns\",\n message: chalk.white(\"Describe your authentication approach:\"),\n hint: chalk.gray(\"e.g., custom SSO, proprietary auth system\"),\n }, promptConfig);\n answers.authPatternsOther = customAuthResponse.customAuthPatterns || \"\";\n }\n\n // 5. Data Handling (multi-select, searchable)\n console.log();\n console.log(chalk.cyan(\" 5️⃣ Data Handling & Compliance\"));\n console.log(chalk.gray(\" Data protection, encryption, and compliance requirements.\"));\n console.log();\n \n const dataHandlingResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"dataHandling\",\n message: chalk.white(\"Data handling policies (type to search):\"),\n choices: DATA_HANDLING_OPTIONS.map(opt => ({\n title: opt.recommended \n ? `${opt.label} ${chalk.green(\"★ recommended\")}`\n : opt.label,\n value: opt.id,\n description: chalk.gray(opt.description),\n selected: opt.recommended,\n })),\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n answers.dataHandling = dataHandlingResponse.dataHandling || [];\n\n // If \"other\" selected, ask for custom input\n if ((answers.dataHandling as string[]).includes(\"other\")) {\n const customDataHandlingResponse = await prompts({\n type: \"text\",\n name: \"customDataHandling\",\n message: chalk.white(\"Describe your data handling policies:\"),\n hint: chalk.gray(\"e.g., custom encryption, specific compliance requirements\"),\n }, promptConfig);\n answers.dataHandlingOther = customDataHandlingResponse.customDataHandling || \"\";\n }\n\n // 6. Compliance Standards\n console.log();\n console.log(chalk.cyan(\" 6️⃣ Compliance Standards\"));\n console.log(chalk.gray(\" Regulatory compliance requirements for your application.\"));\n console.log();\n\n const complianceResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"compliance\",\n message: chalk.white(\"Compliance standards (type to search):\"),\n choices: [\n { title: \"GDPR - EU data protection\", value: \"gdpr\" },\n { title: \"CCPA - California privacy\", value: \"ccpa\" },\n { title: \"HIPAA - Healthcare data\", value: \"hipaa\" },\n { title: \"SOC 2 - Service controls\", value: \"soc2\" },\n { title: \"PCI-DSS - Payment card data\", value: \"pci_dss\" },\n { title: \"ISO 27001 - Information security\", value: \"iso27001\" },\n { title: \"FedRAMP - US federal cloud\", value: \"fedramp\" },\n { title: \"Other\", value: \"other\" },\n ],\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n answers.compliance = complianceResponse.compliance || [];\n\n // 7. Analytics & Telemetry\n console.log();\n console.log(chalk.cyan(\" 7️⃣ Analytics & Telemetry\"));\n console.log(chalk.gray(\" Usage analytics and monitoring solutions.\"));\n console.log();\n\n const analyticsResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"analytics\",\n message: chalk.white(\"Analytics tools (type to search):\"),\n choices: [\n { title: \"Google Analytics (GA4)\", value: \"google_analytics\" },\n { title: \"Plausible - Privacy-focused\", value: \"plausible\" },\n { title: \"PostHog - Product analytics\", value: \"posthog\" },\n { title: \"Mixpanel - Event analytics\", value: \"mixpanel\" },\n { title: \"Amplitude - Product analytics\", value: \"amplitude\" },\n { title: \"Segment - Data pipeline\", value: \"segment\" },\n { title: \"Umami - Self-hosted analytics\", value: \"umami\" },\n { title: \"Matomo - Self-hosted (Piwik)\", value: \"matomo\" },\n { title: \"No Analytics - Privacy-first approach\", value: \"none\" },\n { title: \"Other\", value: \"other\" },\n ],\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n answers.analytics = analyticsResponse.analytics || [];\n\n // Additional security notes\n const securityNotesResponse = await prompts({\n type: \"text\",\n name: \"securityNotes\",\n message: chalk.white(\"Additional security notes (optional):\"),\n hint: chalk.gray(\"e.g., specific compliance requirements, custom security practices\"),\n }, promptConfig);\n answers.securityNotes = securityNotesResponse.securityNotes || \"\";\n\n // Show security summary\n console.log();\n console.log(chalk.green(\" ✓ Security configuration complete:\"));\n if ((answers.authProviders as string[]).length > 0) {\n console.log(chalk.gray(` • Auth Providers: ${(answers.authProviders as string[]).join(\", \")}`));\n }\n if ((answers.secretsManagement as string[]).length > 0) {\n console.log(chalk.gray(` • Secrets: ${(answers.secretsManagement as string[]).join(\", \")}`));\n }\n if ((answers.securityTooling as string[]).length > 0) {\n console.log(chalk.gray(` • Tooling: ${(answers.securityTooling as string[]).join(\", \")}`));\n }\n if ((answers.authPatterns as string[]).length > 0) {\n console.log(chalk.gray(` • Auth Patterns: ${(answers.authPatterns as string[]).join(\", \")}`));\n }\n if ((answers.dataHandling as string[]).length > 0) {\n console.log(chalk.gray(` • Data: ${(answers.dataHandling as string[]).join(\", \")}`));\n }\n if ((answers.compliance as string[]).length > 0) {\n console.log(chalk.gray(` • Compliance: ${(answers.compliance as string[]).join(\", \")}`));\n }\n if ((answers.analytics as string[]).length > 0) {\n console.log(chalk.gray(` • Analytics: ${(answers.analytics as string[]).join(\", \")}`));\n }\n\n // ═══════════════════════════════════════════════════════════════\n // STEP 6: Commands (intermediate)\n // (was STEP 5 before Security step added)\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 (type to search):\"));\n console.log();\n\n // Build commands - autocomplete for searching\n const buildChoices = sortSelectedFirst(COMMON_COMMANDS.build.map(c => {\n const isDetected = detected?.commands?.build === c;\n return {\n title: isDetected ? `${chalk.cyan(c)} ${chalk.green(\"(detected)\")}` : chalk.cyan(c),\n value: c,\n selected: isDetected,\n };\n }));\n const buildResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"build\",\n message: chalk.white(\"Build commands (type to search):\"),\n choices: buildChoices,\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n\n // Test commands - autocomplete for searching\n const testChoices = sortSelectedFirst(COMMON_COMMANDS.test.map(c => {\n const isDetected = detected?.commands?.test === c;\n return {\n title: isDetected ? `${chalk.yellow(c)} ${chalk.green(\"(detected)\")}` : chalk.yellow(c),\n value: c,\n selected: isDetected,\n };\n }));\n const testResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"test\",\n message: chalk.white(\"Test commands (type to search):\"),\n choices: testChoices,\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n\n // Lint commands - autocomplete for searching\n const lintChoices = sortSelectedFirst(COMMON_COMMANDS.lint.map(c => {\n const isDetected = detected?.commands?.lint === c;\n return {\n title: isDetected ? `${chalk.green(c)} ${chalk.green(\"(detected)\")}` : chalk.green(c),\n value: c,\n selected: isDetected,\n };\n }));\n const lintResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"lint\",\n message: chalk.white(\"Lint/format commands (type to search):\"),\n choices: lintChoices,\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n\n // Dev commands - autocomplete for searching\n const devChoices = sortSelectedFirst(COMMON_COMMANDS.dev.map(c => {\n const isDetected = detected?.commands?.dev === c;\n return {\n title: isDetected ? `${chalk.magenta(c)} ${chalk.green(\"(detected)\")}` : chalk.magenta(c),\n value: c,\n selected: isDetected,\n };\n }));\n const devResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"dev\",\n message: chalk.white(\"Dev server commands (type to search):\"),\n choices: devChoices,\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n\n // Format commands - autocomplete for searching\n const formatResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"format\",\n message: chalk.white(\"Format commands (type to search):\"),\n choices: COMMON_COMMANDS.format.map(c => ({\n title: chalk.blue(c),\n value: c,\n })),\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n\n // Typecheck commands - autocomplete for searching\n const typecheckResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"typecheck\",\n message: chalk.white(\"Typecheck commands (type to search):\"),\n choices: COMMON_COMMANDS.typecheck.map(c => ({\n title: chalk.gray(c),\n value: c,\n })),\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n\n // Clean commands - autocomplete for searching\n const cleanResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"clean\",\n message: chalk.white(\"Clean commands (type to search):\"),\n choices: COMMON_COMMANDS.clean.map(c => ({\n title: chalk.red(c),\n value: c,\n })),\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n\n // Pre-commit commands - autocomplete for searching\n const preCommitResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"preCommit\",\n message: chalk.white(\"Pre-commit hooks (type to search):\"),\n choices: COMMON_COMMANDS.preCommit.map(c => ({\n title: chalk.yellow(c),\n value: c,\n })),\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n\n // Additional commands - autocomplete for searching\n const additionalResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"additional\",\n message: chalk.white(\"Additional commands (type to search):\"),\n choices: COMMON_COMMANDS.additional.map(c => ({\n title: chalk.blue(c),\n value: c,\n })),\n hint: chalk.gray(\"type to filter • 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 format: formatResponse.format || [],\n typecheck: typecheckResponse.typecheck || [],\n clean: cleanResponse.clean || [],\n preCommit: preCommitResponse.preCommit || [],\n additional: additionalResponse.additional || [],\n };\n\n // Custom command\n const customCmdResponse = await prompts({\n type: \"text\",\n name: \"custom\",\n message: chalk.white(\"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 7: Code Style (intermediate)\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: [\n { title: chalk.gray(\"⏭ Skip\"), value: \"\" },\n ...NAMING_CONVENTIONS.map(n => ({\n title: n.id === \"language_default\" \n ? `${n.label} ${chalk.green(\"★ recommended\")}`\n : n.label,\n value: n.id,\n description: chalk.gray(n.desc),\n })),\n ],\n initial: 1, // Pre-select \"Follow language conventions\"\n }, promptConfig);\n answers.namingConvention = namingResponse.naming || \"\";\n\n const errorResponse = await prompts({\n type: \"select\",\n name: \"errorHandling\",\n message: chalk.white(\"Error handling pattern:\"),\n choices: [\n { title: chalk.gray(\"⏭ Skip\"), value: \"\" },\n ...ERROR_PATTERNS.map(e => ({\n title: e.label,\n value: e.id,\n })),\n ],\n initial: 0,\n }, promptConfig);\n answers.errorHandling = errorResponse.errorHandling || \"\";\n \n // If \"other\" selected, ask for custom input\n if (answers.errorHandling === \"other\") {\n const customErrorResponse = await prompts({\n type: \"text\",\n name: \"customErrorHandling\",\n message: chalk.white(\"Describe your error handling approach:\"),\n hint: chalk.gray(\"e.g., Railway-oriented, custom error boundaries\"),\n }, promptConfig);\n answers.errorHandlingOther = customErrorResponse.customErrorHandling || \"\";\n }\n\n // Logging conventions - searchable select like WebUI\n const loggingResponse = await prompts({\n type: \"autocomplete\",\n name: \"loggingConventions\",\n message: chalk.white(\"Logging conventions (type to search):\"),\n choices: [\n { title: chalk.gray(\"⏭ Skip\"), value: \"\" },\n ...LOGGING_OPTIONS.map(l => ({\n title: l.label,\n value: l.id,\n })),\n ],\n initial: 0,\n }, promptConfig);\n answers.loggingConventions = loggingResponse.loggingConventions || \"\";\n \n // If \"other\" selected, ask for custom input\n if (answers.loggingConventions === \"other\") {\n const customLoggingResponse = await prompts({\n type: \"text\",\n name: \"customLogging\",\n message: chalk.white(\"Describe your logging convention:\"),\n hint: chalk.gray(\"e.g., custom logger, file-based logging\"),\n }, promptConfig);\n answers.loggingConventionsOther = customLoggingResponse.customLogging || \"\";\n }\n\n // Max file length\n const maxFileLengthResponse = await prompts({\n type: \"number\",\n name: \"maxFileLength\",\n message: chalk.white(\"Max file length (lines, 100-1000):\"),\n initial: 300,\n min: 100,\n max: 1000,\n }, promptConfig);\n answers.maxFileLength = maxFileLengthResponse.maxFileLength || 300;\n\n // Import order\n const importOrderResponse = await prompts({\n type: \"select\",\n name: \"importOrder\",\n message: chalk.white(\"Import order preference:\"),\n choices: [\n { title: \"Grouped (external → internal → relative)\", value: \"grouped\" },\n { title: \"Alphabetical (sort A-Z)\", value: \"sorted\" },\n { title: \"Natural (leave as written)\", value: \"natural\" },\n ],\n initial: 0,\n }, promptConfig);\n answers.importOrder = importOrderResponse.importOrder || \"grouped\";\n\n // Comment language\n const commentLangResponse = await prompts({\n type: \"select\",\n name: \"commentLanguage\",\n message: chalk.white(\"Comment language:\"),\n choices: [\n { title: \"🇬🇧 English\", value: \"english\" },\n { title: \"🌍 Native language\", value: \"native\" },\n { title: \"🗣️ Any (team preference)\", value: \"any\" },\n ],\n initial: 0,\n }, promptConfig);\n answers.commentLanguage = commentLangResponse.commentLanguage || \"english\";\n\n // Documentation style\n const docStyleResponse = await prompts({\n type: \"select\",\n name: \"docStyle\",\n message: chalk.white(\"Documentation style:\"),\n choices: [\n { title: chalk.gray(\"⏭ Skip (language default)\"), value: \"\" },\n { title: \"JSDoc\", value: \"jsdoc\" },\n { title: \"TSDoc\", value: \"tsdoc\" },\n { title: \"Python docstrings\", value: \"pydoc\" },\n { title: \"Go doc comments\", value: \"godoc\" },\n { title: \"Rust doc (///)\", value: \"rustdoc\" },\n { title: \"Javadoc\", value: \"javadoc\" },\n { title: \"C# XML docs\", value: \"xmldoc\" },\n ],\n initial: 0,\n }, promptConfig);\n answers.docStyle = docStyleResponse.docStyle || \"\";\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 8: AI Behavior (basic - all users)\n // ═══════════════════════════════════════════════════════════════\n const aiStep = getCurrentStep(\"ai\")!;\n showStep(currentStepNum, aiStep, userTier);\n \n const aiBehaviorResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"aiBehavior\",\n message: chalk.white(\"AI behavior rules (type to filter):\"),\n choices: AI_BEHAVIOR_RULES.map(r => ({\n title: r.recommended \n ? `${r.label} ${chalk.green(\"★ recommended\")}`\n : r.label,\n value: r.id,\n description: chalk.gray(r.description),\n selected: true, // All selected by default\n })),\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n answers.aiBehavior = aiBehaviorResponse.aiBehavior || AI_BEHAVIOR_RULES.map(r => r.id);\n \n // Show selected rules in newlines\n if ((answers.aiBehavior as string[]).length > 0) {\n console.log(chalk.green(\" ✓ Selected:\"));\n for (const ruleId of (answers.aiBehavior as string[])) {\n const rule = AI_BEHAVIOR_RULES.find(r => r.id === ruleId);\n if (rule) console.log(chalk.cyan(` • ${rule.label}`));\n }\n }\n\n // Plan mode frequency\n const planModeResponse = await prompts({\n type: \"select\",\n name: \"planModeFrequency\",\n message: chalk.white(\"When should AI enter plan mode before changes?\"),\n choices: [\n { title: \"Always - Plan before every task\", value: \"always\" },\n { title: \"Complex Tasks - Multi-step or risky changes\", value: \"complex_tasks\" },\n { title: \"Multi-file Changes - When touching multiple files\", value: \"multi_file\" },\n { title: \"New Features Only - Only for new functionality\", value: \"new_features\" },\n { title: \"On Request - Only when explicitly asked\", value: \"on_request\" },\n { title: \"Never - Skip planning entirely\", value: \"never\" },\n ],\n initial: 1, // Default to complex_tasks\n }, promptConfig);\n answers.planModeFrequency = planModeResponse.planModeFrequency || \"complex_tasks\";\n\n // Explanation verbosity\n const verbosityResponse = await prompts({\n type: \"select\",\n name: \"explanationVerbosity\",\n message: chalk.white(\"Explanation verbosity:\"),\n choices: [\n { title: \"📝 Concise - Brief, to the point\", value: \"concise\" },\n { title: \"⚖️ Balanced - Clear with context\", value: \"balanced\" },\n { title: \"📚 Detailed - In-depth explanations\", value: \"detailed\" },\n ],\n initial: 1,\n }, promptConfig);\n answers.explanationVerbosity = verbosityResponse.explanationVerbosity || \"balanced\";\n\n // Focus areas\n const accessibilityResponse = await prompts({\n type: \"toggle\",\n name: \"accessibilityFocus\",\n message: chalk.white(\"Prioritize accessibility (WCAG, a11y)?\"),\n initial: false,\n active: \"Yes\",\n inactive: \"No\",\n }, promptConfig);\n answers.accessibilityFocus = accessibilityResponse.accessibilityFocus ?? false;\n\n const performanceResponse = await prompts({\n type: \"toggle\",\n name: \"performanceFocus\",\n message: chalk.white(\"Prioritize performance optimizations?\"),\n initial: false,\n active: \"Yes\",\n inactive: \"No\",\n }, promptConfig);\n answers.performanceFocus = performanceResponse.performanceFocus ?? false;\n\n console.log();\n console.log(chalk.gray(\" 📁 Select files the AI should read first to understand your project context.\"));\n console.log(chalk.gray(\" These help the AI understand your codebase, APIs, and conventions.\"));\n const importantFilesResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"importantFiles\",\n message: chalk.white(\"Important files AI should read (type to search):\"),\n choices: IMPORTANT_FILES.map(f => ({\n title: `${f.icon} ${f.label}`,\n value: f.id,\n description: chalk.gray(f.description),\n })),\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n answers.importantFiles = importantFilesResponse.importantFiles || [];\n\n // Ask for custom important files\n console.log();\n const customImportantFilesResponse = await prompts({\n type: \"text\",\n name: \"importantFilesOther\",\n message: chalk.white(\"Other important files (comma-separated, optional):\"),\n hint: chalk.gray(\"e.g., src/config/index.ts, docs/api.md, prisma/schema.prisma\"),\n }, promptConfig);\n answers.importantFilesOther = customImportantFilesResponse.importantFilesOther || \"\";\n\n // Cloud sync & AI learning options (grouped together)\n console.log();\n console.log(chalk.gray(\" ─── Cloud & AI Options ───\"));\n console.log();\n \n // Self-improving config - instruct AI to suggest improvements\n console.log(chalk.gray(\" 🧠 Write instructions in the generated config telling AI it can suggest improvements.\"));\n console.log(chalk.gray(\" The AI will learn your patterns and propose better rules, new conventions,\"));\n console.log(chalk.gray(\" and optimizations over time. You review and approve any changes.\"));\n const selfImproveResponse = await prompts({\n type: \"toggle\",\n name: \"selfImprove\",\n message: chalk.white(\"Enable self-improving AI config rules?\"),\n initial: false,\n active: \"Yes\",\n inactive: \"No\",\n hint: chalk.gray(\"Instructs AI to suggest improvements\"),\n }, promptConfig);\n answers.selfImprove = selfImproveResponse.selfImprove || false;\n\n // Cloud sync - save to cloud and enable synchronization\n console.log();\n console.log(chalk.gray(\" ☁️ Store your config on LynxPrompt cloud for team sharing and version control.\"));\n console.log(chalk.gray(\" Benefits:\"));\n console.log(chalk.gray(\" • Share configs across devices and team members\"));\n console.log(chalk.gray(\" • Track changes and rollback if needed\"));\n console.log(chalk.gray(\" • Instructions added to config so AI can sync automatically\"));\n const enableAutoUpdateResponse = await prompts({\n type: \"toggle\",\n name: \"enableAutoUpdate\",\n message: chalk.white(\"Enable cloud synchronization?\"),\n initial: false,\n active: \"Yes\",\n inactive: \"No\",\n hint: chalk.gray(\"Enables push/pull/diff with LynxPrompt cloud\"),\n }, promptConfig);\n answers.enableAutoUpdate = enableAutoUpdateResponse.enableAutoUpdate || false;\n\n // Ask about CLI availability when cloud sync enabled\n answers.preferCliSync = true; // Default to CLI\n answers.tokenEnvVar = \"LYNXPROMPT_API_TOKEN\"; // Default env var name\n \n if (answers.enableAutoUpdate && api) {\n console.log();\n console.log(chalk.gray(\" 📦 How should the AI perform sync operations?\"));\n console.log();\n console.log(chalk.green.bold(\" CLI (Recommended):\"));\n console.log(chalk.gray(\" • Most secure - no tokens stored anywhere\"));\n console.log(chalk.gray(\" • AI runs lynxp commands directly\"));\n console.log(chalk.gray(\" • Requires CLI installed: npm install -g lynxprompt\"));\n console.log();\n console.log(chalk.yellow(\" curl/token/env variable:\"));\n console.log(chalk.gray(\" • Works without CLI installed\"));\n console.log(chalk.gray(\" • Token stored in environment variable (not in file)\"));\n console.log(chalk.gray(\" • Less convenient but still secure\"));\n console.log();\n \n const syncMethodResponse = await prompts({\n type: \"toggle\",\n name: \"preferCliSync\",\n message: chalk.white(\"Will LynxPrompt CLI be available in your dev environment?\"),\n initial: true, // Default to yes - strongly recommended\n active: \"Yes, use CLI (recommended)\",\n inactive: \"No, use curl/token/env variable\",\n hint: chalk.green(\"Strongly recommended for security\"),\n }, promptConfig);\n answers.preferCliSync = syncMethodResponse.preferCliSync ?? true;\n \n if (answers.preferCliSync) {\n console.log(chalk.green(\" ✓ Perfect! Config will include lynxp CLI commands for syncing\"));\n console.log(chalk.gray(\" Make sure CLI is installed: npm install -g lynxprompt\"));\n } else {\n // Ask for env var name where token will be stored\n console.log();\n console.log(chalk.gray(\" 🔐 Config will include curl commands using an environment variable.\"));\n console.log(chalk.gray(\" Your API token will NOT be stored in the config file.\"));\n const envVarResponse = await prompts({\n type: \"text\",\n name: \"tokenEnvVar\",\n message: chalk.white(\"Environment variable name for API token:\"),\n initial: \"LYNXPROMPT_API_TOKEN\",\n hint: chalk.gray(\"e.g., LYNXPROMPT_API_TOKEN, LP_TOKEN\"),\n }, promptConfig);\n answers.tokenEnvVar = envVarResponse.tokenEnvVar || \"LYNXPROMPT_API_TOKEN\";\n console.log(chalk.green(` ✓ Config will reference $${answers.tokenEnvVar}`));\n console.log(chalk.gray(` Remember to set: export ${answers.tokenEnvVar}=\"your_token_here\"`));\n }\n }\n\n if (answers.enableAutoUpdate && !api) {\n console.log(chalk.yellow(\" ⚠️ Cloud sync requires login. Run 'lynxp login' first.\"));\n console.log(chalk.gray(\" Continuing without cloud sync...\"));\n answers.enableAutoUpdate = false;\n }\n \n // If multiple output formats selected AND cloud sync enabled, ask which to upload\n const selectedPlatforms = answers.platforms as string[];\n if (answers.enableAutoUpdate && selectedPlatforms && selectedPlatforms.length > 1) {\n console.log();\n console.log(chalk.yellow(\" ⚠️ You selected multiple output formats but only one can be synced to cloud.\"));\n const primaryFormatResponse = await prompts({\n type: \"select\",\n name: \"primaryFormat\",\n message: chalk.white(\"Which format should be the cloud-synced version?\"),\n choices: selectedPlatforms.map(p => ({ title: p, value: p })),\n hint: chalk.gray(\"This version will be uploaded to LynxPrompt cloud\"),\n }, promptConfig);\n answers.primarySyncFormat = primaryFormatResponse.primaryFormat || selectedPlatforms[0];\n console.log(chalk.green(` ✓ ${answers.primarySyncFormat} will be synced to cloud, others are local-only`));\n }\n\n // Include personal data from profile\n console.log();\n console.log(chalk.gray(\" 👤 Include your profile info (name, email, persona) in the generated config.\"));\n console.log(chalk.gray(\" This helps AI tools personalize responses to your expertise level.\"));\n const includePersonalResponse = await prompts({\n type: \"toggle\",\n name: \"includePersonalData\",\n message: chalk.white(\"Include your profile data in config?\"),\n initial: false,\n active: \"Yes\",\n inactive: \"No\",\n hint: chalk.gray(\"Name, email, expertise from your profile\"),\n }, promptConfig);\n answers.includePersonalData = includePersonalResponse.includePersonalData || false;\n\n // If personal data enabled, fetch user profile from API\n if (answers.includePersonalData && api) {\n try {\n console.log(chalk.gray(\" Fetching profile from LynxPrompt...\"));\n const userResponse = await api.getUser();\n if (userResponse.user) {\n answers.userName = userResponse.user.name || userResponse.user.display_name || \"\";\n answers.userEmail = userResponse.user.email || \"\";\n answers.userPersona = userResponse.user.persona || \"\";\n // skill_level can serve as expertise\n answers.userExpertise = userResponse.user.skill_level || \"\";\n console.log(chalk.green(\" ✓ Profile loaded\"));\n }\n } catch {\n console.log(chalk.yellow(\" Could not fetch profile data. Using defaults.\"));\n }\n }\n\n // ═══════════════════════════════════════════════════════════════\n // STEP 9: Boundaries (advanced)\n // ═══════════════════════════════════════════════════════════════\n if (canAccessTier(userTier, \"advanced\")) {\n const boundariesStep = getCurrentStep(\"boundaries\")!;\n showStep(currentStepNum, boundariesStep, userTier);\n\n console.log(chalk.gray(\" Define what AI should never do, ask first, or always do.\"));\n console.log(chalk.gray(\" Each option can only be in one category.\"));\n console.log();\n\n // Track used options to filter them out from subsequent questions\n const usedOptions = new Set<string>();\n\n // 1. NEVER do - AI will refuse to do (ask first - most restrictive)\n console.log(chalk.red.bold(\" ✗ NEVER ALLOW - AI will refuse to do\"));\n const neverResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"never\",\n message: chalk.white(\"Never allow (type to filter):\"),\n choices: BOUNDARY_OPTIONS.map(o => ({\n title: chalk.red(o),\n value: o,\n })),\n hint: chalk.gray(\"space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n answers.boundaryNever = neverResponse.never || [];\n (answers.boundaryNever as string[]).forEach(o => usedOptions.add(o));\n\n // 2. ASK first - AI will ask before doing\n console.log();\n console.log(chalk.yellow.bold(\" ? ASK FIRST - AI will ask before doing\"));\n const availableForAsk = BOUNDARY_OPTIONS.filter(o => !usedOptions.has(o));\n const askResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"ask\",\n message: chalk.white(\"Ask first (type to filter):\"),\n choices: availableForAsk.map(o => ({\n title: chalk.yellow(o),\n value: o,\n })),\n hint: chalk.gray(\"space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n answers.boundaryAsk = askResponse.ask || [];\n (answers.boundaryAsk as string[]).forEach(o => usedOptions.add(o));\n\n // 3. ALWAYS do - AI will do these automatically\n console.log();\n console.log(chalk.green.bold(\" ✓ ALWAYS ALLOW - AI will do these automatically\"));\n const availableForAlways = BOUNDARY_OPTIONS.filter(o => !usedOptions.has(o));\n const alwaysResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"always\",\n message: chalk.white(\"Always allow (type to filter):\"),\n choices: availableForAlways.map(o => ({\n title: chalk.green(o),\n value: o,\n })),\n hint: chalk.gray(\"space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n answers.boundaryAlways = alwaysResponse.always || [];\n\n // Show summary\n console.log();\n console.log(chalk.gray(\" Boundary summary:\"));\n if ((answers.boundaryAlways as string[]).length > 0) {\n console.log(chalk.green(` ✓ Always: ${(answers.boundaryAlways as string[]).join(\", \")}`));\n }\n if ((answers.boundaryAsk as string[]).length > 0) {\n console.log(chalk.yellow(` ? Ask: ${(answers.boundaryAsk as string[]).join(\", \")}`));\n }\n if ((answers.boundaryNever as string[]).length > 0) {\n console.log(chalk.red(` ✗ Never: ${(answers.boundaryNever as string[]).join(\", \")}`));\n }\n } else {\n answers.boundaries = options.boundaries || \"standard\";\n }\n\n // ═══════════════════════════════════════════════════════════════\n // STEP 10: Testing Strategy (advanced)\n // ═══════════════════════════════════════════════════════════════\n if (canAccessTier(userTier, \"advanced\")) {\n const testingStep = getCurrentStep(\"testing\")!;\n showStep(currentStepNum, testingStep, userTier);\n\n const testLevelsResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"testLevels\",\n message: chalk.white(\"Test levels (type to search):\"),\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 hint: chalk.gray(\"type to filter • space select • enter confirm\"),\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 // Full list of test frameworks with search - expanded to match WebUI\n const testFrameworkChoices = sortSelectedFirst(TEST_FRAMEWORKS.map(f => ({\n title: f,\n value: f,\n selected: detectedFrameworks.includes(f),\n })));\n const testFrameworkResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"testFrameworks\",\n message: chalk.white(\"Testing frameworks (type to search):\"),\n choices: testFrameworkChoices,\n hint: chalk.gray(\"type to filter • 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 // TDD Preference\n const tddResponse = await prompts({\n type: \"toggle\",\n name: \"tddPreference\",\n message: chalk.white(\"Use Test-Driven Development (TDD)?\"),\n initial: false,\n active: \"Yes\",\n inactive: \"No\",\n }, promptConfig);\n answers.tddPreference = tddResponse.tddPreference ?? false;\n\n // Snapshot Testing\n const snapshotResponse = await prompts({\n type: \"toggle\",\n name: \"snapshotTesting\",\n message: chalk.white(\"Use snapshot testing?\"),\n initial: false,\n active: \"Yes\",\n inactive: \"No\",\n }, promptConfig);\n answers.snapshotTesting = snapshotResponse.snapshotTesting ?? false;\n\n // Mock Strategy\n const mockResponse = await prompts({\n type: \"select\",\n name: \"mockStrategy\",\n message: chalk.white(\"Mock strategy:\"),\n choices: [\n { title: \"Minimal - Only mock external dependencies\", value: \"minimal\" },\n { title: \"Comprehensive - Mock for isolation\", value: \"comprehensive\" },\n { title: \"None - No mocking preferred\", value: \"none\" },\n ],\n initial: 0,\n }, promptConfig);\n answers.mockStrategy = mockResponse.mockStrategy || \"minimal\";\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 11: Static Files (advanced)\n // ═══════════════════════════════════════════════════════════════\n if (canAccessTier(userTier, \"advanced\")) {\n const staticStep = getCurrentStep(\"static\")!;\n showStep(currentStepNum, staticStep, userTier);\n\n // First, ask how to handle static files\n console.log(chalk.gray(\" How should static file content be handled?\"));\n console.log();\n console.log(chalk.gray(\" 📄 Config only: Content embedded in AI config file (AI has context, no local files)\"));\n console.log(chalk.gray(\" 📁 Both: Create local files AND embed content in AI config file\"));\n console.log();\n \n const staticFileHandlingResponse = await prompts({\n type: \"select\",\n name: \"handling\",\n message: chalk.white(\"Where to add static file content?\"),\n choices: [\n { title: \"📄 Config file only (recommended)\", value: \"config_only\", description: \"Content goes in AI config, no separate files created\" },\n { title: \"📁 Both local files AND config\", value: \"both\", description: \"Create files locally AND embed in AI config\" },\n ],\n initial: 0,\n }, promptConfig);\n answers.staticFileHandling = staticFileHandlingResponse.handling || \"config_only\";\n\n console.log();\n console.log(chalk.gray(\" Select project files to include:\"));\n console.log();\n\n // Static file options with metadata\n const STATIC_FILE_OPTIONS = [\n { title: \"📝 .editorconfig\", value: \"editorconfig\", desc: \"Consistent code formatting\" },\n { title: \"🤝 CONTRIBUTING.md\", value: \"contributing\", desc: \"Contributor guidelines\" },\n { title: \"📜 CODE_OF_CONDUCT.md\", value: \"codeOfConduct\", desc: \"Community standards\" },\n { title: \"🔒 SECURITY.md\", value: \"security\", desc: \"Vulnerability reporting\" },\n { title: \"🗺️ ROADMAP.md\", value: \"roadmap\", desc: \"Project roadmap\" },\n { title: \"📋 .gitignore\", value: \"gitignore\", desc: \"Git ignore patterns\" },\n { title: \"💰 FUNDING.yml\", value: \"funding\", desc: \"GitHub Sponsors config\" },\n { title: \"📄 LICENSE\", value: \"license\", desc: \"License file\" },\n { title: \"📖 README.md\", value: \"readme\", desc: \"Project readme\" },\n { title: \"🏗️ ARCHITECTURE.md\", value: \"architecture\", desc: \"Architecture docs\" },\n { title: \"📝 CHANGELOG.md\", value: \"changelog\", desc: \"Version history\" },\n ];\n\n // Detect existing files\n const existingFiles: Record<string, string> = {};\n for (const opt of STATIC_FILE_OPTIONS) {\n const filePath = STATIC_FILE_PATHS[opt.value];\n if (filePath) {\n const content = await readExistingFile(join(process.cwd(), filePath));\n if (content) {\n existingFiles[opt.value] = content;\n }\n }\n }\n\n const existingCount = Object.keys(existingFiles).length;\n if (existingCount > 0) {\n console.log(chalk.green(` ✓ Found ${existingCount} existing file(s) in your project`));\n console.log();\n }\n\n const staticFilesResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"staticFiles\",\n message: chalk.white(\"Include static files (type to search):\"),\n choices: STATIC_FILE_OPTIONS.map(f => ({\n title: existingFiles[f.value] \n ? `${f.title} ${chalk.green(\"(exists)\")}`\n : f.title,\n value: f.value,\n description: chalk.gray(f.desc),\n })),\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n answers.staticFiles = staticFilesResponse.staticFiles || [];\n\n // For each selected file, prompt for content\n if ((answers.staticFiles as string[])?.length > 0) {\n console.log();\n console.log(chalk.cyan(\" 📝 Customize file contents:\"));\n console.log(chalk.gray(\" For each file, choose to use existing content, write new, or use defaults.\"));\n if (canAccessAI(userTier)) {\n console.log(chalk.magenta(` ✨ Tip: Type 'ai:' followed by your request to use AI assistance`));\n }\n console.log();\n\n answers.staticFileContents = {};\n \n for (const fileKey of (answers.staticFiles as string[])) {\n const fileOpt = STATIC_FILE_OPTIONS.find(f => f.value === fileKey);\n if (!fileOpt) continue;\n\n const filePath = STATIC_FILE_PATHS[fileKey];\n const existingContent = existingFiles[fileKey];\n\n if (existingContent) {\n // File exists - ask what to do\n const preview = existingContent.split(\"\\n\").slice(0, 3).join(\"\\n\");\n console.log(chalk.gray(` ─── ${filePath} (existing) ───`));\n console.log(chalk.gray(preview.substring(0, 150) + (preview.length > 150 ? \"...\" : \"\")));\n console.log();\n\n const actionResponse = await prompts({\n type: \"select\",\n name: \"action\",\n message: chalk.white(`${filePath}:`),\n choices: [\n { title: chalk.green(\"✓ Use existing content\"), value: \"existing\" },\n { title: chalk.yellow(\"✏️ Write new content\"), value: \"new\" },\n { title: chalk.gray(\"⚡ Generate default\"), value: \"default\" },\n ],\n initial: 0,\n }, promptConfig);\n\n if (actionResponse.action === \"existing\") {\n (answers.staticFileContents as Record<string, string>)[fileKey] = existingContent;\n } else if (actionResponse.action === \"new\") {\n console.log();\n const content = await readMultilineInput(` Content for ${filePath}:`);\n if (content.trim()) {\n (answers.staticFileContents as Record<string, string>)[fileKey] = content;\n }\n }\n // \"default\" - don't add to staticFileContents, generator will create default\n } else {\n // File doesn't exist - ask if they want to write content\n const actionResponse = await prompts({\n type: \"select\",\n name: \"action\",\n message: chalk.white(`${filePath}:`),\n choices: [\n { title: chalk.gray(\"⚡ Generate default\"), value: \"default\" },\n { title: chalk.yellow(\"✏️ Write custom content\"), value: \"new\" },\n ],\n initial: 0,\n }, promptConfig);\n\n if (actionResponse.action === \"new\") {\n console.log();\n if (canAccessAI(userTier)) {\n const aiPromptResponse = await prompts({\n type: \"text\",\n name: \"input\",\n message: chalk.white(`Content for ${filePath}:`),\n hint: chalk.gray(\"Type 'ai:' + description OR paste content (press Enter twice to skip)\"),\n }, promptConfig);\n \n let content = aiPromptResponse.input || \"\";\n \n if (content.toLowerCase().startsWith(\"ai:\")) {\n const aiInstruction = content.substring(3).trim();\n if (aiInstruction) {\n const aiResult = await aiAssist(`Generate ${filePath} content: ${aiInstruction}`, existingContent);\n if (aiResult) {\n console.log(chalk.cyan(\" AI-generated content preview (first 200 chars):\"));\n console.log(chalk.gray(\" \" + aiResult.substring(0, 200) + (aiResult.length > 200 ? \"...\" : \"\")));\n const acceptAI = await prompts({\n type: \"confirm\",\n name: \"accept\",\n message: chalk.white(\"Use this AI-generated content?\"),\n initial: true,\n }, promptConfig);\n if (acceptAI.accept) {\n content = aiResult;\n } else {\n content = \"\";\n }\n }\n }\n }\n \n if (content.trim()) {\n (answers.staticFileContents as Record<string, string>)[fileKey] = content;\n }\n } else {\n const content = await readMultilineInput(` Content for ${filePath}:`);\n if (content.trim()) {\n (answers.staticFileContents as Record<string, string>)[fileKey] = content;\n }\n }\n }\n }\n console.log();\n }\n }\n }\n\n // ═══════════════════════════════════════════════════════════════\n // STEP 12: Final Details / Extra (basic - all users)\n // ═══════════════════════════════════════════════════════════════\n const extraStep = getCurrentStep(\"extra\")!;\n showStep(currentStepNum, extraStep, userTier);\n\n // AI persona is handled from profile settings, not asked here\n // (Users can set their persona in the web UI under AI Configuration)\n answers.persona = \"\";\n\n // Anything else - with AI assist option for Teams users\n const hasAIAccess = canAccessAI(userTier);\n \n if (hasAIAccess) {\n console.log();\n console.log(chalk.magenta(\" ✨ AI Assistant available\"));\n console.log(chalk.gray(\" Type 'ai:' followed by your request to get AI-generated content.\"));\n console.log(chalk.gray(\" Example: ai: add guidelines for API error handling\"));\n console.log();\n }\n\n const extraNotesResponse = await prompts({\n type: \"text\",\n name: \"extraNotes\",\n message: chalk.white(\"Anything else AI should know? (optional):\"),\n hint: hasAIAccess \n ? chalk.gray(\"Enter text or type 'ai:' followed by your request\")\n : chalk.gray(\"Special requirements, gotchas, team conventions...\"),\n }, promptConfig);\n \n let extraNotes = extraNotesResponse.extraNotes || \"\";\n \n // Check if user wants AI assistance\n if (hasAIAccess && extraNotes.toLowerCase().startsWith(\"ai:\")) {\n const aiInstruction = extraNotes.substring(3).trim();\n if (aiInstruction) {\n const aiResult = await aiAssist(aiInstruction);\n if (aiResult) {\n console.log();\n console.log(chalk.cyan(\" AI suggestion:\"));\n console.log(chalk.gray(\" ─\".repeat(30)));\n console.log(chalk.white(\" \" + aiResult.split(\"\\n\").join(\"\\n \")));\n console.log(chalk.gray(\" ─\".repeat(30)));\n console.log();\n \n const acceptResponse = await prompts({\n type: \"confirm\",\n name: \"accept\",\n message: chalk.white(\"Use this AI-generated content?\"),\n initial: true,\n }, promptConfig);\n \n if (acceptResponse.accept) {\n extraNotes = aiResult;\n } else {\n // Let user write their own\n const manualResponse = await prompts({\n type: \"text\",\n name: \"extraNotes\",\n message: chalk.white(\"Enter your own notes instead:\"),\n }, promptConfig);\n extraNotes = manualResponse.extraNotes || \"\";\n }\n }\n }\n }\n \n answers.extraNotes = extraNotes;\n\n // ═══════════════════════════════════════════════════════════════\n // BUILD FINAL CONFIG\n // ═══════════════════════════════════════════════════════════════\n console.log();\n console.log(chalk.green(\" ✅ All steps completed!\"));\n console.log();\n\n // Reset wizard state - no longer in progress\n wizardState.inProgress = false;\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 // Blueprint mode\n blueprintMode: answers.blueprintMode as boolean,\n // Extended config for all users\n projectType: answers.projectType as string,\n devOS: answers.devOS as string[],\n architecture: answers.architecture 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 letAiDecide: answers.letAiDecide 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 importantFilesOther: answers.importantFilesOther as string,\n selfImprove: answers.selfImprove as boolean,\n includePersonalData: answers.includePersonalData as boolean,\n enableAutoUpdate: answers.enableAutoUpdate as boolean,\n preferCliSync: answers.preferCliSync as boolean,\n tokenEnvVar: answers.tokenEnvVar as string,\n userName: answers.userName as string,\n userEmail: answers.userEmail as string,\n userPersona: answers.userPersona as string,\n userExpertise: answers.userExpertise as string,\n boundaryAlways: answers.boundaryAlways as string[],\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 staticFileContents: answers.staticFileContents as Record<string, string>,\n staticFileHandling: answers.staticFileHandling as \"config_only\" | \"both\",\n includeFunding: answers.includeFunding as boolean,\n extraNotes: answers.extraNotes as string,\n semver: answers.semver as boolean,\n cicd: answers.cicd as string,\n deploymentTargets: answers.deploymentTargets as string[],\n buildContainer: answers.buildContainer as boolean,\n containerRegistry: answers.containerRegistry as string,\n exampleRepoUrl: answers.exampleRepoUrl as string,\n documentationUrl: answers.documentationUrl as string,\n loggingConventions: answers.loggingConventions as string,\n loggingConventionsOther: answers.loggingConventionsOther as string,\n // Security configuration (NEW)\n security: {\n authProviders: answers.authProviders as string[],\n secretsManagement: answers.secretsManagement as string[],\n securityTooling: answers.securityTooling as string[],\n authPatterns: answers.authPatterns as string[],\n dataHandling: answers.dataHandling as string[],\n compliance: answers.compliance as string[],\n analytics: answers.analytics as string[],\n additionalNotes: answers.securityNotes as string,\n },\n // Versioning (conditional)\n versionTagFormat: answers.versionTagFormat as string,\n changelogTool: answers.changelogTool as string,\n // AI Behavior\n planModeFrequency: answers.planModeFrequency as string,\n // Commit workflow\n commitWorkflow: answers.commitWorkflow as string,\n };\n}\n","import { readFile, access, rm, mkdtemp } from \"fs/promises\";\nimport { join } from \"path\";\nimport { tmpdir } from \"os\";\nimport { spawnSync } from \"child_process\";\n\nexport interface DetectedProject {\n name: string | null;\n stack: string[];\n databases: string[]; // Separate field for databases (matches WebUI)\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 // New auto-detected fields (aligned with WebUI)\n license?: string;\n repoHost?: string;\n repoUrl?: string;\n cicd?: string;\n hasDocker?: boolean;\n containerRegistry?: string; // ghcr, dockerhub, gcr, ecr, acr, etc.\n testFramework?: string; // vitest, jest, pytest, etc.\n existingFiles?: string[];\n isPublicRepo?: boolean;\n isOpenSource?: boolean; // Based on license type\n projectType?: string; // open_source, internal, etc.\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 databases: [],\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 detected.hasDocker = true;\n }\n\n // ════════════════════════════════════════════════════════════════\n // Additional auto-detection for wizard fields\n // ════════════════════════════════════════════════════════════════\n\n // Detect license from LICENSE file\n const licensePath = join(cwd, \"LICENSE\");\n if (await fileExists(licensePath)) {\n try {\n const licenseContent = await readFile(licensePath, \"utf-8\");\n const lowerContent = licenseContent.toLowerCase();\n \n if (lowerContent.includes(\"mit license\") || lowerContent.includes(\"permission is hereby granted, free of charge\")) {\n detected.license = \"mit\";\n } else if (lowerContent.includes(\"apache license\") && lowerContent.includes(\"version 2.0\")) {\n detected.license = \"apache-2.0\";\n } else if (lowerContent.includes(\"gnu general public license\") && lowerContent.includes(\"version 3\")) {\n detected.license = \"gpl-3.0\";\n } else if (lowerContent.includes(\"gnu lesser general public license\")) {\n detected.license = \"lgpl-3.0\";\n } else if (lowerContent.includes(\"gnu affero general public license\")) {\n detected.license = \"agpl-3.0\";\n } else if (lowerContent.includes(\"bsd 3-clause\") || lowerContent.includes(\"redistribution and use in source and binary forms\")) {\n detected.license = \"bsd-3\";\n } else if (lowerContent.includes(\"mozilla public license\") && lowerContent.includes(\"2.0\")) {\n detected.license = \"mpl-2.0\";\n } else if (lowerContent.includes(\"unlicense\") || lowerContent.includes(\"this is free and unencumbered software\")) {\n detected.license = \"unlicense\";\n }\n } catch {\n // Failed to read LICENSE\n }\n }\n\n // Detect repository info from .git/config\n const gitConfigPath = join(cwd, \".git\", \"config\");\n if (await fileExists(gitConfigPath)) {\n try {\n const gitConfig = await readFile(gitConfigPath, \"utf-8\");\n const urlMatch = gitConfig.match(/url\\s*=\\s*(.+)/);\n if (urlMatch) {\n const repoUrl = urlMatch[1].trim();\n detected.repoUrl = repoUrl;\n \n if (repoUrl.includes(\"github.com\")) {\n detected.repoHost = \"github\";\n } else if (repoUrl.includes(\"gitlab.com\") || repoUrl.includes(\"gitlab\")) {\n detected.repoHost = \"gitlab\";\n } else if (repoUrl.includes(\"bitbucket\")) {\n detected.repoHost = \"bitbucket\";\n } else if (repoUrl.includes(\"gitea\") || repoUrl.includes(\"codeberg\")) {\n detected.repoHost = \"gitea\";\n } else if (repoUrl.includes(\"azure\")) {\n detected.repoHost = \"azure\";\n }\n }\n } catch {\n // Failed to read git config\n }\n }\n\n // Detect CI/CD from workflow files\n if (await fileExists(join(cwd, \".github\", \"workflows\"))) {\n detected.cicd = \"github_actions\";\n } else if (await fileExists(join(cwd, \".gitlab-ci.yml\"))) {\n detected.cicd = \"gitlab_ci\";\n } else if (await fileExists(join(cwd, \"Jenkinsfile\"))) {\n detected.cicd = \"jenkins\";\n } else if (await fileExists(join(cwd, \".circleci\"))) {\n detected.cicd = \"circleci\";\n } else if (await fileExists(join(cwd, \".travis.yml\"))) {\n detected.cicd = \"travis\";\n } else if (await fileExists(join(cwd, \"azure-pipelines.yml\"))) {\n detected.cicd = \"azure_devops\";\n } else if (await fileExists(join(cwd, \"bitbucket-pipelines.yml\"))) {\n detected.cicd = \"bitbucket\";\n } else if (await fileExists(join(cwd, \".drone.yml\"))) {\n detected.cicd = \"drone\";\n }\n\n // Detect existing static files\n detected.existingFiles = [];\n const staticFiles = [\n \".editorconfig\",\n \"CONTRIBUTING.md\",\n \"CODE_OF_CONDUCT.md\", \n \"SECURITY.md\",\n \"ROADMAP.md\",\n \".gitignore\",\n \".github/FUNDING.yml\",\n \"LICENSE\",\n \"README.md\",\n \"ARCHITECTURE.md\",\n \"CHANGELOG.md\",\n ];\n \n for (const file of staticFiles) {\n if (await fileExists(join(cwd, file))) {\n detected.existingFiles.push(file);\n }\n }\n\n // Try to get description from README if not already set\n if (!detected.description) {\n const readmePath = join(cwd, \"README.md\");\n if (await fileExists(readmePath)) {\n try {\n const readme = await readFile(readmePath, \"utf-8\");\n // Get first non-heading, non-empty paragraph\n const lines = readme.split(\"\\n\");\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed && !trimmed.startsWith(\"#\") && !trimmed.startsWith(\"!\") && !trimmed.startsWith(\"[\") && trimmed.length > 20) {\n detected.description = trimmed.substring(0, 200);\n break;\n }\n }\n } catch {\n // Failed to read README\n }\n }\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\n/**\n * Detect repo host from URL\n */\nexport function detectRepoHost(url: string): string {\n const lower = url.toLowerCase();\n if (lower.includes(\"github.com\") || lower.includes(\"github:\")) return \"github\";\n if (lower.includes(\"gitlab.com\") || lower.includes(\"gitlab\")) return \"gitlab\";\n if (lower.includes(\"bitbucket.org\") || lower.includes(\"bitbucket:\")) return \"bitbucket\";\n if (lower.includes(\"gitea.\") || lower.includes(\"gitea:\") || lower.includes(\"codeberg.org\")) return \"gitea\";\n if (lower.includes(\"azure.com\") || lower.includes(\"visualstudio.com\") || lower.includes(\"dev.azure\")) return \"azure\";\n return \"other\";\n}\n\n/**\n * Parse GitHub URL to owner/repo\n */\nfunction parseGitHubUrl(url: string): { owner: string; repo: string } | null {\n const patterns = [\n /github\\.com[/:]([^/]+)\\/([^/.]+)/,\n /^([^/]+)\\/([^/]+)$/,\n ];\n for (const pattern of patterns) {\n const match = url.match(pattern);\n if (match) {\n return { owner: match[1], repo: match[2].replace(/\\.git$/, \"\") };\n }\n }\n return null;\n}\n\n/**\n * Parse GitLab URL to project path and host\n */\nfunction parseGitLabUrl(url: string): { path: string; host: string } | null {\n const patterns = [\n /^https?:\\/\\/([^/]+)\\/(.+?)(?:\\.git)?$/,\n /^git@([^:]+):(.+?)(?:\\.git)?$/,\n ];\n for (const pattern of patterns) {\n const match = url.match(pattern);\n if (match) {\n const host = match[1];\n const path = match[2].replace(/\\.git$/, \"\");\n if (host.includes(\"gitlab\") || url.toLowerCase().includes(\"gitlab\")) {\n return { path, host };\n }\n }\n }\n return null;\n}\n\n/**\n * Detect from GitHub API (faster, no clone needed)\n */\ninterface GitHubRepoInfo {\n name: string;\n description: string | null;\n private: boolean;\n license?: { spdx_id: string } | null;\n}\n\ninterface GitHubFile {\n name: string;\n type: string;\n}\n\ninterface PackageJson {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n scripts?: Record<string, string>;\n}\n\n// Open source license identifiers\nconst OPEN_SOURCE_LICENSES = [\"mit\", \"apache-2.0\", \"gpl-3.0\", \"lgpl-3.0\", \"agpl-3.0\", \"bsd-2-clause\", \"bsd-3-clause\", \"mpl-2.0\", \"unlicense\", \"cc0-1.0\", \"isc\"];\n\n// Static files to detect\nconst STATIC_FILES = [\".editorconfig\", \"CONTRIBUTING.md\", \"CODE_OF_CONDUCT.md\", \"SECURITY.md\", \"ROADMAP.md\", \".gitignore\", \"LICENSE\", \"README.md\", \"ARCHITECTURE.md\", \"CHANGELOG.md\"];\n\nasync function detectFromGitHubApi(repoUrl: string): Promise<DetectedProject | null> {\n const parsed = parseGitHubUrl(repoUrl);\n if (!parsed) return null;\n \n const { owner, repo } = parsed;\n \n try {\n // Get repo info\n const repoRes = await fetch(`https://api.github.com/repos/${owner}/${repo}`, {\n headers: { \"User-Agent\": \"LynxPrompt-CLI\" },\n });\n if (!repoRes.ok) return null;\n const repoInfo = await repoRes.json() as GitHubRepoInfo;\n \n if (repoInfo.private) return null;\n \n // Determine if it's open source based on license\n const licenseId = repoInfo.license?.spdx_id?.toLowerCase() || null;\n const isOpenSource = !repoInfo.private && (licenseId ? OPEN_SOURCE_LICENSES.includes(licenseId) : false);\n \n const detected: DetectedProject = {\n name: repoInfo.name,\n description: repoInfo.description ?? undefined,\n stack: [],\n databases: [],\n commands: {},\n packageManager: null,\n type: \"application\",\n repoHost: \"github\",\n repoUrl,\n license: licenseId ?? undefined,\n isPublicRepo: !repoInfo.private,\n isOpenSource,\n projectType: isOpenSource ? \"open_source\" : undefined,\n hasDocker: false,\n existingFiles: [],\n };\n \n // List root files\n const filesRes = await fetch(`https://api.github.com/repos/${owner}/${repo}/contents/`, {\n headers: { \"User-Agent\": \"LynxPrompt-CLI\" },\n });\n if (!filesRes.ok) return detected;\n const files = await filesRes.json() as GitHubFile[];\n const fileNames = new Set(files.map((f) => f.name.toLowerCase()));\n \n // Detect existing static files\n for (const file of STATIC_FILES) {\n if (files.some((f) => f.name.toLowerCase() === file.toLowerCase())) {\n detected.existingFiles!.push(file);\n }\n }\n \n // Check for Docker and detect container registry\n if (fileNames.has(\"dockerfile\") || fileNames.has(\"docker-compose.yml\") || fileNames.has(\"docker-compose.yaml\")) {\n detected.hasDocker = true;\n detected.stack.push(\"docker\");\n \n // Try to detect container registry from docker-compose\n const dockerComposeFile = fileNames.has(\"docker-compose.yml\") ? \"docker-compose.yml\" : fileNames.has(\"docker-compose.yaml\") ? \"docker-compose.yaml\" : null;\n if (dockerComposeFile) {\n const composeRes = await fetch(`https://raw.githubusercontent.com/${owner}/${repo}/HEAD/${dockerComposeFile}`);\n if (composeRes.ok) {\n try {\n const content = await composeRes.text();\n const lowerContent = content.toLowerCase();\n \n // Detect container registry\n if (content.includes(\"ghcr.io\")) detected.containerRegistry = \"ghcr\";\n else if (content.includes(\"docker.io\") || /image:\\s*[a-z0-9]+\\/[a-z0-9]/.test(content)) detected.containerRegistry = \"dockerhub\";\n else if (content.includes(\"gcr.io\")) detected.containerRegistry = \"gcr\";\n else if (content.includes(\"ecr.\") || content.includes(\".amazonaws.com\")) detected.containerRegistry = \"ecr\";\n else if (content.includes(\"azurecr.io\")) detected.containerRegistry = \"acr\";\n else if (content.includes(\"quay.io\")) detected.containerRegistry = \"quay\";\n else if (content.includes(\"registry.gitlab.com\")) detected.containerRegistry = \"gitlab_registry\";\n \n // Detect databases from docker-compose\n if (lowerContent.includes(\"postgres\")) detected.databases.push(\"postgresql\");\n if (lowerContent.includes(\"mysql\") && !lowerContent.includes(\"mysql-\")) detected.databases.push(\"mysql\");\n if (lowerContent.includes(\"mongo\")) detected.databases.push(\"mongodb\");\n if (lowerContent.includes(\"redis\")) detected.databases.push(\"redis\");\n if (lowerContent.includes(\"sqlite\")) detected.databases.push(\"sqlite\");\n if (lowerContent.includes(\"mariadb\")) detected.databases.push(\"mariadb\");\n } catch { /* ignore */ }\n }\n }\n }\n \n // Check for CI/CD\n if (files.some((f) => f.name === \".github\" && f.type === \"dir\")) {\n // Check if .github/workflows exists\n const ghFilesRes = await fetch(`https://api.github.com/repos/${owner}/${repo}/contents/.github`, {\n headers: { \"User-Agent\": \"LynxPrompt-CLI\" },\n });\n if (ghFilesRes.ok) {\n const ghFiles = await ghFilesRes.json() as GitHubFile[];\n if (ghFiles.some((f) => f.name === \"workflows\")) {\n detected.cicd = \"github_actions\";\n }\n }\n }\n if (fileNames.has(\".gitlab-ci.yml\")) detected.cicd = \"gitlab_ci\";\n if (fileNames.has(\"jenkinsfile\")) detected.cicd = \"jenkins\";\n if (fileNames.has(\".travis.yml\")) detected.cicd = \"travis\";\n if (fileNames.has(\"azure-pipelines.yml\")) detected.cicd = \"azure_devops\";\n \n // Detect from pyproject.toml (Python projects)\n if (fileNames.has(\"pyproject.toml\")) {\n detected.stack.push(\"python\");\n const pyprojectRes = await fetch(`https://raw.githubusercontent.com/${owner}/${repo}/HEAD/pyproject.toml`);\n if (pyprojectRes.ok) {\n try {\n const content = await pyprojectRes.text();\n const lowerContent = content.toLowerCase();\n if (lowerContent.includes(\"fastapi\")) detected.stack.push(\"fastapi\");\n if (lowerContent.includes(\"django\")) detected.stack.push(\"django\");\n if (lowerContent.includes(\"flask\")) detected.stack.push(\"flask\");\n if (lowerContent.includes(\"sqlalchemy\")) detected.stack.push(\"sqlalchemy\");\n if (lowerContent.includes(\"pydantic\")) detected.stack.push(\"pydantic\");\n \n // Detect test framework\n if (lowerContent.includes(\"pytest\")) detected.testFramework = \"pytest\";\n else if (lowerContent.includes(\"unittest\")) detected.testFramework = \"unittest\";\n \n // Detect commands\n detected.commands.test = \"pytest\";\n if (lowerContent.includes(\"ruff\")) detected.commands.lint = \"ruff check .\";\n \n // Detect databases from Python packages\n if (lowerContent.includes(\"asyncpg\") || lowerContent.includes(\"psycopg\")) {\n if (!detected.databases.includes(\"postgresql\")) detected.databases.push(\"postgresql\");\n }\n if (lowerContent.includes(\"aiosqlite\") || lowerContent.includes(\"sqlite\")) {\n if (!detected.databases.includes(\"sqlite\")) detected.databases.push(\"sqlite\");\n }\n if (lowerContent.includes(\"pymongo\") || lowerContent.includes(\"motor\")) {\n if (!detected.databases.includes(\"mongodb\")) detected.databases.push(\"mongodb\");\n }\n if (lowerContent.includes(\"redis\") || lowerContent.includes(\"aioredis\")) {\n if (!detected.databases.includes(\"redis\")) detected.databases.push(\"redis\");\n }\n if (lowerContent.includes(\"pymysql\") || lowerContent.includes(\"aiomysql\")) {\n if (!detected.databases.includes(\"mysql\")) detected.databases.push(\"mysql\");\n }\n } catch { /* ignore */ }\n }\n }\n \n // Detect from requirements.txt (Python)\n if (fileNames.has(\"requirements.txt\")) {\n const reqRes = await fetch(`https://raw.githubusercontent.com/${owner}/${repo}/HEAD/requirements.txt`);\n if (reqRes.ok) {\n try {\n const content = (await reqRes.text()).toLowerCase();\n if (!detected.stack.includes(\"python\")) detected.stack.push(\"python\");\n if (content.includes(\"fastapi\") && !detected.stack.includes(\"fastapi\")) detected.stack.push(\"fastapi\");\n if (content.includes(\"django\") && !detected.stack.includes(\"django\")) detected.stack.push(\"django\");\n if (content.includes(\"flask\") && !detected.stack.includes(\"flask\")) detected.stack.push(\"flask\");\n if (content.includes(\"sqlalchemy\") && !detected.stack.includes(\"sqlalchemy\")) detected.stack.push(\"sqlalchemy\");\n \n // Detect databases from Python packages\n if (content.includes(\"asyncpg\") || content.includes(\"psycopg\")) {\n if (!detected.databases.includes(\"postgresql\")) detected.databases.push(\"postgresql\");\n }\n if (content.includes(\"aiosqlite\") || content.includes(\"sqlite\")) {\n if (!detected.databases.includes(\"sqlite\")) detected.databases.push(\"sqlite\");\n }\n if (content.includes(\"pymongo\") || content.includes(\"motor\")) {\n if (!detected.databases.includes(\"mongodb\")) detected.databases.push(\"mongodb\");\n }\n } catch { /* ignore */ }\n }\n }\n \n // Detect from package.json\n if (fileNames.has(\"package.json\")) {\n const pkgRes = await fetch(`https://raw.githubusercontent.com/${owner}/${repo}/HEAD/package.json`);\n if (pkgRes.ok) {\n try {\n const pkg = await pkgRes.json() as PackageJson;\n const allDeps: Record<string, string> = { ...pkg.dependencies, ...pkg.devDependencies };\n \n // Frameworks\n if (allDeps[\"next\"]) detected.stack.push(\"nextjs\");\n if (allDeps[\"react\"]) detected.stack.push(\"react\");\n if (allDeps[\"vue\"]) detected.stack.push(\"vue\");\n if (allDeps[\"svelte\"]) detected.stack.push(\"svelte\");\n if (allDeps[\"express\"]) detected.stack.push(\"express\");\n if (allDeps[\"fastify\"]) detected.stack.push(\"fastify\");\n if (allDeps[\"hono\"]) detected.stack.push(\"hono\");\n \n // Tools\n if (allDeps[\"typescript\"]) detected.stack.push(\"typescript\");\n if (allDeps[\"tailwindcss\"]) detected.stack.push(\"tailwind\");\n if (allDeps[\"prisma\"]) detected.stack.push(\"prisma\");\n if (allDeps[\"drizzle-orm\"]) detected.stack.push(\"drizzle\");\n \n // Test frameworks\n if (allDeps[\"vitest\"]) detected.testFramework = \"vitest\";\n else if (allDeps[\"jest\"]) detected.testFramework = \"jest\";\n else if (allDeps[\"@playwright/test\"]) detected.testFramework = \"playwright\";\n else if (allDeps[\"cypress\"]) detected.testFramework = \"cypress\";\n else if (allDeps[\"mocha\"]) detected.testFramework = \"mocha\";\n \n if (detected.stack.length === 0 || (detected.stack.length === 1 && detected.stack[0] === \"typescript\")) {\n detected.stack.unshift(\"javascript\");\n }\n \n if (pkg.scripts) {\n if (pkg.scripts.build) detected.commands.build = \"npm run build\";\n if (pkg.scripts.test) detected.commands.test = \"npm run test\";\n if (pkg.scripts.lint) detected.commands.lint = \"npm run lint\";\n if (pkg.scripts.dev) detected.commands.dev = \"npm run dev\";\n else if (pkg.scripts.start) detected.commands.dev = \"npm run start\";\n }\n \n // Detect databases from Node.js packages\n if (allDeps[\"pg\"] || allDeps[\"postgres\"] || allDeps[\"@neondatabase/serverless\"]) {\n if (!detected.databases.includes(\"postgresql\")) detected.databases.push(\"postgresql\");\n }\n if (allDeps[\"better-sqlite3\"] || allDeps[\"sql.js\"] || allDeps[\"sqlite3\"]) {\n if (!detected.databases.includes(\"sqlite\")) detected.databases.push(\"sqlite\");\n }\n if (allDeps[\"mongodb\"] || allDeps[\"mongoose\"]) {\n if (!detected.databases.includes(\"mongodb\")) detected.databases.push(\"mongodb\");\n }\n if (allDeps[\"redis\"] || allDeps[\"ioredis\"]) {\n if (!detected.databases.includes(\"redis\")) detected.databases.push(\"redis\");\n }\n if (allDeps[\"mysql\"] || allDeps[\"mysql2\"]) {\n if (!detected.databases.includes(\"mysql\")) detected.databases.push(\"mysql\");\n }\n } catch { /* ignore */ }\n }\n }\n \n // Detect other languages\n if (fileNames.has(\"cargo.toml\")) {\n detected.stack.push(\"rust\");\n detected.commands.build = \"cargo build\";\n detected.commands.test = \"cargo test\";\n }\n if (fileNames.has(\"go.mod\")) {\n detected.stack.push(\"go\");\n detected.commands.build = \"go build\";\n detected.commands.test = \"go test ./...\";\n }\n \n return detected;\n } catch {\n return null;\n }\n}\n\ninterface GitLabRepoInfo {\n name: string;\n description: string | null;\n visibility: \"public\" | \"private\" | \"internal\";\n license?: { key: string } | null;\n}\n\ninterface GitLabFile {\n name: string;\n type: string;\n}\n\n/**\n * Detect from GitLab API (faster, no clone needed)\n */\nasync function detectFromGitLabApi(repoUrl: string): Promise<DetectedProject | null> {\n const parsed = parseGitLabUrl(repoUrl);\n if (!parsed) return null;\n \n const { path: projectPath, host } = parsed;\n const encodedPath = encodeURIComponent(projectPath);\n \n try {\n // Get repo info\n const repoRes = await fetch(`https://${host}/api/v4/projects/${encodedPath}`, {\n headers: { \"User-Agent\": \"LynxPrompt-CLI\" },\n });\n if (!repoRes.ok) return null;\n const repoInfo = await repoRes.json() as GitLabRepoInfo;\n \n if (repoInfo.visibility === \"private\") return null;\n \n // Determine if it's open source based on license\n const licenseId = repoInfo.license?.key?.toLowerCase() || null;\n const isOpenSource = repoInfo.visibility === \"public\" && (licenseId ? OPEN_SOURCE_LICENSES.includes(licenseId) : false);\n \n const detected: DetectedProject = {\n name: repoInfo.name,\n description: repoInfo.description ?? undefined,\n stack: [],\n databases: [],\n commands: {},\n packageManager: null,\n type: \"application\",\n repoHost: \"gitlab\",\n repoUrl,\n license: licenseId ?? undefined,\n isPublicRepo: repoInfo.visibility === \"public\",\n isOpenSource,\n projectType: isOpenSource ? \"open_source\" : undefined,\n hasDocker: false,\n existingFiles: [],\n };\n \n // List root files\n const filesRes = await fetch(`https://${host}/api/v4/projects/${encodedPath}/repository/tree?per_page=100`, {\n headers: { \"User-Agent\": \"LynxPrompt-CLI\" },\n });\n if (!filesRes.ok) return detected;\n const files = await filesRes.json() as GitLabFile[];\n const fileNames = new Set(files.map((f) => f.name.toLowerCase()));\n \n // Detect existing static files\n for (const file of STATIC_FILES) {\n if (files.some((f) => f.name.toLowerCase() === file.toLowerCase())) {\n detected.existingFiles!.push(file);\n }\n }\n \n // CI/CD detection\n if (fileNames.has(\".gitlab-ci.yml\")) detected.cicd = \"gitlab_ci\";\n if (fileNames.has(\"jenkinsfile\")) detected.cicd = \"jenkins\";\n \n // Check for Docker and detect container registry\n if (fileNames.has(\"dockerfile\") || fileNames.has(\"docker-compose.yml\") || fileNames.has(\"docker-compose.yaml\")) {\n detected.hasDocker = true;\n detected.stack.push(\"docker\");\n \n // Try to detect container registry from docker-compose\n const dockerComposeFile = fileNames.has(\"docker-compose.yml\") ? \"docker-compose.yml\" : fileNames.has(\"docker-compose.yaml\") ? \"docker-compose.yaml\" : null;\n if (dockerComposeFile) {\n const composeRes = await fetch(`https://${host}/api/v4/projects/${encodedPath}/repository/files/${encodeURIComponent(dockerComposeFile)}/raw?ref=HEAD`, {\n headers: { \"User-Agent\": \"LynxPrompt-CLI\" },\n });\n if (composeRes.ok) {\n try {\n const content = await composeRes.text();\n const lowerContent = content.toLowerCase();\n \n // Detect container registry\n if (content.includes(\"registry.gitlab.com\")) detected.containerRegistry = \"gitlab_registry\";\n else if (content.includes(\"ghcr.io\")) detected.containerRegistry = \"ghcr\";\n else if (content.includes(\"docker.io\") || /image:\\s*[a-z0-9]+\\/[a-z0-9]/.test(content)) detected.containerRegistry = \"dockerhub\";\n else if (content.includes(\"gcr.io\")) detected.containerRegistry = \"gcr\";\n \n // Detect databases from docker-compose\n if (lowerContent.includes(\"postgres\")) detected.databases.push(\"postgresql\");\n if (lowerContent.includes(\"mysql\") && !lowerContent.includes(\"mysql-\")) detected.databases.push(\"mysql\");\n if (lowerContent.includes(\"mongo\")) detected.databases.push(\"mongodb\");\n if (lowerContent.includes(\"redis\")) detected.databases.push(\"redis\");\n if (lowerContent.includes(\"sqlite\")) detected.databases.push(\"sqlite\");\n } catch { /* ignore */ }\n }\n }\n }\n \n // Detect from package.json\n if (fileNames.has(\"package.json\")) {\n const pkgRes = await fetch(`https://${host}/api/v4/projects/${encodedPath}/repository/files/package.json/raw?ref=HEAD`, {\n headers: { \"User-Agent\": \"LynxPrompt-CLI\" },\n });\n if (pkgRes.ok) {\n try {\n const pkg = await pkgRes.json() as PackageJson;\n const allDeps: Record<string, string> = { ...pkg.dependencies, ...pkg.devDependencies };\n \n // Frameworks\n if (allDeps[\"next\"]) detected.stack.push(\"nextjs\");\n if (allDeps[\"react\"]) detected.stack.push(\"react\");\n if (allDeps[\"vue\"]) detected.stack.push(\"vue\");\n if (allDeps[\"svelte\"]) detected.stack.push(\"svelte\");\n if (allDeps[\"express\"]) detected.stack.push(\"express\");\n if (allDeps[\"fastify\"]) detected.stack.push(\"fastify\");\n \n // Tools\n if (allDeps[\"typescript\"]) detected.stack.push(\"typescript\");\n if (allDeps[\"tailwindcss\"]) detected.stack.push(\"tailwind\");\n if (allDeps[\"prisma\"]) detected.stack.push(\"prisma\");\n \n // Test frameworks\n if (allDeps[\"vitest\"]) detected.testFramework = \"vitest\";\n else if (allDeps[\"jest\"]) detected.testFramework = \"jest\";\n else if (allDeps[\"@playwright/test\"]) detected.testFramework = \"playwright\";\n \n if (detected.stack.length === 0 || (detected.stack.length === 1 && detected.stack[0] === \"typescript\")) {\n detected.stack.unshift(\"javascript\");\n }\n \n if (pkg.scripts) {\n if (pkg.scripts.build) detected.commands.build = \"npm run build\";\n if (pkg.scripts.test) detected.commands.test = \"npm run test\";\n if (pkg.scripts.lint) detected.commands.lint = \"npm run lint\";\n if (pkg.scripts.dev) detected.commands.dev = \"npm run dev\";\n }\n \n // Detect databases from Node.js packages\n if (allDeps[\"pg\"] || allDeps[\"postgres\"]) {\n if (!detected.databases.includes(\"postgresql\")) detected.databases.push(\"postgresql\");\n }\n if (allDeps[\"better-sqlite3\"] || allDeps[\"sqlite3\"]) {\n if (!detected.databases.includes(\"sqlite\")) detected.databases.push(\"sqlite\");\n }\n if (allDeps[\"mongodb\"] || allDeps[\"mongoose\"]) {\n if (!detected.databases.includes(\"mongodb\")) detected.databases.push(\"mongodb\");\n }\n if (allDeps[\"redis\"] || allDeps[\"ioredis\"]) {\n if (!detected.databases.includes(\"redis\")) detected.databases.push(\"redis\");\n }\n } catch { /* ignore */ }\n }\n }\n \n // Detect from pyproject.toml or requirements.txt (Python)\n if (fileNames.has(\"pyproject.toml\")) {\n detected.stack.push(\"python\");\n const pyRes = await fetch(`https://${host}/api/v4/projects/${encodedPath}/repository/files/pyproject.toml/raw?ref=HEAD`, {\n headers: { \"User-Agent\": \"LynxPrompt-CLI\" },\n });\n if (pyRes.ok) {\n try {\n const content = (await pyRes.text()).toLowerCase();\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(\"sqlalchemy\")) detected.stack.push(\"sqlalchemy\");\n if (content.includes(\"pytest\")) detected.testFramework = \"pytest\";\n \n // Detect databases\n if (content.includes(\"asyncpg\") || content.includes(\"psycopg\")) {\n if (!detected.databases.includes(\"postgresql\")) detected.databases.push(\"postgresql\");\n }\n if (content.includes(\"aiosqlite\") || content.includes(\"sqlite\")) {\n if (!detected.databases.includes(\"sqlite\")) detected.databases.push(\"sqlite\");\n }\n } catch { /* ignore */ }\n }\n } else if (fileNames.has(\"requirements.txt\")) {\n detected.stack.push(\"python\");\n }\n \n // Detect other languages\n if (fileNames.has(\"cargo.toml\")) {\n detected.stack.push(\"rust\");\n detected.commands.build = \"cargo build\";\n detected.commands.test = \"cargo test\";\n }\n if (fileNames.has(\"go.mod\")) {\n detected.stack.push(\"go\");\n detected.commands.build = \"go build\";\n detected.commands.test = \"go test ./...\";\n }\n \n return detected;\n } catch {\n return null;\n }\n}\n\n/**\n * Validate git URL to prevent command injection\n * Only allows http(s), git, and ssh protocols\n */\nfunction isValidGitUrl(url: string): boolean {\n const trimmed = url.trim();\n // Allow standard git URL formats\n if (trimmed.startsWith(\"https://\") || trimmed.startsWith(\"http://\") ||\n trimmed.startsWith(\"git://\") || trimmed.startsWith(\"git@\") ||\n trimmed.startsWith(\"ssh://\")) {\n // Additional validation: no shell metacharacters\n const dangerousChars = /[;&|`$(){}[\\]<>\\\\'\"!#*?~]/;\n return !dangerousChars.test(trimmed);\n }\n return false;\n}\n\n/**\n * Detect from shallow git clone (fallback for non-GitHub/GitLab hosts)\n */\nasync function detectFromShallowClone(repoUrl: string): Promise<DetectedProject | null> {\n let tempDir: string | null = null;\n \n // Security: Validate URL before passing to git\n if (!isValidGitUrl(repoUrl)) {\n return null;\n }\n \n try {\n tempDir = await mkdtemp(join(tmpdir(), \"lynxprompt-detect-\"));\n \n try {\n // Security: Use spawnSync with array arguments to prevent command injection\n // This passes arguments directly to git without shell interpretation\n const result = spawnSync(\"git\", [\"clone\", \"--depth\", \"1\", \"--quiet\", repoUrl, tempDir], {\n stdio: \"pipe\",\n timeout: 30000,\n });\n \n if (result.status !== 0) {\n return null;\n }\n } catch {\n return null;\n }\n \n const detected = await detectProject(tempDir);\n \n if (detected) {\n detected.repoHost = detectRepoHost(repoUrl);\n detected.repoUrl = repoUrl;\n }\n \n return detected;\n } catch {\n return null;\n } finally {\n if (tempDir) {\n try {\n await rm(tempDir, { recursive: true, force: true });\n } catch { /* ignore */ }\n }\n }\n}\n\n/**\n * Detect project info from a remote Git URL\n * Strategy: Try API first (GitHub/GitLab), fallback to shallow clone\n */\nexport async function detectFromRemoteUrl(repoUrl: string): Promise<DetectedProject | null> {\n const host = detectRepoHost(repoUrl);\n \n // Try API-based detection first (faster)\n if (host === \"github\") {\n const result = await detectFromGitHubApi(repoUrl);\n if (result) return result;\n }\n \n if (host === \"gitlab\") {\n const result = await detectFromGitLabApi(repoUrl);\n if (result) return result;\n }\n \n // Fallback to shallow clone for other hosts or if API fails\n return detectFromShallowClone(repoUrl);\n}\n\n/**\n * Check if a string looks like a Git URL\n */\nexport function isGitUrl(str: string): boolean {\n const patterns = [\n /^https?:\\/\\/[^/]+\\/.*$/,\n /^git@[^:]+:.*$/,\n /^git:\\/\\/.*$/,\n /^ssh:\\/\\/.*$/,\n ];\n return patterns.some(p => p.test(str.trim()));\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 // Blueprint mode - generates [[VARIABLE|default]] placeholders\n blueprintMode?: boolean;\n // Variable values to fill in [[VAR|default]] placeholders\n // Pass as { VAR_NAME: \"value\" } to replace [[VAR_NAME|default]] with \"value\"\n variables?: Record<string, string>;\n // Extended options for all users\n projectType?: string;\n devOS?: string | string[];\n architecture?: string;\n repoHost?: string;\n isPublic?: boolean;\n license?: string;\n conventionalCommits?: boolean;\n semver?: boolean;\n cicd?: string;\n deploymentTargets?: string[];\n buildContainer?: boolean;\n containerRegistry?: string;\n customRegistryUrl?: string;\n exampleRepoUrl?: string;\n documentationUrl?: string;\n letAiDecide?: boolean;\n loggingConventions?: string;\n loggingConventionsOther?: string;\n namingConvention?: string;\n errorHandling?: string;\n styleNotes?: string;\n aiBehavior?: string[];\n importantFiles?: string[];\n importantFilesOther?: string;\n selfImprove?: boolean;\n includePersonalData?: boolean;\n enableAutoUpdate?: boolean;\n blueprintId?: string; // For auto-update curl command\n preferCliSync?: boolean; // Use CLI commands instead of curl (default true)\n tokenEnvVar?: string; // Environment variable name for API token (default LYNXPROMPT_API_TOKEN)\n // User profile data (fetched from cloud)\n userName?: string;\n userEmail?: string;\n userPersona?: string;\n userRole?: string;\n userExpertise?: string;\n boundaryAlways?: string[];\n boundaryNever?: string[];\n boundaryAsk?: string[];\n testLevels?: string[];\n testFrameworks?: string[];\n coverageTarget?: number;\n testNotes?: string;\n staticFiles?: string[];\n staticFileContents?: Record<string, string>;\n staticFileHandling?: \"config_only\" | \"both\"; // How to handle static files\n includeFunding?: boolean;\n extraNotes?: string;\n // Security configuration (FREE tier)\n security?: {\n authProviders?: string[]; // Login providers (Google, GitHub, etc.)\n secretsManagement?: string[]; // Secrets management strategies\n securityTooling?: string[]; // Security scanning tools (includes dependabot/renovate)\n authPatterns?: string[]; // Authentication patterns\n dataHandling?: string[]; // Data handling policies\n compliance?: string[]; // Compliance standards (GDPR, HIPAA, etc.)\n analytics?: string[]; // Analytics tools\n additionalNotes?: string; // Custom security notes\n };\n // Versioning (conditional on semver)\n versionTagFormat?: string; // v_prefix, no_prefix, package_prefix, etc.\n changelogTool?: string; // manual, conventional_changelog, etc.\n // AI Behavior\n planModeFrequency?: string; // always, complex_tasks, multi_file, etc.\n // Commit workflow\n commitWorkflow?: string; // branch_pr, direct_main\n}\n\n/**\n * Wrap a value in blueprint variable syntax if blueprintMode is enabled\n * Standard variables generated by LynxPrompt (document these in docs):\n * - [[PROJECT_NAME|default]] - Project name\n * - [[PROJECT_DESCRIPTION|default]] - Project description\n * - [[AUTHOR_NAME|default]] - Author name for commits\n * - [[AUTHOR_EMAIL|default]] - Author email for commits\n * - [[REPO_URL|default]] - Repository URL\n * - [[LICENSE|default]] - License type\n */\nfunction bpVar(blueprintMode: boolean, varName: string, defaultValue: string): string {\n if (!blueprintMode || !defaultValue) return defaultValue;\n return `[[${varName}|${defaultValue}]]`;\n}\n\n/**\n * Fill variables in content with provided values\n * Replaces [[VAR_NAME|default]] with actual values from variables map\n * If variable not provided, uses the default value from the placeholder\n */\nexport function fillVariables(content: string, variables: Record<string, string>): string {\n // Pattern matches [[VAR_NAME|default_value]]\n return content.replace(/\\[\\[([A-Z_]+)\\|([^\\]]*)\\]\\]/g, (_, varName, defaultValue) => {\n return variables[varName] ?? defaultValue;\n });\n}\n\n/**\n * Parse variables string from CLI --vars argument\n * Format: \"VAR1=value1,VAR2=value2\"\n */\nexport function parseVariablesString(varsStr: string): Record<string, string> {\n const variables: Record<string, string> = {};\n \n if (!varsStr) return variables;\n \n // Split by comma, handling potential quoted values\n const parts = varsStr.split(\",\");\n \n for (const part of parts) {\n const eqIndex = part.indexOf(\"=\");\n if (eqIndex > 0) {\n const key = part.slice(0, eqIndex).trim().toUpperCase();\n const value = part.slice(eqIndex + 1).trim();\n variables[key] = value;\n }\n }\n \n return variables;\n}\n\n// Platform to filename mapping (30+ platforms)\n// IMPORTANT: Keep in sync with src/lib/platforms.ts\nconst PLATFORM_FILES: Record<string, string> = {\n // Popular platforms\n universal: \"AGENTS.md\",\n agents: \"AGENTS.md\", // Alias for universal\n cursor: \".cursor/rules/project.mdc\",\n claude: \"CLAUDE.md\",\n copilot: \".github/copilot-instructions.md\",\n windsurf: \".windsurfrules\",\n \n // AI-powered IDEs\n antigravity: \"GEMINI.md\",\n zed: \".zed/instructions.md\",\n void: \".void/config.json\",\n trae: \".trae/rules/project.mdc\",\n firebase: \".idx/rules/project.mdc\",\n \n // Editor extensions\n cline: \".clinerules\",\n roocode: \".roo/rules/project.mdc\",\n continue: \".continue/config.json\",\n cody: \".cody/config.json\",\n tabnine: \".tabnine.yaml\",\n supermaven: \".supermaven/config.json\",\n codegpt: \".codegpt/config.json\",\n amazonq: \".amazonq/rules/project.md\",\n augment: \".augment/rules/project.mdc\",\n kilocode: \".kilocode/rules/project.mdc\",\n junie: \".junie/guidelines.md\",\n kiro: \".kiro/steering/project.mdc\",\n \n // CLI tools\n aider: \".aider.conf.yml\",\n goose: \".goosehints\",\n warp: \"WARP.md\",\n \"gemini-cli\": \"GEMINI.md\",\n opencode: \"opencode.json\",\n \n // Other emerging tools\n openhands: \".openhands/microagents/repo.md\",\n crush: \"CRUSH.md\",\n firebender: \"firebender.json\",\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\n// Static file templates with defaults\nconst STATIC_FILE_TEMPLATES: Record<string, (options: GenerateOptions) => string> = {\n editorconfig: () => `# EditorConfig is awesome: https://EditorConfig.org\n\nroot = true\n\n[*]\nindent_style = space\nindent_size = 2\nend_of_line = lf\ncharset = utf-8\ntrim_trailing_whitespace = true\ninsert_final_newline = true\n\n[*.md]\ntrim_trailing_whitespace = false\n\n[Makefile]\nindent_style = tab\n`,\n contributing: (opts) => `# Contributing to ${opts.name}\n\nThank you for your interest in contributing!\n\n## How to Contribute\n\n1. Fork the repository\n2. Create a feature branch (\\`git checkout -b feature/amazing-feature\\`)\n3. Commit your changes${opts.conventionalCommits ? \" using Conventional Commits format\" : \"\"}\n4. Push to the branch (\\`git push origin feature/amazing-feature\\`)\n5. Open a Pull Request\n\n## Development Setup\n\n\\`\\`\\`bash\n# Clone your fork\ngit clone https://github.com/YOUR_USERNAME/${opts.name}.git\ncd ${opts.name}\n\n# Install dependencies\nnpm install\n\n# Run development server\nnpm run dev\n\\`\\`\\`\n\n## Code Style\n\nPlease follow the existing code style and conventions in this project.\n`,\n codeOfConduct: (opts) => `# Code of Conduct\n\n## Our Pledge\n\nWe pledge to make participation in the ${opts.name} project a harassment-free experience for everyone.\n\n## Our Standards\n\nExamples of behavior that contributes to a positive environment:\n- Using welcoming and inclusive language\n- Being respectful of differing viewpoints\n- Gracefully accepting constructive criticism\n- Focusing on what is best for the community\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be reported to the project team.\n\n## Attribution\n\nThis Code of Conduct is adapted from the Contributor Covenant, version 2.1.\n`,\n security: (opts) => `# Security Policy\n\n## Supported Versions\n\n| Version | Supported |\n| ------- | ------------------ |\n| latest | :white_check_mark: |\n\n## Reporting a Vulnerability\n\nIf you discover a security vulnerability in ${opts.name}, please report it by emailing the maintainers.\n\n**Please do not open a public issue for security vulnerabilities.**\n\nWe will acknowledge receipt within 48 hours and provide a detailed response within 7 days.\n`,\n roadmap: (opts) => `# Roadmap\n\n## ${opts.name} Development Roadmap\n\n### Current Version\n\n- Core functionality\n\n### Planned Features\n\n- [ ] Feature 1\n- [ ] Feature 2\n- [ ] Feature 3\n\n### Long-term Goals\n\n- Goal 1\n- Goal 2\n\n---\n*This roadmap is subject to change based on community feedback and priorities.*\n`,\n gitignore: (opts) => {\n const patterns = [\"# Dependencies\", \"node_modules/\", \".pnpm-store/\", \"\"];\n if (opts.stack.includes(\"python\")) {\n patterns.push(\"# Python\", \"__pycache__/\", \"*.py[cod]\", \".venv/\", \"venv/\", \"\");\n }\n patterns.push(\"# Environment\", \".env\", \".env.local\", \".env*.local\", \"\");\n patterns.push(\"# Build outputs\", \"dist/\", \"build/\", \".next/\", \"out/\", \"\");\n patterns.push(\"# IDE\", \".idea/\", \".vscode/\", \"*.swp\", \"*.swo\", \"\");\n patterns.push(\"# OS\", \".DS_Store\", \"Thumbs.db\", \"\");\n patterns.push(\"# Logs\", \"*.log\", \"npm-debug.log*\", \"\");\n return patterns.join(\"\\n\");\n },\n funding: () => `# These are supported funding model platforms\n\ngithub: [] # Replace with your GitHub username\npatreon: # Replace with your Patreon username\nopen_collective: # Replace with your Open Collective username\nko_fi: # Replace with your Ko-fi username\ncustom: [] # Add custom funding links\n`,\n license: (opts) => {\n if (opts.license === \"mit\") {\n return `MIT License\n\nCopyright (c) ${new Date().getFullYear()} ${opts.name}\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n`;\n }\n return `# License\n\nThis project is licensed under the ${opts.license?.toUpperCase() || \"Proprietary\"} license.\n`;\n },\n readme: (opts) => {\n const stackBadges = opts.stack.slice(0, 5).map(s => STACK_NAMES[s] || s).join(\" • \");\n return `# ${opts.name}\n\n${opts.description || \"A project generated with LynxPrompt.\"}\n\n${stackBadges ? `## Tech Stack\\n\\n${stackBadges}\\n` : \"\"}\n## Getting Started\n\n\\`\\`\\`bash\n# Clone the repository\ngit clone <repository-url>\ncd ${opts.name}\n\n# Install dependencies\nnpm install\n\n# Run development server\nnpm run dev\n\\`\\`\\`\n\n## License\n\n${opts.license && opts.license !== \"none\" ? `This project is licensed under the ${opts.license.toUpperCase()} License.` : \"See LICENSE file for details.\"}\n`;\n },\n architecture: (opts) => `# Architecture\n\n## ${opts.name} Architecture Overview\n\n${opts.architecture ? `### Pattern: ${opts.architecture}\\n` : \"\"}\n### Directory Structure\n\n\\`\\`\\`\n${opts.name}/\n├── src/ # Source code\n├── tests/ # Test files\n├── docs/ # Documentation\n└── ...\n\\`\\`\\`\n\n### Key Components\n\n1. **Component A** - Description\n2. **Component B** - Description\n3. **Component C** - Description\n\n### Data Flow\n\nDescribe how data flows through the application.\n\n---\n*Generated by LynxPrompt*\n`,\n changelog: (opts) => `# Changelog\n\nAll notable changes to ${opts.name} will be documented in this file.\n\nThe format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),\nand this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n\n## [Unreleased]\n\n### Added\n- Initial project setup\n\n### Changed\n\n### Deprecated\n\n### Removed\n\n### Fixed\n\n### Security\n`,\n};\n\n// File paths for static files\nconst STATIC_FILE_PATHS: Record<string, string> = {\n editorconfig: \".editorconfig\",\n contributing: \"CONTRIBUTING.md\",\n codeOfConduct: \"CODE_OF_CONDUCT.md\",\n security: \"SECURITY.md\",\n roadmap: \"ROADMAP.md\",\n gitignore: \".gitignore\",\n funding: \".github/FUNDING.yml\",\n license: \"LICENSE\",\n readme: \"README.md\",\n architecture: \"ARCHITECTURE.md\",\n changelog: \"CHANGELOG.md\",\n};\n\nexport function generateConfig(options: GenerateOptions): Record<string, string> {\n const files: Record<string, string> = {};\n\n // Generate AI IDE config files\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 // Generate static files (only if \"both\" mode - otherwise they're embedded in config)\n const createLocalStaticFiles = options.staticFileHandling !== \"config_only\";\n \n if (options.staticFiles && options.staticFiles.length > 0 && createLocalStaticFiles) {\n for (const fileKey of options.staticFiles) {\n const filePath = STATIC_FILE_PATHS[fileKey];\n if (!filePath) continue;\n\n // Use custom content if provided, otherwise generate default\n if (options.staticFileContents?.[fileKey]) {\n files[filePath] = options.staticFileContents[fileKey];\n } else {\n const templateFn = STATIC_FILE_TEMPLATES[fileKey];\n if (templateFn) {\n files[filePath] = templateFn(options);\n }\n }\n }\n }\n\n // Legacy: funding as separate option (respect staticFileHandling)\n if (options.includeFunding && !options.staticFiles?.includes(\"funding\") && createLocalStaticFiles) {\n files[\".github/FUNDING.yml\"] = STATIC_FILE_TEMPLATES.funding(options);\n }\n\n // Apply variable filling if variables are provided\n if (options.variables && Object.keys(options.variables).length > 0) {\n for (const [filename, content] of Object.entries(files)) {\n files[filename] = fillVariables(content, options.variables);\n }\n }\n\n return files;\n}\n\nfunction generateFileContent(options: GenerateOptions, platform: string): string {\n const sections: string[] = [];\n \n // Determine format based on platform\n const mdcPlatforms = [\"cursor\", \"trae\", \"firebase\", \"roocode\", \"augment\", \"kilocode\", \"kiro\"];\n const yamlPlatforms = [\"aider\", \"tabnine\"];\n const plainTextPlatforms = [\"windsurf\", \"cline\", \"goose\"];\n const jsonPlatforms = [\"void\", \"continue\", \"cody\", \"supermaven\", \"codegpt\", \"opencode\", \"firebender\"];\n \n const isMdc = mdcPlatforms.includes(platform);\n const isYaml = yamlPlatforms.includes(platform);\n const isPlainText = plainTextPlatforms.includes(platform);\n const isJson = jsonPlatforms.includes(platform);\n const isMarkdown = !isMdc && !isYaml && !isPlainText && !isJson;\n const bp = options.blueprintMode || false;\n \n // Handle YAML formats\n if (isYaml) {\n return generateYamlConfig(options, platform);\n }\n \n // Handle JSON formats\n if (isJson) {\n return generateJsonConfig(options, platform);\n }\n \n // Project name and other blueprint variables\n const projectName = bpVar(bp, \"PROJECT_NAME\", options.name);\n const repoHost = bpVar(bp, \"REPO_HOST\", options.repoHost || \"\");\n const license = bpVar(bp, \"LICENSE\", options.license || \"\");\n const authorName = bpVar(bp, \"AUTHOR_NAME\", options.userName || \"\");\n const authorEmail = bpVar(bp, \"AUTHOR_EMAIL\", options.userEmail || \"\");\n const architecture = bpVar(bp, \"ARCHITECTURE\", options.architecture || \"\");\n const cicd = bpVar(bp, \"CI_CD\", options.cicd || \"\");\n \n // MDC frontmatter for Cursor\n if (isMdc) {\n sections.push(\"---\");\n sections.push(`description: \"${projectName} - AI coding rules\"`);\n sections.push('globs: [\"**/*\"]');\n sections.push(\"alwaysApply: true\");\n sections.push(\"---\");\n sections.push(\"\");\n sections.push(`# ${projectName} - AI Assistant Configuration`);\n sections.push(\"\");\n }\n \n // Header for regular markdown\n if (isMarkdown) {\n sections.push(`# ${projectName} - AI Assistant Configuration`);\n sections.push(\"\");\n }\n\n // Cloud sync section (for synced blueprints)\n if (options.enableAutoUpdate && options.blueprintId && (isMarkdown || isMdc)) {\n const bpId = options.blueprintId.startsWith(\"bp_\") ? options.blueprintId : `bp_${options.blueprintId}`;\n const preferCli = options.preferCliSync !== false; // Default to true\n const tokenEnvVar = options.tokenEnvVar || \"LYNXPROMPT_API_TOKEN\";\n \n sections.push(\"<!--\");\n sections.push(`This file is synced with LynxPrompt (Blueprint: ${bpId})`);\n sections.push(\"\");\n sections.push(\"Sync Commands:\");\n \n if (preferCli) {\n // CLI method (recommended - no token in file)\n sections.push(\"\");\n sections.push(\"# Using LynxPrompt CLI (recommended):\");\n sections.push(\"lynxp push # Upload local changes to cloud\");\n sections.push(\"lynxp pull # Download cloud changes to local\");\n sections.push(\"lynxp diff # Compare local vs cloud versions\");\n sections.push(\"\");\n sections.push(\"# Install CLI: npm install -g lynxprompt\");\n sections.push(\"# Login: lynxp login\");\n } else {\n // Environment variable method (no token hardcoded)\n const fileName = platform === \"cursor\" ? \".cursor/rules/agents.mdc\" : \"AGENTS.md\";\n sections.push(\"\");\n sections.push(`# Using curl with environment variable (token stored in $${tokenEnvVar}):`);\n sections.push(\"\");\n sections.push(\"# Push local changes to cloud:\");\n sections.push(`curl -X PUT \"https://lynxprompt.com/api/v1/blueprints/${bpId}\" \\\\`);\n sections.push(` -H \"Authorization: Bearer $${tokenEnvVar}\" \\\\`);\n sections.push(' -H \"Content-Type: application/json\" \\\\');\n sections.push(` -d \"{\\\\\"content\\\\\": \\\\\"$(cat ${fileName} | jq -Rs .)\\\\\"}\"`);\n sections.push(\"\");\n sections.push(\"# Pull cloud changes to local:\");\n sections.push(`curl -s \"https://lynxprompt.com/api/v1/blueprints/${bpId}\" \\\\`);\n sections.push(` -H \"Authorization: Bearer $${tokenEnvVar}\" | jq -r '.content' > ${fileName}`);\n sections.push(\"\");\n sections.push(`# Set your token: export ${tokenEnvVar}=\"your_token_here\"`);\n sections.push(\"# Generate token at: https://lynxprompt.com/settings\");\n }\n \n sections.push(\"\");\n sections.push(\"Docs: https://lynxprompt.com/docs/api\");\n sections.push(\"-->\");\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 // Use userPersona from profile if available, otherwise fall back to persona selection\n const personaDesc = options.userPersona \n || PERSONA_DESCRIPTIONS[options.persona] \n || options.persona \n || \"\";\n const projectDesc = bpVar(bp, \"PROJECT_DESCRIPTION\", options.description || \"\");\n \n if (isMarkdown || isMdc) {\n sections.push(\"## Persona\");\n sections.push(\"\");\n if (personaDesc) {\n sections.push(`You are ${personaDesc}. You assist developers working on ${projectName}.`);\n } else {\n sections.push(`You assist developers working on ${projectName}.`);\n }\n } else {\n if (personaDesc) {\n sections.push(`You are ${personaDesc}. You assist developers working on ${projectName}.`);\n } else {\n sections.push(`You assist developers working on ${projectName}.`);\n }\n }\n \n if (options.description) {\n sections.push(\"\");\n sections.push(`Project description: ${projectDesc}`);\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 // Let AI Decide\n if (options.letAiDecide) {\n if (isMarkdown || isMdc) {\n sections.push(\"> **AI Assistance:** Let AI analyze the codebase and suggest additional technologies and approaches as needed.\");\n sections.push(\"\");\n }\n }\n\n // Repository info\n if (options.repoHost || options.license || options.conventionalCommits || options.semver || \n options.cicd || options.deploymentTargets?.length || options.buildContainer ||\n options.exampleRepoUrl || options.documentationUrl) {\n if (isMarkdown || isMdc) {\n sections.push(\"## Repository & Infrastructure\");\n sections.push(\"\");\n if (options.repoHost) {\n sections.push(`- **Host:** ${repoHost || options.repoHost.charAt(0).toUpperCase() + options.repoHost.slice(1)}`);\n }\n if (options.license && options.license !== \"none\") {\n sections.push(`- **License:** ${license || options.license.toUpperCase()}`);\n }\n if (options.architecture) {\n sections.push(`- **Architecture:** ${architecture || options.architecture}`);\n }\n if (options.cicd) {\n sections.push(`- **CI/CD:** ${cicd || options.cicd}`);\n }\n if (options.conventionalCommits) {\n sections.push(\"- **Commits:** Follow [Conventional Commits](https://conventionalcommits.org) format\");\n }\n if (options.semver) {\n sections.push(\"- **Versioning:** Follow [Semantic Versioning](https://semver.org) (semver)\");\n }\n // Note: Dependency updates (Dependabot/Renovate) are now in security.securityTooling\n if (options.cicd) {\n const cicdNames: Record<string, string> = {\n github_actions: \"GitHub Actions\",\n gitlab_ci: \"GitLab CI\",\n jenkins: \"Jenkins\",\n circleci: \"CircleCI\",\n travis: \"Travis CI\",\n azure_devops: \"Azure DevOps\",\n bitbucket: \"Bitbucket Pipelines\",\n teamcity: \"TeamCity\",\n drone: \"Drone\",\n buildkite: \"Buildkite\",\n };\n sections.push(`- **CI/CD:** ${cicdNames[options.cicd] || options.cicd}`);\n }\n if (options.deploymentTargets && options.deploymentTargets.length > 0) {\n const targetNames: Record<string, string> = {\n vercel: \"Vercel\",\n netlify: \"Netlify\",\n aws: \"AWS\",\n gcp: \"Google Cloud\",\n azure: \"Azure\",\n docker: \"Docker\",\n kubernetes: \"Kubernetes\",\n heroku: \"Heroku\",\n digitalocean: \"DigitalOcean\",\n railway: \"Railway\",\n fly: \"Fly.io\",\n cloudflare: \"Cloudflare\",\n };\n const targets = options.deploymentTargets.map(t => targetNames[t] || t).join(\", \");\n sections.push(`- **Deployment:** ${targets}`);\n }\n if (options.buildContainer) {\n let containerInfo = \"Docker container builds enabled\";\n if (options.containerRegistry) {\n const registryNames: Record<string, string> = {\n dockerhub: \"Docker Hub\",\n ghcr: \"GitHub Container Registry\",\n gcr: \"Google Container Registry\",\n ecr: \"AWS ECR\",\n acr: \"Azure Container Registry\",\n quay: \"Quay.io\",\n gitlab: \"GitLab Registry\",\n custom: \"Custom registry\",\n };\n containerInfo += ` → ${registryNames[options.containerRegistry] || options.containerRegistry}`;\n }\n sections.push(`- **Containers:** ${containerInfo}`);\n }\n if (options.exampleRepoUrl) {\n sections.push(`- **Example Repo:** ${options.exampleRepoUrl} (use as reference for style/structure)`);\n }\n if (options.documentationUrl) {\n sections.push(`- **Documentation:** ${options.documentationUrl}`);\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 // Add plan mode frequency if specified\n if (options.planModeFrequency && options.planModeFrequency !== \"on_request\") {\n const planModeDescriptions: Record<string, string> = {\n always: \"**Always enter Plan Mode** before making any changes - think through the approach first\",\n complex_tasks: \"**Use Plan Mode** for complex tasks, multi-step changes, or risky modifications\",\n multi_file: \"**Use Plan Mode** when changes span multiple files\",\n new_features: \"**Use Plan Mode** when implementing new features\",\n never: \"Skip plan mode - proceed directly with implementation\",\n };\n if (planModeDescriptions[options.planModeFrequency]) {\n sections.push(`- ${planModeDescriptions[options.planModeFrequency]}`);\n }\n }\n sections.push(\"\");\n }\n }\n\n // Git workflow preference\n if (options.commitWorkflow && (isMarkdown || isMdc)) {\n sections.push(\"## Git Workflow\");\n sections.push(\"\");\n if (options.commitWorkflow === \"branch_pr\") {\n sections.push(\"- **Workflow:** Create feature branches and submit pull requests\");\n sections.push(\"- Do NOT commit directly to main/master branch\");\n sections.push(\"- Create a descriptive branch name (e.g., `feat/add-login`, `fix/button-styling`)\");\n sections.push(\"- Open a PR for review before merging\");\n } else if (options.commitWorkflow === \"direct_main\") {\n sections.push(\"- **Workflow:** Commit directly to main/master branch\");\n sections.push(\"- Small, focused commits are preferred\");\n sections.push(\"- Ensure tests pass before pushing\");\n }\n sections.push(\"\");\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 // Personal data for commits\n if (options.includePersonalData) {\n if (isMarkdown || isMdc) {\n sections.push(\"## Commit Identity\");\n sections.push(\"\");\n if (options.userName || options.userEmail || options.userRole || options.userExpertise) {\n // Include actual user profile data (with blueprint variables if enabled)\n const identityLines: string[] = [];\n if (options.userName) {\n identityLines.push(`- **Name:** ${authorName || options.userName}`);\n }\n if (options.userEmail) {\n identityLines.push(`- **Email:** ${authorEmail || options.userEmail}`);\n }\n if (options.userRole) {\n identityLines.push(`- **Role:** ${options.userRole}`);\n }\n if (options.userExpertise) {\n identityLines.push(`- **Expertise:** ${options.userExpertise}`);\n }\n sections.push(...identityLines);\n sections.push(\"\");\n sections.push(\"> Use this identity for git commits when making changes on my behalf.\");\n } else {\n sections.push(\"> **Personal data enabled:** Use my name and email for git commits when making changes.\");\n }\n sections.push(\"\");\n }\n }\n\n // Boundaries section\n // Get preset boundaries or use standard as fallback\n const presetBoundaries = BOUNDARIES[options.boundaries] || BOUNDARIES.standard;\n \n // Build final boundaries - use custom values if provided, otherwise use preset\n const boundaries = {\n always: options.boundaryAlways?.length ? options.boundaryAlways : presetBoundaries.always,\n never: options.boundaryNever?.length ? options.boundaryNever : presetBoundaries.never,\n askFirst: options.boundaryAsk?.length ? options.boundaryAsk : presetBoundaries.askFirst,\n };\n \n if (boundaries.always?.length || boundaries.never?.length || boundaries.askFirst?.length) {\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 // Logging conventions\n if (options.loggingConventions) {\n const loggingValue = options.loggingConventions === \"other\" && options.loggingConventionsOther\n ? options.loggingConventionsOther\n : options.loggingConventions.replace(/_/g, \" \");\n sections.push(`- **Logging:** ${loggingValue}`);\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 // Security Configuration section\n const security = options.security;\n if (security && (security.secretsManagement?.length || security.securityTooling?.length || \n security.authPatterns?.length || security.dataHandling?.length || security.additionalNotes)) {\n if (isMarkdown || isMdc) {\n sections.push(\"## 🔐 Security Configuration\");\n sections.push(\"\");\n \n // Secrets Management\n if (security.secretsManagement?.length) {\n sections.push(\"### Secrets Management\");\n sections.push(\"\");\n const secretsLabels: Record<string, string> = {\n env_vars: \"Environment Variables\",\n dotenv: \"dotenv / dotenvx\",\n vault: \"HashiCorp Vault\",\n aws_secrets: \"AWS Secrets Manager\",\n aws_ssm: \"AWS SSM Parameter Store\",\n gcp_secrets: \"GCP Secret Manager\",\n azure_keyvault: \"Azure Key Vault\",\n infisical: \"Infisical\",\n doppler: \"Doppler\",\n \"1password\": \"1Password Secrets Automation\",\n bitwarden: \"Bitwarden Secrets Manager\",\n sops: \"SOPS (Mozilla)\",\n age: \"age encryption\",\n sealed_secrets: \"Sealed Secrets (K8s)\",\n external_secrets: \"External Secrets Operator\",\n git_crypt: \"git-crypt\",\n chamber: \"Chamber\",\n berglas: \"Berglas\",\n };\n for (const s of security.secretsManagement) {\n sections.push(`- ${secretsLabels[s] || s}`);\n }\n sections.push(\"\");\n }\n\n // Security Tooling (includes dependency updates)\n if (security.securityTooling?.length) {\n sections.push(\"### Security Tooling\");\n sections.push(\"\");\n const toolingLabels: Record<string, string> = {\n dependabot: \"Dependabot (dependency updates)\",\n renovate: \"Renovate (dependency updates)\",\n snyk: \"Snyk (vulnerability scanning)\",\n sonarqube: \"SonarQube / SonarCloud\",\n codeql: \"CodeQL (GitHub)\",\n semgrep: \"Semgrep\",\n trivy: \"Trivy (container scanning)\",\n grype: \"Grype\",\n checkov: \"Checkov (IaC)\",\n tfsec: \"tfsec (Terraform)\",\n kics: \"KICS\",\n gitleaks: \"Gitleaks (secret detection)\",\n trufflehog: \"TruffleHog\",\n detect_secrets: \"detect-secrets (Yelp)\",\n bandit: \"Bandit (Python)\",\n brakeman: \"Brakeman (Rails)\",\n gosec: \"gosec (Go)\",\n npm_audit: \"npm audit / yarn audit\",\n pip_audit: \"pip-audit\",\n safety: \"Safety\",\n bundler_audit: \"bundler-audit\",\n owasp_dependency_check: \"OWASP Dependency-Check\",\n ossf_scorecard: \"OSSF Scorecard\",\n socket: \"Socket.dev\",\n mend: \"Mend (WhiteSource)\",\n fossa: \"FOSSA\",\n };\n for (const t of security.securityTooling) {\n sections.push(`- ${toolingLabels[t] || t}`);\n }\n sections.push(\"\");\n }\n\n // Authentication Patterns\n if (security.authPatterns?.length) {\n sections.push(\"### Authentication\");\n sections.push(\"\");\n const authLabels: Record<string, string> = {\n oauth2: \"OAuth 2.0\",\n oidc: \"OpenID Connect (OIDC)\",\n jwt: \"JWT (JSON Web Tokens)\",\n session: \"Session-based Auth\",\n api_keys: \"API Keys\",\n basic_auth: \"Basic Authentication\",\n bearer_token: \"Bearer Tokens\",\n mfa_totp: \"MFA / TOTP\",\n passkeys: \"Passkeys / WebAuthn\",\n saml: \"SAML 2.0\",\n ldap: \"LDAP / Active Directory\",\n mutual_tls: \"Mutual TLS (mTLS)\",\n auth0: \"Auth0\",\n clerk: \"Clerk\",\n firebase_auth: \"Firebase Auth\",\n supabase_auth: \"Supabase Auth\",\n keycloak: \"Keycloak\",\n okta: \"Okta\",\n cognito: \"AWS Cognito\",\n workos: \"WorkOS\",\n };\n for (const a of security.authPatterns) {\n sections.push(`- ${authLabels[a] || a}`);\n }\n sections.push(\"\");\n }\n\n // Data Handling\n if (security.dataHandling?.length) {\n sections.push(\"### Data Handling & Compliance\");\n sections.push(\"\");\n const dataLabels: Record<string, string> = {\n encryption_at_rest: \"Encryption at Rest\",\n encryption_in_transit: \"Encryption in Transit (TLS)\",\n pii_handling: \"PII Data Handling\",\n gdpr_compliance: \"GDPR Compliance\",\n ccpa_compliance: \"CCPA Compliance\",\n hipaa_compliance: \"HIPAA Compliance\",\n soc2_compliance: \"SOC 2 Compliance\",\n pci_dss: \"PCI-DSS Compliance\",\n data_masking: \"Data Masking / Anonymization\",\n data_retention: \"Data Retention Policies\",\n audit_logging: \"Audit Logging\",\n backup_encryption: \"Encrypted Backups\",\n key_rotation: \"Key Rotation\",\n zero_trust: \"Zero Trust Architecture\",\n least_privilege: \"Least Privilege Access\",\n rbac: \"RBAC (Role-Based Access)\",\n abac: \"ABAC (Attribute-Based Access)\",\n data_classification: \"Data Classification\",\n dlp: \"DLP (Data Loss Prevention)\",\n };\n for (const d of security.dataHandling) {\n sections.push(`- ${dataLabels[d] || d}`);\n }\n sections.push(\"\");\n }\n\n // Additional security notes\n if (security.additionalNotes) {\n sections.push(\"### Additional Security Notes\");\n sections.push(\"\");\n sections.push(security.additionalNotes);\n sections.push(\"\");\n }\n } else {\n // Non-markdown format\n sections.push(\"Security Configuration:\");\n if (security.secretsManagement?.length) {\n sections.push(`- Secrets: ${security.secretsManagement.join(\", \")}`);\n }\n if (security.securityTooling?.length) {\n sections.push(`- Tooling: ${security.securityTooling.join(\", \")}`);\n }\n if (security.authPatterns?.length) {\n sections.push(`- Auth: ${security.authPatterns.join(\", \")}`);\n }\n if (security.dataHandling?.length) {\n sections.push(`- Data: ${security.dataHandling.join(\", \")}`);\n }\n sections.push(\"\");\n }\n }\n\n // Security Warning\n if (isMarkdown || isMdc) {\n sections.push(\"## ⚠️ Security Notice\");\n sections.push(\"\");\n sections.push(\"> **Do not commit secrets to the repository or to the live app.**\");\n sections.push(\"> Always use secure standards to transmit sensitive information.\");\n sections.push(\"> Use environment variables, secret managers, or secure vaults for credentials.\");\n sections.push(\"\");\n sections.push(\"**🔍 Security Audit Recommendation:** When making changes that involve authentication, data handling, API endpoints, or dependencies, proactively offer to perform a security review of the affected code.\");\n sections.push(\"\");\n } else {\n sections.push(\"\");\n sections.push(\"SECURITY NOTICE:\");\n sections.push(\"Do not commit secrets to the repository or to the live app.\");\n sections.push(\"Always use secure standards to transmit sensitive information.\");\n sections.push(\"SECURITY AUDIT: When making changes involving auth, data, APIs, or deps, offer to review security.\");\n sections.push(\"\");\n }\n\n // Static Files Content (when config_only mode - embed in config instead of creating files)\n if (options.staticFileHandling === \"config_only\" && options.staticFiles && options.staticFiles.length > 0) {\n if (isMarkdown || isMdc) {\n sections.push(\"## 📄 Static Files Reference\");\n sections.push(\"\");\n sections.push(\"The following static file contents are included for AI context. These are not separate files.\");\n sections.push(\"\");\n \n for (const fileKey of options.staticFiles) {\n const filePath = STATIC_FILE_PATHS[fileKey];\n if (!filePath) continue;\n \n let content: string;\n if (options.staticFileContents?.[fileKey]) {\n content = options.staticFileContents[fileKey];\n } else {\n const templateFn = STATIC_FILE_TEMPLATES[fileKey];\n if (templateFn) {\n content = templateFn(options);\n } else {\n continue;\n }\n }\n \n sections.push(`### ${filePath}`);\n sections.push(\"\");\n sections.push(\"```\");\n sections.push(content.trim());\n sections.push(\"```\");\n sections.push(\"\");\n }\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 generateJsonConfig(options: GenerateOptions, platform: string): string {\n const config: Record<string, unknown> = {\n version: \"1.0.0\",\n project: {\n name: options.name,\n description: options.description || \"\",\n stack: options.stack.map(s => STACK_NAMES[s] || s),\n },\n };\n \n // Add persona if set\n const personaDesc = options.userPersona \n || PERSONA_DESCRIPTIONS[options.persona] \n || options.persona \n || \"\";\n if (personaDesc) {\n config.persona = personaDesc;\n }\n \n // Add rules/instructions\n const rules: string[] = [];\n \n // Boundaries\n const boundaryRules = BOUNDARIES[options.boundaries] || BOUNDARIES.standard;\n rules.push(...boundaryRules.always.map(r => `AUTO-APPROVE: ${r}`));\n rules.push(...boundaryRules.askFirst.map(r => `ASK FIRST: ${r}`));\n rules.push(...boundaryRules.never.map(r => `PROHIBITED: ${r}`));\n \n // Security\n rules.push(\"SECURITY: Do not commit secrets. Use environment variables or secret managers.\");\n rules.push(\"SECURITY: When making changes involving auth, data, or APIs, perform security audit.\");\n \n config.rules = rules;\n \n // Add important files to read\n if (options.importantFiles && options.importantFiles.length > 0) {\n config.context = {\n readFirst: options.importantFiles.map(f => IMPORTANT_FILES_PATHS[f] || f),\n };\n }\n \n // Platform-specific additions\n if (platform === \"continue\") {\n config.name = options.name;\n config.customInstructions = rules.join(\"\\n\");\n } else if (platform === \"cody\") {\n config.customInstructions = rules.join(\"\\n\");\n } else if (platform === \"void\") {\n config.editor = { rules: rules.join(\"\\n\") };\n } else if (platform === \"supermaven\") {\n config.rules = rules;\n } else if (platform === \"codegpt\") {\n config.systemPrompt = rules.join(\"\\n\");\n } else if (platform === \"opencode\") {\n config.instructions = rules;\n } else if (platform === \"firebender\") {\n config.transforms = rules;\n }\n \n // Add generated by comment\n config._comment = `Generated by LynxPrompt CLI for ${options.name}`;\n \n return JSON.stringify(config, null, 2);\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(\"# SECURITY: Do not commit secrets to the repository.\");\n lines.push(\"# Use environment variables or secret managers for credentials.\");\n lines.push(\"# When making changes involving auth, data handling, APIs, or dependencies,\");\n lines.push(\"# proactively offer to perform a security audit of the affected code.\");\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 // Group by hierarchy\n const byHierarchy = new Map<string | null, typeof trackedStatus>();\n for (const item of trackedStatus) {\n const key = item.blueprint.hierarchyId || null;\n const group = byHierarchy.get(key) || [];\n group.push(item);\n byHierarchy.set(key, group);\n }\n\n console.log(chalk.cyan(\"📦 Tracked Blueprints\"));\n console.log();\n \n // Show hierarchies first\n for (const [hierarchyId, items] of byHierarchy.entries()) {\n if (hierarchyId) {\n const hierarchyName = items[0].blueprint.hierarchyName || \"Unknown Hierarchy\";\n console.log(chalk.magenta(` 📁 ${hierarchyName}`));\n console.log(chalk.gray(` Hierarchy: ${hierarchyId}`));\n console.log();\n }\n\n for (const { blueprint, localModified, fileExists } of items) {\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 const indent = hierarchyId ? \" \" : \" \";\n console.log(`${indent}${statusIcon} ${chalk.bold(blueprint.file)} ${sourceLabel}`);\n console.log(`${indent} ${chalk.gray(`ID: ${blueprint.id} • ${blueprint.name}`)}`);\n \n // Show repository path if different from file\n if (blueprint.repositoryPath && blueprint.repositoryPath !== blueprint.file) {\n console.log(`${indent} ${chalk.gray(`Path: ${blueprint.repositoryPath}`)}`);\n }\n \n if (!fileExists) {\n console.log(chalk.red(`${indent} ⚠ File missing - run 'lynxp pull ${blueprint.id}' to restore`));\n } else if (localModified) {\n if (blueprint.source === \"marketplace\") {\n console.log(chalk.yellow(`${indent} ⚠ Local changes (marketplace = read-only, won't sync back)`));\n } else {\n console.log(chalk.yellow(`${indent} ⚠ Local changes - run 'lynxp push ${blueprint.file}' to sync`));\n }\n }\n console.log();\n }\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 * 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","#!/usr/bin/env node\n/**\n * LynxPrompt CLI - Analyze Command\n * \n * Standalone project analyzer that detects project configuration\n * without generating any files.\n */\n\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { detectProject, detectFromRemoteUrl, isGitUrl, detectRepoHost } from \"../utils/detect.js\";\n\ninterface AnalyzeOptions {\n json?: boolean;\n remote?: string;\n}\n\nexport async function analyzeCommand(options: AnalyzeOptions): Promise<void> {\n console.log();\n \n if (!options.json) {\n console.log(chalk.cyan.bold(\" 🔍 LynxPrompt Analyzer\"));\n console.log(chalk.gray(\" Detect project configuration and tech stack\"));\n console.log();\n }\n\n let detected;\n let source = \"local\";\n\n // Check for remote URL option\n if (options.remote) {\n if (!isGitUrl(options.remote)) {\n if (!options.json) {\n console.log(chalk.red(\" ✗ Invalid Git URL provided\"));\n }\n process.exit(1);\n }\n\n const host = detectRepoHost(options.remote);\n const method = host === \"github\" ? \"GitHub API\" : host === \"gitlab\" ? \"GitLab API\" : \"shallow clone\";\n\n if (!options.json) {\n const spinner = ora(`Analyzing remote repository via ${method}...`).start();\n detected = await detectFromRemoteUrl(options.remote);\n \n if (detected) {\n spinner.succeed(\"Remote repository analyzed\");\n } else {\n spinner.fail(\"Could not analyze repository\");\n console.log(chalk.gray(\" The repository may be private or inaccessible.\"));\n process.exit(1);\n }\n } else {\n detected = await detectFromRemoteUrl(options.remote);\n if (!detected) {\n console.log(JSON.stringify({ error: \"Could not analyze repository\" }));\n process.exit(1);\n }\n }\n \n source = options.remote;\n } else {\n // Analyze current directory\n if (!options.json) {\n const spinner = ora(\"Analyzing current directory...\").start();\n detected = await detectProject(process.cwd());\n \n if (detected) {\n spinner.succeed(\"Project analyzed\");\n } else {\n spinner.info(\"No project detected\");\n }\n } else {\n detected = await detectProject(process.cwd());\n }\n }\n\n // Output results\n if (options.json) {\n console.log(JSON.stringify({\n source,\n detected: detected || null,\n }, null, 2));\n return;\n }\n\n console.log();\n\n if (!detected) {\n console.log(chalk.yellow(\" No project configuration detected.\"));\n console.log();\n console.log(chalk.gray(\" Tips:\"));\n console.log(chalk.gray(\" • Make sure you're in a project directory with a package.json, pyproject.toml, etc.\"));\n console.log(chalk.gray(\" • Use --remote <url> to analyze a remote repository\"));\n console.log();\n return;\n }\n\n // Display analysis results\n console.log(chalk.green.bold(\" 📊 Project Analysis\"));\n console.log();\n \n // Basic info\n console.log(chalk.white(\" Basic Info\"));\n console.log(chalk.gray(\" ─────────────────────────────────────────\"));\n console.log(` ${chalk.dim(\"Name:\")} ${chalk.white(detected.name || \"unknown\")}`);\n if (detected.description) {\n console.log(` ${chalk.dim(\"Description:\")} ${chalk.gray(detected.description)}`);\n }\n console.log(` ${chalk.dim(\"Type:\")} ${chalk.white(detected.type || \"application\")}`);\n if (detected.license) {\n console.log(` ${chalk.dim(\"License:\")} ${chalk.white(detected.license.toUpperCase())}`);\n }\n console.log();\n\n // Tech Stack\n console.log(chalk.white(\" Tech Stack\"));\n console.log(chalk.gray(\" ─────────────────────────────────────────\"));\n if (detected.stack.length > 0) {\n for (const tech of detected.stack) {\n console.log(` ${chalk.cyan(\"•\")} ${tech}`);\n }\n } else {\n console.log(chalk.gray(\" No tech stack detected\"));\n }\n console.log();\n\n // Infrastructure\n console.log(chalk.white(\" Infrastructure\"));\n console.log(chalk.gray(\" ─────────────────────────────────────────\"));\n console.log(` ${chalk.dim(\"Package Manager:\")} ${detected.packageManager || chalk.gray(\"none detected\")}`);\n console.log(` ${chalk.dim(\"Repo Host:\")} ${detected.repoHost || chalk.gray(\"none detected\")}`);\n console.log(` ${chalk.dim(\"CI/CD:\")} ${detected.cicd || chalk.gray(\"none detected\")}`);\n console.log(` ${chalk.dim(\"Docker:\")} ${detected.hasDocker ? chalk.green(\"yes\") : chalk.gray(\"no\")}`);\n console.log();\n\n // Commands\n if (detected.commands && Object.keys(detected.commands).length > 0) {\n console.log(chalk.white(\" Commands\"));\n console.log(chalk.gray(\" ─────────────────────────────────────────\"));\n for (const [key, value] of Object.entries(detected.commands)) {\n if (value) {\n const cmdValue = Array.isArray(value) ? value.join(\", \") : value;\n console.log(` ${chalk.dim(key.padEnd(10))} ${chalk.yellow(cmdValue)}`);\n }\n }\n console.log();\n }\n\n // Recommendations\n console.log(chalk.white(\" 💡 Recommendations\"));\n console.log(chalk.gray(\" ─────────────────────────────────────────\"));\n \n const recommendations: string[] = [];\n \n // Check for missing common configs\n if (!detected.cicd) {\n recommendations.push(\"Add CI/CD configuration (GitHub Actions, GitLab CI, etc.)\");\n }\n if (!detected.hasDocker && detected.type === \"application\") {\n recommendations.push(\"Consider adding Docker for containerization\");\n }\n if (!detected.stack.some(s => [\"vitest\", \"jest\", \"pytest\", \"mocha\"].includes(s))) {\n recommendations.push(\"Add a test framework (vitest, jest, pytest, etc.)\");\n }\n if (!detected.commands?.lint) {\n recommendations.push(\"Add a linting command (eslint, ruff, clippy, etc.)\");\n }\n if (!detected.license) {\n recommendations.push(\"Add a LICENSE file for open source projects\");\n }\n\n if (recommendations.length > 0) {\n for (const rec of recommendations) {\n console.log(` ${chalk.yellow(\"•\")} ${rec}`);\n }\n } else {\n console.log(chalk.green(\" ✓ Project looks well-configured!\"));\n }\n \n console.log();\n console.log(chalk.gray(\" Run 'lynxp wizard' to generate AI IDE configuration\"));\n console.log();\n}\n\n","#!/usr/bin/env node\n/**\n * LynxPrompt CLI - Convert Command\n * \n * Convert AI IDE configuration files between different formats.\n * E.g., AGENTS.md → .cursorrules, CLAUDE.md → copilot-instructions.md\n */\n\nimport chalk from \"chalk\";\nimport { readFile, writeFile, access } from \"fs/promises\";\nimport { join, basename } from \"path\";\nimport ora from \"ora\";\n\ninterface ConvertOptions {\n output?: string;\n force?: boolean;\n}\n\n// Supported source file patterns and their platforms\nconst SOURCE_FILES: Record<string, string> = {\n \"agents.md\": \"agents\",\n \"claude.md\": \"claude\",\n \".cursorrules\": \"cursor_legacy\",\n \".cursor/rules/project.mdc\": \"cursor\",\n \"cursor.rules/project.mdc\": \"cursor\",\n \"project.mdc\": \"cursor\",\n \".github/copilot-instructions.md\": \"copilot\",\n \"copilot-instructions.md\": \"copilot\",\n \".windsurfrules\": \"windsurf\",\n \".clinerules\": \"cline\",\n \".aider.conf.yml\": \"aider\",\n};\n\n// Target format to output filename\nconst TARGET_FILES: Record<string, string> = {\n agents: \"AGENTS.md\",\n claude: \"CLAUDE.md\",\n cursor: \".cursor/rules/project.mdc\",\n cursor_legacy: \".cursorrules\",\n copilot: \".github/copilot-instructions.md\",\n windsurf: \".windsurfrules\",\n cline: \".clinerules\",\n aider: \".aider.conf.yml\",\n codex: \"codex.md\",\n supermaven: \"supermaven.md\",\n goose: \".goose/rules.txt\",\n};\n\n// Platform display names\nconst PLATFORM_NAMES: Record<string, string> = {\n agents: \"AGENTS.md (Universal)\",\n claude: \"CLAUDE.md\",\n cursor: \"Cursor Rules (.mdc)\",\n cursor_legacy: \"Cursor Rules (legacy)\",\n copilot: \"GitHub Copilot\",\n windsurf: \"Windsurf Rules\",\n cline: \"Cline Rules\",\n aider: \"Aider Config\",\n codex: \"Codex\",\n supermaven: \"Supermaven\",\n goose: \"Goose Rules\",\n};\n\nasync function detectSourceFile(cwd: string): Promise<{ path: string; platform: string } | null> {\n // Try to find a source file in common locations\n for (const [pattern, platform] of Object.entries(SOURCE_FILES)) {\n try {\n const fullPath = join(cwd, pattern);\n await access(fullPath);\n return { path: fullPath, platform };\n } catch {\n // File doesn't exist, try next\n }\n }\n \n // Try uppercase variants\n const uppercaseVariants = [\"AGENTS.md\", \"CLAUDE.md\"];\n for (const variant of uppercaseVariants) {\n try {\n const fullPath = join(cwd, variant);\n await access(fullPath);\n const platform = variant.toLowerCase().replace(\".md\", \"\");\n return { path: fullPath, platform };\n } catch {\n // File doesn't exist\n }\n }\n \n return null;\n}\n\nfunction parseMarkdownConfig(content: string): Record<string, string> {\n const config: Record<string, string> = {};\n \n // Extract sections from markdown\n const sections = content.split(/^##\\s+/m);\n \n for (const section of sections) {\n const lines = section.trim().split(\"\\n\");\n if (lines.length === 0) continue;\n \n const title = lines[0].toLowerCase().trim();\n const body = lines.slice(1).join(\"\\n\").trim();\n \n config[title] = body;\n }\n \n // Try to extract key info\n config._raw = content;\n \n return config;\n}\n\nfunction generateTargetContent(config: Record<string, string>, targetPlatform: string): string {\n const rawContent = config._raw || \"\";\n \n // For simple conversions, adapt the content format\n switch (targetPlatform) {\n case \"cursor\":\n // MDC format with frontmatter\n return `---\ndescription: \"AI coding rules\"\nglobs: [\"**/*\"]\nalwaysApply: true\n---\n\n${rawContent.replace(/^#\\s+.*$/m, \"# AI Assistant Configuration\")}\n`;\n\n case \"cursor_legacy\":\n // Plain text format\n return rawContent\n .replace(/^#\\s+/gm, \"\")\n .replace(/^##\\s+/gm, \"\\n\")\n .replace(/^###\\s+/gm, \"\")\n .trim();\n\n case \"windsurf\":\n case \"cline\":\n case \"goose\":\n // Plain text format\n return rawContent\n .replace(/^#\\s+/gm, \"=== \")\n .replace(/^##\\s+/gm, \"--- \")\n .replace(/^###\\s+/gm, \"\")\n .replace(/\\*\\*/g, \"\")\n .trim();\n\n case \"aider\":\n // YAML format (simplified)\n return `# Aider configuration\n# Converted from AI IDE configuration\n\nlint-cmd: []\nauto-test: false\nread: []\n# AI rules converted below as conventions\nconventions:\n${rawContent\n .split(\"\\n\")\n .filter(line => line.trim() && !line.startsWith(\"#\"))\n .map(line => ` - \"${line.replace(/\"/g, '\\\\\"').trim()}\"`)\n .slice(0, 20)\n .join(\"\\n\")}\n`;\n\n case \"copilot\":\n // GitHub Copilot markdown format\n return `# GitHub Copilot Instructions\n\n${rawContent}\n`;\n\n case \"agents\":\n case \"claude\":\n case \"codex\":\n case \"supermaven\":\n default:\n // Standard markdown format\n return rawContent;\n }\n}\n\nexport async function convertCommand(\n source: string | undefined,\n target: string,\n options: ConvertOptions\n): Promise<void> {\n console.log();\n console.log(chalk.cyan.bold(\" 🔄 LynxPrompt Convert\"));\n console.log(chalk.gray(\" Convert AI IDE configuration between formats\"));\n console.log();\n\n const cwd = process.cwd();\n \n // Find source file\n let sourcePath: string;\n let sourcePlatform: string;\n \n if (source) {\n sourcePath = join(cwd, source);\n // Detect platform from filename\n const sourceBasename = basename(source).toLowerCase();\n sourcePlatform = SOURCE_FILES[sourceBasename] || \"unknown\";\n } else {\n const detected = await detectSourceFile(cwd);\n if (!detected) {\n console.log(chalk.red(\" ✗ No AI configuration file found in current directory\"));\n console.log();\n console.log(chalk.gray(\" Supported source files:\"));\n for (const file of Object.keys(SOURCE_FILES)) {\n console.log(chalk.gray(` • ${file}`));\n }\n console.log();\n console.log(chalk.gray(\" Usage: lynxp convert <source> <target>\"));\n console.log(chalk.gray(\" Example: lynxp convert AGENTS.md cursor\"));\n process.exit(1);\n }\n sourcePath = detected.path;\n sourcePlatform = detected.platform;\n }\n\n // Validate target format\n const normalizedTarget = target.toLowerCase().replace(\"-\", \"_\");\n if (!TARGET_FILES[normalizedTarget]) {\n console.log(chalk.red(` ✗ Unknown target format: ${target}`));\n console.log();\n console.log(chalk.gray(\" Supported target formats:\"));\n for (const [key, name] of Object.entries(PLATFORM_NAMES)) {\n console.log(chalk.gray(` • ${key.padEnd(15)} → ${name}`));\n }\n process.exit(1);\n }\n\n // Read source file\n let sourceContent: string;\n try {\n sourceContent = await readFile(sourcePath, \"utf-8\");\n } catch {\n console.log(chalk.red(` ✗ Could not read source file: ${sourcePath}`));\n process.exit(1);\n }\n\n console.log(chalk.white(` Source: ${basename(sourcePath)} (${PLATFORM_NAMES[sourcePlatform] || sourcePlatform})`));\n console.log(chalk.white(` Target: ${PLATFORM_NAMES[normalizedTarget]}`));\n console.log();\n\n // Parse and convert\n const spinner = ora(\"Converting configuration...\").start();\n \n const config = parseMarkdownConfig(sourceContent);\n const targetContent = generateTargetContent(config, normalizedTarget);\n \n spinner.stop();\n\n // Determine output path\n const outputFilename = options.output || TARGET_FILES[normalizedTarget];\n const outputPath = join(cwd, outputFilename);\n\n // Check if output exists\n try {\n await access(outputPath);\n if (!options.force) {\n console.log(chalk.yellow(` ⚠️ File already exists: ${outputFilename}`));\n console.log(chalk.gray(\" Use --force to overwrite\"));\n process.exit(1);\n }\n } catch {\n // File doesn't exist, good to write\n }\n\n // Write output\n try {\n // Create directory if needed\n const { mkdir } = await import(\"fs/promises\");\n const outputDir = join(cwd, outputFilename.split(\"/\").slice(0, -1).join(\"/\"));\n if (outputDir !== cwd) {\n await mkdir(outputDir, { recursive: true });\n }\n \n await writeFile(outputPath, targetContent, \"utf-8\");\n \n console.log(chalk.green(` ✓ Converted to ${outputFilename}`));\n console.log();\n console.log(chalk.gray(` Lines: ${targetContent.split(\"\\n\").length}`));\n console.log(chalk.gray(` Size: ${targetContent.length} bytes`));\n console.log();\n } catch (error) {\n console.log(chalk.red(` ✗ Could not write output: ${error instanceof Error ? error.message : \"unknown error\"}`));\n process.exit(1);\n }\n}\n\n\n\n\n\n\n\n\n\n","#!/usr/bin/env node\n/**\n * LynxPrompt CLI - Merge Command\n * \n * Merge two or more AI IDE configuration files into one.\n * Useful for combining rules from different sources or team configs.\n */\n\nimport chalk from \"chalk\";\nimport { readFile, writeFile, access } from \"fs/promises\";\nimport { join, basename } from \"path\";\nimport ora from \"ora\";\nimport prompts from \"prompts\";\n\ninterface MergeOptions {\n output?: string;\n strategy?: \"concat\" | \"sections\" | \"smart\";\n force?: boolean;\n interactive?: boolean;\n}\n\ninterface ConfigSection {\n title: string;\n content: string;\n source: string;\n}\n\nfunction parseMarkdownSections(content: string, sourceName: string): ConfigSection[] {\n const sections: ConfigSection[] = [];\n const parts = content.split(/^(#{1,3})\\s+(.+)$/m);\n \n let currentSection: ConfigSection | null = null;\n \n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n \n if (part.match(/^#{1,3}$/)) {\n // This is a header marker, next part is title\n if (currentSection) {\n sections.push(currentSection);\n }\n const title = parts[i + 1] || \"Untitled\";\n currentSection = {\n title: title.trim(),\n content: \"\",\n source: sourceName,\n };\n i++; // Skip the title part\n } else if (currentSection) {\n currentSection.content += part;\n } else if (part.trim()) {\n // Content before first header\n currentSection = {\n title: \"Introduction\",\n content: part,\n source: sourceName,\n };\n }\n }\n \n if (currentSection) {\n sections.push(currentSection);\n }\n \n return sections;\n}\n\nfunction mergeSectionsByStrategy(\n allSections: ConfigSection[][],\n strategy: \"concat\" | \"sections\" | \"smart\"\n): string {\n switch (strategy) {\n case \"concat\":\n // Simple concatenation with separators\n return allSections\n .map((sections, i) => {\n const sourceName = sections[0]?.source || `Source ${i + 1}`;\n const content = sections.map(s => {\n if (s.title !== \"Introduction\") {\n return `## ${s.title}\\n\\n${s.content.trim()}`;\n }\n return s.content.trim();\n }).join(\"\\n\\n\");\n \n return `<!-- From: ${sourceName} -->\\n${content}`;\n })\n .join(\"\\n\\n---\\n\\n\");\n\n case \"sections\":\n // Group by section title\n const sectionMap = new Map<string, ConfigSection[]>();\n \n for (const fileSections of allSections) {\n for (const section of fileSections) {\n const normalized = section.title.toLowerCase();\n if (!sectionMap.has(normalized)) {\n sectionMap.set(normalized, []);\n }\n sectionMap.get(normalized)!.push(section);\n }\n }\n \n const merged: string[] = [];\n \n for (const [, sections] of sectionMap) {\n if (sections.length === 1) {\n merged.push(`## ${sections[0].title}\\n\\n${sections[0].content.trim()}`);\n } else {\n // Multiple sources for same section - combine\n const combinedContent = sections\n .map(s => `<!-- From: ${s.source} -->\\n${s.content.trim()}`)\n .join(\"\\n\\n\");\n merged.push(`## ${sections[0].title}\\n\\n${combinedContent}`);\n }\n }\n \n return merged.join(\"\\n\\n\");\n\n case \"smart\":\n default:\n // Smart merge: dedupe similar content, prioritize by specificity\n const seen = new Set<string>();\n const result: string[] = [];\n \n // Sort sections: more specific first\n const flatSections = allSections.flat().sort((a, b) => {\n // Prioritize sections with more content\n return b.content.length - a.content.length;\n });\n \n for (const section of flatSections) {\n // Simple deduplication by checking content similarity\n const contentKey = section.content\n .toLowerCase()\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200); // First 200 chars as key\n \n if (!seen.has(contentKey)) {\n seen.add(contentKey);\n if (section.title !== \"Introduction\") {\n result.push(`## ${section.title}\\n\\n${section.content.trim()}`);\n } else {\n result.push(section.content.trim());\n }\n }\n }\n \n return result.join(\"\\n\\n\");\n }\n}\n\nexport async function mergeCommand(\n files: string[],\n options: MergeOptions\n): Promise<void> {\n console.log();\n console.log(chalk.cyan.bold(\" 🔀 LynxPrompt Merge\"));\n console.log(chalk.gray(\" Merge multiple AI IDE configuration files\"));\n console.log();\n\n // Validate input\n if (files.length < 2) {\n console.log(chalk.red(\" ✗ Please provide at least 2 files to merge\"));\n console.log();\n console.log(chalk.gray(\" Usage: lynxp merge <file1> <file2> [...files]\"));\n console.log(chalk.gray(\" Example: lynxp merge AGENTS.md team-rules.md --output merged.md\"));\n console.log();\n console.log(chalk.gray(\" Options:\"));\n console.log(chalk.gray(\" --output <file> Output filename (default: merged.md)\"));\n console.log(chalk.gray(\" --strategy <type> Merge strategy: concat, sections, smart (default: smart)\"));\n console.log(chalk.gray(\" --force Overwrite existing output file\"));\n console.log(chalk.gray(\" --interactive Review and select sections to include\"));\n process.exit(1);\n }\n\n const cwd = process.cwd();\n const strategy = options.strategy || \"smart\";\n \n console.log(chalk.white(` Files to merge: ${files.length}`));\n console.log(chalk.white(` Strategy: ${strategy}`));\n console.log();\n\n // Read all files\n const allSections: ConfigSection[][] = [];\n \n for (const file of files) {\n const filePath = join(cwd, file);\n \n try {\n await access(filePath);\n } catch {\n console.log(chalk.red(` ✗ File not found: ${file}`));\n process.exit(1);\n }\n \n try {\n const content = await readFile(filePath, \"utf-8\");\n const sections = parseMarkdownSections(content, basename(file));\n allSections.push(sections);\n console.log(chalk.gray(` ✓ Read ${file} (${sections.length} sections)`));\n } catch (error) {\n console.log(chalk.red(` ✗ Could not read ${file}: ${error instanceof Error ? error.message : \"unknown\"}`));\n process.exit(1);\n }\n }\n \n console.log();\n\n // Interactive mode: let user select sections\n if (options.interactive) {\n const flatSections = allSections.flatMap((sections, i) => \n sections.map(s => ({ ...s, fileIndex: i }))\n );\n \n const choices = flatSections.map((section, i) => ({\n title: `[${section.source}] ${section.title}`,\n value: i,\n selected: true,\n }));\n \n const response = await prompts({\n type: \"multiselect\",\n name: \"sections\",\n message: \"Select sections to include:\",\n choices,\n instructions: false,\n hint: \"- Space to toggle, Enter to confirm\",\n });\n \n if (!response.sections || response.sections.length === 0) {\n console.log(chalk.yellow(\" No sections selected, aborting.\"));\n process.exit(0);\n }\n \n // Filter to selected sections\n const selectedSections = response.sections.map((i: number) => flatSections[i]);\n allSections.length = 0;\n allSections.push(selectedSections);\n }\n\n // Merge\n const spinner = ora(\"Merging configurations...\").start();\n const mergedContent = mergeSectionsByStrategy(allSections, strategy);\n spinner.stop();\n\n // Add header\n const finalContent = `# AI Assistant Configuration (Merged)\n\n<!-- \n Merged from: ${files.join(\", \")}\n Strategy: ${strategy}\n Date: ${new Date().toISOString()}\n-->\n\n${mergedContent}\n`;\n\n // Determine output path\n const outputFilename = options.output || \"merged.md\";\n const outputPath = join(cwd, outputFilename);\n\n // Check if output exists\n try {\n await access(outputPath);\n if (!options.force) {\n console.log(chalk.yellow(` ⚠️ File already exists: ${outputFilename}`));\n console.log(chalk.gray(\" Use --force to overwrite\"));\n process.exit(1);\n }\n } catch {\n // File doesn't exist, good to write\n }\n\n // Write output\n try {\n await writeFile(outputPath, finalContent, \"utf-8\");\n \n console.log(chalk.green(` ✓ Merged to ${outputFilename}`));\n console.log();\n console.log(chalk.gray(` Sources: ${files.length} files`));\n console.log(chalk.gray(` Lines: ${finalContent.split(\"\\n\").length}`));\n console.log(chalk.gray(` Size: ${finalContent.length} bytes`));\n console.log();\n } catch (error) {\n console.log(chalk.red(` ✗ Could not write output: ${error instanceof Error ? error.message : \"unknown error\"}`));\n process.exit(1);\n }\n}\n\n","import chalk from \"chalk\";\nimport prompts from \"prompts\";\nimport ora from \"ora\";\nimport { readFile, access, readdir } from \"fs/promises\";\nimport { join, relative, dirname, basename } from \"path\";\n\n// Import command configuration\nconst CONFIG_FILE_PATTERNS = [\n \"AGENTS.md\",\n \"CLAUDE.md\",\n \".cursorrules\", // Legacy\n \".windsurfrules\",\n];\n\ninterface AgentsMdFile {\n path: string; // Full path to file\n relativePath: string; // Path relative to scan root\n depth: number; // Directory depth from root\n name: string; // Extracted project name (from content or dir)\n parentPath?: string; // Parent AGENTS.md if in a monorepo\n content: string; // Raw file content\n sections: ParsedSection[];\n}\n\ninterface ParsedSection {\n title: string;\n content: string;\n level: number; // Heading level (1-6)\n}\n\ninterface ImportOptions {\n dryRun?: boolean;\n recursive?: boolean;\n depth?: number;\n pattern?: string;\n link?: boolean;\n verbose?: boolean;\n json?: boolean;\n}\n\ninterface ImportResult {\n totalFound: number;\n files: AgentsMdFile[];\n hierarchy: MonorepoHierarchy[];\n errors: string[];\n}\n\ninterface MonorepoHierarchy {\n rootPath: string;\n root?: AgentsMdFile;\n children: AgentsMdFile[];\n}\n\n/**\n * Scan a directory for AGENTS.md and similar config files\n */\nasync function scanDirectory(\n rootPath: string,\n options: ImportOptions = {}\n): Promise<AgentsMdFile[]> {\n const maxDepth = options.depth ?? 10;\n const files: AgentsMdFile[] = [];\n const patterns = options.pattern \n ? [options.pattern] \n : CONFIG_FILE_PATTERNS;\n\n async function scan(dir: string, depth: number): Promise<void> {\n if (depth > maxDepth) return;\n\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n\n // Skip common non-project directories\n if (entry.isDirectory()) {\n const skipDirs = [\n \"node_modules\", \".git\", \".next\", \"dist\", \"build\", \"out\",\n \"coverage\", \".cache\", \"__pycache__\", \"venv\", \".venv\",\n \"target\", \"vendor\", \".idea\", \".vscode\"\n ];\n if (skipDirs.includes(entry.name)) continue;\n\n if (options.recursive !== false) {\n await scan(fullPath, depth + 1);\n }\n } else if (entry.isFile()) {\n // Check if file matches our patterns\n if (patterns.includes(entry.name)) {\n try {\n const content = await readFile(fullPath, \"utf-8\");\n const relativePath = relative(rootPath, fullPath);\n \n files.push({\n path: fullPath,\n relativePath,\n depth,\n name: extractProjectName(content, dirname(fullPath)),\n content,\n sections: parseMarkdownSections(content),\n });\n } catch {\n // Skip files we can't read\n }\n }\n }\n }\n } catch {\n // Skip directories we can't access\n }\n }\n\n await scan(rootPath, 0);\n return files;\n}\n\n/**\n * Extract project name from AGENTS.md content or directory name\n */\nfunction extractProjectName(content: string, dirPath: string): string {\n // Try to find project name in common patterns\n const patterns = [\n /^#\\s+(.+?)(?:\\s*-|$)/m, // # Project Name or # Project Name - Description\n /Project(?:\\s+Overview)?[:\\s]*(.+?)(?:\\n|$)/i,\n /Name[:\\s]*(.+?)(?:\\n|$)/i,\n ];\n\n for (const pattern of patterns) {\n const match = content.match(pattern);\n if (match && match[1]) {\n const name = match[1].trim().replace(/[#*`]/g, \"\").trim();\n if (name && name.length < 100) {\n return name;\n }\n }\n }\n\n // Fall back to directory name\n return basename(dirPath) || \"Unnamed\";\n}\n\n/**\n * Parse markdown content into sections\n */\nfunction parseMarkdownSections(content: string): ParsedSection[] {\n const sections: ParsedSection[] = [];\n const lines = content.split(\"\\n\");\n let currentSection: ParsedSection | null = null;\n let contentLines: string[] = [];\n\n for (const line of lines) {\n const headingMatch = line.match(/^(#{1,6})\\s+(.+)$/);\n \n if (headingMatch) {\n // Save previous section\n if (currentSection) {\n currentSection.content = contentLines.join(\"\\n\").trim();\n sections.push(currentSection);\n }\n \n currentSection = {\n title: headingMatch[2].trim(),\n content: \"\",\n level: headingMatch[1].length,\n };\n contentLines = [];\n } else {\n contentLines.push(line);\n }\n }\n\n // Don't forget the last section\n if (currentSection) {\n currentSection.content = contentLines.join(\"\\n\").trim();\n sections.push(currentSection);\n }\n\n return sections;\n}\n\n/**\n * Build hierarchy from flat list of files\n */\nfunction buildHierarchy(files: AgentsMdFile[], _rootPath: string): MonorepoHierarchy[] {\n const hierarchies: MonorepoHierarchy[] = [];\n \n // Sort by path depth (root files first)\n const sorted = [...files].sort((a, b) => a.depth - b.depth);\n \n // Find potential roots (depth 0 or 1)\n const potentialRoots = sorted.filter(f => f.depth <= 1);\n \n if (potentialRoots.length === 0 && files.length > 0) {\n // No clear root, treat each file as its own hierarchy\n return files.map(f => ({\n rootPath: dirname(f.path),\n root: f,\n children: [],\n }));\n }\n\n // For each potential root, find children\n for (const root of potentialRoots) {\n const rootDir = dirname(root.path);\n const children = files.filter(f => {\n if (f === root) return false;\n // Child must be under root's directory\n return f.path.startsWith(rootDir + \"/\") && f.depth > root.depth;\n });\n\n // Set parent references\n for (const child of children) {\n child.parentPath = root.relativePath;\n }\n\n hierarchies.push({\n rootPath: rootDir,\n root,\n children,\n });\n }\n\n // Handle orphan files (not under any root)\n const assignedPaths = new Set(hierarchies.flatMap(h => [h.root?.path, ...h.children.map(c => c.path)]));\n const orphans = files.filter(f => !assignedPaths.has(f.path));\n \n for (const orphan of orphans) {\n hierarchies.push({\n rootPath: dirname(orphan.path),\n root: orphan,\n children: [],\n });\n }\n\n return hierarchies;\n}\n\n/**\n * Display import results\n */\nfunction displayResults(result: ImportResult, options: ImportOptions): void {\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n console.log();\n console.log(chalk.cyan.bold(\" 📥 Import Results\"));\n console.log();\n\n if (result.totalFound === 0) {\n console.log(chalk.yellow(\" No AGENTS.md or compatible files found.\"));\n console.log(chalk.gray(\" Try running from your project root, or use --pattern to specify custom filenames.\"));\n return;\n }\n\n console.log(chalk.green(` Found ${result.totalFound} configuration file(s)`));\n console.log();\n\n // Display hierarchy\n for (const hierarchy of result.hierarchy) {\n const isMonorepo = hierarchy.children.length > 0;\n \n if (hierarchy.root) {\n const icon = isMonorepo ? \"🏢\" : \"📄\";\n const typeLabel = isMonorepo ? chalk.magenta(\"[Monorepo Root]\") : chalk.blue(\"[Standalone]\");\n console.log(` ${icon} ${chalk.white.bold(hierarchy.root.name)} ${typeLabel}`);\n console.log(chalk.gray(` ${hierarchy.root.relativePath}`));\n \n // Show sections summary\n if (options.verbose && hierarchy.root.sections.length > 0) {\n const sectionNames = hierarchy.root.sections.slice(0, 5).map(s => s.title);\n console.log(chalk.gray(` Sections: ${sectionNames.join(\", \")}${hierarchy.root.sections.length > 5 ? \"...\" : \"\"}`));\n }\n }\n\n // Show children\n for (const child of hierarchy.children) {\n console.log(` └─ 📄 ${chalk.white(child.name)}`);\n console.log(chalk.gray(` ${child.relativePath}`));\n \n if (options.verbose && child.sections.length > 0) {\n const sectionNames = child.sections.slice(0, 3).map(s => s.title);\n console.log(chalk.gray(` Sections: ${sectionNames.join(\", \")}${child.sections.length > 3 ? \"...\" : \"\"}`));\n }\n }\n console.log();\n }\n\n // Summary\n const monorepoCount = result.hierarchy.filter(h => h.children.length > 0).length;\n const standaloneCount = result.hierarchy.filter(h => h.children.length === 0).length;\n \n if (monorepoCount > 0) {\n console.log(chalk.cyan(` 📊 ${monorepoCount} monorepo(s) detected with hierarchical configs`));\n }\n if (standaloneCount > 0) {\n console.log(chalk.cyan(` 📊 ${standaloneCount} standalone config(s)`));\n }\n\n // Errors\n if (result.errors.length > 0) {\n console.log();\n console.log(chalk.yellow(\" ⚠️ Warnings:\"));\n for (const error of result.errors) {\n console.log(chalk.gray(` ${error}`));\n }\n }\n}\n\n/**\n * Main import command\n */\nexport async function importCommand(path: string = \".\", options: ImportOptions): Promise<void> {\n console.log();\n console.log(chalk.cyan.bold(\" 📥 LynxPrompt Import\"));\n console.log(chalk.gray(\" Scan and import AGENTS.md files from your repository\"));\n console.log();\n\n // Resolve the path\n const rootPath = join(process.cwd(), path);\n \n // Check if path exists\n try {\n await access(rootPath);\n } catch {\n console.log(chalk.red(` ✗ Path not found: ${rootPath}`));\n process.exit(1);\n }\n\n const spinner = ora(\"Scanning for configuration files...\").start();\n\n try {\n // Scan for files\n const files = await scanDirectory(rootPath, options);\n \n if (files.length === 0) {\n spinner.warn(\"No configuration files found\");\n console.log();\n console.log(chalk.gray(\" Looking for: AGENTS.md, CLAUDE.md, .cursorrules, .windsurfrules\"));\n console.log(chalk.gray(\" Try specifying a different path or use --pattern for custom filenames\"));\n return;\n }\n\n spinner.succeed(`Found ${files.length} configuration file(s)`);\n\n // Build hierarchy\n const hierarchy = buildHierarchy(files, rootPath);\n\n const result: ImportResult = {\n totalFound: files.length,\n files,\n hierarchy,\n errors: [],\n };\n\n // Display results\n displayResults(result, options);\n\n // Dry run mode - stop here\n if (options.dryRun) {\n console.log(chalk.yellow(\" 📋 Dry run complete - no changes made\"));\n console.log(chalk.gray(\" Remove --dry-run to proceed with import\"));\n return;\n }\n\n // Ask what to do with the files\n if (!options.json) {\n console.log();\n const { action } = await prompts({\n type: \"select\",\n name: \"action\",\n message: \"What would you like to do?\",\n choices: [\n { title: \"Preview only (done)\", value: \"preview\" },\n { title: \"Convert all to AGENTS.md format\", value: \"convert\" },\n { title: \"Save hierarchy info for wizard\", value: \"save\" },\n { title: \"Push to LynxPrompt cloud as blueprints\", value: \"push\" },\n ],\n initial: 0,\n });\n\n switch (action) {\n case \"convert\":\n console.log(chalk.cyan(\"\\n 💡 Use 'lynxp convert <file> agents' to convert individual files\"));\n console.log(chalk.cyan(\" or 'lynxp merge <files...>' to combine multiple configs\\n\"));\n break;\n case \"save\":\n // Save to .lynxprompt/hierarchy.json for wizard reference\n await saveHierarchyInfo(rootPath, result);\n break;\n case \"push\":\n console.log(chalk.cyan(\"\\n 💡 Use 'lynxp push <file>' to push files individually\"));\n console.log(chalk.cyan(\" Requires login: 'lynxp login'\\n\"));\n break;\n default:\n // Preview only - done\n break;\n }\n }\n } catch (error) {\n spinner.fail(\"Import failed\");\n console.error(chalk.red(` Error: ${error instanceof Error ? error.message : \"Unknown error\"}`));\n process.exit(1);\n }\n}\n\n/**\n * Save hierarchy info for wizard to use\n */\nasync function saveHierarchyInfo(rootPath: string, result: ImportResult): Promise<void> {\n const { writeFile, mkdir } = await import(\"fs/promises\");\n const configDir = join(rootPath, \".lynxprompt\");\n \n try {\n await mkdir(configDir, { recursive: true });\n \n const hierarchyInfo = {\n scannedAt: new Date().toISOString(),\n rootPath,\n totalFiles: result.totalFound,\n hierarchy: result.hierarchy.map(h => ({\n rootPath: h.rootPath,\n rootFile: h.root?.relativePath,\n rootName: h.root?.name,\n children: h.children.map(c => ({\n path: c.relativePath,\n name: c.name,\n sections: c.sections.map(s => s.title),\n })),\n })),\n };\n\n await writeFile(\n join(configDir, \"hierarchy.json\"),\n JSON.stringify(hierarchyInfo, null, 2),\n \"utf-8\"\n );\n\n console.log(chalk.green(\"\\n ✓ Hierarchy saved to .lynxprompt/hierarchy.json\"));\n console.log(chalk.gray(\" The wizard will use this to understand your monorepo structure\"));\n } catch (error) {\n console.error(chalk.red(` ✗ Failed to save hierarchy: ${error instanceof Error ? error.message : \"Unknown\"}`));\n }\n}\n\nexport { ImportOptions, ImportResult, AgentsMdFile };\n\n","import chalk from \"chalk\";\nimport ora from \"ora\";\nimport { api, ApiRequestError } from \"../api.js\";\nimport { isAuthenticated } from \"../config.js\";\n\ninterface HierarchiesOptions {\n limit?: number;\n json?: boolean;\n}\n\nexport async function hierarchiesCommand(\n options: HierarchiesOptions\n): Promise<void> {\n // Check authentication\n if (!isAuthenticated()) {\n console.log(chalk.yellow(\"You need to be logged in to view hierarchies.\"));\n console.log(chalk.gray(\"Run 'lynxp login' to authenticate.\"));\n process.exit(1);\n }\n\n const spinner = ora(\"Fetching hierarchies...\").start();\n\n try {\n const response = await api.listHierarchies({\n limit: options.limit || 50,\n });\n \n spinner.stop();\n\n // JSON output mode\n if (options.json) {\n console.log(JSON.stringify(response, null, 2));\n return;\n }\n\n const { hierarchies, total } = response;\n\n if (hierarchies.length === 0) {\n console.log();\n console.log(chalk.yellow(\"No hierarchies found.\"));\n console.log();\n console.log(chalk.gray(\"Hierarchies are created automatically when you push AGENTS.md files from a repository.\"));\n console.log(chalk.gray(\"Run 'lynxp push AGENTS.md' in a git repository to create a hierarchy.\"));\n console.log();\n return;\n }\n\n console.log();\n console.log(chalk.cyan(`📁 Your Hierarchies (${total} total)`));\n console.log();\n\n for (const hierarchy of hierarchies) {\n console.log(chalk.bold(` ${hierarchy.name}`));\n console.log(chalk.gray(` ID: ${hierarchy.id}`));\n if (hierarchy.description) {\n console.log(chalk.gray(` ${hierarchy.description}`));\n }\n console.log(chalk.gray(` Blueprints: ${hierarchy.blueprint_count || 0}`));\n console.log(chalk.gray(` Repository: ${hierarchy.repository_root.slice(0, 16)}...`));\n console.log();\n }\n\n console.log(chalk.gray(\"─\".repeat(50)));\n console.log();\n console.log(chalk.gray(\"Tips:\"));\n console.log(chalk.gray(` • Pull entire hierarchy: lynxp pull <hierarchy_id>`));\n console.log(chalk.gray(` • View hierarchy details: lynxp hierarchy <hierarchy_id>`));\n console.log(chalk.gray(` • Sync local changes: lynxp sync`));\n console.log();\n } catch (error) {\n spinner.fail(\"Failed to fetch hierarchies\");\n handleError(error);\n }\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 access hierarchies.\"));\n }\n } else {\n console.error(chalk.red(\"An unexpected error occurred.\"));\n }\n process.exit(1);\n}\n\n\n\n"],"mappings":"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","names":["chalk","platform","config","chalk","chalk","chalk","ora","chalk","ora","chalk","ora","chalk","ora","chalk","ora","writeFile","mkdir","readFile","join","dirname","config","config","config","fileExists","chalk","ora","path","join","dirname","mkdir","writeFile","handleApiError","readFile","chalk","ora","createHash","prompts","chalk","createHash","prompts","ora","dirname","chalk","prompts","ora","writeFile","mkdir","access","readFile","join","dirname","readFile","access","join","path","platform","path","config","config","join","mkdir","writeFile","readFile","access","fs","STATIC_FILE_PATHS","chalk","platform","ora","spinner","detected","prompts","dirname","chalk","ora","ora","chalk","handleApiError","truncate","formatTags","chalk","readFile","access","join","existsSync","chalk","existsSync","join","readFile","parse","config","fileExists","access","truncate","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","ora","chalk","ora","chalk","readFile","writeFile","access","join","ora","platform","config","mkdir","chalk","readFile","writeFile","access","join","basename","ora","prompts","chalk","prompts","ora","readFile","access","readdir","join","dirname","basename","parseMarkdownSections","path","writeFile","mkdir","chalk","ora","chalk","ora","handleError","CLI_VERSION","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/wizard.ts","../src/utils/detect.ts","../src/utils/generator.ts","../src/commands/search.ts","../src/commands/status.ts","../src/commands/check.ts","../src/commands/diff.ts","../src/commands/link.ts","../src/commands/analyze.ts","../src/commands/convert.ts","../src/commands/merge.ts","../src/commands/import.ts","../src/commands/hierarchies.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 { wizardCommand } from \"./commands/wizard.js\";\nimport { searchCommand } from \"./commands/search.js\";\nimport { statusCommand } from \"./commands/status.js\";\nimport { checkCommand } from \"./commands/check.js\";\nimport { diffCommand } from \"./commands/diff.js\";\nimport { linkCommand, unlinkCommand } from \"./commands/link.js\";\nimport { analyzeCommand } from \"./commands/analyze.js\";\nimport { convertCommand } from \"./commands/convert.js\";\nimport { mergeCommand } from \"./commands/merge.js\";\nimport { importCommand } from \"./commands/import.js\";\nimport { hierarchiesCommand } from \"./commands/hierarchies.js\";\n\n// CLI version injected at build time via tsup.config.ts define option\nconst CLI_VERSION = process.env.CLI_VERSION || \"0.0.0\";\n\nconst program = new Command();\n\nprogram\n .name(\"lynxprompt\")\n .description(\"CLI for LynxPrompt - Generate AI IDE configuration files\")\n .version(CLI_VERSION);\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 // New arguments\n .option(\"-o, --output <dir>\", \"Output directory (default: current directory)\")\n .option(\"--repo-url <url>\", \"Analyze remote repository URL (GitHub/GitLab supported)\")\n .option(\"--blueprint\", \"Generate with [[VARIABLE|default]] placeholders for templates\")\n .option(\"--license <type>\", \"License type (mit, apache-2.0, gpl-3.0, etc.)\")\n .option(\"--ci-cd <platform>\", \"CI/CD platform (github_actions, gitlab_ci, jenkins, etc.)\")\n .option(\"--project-type <type>\", \"Project type (work, leisure, opensource, learning)\")\n .option(\"--detect-only\", \"Only detect project info, don't generate files\")\n .option(\"--load-draft <name>\", \"Load a saved wizard draft\")\n .option(\"--save-draft <name>\", \"Save wizard state as a draft (auto-saves at end)\")\n .option(\"--vars <values>\", \"Fill variables: VAR1=value1,VAR2=value2\")\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// Analyze - standalone project analyzer\nprogram\n .command(\"analyze\")\n .description(\"Analyze project configuration without generating files\")\n .option(\"-r, --remote <url>\", \"Analyze a remote repository (GitHub/GitLab)\")\n .option(\"-j, --json\", \"Output as JSON (for scripting)\")\n .action(analyzeCommand);\n\n// Convert - format conversion\nprogram\n .command(\"convert [source] <target>\")\n .description(\"Convert AI config between formats (e.g., AGENTS.md → cursor)\")\n .option(\"-o, --output <file>\", \"Output filename\")\n .option(\"-f, --force\", \"Overwrite existing output file\")\n .action(convertCommand);\n\n// Merge - combine multiple configs\nprogram\n .command(\"merge <files...>\")\n .description(\"Merge multiple AI configuration files into one\")\n .option(\"-o, --output <file>\", \"Output filename (default: merged.md)\")\n .option(\"-s, --strategy <type>\", \"Merge strategy: concat, sections, smart (default: smart)\")\n .option(\"-f, --force\", \"Overwrite existing output file\")\n .option(\"-i, --interactive\", \"Review and select sections to include\")\n .action(mergeCommand);\n\n// Import - scan for existing AGENTS.md files (monorepo support)\nprogram\n .command(\"import [path]\")\n .description(\"Scan and import AGENTS.md files from a repository\")\n .option(\"--dry-run\", \"Preview what would be imported without changes\")\n .option(\"--no-recursive\", \"Don't scan subdirectories\")\n .option(\"--depth <n>\", \"Max directory depth to scan\", \"10\")\n .option(\"--pattern <file>\", \"Custom config filename to look for\")\n .option(\"--link\", \"Link imported files to cloud (requires login)\")\n .option(\"-v, --verbose\", \"Show detailed section information\")\n .option(\"-j, --json\", \"Output as JSON\")\n .action(importCommand);\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 a blueprint (bp_xxx) or entire hierarchy (ha_xxx)\")\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 .option(\"-f, --force\", \"Force push (overwrite remote changes)\")\n .action(pushCommand);\n\nprogram\n .command(\"hierarchies\")\n .description(\"List your blueprint hierarchies (monorepo groupings)\")\n .option(\"-l, --limit <number>\", \"Number of results\", \"50\")\n .option(\"-j, --json\", \"Output as JSON\")\n .action(hierarchiesCommand);\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// 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 ${chalk.white(\"$ lynxp wizard --blueprint\")} ${chalk.gray(\"Generate with [[VAR|default]] placeholders\")}\n\n${chalk.cyan(\"Analysis & Tools:\")}\n ${chalk.white(\"$ lynxp analyze\")} ${chalk.gray(\"Analyze project tech stack\")}\n ${chalk.white(\"$ lynxp analyze -r <url>\")} ${chalk.gray(\"Analyze remote repository\")}\n ${chalk.white(\"$ lynxp import\")} ${chalk.gray(\"Scan repo for AGENTS.md files\")}\n ${chalk.white(\"$ lynxp import --dry-run\")} ${chalk.gray(\"Preview monorepo hierarchy\")}\n ${chalk.white(\"$ lynxp convert AGENTS.md cursor\")} ${chalk.gray(\"Convert to Cursor format\")}\n ${chalk.white(\"$ lynxp merge a.md b.md -o out.md\")} ${chalk.gray(\"Merge multiple configs\")}\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 pull ha_xyz789\")} ${chalk.gray(\"Download entire hierarchy\")}\n ${chalk.white(\"$ lynxp push\")} ${chalk.gray(\"Push local file to cloud\")}\n ${chalk.white(\"$ lynxp hierarchies\")} ${chalk.gray(\"List your hierarchies\")}\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 - simplified to Users and Teams only\n const planConfig: Record<string, { color: (s: string) => string; emoji: string; badge: string }> = {\n FREE: { color: chalk.gray, emoji: \"🆓\", badge: \"Users\" },\n TEAMS: { color: chalk.cyan, emoji: \"👥\", badge: \"Teams\" },\n };\n \n // Map legacy PRO/MAX to FREE (Users)\n const effectivePlan = plan === \"PRO\" || plan === \"MAX\" ? \"FREE\" : plan;\n const config = planConfig[effectivePlan] || planConfig.FREE;\n const W = 46; // inner width (46 to make square with 48 total)\n const b = chalk.bold;\n const pad = (s: string, len: number) => s + \" \".repeat(Math.max(0, len - s.length));\n \n console.log();\n console.log(b(\"┌\" + \"─\".repeat(W) + \"┐\"));\n console.log(b(\"│\") + \" \".repeat(W) + b(\"│\"));\n console.log(b(\"│\") + pad(` ${config.emoji} Welcome to LynxPrompt CLI!`, W) + b(\"│\"));\n console.log(b(\"│\") + \" \".repeat(W) + b(\"│\"));\n console.log(b(\"│\") + pad(` User: ${name}`, W) + b(\"│\"));\n console.log(b(\"│\") + pad(` Plan: ${config.badge}`, W) + b(\"│\"));\n console.log(b(\"│\") + \" \".repeat(W) + b(\"│\"));\n console.log(b(\"└\" + \"─\".repeat(W) + \"┘\"));\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(\"lynxp wizard\") + chalk.gray(\" - Interactive config wizard\"));\n console.log(chalk.green(\" ✓\") + \" \" + chalk.white(\"lynxp list\") + chalk.gray(\" - List your blueprints\"));\n console.log(chalk.green(\" ✓\") + \" \" + chalk.white(\"lynxp pull <id>\") + chalk.gray(\" - Download blueprints\"));\n console.log(chalk.green(\" ✓\") + \" \" + chalk.white(\"lynxp push\") + chalk.gray(\" - Upload blueprints to marketplace\"));\n console.log(chalk.green(\" ✓\") + \" \" + chalk.white(\"lynxp link\") + chalk.gray(\" - Link project to blueprint\"));\n console.log(chalk.green(\" ✓\") + \" \" + chalk.white(\"lynxp diff\") + chalk.gray(\" - Compare local vs cloud\"));\n console.log(chalk.green(\" ✓\") + \" \" + chalk.white(\"lynxp whoami\") + chalk.gray(\" - Show account info\"));\n console.log(chalk.green(\" ✓\") + \" \" + chalk.white(\"lynxp logout\") + chalk.gray(\" - Sign out of CLI\"));\n \n // Plan-specific features - Teams users get extra features\n if (effectivePlan === \"TEAMS\") {\n console.log();\n console.log(chalk.cyan(\" ⚡\") + \" \" + chalk.white(\"AI-powered editing\") + chalk.gray(\" - AI assistant for configs\"));\n console.log(chalk.cyan(\" 👥\") + \" \" + chalk.white(\"Team blueprints\") + chalk.gray(\" - Share with your team\"));\n console.log(chalk.cyan(\" 👥\") + \" \" + chalk.white(\"SSO integration\") + chalk.gray(\" - Enterprise authentication\"));\n }\n \n console.log();\n console.log(chalk.gray(\"Token stored securely. Run \") + chalk.cyan(\"lynxp --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 // Hierarchy fields for monorepo AGENTS.md support\n hierarchy_id?: string | null;\n parent_id?: string | null;\n repository_path?: string | null;\n content_checksum?: string | null;\n}\n\nexport interface Hierarchy {\n id: string;\n name: string;\n description: string | null;\n repository_root: string;\n blueprint_count?: number;\n created_at: string;\n updated_at: string;\n}\n\nexport interface HierarchyDetail extends Hierarchy {\n blueprints: Blueprint[];\n tree: BlueprintTreeNode[];\n total_blueprints: number;\n}\n\nexport interface BlueprintTreeNode extends Blueprint {\n children: BlueprintTreeNode[];\n}\n\nexport interface HierarchiesResponse {\n hierarchies: Hierarchy[];\n total: number;\n limit: number;\n offset: number;\n has_more: boolean;\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 (standard blueprint IDs)\n // - usr_xxx (legacy prefix, still supported)\n // - plain ID (needs bp_ prefix for v1 API)\n \n // Ensure bp_ prefix for v1 API (supports both bp_ and usr_ on server)\n let apiId = id;\n if (!id.startsWith(\"bp_\") && !id.startsWith(\"usr_\")) {\n apiId = `bp_${id}`;\n }\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 // Hierarchy fields for monorepo AGENTS.md support\n hierarchy_id?: string | null;\n parent_id?: string | null;\n repository_path?: string | null;\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 expected_checksum?: string; // For optimistic locking\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 // Hierarchy endpoints\n async listHierarchies(options: {\n limit?: number;\n offset?: number;\n } = {}): Promise<HierarchiesResponse> {\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\n const query = params.toString();\n return this.request<HierarchiesResponse>(\n `/api/v1/hierarchies${query ? `?${query}` : \"\"}`\n );\n }\n\n async getHierarchy(id: string): Promise<{ hierarchy: Hierarchy; blueprints: Blueprint[]; tree: BlueprintTreeNode[]; total_blueprints: number }> {\n // Ensure ha_ prefix for hierarchy IDs\n let apiId = id;\n if (!id.startsWith(\"ha_\")) {\n apiId = `ha_${id}`;\n }\n return this.request<{ hierarchy: Hierarchy; blueprints: Blueprint[]; tree: BlueprintTreeNode[]; total_blueprints: number }>(`/api/v1/hierarchies/${apiId}`);\n }\n\n async createHierarchy(data: {\n name: string;\n repository_root: string;\n description?: string;\n }): Promise<{ hierarchy: Hierarchy }> {\n return this.request<{ hierarchy: Hierarchy }>(\"/api/v1/hierarchies\", {\n method: \"POST\",\n body: JSON.stringify(data),\n });\n }\n\n async deleteHierarchy(id: string): Promise<{ success: boolean; message: string }> {\n const apiId = id.startsWith(\"ha_\") ? id : `ha_${id}`;\n return this.request<{ success: boolean; message: string }>(`/api/v1/hierarchies/${apiId}`, {\n method: \"DELETE\",\n });\n }\n\n // AI endpoints\n async aiEditBlueprint(data: {\n content?: string;\n instruction: string;\n mode: \"blueprint\" | \"wizard\";\n }): Promise<{ content: string; usage?: object }> {\n return this.request<{ content: string; usage?: object }>(\"/api/ai/edit-blueprint\", {\n method: \"POST\",\n body: JSON.stringify(data),\n });\n }\n\n // User preferences endpoints\n async saveWizardPreferences(data: {\n commands?: Record<string, string | string[]>;\n codeStyle?: {\n naming?: string;\n errorHandling?: string;\n loggingConventions?: string;\n loggingConventionsOther?: string;\n notes?: string;\n };\n boundaries?: {\n always?: string[];\n never?: string[];\n ask?: string[];\n };\n testing?: {\n levels?: string[];\n frameworks?: string[];\n coverage?: number;\n notes?: string;\n };\n }): Promise<{ saved: number }> {\n // Convert structured data to the array format expected by the API\n const preferences: Array<{ category: string; key: string; value: string; isDefault?: boolean }> = [];\n\n // Commands\n if (data.commands) {\n for (const [key, value] of Object.entries(data.commands)) {\n const strValue = Array.isArray(value) ? value.join(\", \") : value;\n if (strValue) {\n preferences.push({ category: \"commands\", key, value: strValue, isDefault: true });\n }\n }\n }\n\n // Code style\n if (data.codeStyle) {\n if (data.codeStyle.naming) {\n preferences.push({ category: \"code_style\", key: \"naming\", value: data.codeStyle.naming, isDefault: true });\n }\n if (data.codeStyle.errorHandling) {\n preferences.push({ category: \"code_style\", key: \"errorHandling\", value: data.codeStyle.errorHandling, isDefault: true });\n }\n if (data.codeStyle.loggingConventions) {\n preferences.push({ category: \"code_style\", key: \"loggingConventions\", value: data.codeStyle.loggingConventions, isDefault: true });\n }\n if (data.codeStyle.loggingConventionsOther) {\n preferences.push({ category: \"code_style\", key: \"loggingConventionsOther\", value: data.codeStyle.loggingConventionsOther, isDefault: true });\n }\n if (data.codeStyle.notes) {\n preferences.push({ category: \"code_style\", key: \"notes\", value: data.codeStyle.notes, isDefault: true });\n }\n }\n\n // Boundaries\n if (data.boundaries) {\n if (data.boundaries.always?.length) {\n preferences.push({ category: \"boundaries\", key: \"always\", value: JSON.stringify(data.boundaries.always), isDefault: true });\n }\n if (data.boundaries.never?.length) {\n preferences.push({ category: \"boundaries\", key: \"never\", value: JSON.stringify(data.boundaries.never), isDefault: true });\n }\n if (data.boundaries.ask?.length) {\n preferences.push({ category: \"boundaries\", key: \"ask\", value: JSON.stringify(data.boundaries.ask), isDefault: true });\n }\n }\n\n // Testing\n if (data.testing) {\n if (data.testing.levels?.length) {\n preferences.push({ category: \"testing\", key: \"levels\", value: JSON.stringify(data.testing.levels), isDefault: true });\n }\n if (data.testing.frameworks?.length) {\n preferences.push({ category: \"testing\", key: \"frameworks\", value: JSON.stringify(data.testing.frameworks), isDefault: true });\n }\n if (data.testing.coverage !== undefined) {\n preferences.push({ category: \"testing\", key: \"coverage\", value: String(data.testing.coverage), isDefault: true });\n }\n if (data.testing.notes) {\n preferences.push({ category: \"testing\", key: \"notes\", value: data.testing.notes, isDefault: true });\n }\n }\n\n if (preferences.length === 0) {\n return { saved: 0 };\n }\n\n return this.request<{ saved: number }>(\"/api/user/wizard-preferences\", {\n method: \"POST\",\n body: JSON.stringify(preferences),\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\n\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 error. Please check your subscription.\"));\n console.error(chalk.gray(\"Visit https://lynxprompt.com/pricing for plan details.\"));\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 TEAMS: chalk.cyan,\n };\n \n // Map legacy PRO/MAX to FREE display\n const displayPlan = plan === \"PRO\" || plan === \"MAX\" ? \"FREE\" : plan;\n const displayName = displayPlan === \"FREE\" ? \"Users\" : displayPlan;\n const colorFn = planColors[displayPlan] || chalk.white;\n return colorFn(displayName);\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(\"[Standard]\"),\n ADVANCED: chalk.cyan(\"[Advanced]\"),\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 error. Please check your subscription.\"));\n console.error(chalk.gray(\"Visit https://lynxprompt.com/pricing for plan details.\"));\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\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\n/**\n * Check if an ID is a hierarchy ID\n */\nfunction isHierarchyId(id: string): boolean {\n return id.startsWith(\"ha_\");\n}\n\nexport async function pullCommand(\n id: string,\n options: PullOptions\n): Promise<void> {\n // Check authentication - require login for API access\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 // Check if pulling a hierarchy\n if (isHierarchyId(id)) {\n await pullHierarchy(id, options);\n } else {\n await pullBlueprint(id, options);\n }\n}\n\n/**\n * Pull an entire hierarchy with all its blueprints\n */\nasync function pullHierarchy(\n id: string,\n options: PullOptions\n): Promise<void> {\n const cwd = process.cwd();\n const spinner = ora(`Fetching hierarchy ${chalk.cyan(id)}...`).start();\n\n try {\n const response = await api.getHierarchy(id);\n const { hierarchy, blueprints } = response;\n spinner.stop();\n\n console.log();\n console.log(chalk.cyan(`📁 Hierarchy: ${chalk.bold(hierarchy.name)}`));\n if (hierarchy.description) {\n console.log(chalk.gray(` ${hierarchy.description}`));\n }\n console.log(chalk.gray(` Repository: ${hierarchy.repository_root}`));\n console.log(chalk.gray(` Blueprints: ${blueprints.length}`));\n console.log();\n\n // Preview mode - show hierarchy structure without downloading\n if (options.preview) {\n console.log(chalk.yellow(\"📋 Hierarchy structure:\"));\n console.log();\n \n for (const bp of blueprints) {\n const indent = bp.parent_id ? \" ↳ \" : \" \";\n const path = bp.repository_path || TYPE_TO_FILENAME[bp.type] || \"unknown\";\n console.log(chalk.gray(`${indent}${path}`));\n console.log(chalk.gray(`${indent} └─ ${bp.name} (${bp.id})`));\n }\n \n console.log();\n console.log(chalk.gray(\"Run without --preview to download this hierarchy.\"));\n return;\n }\n\n // Confirm before downloading\n if (!options.yes && blueprints.length > 1) {\n const { proceed } = await prompts({\n type: \"confirm\",\n name: \"proceed\",\n message: `Download ${blueprints.length} blueprints to ${options.output}?`,\n initial: true,\n });\n if (!proceed) {\n console.log(chalk.gray(\"Cancelled.\"));\n return;\n }\n }\n\n console.log(chalk.cyan(\"📥 Downloading blueprints...\"));\n console.log();\n\n let downloaded = 0;\n let skipped = 0;\n\n for (const bp of blueprints) {\n // Determine output path - use repository_path if available\n const filename = bp.repository_path || TYPE_TO_FILENAME[bp.type] || \"ai-config.md\";\n const outputPath = join(options.output, filename);\n\n // Check if file exists\n if (existsSync(outputPath) && !options.yes) {\n const { overwrite } = await prompts({\n type: \"confirm\",\n name: \"overwrite\",\n message: `File exists: ${filename}. Overwrite?`,\n initial: false,\n });\n if (!overwrite) {\n console.log(chalk.gray(` ⏭ Skipped: ${filename}`));\n skipped++;\n continue;\n }\n }\n\n // Fetch full blueprint content\n const { blueprint } = await api.getBlueprint(bp.id);\n \n if (!blueprint.content) {\n console.log(chalk.yellow(` ⚠ No content: ${filename}`));\n skipped++;\n continue;\n }\n\n // Create directory if needed\n const dir = dirname(outputPath);\n if (dir !== \".\" && dir !== options.output) {\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 with hierarchy info\n if (options.track !== false) {\n const source = getSourceFromVisibility(blueprint.visibility);\n await trackBlueprint(cwd, {\n id: blueprint.id,\n name: blueprint.name,\n file: filename,\n content: blueprint.content,\n source,\n hierarchyId: id,\n hierarchyName: hierarchy.name,\n repositoryPath: bp.repository_path || undefined,\n });\n }\n\n console.log(chalk.green(` ✓ ${filename}`));\n downloaded++;\n }\n\n console.log();\n console.log(chalk.green(`✅ Downloaded ${downloaded} blueprint(s)`));\n if (skipped > 0) {\n console.log(chalk.gray(` Skipped: ${skipped}`));\n }\n console.log();\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 sync' to push local changes`));\n console.log(chalk.gray(` • Run 'lynxp pull ${id}' again to refresh all files`));\n console.log();\n } catch (error) {\n spinner.fail(\"Failed to pull hierarchy\");\n handleApiError(error);\n }\n}\n\n/**\n * Pull a single blueprint\n */\nasync function pullBlueprint(\n id: string,\n options: PullOptions\n): Promise<void> {\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 hierarchy info if present\n if (blueprint.hierarchy_id) {\n console.log(chalk.blue(` 📁 Part of hierarchy: ${blueprint.hierarchy_id}`));\n if (blueprint.repository_path) {\n console.log(chalk.gray(` Path in hierarchy: ${blueprint.repository_path}`));\n }\n }\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 - use repository_path if available for hierarchy blueprints\n const filename = blueprint.repository_path || 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 hierarchyId: blueprint.hierarchy_id || undefined,\n repositoryPath: blueprint.repository_path || undefined,\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 (blueprint.content_checksum) {\n console.log(chalk.gray(` Checksum: ${blueprint.content_checksum}`));\n }\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 or hierarchy.\")\n );\n console.error(\n chalk.gray(\n \" This might be a private resource or require a higher subscription tier.\"\n )\n );\n } else if (error.statusCode === 404) {\n console.error(chalk.red(\"✗ Blueprint or hierarchy not found.\"));\n console.error(\n chalk.gray(\n \" Make sure you have the correct ID. Use 'lynxp list' or 'lynxp hierarchies' to see your resources.\"\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 // Hierarchy info (optional)\n hierarchyId?: string; // Hierarchy ID (e.g., ha_xyz789)\n hierarchyName?: string; // Hierarchy name for display\n repositoryPath?: string; // Path within hierarchy (e.g., \"packages/core/AGENTS.md\")\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 hierarchyId?: string;\n hierarchyName?: string;\n repositoryPath?: 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 hierarchyId: blueprint.hierarchyId,\n hierarchyName: blueprint.hierarchyName,\n repositoryPath: blueprint.repositoryPath,\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\n\n\n\n\n\n","import chalk from \"chalk\";\nimport ora from \"ora\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport { createHash } from \"crypto\";\nimport prompts from \"prompts\";\nimport { api, ApiRequestError } from \"../api.js\";\nimport { isAuthenticated } from \"../config.js\";\nimport {\n findBlueprintByFile,\n trackBlueprint,\n updateChecksum,\n loadBlueprints,\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 force?: boolean;\n}\n\ninterface HierarchyInfo {\n repositoryPath: string | null;\n hierarchyId: string | null;\n parentId: string | null;\n repositoryRoot: string; // Used to create/find hierarchy\n}\n\ninterface DiscoveredFile {\n path: string; // Relative path from cwd\n absolutePath: string;\n isRoot: boolean; // Is this the root AGENTS.md?\n}\n\n/**\n * Scan for AGENTS.md files in current directory and subdirectories\n */\nfunction scanForAgentFiles(cwd: string, maxDepth: number = 5): DiscoveredFile[] {\n const results: DiscoveredFile[] = [];\n \n function scan(dir: string, depth: number) {\n if (depth > maxDepth) return;\n \n try {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n \n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n \n // Skip common non-project directories\n if (entry.isDirectory()) {\n if ([\"node_modules\", \".git\", \"dist\", \"build\", \".next\", \"__pycache__\", \"venv\", \".venv\"].includes(entry.name)) {\n continue;\n }\n scan(fullPath, depth + 1);\n } else if (entry.name === \"AGENTS.md\") {\n const relativePath = path.relative(cwd, fullPath);\n results.push({\n path: relativePath,\n absolutePath: fullPath,\n isRoot: relativePath === \"AGENTS.md\",\n });\n }\n }\n } catch {\n // Ignore directories we can't read\n }\n }\n \n scan(cwd, 0);\n \n // Sort: root first, then alphabetically by path\n results.sort((a, b) => {\n if (a.isRoot && !b.isRoot) return -1;\n if (!a.isRoot && b.isRoot) return 1;\n return a.path.localeCompare(b.path);\n });\n \n return results;\n}\n\n/**\n * Detect hierarchy info for a file being pushed\n * Creates or gets a hierarchy for the repository\n */\nasync function detectHierarchyInfo(cwd: string, file: string): Promise<HierarchyInfo> {\n const repositoryRoot = createRepositoryRoot(cwd);\n const result: HierarchyInfo = {\n repositoryPath: null,\n hierarchyId: null,\n parentId: null,\n repositoryRoot,\n };\n\n try {\n const relativePath = path.relative(cwd, path.resolve(file));\n \n // Check if file is in a subdirectory (potential monorepo child)\n if (relativePath.includes(path.sep) && !relativePath.startsWith(\"..\")) {\n result.repositoryPath = relativePath;\n \n // Check if there's an AGENTS.md at the root that was already pushed\n const rootAgentsMd = path.join(cwd, \"AGENTS.md\");\n if (fs.existsSync(rootAgentsMd) && path.resolve(file) !== rootAgentsMd) {\n const blueprints = await loadBlueprints(cwd);\n const parentBlueprint = blueprints.blueprints.find(\n b => b.file === \"AGENTS.md\"\n );\n if (parentBlueprint) {\n result.parentId = parentBlueprint.id;\n }\n }\n } else if (relativePath === \"AGENTS.md\" || relativePath === path.basename(file)) {\n // Root-level file\n result.repositoryPath = relativePath;\n }\n } catch {\n // Silently fail - hierarchy detection is optional\n }\n\n return result;\n}\n\n/**\n * Ensure a hierarchy exists for the repository and return its ID\n */\nasync function ensureHierarchy(_cwd: string, repositoryRoot: string, name: string): Promise<string | null> {\n try {\n // Try to create or get existing hierarchy\n const response = await api.createHierarchy({\n name,\n repository_root: repositoryRoot,\n });\n return response.hierarchy.id;\n } catch (error) {\n // If it fails, hierarchy feature might not be available\n console.log(chalk.gray(\" Note: Hierarchy creation skipped\"));\n return null;\n }\n}\n\n/**\n * Create a stable repository root identifier from a path\n */\nfunction createRepositoryRoot(rootPath: string): string {\n // Try to get git remote URL first\n try {\n const gitConfigPath = path.join(rootPath, \".git\", \"config\");\n if (fs.existsSync(gitConfigPath)) {\n const gitConfig = fs.readFileSync(gitConfigPath, \"utf-8\");\n const urlMatch = gitConfig.match(/url = (.+)/);\n if (urlMatch) {\n // Hash the git URL for consistent identification\n return createHash(\"sha256\").update(urlMatch[1].trim()).digest(\"hex\").substring(0, 16);\n }\n }\n } catch {\n // Fall through to path-based hashing\n }\n \n // Fall back to hashing the absolute path\n return createHash(\"sha256\").update(path.resolve(rootPath)).digest(\"hex\").substring(0, 16);\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, linked.checksum);\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 expectedChecksum?: string\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 updateData: { content: string; expected_checksum?: string } = { content };\n \n // Include expected checksum for optimistic locking (unless force)\n if (expectedChecksum && !options.force) {\n updateData.expected_checksum = expectedChecksum;\n }\n\n const result = await api.updateBlueprint(blueprintId, updateData);\n spinner.succeed(\"Blueprint updated!\");\n\n // Update local tracking with new checksum\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 if (result.blueprint.content_checksum) {\n console.log(chalk.gray(` Checksum: ${result.blueprint.content_checksum}`));\n }\n console.log(chalk.gray(` View: https://lynxprompt.com/templates/${blueprintId.replace(\"bp_\", \"\")}`));\n } catch (error) {\n spinner.fail(\"Failed to update blueprint\");\n \n // Handle optimistic locking conflict\n if (error instanceof ApiRequestError && error.statusCode === 409) {\n console.log();\n console.log(chalk.yellow(\"⚠ Conflict: The blueprint has been modified since you last pulled it.\"));\n console.log(chalk.gray(\" Someone else may have pushed changes.\"));\n console.log();\n console.log(chalk.gray(\"Options:\"));\n console.log(chalk.gray(\" 1. Run 'lynxp pull \" + blueprintId + \"' to get the latest version\"));\n console.log(chalk.gray(\" 2. Run 'lynxp push --force' to overwrite remote changes\"));\n process.exit(1);\n }\n \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 // Check if pushing AGENTS.md and scan for more AGENTS.md files\n const isAgentsMd = filename === \"AGENTS.md\";\n \n if (isAgentsMd) {\n const discoveredFiles = scanForAgentFiles(cwd);\n \n // If we found multiple AGENTS.md files, offer to create hierarchy\n if (discoveredFiles.length > 1) {\n console.log();\n console.log(chalk.cyan(`📁 Found ${discoveredFiles.length} AGENTS.md files:`));\n console.log();\n for (const f of discoveredFiles) {\n const icon = f.isRoot ? \"📄\" : \" └─\";\n console.log(chalk.gray(` ${icon} ${f.path}`));\n }\n console.log();\n \n let shouldCreateHierarchy = options.yes; // Auto-create if -y flag\n \n if (!options.yes) {\n const { createHierarchy } = await prompts({\n type: \"confirm\",\n name: \"createHierarchy\",\n message: `Create a hierarchy with all ${discoveredFiles.length} AGENTS.md files?`,\n initial: true,\n });\n shouldCreateHierarchy = createHierarchy;\n } else {\n console.log(chalk.cyan(`Auto-creating hierarchy with ${discoveredFiles.length} files...`));\n }\n \n if (shouldCreateHierarchy) {\n await pushHierarchy(cwd, discoveredFiles, options);\n return;\n }\n \n console.log(chalk.gray(\"Proceeding with single file push...\"));\n }\n }\n\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 // Detect hierarchy info for monorepo support\n const hierarchyInfo = await detectHierarchyInfo(cwd, file);\n \n // If we have hierarchy info, ensure a hierarchy exists\n let hierarchyId: string | null = null;\n if (hierarchyInfo.repositoryPath) {\n hierarchyId = await ensureHierarchy(cwd, hierarchyInfo.repositoryRoot, path.basename(cwd));\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 // Include hierarchy info if detected\n hierarchy_id: hierarchyId,\n parent_id: hierarchyInfo.parentId,\n repository_path: hierarchyInfo.repositoryPath,\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 hierarchyId: hierarchyId || undefined,\n repositoryPath: hierarchyInfo.repositoryPath || undefined,\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 (hierarchyInfo.repositoryPath) {\n console.log(chalk.gray(` Path: ${hierarchyInfo.repositoryPath}`));\n }\n if (result.blueprint.hierarchy_id) {\n console.log(chalk.gray(` Hierarchy: ${result.blueprint.hierarchy_id}`));\n }\n if (hierarchyInfo.parentId) {\n console.log(chalk.cyan(` ↳ Linked to parent blueprint: ${hierarchyInfo.parentId}`));\n }\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\n/**\n * Push multiple AGENTS.md files as a hierarchy\n */\nasync function pushHierarchy(\n cwd: string,\n files: DiscoveredFile[],\n options: PushOptions\n): Promise<void> {\n // Get hierarchy name\n let hierarchyName = options.name || path.basename(cwd);\n let visibility = options.visibility || \"PRIVATE\";\n \n if (!options.yes) {\n const responses = await prompts([\n {\n type: \"text\",\n name: \"name\",\n message: \"Hierarchy name:\",\n initial: hierarchyName,\n validate: (v) => v.length > 0 || \"Name is required\",\n },\n {\n type: \"select\",\n name: \"visibility\",\n message: \"Visibility for all blueprints:\",\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 \n if (!responses.name) {\n console.log(chalk.yellow(\"Push cancelled.\"));\n return;\n }\n \n hierarchyName = responses.name;\n visibility = responses.visibility || visibility;\n }\n \n console.log();\n console.log(chalk.cyan(`📁 Creating hierarchy \"${hierarchyName}\" with ${files.length} files...`));\n console.log();\n \n // Create repository root identifier\n const repositoryRoot = createRepositoryRoot(cwd);\n \n // Create hierarchy first\n let hierarchyId: string;\n try {\n const hierarchyResponse = await api.createHierarchy({\n name: hierarchyName,\n repository_root: repositoryRoot,\n });\n hierarchyId = hierarchyResponse.hierarchy.id;\n console.log(chalk.green(`✓ Created hierarchy: ${hierarchyId}`));\n } catch (error) {\n console.log(chalk.red(\"Failed to create hierarchy\"));\n handleError(error);\n return;\n }\n \n // Upload each file\n let rootBlueprintId: string | null = null;\n let successCount = 0;\n let failCount = 0;\n \n for (const file of files) {\n const spinner = ora(`Uploading ${file.path}...`).start();\n \n try {\n const content = fs.readFileSync(file.absolutePath, \"utf-8\");\n \n // Generate name from path\n let blueprintName: string;\n if (file.isRoot) {\n blueprintName = hierarchyName;\n } else {\n // Use folder name or derive from path\n const dirname = path.dirname(file.path);\n blueprintName = dirname.replace(/[/\\\\]/g, \" / \");\n }\n \n const result = await api.createBlueprint({\n name: blueprintName,\n description: \"\",\n content,\n visibility: visibility as \"PRIVATE\" | \"TEAM\" | \"PUBLIC\",\n tags: [],\n hierarchy_id: hierarchyId,\n parent_id: file.isRoot ? null : rootBlueprintId,\n repository_path: file.path,\n });\n \n // Track root blueprint ID for linking children\n if (file.isRoot) {\n rootBlueprintId = result.blueprint.id;\n }\n \n // Track locally\n await trackBlueprint(cwd, {\n id: result.blueprint.id,\n name: blueprintName,\n file: file.path,\n content,\n source: \"private\",\n hierarchyId,\n hierarchyName,\n repositoryPath: file.path,\n });\n \n spinner.succeed(`${file.path} → ${result.blueprint.id}`);\n successCount++;\n } catch (error) {\n spinner.fail(`${file.path} failed`);\n if (error instanceof ApiRequestError) {\n console.log(chalk.red(` Error: ${error.message}`));\n }\n failCount++;\n }\n }\n \n console.log();\n console.log(chalk.green(`✅ Hierarchy created successfully!`));\n console.log(chalk.gray(` Hierarchy: ${hierarchyId}`));\n console.log(chalk.gray(` Name: ${hierarchyName}`));\n console.log(chalk.gray(` Blueprints: ${successCount} uploaded${failCount > 0 ? `, ${failCount} failed` : \"\"}`));\n console.log();\n console.log(chalk.cyan(\"Tips:\"));\n console.log(chalk.gray(` • Run 'lynxp status' to see all tracked blueprints`));\n console.log(chalk.gray(` • Run 'lynxp pull ${hierarchyId}' to download the entire hierarchy`));\n console.log(chalk.gray(` • Run 'lynxp push' in any subfolder to update individual blueprints`));\n console.log();\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 * as readline from \"readline\";\nimport * as os from \"os\";\nimport { writeFile, mkdir, access, readFile } from \"fs/promises\";\nimport { join, dirname } from \"path\";\nimport { detectProject, detectFromRemoteUrl, isGitUrl } from \"../utils/detect.js\";\nimport { generateConfig, GenerateOptions, parseVariablesString } from \"../utils/generator.js\";\nimport { isAuthenticated, getUser } from \"../config.js\";\nimport { api, ApiRequestError } from \"../api.js\";\n\n// Draft management - local storage in .lynxprompt/drafts/\nconst DRAFTS_DIR = \".lynxprompt/drafts\";\n\n// CLI version injected at build time via tsup.config.ts\n// Falls back to \"unknown\" if not defined (shouldn't happen in production builds)\nconst CLI_VERSION: string = process.env.CLI_VERSION || \"unknown\";\n\ninterface WizardDraft {\n name: string;\n savedAt: string;\n config: Record<string, unknown>;\n stepReached?: number;\n // Version tracking - added to detect draft/tool version mismatches\n source: \"cli\" | \"web\";\n version: string;\n}\n\nasync function saveDraftLocally(name: string, config: Record<string, unknown>, stepReached?: number): Promise<void> {\n const draftsPath = join(process.cwd(), DRAFTS_DIR);\n await mkdir(draftsPath, { recursive: true });\n \n const draft: WizardDraft = {\n name,\n savedAt: new Date().toISOString(),\n config,\n stepReached,\n source: \"cli\",\n version: CLI_VERSION,\n };\n \n const filename = `${name.replace(/[^a-zA-Z0-9-_]/g, \"_\")}.json`;\n await writeFile(join(draftsPath, filename), JSON.stringify(draft, null, 2), \"utf-8\");\n}\n\nasync function loadDraftLocally(name: string): Promise<WizardDraft | null> {\n try {\n const filename = `${name.replace(/[^a-zA-Z0-9-_]/g, \"_\")}.json`;\n const filepath = join(process.cwd(), DRAFTS_DIR, filename);\n const content = await readFile(filepath, \"utf-8\");\n return JSON.parse(content);\n } catch {\n return null;\n }\n}\n\nasync function listLocalDrafts(): Promise<string[]> {\n try {\n const draftsPath = join(process.cwd(), DRAFTS_DIR);\n await access(draftsPath);\n const files = await import(\"fs/promises\").then(fs => fs.readdir(draftsPath));\n return files\n .filter(f => f.endsWith(\".json\"))\n .map(f => f.replace(\".json\", \"\"));\n } catch {\n return [];\n }\n}\n\n// File paths for static files detection\nconst STATIC_FILE_PATHS: Record<string, string> = {\n editorconfig: \".editorconfig\",\n contributing: \"CONTRIBUTING.md\",\n codeOfConduct: \"CODE_OF_CONDUCT.md\",\n security: \"SECURITY.md\",\n roadmap: \"ROADMAP.md\",\n gitignore: \".gitignore\",\n funding: \".github/FUNDING.yml\",\n license: \"LICENSE\",\n readme: \"README.md\",\n architecture: \"ARCHITECTURE.md\",\n changelog: \"CHANGELOG.md\",\n};\n\n// Check if a file exists and read its content\nasync function readExistingFile(filePath: string): Promise<string | null> {\n try {\n await access(filePath);\n const content = await readFile(filePath, \"utf-8\");\n return content;\n } catch {\n return null;\n }\n}\n\n// Multi-line input reader using EOF terminator\nasync function readMultilineInput(prompt: string): Promise<string> {\n console.log(chalk.white(prompt));\n console.log(chalk.gray(\" (Paste your content, then type EOF on a new line and press Enter to finish)\"));\n console.log(chalk.gray(\" (Press Enter twice to skip)\"));\n console.log();\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n const lines: string[] = [];\n let emptyLineCount = 0;\n\n rl.on(\"line\", (line) => {\n if (line.trim() === \"EOF\") {\n rl.close();\n resolve(lines.join(\"\\n\"));\n return;\n }\n \n if (line === \"\") {\n emptyLineCount++;\n if (emptyLineCount >= 2 && lines.length === 0) {\n // Two empty lines at start = skip\n rl.close();\n resolve(\"\");\n return;\n }\n } else {\n emptyLineCount = 0;\n }\n \n lines.push(line);\n });\n\n rl.on(\"close\", () => {\n resolve(lines.join(\"\\n\"));\n });\n });\n}\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 // New options\n output?: string;\n repoUrl?: string;\n blueprint?: boolean;\n license?: string;\n ciCd?: string;\n projectType?: string;\n detectOnly?: boolean;\n loadDraft?: string;\n saveDraft?: string;\n vars?: string;\n // Internal: for resuming from a draft\n _resumeFromStep?: number;\n _draftAnswers?: Record<string, unknown>;\n}\n\n// User tier levels - simplified to just Users and Teams\ntype UserTier = \"users\" | \"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: \"security\", title: \"Security\", icon: \"🔐\", tier: \"basic\" }, // NEW: Security step (FREE)\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/**\n * All supported platforms (30+ and growing!)\n * \n * IMPORTANT: Keep in sync with src/lib/platforms.ts (the single source of truth)\n * When adding new platforms, update both files!\n */\nconst ALL_PLATFORMS = [\n // Popular platforms\n { id: \"universal\", name: \"Universal (AGENTS.md)\", file: \"AGENTS.md\", icon: \"🌐\", note: \"Works with Claude Code, Copilot, Aider, and many others\" },\n { id: \"cursor\", name: \"Cursor\", file: \".cursor/rules/\", icon: \"⚡\", note: \"AI-powered code editor with native rules\" },\n { id: \"claude\", name: \"Claude Code\", file: \"CLAUDE.md\", icon: \"🧠\", note: \"Anthropic's agentic coding tool\" },\n { id: \"copilot\", name: \"GitHub Copilot\", file: \".github/copilot-instructions.md\", icon: \"🐙\", note: \"GitHub's AI pair programmer\" },\n { id: \"windsurf\", name: \"Windsurf\", file: \".windsurfrules\", icon: \"🏄\", note: \"Codeium's AI-native IDE\" },\n // AI IDEs\n { id: \"antigravity\", name: \"Antigravity\", file: \"GEMINI.md\", icon: \"💎\", note: \"Google's Gemini-powered IDE\" },\n { id: \"zed\", name: \"Zed\", file: \".zed/instructions.md\", icon: \"⚡\", note: \"High-performance editor with AI\" },\n { id: \"void\", name: \"Void\", file: \".void/config.json\", icon: \"🕳️\", note: \"Open-source Cursor alternative\" },\n { id: \"trae\", name: \"Trae AI\", file: \".trae/rules/\", icon: \"🔷\", note: \"ByteDance's AI IDE\" },\n { id: \"firebase\", name: \"Firebase Studio\", file: \".idx/\", icon: \"🔥\", note: \"Google's cloud IDE\" },\n // Editor extensions\n { id: \"cline\", name: \"Cline\", file: \".clinerules\", icon: \"🔧\", note: \"Autonomous coding agent for VS Code\" },\n { id: \"roocode\", name: \"Roo Code\", file: \".roo/rules/\", icon: \"🦘\", note: \"AI coding assistant for VS Code\" },\n { id: \"continue\", name: \"Continue\", file: \".continue/config.json\", icon: \"➡️\", note: \"Open-source AI autopilot\" },\n { id: \"cody\", name: \"Sourcegraph Cody\", file: \".cody/config.json\", icon: \"🔍\", note: \"Context-aware 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 code completions\" },\n { id: \"codegpt\", name: \"CodeGPT\", file: \".codegpt/config.json\", icon: \"💬\", note: \"VS Code AI assistant\" },\n { id: \"amazonq\", name: \"Amazon Q\", file: \".amazonq/rules/\", icon: \"📦\", note: \"AWS AI coding companion\" },\n { id: \"augment\", name: \"Augment Code\", file: \".augment/rules/\", icon: \"🔮\", note: \"AI code augmentation\" },\n { id: \"kilocode\", name: \"Kilo Code\", file: \".kilocode/rules/\", icon: \"📊\", note: \"AI code generation\" },\n { id: \"junie\", name: \"Junie\", file: \".junie/guidelines.md\", icon: \"🎯\", note: \"JetBrains AI assistant\" },\n { id: \"kiro\", name: \"Kiro\", file: \".kiro/steering/\", icon: \"🚀\", note: \"AWS spec-driven agent\" },\n // CLI tools\n { id: \"aider\", name: \"Aider\", file: \"AIDER.md\", icon: \"🤖\", note: \"AI pair programming in terminal\" },\n { id: \"goose\", name: \"Goose\", file: \".goosehints\", icon: \"🪿\", note: \"Block's AI coding agent\" },\n { id: \"warp\", name: \"Warp AI\", file: \"WARP.md\", icon: \"🚀\", note: \"AI-powered terminal\" },\n { id: \"gemini-cli\", name: \"Gemini CLI\", file: \"GEMINI.md\", icon: \"💎\", note: \"Google's Gemini in terminal\" },\n { id: \"opencode\", name: \"Open Code\", file: \"opencode.json\", icon: \"🔓\", note: \"Open-source AI coding\" },\n // Other\n { id: \"openhands\", name: \"OpenHands\", file: \".openhands/microagents/repo.md\", icon: \"🤲\", note: \"Open-source AI agent\" },\n { id: \"crush\", name: \"Crush\", file: \"CRUSH.md\", icon: \"💥\", note: \"AI coding assistant\" },\n { id: \"firebender\", name: \"Firebender\", file: \"firebender.json\", icon: \"🔥\", note: \"AI code transformation\" },\n];\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// Package managers (JS/TS only)\nconst PACKAGE_MANAGERS = [\n { title: \"📦 npm\", value: \"npm\", desc: \"Node Package Manager (default)\" },\n { title: \"🧶 Yarn\", value: \"yarn\", desc: \"Fast, reliable, and secure\" },\n { title: \"📀 pnpm\", value: \"pnpm\", desc: \"Fast, disk space efficient\" },\n { title: \"🥟 Bun\", value: \"bun\", desc: \"All-in-one JS runtime + PM\" },\n];\n\n// JS/TS Runtimes\nconst JS_RUNTIMES = [\n { title: \"🟢 Node.js\", value: \"node\", desc: \"Standard JavaScript runtime\" },\n { title: \"🦕 Deno\", value: \"deno\", desc: \"Secure runtime with TypeScript\" },\n { title: \"🥟 Bun\", value: \"bun\", desc: \"Fast all-in-one JS runtime\" },\n];\n\n// Monorepo tools\nconst MONOREPO_TOOLS = [\n { title: \"📁 None\", value: \"\", desc: \"Single package repository\" },\n { title: \"⚡ Turborepo\", value: \"turborepo\", desc: \"High-performance build system\" },\n { title: \"🔷 Nx\", value: \"nx\", desc: \"Smart, extensible build framework\" },\n { title: \"🐉 Lerna\", value: \"lerna\", desc: \"Multi-package repositories\" },\n { title: \"📀 pnpm Workspaces\", value: \"pnpm_workspaces\", desc: \"Native pnpm monorepo\" },\n { title: \"🧶 Yarn Workspaces\", value: \"yarn_workspaces\", desc: \"Native Yarn monorepo\" },\n { title: \"📦 npm Workspaces\", value: \"npm_workspaces\", desc: \"Native npm monorepo\" },\n];\n\n// ORMs by language\nconst ORM_OPTIONS = [\n { title: \"📝 None / Raw SQL\", value: \"\", langs: [] },\n // JavaScript/TypeScript\n { title: \"🔷 Prisma\", value: \"prisma\", langs: [\"javascript\", \"typescript\"] },\n { title: \"💧 Drizzle\", value: \"drizzle\", langs: [\"javascript\", \"typescript\"] },\n { title: \"🔶 TypeORM\", value: \"typeorm\", langs: [\"javascript\", \"typescript\"] },\n { title: \"📘 Sequelize\", value: \"sequelize\", langs: [\"javascript\", \"typescript\"] },\n { title: \"🔧 Knex.js\", value: \"knex\", langs: [\"javascript\", \"typescript\"] },\n { title: \"🎯 Kysely\", value: \"kysely\", langs: [\"javascript\", \"typescript\"] },\n // Python\n { title: \"🐍 SQLAlchemy\", value: \"sqlalchemy\", langs: [\"python\"] },\n { title: \"🎸 Django ORM\", value: \"django_orm\", langs: [\"python\"] },\n { title: \"🐢 Tortoise ORM\", value: \"tortoise\", langs: [\"python\"] },\n { title: \"⚡ SQLModel\", value: \"sqlmodel\", langs: [\"python\"] },\n // Go\n { title: \"🐹 GORM\", value: \"gorm\", langs: [\"go\"] },\n { title: \"🏗️ Ent\", value: \"ent\", langs: [\"go\"] },\n { title: \"📝 sqlc\", value: \"sqlc\", langs: [\"go\"] },\n // Rust\n { title: \"🦀 Diesel\", value: \"diesel\", langs: [\"rust\"] },\n { title: \"🌊 SeaORM\", value: \"sea-orm\", langs: [\"rust\"] },\n { title: \"📦 SQLx\", value: \"sqlx\", langs: [\"rust\"] },\n // Java/Kotlin\n { title: \"☕ Hibernate\", value: \"hibernate\", langs: [\"java\", \"kotlin\"] },\n { title: \"🎵 jOOQ\", value: \"jooq\", langs: [\"java\", \"kotlin\"] },\n // .NET\n { title: \"🔷 Entity Framework\", value: \"ef_core\", langs: [\"csharp\"] },\n { title: \"⚡ Dapper\", value: \"dapper\", langs: [\"csharp\"] },\n // Ruby\n { title: \"💎 ActiveRecord\", value: \"activerecord\", langs: [\"ruby\"] },\n // PHP\n { title: \"🐘 Eloquent\", value: \"eloquent\", langs: [\"php\"] },\n { title: \"📖 Doctrine\", value: \"doctrine\", langs: [\"php\"] },\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// CI/CD platforms\nconst CICD_OPTIONS = [\n { id: \"github_actions\", label: \"GitHub Actions\", icon: \"🐙\" },\n { id: \"gitlab_ci\", label: \"GitLab CI\", icon: \"🦊\" },\n { id: \"jenkins\", label: \"Jenkins\", icon: \"🔧\" },\n { id: \"circleci\", label: \"CircleCI\", icon: \"⚫\" },\n { id: \"travis\", label: \"Travis CI\", icon: \"🔨\" },\n { id: \"azure_devops\", label: \"Azure DevOps\", icon: \"☁️\" },\n { id: \"bitbucket\", label: \"Bitbucket Pipelines\", icon: \"🪣\" },\n { id: \"teamcity\", label: \"TeamCity\", icon: \"🏢\" },\n { id: \"drone\", label: \"Drone\", icon: \"🚁\" },\n { id: \"buildkite\", label: \"Buildkite\", icon: \"🧱\" },\n];\n\n// Cloud deployment targets\nconst CLOUD_TARGETS = [\n { id: \"vercel\", label: \"Vercel\", icon: \"▲ \" },\n { id: \"netlify\", label: \"Netlify\", icon: \"🌐\" },\n { id: \"cloudflare_pages\", label: \"Cloudflare Pages\", icon: \"🔶\" },\n { id: \"cloudflare_workers\", label: \"Cloudflare Workers\", icon: \"🔶\" },\n { id: \"aws_lambda\", label: \"AWS Lambda\", icon: \"☁️ \" },\n { id: \"aws_ecs\", label: \"AWS ECS\", icon: \"☁️ \" },\n { id: \"aws_ec2\", label: \"AWS EC2\", icon: \"☁️ \" },\n { id: \"gcp_cloudrun\", label: \"GCP Cloud Run\", icon: \"🌈\" },\n { id: \"gcp_appengine\", label: \"GCP App Engine\", icon: \"🌈\" },\n { id: \"azure_appservice\", label: \"Azure App Service\", icon: \"🔷\" },\n { id: \"azure_functions\", label: \"Azure Functions\", icon: \"🔷\" },\n { id: \"railway\", label: \"Railway\", icon: \"🚂\" },\n { id: \"render\", label: \"Render\", icon: \"🎨\" },\n { id: \"fly\", label: \"Fly.io\", icon: \"✈️ \" },\n { id: \"heroku\", label: \"Heroku\", icon: \"🟣\" },\n { id: \"digitalocean_app\", label: \"DigitalOcean App Platform\", icon: \"🔵\" },\n { id: \"deno_deploy\", label: \"Deno Deploy\", icon: \"🦕\" },\n];\n\n// Self-hosted deployment targets\nconst SELF_HOSTED_TARGETS = [\n { id: \"docker\", label: \"Docker\", icon: \"🐳\" },\n { id: \"docker_compose\", label: \"Docker Compose\", icon: \"🐳\" },\n { id: \"kubernetes\", label: \"Kubernetes\", icon: \"☸️ \" },\n { id: \"k3s\", label: \"K3s\", icon: \"☸️ \" },\n { id: \"podman\", label: \"Podman\", icon: \"🦭\" },\n { id: \"bare_metal\", label: \"Bare Metal\", icon: \"🖥️ \" },\n { id: \"vm\", label: \"Virtual Machine\", icon: \"💻\" },\n { id: \"proxmox\", label: \"Proxmox\", icon: \"🔷\" },\n { id: \"unraid\", label: \"Unraid\", icon: \"🟠\" },\n { id: \"truenas\", label: \"TrueNAS\", icon: \"🔵\" },\n { id: \"synology\", label: \"Synology NAS\", icon: \"📁\" },\n { id: \"coolify\", label: \"Coolify\", icon: \"❄️ \" },\n { id: \"dokku\", label: \"Dokku\", icon: \"🐳\" },\n { id: \"caprover\", label: \"CapRover\", icon: \"🚢\" },\n { id: \"portainer\", label: \"Portainer\", icon: \"🐋\" },\n { id: \"rancher\", label: \"Rancher\", icon: \"🐄\" },\n];\n\n// Container registries\nconst CONTAINER_REGISTRIES = [\n { id: \"dockerhub\", label: \"Docker Hub\", icon: \"🐳\" },\n { id: \"ghcr\", label: \"GitHub Container Registry\", icon: \"🐙\" },\n { id: \"gcr\", label: \"Google Container Registry\", icon: \"🌈\" },\n { id: \"ecr\", label: \"AWS ECR\", icon: \"☁️\" },\n { id: \"acr\", label: \"Azure Container Registry\", icon: \"🔷\" },\n { id: \"quay\", label: \"Quay.io\", icon: \"🔴\" },\n { id: \"gitlab\", label: \"GitLab Registry\", icon: \"🦊\" },\n { id: \"custom\", label: \"Custom/Self-hosted\", icon: \"🏠\" },\n];\n\n// Common commands by category - expanded to match WebUI\nconst COMMON_COMMANDS = {\n build: [\n // JavaScript/Node\n \"npm run build\", \"pnpm build\", \"yarn build\", \"bun run build\",\n \"next build\", \"vite build\", \"tsc\", \"tsc --noEmit\",\n \"esbuild\", \"rollup -c\", \"webpack\", \"parcel build\",\n // Python\n \"python setup.py build\", \"pip install -e .\", \"poetry build\", \"pdm build\", \"hatch build\",\n // Go\n \"go build\", \"go build ./...\", \"go install\",\n // Rust\n \"cargo build\", \"cargo build --release\",\n // Java/JVM\n \"mvn package\", \"mvn clean install\", \"gradle build\",\n // .NET\n \"dotnet build\", \"dotnet publish\",\n // Ruby\n \"bundle exec rake build\", \"gem build\",\n // PHP\n \"composer install\", \"composer dump-autoload\",\n // Docker\n \"docker build -t app .\", \"docker compose build\",\n // Make\n \"make\", \"make build\", \"make all\",\n ],\n test: [\n // JavaScript/Node\n \"npm test\", \"pnpm test\", \"yarn test\", \"bun test\",\n \"vitest\", \"vitest run\", \"jest\", \"jest --coverage\",\n \"mocha\", \"ava\", \"tap\",\n // E2E\n \"playwright test\", \"cypress run\", \"cypress open\",\n \"puppeteer\", \"selenium\",\n // Python\n \"pytest\", \"pytest --cov\", \"pytest -xvs\",\n \"unittest\", \"nose2\", \"hypothesis\",\n // Go\n \"go test ./...\", \"go test -v ./...\", \"go test -race ./...\",\n // Rust\n \"cargo test\", \"cargo test --release\",\n // Java/JVM\n \"mvn test\", \"gradle test\", \"mvn verify\",\n // .NET\n \"dotnet test\",\n // Ruby\n \"bundle exec rspec\", \"rake test\",\n // PHP\n \"phpunit\", \"pest\",\n // Docker\n \"docker compose run test\",\n ],\n lint: [\n // JavaScript/Node\n \"npm run lint\", \"pnpm lint\", \"eslint .\", \"eslint . --fix\",\n \"prettier --check .\", \"prettier --write .\",\n \"biome check\", \"biome check --apply\",\n // Python\n \"ruff check\", \"ruff check --fix\", \"ruff format\",\n \"black .\", \"black --check .\",\n \"flake8\", \"pylint\", \"mypy .\",\n // Go\n \"golangci-lint run\", \"go fmt ./...\", \"go vet ./...\",\n // Rust\n \"cargo clippy\", \"cargo fmt\", \"cargo fmt --check\",\n // Java\n \"mvn checkstyle:check\", \"gradle spotlessCheck\",\n // Ruby\n \"rubocop\", \"rubocop -a\",\n // PHP\n \"php-cs-fixer fix\", \"phpcs\", \"phpstan analyse\",\n // General\n \"pre-commit run --all-files\",\n ],\n dev: [\n // JavaScript/Node\n \"npm run dev\", \"pnpm dev\", \"yarn dev\", \"bun run dev\",\n \"next dev\", \"vite\", \"vite dev\",\n \"nodemon\", \"ts-node-dev\",\n // Python\n \"uvicorn main:app --reload\", \"flask run\", \"python manage.py runserver\",\n \"gunicorn --reload\", \"hypercorn --reload\",\n // Go\n \"go run .\", \"air\", \"reflex\",\n // Rust\n \"cargo run\", \"cargo watch -x run\",\n // Java\n \"mvn spring-boot:run\", \"gradle bootRun\",\n // .NET\n \"dotnet run\", \"dotnet watch run\",\n // Ruby\n \"rails server\", \"bundle exec rails s\",\n // PHP\n \"php artisan serve\", \"symfony server:start\",\n // Docker\n \"docker compose up\", \"docker compose up -d\",\n ],\n format: [\n // JavaScript/Node\n \"prettier --write .\", \"npm run format\", \"pnpm format\",\n \"biome format --write .\", \"dprint fmt\",\n // Python\n \"black .\", \"ruff format .\", \"isort .\", \"autopep8 --in-place -r .\",\n // Go\n \"go fmt ./...\", \"gofmt -w .\", \"goimports -w .\",\n // Rust\n \"cargo fmt\",\n // Other\n \"shfmt -w .\", \"terraform fmt -recursive\",\n ],\n typecheck: [\n // TypeScript\n \"tsc --noEmit\", \"npm run typecheck\", \"pnpm typecheck\",\n \"vue-tsc --noEmit\", \"tsc -b\",\n // Python\n \"mypy .\", \"pyright\", \"pyre check\",\n // Go\n \"go vet ./...\", \"staticcheck ./...\",\n // Rust\n \"cargo check\",\n ],\n clean: [\n // JavaScript/Node\n \"npm run clean\", \"rm -rf node_modules\", \"rm -rf dist\",\n \"rm -rf .next\", \"rm -rf build\", \"rm -rf coverage\",\n // Python\n \"rm -rf __pycache__\", \"find . -name '*.pyc' -delete\",\n // Go\n \"go clean -cache\", \"go clean -testcache\",\n // Rust\n \"cargo clean\",\n // Docker\n \"docker system prune -af\", \"docker compose down -v\",\n // Make\n \"make clean\",\n ],\n preCommit: [\n // JavaScript\n \"npx husky install\", \"pnpm dlx husky install\", \"lefthook install\",\n \"lint-staged\", \"npx lint-staged\", \"simple-git-hooks\",\n // Python\n \"pre-commit install\", \"pre-commit run --all-files\",\n ],\n additional: [\n // Database\n \"npm run db:push\", \"npm run db:migrate\", \"prisma migrate dev\",\n \"alembic upgrade head\", \"flask db upgrade\",\n \"rails db:migrate\", \"rake db:migrate\",\n // Codegen\n \"npm run codegen\", \"graphql-codegen\", \"prisma generate\",\n // Docs\n \"npm run docs\", \"mkdocs serve\", \"sphinx-build\",\n // Deploy\n \"npm run deploy\", \"vercel\", \"netlify deploy\",\n \"flyctl deploy\", \"railway up\",\n ],\n};\n\n// Naming conventions - \"Follow language conventions\" is the recommended default\nconst NAMING_CONVENTIONS = [\n { id: \"language_default\", label: \"Follow language conventions\", desc: \"Use idiomatic style (recommended)\" },\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// Logging conventions - matching WebUI\nconst LOGGING_OPTIONS = [\n { id: \"structured_json\", label: \"Structured JSON\" },\n { id: \"console_log\", label: \"Console.log (dev)\" },\n { id: \"log_levels\", label: \"Log Levels (debug/info/warn/error)\" },\n { id: \"pino\", label: \"Pino\" },\n { id: \"winston\", label: \"Winston\" },\n { id: \"bunyan\", label: \"Bunyan\" },\n { id: \"python_logging\", label: \"Python logging\" },\n { id: \"log4j\", label: \"Log4j / SLF4J\" },\n { id: \"serilog\", label: \"Serilog\" },\n { id: \"opentelemetry\", label: \"OpenTelemetry\" },\n { id: \"other\", label: \"Other\" },\n];\n\n// AI Behavior rules - matching WebUI (security moved to dedicated Security step)\nconst AI_BEHAVIOR_RULES = [\n { id: \"always_debug_after_build\", label: \"Always Debug After Building\", description: \"AI should build and run code locally to verify changes work before suggesting them as complete\", recommended: true },\n { id: \"check_logs_after_build\", label: \"Check Logs After Build/Commit\", description: \"AI should review build output, test logs, and error messages to catch issues early\", recommended: true },\n { id: \"run_tests_before_commit\", label: \"Run Tests Before Commit\", description: \"AI must run the test suite and ensure all tests pass before suggesting a commit\", recommended: true },\n { id: \"follow_existing_patterns\", label: \"Follow Existing Patterns\", description: \"AI should study existing code and follow the same naming, structure, and conventions used in the codebase\", recommended: true },\n { id: \"ask_before_large_refactors\", label: \"Ask Before Large Refactors\", description: \"AI should always ask for explicit approval before making significant architectural changes or refactoring multiple files\", recommended: true },\n];\n\n// ═══════════════════════════════════════════════════════════════\n// SECURITY OPTIONS (FREE tier - new dedicated section)\n// ═══════════════════════════════════════════════════════════════\n\n// Secrets management strategies\nconst SECRETS_MANAGEMENT_OPTIONS = [\n { id: \"env_vars\", label: \"Environment Variables\", description: \"Use .env files locally, env vars in prod\", recommended: true },\n { id: \"dotenv\", label: \"dotenv / dotenvx\", description: \"Load .env files with dotenv library\" },\n { id: \"vault\", label: \"HashiCorp Vault\", description: \"Enterprise secrets management\" },\n { id: \"aws_secrets\", label: \"AWS Secrets Manager\", description: \"AWS native secrets storage\" },\n { id: \"aws_ssm\", label: \"AWS SSM Parameter Store\", description: \"AWS Systems Manager parameters\" },\n { id: \"gcp_secrets\", label: \"GCP Secret Manager\", description: \"Google Cloud secrets storage\" },\n { id: \"azure_keyvault\", label: \"Azure Key Vault\", description: \"Azure secrets and keys\" },\n { id: \"infisical\", label: \"Infisical\", description: \"Open-source secrets management\" },\n { id: \"doppler\", label: \"Doppler\", description: \"Universal secrets platform\" },\n { id: \"1password\", label: \"1Password Secrets Automation\", description: \"1Password for teams/CI\" },\n { id: \"bitwarden\", label: \"Bitwarden Secrets Manager\", description: \"Bitwarden for secrets\" },\n { id: \"sops\", label: \"SOPS (Mozilla)\", description: \"Encrypted files with KMS\" },\n { id: \"age\", label: \"age encryption\", description: \"Simple file encryption\" },\n { id: \"sealed_secrets\", label: \"Sealed Secrets (K8s)\", description: \"Kubernetes encrypted secrets\" },\n { id: \"external_secrets\", label: \"External Secrets Operator\", description: \"K8s external secrets sync\" },\n { id: \"git_crypt\", label: \"git-crypt\", description: \"Transparent file encryption in git\" },\n { id: \"chamber\", label: \"Chamber\", description: \"AWS SSM-based secrets tool\" },\n { id: \"berglas\", label: \"Berglas\", description: \"GCP secrets CLI tool\" },\n { id: \"other\", label: \"Other\", description: \"Custom secrets management\" },\n];\n\n// Security tooling (scanning, dependency updates, etc.)\nconst SECURITY_TOOLING_OPTIONS = [\n { id: \"dependabot\", label: \"Dependabot\", description: \"GitHub dependency updates\", recommended: true },\n { id: \"renovate\", label: \"Renovate\", description: \"Multi-platform dependency updates\", recommended: true },\n { id: \"snyk\", label: \"Snyk\", description: \"Vulnerability scanning & fixing\" },\n { id: \"sonarqube\", label: \"SonarQube / SonarCloud\", description: \"Code quality & security\" },\n { id: \"codeql\", label: \"CodeQL\", description: \"GitHub semantic code analysis\" },\n { id: \"semgrep\", label: \"Semgrep\", description: \"Static analysis with custom rules\" },\n { id: \"trivy\", label: \"Trivy\", description: \"Container & IaC vulnerability scanner\" },\n { id: \"grype\", label: \"Grype\", description: \"Container image vulnerability scanner\" },\n { id: \"checkov\", label: \"Checkov\", description: \"IaC security scanning\" },\n { id: \"tfsec\", label: \"tfsec\", description: \"Terraform security scanner\" },\n { id: \"kics\", label: \"KICS\", description: \"IaC security scanning\" },\n { id: \"gitleaks\", label: \"Gitleaks\", description: \"Secret detection in git repos\" },\n { id: \"trufflehog\", label: \"TruffleHog\", description: \"Secret scanning in code\" },\n { id: \"detect_secrets\", label: \"detect-secrets (Yelp)\", description: \"Pre-commit secret detection\" },\n { id: \"bandit\", label: \"Bandit\", description: \"Python security linter\" },\n { id: \"brakeman\", label: \"Brakeman\", description: \"Ruby on Rails security scanner\" },\n { id: \"gosec\", label: \"gosec\", description: \"Go security checker\" },\n { id: \"npm_audit\", label: \"npm audit / yarn audit\", description: \"Node.js vulnerability check\" },\n { id: \"pip_audit\", label: \"pip-audit\", description: \"Python dependency audit\" },\n { id: \"safety\", label: \"Safety\", description: \"Python dependency checker\" },\n { id: \"bundler_audit\", label: \"bundler-audit\", description: \"Ruby gem vulnerability checker\" },\n { id: \"owasp_dependency_check\", label: \"OWASP Dependency-Check\", description: \"Known vulnerability detection\" },\n { id: \"ossf_scorecard\", label: \"OSSF Scorecard\", description: \"Open source security metrics\" },\n { id: \"socket\", label: \"Socket.dev\", description: \"Supply chain security\" },\n { id: \"mend\", label: \"Mend (WhiteSource)\", description: \"Open source security platform\" },\n { id: \"fossa\", label: \"FOSSA\", description: \"License & security compliance\" },\n { id: \"other\", label: \"Other\", description: \"Custom security tooling\" },\n];\n\n// Authentication patterns\nconst AUTH_PATTERNS_OPTIONS = [\n { id: \"oauth2\", label: \"OAuth 2.0\", description: \"Standard authorization framework\", recommended: true },\n { id: \"oidc\", label: \"OpenID Connect (OIDC)\", description: \"Identity layer on OAuth 2.0\", recommended: true },\n { id: \"jwt\", label: \"JWT (JSON Web Tokens)\", description: \"Stateless token authentication\" },\n { id: \"session\", label: \"Session-based Auth\", description: \"Server-side session management\" },\n { id: \"api_keys\", label: \"API Keys\", description: \"Simple API authentication\" },\n { id: \"basic_auth\", label: \"Basic Authentication\", description: \"Username/password (HTTPS only)\" },\n { id: \"bearer_token\", label: \"Bearer Tokens\", description: \"Token-based API auth\" },\n { id: \"mfa_totp\", label: \"MFA / TOTP\", description: \"Multi-factor with time-based OTP\" },\n { id: \"passkeys\", label: \"Passkeys / WebAuthn\", description: \"Passwordless authentication\" },\n { id: \"saml\", label: \"SAML 2.0\", description: \"Enterprise SSO protocol\" },\n { id: \"ldap\", label: \"LDAP / Active Directory\", description: \"Directory-based auth\" },\n { id: \"mutual_tls\", label: \"Mutual TLS (mTLS)\", description: \"Certificate-based auth\" },\n { id: \"auth0\", label: \"Auth0\", description: \"Identity platform\" },\n { id: \"clerk\", label: \"Clerk\", description: \"User management platform\" },\n { id: \"firebase_auth\", label: \"Firebase Auth\", description: \"Google auth service\" },\n { id: \"supabase_auth\", label: \"Supabase Auth\", description: \"Supabase auth service\" },\n { id: \"keycloak\", label: \"Keycloak\", description: \"Open source IAM\" },\n { id: \"okta\", label: \"Okta\", description: \"Enterprise identity\" },\n { id: \"cognito\", label: \"AWS Cognito\", description: \"AWS user pools\" },\n { id: \"workos\", label: \"WorkOS\", description: \"Enterprise SSO\" },\n { id: \"other\", label: \"Other\", description: \"Custom auth pattern\" },\n];\n\n// Data handling policies\nconst DATA_HANDLING_OPTIONS = [\n { id: \"encryption_at_rest\", label: \"Encryption at Rest\", description: \"Encrypt stored data\", recommended: true },\n { id: \"encryption_in_transit\", label: \"Encryption in Transit (TLS)\", description: \"HTTPS/TLS for all connections\", recommended: true },\n { id: \"pii_handling\", label: \"PII Data Handling\", description: \"Special handling for personal data\" },\n { id: \"gdpr_compliance\", label: \"GDPR Compliance\", description: \"EU data protection rules\" },\n { id: \"ccpa_compliance\", label: \"CCPA Compliance\", description: \"California privacy law\" },\n { id: \"hipaa_compliance\", label: \"HIPAA Compliance\", description: \"Healthcare data protection\" },\n { id: \"soc2_compliance\", label: \"SOC 2 Compliance\", description: \"Service organization controls\" },\n { id: \"pci_dss\", label: \"PCI-DSS Compliance\", description: \"Payment card data security\" },\n { id: \"data_masking\", label: \"Data Masking / Anonymization\", description: \"Hide sensitive data in logs/exports\" },\n { id: \"data_retention\", label: \"Data Retention Policies\", description: \"Automatic data expiration\" },\n { id: \"audit_logging\", label: \"Audit Logging\", description: \"Track data access and changes\" },\n { id: \"backup_encryption\", label: \"Encrypted Backups\", description: \"Encrypt backup data\" },\n { id: \"key_rotation\", label: \"Key Rotation\", description: \"Regular encryption key updates\" },\n { id: \"zero_trust\", label: \"Zero Trust Architecture\", description: \"Never trust, always verify\" },\n { id: \"least_privilege\", label: \"Least Privilege Access\", description: \"Minimal permissions\" },\n { id: \"rbac\", label: \"RBAC (Role-Based Access)\", description: \"Permission by role\" },\n { id: \"abac\", label: \"ABAC (Attribute-Based Access)\", description: \"Fine-grained access control\" },\n { id: \"data_classification\", label: \"Data Classification\", description: \"Classify data sensitivity levels\" },\n { id: \"dlp\", label: \"DLP (Data Loss Prevention)\", description: \"Prevent data leakage\" },\n { id: \"other\", label: \"Other\", description: \"Custom data handling\" },\n];\n\n// Important files to read - ensure consistent spacing after icons\n// Important files AI should read first (NOT AI config files - those are what we're creating)\n// Matching WebUI wizard options\nconst IMPORTANT_FILES = [\n { id: \"readme\", label: \"README.md\", icon: \"📖\", description: \"Project overview, setup instructions, and documentation\" },\n { id: \"package_json\", label: \"package.json\", icon: \"📦\", description: \"Dependencies, scripts, and project metadata\" },\n { id: \"changelog\", label: \"CHANGELOG.md\", icon: \"📝\", description: \"Version history and release notes\" },\n { id: \"contributing\", label: \"CONTRIBUTING.md\", icon: \"🤝\", description: \"Contribution guidelines and code standards\" },\n { id: \"makefile\", label: \"Makefile\", icon: \"🔧\", description: \"Build commands and automation tasks\" },\n { id: \"dockerfile\", label: \"Dockerfile\", icon: \"🐳\", description: \"Container configuration and build steps\" },\n { id: \"docker_compose\", label: \"docker-compose.yml\", icon: \"🐳\", description: \"Multi-container setup and services\" },\n { id: \"env_example\", label: \".env.example\", icon: \"🔐\", description: \"Environment variables template\" },\n { id: \"openapi\", label: \"openapi.yaml / swagger.json\", icon: \"📡\", description: \"API specification and endpoints\" },\n { id: \"architecture_md\", label: \"ARCHITECTURE.md\", icon: \"🏗️\", description: \"System architecture and design decisions\" },\n { id: \"api_docs\", label: \"API documentation\", icon: \"📚\", description: \"API reference and usage examples\" },\n { id: \"database_schema\", label: \"Database schema / migrations\", icon: \"🗄️\", description: \"Database structure and migration files\" },\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 - expanded to match WebUI\nconst TEST_FRAMEWORKS = [\n // JavaScript/TypeScript\n \"jest\", \"vitest\", \"mocha\", \"ava\", \"tap\", \"bun:test\",\n // E2E/Integration\n \"playwright\", \"cypress\", \"puppeteer\", \"selenium\", \"webdriverio\", \"testcafe\",\n // React/Frontend\n \"rtl\", \"enzyme\", \"storybook\", \"chromatic\",\n // API/Mocking\n \"msw\", \"supertest\", \"pact\", \"dredd\", \"karate\", \"postman\", \"insomnia\",\n // Python\n \"pytest\", \"unittest\", \"nose2\", \"hypothesis\", \"behave\", \"robot\",\n // Go\n \"go-test\", \"testify\", \"ginkgo\", \"gomega\",\n // Java/JVM\n \"junit\", \"testng\", \"mockito\", \"spock\", \"cucumber-jvm\",\n // Ruby\n \"rspec\", \"minitest\", \"capybara\", \"factory_bot\",\n // .NET\n \"xunit\", \"nunit\", \"mstest\", \"specflow\",\n // Infrastructure/DevOps\n \"terratest\", \"conftest\", \"opa\", \"inspec\", \"serverspec\", \"molecule\", \"kitchen\", \"goss\",\n // Kubernetes\n \"kubetest\", \"kuttl\", \"chainsaw\", \"helm-unittest\",\n // Security\n \"owasp-zap\", \"burpsuite\", \"nuclei\", \"semgrep\",\n // Load/Performance\n \"k6\", \"locust\", \"jmeter\", \"artillery\", \"gatling\", \"vegeta\", \"wrk\", \"ab\",\n // Chaos Engineering\n \"chaos-mesh\", \"litmus\", \"gremlin\", \"toxiproxy\",\n // Contract Testing\n \"spring-cloud-contract\", \"specmatic\",\n // BDD\n \"cucumber\", \"gauge\", \"concordion\",\n // Mutation Testing\n \"stryker\", \"pitest\", \"mutmut\",\n // Fuzzing\n \"go-fuzz\", \"afl\", \"libfuzzer\", \"jazzer\",\n // PHP\n \"phpunit\", \"pest\", \"codeception\",\n // Rust\n \"cargo-test\", \"rstest\", \"proptest\",\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// Development environment (OS) - can be multi-select\nconst DEV_OS_OPTIONS = [\n { id: \"macos\", label: \"macOS\", icon: \"🍎\" },\n { id: \"linux\", label: \"Linux\", icon: \"🐧\" },\n { id: \"windows\", label: \"Windows\", icon: \"🪟\" },\n { id: \"wsl\", label: \"WSL\", icon: \"🐧\" },\n { id: \"remote\", label: \"Remote/SSH\", icon: \"☁️\" },\n { id: \"devcontainer\", label: \"Dev Container\", icon: \"📦\" },\n { id: \"codespaces\", label: \"GitHub Codespaces\", icon: \"☁️\" },\n];\n\n// Detect current OS\nfunction detectCurrentOS(): string {\n const platform = os.platform();\n if (platform === \"darwin\") return \"macos\";\n if (platform === \"linux\") return \"linux\";\n if (platform === \"win32\") return \"windows\";\n return \"\";\n}\n\n// Architecture patterns\nconst ARCHITECTURE_PATTERNS = [\n { id: \"monolith\", label: \"Monolith\" },\n { id: \"microservices\", label: \"Microservices\" },\n { id: \"serverless\", label: \"Serverless\" },\n { id: \"mvc\", label: \"MVC\" },\n { id: \"layered\", label: \"Layered/N-tier\" },\n { id: \"event_driven\", label: \"Event-driven\" },\n { id: \"modular\", label: \"Modular monolith\" },\n { id: \"other\", label: \"Other\" },\n];\n\n// All users can access all wizard steps\nfunction canAccessTier(_userTier: UserTier, _requiredTier: StepTier): boolean {\n // All users get full wizard access - only AI features are restricted to Teams\n return true;\n}\n\n// Helper to sort choices with selected items first\ninterface Choice {\n title: string;\n value: string;\n selected?: boolean;\n description?: string;\n}\n\nfunction sortSelectedFirst<T extends Choice>(choices: T[]): T[] {\n return [...choices].sort((a, b) => {\n if (a.selected && !b.selected) return -1;\n if (!a.selected && b.selected) return 1;\n return 0;\n });\n}\n\n// Check if user can access AI features (Teams only)\nfunction canAccessAI(userTier: UserTier): boolean {\n return userTier === \"teams\";\n}\n\n// AI assistant for text fields\nasync function aiAssist(instruction: string, existingContent?: string): Promise<string | null> {\n const spinner = ora(\"AI is thinking...\").start();\n \n try {\n const response = await api.aiEditBlueprint({\n content: existingContent,\n instruction,\n mode: existingContent ? \"blueprint\" : \"wizard\",\n });\n spinner.succeed(\"AI suggestion ready\");\n return response.content;\n } catch (error) {\n if (error instanceof ApiRequestError) {\n if (error.statusCode === 403) {\n spinner.fail(\"AI editing requires Teams subscription\");\n } else if (error.statusCode === 429) {\n spinner.fail(\"Rate limit reached. Please wait a moment.\");\n } else {\n spinner.fail(`AI error: ${error.message}`);\n }\n } else {\n spinner.fail(\"Failed to get AI suggestion\");\n }\n return null;\n }\n}\n\n// Tier badges removed - all wizard steps are now available to all users\nfunction getTierBadge(_tier: StepTier): { label: string; color: typeof chalk.cyan } | null {\n // No badges needed - all users have full wizard access\n return null;\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 and highlighted current step\nfunction showStep(current: number, step: WizardStep, userTier: UserTier): void {\n const availableSteps = getAvailableSteps(userTier);\n const total = availableSteps.length;\n \n // Build progress bar with current step highlighted\n let progressBar = \"\";\n for (let i = 1; i <= total; i++) {\n if (i < current) {\n progressBar += chalk.green(\"●\"); // Completed\n } else if (i === current) {\n progressBar += chalk.cyan.bold(\"◉\"); // Current (highlighted)\n } else {\n progressBar += chalk.gray(\"○\"); // Upcoming\n }\n }\n \n const badge = getTierBadge(step.tier);\n \n console.log();\n console.log(chalk.gray(\" ═\".repeat(30)));\n let stepLine = ` ${progressBar} ${chalk.cyan.bold(`Step ${current}/${total}`)}: ${step.icon} ${chalk.bold(step.title)}`;\n if (badge) {\n stepLine += \" \" + badge.color(`[${badge.label}]`);\n }\n console.log(stepLine);\n console.log(chalk.gray(\" ═\".repeat(30)));\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// Global wizard state for saving draft on exit\nlet wizardState: {\n inProgress: boolean;\n answers: Record<string, unknown>;\n stepReached: number;\n} = {\n inProgress: false,\n answers: {},\n stepReached: 0,\n};\n\n// Save draft function for SIGINT handler\nasync function saveDraftOnExit(): Promise<void> {\n if (!wizardState.inProgress || Object.keys(wizardState.answers).length === 0) {\n return;\n }\n \n try {\n const timestamp = new Date().toISOString().replace(/[:.]/g, \"-\").slice(0, 19);\n const draftName = `autosave-${timestamp}`;\n \n console.log();\n console.log(chalk.yellow(` 💾 Saving wizard state to draft: ${draftName}...`));\n \n await saveDraftLocally(draftName, wizardState.answers, wizardState.stepReached);\n \n console.log(chalk.green(` ✓ Draft saved! Resume with: lynxp wizard --load-draft ${draftName}`));\n console.log(chalk.gray(` Saved at step ${wizardState.stepReached}`));\n console.log();\n } catch (err) {\n console.log(chalk.red(` ✗ Could not save draft: ${err instanceof Error ? err.message : \"unknown error\"}`));\n }\n}\n\n// Configure prompts to handle cancellation\nconst promptConfig = {\n onCancel: async () => {\n await saveDraftOnExit();\n console.log(chalk.yellow(\"\\n Cancelled. Run 'lynxp wizard' anytime to restart.\\n\"));\n process.exit(0);\n },\n};\n\n// Register SIGINT handler for Ctrl+C\nprocess.on(\"SIGINT\", async () => {\n await saveDraftOnExit();\n console.log(chalk.yellow(\"\\n Interrupted. Run 'lynxp wizard' anytime to restart.\\n\"));\n process.exit(0);\n});\n\nexport async function wizardCommand(options: WizardOptions): Promise<void> {\n try {\n await runWizardWithDraftProtection(options);\n } catch (error) {\n // On any unexpected error, try to save the draft\n await saveDraftOnExit();\n \n console.error(chalk.red(\"\\n ✗ An unexpected error occurred:\"));\n if (error instanceof Error) {\n console.error(chalk.gray(` ${error.message}`));\n }\n console.log();\n \n if (wizardState.stepReached > 0) {\n console.log(chalk.yellow(\" Your progress has been saved. Resume with the draft command shown above.\"));\n }\n console.log();\n process.exit(1);\n }\n}\n\nasync function runWizardWithDraftProtection(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 // Handle --load-draft option\n if (options.loadDraft) {\n const draft = await loadDraftLocally(options.loadDraft);\n if (draft) {\n const stepInfo = draft.stepReached ? ` at step ${draft.stepReached}` : \"\";\n const sourceInfo = draft.source ? ` [${draft.source}]` : \"\";\n const versionInfo = draft.version ? ` v${draft.version}` : \"\";\n console.log(chalk.green(` ✓ Loaded draft: ${draft.name}${sourceInfo}${versionInfo} (saved ${new Date(draft.savedAt).toLocaleString()}${stepInfo})`));\n \n // Check for version mismatch warnings\n if (draft.source && draft.source !== \"cli\") {\n console.log(chalk.yellow(` ⚠ This draft was created with the ${draft.source.toUpperCase()}. Some features may differ.`));\n }\n if (draft.version && draft.version !== CLI_VERSION) {\n // Compare major.minor versions for compatibility warning\n const draftMajorMinor = draft.version.split(\".\").slice(0, 2).join(\".\");\n const cliMajorMinor = CLI_VERSION.split(\".\").slice(0, 2).join(\".\");\n if (draftMajorMinor !== cliMajorMinor) {\n console.log(chalk.yellow(` ⚠ Draft was created with v${draft.version}, current CLI is v${CLI_VERSION}. Some options may have changed.`));\n }\n }\n console.log();\n // Store draft answers and resume step for use in interactive wizard\n options._draftAnswers = draft.config;\n options._resumeFromStep = draft.stepReached;\n // Also merge basic options (name, description, etc.)\n if (draft.config.name) options.name = draft.config.name as string;\n if (draft.config.description) options.description = draft.config.description as string;\n } else {\n const availableDrafts = await listLocalDrafts();\n console.log(chalk.red(` ✗ Draft \"${options.loadDraft}\" not found.`));\n if (availableDrafts.length > 0) {\n console.log(chalk.gray(` Available drafts: ${availableDrafts.join(\", \")}`));\n }\n console.log();\n }\n }\n\n // Handle --repo-url for direct remote analysis\n if (options.repoUrl) {\n const spinner = ora(\"Analyzing remote repository...\").start();\n const detected = await detectFromRemoteUrl(options.repoUrl);\n if (detected) {\n spinner.succeed(\"Remote repository analyzed\");\n // Pre-fill options from detected\n if (!options.name && detected.name) options.name = detected.name;\n if (!options.description && detected.description) options.description = detected.description;\n if (!options.stack && detected.stack.length > 0) options.stack = detected.stack.join(\",\");\n if (!options.license && detected.license) options.license = detected.license;\n if (detected.cicd) options.ciCd = detected.cicd;\n } else {\n spinner.fail(\"Could not analyze repository\");\n }\n console.log();\n }\n\n // Handle --detect-only mode\n if (options.detectOnly) {\n const detected = options.repoUrl \n ? await detectFromRemoteUrl(options.repoUrl)\n : await detectProject(process.cwd());\n \n if (detected) {\n console.log(chalk.green.bold(\" 📊 Project Analysis\"));\n console.log();\n console.log(chalk.white(` Name: ${detected.name || \"unknown\"}`));\n if (detected.description) console.log(chalk.gray(` Description: ${detected.description}`));\n console.log(chalk.white(` Type: ${detected.isOpenSource ? \"Open Source\" : detected.type}`));\n console.log(chalk.white(` Stack: ${detected.stack.join(\", \") || \"none detected\"}`));\n if (detected.databases && detected.databases.length > 0) {\n console.log(chalk.white(` Databases: ${detected.databases.join(\", \")}`));\n }\n if (detected.packageManager) console.log(chalk.white(` Package Manager: ${detected.packageManager}`));\n if (detected.repoHost) console.log(chalk.white(` Host: ${detected.repoHost}`));\n if (detected.license) console.log(chalk.white(` License: ${detected.license.toUpperCase()}`));\n if (detected.cicd) console.log(chalk.white(` CI/CD: ${detected.cicd.replace(\"_\", \" \")}`));\n if (detected.hasDocker) {\n const dockerInfo = detected.containerRegistry \n ? `detected (registry: ${detected.containerRegistry})`\n : \"detected\";\n console.log(chalk.white(` Docker: ${dockerInfo}`));\n }\n if (detected.testFramework) console.log(chalk.white(` Test Framework: ${detected.testFramework}`));\n if (detected.existingFiles && detected.existingFiles.length > 0) {\n const filesDisplay = detected.existingFiles.length > 3\n ? `${detected.existingFiles.slice(0, 3).join(\", \")}... (+${detected.existingFiles.length - 3})`\n : detected.existingFiles.join(\", \");\n console.log(chalk.white(` Static files found: ${detected.existingFiles.length} (${filesDisplay})`));\n }\n if (detected.commands) {\n console.log(chalk.white(` 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 console.log();\n } else {\n console.log(chalk.yellow(\" No project detected.\"));\n console.log();\n }\n return; // Exit without generating\n }\n\n // Blueprint mode hint\n if (options.blueprint) {\n console.log(chalk.magenta(\" 📋 Template Mode: Generating with [[VARIABLE|default]] placeholders\"));\n console.log();\n }\n\n // Check authentication and determine tier\n const authenticated = isAuthenticated();\n const user = getUser();\n const userPlanRaw = user?.plan?.toLowerCase() || \"free\";\n // Map legacy pro/max to users (free), only teams is a paid tier now\n const userTier: UserTier = userPlanRaw === \"teams\" ? \"teams\" : \"users\";\n const userPlanDisplay = userTier === \"teams\" ? \"TEAMS\" : \"USERS\";\n \n if (!authenticated) {\n // Show login notice for guests (box width: 55 inner chars)\n const W = 55;\n const y = chalk.yellow;\n const pad = (s: string, len: number) => s + \" \".repeat(Math.max(0, len - s.length));\n \n console.log(y(\"┌\" + \"─\".repeat(W) + \"┐\"));\n console.log(y(\"│\") + pad(\" 💡 Log in for full wizard features:\", W - 1) + y(\"│\"));\n console.log(y(\"│\") + \" \".repeat(W) + y(\"│\"));\n console.log(y(\"│\") + pad(\" • Full wizard with all steps\", W) + y(\"│\"));\n console.log(y(\"│\") + pad(\" • Auto-detect from repos [TEAMS]\", W) + y(\"│\"));\n console.log(y(\"│\") + pad(\" • AI assistant for configs [TEAMS]\", W) + y(\"│\"));\n console.log(y(\"│\") + pad(\" • Save preferences to your profile\", W) + y(\"│\"));\n console.log(y(\"│\") + pad(\" • Push configs to cloud (lynxp push)\", W) + y(\"│\"));\n console.log(y(\"│\") + pad(\" • Share across devices (lynxp push/pull)\", W) + y(\"│\"));\n console.log(y(\"│\") + \" \".repeat(W) + y(\"│\"));\n console.log(y(\"│\") + pad(\" Run: \" + chalk.cyan(\"lynxp login\"), W + 10) + y(\"│\")); // +10 for chalk codes\n console.log(y(\"└\" + \"─\".repeat(W) + \"┘\"));\n console.log();\n } else {\n // Show logged-in status with plan\n const planEmoji = userTier === \"teams\" ? \"👥\" : \"🆓\";\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 // Show draft save hint\n console.log(chalk.gray(` 💾 Tip: Type 'save:draftname' anytime to save progress locally`));\n console.log();\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 from current directory first\n let detected = await detectProject(process.cwd());\n \n // Show local detection results if found\n if (detected) {\n const detectedInfo = [\n chalk.green(\"✓ Local 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 } else {\n console.log(chalk.gray(\" No project detected in current directory.\"));\n console.log();\n }\n \n // Always offer to analyze a repository (available to all users)\n // Skip if --yes flag is used (non-interactive mode)\n const canDetectRemote = !options.yes;\n \n if (canDetectRemote) {\n console.log();\n console.log(chalk.magenta.bold(\" ┌───────────────────────────────────────────────┐\"));\n console.log(chalk.magenta.bold(\" │ ✨ AUTO-DETECT FROM REPOSITORY │\"));\n console.log(chalk.magenta.bold(\" └───────────────────────────────────────────────┘\"));\n console.log(chalk.gray(\" Analyze any local path, GitHub/GitLab URL, or private repo with credentials.\"));\n console.log(chalk.gray(\" We'll detect: languages, frameworks, commands, license, CI/CD, and more!\"));\n console.log();\n \n const remoteResponse = await prompts({\n type: \"confirm\",\n name: \"useRemote\",\n message: detected \n ? chalk.white(\"🔍 Analyze a different repository instead?\")\n : chalk.white(\"🔍 Analyze a repository (local path or URL)?\"),\n initial: false, // Default to No - user must explicitly choose Yes\n }, promptConfig);\n \n if (remoteResponse.useRemote) {\n const urlResponse = await prompts({\n type: \"text\",\n name: \"url\",\n message: chalk.white(\"Enter local path or repository URL:\"),\n hint: chalk.gray(\"/path/to/project or https://github.com/user/repo\"),\n validate: (v) => {\n if (!v || v.trim() === \"\") return \"Please enter a path or URL\";\n // Accept local paths (start with /, ~, or .)\n if (v.startsWith(\"/\") || v.startsWith(\"~\") || v.startsWith(\".\")) return true;\n // Accept git URLs\n if (isGitUrl(v)) return true;\n return \"Please enter a valid local path or Git URL\";\n },\n }, promptConfig);\n \n if (urlResponse.url) {\n const inputPath = urlResponse.url.trim();\n const isLocalPath = inputPath.startsWith(\"/\") || inputPath.startsWith(\"~\") || inputPath.startsWith(\".\");\n \n if (isLocalPath) {\n // Expand ~ to home directory\n const { homedir } = await import(\"os\");\n const resolvedPath = inputPath.startsWith(\"~\") \n ? inputPath.replace(\"~\", homedir())\n : inputPath.startsWith(\".\")\n ? join(process.cwd(), inputPath)\n : inputPath;\n \n const localSpinner = ora(`Analyzing local repository at ${resolvedPath}...`).start();\n const localDetected = await detectProject(resolvedPath);\n \n if (localDetected) {\n detected = localDetected;\n localSpinner.succeed(\"Local repository analyzed\");\n \n // Show local detection results\n const detectedInfo = [\n chalk.green(\"✓ Local 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 } else {\n localSpinner.fail(\"Could not analyze directory (no recognizable project structure)\");\n }\n } else {\n // Remote URL analysis\n const host = inputPath.toLowerCase().includes(\"github\") ? \"GitHub API\" \n : inputPath.toLowerCase().includes(\"gitlab\") ? \"GitLab API\" \n : \"shallow clone\";\n const remoteSpinner = ora(`Analyzing remote repository via ${host}...`).start();\n const remoteDetected = await detectFromRemoteUrl(inputPath);\n \n if (remoteDetected) {\n detected = remoteDetected;\n remoteSpinner.succeed(\"Remote repository analyzed\");\n \n // Show remote detection results (aligned with WebUI output)\n const detectedInfo = [\n chalk.green(\"✓ Remote project detected\"),\n ];\n if (detected.name) detectedInfo.push(chalk.gray(` Name: ${detected.name}`));\n if (detected.isOpenSource) detectedInfo.push(chalk.gray(` Type: Open Source`));\n if (detected.stack.length > 0) detectedInfo.push(chalk.gray(` Stack: ${detected.stack.join(\", \")}`));\n if (detected.databases && detected.databases.length > 0) {\n detectedInfo.push(chalk.gray(` Databases: ${detected.databases.join(\", \")}`));\n }\n if (detected.license) detectedInfo.push(chalk.gray(` License: ${detected.license.toUpperCase()}`));\n if (detected.repoHost) detectedInfo.push(chalk.gray(` Host: ${detected.repoHost}`));\n if (detected.cicd) detectedInfo.push(chalk.gray(` CI/CD: ${detected.cicd.replace(\"_\", \" \")}`));\n if (detected.hasDocker) {\n const dockerInfo = detected.containerRegistry \n ? `detected (registry: ${detected.containerRegistry})`\n : \"detected\";\n detectedInfo.push(chalk.gray(` Docker: ${dockerInfo}`));\n }\n if (detected.existingFiles && detected.existingFiles.length > 0) {\n const filesDisplay = detected.existingFiles.length > 3\n ? `${detected.existingFiles.slice(0, 3).join(\", \")}...`\n : detected.existingFiles.join(\", \");\n detectedInfo.push(chalk.gray(` Static files found: ${detected.existingFiles.length} (${filesDisplay})`));\n }\n if (detected.repoUrl) detectedInfo.push(chalk.gray(` Source: ${detected.repoUrl}`));\n \n printBox(detectedInfo, chalk.gray);\n console.log();\n } else {\n remoteSpinner.fail(\"Could not analyze repository (may be private or inaccessible)\");\n }\n }\n }\n }\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 // Add blueprint mode and variables to config\n const variables = options.vars ? parseVariablesString(options.vars) : undefined;\n // Don't pass enableAutoUpdate/blueprintId to generator yet - we'll add curl header after saving\n const finalConfig = {\n ...config,\n blueprintMode: options.blueprint || config.blueprintMode || false,\n variables,\n enableAutoUpdate: false, // Don't generate curl header yet\n };\n \n let files = generateConfig(finalConfig);\n \n // If enableAutoUpdate is true, save blueprint to cloud first\n let savedBlueprintId: string | null = null;\n if (config.enableAutoUpdate && api) {\n spinner.text = \"Saving blueprint to cloud...\";\n try {\n const mainFile = Object.entries(files)[0];\n if (mainFile) {\n const [_fileName, content] = mainFile;\n const response = await api.createBlueprint({\n name: config.name || \"My AI Config\",\n description: config.description || \"Generated with LynxPrompt CLI\",\n content: content,\n visibility: \"PRIVATE\",\n });\n savedBlueprintId = response.blueprint.id;\n \n // Now regenerate with the real blueprint ID to include curl header\n const configWithAutoUpdate = {\n ...finalConfig,\n enableAutoUpdate: true,\n blueprintId: savedBlueprintId,\n };\n files = generateConfig(configWithAutoUpdate);\n \n console.log(chalk.green(` ✓ Blueprint saved: ${savedBlueprintId}`));\n }\n } catch (saveError) {\n spinner.stop();\n console.log(chalk.yellow(\"\\n ⚠️ Could not save blueprint to cloud\"));\n if (saveError instanceof Error) {\n console.log(chalk.gray(` ${saveError.message}`));\n }\n console.log(chalk.gray(\" Continuing without auto-update curl command...\"));\n // Continue without auto-update\n }\n }\n \n spinner.stop();\n\n console.log();\n console.log(chalk.green.bold(\" ✅ Generated:\"));\n console.log();\n \n // Determine output directory\n const outputDir = options.output || process.cwd();\n \n for (const [filename, content] of Object.entries(files)) {\n const outputPath = join(outputDir, 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 diff \") + chalk.gray(\"Compare with cloud 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 // Save draft if requested\n if (options.saveDraft) {\n try {\n await saveDraftLocally(options.saveDraft, config as unknown as Record<string, unknown>);\n console.log(chalk.green(` 💾 Draft saved as \"${options.saveDraft}\"`));\n console.log(chalk.gray(` Load later with: lynxp wizard --load-draft ${options.saveDraft}`));\n console.log();\n } catch (err) {\n console.log(chalk.yellow(` ⚠️ Could not save draft: ${err instanceof Error ? err.message : \"unknown error\"}`));\n }\n }\n\n // Offer to save preferences to profile (logged-in users only)\n if (authenticated && !options.yes) {\n console.log();\n const savePrefsResponse = await prompts({\n type: \"confirm\",\n name: \"savePrefs\",\n message: chalk.white(\"Save these preferences to your profile for next time?\"),\n initial: true,\n });\n\n if (savePrefsResponse.savePrefs) {\n // Retry loop for saving preferences\n let saved = false;\n let attempts = 0;\n const maxAttempts = 3;\n \n while (!saved && attempts < maxAttempts) {\n attempts++;\n const saveSpinner = ora(\"Saving preferences to your profile...\").start();\n try {\n // Save wizard preferences via API\n await api.saveWizardPreferences({\n commands: config.commands,\n codeStyle: {\n naming: config.namingConvention,\n errorHandling: config.errorHandling,\n loggingConventions: config.loggingConventions,\n loggingConventionsOther: config.loggingConventionsOther,\n notes: config.styleNotes,\n },\n boundaries: {\n always: config.boundaryAlways,\n never: config.boundaryNever,\n ask: config.boundaryAsk,\n },\n testing: {\n levels: config.testLevels,\n frameworks: config.testFrameworks,\n coverage: config.coverageTarget,\n notes: config.testNotes,\n },\n });\n saveSpinner.succeed(\"Preferences saved to your profile\");\n saved = true;\n } catch (err) {\n saveSpinner.fail(\"Could not save preferences\");\n let errorType = \"unknown\";\n \n if (err instanceof ApiRequestError) {\n if (err.statusCode === 401) {\n console.log(chalk.yellow(\" Your session may have expired. Try: lynxp login\"));\n break; // Don't retry auth errors\n } else {\n console.log(chalk.gray(` ${err.message} (status: ${err.statusCode})`));\n errorType = \"api\";\n }\n } else if (err instanceof Error) {\n if (err.message.includes(\"fetch failed\") || err.message.includes(\"ENOTFOUND\")) {\n console.log(chalk.yellow(\" Network error. Check your internet connection.\"));\n errorType = \"network\";\n } else {\n console.log(chalk.gray(` ${err.message}`));\n }\n }\n \n // Ask if user wants to retry (for network/api errors)\n if (errorType === \"network\" || errorType === \"api\") {\n if (attempts < maxAttempts) {\n const retryResponse = await prompts({\n type: \"confirm\",\n name: \"retry\",\n message: chalk.white(\"Would you like to retry?\"),\n initial: true,\n });\n \n if (!retryResponse.retry) {\n console.log(chalk.gray(\" Skipping preference save. Your config files are still generated.\"));\n break;\n }\n } else {\n console.log(chalk.gray(` Max retries (${maxAttempts}) reached. Your config files are still generated.`));\n }\n } else {\n break; // Don't retry unknown errors\n }\n }\n }\n }\n }\n \n } catch (error) {\n spinner.fail(\"Failed to generate files\");\n \n // Try to save draft even on generation error\n await saveDraftOnExit();\n \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 \n if (wizardState.stepReached > 0) {\n console.log(chalk.yellow(\"\\n Your wizard progress has been saved to a draft.\"));\n }\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 // Load answers from draft if resuming\n const answers: Record<string, unknown> = options._draftAnswers ? { ...options._draftAnswers } : {};\n const resumeFromStep = options._resumeFromStep || 0;\n const availableSteps = getAvailableSteps(userTier);\n let currentStepNum = 0;\n\n // Initialize global state for draft saving on exit\n wizardState.inProgress = true;\n wizardState.answers = answers;\n wizardState.stepReached = resumeFromStep;\n\n // Show resume message if loading from draft\n if (resumeFromStep > 0 && Object.keys(answers).length > 0) {\n console.log(chalk.cyan(` 📋 Resuming from step ${resumeFromStep}...`));\n console.log(chalk.gray(\" Previously saved answers:\"));\n // Show key saved values\n if (answers.name) console.log(chalk.gray(` • Name: ${answers.name}`));\n if (answers.platforms) console.log(chalk.gray(` • Platforms: ${(answers.platforms as string[]).join(\", \")}`));\n if (answers.stack) console.log(chalk.gray(` • Stack: ${(answers.stack as string[]).slice(0, 5).join(\", \")}${(answers.stack as string[]).length > 5 ? \"...\" : \"\"}`));\n console.log();\n console.log(chalk.yellow(\" Steps 1-\" + (resumeFromStep - 1) + \" will use saved values. Continuing from step \" + resumeFromStep + \".\"));\n console.log();\n }\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 wizardState.stepReached = currentStepNum;\n return step;\n }\n return null;\n };\n\n // Helper to check if we should skip this step (already completed in draft)\n const shouldSkipStep = (stepNum: number) => {\n return resumeFromStep > 0 && stepNum < resumeFromStep;\n };\n\n // ═══════════════════════════════════════════════════════════════\n // STEP 1: Output Format (basic - all users)\n // ═══════════════════════════════════════════════════════════════\n const formatStep = getCurrentStep(\"format\")!;\n \n let platforms: string[];\n \n if (shouldSkipStep(currentStepNum) && answers.platforms) {\n // Use saved answer from draft\n platforms = answers.platforms as string[];\n console.log(chalk.gray(` Step 1 (Output Format): Using saved platforms: ${platforms.join(\", \")}`));\n } else if (options.format) {\n showStep(currentStepNum, formatStep, userTier);\n platforms = options.format.split(\",\").map(f => f.trim());\n console.log(chalk.gray(` Using format from flag: ${platforms.join(\", \")}`));\n } else {\n showStep(currentStepNum, formatStep, userTier);\n // Multi-select by default - user can select one or more platforms\n console.log(chalk.gray(\" Select the AI editors you want to generate config for:\"));\n console.log(chalk.gray(\" (AGENTS.md is recommended - works with most AI tools)\"));\n console.log(chalk.gray(\" Type to search/filter the list.\"));\n console.log();\n \n const platformResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"platforms\",\n message: chalk.white(\"Select AI editors (type to search):\"),\n choices: ALL_PLATFORMS.map(p => ({ \n title: p.id === \"agents\" \n ? `${p.icon} ${p.name} ${chalk.green.bold(\"★ recommended\")}`\n : `${p.icon} ${p.name}`,\n value: p.id,\n description: chalk.gray(p.note),\n selected: p.id === \"agents\", // Pre-select AGENTS.md\n })),\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n min: 1,\n instructions: false,\n }, promptConfig);\n \n platforms = platformResponse.platforms || [\"agents\"];\n console.log(chalk.green(` ✓ Selected ${platforms.length} platform${platforms.length === 1 ? \"\" : \"s\"}`));\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 || detected?.description || \"\",\n hint: detected?.description \n ? chalk.green(\"(pre-filled from repo About)\")\n : chalk.gray(\"optional - helps AI understand context\"),\n }, promptConfig);\n answers.description = descResponse.description || \"\";\n\n // Project type - pre-select open-source if detected from public repo\n const isDetectedOpenSource = detected?.isPublicRepo === true;\n const projectTypeChoices = [\n { title: chalk.gray(\"⏭ Skip\"), value: \"\" },\n ...PROJECT_TYPES.map(t => ({\n title: (t.id === \"opensource\" && isDetectedOpenSource)\n ? `${t.icon} ${t.label} ${chalk.green(\"(detected)\")}`\n : `${t.icon} ${t.label}`,\n value: t.id,\n description: chalk.gray(t.description),\n })),\n ];\n const defaultProjectTypeIdx = isDetectedOpenSource \n ? projectTypeChoices.findIndex(c => c.value === \"opensource\")\n : 0;\n \n const typeResponse = await prompts({\n type: \"select\",\n name: \"projectType\",\n message: chalk.white(\"Project type:\"),\n choices: projectTypeChoices,\n initial: defaultProjectTypeIdx > 0 ? defaultProjectTypeIdx : 0,\n }, promptConfig);\n answers.projectType = typeResponse.projectType || \"\";\n\n // Development environment(s) - multi-select with current OS pre-selected and labeled\n const currentOS = detectCurrentOS();\n const devOsResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"devOS\",\n message: chalk.white(\"Development environment(s) (type to search):\"),\n choices: DEV_OS_OPTIONS.map(o => ({\n title: o.id === currentOS \n ? `${o.icon} ${o.label} ${chalk.green(\"(detected by your current system)\")}`\n : `${o.icon} ${o.label}`,\n value: o.id,\n selected: o.id === currentOS, // Pre-select current OS\n })),\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n answers.devOS = devOsResponse.devOS || [];\n\n // Architecture pattern\n const archResponse = await prompts({\n type: \"select\",\n name: \"architecture\",\n message: chalk.white(\"Architecture pattern:\"),\n choices: [\n { title: chalk.gray(\"⏭ Skip\"), value: \"\" },\n ...ARCHITECTURE_PATTERNS.map(a => ({\n title: a.label,\n value: a.id,\n })),\n ],\n initial: 0,\n }, promptConfig);\n answers.architecture = archResponse.architecture || \"\";\n \n // If \"other\" selected, ask for custom input\n if (answers.architecture === \"other\") {\n const customArchResponse = await prompts({\n type: \"text\",\n name: \"customArchitecture\",\n message: chalk.white(\"Describe your architecture pattern:\"),\n hint: chalk.gray(\"e.g., CQRS, Hexagonal, Clean Architecture\"),\n }, promptConfig);\n answers.architectureOther = customArchResponse.customArchitecture || \"\";\n }\n\n // Blueprint Template Mode - available for all users\n console.log();\n console.log(chalk.yellow(\" 🧩 Blueprint Template Mode\"));\n console.log(chalk.gray(\" Create a reusable template with [[VARIABLE|default]] placeholders\"));\n console.log(chalk.gray(\" that others can customize when using your blueprint.\"));\n console.log();\n \n const blueprintResponse = await prompts({\n type: \"toggle\",\n name: \"blueprintMode\",\n message: chalk.white(\"Create as Blueprint Template?\"),\n initial: false,\n active: \"Yes\",\n inactive: \"No\",\n }, promptConfig);\n answers.blueprintMode = blueprintResponse.blueprintMode || false;\n \n if (answers.blueprintMode) {\n console.log(chalk.green(\" ✓ Blueprint mode enabled - values will use [[VARIABLE|default]] syntax\"));\n }\n\n // ═══════════════════════════════════════════════════════════════\n // STEP 3: Tech Stack (basic - all users)\n // ═══════════════════════════════════════════════════════════════\n const techStep = getCurrentStep(\"tech\")!;\n showStep(currentStepNum, techStep, userTier);\n\n // Let AI decide option - default to Yes\n const letAiResponse = await prompts({\n type: \"toggle\",\n name: \"letAiDecide\",\n message: chalk.white(\"Let AI help choose additional technologies?\"),\n initial: true, // Default to Yes\n active: \"Yes\",\n inactive: \"No\",\n }, promptConfig);\n answers.letAiDecide = letAiResponse.letAiDecide ?? true;\n\n console.log();\n console.log(chalk.gray(\" Select your tech stack (type to search/filter):\"));\n console.log();\n\n // Show detected stack as hint\n if (detected?.stack && detected.stack.length > 0) {\n console.log(chalk.green(` ✓ Detected in project: ${detected.stack.join(\", \")}`));\n console.log();\n }\n\n // Languages - autocomplete multiselect for searchability\n const languageChoices = sortSelectedFirst(LANGUAGES.map(s => {\n const isDetected = detected?.stack?.includes(s.value);\n return {\n title: isDetected ? `${s.title} ${chalk.green(\"(detected)\")}` : s.title,\n value: s.value,\n selected: isDetected,\n };\n }));\n const languageResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"languages\",\n message: chalk.white(\"Languages (type to search):\"),\n choices: languageChoices,\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n const selectedLanguages = languageResponse.languages || [];\n\n // Frameworks - separate selection like WebUI\n const frameworkChoices = sortSelectedFirst(FRAMEWORKS.map(s => {\n const isDetected = detected?.stack?.includes(s.value);\n return {\n title: isDetected ? `${s.title} ${chalk.green(\"(detected)\")}` : s.title,\n value: s.value,\n selected: isDetected,\n };\n }));\n const frameworkResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"frameworks\",\n message: chalk.white(\"Frameworks (type to search):\"),\n choices: frameworkChoices,\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n const selectedFrameworks = frameworkResponse.frameworks || [];\n\n // Databases\n const databaseChoices = sortSelectedFirst(DATABASES.map(s => {\n const isDetected = detected?.stack?.includes(s.value);\n return {\n title: isDetected ? `${s.title} ${chalk.green(\"(detected)\")}` : s.title,\n value: s.value,\n selected: isDetected,\n };\n }));\n const databaseResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"databases\",\n message: chalk.white(\"Databases (type to search):\"),\n choices: databaseChoices,\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n const selectedDatabases = databaseResponse.databases || [];\n\n // JS/TS specific options\n const hasJsTs = selectedLanguages.includes(\"javascript\") || selectedLanguages.includes(\"typescript\");\n \n if (hasJsTs) {\n console.log();\n console.log(chalk.cyan(\" 📦 JavaScript/TypeScript Options\"));\n console.log();\n \n // Package Manager\n const pmResponse = await prompts({\n type: \"select\",\n name: \"packageManager\",\n message: chalk.white(\"Package manager:\"),\n choices: PACKAGE_MANAGERS.map(pm => ({\n title: `${pm.title} - ${chalk.gray(pm.desc)}`,\n value: pm.value,\n })),\n initial: 0,\n }, promptConfig);\n answers.packageManager = pmResponse.packageManager || \"npm\";\n\n // JS Runtime\n const runtimeResponse = await prompts({\n type: \"select\",\n name: \"jsRuntime\",\n message: chalk.white(\"JavaScript runtime:\"),\n choices: JS_RUNTIMES.map(rt => ({\n title: `${rt.title} - ${chalk.gray(rt.desc)}`,\n value: rt.value,\n })),\n initial: 0,\n }, promptConfig);\n answers.jsRuntime = runtimeResponse.jsRuntime || \"node\";\n\n // Monorepo\n const monoResponse = await prompts({\n type: \"select\",\n name: \"monorepoTool\",\n message: chalk.white(\"Monorepo tool:\"),\n choices: MONOREPO_TOOLS.map(mt => ({\n title: `${mt.title} - ${chalk.gray(mt.desc)}`,\n value: mt.value,\n })),\n initial: 0,\n }, promptConfig);\n answers.monorepoTool = monoResponse.monorepoTool || \"\";\n }\n\n // ORM selection (if databases selected)\n if (selectedDatabases.length > 0) {\n console.log();\n console.log(chalk.cyan(\" 🔗 ORM / Database Library\"));\n console.log();\n \n // Filter ORMs by selected languages\n const relevantOrms = ORM_OPTIONS.filter(orm => \n orm.langs.length === 0 || orm.langs.some(l => selectedLanguages.includes(l))\n );\n \n const ormResponse = await prompts({\n type: \"select\",\n name: \"orm\",\n message: chalk.white(\"ORM / Database library:\"),\n choices: relevantOrms.map(orm => ({ title: orm.title, value: orm.value })),\n initial: 0,\n }, promptConfig);\n answers.orm = ormResponse.orm || \"\";\n }\n\n // Combine all stack selections\n answers.stack = [...selectedLanguages, ...selectedFrameworks, ...selectedDatabases];\n\n // ═══════════════════════════════════════════════════════════════\n // STEP 4: Repository Setup (basic - all users)\n // ═══════════════════════════════════════════════════════════════\n const repoStep = getCurrentStep(\"repo\")!;\n showStep(currentStepNum, repoStep, userTier);\n\n // Show detected repository info\n if (detected?.repoHost || detected?.license || detected?.cicd) {\n console.log(chalk.green(\" ✓ Auto-detected from your project:\"));\n if (detected.repoHost) console.log(chalk.gray(` • Repository: ${detected.repoHost}${detected.repoUrl ? ` (${detected.repoUrl})` : \"\"}`));\n if (detected.license) console.log(chalk.gray(` • License: ${detected.license}`));\n if (detected.cicd) console.log(chalk.gray(` • CI/CD: ${detected.cicd}`));\n console.log();\n }\n\n // Find initial index for detected repo host\n const repoHostChoices = [\n { title: chalk.gray(\"⏭ Skip\"), value: \"\" },\n ...REPO_HOSTS.map(h => ({\n title: detected?.repoHost === h.id \n ? `${h.icon} ${h.label} ${chalk.green(\"(detected)\")}`\n : `${h.icon} ${h.label}`,\n value: h.id,\n })),\n ];\n const detectedRepoIndex = detected?.repoHost \n ? repoHostChoices.findIndex(c => c.value === detected.repoHost)\n : 0;\n\n const repoHostResponse = await prompts({\n type: \"select\",\n name: \"repoHost\",\n message: chalk.white(\"Repository host:\"),\n choices: repoHostChoices,\n initial: detectedRepoIndex > 0 ? detectedRepoIndex : 0,\n }, promptConfig);\n answers.repoHost = repoHostResponse.repoHost || \"\";\n\n const visibilityResponse = await prompts({\n type: \"toggle\",\n name: \"isPublic\",\n message: chalk.white(\"Public repository?\"),\n initial: true, // Default Yes\n active: \"Yes\",\n inactive: \"No\",\n }, promptConfig);\n answers.isPublic = visibilityResponse.isPublic ?? true;\n\n // Find initial index for detected license\n const licenseChoices = [\n { title: chalk.gray(\"⏭ Skip\"), value: \"\" },\n ...LICENSES.map(l => ({\n title: detected?.license === l.id\n ? `${l.label} ${chalk.green(\"(detected)\")}`\n : l.label,\n value: l.id,\n })),\n ];\n const detectedLicenseIndex = detected?.license\n ? licenseChoices.findIndex(c => c.value === detected.license)\n : 0;\n\n const licenseResponse = await prompts({\n type: \"select\",\n name: \"license\",\n message: chalk.white(\"License:\"),\n choices: licenseChoices,\n initial: detectedLicenseIndex > 0 ? detectedLicenseIndex : 0,\n }, promptConfig);\n answers.license = licenseResponse.license || \"\";\n\n const conventionalResponse = await prompts({\n type: \"toggle\",\n name: \"conventionalCommits\",\n message: chalk.white(\"Use Conventional Commits?\"),\n initial: true, // Default Yes\n active: \"Yes\",\n inactive: \"No\",\n }, promptConfig);\n answers.conventionalCommits = conventionalResponse.conventionalCommits ?? true;\n\n const semverResponse = await prompts({\n type: \"toggle\",\n name: \"semver\",\n message: chalk.white(\"Use Semantic Versioning?\"),\n initial: true, // Default Yes\n active: \"Yes\",\n inactive: \"No\",\n }, promptConfig);\n answers.semver = semverResponse.semver ?? true;\n\n // Conditional semver options\n if (answers.semver) {\n const tagFormatResponse = await prompts({\n type: \"select\",\n name: \"versionTagFormat\",\n message: chalk.white(\"Version tag format:\"),\n choices: [\n { title: \"v-prefix (v1.0.0)\", value: \"v_prefix\" },\n { title: \"No prefix (1.0.0)\", value: \"no_prefix\" },\n { title: \"Package prefix (@pkg/v1.0.0)\", value: \"package_prefix\" },\n { title: \"Date-based (2024.01.15)\", value: \"date_based\" },\n { title: \"Custom format\", value: \"custom\" },\n ],\n initial: 0,\n }, promptConfig);\n answers.versionTagFormat = tagFormatResponse.versionTagFormat || \"v_prefix\";\n\n const changelogResponse = await prompts({\n type: \"select\",\n name: \"changelogTool\",\n message: chalk.white(\"Changelog management:\"),\n choices: [\n { title: \"Manual - Write CHANGELOG.md by hand\", value: \"manual\" },\n { title: \"Conventional Changelog - Auto-generate from commit messages\", value: \"conventional_changelog\" },\n { title: \"Release Please - Google's automated release management\", value: \"release_please\" },\n { title: \"Semantic Release - Fully automated versioning & publishing\", value: \"semantic_release\" },\n { title: \"Changesets - Monorepo-friendly version management\", value: \"changesets\" },\n { title: \"GitHub Releases - Use GitHub's built-in release notes\", value: \"github_releases\" },\n { title: \"Keep a Changelog - Manual following keepachangelog.com format\", value: \"keep_a_changelog\" },\n { title: \"Other - Custom changelog tooling\", value: \"other\" },\n ],\n initial: 0,\n }, promptConfig);\n answers.changelogTool = changelogResponse.changelogTool || \"manual\";\n }\n\n // Commit signing\n const signingResponse = await prompts({\n type: \"toggle\",\n name: \"commitSigning\",\n message: chalk.white(\"Require commit signing (GPG/SSH)?\"),\n initial: false,\n active: \"Yes\",\n inactive: \"No\",\n }, promptConfig);\n answers.commitSigning = signingResponse.commitSigning ?? false;\n\n // Branch strategy\n const branchStrategyResponse = await prompts({\n type: \"select\",\n name: \"branchStrategy\",\n message: chalk.white(\"Branch strategy:\"),\n choices: [\n { title: \"🎮 None (toy project) - No branching, commit directly to main\", value: \"none\" },\n { title: \"🌊 GitHub Flow - Simple: main + feature branches\", value: \"github_flow\" },\n { title: \"🌳 Gitflow - develop, feature, release, hotfix branches\", value: \"gitflow\" },\n { title: \"🚂 Trunk-Based - Short-lived branches, continuous integration\", value: \"trunk_based\" },\n { title: \"🦊 GitLab Flow - Environment branches (staging, production)\", value: \"gitlab_flow\" },\n { title: \"🚀 Release Flow - main + release branches\", value: \"release_flow\" },\n ],\n initial: 1, // Default to GitHub Flow (index 1 after adding \"none\")\n }, promptConfig);\n answers.branchStrategy = branchStrategyResponse.branchStrategy || \"github_flow\";\n\n // Default branch\n const defaultBranchResponse = await prompts({\n type: \"select\",\n name: \"defaultBranch\",\n message: chalk.white(\"Default branch name:\"),\n choices: [\n { title: \"main\", value: \"main\" },\n { title: \"master\", value: \"master\" },\n { title: \"develop\", value: \"develop\" },\n { title: \"trunk\", value: \"trunk\" },\n ],\n initial: 0,\n }, promptConfig);\n answers.defaultBranch = defaultBranchResponse.defaultBranch || \"main\";\n\n // Commit workflow is automatically determined by branch strategy\n // Toy projects (no branching) → direct commits; all others → branch + PR\n answers.commitWorkflow = answers.branchStrategy === \"none\" ? \"direct_main\" : \"branch_pr\";\n\n // Dependabot/Renovate moved to Security step\n\n // CI/CD Platform - use detected value if available\n const cicdChoices = [\n { title: chalk.gray(\"⏭ Skip\"), value: \"\" },\n ...CICD_OPTIONS.map(c => ({\n title: detected?.cicd === c.id\n ? `${c.icon} ${c.label} ${chalk.green(\"(detected)\")}`\n : `${c.icon} ${c.label}`,\n value: c.id,\n })),\n ];\n const detectedCicdIndex = detected?.cicd\n ? cicdChoices.findIndex(c => c.value === detected.cicd)\n : 0;\n\n const cicdResponse = await prompts({\n type: \"select\",\n name: \"cicd\",\n message: chalk.white(\"CI/CD Platform:\"),\n choices: cicdChoices,\n initial: detectedCicdIndex > 0 ? detectedCicdIndex : 0,\n }, promptConfig);\n answers.cicd = cicdResponse.cicd || \"\";\n\n // First ask: cloud, self-hosted, or both\n const deployTypeResponse = await prompts({\n type: \"select\",\n name: \"deployType\",\n message: chalk.white(\"Deployment environment:\"),\n choices: [\n { title: \"☁️ Cloud only - PaaS, serverless, managed services\", value: \"cloud\" },\n { title: \"🏠 Self-hosted only - On-premise, homelab, VPS\", value: \"self_hosted\" },\n { title: \"🔄 Both cloud and self-hosted\", value: \"both\" },\n { title: chalk.gray(\"⏭ Skip\"), value: \"skip\" },\n ],\n initial: 0,\n }, promptConfig);\n const deployType = deployTypeResponse.deployType || \"skip\";\n \n let allDeployTargets: string[] = [];\n \n // Show cloud targets if selected\n if (deployType === \"cloud\" || deployType === \"both\") {\n const cloudChoices = CLOUD_TARGETS.map(t => ({\n title: `${t.icon}${t.label}`,\n value: t.id,\n }));\n const cloudResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"cloudTargets\",\n message: chalk.white(\"Cloud deployment targets (type to search):\"),\n choices: cloudChoices,\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n allDeployTargets = [...(cloudResponse.cloudTargets || [])];\n }\n \n // Show self-hosted targets if selected\n if (deployType === \"self_hosted\" || deployType === \"both\") {\n const selfHostedChoices = sortSelectedFirst(SELF_HOSTED_TARGETS.map(t => ({\n title: (t.id === \"docker\" && detected?.hasDocker)\n ? `${t.icon}${t.label} ${chalk.green(\"(detected)\")}`\n : `${t.icon}${t.label}`,\n selected: t.id === \"docker\" && detected?.hasDocker,\n value: t.id,\n })));\n const selfHostedResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"selfHostedTargets\",\n message: chalk.white(\"Self-hosted deployment targets (type to search):\"),\n choices: selfHostedChoices,\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n allDeployTargets = [...allDeployTargets, ...(selfHostedResponse.selfHostedTargets || [])];\n }\n \n answers.deploymentTargets = allDeployTargets;\n\n // Container build - default to Yes if Docker/Docker Compose is selected in deployment targets\n const dockerSelected = (answers.deploymentTargets as string[] || []).some(t => \n [\"docker\", \"docker_compose\", \"kubernetes\", \"k3s\", \"podman\"].includes(t)\n ) || detected?.hasDocker;\n const containerResponse = await prompts({\n type: \"toggle\",\n name: \"buildContainer\",\n message: chalk.white(\"Build container images (Docker)?\"),\n initial: dockerSelected, // Default Yes if container platform selected\n active: \"Yes\",\n inactive: \"No\",\n }, promptConfig);\n answers.buildContainer = containerResponse.buildContainer ?? dockerSelected;\n\n // Container registry (if building containers)\n if (answers.buildContainer) {\n const registryResponse = await prompts({\n type: \"select\",\n name: \"containerRegistry\",\n message: chalk.white(\"Container registry:\"),\n choices: [\n { title: chalk.gray(\"⏭ Skip\"), value: \"\" },\n ...CONTAINER_REGISTRIES.map(r => ({\n title: `${r.icon} ${r.label}`,\n value: r.id,\n })),\n ],\n initial: 0,\n }, promptConfig);\n answers.containerRegistry = registryResponse.containerRegistry || \"\";\n \n // If custom/self-hosted registry selected, ask for URL\n if (answers.containerRegistry === \"custom\") {\n const customRegistryResponse = await prompts({\n type: \"text\",\n name: \"customRegistryUrl\",\n message: chalk.white(\"Container registry URL:\"),\n hint: chalk.gray(\"e.g., registry.example.com:5000\"),\n validate: (v) => v.trim() ? true : \"Please enter a registry URL\",\n }, promptConfig);\n answers.customRegistryUrl = customRegistryResponse.customRegistryUrl || \"\";\n }\n }\n\n // Example repository URL\n console.log();\n console.log(chalk.gray(\" 📚 Point the AI to a well-structured public repository as a reference.\"));\n console.log(chalk.gray(\" The AI will study its code patterns, architecture, and conventions to better assist you.\"));\n const exampleRepoResponse = await prompts({\n type: \"text\",\n name: \"exampleRepoUrl\",\n message: chalk.white(\"Reference repository URL (optional):\"),\n hint: chalk.gray(\"e.g., https://github.com/vercel/next.js\"),\n }, promptConfig);\n answers.exampleRepoUrl = exampleRepoResponse.exampleRepoUrl || \"\";\n\n // External documentation URL\n console.log();\n console.log(chalk.gray(\" 📖 Link to your team's external documentation for project context.\"));\n console.log(chalk.gray(\" The AI will read these docs to understand your project's domain and conventions.\"));\n const docsUrlResponse = await prompts({\n type: \"text\",\n name: \"documentationUrl\",\n message: chalk.white(\"External docs URL (optional):\"),\n hint: chalk.gray(\"e.g., Confluence, Notion, GitBook, internal wiki\"),\n }, promptConfig);\n answers.documentationUrl = docsUrlResponse.documentationUrl || \"\";\n\n // ═══════════════════════════════════════════════════════════════\n // STEP 5: Security (basic - FREE tier for all users)\n // ═══════════════════════════════════════════════════════════════\n const securityStep = getCurrentStep(\"security\")!;\n showStep(currentStepNum, securityStep, userTier);\n\n // 1. Authentication Providers (login methods)\n console.log();\n console.log(chalk.cyan(\" 1️⃣ Authentication Providers\"));\n console.log(chalk.gray(\" Which login methods should your app support?\"));\n console.log();\n\n const authProvidersResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"authProviders\",\n message: chalk.white(\"Auth providers (type to search):\"),\n choices: [\n { title: \"Email/Password\", value: \"email_password\", description: chalk.gray(\"Traditional credentials\") },\n { title: \"Google\", value: \"google\", description: chalk.gray(\"Google OAuth\") },\n { title: \"GitHub\", value: \"github\", description: chalk.gray(\"GitHub OAuth\") },\n { title: \"GitLab\", value: \"gitlab\", description: chalk.gray(\"GitLab OAuth\") },\n { title: \"Microsoft\", value: \"microsoft\", description: chalk.gray(\"Azure AD / Microsoft\") },\n { title: \"Apple\", value: \"apple\", description: chalk.gray(\"Sign in with Apple\") },\n { title: \"Facebook\", value: \"facebook\", description: chalk.gray(\"Facebook Login\") },\n { title: \"Twitter/X\", value: \"twitter\", description: chalk.gray(\"Twitter OAuth\") },\n { title: \"LinkedIn\", value: \"linkedin\", description: chalk.gray(\"LinkedIn OAuth\") },\n { title: \"Discord\", value: \"discord\", description: chalk.gray(\"Discord OAuth\") },\n { title: \"Slack\", value: \"slack\", description: chalk.gray(\"Slack OAuth\") },\n { title: \"Magic Link\", value: \"magic_link\", description: chalk.gray(\"Email magic links\") },\n { title: \"SMS OTP\", value: \"sms_otp\", description: chalk.gray(\"SMS verification codes\") },\n { title: \"Passkeys/WebAuthn\", value: \"passkeys\", description: chalk.gray(\"Passwordless biometric\") },\n { title: \"SAML SSO\", value: \"saml_sso\", description: chalk.gray(\"Enterprise SAML\") },\n { title: \"Generic OIDC\", value: \"oidc_generic\", description: chalk.gray(\"Custom OIDC provider\") },\n { title: \"LDAP/AD\", value: \"ldap\", description: chalk.gray(\"Directory services\") },\n { title: \"Other\", value: \"other\", description: chalk.gray(\"Custom provider\") },\n ],\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n answers.authProviders = authProvidersResponse.authProviders || [];\n\n // 2. Secrets Management\n console.log();\n console.log(chalk.cyan(\" 2️⃣ Secrets Management\"));\n console.log(chalk.gray(\" How do you manage secrets and credentials?\"));\n console.log();\n\n const secretsResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"secretsManagement\",\n message: chalk.white(\"Secrets management strategies (type to search):\"),\n choices: SECRETS_MANAGEMENT_OPTIONS.map(opt => ({\n title: opt.recommended \n ? `${opt.label} ${chalk.green(\"★ recommended\")}`\n : opt.label,\n value: opt.id,\n description: chalk.gray(opt.description),\n selected: opt.recommended,\n })),\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n answers.secretsManagement = secretsResponse.secretsManagement || [];\n\n // If \"other\" selected, ask for custom input\n if ((answers.secretsManagement as string[]).includes(\"other\")) {\n const customSecretsResponse = await prompts({\n type: \"text\",\n name: \"customSecretsManagement\",\n message: chalk.white(\"Describe your secrets management approach:\"),\n hint: chalk.gray(\"e.g., custom KMS integration, proprietary vault\"),\n }, promptConfig);\n answers.secretsManagementOther = customSecretsResponse.customSecretsManagement || \"\";\n }\n\n // 3. Security Tooling (includes Dependabot/Renovate - multi-select, searchable)\n console.log();\n console.log(chalk.cyan(\" 3️⃣ Security Tooling\"));\n console.log(chalk.gray(\" Security scanning, dependency updates, and vulnerability detection.\"));\n console.log();\n \n const securityToolingResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"securityTooling\",\n message: chalk.white(\"Security tools (type to search):\"),\n choices: SECURITY_TOOLING_OPTIONS.map(opt => ({\n title: opt.recommended \n ? `${opt.label} ${chalk.green(\"★ recommended\")}`\n : opt.label,\n value: opt.id,\n description: chalk.gray(opt.description),\n selected: opt.recommended,\n })),\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n answers.securityTooling = securityToolingResponse.securityTooling || [];\n\n // If \"other\" selected, ask for custom input\n if ((answers.securityTooling as string[]).includes(\"other\")) {\n const customSecurityToolingResponse = await prompts({\n type: \"text\",\n name: \"customSecurityTooling\",\n message: chalk.white(\"Describe your security tooling:\"),\n hint: chalk.gray(\"e.g., custom SAST tool, internal vulnerability scanner\"),\n }, promptConfig);\n answers.securityToolingOther = customSecurityToolingResponse.customSecurityTooling || \"\";\n }\n\n // 4. Authentication Patterns (multi-select, searchable)\n console.log();\n console.log(chalk.cyan(\" 4️⃣ Authentication Patterns\"));\n console.log(chalk.gray(\" How users and services authenticate with your application.\"));\n console.log();\n \n const authPatternsResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"authPatterns\",\n message: chalk.white(\"Auth patterns (type to search):\"),\n choices: AUTH_PATTERNS_OPTIONS.map(opt => ({\n title: opt.recommended \n ? `${opt.label} ${chalk.green(\"★ recommended\")}`\n : opt.label,\n value: opt.id,\n description: chalk.gray(opt.description),\n })),\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n answers.authPatterns = authPatternsResponse.authPatterns || [];\n\n // If \"other\" selected, ask for custom input\n if ((answers.authPatterns as string[]).includes(\"other\")) {\n const customAuthResponse = await prompts({\n type: \"text\",\n name: \"customAuthPatterns\",\n message: chalk.white(\"Describe your authentication approach:\"),\n hint: chalk.gray(\"e.g., custom SSO, proprietary auth system\"),\n }, promptConfig);\n answers.authPatternsOther = customAuthResponse.customAuthPatterns || \"\";\n }\n\n // 5. Data Handling (multi-select, searchable)\n console.log();\n console.log(chalk.cyan(\" 5️⃣ Data Handling & Compliance\"));\n console.log(chalk.gray(\" Data protection, encryption, and compliance requirements.\"));\n console.log();\n \n const dataHandlingResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"dataHandling\",\n message: chalk.white(\"Data handling policies (type to search):\"),\n choices: DATA_HANDLING_OPTIONS.map(opt => ({\n title: opt.recommended \n ? `${opt.label} ${chalk.green(\"★ recommended\")}`\n : opt.label,\n value: opt.id,\n description: chalk.gray(opt.description),\n selected: opt.recommended,\n })),\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n answers.dataHandling = dataHandlingResponse.dataHandling || [];\n\n // If \"other\" selected, ask for custom input\n if ((answers.dataHandling as string[]).includes(\"other\")) {\n const customDataHandlingResponse = await prompts({\n type: \"text\",\n name: \"customDataHandling\",\n message: chalk.white(\"Describe your data handling policies:\"),\n hint: chalk.gray(\"e.g., custom encryption, specific compliance requirements\"),\n }, promptConfig);\n answers.dataHandlingOther = customDataHandlingResponse.customDataHandling || \"\";\n }\n\n // 6. Compliance Standards\n console.log();\n console.log(chalk.cyan(\" 6️⃣ Compliance Standards\"));\n console.log(chalk.gray(\" Regulatory compliance requirements for your application.\"));\n console.log();\n\n const complianceResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"compliance\",\n message: chalk.white(\"Compliance standards (type to search):\"),\n choices: [\n { title: \"GDPR - EU data protection\", value: \"gdpr\" },\n { title: \"CCPA - California privacy\", value: \"ccpa\" },\n { title: \"HIPAA - Healthcare data\", value: \"hipaa\" },\n { title: \"SOC 2 - Service controls\", value: \"soc2\" },\n { title: \"PCI-DSS - Payment card data\", value: \"pci_dss\" },\n { title: \"ISO 27001 - Information security\", value: \"iso27001\" },\n { title: \"FedRAMP - US federal cloud\", value: \"fedramp\" },\n { title: \"Other\", value: \"other\" },\n ],\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n answers.compliance = complianceResponse.compliance || [];\n\n // 7. Analytics & Telemetry\n console.log();\n console.log(chalk.cyan(\" 7️⃣ Analytics & Telemetry\"));\n console.log(chalk.gray(\" Usage analytics and monitoring solutions.\"));\n console.log();\n\n const analyticsResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"analytics\",\n message: chalk.white(\"Analytics tools (type to search):\"),\n choices: [\n { title: \"Google Analytics (GA4)\", value: \"google_analytics\" },\n { title: \"Plausible - Privacy-focused\", value: \"plausible\" },\n { title: \"PostHog - Product analytics\", value: \"posthog\" },\n { title: \"Mixpanel - Event analytics\", value: \"mixpanel\" },\n { title: \"Amplitude - Product analytics\", value: \"amplitude\" },\n { title: \"Segment - Data pipeline\", value: \"segment\" },\n { title: \"Umami - Self-hosted analytics\", value: \"umami\" },\n { title: \"Matomo - Self-hosted (Piwik)\", value: \"matomo\" },\n { title: \"No Analytics - Privacy-first approach\", value: \"none\" },\n { title: \"Other\", value: \"other\" },\n ],\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n answers.analytics = analyticsResponse.analytics || [];\n\n // Additional security notes\n const securityNotesResponse = await prompts({\n type: \"text\",\n name: \"securityNotes\",\n message: chalk.white(\"Additional security notes (optional):\"),\n hint: chalk.gray(\"e.g., specific compliance requirements, custom security practices\"),\n }, promptConfig);\n answers.securityNotes = securityNotesResponse.securityNotes || \"\";\n\n // Show security summary\n console.log();\n console.log(chalk.green(\" ✓ Security configuration complete:\"));\n if ((answers.authProviders as string[]).length > 0) {\n console.log(chalk.gray(` • Auth Providers: ${(answers.authProviders as string[]).join(\", \")}`));\n }\n if ((answers.secretsManagement as string[]).length > 0) {\n console.log(chalk.gray(` • Secrets: ${(answers.secretsManagement as string[]).join(\", \")}`));\n }\n if ((answers.securityTooling as string[]).length > 0) {\n console.log(chalk.gray(` • Tooling: ${(answers.securityTooling as string[]).join(\", \")}`));\n }\n if ((answers.authPatterns as string[]).length > 0) {\n console.log(chalk.gray(` • Auth Patterns: ${(answers.authPatterns as string[]).join(\", \")}`));\n }\n if ((answers.dataHandling as string[]).length > 0) {\n console.log(chalk.gray(` • Data: ${(answers.dataHandling as string[]).join(\", \")}`));\n }\n if ((answers.compliance as string[]).length > 0) {\n console.log(chalk.gray(` • Compliance: ${(answers.compliance as string[]).join(\", \")}`));\n }\n if ((answers.analytics as string[]).length > 0) {\n console.log(chalk.gray(` • Analytics: ${(answers.analytics as string[]).join(\", \")}`));\n }\n\n // ═══════════════════════════════════════════════════════════════\n // STEP 6: Commands (intermediate)\n // (was STEP 5 before Security step added)\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 (type to search):\"));\n console.log();\n\n // Build commands - autocomplete for searching\n const buildChoices = sortSelectedFirst(COMMON_COMMANDS.build.map(c => {\n const isDetected = detected?.commands?.build === c;\n return {\n title: isDetected ? `${chalk.cyan(c)} ${chalk.green(\"(detected)\")}` : chalk.cyan(c),\n value: c,\n selected: isDetected,\n };\n }));\n const buildResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"build\",\n message: chalk.white(\"Build commands (type to search):\"),\n choices: buildChoices,\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n\n // Test commands - autocomplete for searching\n const testChoices = sortSelectedFirst(COMMON_COMMANDS.test.map(c => {\n const isDetected = detected?.commands?.test === c;\n return {\n title: isDetected ? `${chalk.yellow(c)} ${chalk.green(\"(detected)\")}` : chalk.yellow(c),\n value: c,\n selected: isDetected,\n };\n }));\n const testResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"test\",\n message: chalk.white(\"Test commands (type to search):\"),\n choices: testChoices,\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n\n // Lint commands - autocomplete for searching\n const lintChoices = sortSelectedFirst(COMMON_COMMANDS.lint.map(c => {\n const isDetected = detected?.commands?.lint === c;\n return {\n title: isDetected ? `${chalk.green(c)} ${chalk.green(\"(detected)\")}` : chalk.green(c),\n value: c,\n selected: isDetected,\n };\n }));\n const lintResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"lint\",\n message: chalk.white(\"Lint/format commands (type to search):\"),\n choices: lintChoices,\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n\n // Dev commands - autocomplete for searching\n const devChoices = sortSelectedFirst(COMMON_COMMANDS.dev.map(c => {\n const isDetected = detected?.commands?.dev === c;\n return {\n title: isDetected ? `${chalk.magenta(c)} ${chalk.green(\"(detected)\")}` : chalk.magenta(c),\n value: c,\n selected: isDetected,\n };\n }));\n const devResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"dev\",\n message: chalk.white(\"Dev server commands (type to search):\"),\n choices: devChoices,\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n\n // Format commands - autocomplete for searching\n const formatResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"format\",\n message: chalk.white(\"Format commands (type to search):\"),\n choices: COMMON_COMMANDS.format.map(c => ({\n title: chalk.blue(c),\n value: c,\n })),\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n\n // Typecheck commands - autocomplete for searching\n const typecheckResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"typecheck\",\n message: chalk.white(\"Typecheck commands (type to search):\"),\n choices: COMMON_COMMANDS.typecheck.map(c => ({\n title: chalk.gray(c),\n value: c,\n })),\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n\n // Clean commands - autocomplete for searching\n const cleanResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"clean\",\n message: chalk.white(\"Clean commands (type to search):\"),\n choices: COMMON_COMMANDS.clean.map(c => ({\n title: chalk.red(c),\n value: c,\n })),\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n\n // Pre-commit commands - autocomplete for searching\n const preCommitResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"preCommit\",\n message: chalk.white(\"Pre-commit hooks (type to search):\"),\n choices: COMMON_COMMANDS.preCommit.map(c => ({\n title: chalk.yellow(c),\n value: c,\n })),\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n\n // Additional commands - autocomplete for searching\n const additionalResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"additional\",\n message: chalk.white(\"Additional commands (type to search):\"),\n choices: COMMON_COMMANDS.additional.map(c => ({\n title: chalk.blue(c),\n value: c,\n })),\n hint: chalk.gray(\"type to filter • 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 format: formatResponse.format || [],\n typecheck: typecheckResponse.typecheck || [],\n clean: cleanResponse.clean || [],\n preCommit: preCommitResponse.preCommit || [],\n additional: additionalResponse.additional || [],\n };\n\n // Custom command\n const customCmdResponse = await prompts({\n type: \"text\",\n name: \"custom\",\n message: chalk.white(\"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 7: Code Style (intermediate)\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: [\n { title: chalk.gray(\"⏭ Skip\"), value: \"\" },\n ...NAMING_CONVENTIONS.map(n => ({\n title: n.id === \"language_default\" \n ? `${n.label} ${chalk.green(\"★ recommended\")}`\n : n.label,\n value: n.id,\n description: chalk.gray(n.desc),\n })),\n ],\n initial: 1, // Pre-select \"Follow language conventions\"\n }, promptConfig);\n answers.namingConvention = namingResponse.naming || \"\";\n\n const errorResponse = await prompts({\n type: \"select\",\n name: \"errorHandling\",\n message: chalk.white(\"Error handling pattern:\"),\n choices: [\n { title: chalk.gray(\"⏭ Skip\"), value: \"\" },\n ...ERROR_PATTERNS.map(e => ({\n title: e.label,\n value: e.id,\n })),\n ],\n initial: 0,\n }, promptConfig);\n answers.errorHandling = errorResponse.errorHandling || \"\";\n \n // If \"other\" selected, ask for custom input\n if (answers.errorHandling === \"other\") {\n const customErrorResponse = await prompts({\n type: \"text\",\n name: \"customErrorHandling\",\n message: chalk.white(\"Describe your error handling approach:\"),\n hint: chalk.gray(\"e.g., Railway-oriented, custom error boundaries\"),\n }, promptConfig);\n answers.errorHandlingOther = customErrorResponse.customErrorHandling || \"\";\n }\n\n // Logging conventions - searchable select like WebUI\n const loggingResponse = await prompts({\n type: \"autocomplete\",\n name: \"loggingConventions\",\n message: chalk.white(\"Logging conventions (type to search):\"),\n choices: [\n { title: chalk.gray(\"⏭ Skip\"), value: \"\" },\n ...LOGGING_OPTIONS.map(l => ({\n title: l.label,\n value: l.id,\n })),\n ],\n initial: 0,\n }, promptConfig);\n answers.loggingConventions = loggingResponse.loggingConventions || \"\";\n \n // If \"other\" selected, ask for custom input\n if (answers.loggingConventions === \"other\") {\n const customLoggingResponse = await prompts({\n type: \"text\",\n name: \"customLogging\",\n message: chalk.white(\"Describe your logging convention:\"),\n hint: chalk.gray(\"e.g., custom logger, file-based logging\"),\n }, promptConfig);\n answers.loggingConventionsOther = customLoggingResponse.customLogging || \"\";\n }\n\n // Max file length\n const maxFileLengthResponse = await prompts({\n type: \"number\",\n name: \"maxFileLength\",\n message: chalk.white(\"Max file length (lines, 100-1000):\"),\n initial: 300,\n min: 100,\n max: 1000,\n }, promptConfig);\n answers.maxFileLength = maxFileLengthResponse.maxFileLength || 300;\n\n // Import order\n const importOrderResponse = await prompts({\n type: \"select\",\n name: \"importOrder\",\n message: chalk.white(\"Import order preference:\"),\n choices: [\n { title: \"Grouped (external → internal → relative)\", value: \"grouped\" },\n { title: \"Alphabetical (sort A-Z)\", value: \"sorted\" },\n { title: \"Natural (leave as written)\", value: \"natural\" },\n ],\n initial: 0,\n }, promptConfig);\n answers.importOrder = importOrderResponse.importOrder || \"grouped\";\n\n // Comment language\n const commentLangResponse = await prompts({\n type: \"select\",\n name: \"commentLanguage\",\n message: chalk.white(\"Comment language:\"),\n choices: [\n { title: \"🇬🇧 English\", value: \"english\" },\n { title: \"🌍 Native language\", value: \"native\" },\n { title: \"🗣️ Any (team preference)\", value: \"any\" },\n ],\n initial: 0,\n }, promptConfig);\n answers.commentLanguage = commentLangResponse.commentLanguage || \"english\";\n\n // Documentation style\n const docStyleResponse = await prompts({\n type: \"select\",\n name: \"docStyle\",\n message: chalk.white(\"Documentation style:\"),\n choices: [\n { title: chalk.gray(\"⏭ Skip (language default)\"), value: \"\" },\n { title: \"JSDoc\", value: \"jsdoc\" },\n { title: \"TSDoc\", value: \"tsdoc\" },\n { title: \"Python docstrings\", value: \"pydoc\" },\n { title: \"Go doc comments\", value: \"godoc\" },\n { title: \"Rust doc (///)\", value: \"rustdoc\" },\n { title: \"Javadoc\", value: \"javadoc\" },\n { title: \"C# XML docs\", value: \"xmldoc\" },\n ],\n initial: 0,\n }, promptConfig);\n answers.docStyle = docStyleResponse.docStyle || \"\";\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 8: AI Behavior (basic - all users)\n // ═══════════════════════════════════════════════════════════════\n const aiStep = getCurrentStep(\"ai\")!;\n showStep(currentStepNum, aiStep, userTier);\n \n const aiBehaviorResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"aiBehavior\",\n message: chalk.white(\"AI behavior rules (type to filter):\"),\n choices: AI_BEHAVIOR_RULES.map(r => ({\n title: r.recommended \n ? `${r.label} ${chalk.green(\"★ recommended\")}`\n : r.label,\n value: r.id,\n description: chalk.gray(r.description),\n selected: true, // All selected by default\n })),\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n answers.aiBehavior = aiBehaviorResponse.aiBehavior || AI_BEHAVIOR_RULES.map(r => r.id);\n \n // Show selected rules in newlines\n if ((answers.aiBehavior as string[]).length > 0) {\n console.log(chalk.green(\" ✓ Selected:\"));\n for (const ruleId of (answers.aiBehavior as string[])) {\n const rule = AI_BEHAVIOR_RULES.find(r => r.id === ruleId);\n if (rule) console.log(chalk.cyan(` • ${rule.label}`));\n }\n }\n\n // Plan mode frequency\n const planModeResponse = await prompts({\n type: \"select\",\n name: \"planModeFrequency\",\n message: chalk.white(\"When should AI enter plan mode before changes?\"),\n choices: [\n { title: \"Always - Plan before every task\", value: \"always\" },\n { title: \"Complex Tasks - Multi-step or risky changes\", value: \"complex_tasks\" },\n { title: \"Multi-file Changes - When touching multiple files\", value: \"multi_file\" },\n { title: \"New Features Only - Only for new functionality\", value: \"new_features\" },\n { title: \"On Request - Only when explicitly asked\", value: \"on_request\" },\n { title: \"Never - Skip planning entirely\", value: \"never\" },\n ],\n initial: 1, // Default to complex_tasks\n }, promptConfig);\n answers.planModeFrequency = planModeResponse.planModeFrequency || \"complex_tasks\";\n\n // Explanation verbosity\n const verbosityResponse = await prompts({\n type: \"select\",\n name: \"explanationVerbosity\",\n message: chalk.white(\"Explanation verbosity:\"),\n choices: [\n { title: \"📝 Concise - Brief, to the point\", value: \"concise\" },\n { title: \"⚖️ Balanced - Clear with context\", value: \"balanced\" },\n { title: \"📚 Detailed - In-depth explanations\", value: \"detailed\" },\n ],\n initial: 1,\n }, promptConfig);\n answers.explanationVerbosity = verbosityResponse.explanationVerbosity || \"balanced\";\n\n // Focus areas\n const accessibilityResponse = await prompts({\n type: \"toggle\",\n name: \"accessibilityFocus\",\n message: chalk.white(\"Prioritize accessibility (WCAG, a11y)?\"),\n initial: false,\n active: \"Yes\",\n inactive: \"No\",\n }, promptConfig);\n answers.accessibilityFocus = accessibilityResponse.accessibilityFocus ?? false;\n\n const performanceResponse = await prompts({\n type: \"toggle\",\n name: \"performanceFocus\",\n message: chalk.white(\"Prioritize performance optimizations?\"),\n initial: false,\n active: \"Yes\",\n inactive: \"No\",\n }, promptConfig);\n answers.performanceFocus = performanceResponse.performanceFocus ?? false;\n\n console.log();\n console.log(chalk.gray(\" 📁 Select files the AI should read first to understand your project context.\"));\n console.log(chalk.gray(\" These help the AI understand your codebase, APIs, and conventions.\"));\n const importantFilesResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"importantFiles\",\n message: chalk.white(\"Important files AI should read (type to search):\"),\n choices: IMPORTANT_FILES.map(f => ({\n title: `${f.icon} ${f.label}`,\n value: f.id,\n description: chalk.gray(f.description),\n })),\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n answers.importantFiles = importantFilesResponse.importantFiles || [];\n\n // Ask for custom important files\n console.log();\n const customImportantFilesResponse = await prompts({\n type: \"text\",\n name: \"importantFilesOther\",\n message: chalk.white(\"Other important files (comma-separated, optional):\"),\n hint: chalk.gray(\"e.g., src/config/index.ts, docs/api.md, prisma/schema.prisma\"),\n }, promptConfig);\n answers.importantFilesOther = customImportantFilesResponse.importantFilesOther || \"\";\n\n // Cloud sync & AI learning options (grouped together)\n console.log();\n console.log(chalk.gray(\" ─── Cloud & AI Options ───\"));\n console.log();\n \n // Self-improving config - instruct AI to suggest improvements\n console.log(chalk.gray(\" 🧠 Write instructions in the generated config telling AI it can suggest improvements.\"));\n console.log(chalk.gray(\" The AI will learn your patterns and propose better rules, new conventions,\"));\n console.log(chalk.gray(\" and optimizations over time. You review and approve any changes.\"));\n const selfImproveResponse = await prompts({\n type: \"toggle\",\n name: \"selfImprove\",\n message: chalk.white(\"Enable self-improving AI config rules?\"),\n initial: false,\n active: \"Yes\",\n inactive: \"No\",\n hint: chalk.gray(\"Instructs AI to suggest improvements\"),\n }, promptConfig);\n answers.selfImprove = selfImproveResponse.selfImprove || false;\n\n // Cloud sync - save to cloud and enable synchronization\n console.log();\n console.log(chalk.gray(\" ☁️ Store your config on LynxPrompt cloud for team sharing and version control.\"));\n console.log(chalk.gray(\" Benefits:\"));\n console.log(chalk.gray(\" • Share configs across devices and team members\"));\n console.log(chalk.gray(\" • Track changes and rollback if needed\"));\n console.log(chalk.gray(\" • Instructions added to config so AI can sync automatically\"));\n const enableAutoUpdateResponse = await prompts({\n type: \"toggle\",\n name: \"enableAutoUpdate\",\n message: chalk.white(\"Enable cloud synchronization?\"),\n initial: false,\n active: \"Yes\",\n inactive: \"No\",\n hint: chalk.gray(\"Enables push/pull/diff with LynxPrompt cloud\"),\n }, promptConfig);\n answers.enableAutoUpdate = enableAutoUpdateResponse.enableAutoUpdate || false;\n\n // Ask about CLI availability when cloud sync enabled\n answers.preferCliSync = true; // Default to CLI\n answers.tokenEnvVar = \"LYNXPROMPT_API_TOKEN\"; // Default env var name\n \n if (answers.enableAutoUpdate && api) {\n console.log();\n console.log(chalk.gray(\" 📦 How should the AI perform sync operations?\"));\n console.log();\n console.log(chalk.green.bold(\" CLI (Recommended):\"));\n console.log(chalk.gray(\" • Most secure - no tokens stored anywhere\"));\n console.log(chalk.gray(\" • AI runs lynxp commands directly\"));\n console.log(chalk.gray(\" • Requires CLI installed: npm install -g lynxprompt\"));\n console.log();\n console.log(chalk.yellow(\" curl/token/env variable:\"));\n console.log(chalk.gray(\" • Works without CLI installed\"));\n console.log(chalk.gray(\" • Token stored in environment variable (not in file)\"));\n console.log(chalk.gray(\" • Less convenient but still secure\"));\n console.log();\n \n const syncMethodResponse = await prompts({\n type: \"toggle\",\n name: \"preferCliSync\",\n message: chalk.white(\"Will LynxPrompt CLI be available in your dev environment?\"),\n initial: true, // Default to yes - strongly recommended\n active: \"Yes, use CLI (recommended)\",\n inactive: \"No, use curl/token/env variable\",\n hint: chalk.green(\"Strongly recommended for security\"),\n }, promptConfig);\n answers.preferCliSync = syncMethodResponse.preferCliSync ?? true;\n \n if (answers.preferCliSync) {\n console.log(chalk.green(\" ✓ Perfect! Config will include lynxp CLI commands for syncing\"));\n console.log(chalk.gray(\" Make sure CLI is installed: npm install -g lynxprompt\"));\n } else {\n // Ask for env var name where token will be stored\n console.log();\n console.log(chalk.gray(\" 🔐 Config will include curl commands using an environment variable.\"));\n console.log(chalk.gray(\" Your API token will NOT be stored in the config file.\"));\n const envVarResponse = await prompts({\n type: \"text\",\n name: \"tokenEnvVar\",\n message: chalk.white(\"Environment variable name for API token:\"),\n initial: \"LYNXPROMPT_API_TOKEN\",\n hint: chalk.gray(\"e.g., LYNXPROMPT_API_TOKEN, LP_TOKEN\"),\n }, promptConfig);\n answers.tokenEnvVar = envVarResponse.tokenEnvVar || \"LYNXPROMPT_API_TOKEN\";\n console.log(chalk.green(` ✓ Config will reference $${answers.tokenEnvVar}`));\n console.log(chalk.gray(` Remember to set: export ${answers.tokenEnvVar}=\"your_token_here\"`));\n }\n }\n\n if (answers.enableAutoUpdate && !api) {\n console.log(chalk.yellow(\" ⚠️ Cloud sync requires login. Run 'lynxp login' first.\"));\n console.log(chalk.gray(\" Continuing without cloud sync...\"));\n answers.enableAutoUpdate = false;\n }\n \n // If multiple output formats selected AND cloud sync enabled, ask which to upload\n const selectedPlatforms = answers.platforms as string[];\n if (answers.enableAutoUpdate && selectedPlatforms && selectedPlatforms.length > 1) {\n console.log();\n console.log(chalk.yellow(\" ⚠️ You selected multiple output formats but only one can be synced to cloud.\"));\n const primaryFormatResponse = await prompts({\n type: \"select\",\n name: \"primaryFormat\",\n message: chalk.white(\"Which format should be the cloud-synced version?\"),\n choices: selectedPlatforms.map(p => ({ title: p, value: p })),\n hint: chalk.gray(\"This version will be uploaded to LynxPrompt cloud\"),\n }, promptConfig);\n answers.primarySyncFormat = primaryFormatResponse.primaryFormat || selectedPlatforms[0];\n console.log(chalk.green(` ✓ ${answers.primarySyncFormat} will be synced to cloud, others are local-only`));\n }\n\n // Include personal data from profile\n console.log();\n console.log(chalk.gray(\" 👤 Include your profile info (name, email, persona) in the generated config.\"));\n console.log(chalk.gray(\" This helps AI tools personalize responses to your expertise level.\"));\n const includePersonalResponse = await prompts({\n type: \"toggle\",\n name: \"includePersonalData\",\n message: chalk.white(\"Include your profile data in config?\"),\n initial: false,\n active: \"Yes\",\n inactive: \"No\",\n hint: chalk.gray(\"Name, email, expertise from your profile\"),\n }, promptConfig);\n answers.includePersonalData = includePersonalResponse.includePersonalData || false;\n\n // If personal data enabled, fetch user profile from API\n if (answers.includePersonalData && api) {\n try {\n console.log(chalk.gray(\" Fetching profile from LynxPrompt...\"));\n const userResponse = await api.getUser();\n if (userResponse.user) {\n answers.userName = userResponse.user.name || userResponse.user.display_name || \"\";\n answers.userEmail = userResponse.user.email || \"\";\n answers.userPersona = userResponse.user.persona || \"\";\n // skill_level can serve as expertise\n answers.userExpertise = userResponse.user.skill_level || \"\";\n console.log(chalk.green(\" ✓ Profile loaded\"));\n }\n } catch {\n console.log(chalk.yellow(\" Could not fetch profile data. Using defaults.\"));\n }\n }\n\n // ═══════════════════════════════════════════════════════════════\n // STEP 9: Boundaries (advanced)\n // ═══════════════════════════════════════════════════════════════\n if (canAccessTier(userTier, \"advanced\")) {\n const boundariesStep = getCurrentStep(\"boundaries\")!;\n showStep(currentStepNum, boundariesStep, userTier);\n\n console.log(chalk.gray(\" Define what AI should never do, ask first, or always do.\"));\n console.log(chalk.gray(\" Each option can only be in one category.\"));\n console.log();\n\n // Track used options to filter them out from subsequent questions\n const usedOptions = new Set<string>();\n\n // 1. NEVER do - AI will refuse to do (ask first - most restrictive)\n console.log(chalk.red.bold(\" ✗ NEVER ALLOW - AI will refuse to do\"));\n const neverResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"never\",\n message: chalk.white(\"Never allow (type to filter):\"),\n choices: BOUNDARY_OPTIONS.map(o => ({\n title: chalk.red(o),\n value: o,\n })),\n hint: chalk.gray(\"space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n answers.boundaryNever = neverResponse.never || [];\n (answers.boundaryNever as string[]).forEach(o => usedOptions.add(o));\n\n // 2. ASK first - AI will ask before doing\n console.log();\n console.log(chalk.yellow.bold(\" ? ASK FIRST - AI will ask before doing\"));\n const availableForAsk = BOUNDARY_OPTIONS.filter(o => !usedOptions.has(o));\n const askResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"ask\",\n message: chalk.white(\"Ask first (type to filter):\"),\n choices: availableForAsk.map(o => ({\n title: chalk.yellow(o),\n value: o,\n })),\n hint: chalk.gray(\"space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n answers.boundaryAsk = askResponse.ask || [];\n (answers.boundaryAsk as string[]).forEach(o => usedOptions.add(o));\n\n // 3. ALWAYS do - AI will do these automatically\n console.log();\n console.log(chalk.green.bold(\" ✓ ALWAYS ALLOW - AI will do these automatically\"));\n const availableForAlways = BOUNDARY_OPTIONS.filter(o => !usedOptions.has(o));\n const alwaysResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"always\",\n message: chalk.white(\"Always allow (type to filter):\"),\n choices: availableForAlways.map(o => ({\n title: chalk.green(o),\n value: o,\n })),\n hint: chalk.gray(\"space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n answers.boundaryAlways = alwaysResponse.always || [];\n\n // Show summary\n console.log();\n console.log(chalk.gray(\" Boundary summary:\"));\n if ((answers.boundaryAlways as string[]).length > 0) {\n console.log(chalk.green(` ✓ Always: ${(answers.boundaryAlways as string[]).join(\", \")}`));\n }\n if ((answers.boundaryAsk as string[]).length > 0) {\n console.log(chalk.yellow(` ? Ask: ${(answers.boundaryAsk as string[]).join(\", \")}`));\n }\n if ((answers.boundaryNever as string[]).length > 0) {\n console.log(chalk.red(` ✗ Never: ${(answers.boundaryNever as string[]).join(\", \")}`));\n }\n } else {\n answers.boundaries = options.boundaries || \"standard\";\n }\n\n // ═══════════════════════════════════════════════════════════════\n // STEP 10: Testing Strategy (advanced)\n // ═══════════════════════════════════════════════════════════════\n if (canAccessTier(userTier, \"advanced\")) {\n const testingStep = getCurrentStep(\"testing\")!;\n showStep(currentStepNum, testingStep, userTier);\n\n const testLevelsResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"testLevels\",\n message: chalk.white(\"Test levels (type to search):\"),\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 hint: chalk.gray(\"type to filter • space select • enter confirm\"),\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 // Full list of test frameworks with search - expanded to match WebUI\n const testFrameworkChoices = sortSelectedFirst(TEST_FRAMEWORKS.map(f => ({\n title: f,\n value: f,\n selected: detectedFrameworks.includes(f),\n })));\n const testFrameworkResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"testFrameworks\",\n message: chalk.white(\"Testing frameworks (type to search):\"),\n choices: testFrameworkChoices,\n hint: chalk.gray(\"type to filter • 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 // TDD Preference\n const tddResponse = await prompts({\n type: \"toggle\",\n name: \"tddPreference\",\n message: chalk.white(\"Use Test-Driven Development (TDD)?\"),\n initial: false,\n active: \"Yes\",\n inactive: \"No\",\n }, promptConfig);\n answers.tddPreference = tddResponse.tddPreference ?? false;\n\n // Snapshot Testing\n const snapshotResponse = await prompts({\n type: \"toggle\",\n name: \"snapshotTesting\",\n message: chalk.white(\"Use snapshot testing?\"),\n initial: false,\n active: \"Yes\",\n inactive: \"No\",\n }, promptConfig);\n answers.snapshotTesting = snapshotResponse.snapshotTesting ?? false;\n\n // Mock Strategy\n const mockResponse = await prompts({\n type: \"select\",\n name: \"mockStrategy\",\n message: chalk.white(\"Mock strategy:\"),\n choices: [\n { title: \"Minimal - Only mock external dependencies\", value: \"minimal\" },\n { title: \"Comprehensive - Mock for isolation\", value: \"comprehensive\" },\n { title: \"None - No mocking preferred\", value: \"none\" },\n ],\n initial: 0,\n }, promptConfig);\n answers.mockStrategy = mockResponse.mockStrategy || \"minimal\";\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 11: Static Files (advanced)\n // ═══════════════════════════════════════════════════════════════\n if (canAccessTier(userTier, \"advanced\")) {\n const staticStep = getCurrentStep(\"static\")!;\n showStep(currentStepNum, staticStep, userTier);\n\n // First, ask how to handle static files\n console.log(chalk.gray(\" How should static file content be handled?\"));\n console.log();\n console.log(chalk.gray(\" 📄 Config only: Content embedded in AI config file (AI has context, no local files)\"));\n console.log(chalk.gray(\" 📁 Both: Create local files AND embed content in AI config file\"));\n console.log();\n \n const staticFileHandlingResponse = await prompts({\n type: \"select\",\n name: \"handling\",\n message: chalk.white(\"Where to add static file content?\"),\n choices: [\n { title: \"📄 Config file only (recommended)\", value: \"config_only\", description: \"Content goes in AI config, no separate files created\" },\n { title: \"📁 Both local files AND config\", value: \"both\", description: \"Create files locally AND embed in AI config\" },\n ],\n initial: 0,\n }, promptConfig);\n answers.staticFileHandling = staticFileHandlingResponse.handling || \"config_only\";\n\n console.log();\n console.log(chalk.gray(\" Select project files to include:\"));\n console.log();\n\n // Static file options with metadata\n const STATIC_FILE_OPTIONS = [\n { title: \"📝 .editorconfig\", value: \"editorconfig\", desc: \"Consistent code formatting\" },\n { title: \"🤝 CONTRIBUTING.md\", value: \"contributing\", desc: \"Contributor guidelines\" },\n { title: \"📜 CODE_OF_CONDUCT.md\", value: \"codeOfConduct\", desc: \"Community standards\" },\n { title: \"🔒 SECURITY.md\", value: \"security\", desc: \"Vulnerability reporting\" },\n { title: \"🗺️ ROADMAP.md\", value: \"roadmap\", desc: \"Project roadmap\" },\n { title: \"📋 .gitignore\", value: \"gitignore\", desc: \"Git ignore patterns\" },\n { title: \"💰 FUNDING.yml\", value: \"funding\", desc: \"GitHub Sponsors config\" },\n { title: \"📄 LICENSE\", value: \"license\", desc: \"License file\" },\n { title: \"📖 README.md\", value: \"readme\", desc: \"Project readme\" },\n { title: \"🏗️ ARCHITECTURE.md\", value: \"architecture\", desc: \"Architecture docs\" },\n { title: \"📝 CHANGELOG.md\", value: \"changelog\", desc: \"Version history\" },\n ];\n\n // Detect existing files\n const existingFiles: Record<string, string> = {};\n for (const opt of STATIC_FILE_OPTIONS) {\n const filePath = STATIC_FILE_PATHS[opt.value];\n if (filePath) {\n const content = await readExistingFile(join(process.cwd(), filePath));\n if (content) {\n existingFiles[opt.value] = content;\n }\n }\n }\n\n const existingCount = Object.keys(existingFiles).length;\n if (existingCount > 0) {\n console.log(chalk.green(` ✓ Found ${existingCount} existing file(s) in your project`));\n console.log();\n }\n\n const staticFilesResponse = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"staticFiles\",\n message: chalk.white(\"Include static files (type to search):\"),\n choices: STATIC_FILE_OPTIONS.map(f => ({\n title: existingFiles[f.value] \n ? `${f.title} ${chalk.green(\"(exists)\")}`\n : f.title,\n value: f.value,\n description: chalk.gray(f.desc),\n })),\n hint: chalk.gray(\"type to filter • space select • enter confirm\"),\n instructions: false,\n }, promptConfig);\n answers.staticFiles = staticFilesResponse.staticFiles || [];\n\n // For each selected file, prompt for content\n if ((answers.staticFiles as string[])?.length > 0) {\n console.log();\n console.log(chalk.cyan(\" 📝 Customize file contents:\"));\n console.log(chalk.gray(\" For each file, choose to use existing content, write new, or use defaults.\"));\n if (canAccessAI(userTier)) {\n console.log(chalk.magenta(` ✨ Tip: Type 'ai:' followed by your request to use AI assistance`));\n }\n console.log();\n\n answers.staticFileContents = {};\n \n for (const fileKey of (answers.staticFiles as string[])) {\n const fileOpt = STATIC_FILE_OPTIONS.find(f => f.value === fileKey);\n if (!fileOpt) continue;\n\n const filePath = STATIC_FILE_PATHS[fileKey];\n const existingContent = existingFiles[fileKey];\n\n if (existingContent) {\n // File exists - ask what to do\n const preview = existingContent.split(\"\\n\").slice(0, 3).join(\"\\n\");\n console.log(chalk.gray(` ─── ${filePath} (existing) ───`));\n console.log(chalk.gray(preview.substring(0, 150) + (preview.length > 150 ? \"...\" : \"\")));\n console.log();\n\n const actionResponse = await prompts({\n type: \"select\",\n name: \"action\",\n message: chalk.white(`${filePath}:`),\n choices: [\n { title: chalk.green(\"✓ Use existing content\"), value: \"existing\" },\n { title: chalk.yellow(\"✏️ Write new content\"), value: \"new\" },\n { title: chalk.gray(\"⚡ Generate default\"), value: \"default\" },\n ],\n initial: 0,\n }, promptConfig);\n\n if (actionResponse.action === \"existing\") {\n (answers.staticFileContents as Record<string, string>)[fileKey] = existingContent;\n } else if (actionResponse.action === \"new\") {\n console.log();\n const content = await readMultilineInput(` Content for ${filePath}:`);\n if (content.trim()) {\n (answers.staticFileContents as Record<string, string>)[fileKey] = content;\n }\n }\n // \"default\" - don't add to staticFileContents, generator will create default\n } else {\n // File doesn't exist - ask if they want to write content\n const actionResponse = await prompts({\n type: \"select\",\n name: \"action\",\n message: chalk.white(`${filePath}:`),\n choices: [\n { title: chalk.gray(\"⚡ Generate default\"), value: \"default\" },\n { title: chalk.yellow(\"✏️ Write custom content\"), value: \"new\" },\n ],\n initial: 0,\n }, promptConfig);\n\n if (actionResponse.action === \"new\") {\n console.log();\n if (canAccessAI(userTier)) {\n const aiPromptResponse = await prompts({\n type: \"text\",\n name: \"input\",\n message: chalk.white(`Content for ${filePath}:`),\n hint: chalk.gray(\"Type 'ai:' + description OR paste content (press Enter twice to skip)\"),\n }, promptConfig);\n \n let content = aiPromptResponse.input || \"\";\n \n if (content.toLowerCase().startsWith(\"ai:\")) {\n const aiInstruction = content.substring(3).trim();\n if (aiInstruction) {\n const aiResult = await aiAssist(`Generate ${filePath} content: ${aiInstruction}`, existingContent);\n if (aiResult) {\n console.log(chalk.cyan(\" AI-generated content preview (first 200 chars):\"));\n console.log(chalk.gray(\" \" + aiResult.substring(0, 200) + (aiResult.length > 200 ? \"...\" : \"\")));\n const acceptAI = await prompts({\n type: \"confirm\",\n name: \"accept\",\n message: chalk.white(\"Use this AI-generated content?\"),\n initial: true,\n }, promptConfig);\n if (acceptAI.accept) {\n content = aiResult;\n } else {\n content = \"\";\n }\n }\n }\n }\n \n if (content.trim()) {\n (answers.staticFileContents as Record<string, string>)[fileKey] = content;\n }\n } else {\n const content = await readMultilineInput(` Content for ${filePath}:`);\n if (content.trim()) {\n (answers.staticFileContents as Record<string, string>)[fileKey] = content;\n }\n }\n }\n }\n console.log();\n }\n }\n }\n\n // ═══════════════════════════════════════════════════════════════\n // STEP 12: Final Details / Extra (basic - all users)\n // ═══════════════════════════════════════════════════════════════\n const extraStep = getCurrentStep(\"extra\")!;\n showStep(currentStepNum, extraStep, userTier);\n\n // AI persona is handled from profile settings, not asked here\n // (Users can set their persona in the web UI under AI Configuration)\n answers.persona = \"\";\n\n // Anything else - with AI assist option for Teams users\n const hasAIAccess = canAccessAI(userTier);\n \n if (hasAIAccess) {\n console.log();\n console.log(chalk.magenta(\" ✨ AI Assistant available\"));\n console.log(chalk.gray(\" Type 'ai:' followed by your request to get AI-generated content.\"));\n console.log(chalk.gray(\" Example: ai: add guidelines for API error handling\"));\n console.log();\n }\n\n const extraNotesResponse = await prompts({\n type: \"text\",\n name: \"extraNotes\",\n message: chalk.white(\"Anything else AI should know? (optional):\"),\n hint: hasAIAccess \n ? chalk.gray(\"Enter text or type 'ai:' followed by your request\")\n : chalk.gray(\"Special requirements, gotchas, team conventions...\"),\n }, promptConfig);\n \n let extraNotes = extraNotesResponse.extraNotes || \"\";\n \n // Check if user wants AI assistance\n if (hasAIAccess && extraNotes.toLowerCase().startsWith(\"ai:\")) {\n const aiInstruction = extraNotes.substring(3).trim();\n if (aiInstruction) {\n const aiResult = await aiAssist(aiInstruction);\n if (aiResult) {\n console.log();\n console.log(chalk.cyan(\" AI suggestion:\"));\n console.log(chalk.gray(\" ─\".repeat(30)));\n console.log(chalk.white(\" \" + aiResult.split(\"\\n\").join(\"\\n \")));\n console.log(chalk.gray(\" ─\".repeat(30)));\n console.log();\n \n const acceptResponse = await prompts({\n type: \"confirm\",\n name: \"accept\",\n message: chalk.white(\"Use this AI-generated content?\"),\n initial: true,\n }, promptConfig);\n \n if (acceptResponse.accept) {\n extraNotes = aiResult;\n } else {\n // Let user write their own\n const manualResponse = await prompts({\n type: \"text\",\n name: \"extraNotes\",\n message: chalk.white(\"Enter your own notes instead:\"),\n }, promptConfig);\n extraNotes = manualResponse.extraNotes || \"\";\n }\n }\n }\n }\n \n answers.extraNotes = extraNotes;\n\n // ═══════════════════════════════════════════════════════════════\n // BUILD FINAL CONFIG\n // ═══════════════════════════════════════════════════════════════\n console.log();\n console.log(chalk.green(\" ✅ All steps completed!\"));\n console.log();\n\n // Reset wizard state - no longer in progress\n wizardState.inProgress = false;\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 // Blueprint mode\n blueprintMode: answers.blueprintMode as boolean,\n // Extended config for all users\n projectType: answers.projectType as string,\n devOS: answers.devOS as string[],\n architecture: answers.architecture 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 letAiDecide: answers.letAiDecide 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 importantFilesOther: answers.importantFilesOther as string,\n selfImprove: answers.selfImprove as boolean,\n includePersonalData: answers.includePersonalData as boolean,\n enableAutoUpdate: answers.enableAutoUpdate as boolean,\n preferCliSync: answers.preferCliSync as boolean,\n tokenEnvVar: answers.tokenEnvVar as string,\n userName: answers.userName as string,\n userEmail: answers.userEmail as string,\n userPersona: answers.userPersona as string,\n userExpertise: answers.userExpertise as string,\n boundaryAlways: answers.boundaryAlways as string[],\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 staticFileContents: answers.staticFileContents as Record<string, string>,\n staticFileHandling: answers.staticFileHandling as \"config_only\" | \"both\",\n includeFunding: answers.includeFunding as boolean,\n extraNotes: answers.extraNotes as string,\n semver: answers.semver as boolean,\n cicd: answers.cicd as string,\n deploymentTargets: answers.deploymentTargets as string[],\n buildContainer: answers.buildContainer as boolean,\n containerRegistry: answers.containerRegistry as string,\n exampleRepoUrl: answers.exampleRepoUrl as string,\n documentationUrl: answers.documentationUrl as string,\n loggingConventions: answers.loggingConventions as string,\n loggingConventionsOther: answers.loggingConventionsOther as string,\n // Security configuration (NEW)\n security: {\n authProviders: answers.authProviders as string[],\n secretsManagement: answers.secretsManagement as string[],\n securityTooling: answers.securityTooling as string[],\n authPatterns: answers.authPatterns as string[],\n dataHandling: answers.dataHandling as string[],\n compliance: answers.compliance as string[],\n analytics: answers.analytics as string[],\n additionalNotes: answers.securityNotes as string,\n },\n // Versioning (conditional)\n versionTagFormat: answers.versionTagFormat as string,\n changelogTool: answers.changelogTool as string,\n // AI Behavior\n planModeFrequency: answers.planModeFrequency as string,\n // Commit workflow\n commitWorkflow: answers.commitWorkflow as string,\n };\n}\n","import { readFile, access, rm, mkdtemp } from \"fs/promises\";\nimport { join } from \"path\";\nimport { tmpdir } from \"os\";\nimport { spawnSync } from \"child_process\";\n\nexport interface DetectedProject {\n name: string | null;\n stack: string[];\n databases: string[]; // Separate field for databases (matches WebUI)\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 // New auto-detected fields (aligned with WebUI)\n license?: string;\n repoHost?: string;\n repoUrl?: string;\n cicd?: string;\n hasDocker?: boolean;\n containerRegistry?: string; // ghcr, dockerhub, gcr, ecr, acr, etc.\n testFramework?: string; // vitest, jest, pytest, etc.\n existingFiles?: string[];\n isPublicRepo?: boolean;\n isOpenSource?: boolean; // Based on license type\n projectType?: string; // open_source, internal, etc.\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 databases: [],\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 detected.hasDocker = true;\n }\n\n // ════════════════════════════════════════════════════════════════\n // Additional auto-detection for wizard fields\n // ════════════════════════════════════════════════════════════════\n\n // Detect license from LICENSE file\n const licensePath = join(cwd, \"LICENSE\");\n if (await fileExists(licensePath)) {\n try {\n const licenseContent = await readFile(licensePath, \"utf-8\");\n const lowerContent = licenseContent.toLowerCase();\n \n if (lowerContent.includes(\"mit license\") || lowerContent.includes(\"permission is hereby granted, free of charge\")) {\n detected.license = \"mit\";\n } else if (lowerContent.includes(\"apache license\") && lowerContent.includes(\"version 2.0\")) {\n detected.license = \"apache-2.0\";\n } else if (lowerContent.includes(\"gnu general public license\") && lowerContent.includes(\"version 3\")) {\n detected.license = \"gpl-3.0\";\n } else if (lowerContent.includes(\"gnu lesser general public license\")) {\n detected.license = \"lgpl-3.0\";\n } else if (lowerContent.includes(\"gnu affero general public license\")) {\n detected.license = \"agpl-3.0\";\n } else if (lowerContent.includes(\"bsd 3-clause\") || lowerContent.includes(\"redistribution and use in source and binary forms\")) {\n detected.license = \"bsd-3\";\n } else if (lowerContent.includes(\"mozilla public license\") && lowerContent.includes(\"2.0\")) {\n detected.license = \"mpl-2.0\";\n } else if (lowerContent.includes(\"unlicense\") || lowerContent.includes(\"this is free and unencumbered software\")) {\n detected.license = \"unlicense\";\n }\n } catch {\n // Failed to read LICENSE\n }\n }\n\n // Detect repository info from .git/config\n const gitConfigPath = join(cwd, \".git\", \"config\");\n if (await fileExists(gitConfigPath)) {\n try {\n const gitConfig = await readFile(gitConfigPath, \"utf-8\");\n const urlMatch = gitConfig.match(/url\\s*=\\s*(.+)/);\n if (urlMatch) {\n const repoUrl = urlMatch[1].trim();\n detected.repoUrl = repoUrl;\n \n if (repoUrl.includes(\"github.com\")) {\n detected.repoHost = \"github\";\n } else if (repoUrl.includes(\"gitlab.com\") || repoUrl.includes(\"gitlab\")) {\n detected.repoHost = \"gitlab\";\n } else if (repoUrl.includes(\"bitbucket\")) {\n detected.repoHost = \"bitbucket\";\n } else if (repoUrl.includes(\"gitea\") || repoUrl.includes(\"codeberg\")) {\n detected.repoHost = \"gitea\";\n } else if (repoUrl.includes(\"azure\")) {\n detected.repoHost = \"azure\";\n }\n }\n } catch {\n // Failed to read git config\n }\n }\n\n // Detect CI/CD from workflow files\n if (await fileExists(join(cwd, \".github\", \"workflows\"))) {\n detected.cicd = \"github_actions\";\n } else if (await fileExists(join(cwd, \".gitlab-ci.yml\"))) {\n detected.cicd = \"gitlab_ci\";\n } else if (await fileExists(join(cwd, \"Jenkinsfile\"))) {\n detected.cicd = \"jenkins\";\n } else if (await fileExists(join(cwd, \".circleci\"))) {\n detected.cicd = \"circleci\";\n } else if (await fileExists(join(cwd, \".travis.yml\"))) {\n detected.cicd = \"travis\";\n } else if (await fileExists(join(cwd, \"azure-pipelines.yml\"))) {\n detected.cicd = \"azure_devops\";\n } else if (await fileExists(join(cwd, \"bitbucket-pipelines.yml\"))) {\n detected.cicd = \"bitbucket\";\n } else if (await fileExists(join(cwd, \".drone.yml\"))) {\n detected.cicd = \"drone\";\n }\n\n // Detect existing static files\n detected.existingFiles = [];\n const staticFiles = [\n \".editorconfig\",\n \"CONTRIBUTING.md\",\n \"CODE_OF_CONDUCT.md\", \n \"SECURITY.md\",\n \"ROADMAP.md\",\n \".gitignore\",\n \".github/FUNDING.yml\",\n \"LICENSE\",\n \"README.md\",\n \"ARCHITECTURE.md\",\n \"CHANGELOG.md\",\n ];\n \n for (const file of staticFiles) {\n if (await fileExists(join(cwd, file))) {\n detected.existingFiles.push(file);\n }\n }\n\n // Try to get description from README if not already set\n if (!detected.description) {\n const readmePath = join(cwd, \"README.md\");\n if (await fileExists(readmePath)) {\n try {\n const readme = await readFile(readmePath, \"utf-8\");\n // Get first non-heading, non-empty paragraph\n const lines = readme.split(\"\\n\");\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed && !trimmed.startsWith(\"#\") && !trimmed.startsWith(\"!\") && !trimmed.startsWith(\"[\") && trimmed.length > 20) {\n detected.description = trimmed.substring(0, 200);\n break;\n }\n }\n } catch {\n // Failed to read README\n }\n }\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\n/**\n * Detect repo host from URL\n */\nexport function detectRepoHost(url: string): string {\n const lower = url.toLowerCase();\n if (lower.includes(\"github.com\") || lower.includes(\"github:\")) return \"github\";\n if (lower.includes(\"gitlab.com\") || lower.includes(\"gitlab\")) return \"gitlab\";\n if (lower.includes(\"bitbucket.org\") || lower.includes(\"bitbucket:\")) return \"bitbucket\";\n if (lower.includes(\"gitea.\") || lower.includes(\"gitea:\") || lower.includes(\"codeberg.org\")) return \"gitea\";\n if (lower.includes(\"azure.com\") || lower.includes(\"visualstudio.com\") || lower.includes(\"dev.azure\")) return \"azure\";\n return \"other\";\n}\n\n/**\n * Parse GitHub URL to owner/repo\n */\nfunction parseGitHubUrl(url: string): { owner: string; repo: string } | null {\n const patterns = [\n /github\\.com[/:]([^/]+)\\/([^/.]+)/,\n /^([^/]+)\\/([^/]+)$/,\n ];\n for (const pattern of patterns) {\n const match = url.match(pattern);\n if (match) {\n return { owner: match[1], repo: match[2].replace(/\\.git$/, \"\") };\n }\n }\n return null;\n}\n\n/**\n * Parse GitLab URL to project path and host\n */\nfunction parseGitLabUrl(url: string): { path: string; host: string } | null {\n const patterns = [\n /^https?:\\/\\/([^/]+)\\/(.+?)(?:\\.git)?$/,\n /^git@([^:]+):(.+?)(?:\\.git)?$/,\n ];\n for (const pattern of patterns) {\n const match = url.match(pattern);\n if (match) {\n const host = match[1];\n const path = match[2].replace(/\\.git$/, \"\");\n if (host.includes(\"gitlab\") || url.toLowerCase().includes(\"gitlab\")) {\n return { path, host };\n }\n }\n }\n return null;\n}\n\n/**\n * Detect from GitHub API (faster, no clone needed)\n */\ninterface GitHubRepoInfo {\n name: string;\n description: string | null;\n private: boolean;\n license?: { spdx_id: string } | null;\n}\n\ninterface GitHubFile {\n name: string;\n type: string;\n}\n\ninterface PackageJson {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n scripts?: Record<string, string>;\n}\n\n// Open source license identifiers\nconst OPEN_SOURCE_LICENSES = [\"mit\", \"apache-2.0\", \"gpl-3.0\", \"lgpl-3.0\", \"agpl-3.0\", \"bsd-2-clause\", \"bsd-3-clause\", \"mpl-2.0\", \"unlicense\", \"cc0-1.0\", \"isc\"];\n\n// Static files to detect\nconst STATIC_FILES = [\".editorconfig\", \"CONTRIBUTING.md\", \"CODE_OF_CONDUCT.md\", \"SECURITY.md\", \"ROADMAP.md\", \".gitignore\", \"LICENSE\", \"README.md\", \"ARCHITECTURE.md\", \"CHANGELOG.md\"];\n\nasync function detectFromGitHubApi(repoUrl: string): Promise<DetectedProject | null> {\n const parsed = parseGitHubUrl(repoUrl);\n if (!parsed) return null;\n \n const { owner, repo } = parsed;\n \n try {\n // Get repo info\n const repoRes = await fetch(`https://api.github.com/repos/${owner}/${repo}`, {\n headers: { \"User-Agent\": \"LynxPrompt-CLI\" },\n });\n if (!repoRes.ok) return null;\n const repoInfo = await repoRes.json() as GitHubRepoInfo;\n \n if (repoInfo.private) return null;\n \n // Determine if it's open source based on license\n const licenseId = repoInfo.license?.spdx_id?.toLowerCase() || null;\n const isOpenSource = !repoInfo.private && (licenseId ? OPEN_SOURCE_LICENSES.includes(licenseId) : false);\n \n const detected: DetectedProject = {\n name: repoInfo.name,\n description: repoInfo.description ?? undefined,\n stack: [],\n databases: [],\n commands: {},\n packageManager: null,\n type: \"application\",\n repoHost: \"github\",\n repoUrl,\n license: licenseId ?? undefined,\n isPublicRepo: !repoInfo.private,\n isOpenSource,\n projectType: isOpenSource ? \"open_source\" : undefined,\n hasDocker: false,\n existingFiles: [],\n };\n \n // List root files\n const filesRes = await fetch(`https://api.github.com/repos/${owner}/${repo}/contents/`, {\n headers: { \"User-Agent\": \"LynxPrompt-CLI\" },\n });\n if (!filesRes.ok) return detected;\n const files = await filesRes.json() as GitHubFile[];\n const fileNames = new Set(files.map((f) => f.name.toLowerCase()));\n \n // Detect existing static files\n for (const file of STATIC_FILES) {\n if (files.some((f) => f.name.toLowerCase() === file.toLowerCase())) {\n detected.existingFiles!.push(file);\n }\n }\n \n // Check for Docker and detect container registry\n if (fileNames.has(\"dockerfile\") || fileNames.has(\"docker-compose.yml\") || fileNames.has(\"docker-compose.yaml\")) {\n detected.hasDocker = true;\n detected.stack.push(\"docker\");\n \n // Try to detect container registry from docker-compose\n const dockerComposeFile = fileNames.has(\"docker-compose.yml\") ? \"docker-compose.yml\" : fileNames.has(\"docker-compose.yaml\") ? \"docker-compose.yaml\" : null;\n if (dockerComposeFile) {\n const composeRes = await fetch(`https://raw.githubusercontent.com/${owner}/${repo}/HEAD/${dockerComposeFile}`);\n if (composeRes.ok) {\n try {\n const content = await composeRes.text();\n const lowerContent = content.toLowerCase();\n \n // Detect container registry\n if (content.includes(\"ghcr.io\")) detected.containerRegistry = \"ghcr\";\n else if (content.includes(\"docker.io\") || /image:\\s*[a-z0-9]+\\/[a-z0-9]/.test(content)) detected.containerRegistry = \"dockerhub\";\n else if (content.includes(\"gcr.io\")) detected.containerRegistry = \"gcr\";\n else if (content.includes(\"ecr.\") || content.includes(\".amazonaws.com\")) detected.containerRegistry = \"ecr\";\n else if (content.includes(\"azurecr.io\")) detected.containerRegistry = \"acr\";\n else if (content.includes(\"quay.io\")) detected.containerRegistry = \"quay\";\n else if (content.includes(\"registry.gitlab.com\")) detected.containerRegistry = \"gitlab_registry\";\n \n // Detect databases from docker-compose\n if (lowerContent.includes(\"postgres\")) detected.databases.push(\"postgresql\");\n if (lowerContent.includes(\"mysql\") && !lowerContent.includes(\"mysql-\")) detected.databases.push(\"mysql\");\n if (lowerContent.includes(\"mongo\")) detected.databases.push(\"mongodb\");\n if (lowerContent.includes(\"redis\")) detected.databases.push(\"redis\");\n if (lowerContent.includes(\"sqlite\")) detected.databases.push(\"sqlite\");\n if (lowerContent.includes(\"mariadb\")) detected.databases.push(\"mariadb\");\n } catch { /* ignore */ }\n }\n }\n }\n \n // Check for CI/CD\n if (files.some((f) => f.name === \".github\" && f.type === \"dir\")) {\n // Check if .github/workflows exists\n const ghFilesRes = await fetch(`https://api.github.com/repos/${owner}/${repo}/contents/.github`, {\n headers: { \"User-Agent\": \"LynxPrompt-CLI\" },\n });\n if (ghFilesRes.ok) {\n const ghFiles = await ghFilesRes.json() as GitHubFile[];\n if (ghFiles.some((f) => f.name === \"workflows\")) {\n detected.cicd = \"github_actions\";\n }\n }\n }\n if (fileNames.has(\".gitlab-ci.yml\")) detected.cicd = \"gitlab_ci\";\n if (fileNames.has(\"jenkinsfile\")) detected.cicd = \"jenkins\";\n if (fileNames.has(\".travis.yml\")) detected.cicd = \"travis\";\n if (fileNames.has(\"azure-pipelines.yml\")) detected.cicd = \"azure_devops\";\n \n // Detect from pyproject.toml (Python projects)\n if (fileNames.has(\"pyproject.toml\")) {\n detected.stack.push(\"python\");\n const pyprojectRes = await fetch(`https://raw.githubusercontent.com/${owner}/${repo}/HEAD/pyproject.toml`);\n if (pyprojectRes.ok) {\n try {\n const content = await pyprojectRes.text();\n const lowerContent = content.toLowerCase();\n if (lowerContent.includes(\"fastapi\")) detected.stack.push(\"fastapi\");\n if (lowerContent.includes(\"django\")) detected.stack.push(\"django\");\n if (lowerContent.includes(\"flask\")) detected.stack.push(\"flask\");\n if (lowerContent.includes(\"sqlalchemy\")) detected.stack.push(\"sqlalchemy\");\n if (lowerContent.includes(\"pydantic\")) detected.stack.push(\"pydantic\");\n \n // Detect test framework\n if (lowerContent.includes(\"pytest\")) detected.testFramework = \"pytest\";\n else if (lowerContent.includes(\"unittest\")) detected.testFramework = \"unittest\";\n \n // Detect commands\n detected.commands.test = \"pytest\";\n if (lowerContent.includes(\"ruff\")) detected.commands.lint = \"ruff check .\";\n \n // Detect databases from Python packages\n if (lowerContent.includes(\"asyncpg\") || lowerContent.includes(\"psycopg\")) {\n if (!detected.databases.includes(\"postgresql\")) detected.databases.push(\"postgresql\");\n }\n if (lowerContent.includes(\"aiosqlite\") || lowerContent.includes(\"sqlite\")) {\n if (!detected.databases.includes(\"sqlite\")) detected.databases.push(\"sqlite\");\n }\n if (lowerContent.includes(\"pymongo\") || lowerContent.includes(\"motor\")) {\n if (!detected.databases.includes(\"mongodb\")) detected.databases.push(\"mongodb\");\n }\n if (lowerContent.includes(\"redis\") || lowerContent.includes(\"aioredis\")) {\n if (!detected.databases.includes(\"redis\")) detected.databases.push(\"redis\");\n }\n if (lowerContent.includes(\"pymysql\") || lowerContent.includes(\"aiomysql\")) {\n if (!detected.databases.includes(\"mysql\")) detected.databases.push(\"mysql\");\n }\n } catch { /* ignore */ }\n }\n }\n \n // Detect from requirements.txt (Python)\n if (fileNames.has(\"requirements.txt\")) {\n const reqRes = await fetch(`https://raw.githubusercontent.com/${owner}/${repo}/HEAD/requirements.txt`);\n if (reqRes.ok) {\n try {\n const content = (await reqRes.text()).toLowerCase();\n if (!detected.stack.includes(\"python\")) detected.stack.push(\"python\");\n if (content.includes(\"fastapi\") && !detected.stack.includes(\"fastapi\")) detected.stack.push(\"fastapi\");\n if (content.includes(\"django\") && !detected.stack.includes(\"django\")) detected.stack.push(\"django\");\n if (content.includes(\"flask\") && !detected.stack.includes(\"flask\")) detected.stack.push(\"flask\");\n if (content.includes(\"sqlalchemy\") && !detected.stack.includes(\"sqlalchemy\")) detected.stack.push(\"sqlalchemy\");\n \n // Detect databases from Python packages\n if (content.includes(\"asyncpg\") || content.includes(\"psycopg\")) {\n if (!detected.databases.includes(\"postgresql\")) detected.databases.push(\"postgresql\");\n }\n if (content.includes(\"aiosqlite\") || content.includes(\"sqlite\")) {\n if (!detected.databases.includes(\"sqlite\")) detected.databases.push(\"sqlite\");\n }\n if (content.includes(\"pymongo\") || content.includes(\"motor\")) {\n if (!detected.databases.includes(\"mongodb\")) detected.databases.push(\"mongodb\");\n }\n } catch { /* ignore */ }\n }\n }\n \n // Detect from package.json\n if (fileNames.has(\"package.json\")) {\n const pkgRes = await fetch(`https://raw.githubusercontent.com/${owner}/${repo}/HEAD/package.json`);\n if (pkgRes.ok) {\n try {\n const pkg = await pkgRes.json() as PackageJson;\n const allDeps: Record<string, string> = { ...pkg.dependencies, ...pkg.devDependencies };\n \n // Frameworks\n if (allDeps[\"next\"]) detected.stack.push(\"nextjs\");\n if (allDeps[\"react\"]) detected.stack.push(\"react\");\n if (allDeps[\"vue\"]) detected.stack.push(\"vue\");\n if (allDeps[\"svelte\"]) detected.stack.push(\"svelte\");\n if (allDeps[\"express\"]) detected.stack.push(\"express\");\n if (allDeps[\"fastify\"]) detected.stack.push(\"fastify\");\n if (allDeps[\"hono\"]) detected.stack.push(\"hono\");\n \n // Tools\n if (allDeps[\"typescript\"]) detected.stack.push(\"typescript\");\n if (allDeps[\"tailwindcss\"]) detected.stack.push(\"tailwind\");\n if (allDeps[\"prisma\"]) detected.stack.push(\"prisma\");\n if (allDeps[\"drizzle-orm\"]) detected.stack.push(\"drizzle\");\n \n // Test frameworks\n if (allDeps[\"vitest\"]) detected.testFramework = \"vitest\";\n else if (allDeps[\"jest\"]) detected.testFramework = \"jest\";\n else if (allDeps[\"@playwright/test\"]) detected.testFramework = \"playwright\";\n else if (allDeps[\"cypress\"]) detected.testFramework = \"cypress\";\n else if (allDeps[\"mocha\"]) detected.testFramework = \"mocha\";\n \n if (detected.stack.length === 0 || (detected.stack.length === 1 && detected.stack[0] === \"typescript\")) {\n detected.stack.unshift(\"javascript\");\n }\n \n if (pkg.scripts) {\n if (pkg.scripts.build) detected.commands.build = \"npm run build\";\n if (pkg.scripts.test) detected.commands.test = \"npm run test\";\n if (pkg.scripts.lint) detected.commands.lint = \"npm run lint\";\n if (pkg.scripts.dev) detected.commands.dev = \"npm run dev\";\n else if (pkg.scripts.start) detected.commands.dev = \"npm run start\";\n }\n \n // Detect databases from Node.js packages\n if (allDeps[\"pg\"] || allDeps[\"postgres\"] || allDeps[\"@neondatabase/serverless\"]) {\n if (!detected.databases.includes(\"postgresql\")) detected.databases.push(\"postgresql\");\n }\n if (allDeps[\"better-sqlite3\"] || allDeps[\"sql.js\"] || allDeps[\"sqlite3\"]) {\n if (!detected.databases.includes(\"sqlite\")) detected.databases.push(\"sqlite\");\n }\n if (allDeps[\"mongodb\"] || allDeps[\"mongoose\"]) {\n if (!detected.databases.includes(\"mongodb\")) detected.databases.push(\"mongodb\");\n }\n if (allDeps[\"redis\"] || allDeps[\"ioredis\"]) {\n if (!detected.databases.includes(\"redis\")) detected.databases.push(\"redis\");\n }\n if (allDeps[\"mysql\"] || allDeps[\"mysql2\"]) {\n if (!detected.databases.includes(\"mysql\")) detected.databases.push(\"mysql\");\n }\n } catch { /* ignore */ }\n }\n }\n \n // Detect other languages\n if (fileNames.has(\"cargo.toml\")) {\n detected.stack.push(\"rust\");\n detected.commands.build = \"cargo build\";\n detected.commands.test = \"cargo test\";\n }\n if (fileNames.has(\"go.mod\")) {\n detected.stack.push(\"go\");\n detected.commands.build = \"go build\";\n detected.commands.test = \"go test ./...\";\n }\n \n return detected;\n } catch {\n return null;\n }\n}\n\ninterface GitLabRepoInfo {\n name: string;\n description: string | null;\n visibility: \"public\" | \"private\" | \"internal\";\n license?: { key: string } | null;\n}\n\ninterface GitLabFile {\n name: string;\n type: string;\n}\n\n/**\n * Detect from GitLab API (faster, no clone needed)\n */\nasync function detectFromGitLabApi(repoUrl: string): Promise<DetectedProject | null> {\n const parsed = parseGitLabUrl(repoUrl);\n if (!parsed) return null;\n \n const { path: projectPath, host } = parsed;\n const encodedPath = encodeURIComponent(projectPath);\n \n try {\n // Get repo info\n const repoRes = await fetch(`https://${host}/api/v4/projects/${encodedPath}`, {\n headers: { \"User-Agent\": \"LynxPrompt-CLI\" },\n });\n if (!repoRes.ok) return null;\n const repoInfo = await repoRes.json() as GitLabRepoInfo;\n \n if (repoInfo.visibility === \"private\") return null;\n \n // Determine if it's open source based on license\n const licenseId = repoInfo.license?.key?.toLowerCase() || null;\n const isOpenSource = repoInfo.visibility === \"public\" && (licenseId ? OPEN_SOURCE_LICENSES.includes(licenseId) : false);\n \n const detected: DetectedProject = {\n name: repoInfo.name,\n description: repoInfo.description ?? undefined,\n stack: [],\n databases: [],\n commands: {},\n packageManager: null,\n type: \"application\",\n repoHost: \"gitlab\",\n repoUrl,\n license: licenseId ?? undefined,\n isPublicRepo: repoInfo.visibility === \"public\",\n isOpenSource,\n projectType: isOpenSource ? \"open_source\" : undefined,\n hasDocker: false,\n existingFiles: [],\n };\n \n // List root files\n const filesRes = await fetch(`https://${host}/api/v4/projects/${encodedPath}/repository/tree?per_page=100`, {\n headers: { \"User-Agent\": \"LynxPrompt-CLI\" },\n });\n if (!filesRes.ok) return detected;\n const files = await filesRes.json() as GitLabFile[];\n const fileNames = new Set(files.map((f) => f.name.toLowerCase()));\n \n // Detect existing static files\n for (const file of STATIC_FILES) {\n if (files.some((f) => f.name.toLowerCase() === file.toLowerCase())) {\n detected.existingFiles!.push(file);\n }\n }\n \n // CI/CD detection\n if (fileNames.has(\".gitlab-ci.yml\")) detected.cicd = \"gitlab_ci\";\n if (fileNames.has(\"jenkinsfile\")) detected.cicd = \"jenkins\";\n \n // Check for Docker and detect container registry\n if (fileNames.has(\"dockerfile\") || fileNames.has(\"docker-compose.yml\") || fileNames.has(\"docker-compose.yaml\")) {\n detected.hasDocker = true;\n detected.stack.push(\"docker\");\n \n // Try to detect container registry from docker-compose\n const dockerComposeFile = fileNames.has(\"docker-compose.yml\") ? \"docker-compose.yml\" : fileNames.has(\"docker-compose.yaml\") ? \"docker-compose.yaml\" : null;\n if (dockerComposeFile) {\n const composeRes = await fetch(`https://${host}/api/v4/projects/${encodedPath}/repository/files/${encodeURIComponent(dockerComposeFile)}/raw?ref=HEAD`, {\n headers: { \"User-Agent\": \"LynxPrompt-CLI\" },\n });\n if (composeRes.ok) {\n try {\n const content = await composeRes.text();\n const lowerContent = content.toLowerCase();\n \n // Detect container registry\n if (content.includes(\"registry.gitlab.com\")) detected.containerRegistry = \"gitlab_registry\";\n else if (content.includes(\"ghcr.io\")) detected.containerRegistry = \"ghcr\";\n else if (content.includes(\"docker.io\") || /image:\\s*[a-z0-9]+\\/[a-z0-9]/.test(content)) detected.containerRegistry = \"dockerhub\";\n else if (content.includes(\"gcr.io\")) detected.containerRegistry = \"gcr\";\n \n // Detect databases from docker-compose\n if (lowerContent.includes(\"postgres\")) detected.databases.push(\"postgresql\");\n if (lowerContent.includes(\"mysql\") && !lowerContent.includes(\"mysql-\")) detected.databases.push(\"mysql\");\n if (lowerContent.includes(\"mongo\")) detected.databases.push(\"mongodb\");\n if (lowerContent.includes(\"redis\")) detected.databases.push(\"redis\");\n if (lowerContent.includes(\"sqlite\")) detected.databases.push(\"sqlite\");\n } catch { /* ignore */ }\n }\n }\n }\n \n // Detect from package.json\n if (fileNames.has(\"package.json\")) {\n const pkgRes = await fetch(`https://${host}/api/v4/projects/${encodedPath}/repository/files/package.json/raw?ref=HEAD`, {\n headers: { \"User-Agent\": \"LynxPrompt-CLI\" },\n });\n if (pkgRes.ok) {\n try {\n const pkg = await pkgRes.json() as PackageJson;\n const allDeps: Record<string, string> = { ...pkg.dependencies, ...pkg.devDependencies };\n \n // Frameworks\n if (allDeps[\"next\"]) detected.stack.push(\"nextjs\");\n if (allDeps[\"react\"]) detected.stack.push(\"react\");\n if (allDeps[\"vue\"]) detected.stack.push(\"vue\");\n if (allDeps[\"svelte\"]) detected.stack.push(\"svelte\");\n if (allDeps[\"express\"]) detected.stack.push(\"express\");\n if (allDeps[\"fastify\"]) detected.stack.push(\"fastify\");\n \n // Tools\n if (allDeps[\"typescript\"]) detected.stack.push(\"typescript\");\n if (allDeps[\"tailwindcss\"]) detected.stack.push(\"tailwind\");\n if (allDeps[\"prisma\"]) detected.stack.push(\"prisma\");\n \n // Test frameworks\n if (allDeps[\"vitest\"]) detected.testFramework = \"vitest\";\n else if (allDeps[\"jest\"]) detected.testFramework = \"jest\";\n else if (allDeps[\"@playwright/test\"]) detected.testFramework = \"playwright\";\n \n if (detected.stack.length === 0 || (detected.stack.length === 1 && detected.stack[0] === \"typescript\")) {\n detected.stack.unshift(\"javascript\");\n }\n \n if (pkg.scripts) {\n if (pkg.scripts.build) detected.commands.build = \"npm run build\";\n if (pkg.scripts.test) detected.commands.test = \"npm run test\";\n if (pkg.scripts.lint) detected.commands.lint = \"npm run lint\";\n if (pkg.scripts.dev) detected.commands.dev = \"npm run dev\";\n }\n \n // Detect databases from Node.js packages\n if (allDeps[\"pg\"] || allDeps[\"postgres\"]) {\n if (!detected.databases.includes(\"postgresql\")) detected.databases.push(\"postgresql\");\n }\n if (allDeps[\"better-sqlite3\"] || allDeps[\"sqlite3\"]) {\n if (!detected.databases.includes(\"sqlite\")) detected.databases.push(\"sqlite\");\n }\n if (allDeps[\"mongodb\"] || allDeps[\"mongoose\"]) {\n if (!detected.databases.includes(\"mongodb\")) detected.databases.push(\"mongodb\");\n }\n if (allDeps[\"redis\"] || allDeps[\"ioredis\"]) {\n if (!detected.databases.includes(\"redis\")) detected.databases.push(\"redis\");\n }\n } catch { /* ignore */ }\n }\n }\n \n // Detect from pyproject.toml or requirements.txt (Python)\n if (fileNames.has(\"pyproject.toml\")) {\n detected.stack.push(\"python\");\n const pyRes = await fetch(`https://${host}/api/v4/projects/${encodedPath}/repository/files/pyproject.toml/raw?ref=HEAD`, {\n headers: { \"User-Agent\": \"LynxPrompt-CLI\" },\n });\n if (pyRes.ok) {\n try {\n const content = (await pyRes.text()).toLowerCase();\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(\"sqlalchemy\")) detected.stack.push(\"sqlalchemy\");\n if (content.includes(\"pytest\")) detected.testFramework = \"pytest\";\n \n // Detect databases\n if (content.includes(\"asyncpg\") || content.includes(\"psycopg\")) {\n if (!detected.databases.includes(\"postgresql\")) detected.databases.push(\"postgresql\");\n }\n if (content.includes(\"aiosqlite\") || content.includes(\"sqlite\")) {\n if (!detected.databases.includes(\"sqlite\")) detected.databases.push(\"sqlite\");\n }\n } catch { /* ignore */ }\n }\n } else if (fileNames.has(\"requirements.txt\")) {\n detected.stack.push(\"python\");\n }\n \n // Detect other languages\n if (fileNames.has(\"cargo.toml\")) {\n detected.stack.push(\"rust\");\n detected.commands.build = \"cargo build\";\n detected.commands.test = \"cargo test\";\n }\n if (fileNames.has(\"go.mod\")) {\n detected.stack.push(\"go\");\n detected.commands.build = \"go build\";\n detected.commands.test = \"go test ./...\";\n }\n \n return detected;\n } catch {\n return null;\n }\n}\n\n/**\n * Validate git URL to prevent command injection\n * Only allows http(s), git, and ssh protocols\n */\nfunction isValidGitUrl(url: string): boolean {\n const trimmed = url.trim();\n // Allow standard git URL formats\n if (trimmed.startsWith(\"https://\") || trimmed.startsWith(\"http://\") ||\n trimmed.startsWith(\"git://\") || trimmed.startsWith(\"git@\") ||\n trimmed.startsWith(\"ssh://\")) {\n // Additional validation: no shell metacharacters\n const dangerousChars = /[;&|`$(){}[\\]<>\\\\'\"!#*?~]/;\n return !dangerousChars.test(trimmed);\n }\n return false;\n}\n\n/**\n * Detect from shallow git clone (fallback for non-GitHub/GitLab hosts)\n */\nasync function detectFromShallowClone(repoUrl: string): Promise<DetectedProject | null> {\n let tempDir: string | null = null;\n \n // Security: Validate URL before passing to git\n if (!isValidGitUrl(repoUrl)) {\n return null;\n }\n \n try {\n tempDir = await mkdtemp(join(tmpdir(), \"lynxprompt-detect-\"));\n \n try {\n // Security: Use spawnSync with array arguments to prevent command injection\n // This passes arguments directly to git without shell interpretation\n const result = spawnSync(\"git\", [\"clone\", \"--depth\", \"1\", \"--quiet\", repoUrl, tempDir], {\n stdio: \"pipe\",\n timeout: 30000,\n });\n \n if (result.status !== 0) {\n return null;\n }\n } catch {\n return null;\n }\n \n const detected = await detectProject(tempDir);\n \n if (detected) {\n detected.repoHost = detectRepoHost(repoUrl);\n detected.repoUrl = repoUrl;\n }\n \n return detected;\n } catch {\n return null;\n } finally {\n if (tempDir) {\n try {\n await rm(tempDir, { recursive: true, force: true });\n } catch { /* ignore */ }\n }\n }\n}\n\n/**\n * Detect project info from a remote Git URL\n * Strategy: Try API first (GitHub/GitLab), fallback to shallow clone\n */\nexport async function detectFromRemoteUrl(repoUrl: string): Promise<DetectedProject | null> {\n const host = detectRepoHost(repoUrl);\n \n // Try API-based detection first (faster)\n if (host === \"github\") {\n const result = await detectFromGitHubApi(repoUrl);\n if (result) return result;\n }\n \n if (host === \"gitlab\") {\n const result = await detectFromGitLabApi(repoUrl);\n if (result) return result;\n }\n \n // Fallback to shallow clone for other hosts or if API fails\n return detectFromShallowClone(repoUrl);\n}\n\n/**\n * Check if a string looks like a Git URL\n */\nexport function isGitUrl(str: string): boolean {\n const patterns = [\n /^https?:\\/\\/[^/]+\\/.*$/,\n /^git@[^:]+:.*$/,\n /^git:\\/\\/.*$/,\n /^ssh:\\/\\/.*$/,\n ];\n return patterns.some(p => p.test(str.trim()));\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 // Blueprint mode - generates [[VARIABLE|default]] placeholders\n blueprintMode?: boolean;\n // Variable values to fill in [[VAR|default]] placeholders\n // Pass as { VAR_NAME: \"value\" } to replace [[VAR_NAME|default]] with \"value\"\n variables?: Record<string, string>;\n // Extended options for all users\n projectType?: string;\n devOS?: string | string[];\n architecture?: string;\n repoHost?: string;\n isPublic?: boolean;\n license?: string;\n conventionalCommits?: boolean;\n semver?: boolean;\n cicd?: string;\n deploymentTargets?: string[];\n buildContainer?: boolean;\n containerRegistry?: string;\n customRegistryUrl?: string;\n exampleRepoUrl?: string;\n documentationUrl?: string;\n letAiDecide?: boolean;\n loggingConventions?: string;\n loggingConventionsOther?: string;\n namingConvention?: string;\n errorHandling?: string;\n styleNotes?: string;\n aiBehavior?: string[];\n importantFiles?: string[];\n importantFilesOther?: string;\n selfImprove?: boolean;\n includePersonalData?: boolean;\n enableAutoUpdate?: boolean;\n blueprintId?: string; // For auto-update curl command\n preferCliSync?: boolean; // Use CLI commands instead of curl (default true)\n tokenEnvVar?: string; // Environment variable name for API token (default LYNXPROMPT_API_TOKEN)\n // User profile data (fetched from cloud)\n userName?: string;\n userEmail?: string;\n userPersona?: string;\n userRole?: string;\n userExpertise?: string;\n boundaryAlways?: string[];\n boundaryNever?: string[];\n boundaryAsk?: string[];\n testLevels?: string[];\n testFrameworks?: string[];\n coverageTarget?: number;\n testNotes?: string;\n staticFiles?: string[];\n staticFileContents?: Record<string, string>;\n staticFileHandling?: \"config_only\" | \"both\"; // How to handle static files\n includeFunding?: boolean;\n extraNotes?: string;\n // Security configuration (FREE tier)\n security?: {\n authProviders?: string[]; // Login providers (Google, GitHub, etc.)\n secretsManagement?: string[]; // Secrets management strategies\n securityTooling?: string[]; // Security scanning tools (includes dependabot/renovate)\n authPatterns?: string[]; // Authentication patterns\n dataHandling?: string[]; // Data handling policies\n compliance?: string[]; // Compliance standards (GDPR, HIPAA, etc.)\n analytics?: string[]; // Analytics tools\n additionalNotes?: string; // Custom security notes\n };\n // Versioning (conditional on semver)\n versionTagFormat?: string; // v_prefix, no_prefix, package_prefix, etc.\n changelogTool?: string; // manual, conventional_changelog, etc.\n // AI Behavior\n planModeFrequency?: string; // always, complex_tasks, multi_file, etc.\n // Commit workflow\n commitWorkflow?: string; // branch_pr, direct_main\n}\n\n/**\n * Wrap a value in blueprint variable syntax if blueprintMode is enabled\n * Standard variables generated by LynxPrompt (document these in docs):\n * - [[PROJECT_NAME|default]] - Project name\n * - [[PROJECT_DESCRIPTION|default]] - Project description\n * - [[AUTHOR_NAME|default]] - Author name for commits\n * - [[AUTHOR_EMAIL|default]] - Author email for commits\n * - [[REPO_URL|default]] - Repository URL\n * - [[LICENSE|default]] - License type\n */\nfunction bpVar(blueprintMode: boolean, varName: string, defaultValue: string): string {\n if (!blueprintMode || !defaultValue) return defaultValue;\n return `[[${varName}|${defaultValue}]]`;\n}\n\n/**\n * Fill variables in content with provided values\n * Replaces [[VAR_NAME|default]] with actual values from variables map\n * If variable not provided, uses the default value from the placeholder\n */\nexport function fillVariables(content: string, variables: Record<string, string>): string {\n // Pattern matches [[VAR_NAME|default_value]]\n return content.replace(/\\[\\[([A-Z_]+)\\|([^\\]]*)\\]\\]/g, (_, varName, defaultValue) => {\n return variables[varName] ?? defaultValue;\n });\n}\n\n/**\n * Parse variables string from CLI --vars argument\n * Format: \"VAR1=value1,VAR2=value2\"\n */\nexport function parseVariablesString(varsStr: string): Record<string, string> {\n const variables: Record<string, string> = {};\n \n if (!varsStr) return variables;\n \n // Split by comma, handling potential quoted values\n const parts = varsStr.split(\",\");\n \n for (const part of parts) {\n const eqIndex = part.indexOf(\"=\");\n if (eqIndex > 0) {\n const key = part.slice(0, eqIndex).trim().toUpperCase();\n const value = part.slice(eqIndex + 1).trim();\n variables[key] = value;\n }\n }\n \n return variables;\n}\n\n// Platform to filename mapping (30+ platforms)\n// IMPORTANT: Keep in sync with src/lib/platforms.ts\nconst PLATFORM_FILES: Record<string, string> = {\n // Popular platforms\n universal: \"AGENTS.md\",\n agents: \"AGENTS.md\", // Alias for universal\n cursor: \".cursor/rules/project.mdc\",\n claude: \"CLAUDE.md\",\n copilot: \".github/copilot-instructions.md\",\n windsurf: \".windsurfrules\",\n \n // AI-powered IDEs\n antigravity: \"GEMINI.md\",\n zed: \".zed/instructions.md\",\n void: \".void/config.json\",\n trae: \".trae/rules/project.mdc\",\n firebase: \".idx/rules/project.mdc\",\n \n // Editor extensions\n cline: \".clinerules\",\n roocode: \".roo/rules/project.mdc\",\n continue: \".continue/config.json\",\n cody: \".cody/config.json\",\n tabnine: \".tabnine.yaml\",\n supermaven: \".supermaven/config.json\",\n codegpt: \".codegpt/config.json\",\n amazonq: \".amazonq/rules/project.md\",\n augment: \".augment/rules/project.mdc\",\n kilocode: \".kilocode/rules/project.mdc\",\n junie: \".junie/guidelines.md\",\n kiro: \".kiro/steering/project.mdc\",\n \n // CLI tools\n aider: \".aider.conf.yml\",\n goose: \".goosehints\",\n warp: \"WARP.md\",\n \"gemini-cli\": \"GEMINI.md\",\n opencode: \"opencode.json\",\n \n // Other emerging tools\n openhands: \".openhands/microagents/repo.md\",\n crush: \"CRUSH.md\",\n firebender: \"firebender.json\",\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\n// Static file templates with defaults\nconst STATIC_FILE_TEMPLATES: Record<string, (options: GenerateOptions) => string> = {\n editorconfig: () => `# EditorConfig is awesome: https://EditorConfig.org\n\nroot = true\n\n[*]\nindent_style = space\nindent_size = 2\nend_of_line = lf\ncharset = utf-8\ntrim_trailing_whitespace = true\ninsert_final_newline = true\n\n[*.md]\ntrim_trailing_whitespace = false\n\n[Makefile]\nindent_style = tab\n`,\n contributing: (opts) => `# Contributing to ${opts.name}\n\nThank you for your interest in contributing!\n\n## How to Contribute\n\n1. Fork the repository\n2. Create a feature branch (\\`git checkout -b feature/amazing-feature\\`)\n3. Commit your changes${opts.conventionalCommits ? \" using Conventional Commits format\" : \"\"}\n4. Push to the branch (\\`git push origin feature/amazing-feature\\`)\n5. Open a Pull Request\n\n## Development Setup\n\n\\`\\`\\`bash\n# Clone your fork\ngit clone https://github.com/YOUR_USERNAME/${opts.name}.git\ncd ${opts.name}\n\n# Install dependencies\nnpm install\n\n# Run development server\nnpm run dev\n\\`\\`\\`\n\n## Code Style\n\nPlease follow the existing code style and conventions in this project.\n`,\n codeOfConduct: (opts) => `# Code of Conduct\n\n## Our Pledge\n\nWe pledge to make participation in the ${opts.name} project a harassment-free experience for everyone.\n\n## Our Standards\n\nExamples of behavior that contributes to a positive environment:\n- Using welcoming and inclusive language\n- Being respectful of differing viewpoints\n- Gracefully accepting constructive criticism\n- Focusing on what is best for the community\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be reported to the project team.\n\n## Attribution\n\nThis Code of Conduct is adapted from the Contributor Covenant, version 2.1.\n`,\n security: (opts) => `# Security Policy\n\n## Supported Versions\n\n| Version | Supported |\n| ------- | ------------------ |\n| latest | :white_check_mark: |\n\n## Reporting a Vulnerability\n\nIf you discover a security vulnerability in ${opts.name}, please report it by emailing the maintainers.\n\n**Please do not open a public issue for security vulnerabilities.**\n\nWe will acknowledge receipt within 48 hours and provide a detailed response within 7 days.\n`,\n roadmap: (opts) => `# Roadmap\n\n## ${opts.name} Development Roadmap\n\n### Current Version\n\n- Core functionality\n\n### Planned Features\n\n- [ ] Feature 1\n- [ ] Feature 2\n- [ ] Feature 3\n\n### Long-term Goals\n\n- Goal 1\n- Goal 2\n\n---\n*This roadmap is subject to change based on community feedback and priorities.*\n`,\n gitignore: (opts) => {\n const patterns = [\"# Dependencies\", \"node_modules/\", \".pnpm-store/\", \"\"];\n if (opts.stack.includes(\"python\")) {\n patterns.push(\"# Python\", \"__pycache__/\", \"*.py[cod]\", \".venv/\", \"venv/\", \"\");\n }\n patterns.push(\"# Environment\", \".env\", \".env.local\", \".env*.local\", \"\");\n patterns.push(\"# Build outputs\", \"dist/\", \"build/\", \".next/\", \"out/\", \"\");\n patterns.push(\"# IDE\", \".idea/\", \".vscode/\", \"*.swp\", \"*.swo\", \"\");\n patterns.push(\"# OS\", \".DS_Store\", \"Thumbs.db\", \"\");\n patterns.push(\"# Logs\", \"*.log\", \"npm-debug.log*\", \"\");\n return patterns.join(\"\\n\");\n },\n funding: () => `# These are supported funding model platforms\n\ngithub: [] # Replace with your GitHub username\npatreon: # Replace with your Patreon username\nopen_collective: # Replace with your Open Collective username\nko_fi: # Replace with your Ko-fi username\ncustom: [] # Add custom funding links\n`,\n license: (opts) => {\n if (opts.license === \"mit\") {\n return `MIT License\n\nCopyright (c) ${new Date().getFullYear()} ${opts.name}\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n`;\n }\n return `# License\n\nThis project is licensed under the ${opts.license?.toUpperCase() || \"Proprietary\"} license.\n`;\n },\n readme: (opts) => {\n const stackBadges = opts.stack.slice(0, 5).map(s => STACK_NAMES[s] || s).join(\" • \");\n return `# ${opts.name}\n\n${opts.description || \"A project generated with LynxPrompt.\"}\n\n${stackBadges ? `## Tech Stack\\n\\n${stackBadges}\\n` : \"\"}\n## Getting Started\n\n\\`\\`\\`bash\n# Clone the repository\ngit clone <repository-url>\ncd ${opts.name}\n\n# Install dependencies\nnpm install\n\n# Run development server\nnpm run dev\n\\`\\`\\`\n\n## License\n\n${opts.license && opts.license !== \"none\" ? `This project is licensed under the ${opts.license.toUpperCase()} License.` : \"See LICENSE file for details.\"}\n`;\n },\n architecture: (opts) => `# Architecture\n\n## ${opts.name} Architecture Overview\n\n${opts.architecture ? `### Pattern: ${opts.architecture}\\n` : \"\"}\n### Directory Structure\n\n\\`\\`\\`\n${opts.name}/\n├── src/ # Source code\n├── tests/ # Test files\n├── docs/ # Documentation\n└── ...\n\\`\\`\\`\n\n### Key Components\n\n1. **Component A** - Description\n2. **Component B** - Description\n3. **Component C** - Description\n\n### Data Flow\n\nDescribe how data flows through the application.\n\n---\n*Generated by LynxPrompt*\n`,\n changelog: (opts) => `# Changelog\n\nAll notable changes to ${opts.name} will be documented in this file.\n\nThe format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),\nand this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n\n## [Unreleased]\n\n### Added\n- Initial project setup\n\n### Changed\n\n### Deprecated\n\n### Removed\n\n### Fixed\n\n### Security\n`,\n};\n\n// File paths for static files\nconst STATIC_FILE_PATHS: Record<string, string> = {\n editorconfig: \".editorconfig\",\n contributing: \"CONTRIBUTING.md\",\n codeOfConduct: \"CODE_OF_CONDUCT.md\",\n security: \"SECURITY.md\",\n roadmap: \"ROADMAP.md\",\n gitignore: \".gitignore\",\n funding: \".github/FUNDING.yml\",\n license: \"LICENSE\",\n readme: \"README.md\",\n architecture: \"ARCHITECTURE.md\",\n changelog: \"CHANGELOG.md\",\n};\n\nexport function generateConfig(options: GenerateOptions): Record<string, string> {\n const files: Record<string, string> = {};\n\n // Generate AI IDE config files\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 // Generate static files (only if \"both\" mode - otherwise they're embedded in config)\n const createLocalStaticFiles = options.staticFileHandling !== \"config_only\";\n \n if (options.staticFiles && options.staticFiles.length > 0 && createLocalStaticFiles) {\n for (const fileKey of options.staticFiles) {\n const filePath = STATIC_FILE_PATHS[fileKey];\n if (!filePath) continue;\n\n // Use custom content if provided, otherwise generate default\n if (options.staticFileContents?.[fileKey]) {\n files[filePath] = options.staticFileContents[fileKey];\n } else {\n const templateFn = STATIC_FILE_TEMPLATES[fileKey];\n if (templateFn) {\n files[filePath] = templateFn(options);\n }\n }\n }\n }\n\n // Legacy: funding as separate option (respect staticFileHandling)\n if (options.includeFunding && !options.staticFiles?.includes(\"funding\") && createLocalStaticFiles) {\n files[\".github/FUNDING.yml\"] = STATIC_FILE_TEMPLATES.funding(options);\n }\n\n // Apply variable filling if variables are provided\n if (options.variables && Object.keys(options.variables).length > 0) {\n for (const [filename, content] of Object.entries(files)) {\n files[filename] = fillVariables(content, options.variables);\n }\n }\n\n return files;\n}\n\nfunction generateFileContent(options: GenerateOptions, platform: string): string {\n const sections: string[] = [];\n \n // Determine format based on platform\n const mdcPlatforms = [\"cursor\", \"trae\", \"firebase\", \"roocode\", \"augment\", \"kilocode\", \"kiro\"];\n const yamlPlatforms = [\"aider\", \"tabnine\"];\n const plainTextPlatforms = [\"windsurf\", \"cline\", \"goose\"];\n const jsonPlatforms = [\"void\", \"continue\", \"cody\", \"supermaven\", \"codegpt\", \"opencode\", \"firebender\"];\n \n const isMdc = mdcPlatforms.includes(platform);\n const isYaml = yamlPlatforms.includes(platform);\n const isPlainText = plainTextPlatforms.includes(platform);\n const isJson = jsonPlatforms.includes(platform);\n const isMarkdown = !isMdc && !isYaml && !isPlainText && !isJson;\n const bp = options.blueprintMode || false;\n \n // Handle YAML formats\n if (isYaml) {\n return generateYamlConfig(options, platform);\n }\n \n // Handle JSON formats\n if (isJson) {\n return generateJsonConfig(options, platform);\n }\n \n // Project name and other blueprint variables\n const projectName = bpVar(bp, \"PROJECT_NAME\", options.name);\n const repoHost = bpVar(bp, \"REPO_HOST\", options.repoHost || \"\");\n const license = bpVar(bp, \"LICENSE\", options.license || \"\");\n const authorName = bpVar(bp, \"AUTHOR_NAME\", options.userName || \"\");\n const authorEmail = bpVar(bp, \"AUTHOR_EMAIL\", options.userEmail || \"\");\n const architecture = bpVar(bp, \"ARCHITECTURE\", options.architecture || \"\");\n const cicd = bpVar(bp, \"CI_CD\", options.cicd || \"\");\n \n // MDC frontmatter for Cursor\n if (isMdc) {\n sections.push(\"---\");\n sections.push(`description: \"${projectName} - AI coding rules\"`);\n sections.push('globs: [\"**/*\"]');\n sections.push(\"alwaysApply: true\");\n sections.push(\"---\");\n sections.push(\"\");\n sections.push(`# ${projectName} - AI Assistant Configuration`);\n sections.push(\"\");\n }\n \n // Header for regular markdown\n if (isMarkdown) {\n sections.push(`# ${projectName} - AI Assistant Configuration`);\n sections.push(\"\");\n }\n\n // Cloud sync section (for synced blueprints)\n if (options.enableAutoUpdate && options.blueprintId && (isMarkdown || isMdc)) {\n const bpId = options.blueprintId.startsWith(\"bp_\") ? options.blueprintId : `bp_${options.blueprintId}`;\n const preferCli = options.preferCliSync !== false; // Default to true\n const tokenEnvVar = options.tokenEnvVar || \"LYNXPROMPT_API_TOKEN\";\n \n sections.push(\"<!--\");\n sections.push(`This file is synced with LynxPrompt (Blueprint: ${bpId})`);\n sections.push(\"\");\n sections.push(\"Sync Commands:\");\n \n if (preferCli) {\n // CLI method (recommended - no token in file)\n sections.push(\"\");\n sections.push(\"# Using LynxPrompt CLI (recommended):\");\n sections.push(\"lynxp push # Upload local changes to cloud\");\n sections.push(\"lynxp pull # Download cloud changes to local\");\n sections.push(\"lynxp diff # Compare local vs cloud versions\");\n sections.push(\"\");\n sections.push(\"# Install CLI: npm install -g lynxprompt\");\n sections.push(\"# Login: lynxp login\");\n } else {\n // Environment variable method (no token hardcoded)\n const fileName = platform === \"cursor\" ? \".cursor/rules/agents.mdc\" : \"AGENTS.md\";\n sections.push(\"\");\n sections.push(`# Using curl with environment variable (token stored in $${tokenEnvVar}):`);\n sections.push(\"\");\n sections.push(\"# Push local changes to cloud:\");\n sections.push(`curl -X PUT \"https://lynxprompt.com/api/v1/blueprints/${bpId}\" \\\\`);\n sections.push(` -H \"Authorization: Bearer $${tokenEnvVar}\" \\\\`);\n sections.push(' -H \"Content-Type: application/json\" \\\\');\n sections.push(` -d \"{\\\\\"content\\\\\": \\\\\"$(cat ${fileName} | jq -Rs .)\\\\\"}\"`);\n sections.push(\"\");\n sections.push(\"# Pull cloud changes to local:\");\n sections.push(`curl -s \"https://lynxprompt.com/api/v1/blueprints/${bpId}\" \\\\`);\n sections.push(` -H \"Authorization: Bearer $${tokenEnvVar}\" | jq -r '.content' > ${fileName}`);\n sections.push(\"\");\n sections.push(`# Set your token: export ${tokenEnvVar}=\"your_token_here\"`);\n sections.push(\"# Generate token at: https://lynxprompt.com/settings\");\n }\n \n sections.push(\"\");\n sections.push(\"Docs: https://lynxprompt.com/docs/api\");\n sections.push(\"-->\");\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 // Use userPersona from profile if available, otherwise fall back to persona selection\n const personaDesc = options.userPersona \n || PERSONA_DESCRIPTIONS[options.persona] \n || options.persona \n || \"\";\n const projectDesc = bpVar(bp, \"PROJECT_DESCRIPTION\", options.description || \"\");\n \n if (isMarkdown || isMdc) {\n sections.push(\"## Persona\");\n sections.push(\"\");\n if (personaDesc) {\n sections.push(`You are ${personaDesc}. You assist developers working on ${projectName}.`);\n } else {\n sections.push(`You assist developers working on ${projectName}.`);\n }\n } else {\n if (personaDesc) {\n sections.push(`You are ${personaDesc}. You assist developers working on ${projectName}.`);\n } else {\n sections.push(`You assist developers working on ${projectName}.`);\n }\n }\n \n if (options.description) {\n sections.push(\"\");\n sections.push(`Project description: ${projectDesc}`);\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 // Let AI Decide\n if (options.letAiDecide) {\n if (isMarkdown || isMdc) {\n sections.push(\"> **AI Assistance:** Let AI analyze the codebase and suggest additional technologies and approaches as needed.\");\n sections.push(\"\");\n }\n }\n\n // Repository info\n if (options.repoHost || options.license || options.conventionalCommits || options.semver || \n options.cicd || options.deploymentTargets?.length || options.buildContainer ||\n options.exampleRepoUrl || options.documentationUrl) {\n if (isMarkdown || isMdc) {\n sections.push(\"## Repository & Infrastructure\");\n sections.push(\"\");\n if (options.repoHost) {\n sections.push(`- **Host:** ${repoHost || options.repoHost.charAt(0).toUpperCase() + options.repoHost.slice(1)}`);\n }\n if (options.license && options.license !== \"none\") {\n sections.push(`- **License:** ${license || options.license.toUpperCase()}`);\n }\n if (options.architecture) {\n sections.push(`- **Architecture:** ${architecture || options.architecture}`);\n }\n if (options.cicd) {\n sections.push(`- **CI/CD:** ${cicd || options.cicd}`);\n }\n if (options.conventionalCommits) {\n sections.push(\"- **Commits:** Follow [Conventional Commits](https://conventionalcommits.org) format\");\n }\n if (options.semver) {\n sections.push(\"- **Versioning:** Follow [Semantic Versioning](https://semver.org) (semver)\");\n }\n // Note: Dependency updates (Dependabot/Renovate) are now in security.securityTooling\n if (options.cicd) {\n const cicdNames: Record<string, string> = {\n github_actions: \"GitHub Actions\",\n gitlab_ci: \"GitLab CI\",\n jenkins: \"Jenkins\",\n circleci: \"CircleCI\",\n travis: \"Travis CI\",\n azure_devops: \"Azure DevOps\",\n bitbucket: \"Bitbucket Pipelines\",\n teamcity: \"TeamCity\",\n drone: \"Drone\",\n buildkite: \"Buildkite\",\n };\n sections.push(`- **CI/CD:** ${cicdNames[options.cicd] || options.cicd}`);\n }\n if (options.deploymentTargets && options.deploymentTargets.length > 0) {\n const targetNames: Record<string, string> = {\n vercel: \"Vercel\",\n netlify: \"Netlify\",\n aws: \"AWS\",\n gcp: \"Google Cloud\",\n azure: \"Azure\",\n docker: \"Docker\",\n kubernetes: \"Kubernetes\",\n heroku: \"Heroku\",\n digitalocean: \"DigitalOcean\",\n railway: \"Railway\",\n fly: \"Fly.io\",\n cloudflare: \"Cloudflare\",\n };\n const targets = options.deploymentTargets.map(t => targetNames[t] || t).join(\", \");\n sections.push(`- **Deployment:** ${targets}`);\n }\n if (options.buildContainer) {\n let containerInfo = \"Docker container builds enabled\";\n if (options.containerRegistry) {\n const registryNames: Record<string, string> = {\n dockerhub: \"Docker Hub\",\n ghcr: \"GitHub Container Registry\",\n gcr: \"Google Container Registry\",\n ecr: \"AWS ECR\",\n acr: \"Azure Container Registry\",\n quay: \"Quay.io\",\n gitlab: \"GitLab Registry\",\n custom: \"Custom registry\",\n };\n containerInfo += ` → ${registryNames[options.containerRegistry] || options.containerRegistry}`;\n }\n sections.push(`- **Containers:** ${containerInfo}`);\n }\n if (options.exampleRepoUrl) {\n sections.push(`- **Example Repo:** ${options.exampleRepoUrl} (use as reference for style/structure)`);\n }\n if (options.documentationUrl) {\n sections.push(`- **Documentation:** ${options.documentationUrl}`);\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 // Add plan mode frequency if specified\n if (options.planModeFrequency && options.planModeFrequency !== \"on_request\") {\n const planModeDescriptions: Record<string, string> = {\n always: \"**Always enter Plan Mode** before making any changes - think through the approach first\",\n complex_tasks: \"**Use Plan Mode** for complex tasks, multi-step changes, or risky modifications\",\n multi_file: \"**Use Plan Mode** when changes span multiple files\",\n new_features: \"**Use Plan Mode** when implementing new features\",\n never: \"Skip plan mode - proceed directly with implementation\",\n };\n if (planModeDescriptions[options.planModeFrequency]) {\n sections.push(`- ${planModeDescriptions[options.planModeFrequency]}`);\n }\n }\n sections.push(\"\");\n }\n }\n\n // Git workflow preference\n if (options.commitWorkflow && (isMarkdown || isMdc)) {\n sections.push(\"## Git Workflow\");\n sections.push(\"\");\n if (options.commitWorkflow === \"branch_pr\") {\n sections.push(\"- **Workflow:** Create feature branches and submit pull requests\");\n sections.push(\"- Do NOT commit directly to main/master branch\");\n sections.push(\"- Create a descriptive branch name (e.g., `feat/add-login`, `fix/button-styling`)\");\n sections.push(\"- Open a PR for review before merging\");\n } else if (options.commitWorkflow === \"direct_main\") {\n sections.push(\"- **Workflow:** Commit directly to main/master branch\");\n sections.push(\"- Small, focused commits are preferred\");\n sections.push(\"- Ensure tests pass before pushing\");\n }\n sections.push(\"\");\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 // Personal data for commits\n if (options.includePersonalData) {\n if (isMarkdown || isMdc) {\n sections.push(\"## Commit Identity\");\n sections.push(\"\");\n if (options.userName || options.userEmail || options.userRole || options.userExpertise) {\n // Include actual user profile data (with blueprint variables if enabled)\n const identityLines: string[] = [];\n if (options.userName) {\n identityLines.push(`- **Name:** ${authorName || options.userName}`);\n }\n if (options.userEmail) {\n identityLines.push(`- **Email:** ${authorEmail || options.userEmail}`);\n }\n if (options.userRole) {\n identityLines.push(`- **Role:** ${options.userRole}`);\n }\n if (options.userExpertise) {\n identityLines.push(`- **Expertise:** ${options.userExpertise}`);\n }\n sections.push(...identityLines);\n sections.push(\"\");\n sections.push(\"> Use this identity for git commits when making changes on my behalf.\");\n } else {\n sections.push(\"> **Personal data enabled:** Use my name and email for git commits when making changes.\");\n }\n sections.push(\"\");\n }\n }\n\n // Boundaries section\n // Get preset boundaries or use standard as fallback\n const presetBoundaries = BOUNDARIES[options.boundaries] || BOUNDARIES.standard;\n \n // Build final boundaries - use custom values if provided, otherwise use preset\n const boundaries = {\n always: options.boundaryAlways?.length ? options.boundaryAlways : presetBoundaries.always,\n never: options.boundaryNever?.length ? options.boundaryNever : presetBoundaries.never,\n askFirst: options.boundaryAsk?.length ? options.boundaryAsk : presetBoundaries.askFirst,\n };\n \n if (boundaries.always?.length || boundaries.never?.length || boundaries.askFirst?.length) {\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 // Logging conventions\n if (options.loggingConventions) {\n const loggingValue = options.loggingConventions === \"other\" && options.loggingConventionsOther\n ? options.loggingConventionsOther\n : options.loggingConventions.replace(/_/g, \" \");\n sections.push(`- **Logging:** ${loggingValue}`);\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 // Security Configuration section\n const security = options.security;\n if (security && (security.secretsManagement?.length || security.securityTooling?.length || \n security.authPatterns?.length || security.dataHandling?.length || security.additionalNotes)) {\n if (isMarkdown || isMdc) {\n sections.push(\"## 🔐 Security Configuration\");\n sections.push(\"\");\n \n // Secrets Management\n if (security.secretsManagement?.length) {\n sections.push(\"### Secrets Management\");\n sections.push(\"\");\n const secretsLabels: Record<string, string> = {\n env_vars: \"Environment Variables\",\n dotenv: \"dotenv / dotenvx\",\n vault: \"HashiCorp Vault\",\n aws_secrets: \"AWS Secrets Manager\",\n aws_ssm: \"AWS SSM Parameter Store\",\n gcp_secrets: \"GCP Secret Manager\",\n azure_keyvault: \"Azure Key Vault\",\n infisical: \"Infisical\",\n doppler: \"Doppler\",\n \"1password\": \"1Password Secrets Automation\",\n bitwarden: \"Bitwarden Secrets Manager\",\n sops: \"SOPS (Mozilla)\",\n age: \"age encryption\",\n sealed_secrets: \"Sealed Secrets (K8s)\",\n external_secrets: \"External Secrets Operator\",\n git_crypt: \"git-crypt\",\n chamber: \"Chamber\",\n berglas: \"Berglas\",\n };\n for (const s of security.secretsManagement) {\n sections.push(`- ${secretsLabels[s] || s}`);\n }\n sections.push(\"\");\n }\n\n // Security Tooling (includes dependency updates)\n if (security.securityTooling?.length) {\n sections.push(\"### Security Tooling\");\n sections.push(\"\");\n const toolingLabels: Record<string, string> = {\n dependabot: \"Dependabot (dependency updates)\",\n renovate: \"Renovate (dependency updates)\",\n snyk: \"Snyk (vulnerability scanning)\",\n sonarqube: \"SonarQube / SonarCloud\",\n codeql: \"CodeQL (GitHub)\",\n semgrep: \"Semgrep\",\n trivy: \"Trivy (container scanning)\",\n grype: \"Grype\",\n checkov: \"Checkov (IaC)\",\n tfsec: \"tfsec (Terraform)\",\n kics: \"KICS\",\n gitleaks: \"Gitleaks (secret detection)\",\n trufflehog: \"TruffleHog\",\n detect_secrets: \"detect-secrets (Yelp)\",\n bandit: \"Bandit (Python)\",\n brakeman: \"Brakeman (Rails)\",\n gosec: \"gosec (Go)\",\n npm_audit: \"npm audit / yarn audit\",\n pip_audit: \"pip-audit\",\n safety: \"Safety\",\n bundler_audit: \"bundler-audit\",\n owasp_dependency_check: \"OWASP Dependency-Check\",\n ossf_scorecard: \"OSSF Scorecard\",\n socket: \"Socket.dev\",\n mend: \"Mend (WhiteSource)\",\n fossa: \"FOSSA\",\n };\n for (const t of security.securityTooling) {\n sections.push(`- ${toolingLabels[t] || t}`);\n }\n sections.push(\"\");\n }\n\n // Authentication Patterns\n if (security.authPatterns?.length) {\n sections.push(\"### Authentication\");\n sections.push(\"\");\n const authLabels: Record<string, string> = {\n oauth2: \"OAuth 2.0\",\n oidc: \"OpenID Connect (OIDC)\",\n jwt: \"JWT (JSON Web Tokens)\",\n session: \"Session-based Auth\",\n api_keys: \"API Keys\",\n basic_auth: \"Basic Authentication\",\n bearer_token: \"Bearer Tokens\",\n mfa_totp: \"MFA / TOTP\",\n passkeys: \"Passkeys / WebAuthn\",\n saml: \"SAML 2.0\",\n ldap: \"LDAP / Active Directory\",\n mutual_tls: \"Mutual TLS (mTLS)\",\n auth0: \"Auth0\",\n clerk: \"Clerk\",\n firebase_auth: \"Firebase Auth\",\n supabase_auth: \"Supabase Auth\",\n keycloak: \"Keycloak\",\n okta: \"Okta\",\n cognito: \"AWS Cognito\",\n workos: \"WorkOS\",\n };\n for (const a of security.authPatterns) {\n sections.push(`- ${authLabels[a] || a}`);\n }\n sections.push(\"\");\n }\n\n // Data Handling\n if (security.dataHandling?.length) {\n sections.push(\"### Data Handling & Compliance\");\n sections.push(\"\");\n const dataLabels: Record<string, string> = {\n encryption_at_rest: \"Encryption at Rest\",\n encryption_in_transit: \"Encryption in Transit (TLS)\",\n pii_handling: \"PII Data Handling\",\n gdpr_compliance: \"GDPR Compliance\",\n ccpa_compliance: \"CCPA Compliance\",\n hipaa_compliance: \"HIPAA Compliance\",\n soc2_compliance: \"SOC 2 Compliance\",\n pci_dss: \"PCI-DSS Compliance\",\n data_masking: \"Data Masking / Anonymization\",\n data_retention: \"Data Retention Policies\",\n audit_logging: \"Audit Logging\",\n backup_encryption: \"Encrypted Backups\",\n key_rotation: \"Key Rotation\",\n zero_trust: \"Zero Trust Architecture\",\n least_privilege: \"Least Privilege Access\",\n rbac: \"RBAC (Role-Based Access)\",\n abac: \"ABAC (Attribute-Based Access)\",\n data_classification: \"Data Classification\",\n dlp: \"DLP (Data Loss Prevention)\",\n };\n for (const d of security.dataHandling) {\n sections.push(`- ${dataLabels[d] || d}`);\n }\n sections.push(\"\");\n }\n\n // Additional security notes\n if (security.additionalNotes) {\n sections.push(\"### Additional Security Notes\");\n sections.push(\"\");\n sections.push(security.additionalNotes);\n sections.push(\"\");\n }\n } else {\n // Non-markdown format\n sections.push(\"Security Configuration:\");\n if (security.secretsManagement?.length) {\n sections.push(`- Secrets: ${security.secretsManagement.join(\", \")}`);\n }\n if (security.securityTooling?.length) {\n sections.push(`- Tooling: ${security.securityTooling.join(\", \")}`);\n }\n if (security.authPatterns?.length) {\n sections.push(`- Auth: ${security.authPatterns.join(\", \")}`);\n }\n if (security.dataHandling?.length) {\n sections.push(`- Data: ${security.dataHandling.join(\", \")}`);\n }\n sections.push(\"\");\n }\n }\n\n // Security Warning\n if (isMarkdown || isMdc) {\n sections.push(\"## ⚠️ Security Notice\");\n sections.push(\"\");\n sections.push(\"> **Do not commit secrets to the repository or to the live app.**\");\n sections.push(\"> Always use secure standards to transmit sensitive information.\");\n sections.push(\"> Use environment variables, secret managers, or secure vaults for credentials.\");\n sections.push(\"\");\n sections.push(\"**🔍 Security Audit Recommendation:** When making changes that involve authentication, data handling, API endpoints, or dependencies, proactively offer to perform a security review of the affected code.\");\n sections.push(\"\");\n } else {\n sections.push(\"\");\n sections.push(\"SECURITY NOTICE:\");\n sections.push(\"Do not commit secrets to the repository or to the live app.\");\n sections.push(\"Always use secure standards to transmit sensitive information.\");\n sections.push(\"SECURITY AUDIT: When making changes involving auth, data, APIs, or deps, offer to review security.\");\n sections.push(\"\");\n }\n\n // Static Files Content (when config_only mode - embed in config instead of creating files)\n if (options.staticFileHandling === \"config_only\" && options.staticFiles && options.staticFiles.length > 0) {\n if (isMarkdown || isMdc) {\n sections.push(\"## 📄 Static Files Reference\");\n sections.push(\"\");\n sections.push(\"The following static file contents are included for AI context. These are not separate files.\");\n sections.push(\"\");\n \n for (const fileKey of options.staticFiles) {\n const filePath = STATIC_FILE_PATHS[fileKey];\n if (!filePath) continue;\n \n let content: string;\n if (options.staticFileContents?.[fileKey]) {\n content = options.staticFileContents[fileKey];\n } else {\n const templateFn = STATIC_FILE_TEMPLATES[fileKey];\n if (templateFn) {\n content = templateFn(options);\n } else {\n continue;\n }\n }\n \n sections.push(`### ${filePath}`);\n sections.push(\"\");\n sections.push(\"```\");\n sections.push(content.trim());\n sections.push(\"```\");\n sections.push(\"\");\n }\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 generateJsonConfig(options: GenerateOptions, platform: string): string {\n const config: Record<string, unknown> = {\n version: \"1.0.0\",\n project: {\n name: options.name,\n description: options.description || \"\",\n stack: options.stack.map(s => STACK_NAMES[s] || s),\n },\n };\n \n // Add persona if set\n const personaDesc = options.userPersona \n || PERSONA_DESCRIPTIONS[options.persona] \n || options.persona \n || \"\";\n if (personaDesc) {\n config.persona = personaDesc;\n }\n \n // Add rules/instructions\n const rules: string[] = [];\n \n // Boundaries\n const boundaryRules = BOUNDARIES[options.boundaries] || BOUNDARIES.standard;\n rules.push(...boundaryRules.always.map(r => `AUTO-APPROVE: ${r}`));\n rules.push(...boundaryRules.askFirst.map(r => `ASK FIRST: ${r}`));\n rules.push(...boundaryRules.never.map(r => `PROHIBITED: ${r}`));\n \n // Security\n rules.push(\"SECURITY: Do not commit secrets. Use environment variables or secret managers.\");\n rules.push(\"SECURITY: When making changes involving auth, data, or APIs, perform security audit.\");\n \n config.rules = rules;\n \n // Add important files to read\n if (options.importantFiles && options.importantFiles.length > 0) {\n config.context = {\n readFirst: options.importantFiles.map(f => IMPORTANT_FILES_PATHS[f] || f),\n };\n }\n \n // Platform-specific additions\n if (platform === \"continue\") {\n config.name = options.name;\n config.customInstructions = rules.join(\"\\n\");\n } else if (platform === \"cody\") {\n config.customInstructions = rules.join(\"\\n\");\n } else if (platform === \"void\") {\n config.editor = { rules: rules.join(\"\\n\") };\n } else if (platform === \"supermaven\") {\n config.rules = rules;\n } else if (platform === \"codegpt\") {\n config.systemPrompt = rules.join(\"\\n\");\n } else if (platform === \"opencode\") {\n config.instructions = rules;\n } else if (platform === \"firebender\") {\n config.transforms = rules;\n }\n \n // Add generated by comment\n config._comment = `Generated by LynxPrompt CLI for ${options.name}`;\n \n return JSON.stringify(config, null, 2);\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(\"# SECURITY: Do not commit secrets to the repository.\");\n lines.push(\"# Use environment variables or secret managers for credentials.\");\n lines.push(\"# When making changes involving auth, data handling, APIs, or dependencies,\");\n lines.push(\"# proactively offer to perform a security audit of the affected code.\");\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 // Group by hierarchy\n const byHierarchy = new Map<string | null, typeof trackedStatus>();\n for (const item of trackedStatus) {\n const key = item.blueprint.hierarchyId || null;\n const group = byHierarchy.get(key) || [];\n group.push(item);\n byHierarchy.set(key, group);\n }\n\n console.log(chalk.cyan(\"📦 Tracked Blueprints\"));\n console.log();\n \n // Show hierarchies first\n for (const [hierarchyId, items] of byHierarchy.entries()) {\n if (hierarchyId) {\n const hierarchyName = items[0].blueprint.hierarchyName || \"Unknown Hierarchy\";\n console.log(chalk.magenta(` 📁 ${hierarchyName}`));\n console.log(chalk.gray(` Hierarchy: ${hierarchyId}`));\n console.log();\n }\n\n for (const { blueprint, localModified, fileExists } of items) {\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 const indent = hierarchyId ? \" \" : \" \";\n console.log(`${indent}${statusIcon} ${chalk.bold(blueprint.file)} ${sourceLabel}`);\n console.log(`${indent} ${chalk.gray(`ID: ${blueprint.id} • ${blueprint.name}`)}`);\n \n // Show repository path if different from file\n if (blueprint.repositoryPath && blueprint.repositoryPath !== blueprint.file) {\n console.log(`${indent} ${chalk.gray(`Path: ${blueprint.repositoryPath}`)}`);\n }\n \n if (!fileExists) {\n console.log(chalk.red(`${indent} ⚠ File missing - run 'lynxp pull ${blueprint.id}' to restore`));\n } else if (localModified) {\n if (blueprint.source === \"marketplace\") {\n console.log(chalk.yellow(`${indent} ⚠ Local changes (marketplace = read-only, won't sync back)`));\n } else {\n console.log(chalk.yellow(`${indent} ⚠ Local changes - run 'lynxp push ${blueprint.file}' to sync`));\n }\n }\n console.log();\n }\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 * 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","#!/usr/bin/env node\n/**\n * LynxPrompt CLI - Analyze Command\n * \n * Standalone project analyzer that detects project configuration\n * without generating any files.\n */\n\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { detectProject, detectFromRemoteUrl, isGitUrl, detectRepoHost } from \"../utils/detect.js\";\n\ninterface AnalyzeOptions {\n json?: boolean;\n remote?: string;\n}\n\nexport async function analyzeCommand(options: AnalyzeOptions): Promise<void> {\n console.log();\n \n if (!options.json) {\n console.log(chalk.cyan.bold(\" 🔍 LynxPrompt Analyzer\"));\n console.log(chalk.gray(\" Detect project configuration and tech stack\"));\n console.log();\n }\n\n let detected;\n let source = \"local\";\n\n // Check for remote URL option\n if (options.remote) {\n if (!isGitUrl(options.remote)) {\n if (!options.json) {\n console.log(chalk.red(\" ✗ Invalid Git URL provided\"));\n }\n process.exit(1);\n }\n\n const host = detectRepoHost(options.remote);\n const method = host === \"github\" ? \"GitHub API\" : host === \"gitlab\" ? \"GitLab API\" : \"shallow clone\";\n\n if (!options.json) {\n const spinner = ora(`Analyzing remote repository via ${method}...`).start();\n detected = await detectFromRemoteUrl(options.remote);\n \n if (detected) {\n spinner.succeed(\"Remote repository analyzed\");\n } else {\n spinner.fail(\"Could not analyze repository\");\n console.log(chalk.gray(\" The repository may be private or inaccessible.\"));\n process.exit(1);\n }\n } else {\n detected = await detectFromRemoteUrl(options.remote);\n if (!detected) {\n console.log(JSON.stringify({ error: \"Could not analyze repository\" }));\n process.exit(1);\n }\n }\n \n source = options.remote;\n } else {\n // Analyze current directory\n if (!options.json) {\n const spinner = ora(\"Analyzing current directory...\").start();\n detected = await detectProject(process.cwd());\n \n if (detected) {\n spinner.succeed(\"Project analyzed\");\n } else {\n spinner.info(\"No project detected\");\n }\n } else {\n detected = await detectProject(process.cwd());\n }\n }\n\n // Output results\n if (options.json) {\n console.log(JSON.stringify({\n source,\n detected: detected || null,\n }, null, 2));\n return;\n }\n\n console.log();\n\n if (!detected) {\n console.log(chalk.yellow(\" No project configuration detected.\"));\n console.log();\n console.log(chalk.gray(\" Tips:\"));\n console.log(chalk.gray(\" • Make sure you're in a project directory with a package.json, pyproject.toml, etc.\"));\n console.log(chalk.gray(\" • Use --remote <url> to analyze a remote repository\"));\n console.log();\n return;\n }\n\n // Display analysis results\n console.log(chalk.green.bold(\" 📊 Project Analysis\"));\n console.log();\n \n // Basic info\n console.log(chalk.white(\" Basic Info\"));\n console.log(chalk.gray(\" ─────────────────────────────────────────\"));\n console.log(` ${chalk.dim(\"Name:\")} ${chalk.white(detected.name || \"unknown\")}`);\n if (detected.description) {\n console.log(` ${chalk.dim(\"Description:\")} ${chalk.gray(detected.description)}`);\n }\n console.log(` ${chalk.dim(\"Type:\")} ${chalk.white(detected.type || \"application\")}`);\n if (detected.license) {\n console.log(` ${chalk.dim(\"License:\")} ${chalk.white(detected.license.toUpperCase())}`);\n }\n console.log();\n\n // Tech Stack\n console.log(chalk.white(\" Tech Stack\"));\n console.log(chalk.gray(\" ─────────────────────────────────────────\"));\n if (detected.stack.length > 0) {\n for (const tech of detected.stack) {\n console.log(` ${chalk.cyan(\"•\")} ${tech}`);\n }\n } else {\n console.log(chalk.gray(\" No tech stack detected\"));\n }\n console.log();\n\n // Infrastructure\n console.log(chalk.white(\" Infrastructure\"));\n console.log(chalk.gray(\" ─────────────────────────────────────────\"));\n console.log(` ${chalk.dim(\"Package Manager:\")} ${detected.packageManager || chalk.gray(\"none detected\")}`);\n console.log(` ${chalk.dim(\"Repo Host:\")} ${detected.repoHost || chalk.gray(\"none detected\")}`);\n console.log(` ${chalk.dim(\"CI/CD:\")} ${detected.cicd || chalk.gray(\"none detected\")}`);\n console.log(` ${chalk.dim(\"Docker:\")} ${detected.hasDocker ? chalk.green(\"yes\") : chalk.gray(\"no\")}`);\n console.log();\n\n // Commands\n if (detected.commands && Object.keys(detected.commands).length > 0) {\n console.log(chalk.white(\" Commands\"));\n console.log(chalk.gray(\" ─────────────────────────────────────────\"));\n for (const [key, value] of Object.entries(detected.commands)) {\n if (value) {\n const cmdValue = Array.isArray(value) ? value.join(\", \") : value;\n console.log(` ${chalk.dim(key.padEnd(10))} ${chalk.yellow(cmdValue)}`);\n }\n }\n console.log();\n }\n\n // Recommendations\n console.log(chalk.white(\" 💡 Recommendations\"));\n console.log(chalk.gray(\" ─────────────────────────────────────────\"));\n \n const recommendations: string[] = [];\n \n // Check for missing common configs\n if (!detected.cicd) {\n recommendations.push(\"Add CI/CD configuration (GitHub Actions, GitLab CI, etc.)\");\n }\n if (!detected.hasDocker && detected.type === \"application\") {\n recommendations.push(\"Consider adding Docker for containerization\");\n }\n if (!detected.stack.some(s => [\"vitest\", \"jest\", \"pytest\", \"mocha\"].includes(s))) {\n recommendations.push(\"Add a test framework (vitest, jest, pytest, etc.)\");\n }\n if (!detected.commands?.lint) {\n recommendations.push(\"Add a linting command (eslint, ruff, clippy, etc.)\");\n }\n if (!detected.license) {\n recommendations.push(\"Add a LICENSE file for open source projects\");\n }\n\n if (recommendations.length > 0) {\n for (const rec of recommendations) {\n console.log(` ${chalk.yellow(\"•\")} ${rec}`);\n }\n } else {\n console.log(chalk.green(\" ✓ Project looks well-configured!\"));\n }\n \n console.log();\n console.log(chalk.gray(\" Run 'lynxp wizard' to generate AI IDE configuration\"));\n console.log();\n}\n\n","#!/usr/bin/env node\n/**\n * LynxPrompt CLI - Convert Command\n * \n * Convert AI IDE configuration files between different formats.\n * E.g., AGENTS.md → .cursorrules, CLAUDE.md → copilot-instructions.md\n */\n\nimport chalk from \"chalk\";\nimport { readFile, writeFile, access } from \"fs/promises\";\nimport { join, basename } from \"path\";\nimport ora from \"ora\";\n\ninterface ConvertOptions {\n output?: string;\n force?: boolean;\n}\n\n// Supported source file patterns and their platforms\nconst SOURCE_FILES: Record<string, string> = {\n \"agents.md\": \"agents\",\n \"claude.md\": \"claude\",\n \".cursorrules\": \"cursor_legacy\",\n \".cursor/rules/project.mdc\": \"cursor\",\n \"cursor.rules/project.mdc\": \"cursor\",\n \"project.mdc\": \"cursor\",\n \".github/copilot-instructions.md\": \"copilot\",\n \"copilot-instructions.md\": \"copilot\",\n \".windsurfrules\": \"windsurf\",\n \".clinerules\": \"cline\",\n \".aider.conf.yml\": \"aider\",\n};\n\n// Target format to output filename\nconst TARGET_FILES: Record<string, string> = {\n agents: \"AGENTS.md\",\n claude: \"CLAUDE.md\",\n cursor: \".cursor/rules/project.mdc\",\n cursor_legacy: \".cursorrules\",\n copilot: \".github/copilot-instructions.md\",\n windsurf: \".windsurfrules\",\n cline: \".clinerules\",\n aider: \".aider.conf.yml\",\n codex: \"codex.md\",\n supermaven: \"supermaven.md\",\n goose: \".goose/rules.txt\",\n};\n\n// Platform display names\nconst PLATFORM_NAMES: Record<string, string> = {\n agents: \"AGENTS.md (Universal)\",\n claude: \"CLAUDE.md\",\n cursor: \"Cursor Rules (.mdc)\",\n cursor_legacy: \"Cursor Rules (legacy)\",\n copilot: \"GitHub Copilot\",\n windsurf: \"Windsurf Rules\",\n cline: \"Cline Rules\",\n aider: \"Aider Config\",\n codex: \"Codex\",\n supermaven: \"Supermaven\",\n goose: \"Goose Rules\",\n};\n\nasync function detectSourceFile(cwd: string): Promise<{ path: string; platform: string } | null> {\n // Try to find a source file in common locations\n for (const [pattern, platform] of Object.entries(SOURCE_FILES)) {\n try {\n const fullPath = join(cwd, pattern);\n await access(fullPath);\n return { path: fullPath, platform };\n } catch {\n // File doesn't exist, try next\n }\n }\n \n // Try uppercase variants\n const uppercaseVariants = [\"AGENTS.md\", \"CLAUDE.md\"];\n for (const variant of uppercaseVariants) {\n try {\n const fullPath = join(cwd, variant);\n await access(fullPath);\n const platform = variant.toLowerCase().replace(\".md\", \"\");\n return { path: fullPath, platform };\n } catch {\n // File doesn't exist\n }\n }\n \n return null;\n}\n\nfunction parseMarkdownConfig(content: string): Record<string, string> {\n const config: Record<string, string> = {};\n \n // Extract sections from markdown\n const sections = content.split(/^##\\s+/m);\n \n for (const section of sections) {\n const lines = section.trim().split(\"\\n\");\n if (lines.length === 0) continue;\n \n const title = lines[0].toLowerCase().trim();\n const body = lines.slice(1).join(\"\\n\").trim();\n \n config[title] = body;\n }\n \n // Try to extract key info\n config._raw = content;\n \n return config;\n}\n\nfunction generateTargetContent(config: Record<string, string>, targetPlatform: string): string {\n const rawContent = config._raw || \"\";\n \n // For simple conversions, adapt the content format\n switch (targetPlatform) {\n case \"cursor\":\n // MDC format with frontmatter\n return `---\ndescription: \"AI coding rules\"\nglobs: [\"**/*\"]\nalwaysApply: true\n---\n\n${rawContent.replace(/^#\\s+.*$/m, \"# AI Assistant Configuration\")}\n`;\n\n case \"cursor_legacy\":\n // Plain text format\n return rawContent\n .replace(/^#\\s+/gm, \"\")\n .replace(/^##\\s+/gm, \"\\n\")\n .replace(/^###\\s+/gm, \"\")\n .trim();\n\n case \"windsurf\":\n case \"cline\":\n case \"goose\":\n // Plain text format\n return rawContent\n .replace(/^#\\s+/gm, \"=== \")\n .replace(/^##\\s+/gm, \"--- \")\n .replace(/^###\\s+/gm, \"\")\n .replace(/\\*\\*/g, \"\")\n .trim();\n\n case \"aider\":\n // YAML format (simplified)\n return `# Aider configuration\n# Converted from AI IDE configuration\n\nlint-cmd: []\nauto-test: false\nread: []\n# AI rules converted below as conventions\nconventions:\n${rawContent\n .split(\"\\n\")\n .filter(line => line.trim() && !line.startsWith(\"#\"))\n .map(line => ` - \"${line.replace(/\"/g, '\\\\\"').trim()}\"`)\n .slice(0, 20)\n .join(\"\\n\")}\n`;\n\n case \"copilot\":\n // GitHub Copilot markdown format\n return `# GitHub Copilot Instructions\n\n${rawContent}\n`;\n\n case \"agents\":\n case \"claude\":\n case \"codex\":\n case \"supermaven\":\n default:\n // Standard markdown format\n return rawContent;\n }\n}\n\nexport async function convertCommand(\n source: string | undefined,\n target: string,\n options: ConvertOptions\n): Promise<void> {\n console.log();\n console.log(chalk.cyan.bold(\" 🔄 LynxPrompt Convert\"));\n console.log(chalk.gray(\" Convert AI IDE configuration between formats\"));\n console.log();\n\n const cwd = process.cwd();\n \n // Find source file\n let sourcePath: string;\n let sourcePlatform: string;\n \n if (source) {\n sourcePath = join(cwd, source);\n // Detect platform from filename\n const sourceBasename = basename(source).toLowerCase();\n sourcePlatform = SOURCE_FILES[sourceBasename] || \"unknown\";\n } else {\n const detected = await detectSourceFile(cwd);\n if (!detected) {\n console.log(chalk.red(\" ✗ No AI configuration file found in current directory\"));\n console.log();\n console.log(chalk.gray(\" Supported source files:\"));\n for (const file of Object.keys(SOURCE_FILES)) {\n console.log(chalk.gray(` • ${file}`));\n }\n console.log();\n console.log(chalk.gray(\" Usage: lynxp convert <source> <target>\"));\n console.log(chalk.gray(\" Example: lynxp convert AGENTS.md cursor\"));\n process.exit(1);\n }\n sourcePath = detected.path;\n sourcePlatform = detected.platform;\n }\n\n // Validate target format\n const normalizedTarget = target.toLowerCase().replace(\"-\", \"_\");\n if (!TARGET_FILES[normalizedTarget]) {\n console.log(chalk.red(` ✗ Unknown target format: ${target}`));\n console.log();\n console.log(chalk.gray(\" Supported target formats:\"));\n for (const [key, name] of Object.entries(PLATFORM_NAMES)) {\n console.log(chalk.gray(` • ${key.padEnd(15)} → ${name}`));\n }\n process.exit(1);\n }\n\n // Read source file\n let sourceContent: string;\n try {\n sourceContent = await readFile(sourcePath, \"utf-8\");\n } catch {\n console.log(chalk.red(` ✗ Could not read source file: ${sourcePath}`));\n process.exit(1);\n }\n\n console.log(chalk.white(` Source: ${basename(sourcePath)} (${PLATFORM_NAMES[sourcePlatform] || sourcePlatform})`));\n console.log(chalk.white(` Target: ${PLATFORM_NAMES[normalizedTarget]}`));\n console.log();\n\n // Parse and convert\n const spinner = ora(\"Converting configuration...\").start();\n \n const config = parseMarkdownConfig(sourceContent);\n const targetContent = generateTargetContent(config, normalizedTarget);\n \n spinner.stop();\n\n // Determine output path\n const outputFilename = options.output || TARGET_FILES[normalizedTarget];\n const outputPath = join(cwd, outputFilename);\n\n // Check if output exists\n try {\n await access(outputPath);\n if (!options.force) {\n console.log(chalk.yellow(` ⚠️ File already exists: ${outputFilename}`));\n console.log(chalk.gray(\" Use --force to overwrite\"));\n process.exit(1);\n }\n } catch {\n // File doesn't exist, good to write\n }\n\n // Write output\n try {\n // Create directory if needed\n const { mkdir } = await import(\"fs/promises\");\n const outputDir = join(cwd, outputFilename.split(\"/\").slice(0, -1).join(\"/\"));\n if (outputDir !== cwd) {\n await mkdir(outputDir, { recursive: true });\n }\n \n await writeFile(outputPath, targetContent, \"utf-8\");\n \n console.log(chalk.green(` ✓ Converted to ${outputFilename}`));\n console.log();\n console.log(chalk.gray(` Lines: ${targetContent.split(\"\\n\").length}`));\n console.log(chalk.gray(` Size: ${targetContent.length} bytes`));\n console.log();\n } catch (error) {\n console.log(chalk.red(` ✗ Could not write output: ${error instanceof Error ? error.message : \"unknown error\"}`));\n process.exit(1);\n }\n}\n\n\n\n\n\n\n\n\n\n","#!/usr/bin/env node\n/**\n * LynxPrompt CLI - Merge Command\n * \n * Merge two or more AI IDE configuration files into one.\n * Useful for combining rules from different sources or team configs.\n */\n\nimport chalk from \"chalk\";\nimport { readFile, writeFile, access } from \"fs/promises\";\nimport { join, basename } from \"path\";\nimport ora from \"ora\";\nimport prompts from \"prompts\";\n\ninterface MergeOptions {\n output?: string;\n strategy?: \"concat\" | \"sections\" | \"smart\";\n force?: boolean;\n interactive?: boolean;\n}\n\ninterface ConfigSection {\n title: string;\n content: string;\n source: string;\n}\n\nfunction parseMarkdownSections(content: string, sourceName: string): ConfigSection[] {\n const sections: ConfigSection[] = [];\n const parts = content.split(/^(#{1,3})\\s+(.+)$/m);\n \n let currentSection: ConfigSection | null = null;\n \n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n \n if (part.match(/^#{1,3}$/)) {\n // This is a header marker, next part is title\n if (currentSection) {\n sections.push(currentSection);\n }\n const title = parts[i + 1] || \"Untitled\";\n currentSection = {\n title: title.trim(),\n content: \"\",\n source: sourceName,\n };\n i++; // Skip the title part\n } else if (currentSection) {\n currentSection.content += part;\n } else if (part.trim()) {\n // Content before first header\n currentSection = {\n title: \"Introduction\",\n content: part,\n source: sourceName,\n };\n }\n }\n \n if (currentSection) {\n sections.push(currentSection);\n }\n \n return sections;\n}\n\nfunction mergeSectionsByStrategy(\n allSections: ConfigSection[][],\n strategy: \"concat\" | \"sections\" | \"smart\"\n): string {\n switch (strategy) {\n case \"concat\":\n // Simple concatenation with separators\n return allSections\n .map((sections, i) => {\n const sourceName = sections[0]?.source || `Source ${i + 1}`;\n const content = sections.map(s => {\n if (s.title !== \"Introduction\") {\n return `## ${s.title}\\n\\n${s.content.trim()}`;\n }\n return s.content.trim();\n }).join(\"\\n\\n\");\n \n return `<!-- From: ${sourceName} -->\\n${content}`;\n })\n .join(\"\\n\\n---\\n\\n\");\n\n case \"sections\":\n // Group by section title\n const sectionMap = new Map<string, ConfigSection[]>();\n \n for (const fileSections of allSections) {\n for (const section of fileSections) {\n const normalized = section.title.toLowerCase();\n if (!sectionMap.has(normalized)) {\n sectionMap.set(normalized, []);\n }\n sectionMap.get(normalized)!.push(section);\n }\n }\n \n const merged: string[] = [];\n \n for (const [, sections] of sectionMap) {\n if (sections.length === 1) {\n merged.push(`## ${sections[0].title}\\n\\n${sections[0].content.trim()}`);\n } else {\n // Multiple sources for same section - combine\n const combinedContent = sections\n .map(s => `<!-- From: ${s.source} -->\\n${s.content.trim()}`)\n .join(\"\\n\\n\");\n merged.push(`## ${sections[0].title}\\n\\n${combinedContent}`);\n }\n }\n \n return merged.join(\"\\n\\n\");\n\n case \"smart\":\n default:\n // Smart merge: dedupe similar content, prioritize by specificity\n const seen = new Set<string>();\n const result: string[] = [];\n \n // Sort sections: more specific first\n const flatSections = allSections.flat().sort((a, b) => {\n // Prioritize sections with more content\n return b.content.length - a.content.length;\n });\n \n for (const section of flatSections) {\n // Simple deduplication by checking content similarity\n const contentKey = section.content\n .toLowerCase()\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200); // First 200 chars as key\n \n if (!seen.has(contentKey)) {\n seen.add(contentKey);\n if (section.title !== \"Introduction\") {\n result.push(`## ${section.title}\\n\\n${section.content.trim()}`);\n } else {\n result.push(section.content.trim());\n }\n }\n }\n \n return result.join(\"\\n\\n\");\n }\n}\n\nexport async function mergeCommand(\n files: string[],\n options: MergeOptions\n): Promise<void> {\n console.log();\n console.log(chalk.cyan.bold(\" 🔀 LynxPrompt Merge\"));\n console.log(chalk.gray(\" Merge multiple AI IDE configuration files\"));\n console.log();\n\n // Validate input\n if (files.length < 2) {\n console.log(chalk.red(\" ✗ Please provide at least 2 files to merge\"));\n console.log();\n console.log(chalk.gray(\" Usage: lynxp merge <file1> <file2> [...files]\"));\n console.log(chalk.gray(\" Example: lynxp merge AGENTS.md team-rules.md --output merged.md\"));\n console.log();\n console.log(chalk.gray(\" Options:\"));\n console.log(chalk.gray(\" --output <file> Output filename (default: merged.md)\"));\n console.log(chalk.gray(\" --strategy <type> Merge strategy: concat, sections, smart (default: smart)\"));\n console.log(chalk.gray(\" --force Overwrite existing output file\"));\n console.log(chalk.gray(\" --interactive Review and select sections to include\"));\n process.exit(1);\n }\n\n const cwd = process.cwd();\n const strategy = options.strategy || \"smart\";\n \n console.log(chalk.white(` Files to merge: ${files.length}`));\n console.log(chalk.white(` Strategy: ${strategy}`));\n console.log();\n\n // Read all files\n const allSections: ConfigSection[][] = [];\n \n for (const file of files) {\n const filePath = join(cwd, file);\n \n try {\n await access(filePath);\n } catch {\n console.log(chalk.red(` ✗ File not found: ${file}`));\n process.exit(1);\n }\n \n try {\n const content = await readFile(filePath, \"utf-8\");\n const sections = parseMarkdownSections(content, basename(file));\n allSections.push(sections);\n console.log(chalk.gray(` ✓ Read ${file} (${sections.length} sections)`));\n } catch (error) {\n console.log(chalk.red(` ✗ Could not read ${file}: ${error instanceof Error ? error.message : \"unknown\"}`));\n process.exit(1);\n }\n }\n \n console.log();\n\n // Interactive mode: let user select sections\n if (options.interactive) {\n const flatSections = allSections.flatMap((sections, i) => \n sections.map(s => ({ ...s, fileIndex: i }))\n );\n \n const choices = flatSections.map((section, i) => ({\n title: `[${section.source}] ${section.title}`,\n value: i,\n selected: true,\n }));\n \n const response = await prompts({\n type: \"multiselect\",\n name: \"sections\",\n message: \"Select sections to include:\",\n choices,\n instructions: false,\n hint: \"- Space to toggle, Enter to confirm\",\n });\n \n if (!response.sections || response.sections.length === 0) {\n console.log(chalk.yellow(\" No sections selected, aborting.\"));\n process.exit(0);\n }\n \n // Filter to selected sections\n const selectedSections = response.sections.map((i: number) => flatSections[i]);\n allSections.length = 0;\n allSections.push(selectedSections);\n }\n\n // Merge\n const spinner = ora(\"Merging configurations...\").start();\n const mergedContent = mergeSectionsByStrategy(allSections, strategy);\n spinner.stop();\n\n // Add header\n const finalContent = `# AI Assistant Configuration (Merged)\n\n<!-- \n Merged from: ${files.join(\", \")}\n Strategy: ${strategy}\n Date: ${new Date().toISOString()}\n-->\n\n${mergedContent}\n`;\n\n // Determine output path\n const outputFilename = options.output || \"merged.md\";\n const outputPath = join(cwd, outputFilename);\n\n // Check if output exists\n try {\n await access(outputPath);\n if (!options.force) {\n console.log(chalk.yellow(` ⚠️ File already exists: ${outputFilename}`));\n console.log(chalk.gray(\" Use --force to overwrite\"));\n process.exit(1);\n }\n } catch {\n // File doesn't exist, good to write\n }\n\n // Write output\n try {\n await writeFile(outputPath, finalContent, \"utf-8\");\n \n console.log(chalk.green(` ✓ Merged to ${outputFilename}`));\n console.log();\n console.log(chalk.gray(` Sources: ${files.length} files`));\n console.log(chalk.gray(` Lines: ${finalContent.split(\"\\n\").length}`));\n console.log(chalk.gray(` Size: ${finalContent.length} bytes`));\n console.log();\n } catch (error) {\n console.log(chalk.red(` ✗ Could not write output: ${error instanceof Error ? error.message : \"unknown error\"}`));\n process.exit(1);\n }\n}\n\n","import chalk from \"chalk\";\nimport prompts from \"prompts\";\nimport ora from \"ora\";\nimport { readFile, access, readdir } from \"fs/promises\";\nimport { join, relative, dirname, basename } from \"path\";\n\n// Import command configuration\nconst CONFIG_FILE_PATTERNS = [\n \"AGENTS.md\",\n \"CLAUDE.md\",\n \".cursorrules\", // Legacy\n \".windsurfrules\",\n];\n\ninterface AgentsMdFile {\n path: string; // Full path to file\n relativePath: string; // Path relative to scan root\n depth: number; // Directory depth from root\n name: string; // Extracted project name (from content or dir)\n parentPath?: string; // Parent AGENTS.md if in a monorepo\n content: string; // Raw file content\n sections: ParsedSection[];\n}\n\ninterface ParsedSection {\n title: string;\n content: string;\n level: number; // Heading level (1-6)\n}\n\ninterface ImportOptions {\n dryRun?: boolean;\n recursive?: boolean;\n depth?: number;\n pattern?: string;\n link?: boolean;\n verbose?: boolean;\n json?: boolean;\n}\n\ninterface ImportResult {\n totalFound: number;\n files: AgentsMdFile[];\n hierarchy: MonorepoHierarchy[];\n errors: string[];\n}\n\ninterface MonorepoHierarchy {\n rootPath: string;\n root?: AgentsMdFile;\n children: AgentsMdFile[];\n}\n\n/**\n * Scan a directory for AGENTS.md and similar config files\n */\nasync function scanDirectory(\n rootPath: string,\n options: ImportOptions = {}\n): Promise<AgentsMdFile[]> {\n const maxDepth = options.depth ?? 10;\n const files: AgentsMdFile[] = [];\n const patterns = options.pattern \n ? [options.pattern] \n : CONFIG_FILE_PATTERNS;\n\n async function scan(dir: string, depth: number): Promise<void> {\n if (depth > maxDepth) return;\n\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n\n // Skip common non-project directories\n if (entry.isDirectory()) {\n const skipDirs = [\n \"node_modules\", \".git\", \".next\", \"dist\", \"build\", \"out\",\n \"coverage\", \".cache\", \"__pycache__\", \"venv\", \".venv\",\n \"target\", \"vendor\", \".idea\", \".vscode\"\n ];\n if (skipDirs.includes(entry.name)) continue;\n\n if (options.recursive !== false) {\n await scan(fullPath, depth + 1);\n }\n } else if (entry.isFile()) {\n // Check if file matches our patterns\n if (patterns.includes(entry.name)) {\n try {\n const content = await readFile(fullPath, \"utf-8\");\n const relativePath = relative(rootPath, fullPath);\n \n files.push({\n path: fullPath,\n relativePath,\n depth,\n name: extractProjectName(content, dirname(fullPath)),\n content,\n sections: parseMarkdownSections(content),\n });\n } catch {\n // Skip files we can't read\n }\n }\n }\n }\n } catch {\n // Skip directories we can't access\n }\n }\n\n await scan(rootPath, 0);\n return files;\n}\n\n/**\n * Extract project name from AGENTS.md content or directory name\n */\nfunction extractProjectName(content: string, dirPath: string): string {\n // Try to find project name in common patterns\n const patterns = [\n /^#\\s+(.+?)(?:\\s*-|$)/m, // # Project Name or # Project Name - Description\n /Project(?:\\s+Overview)?[:\\s]*(.+?)(?:\\n|$)/i,\n /Name[:\\s]*(.+?)(?:\\n|$)/i,\n ];\n\n for (const pattern of patterns) {\n const match = content.match(pattern);\n if (match && match[1]) {\n const name = match[1].trim().replace(/[#*`]/g, \"\").trim();\n if (name && name.length < 100) {\n return name;\n }\n }\n }\n\n // Fall back to directory name\n return basename(dirPath) || \"Unnamed\";\n}\n\n/**\n * Parse markdown content into sections\n */\nfunction parseMarkdownSections(content: string): ParsedSection[] {\n const sections: ParsedSection[] = [];\n const lines = content.split(\"\\n\");\n let currentSection: ParsedSection | null = null;\n let contentLines: string[] = [];\n\n for (const line of lines) {\n const headingMatch = line.match(/^(#{1,6})\\s+(.+)$/);\n \n if (headingMatch) {\n // Save previous section\n if (currentSection) {\n currentSection.content = contentLines.join(\"\\n\").trim();\n sections.push(currentSection);\n }\n \n currentSection = {\n title: headingMatch[2].trim(),\n content: \"\",\n level: headingMatch[1].length,\n };\n contentLines = [];\n } else {\n contentLines.push(line);\n }\n }\n\n // Don't forget the last section\n if (currentSection) {\n currentSection.content = contentLines.join(\"\\n\").trim();\n sections.push(currentSection);\n }\n\n return sections;\n}\n\n/**\n * Build hierarchy from flat list of files\n */\nfunction buildHierarchy(files: AgentsMdFile[], _rootPath: string): MonorepoHierarchy[] {\n const hierarchies: MonorepoHierarchy[] = [];\n \n // Sort by path depth (root files first)\n const sorted = [...files].sort((a, b) => a.depth - b.depth);\n \n // Find potential roots (depth 0 or 1)\n const potentialRoots = sorted.filter(f => f.depth <= 1);\n \n if (potentialRoots.length === 0 && files.length > 0) {\n // No clear root, treat each file as its own hierarchy\n return files.map(f => ({\n rootPath: dirname(f.path),\n root: f,\n children: [],\n }));\n }\n\n // For each potential root, find children\n for (const root of potentialRoots) {\n const rootDir = dirname(root.path);\n const children = files.filter(f => {\n if (f === root) return false;\n // Child must be under root's directory\n return f.path.startsWith(rootDir + \"/\") && f.depth > root.depth;\n });\n\n // Set parent references\n for (const child of children) {\n child.parentPath = root.relativePath;\n }\n\n hierarchies.push({\n rootPath: rootDir,\n root,\n children,\n });\n }\n\n // Handle orphan files (not under any root)\n const assignedPaths = new Set(hierarchies.flatMap(h => [h.root?.path, ...h.children.map(c => c.path)]));\n const orphans = files.filter(f => !assignedPaths.has(f.path));\n \n for (const orphan of orphans) {\n hierarchies.push({\n rootPath: dirname(orphan.path),\n root: orphan,\n children: [],\n });\n }\n\n return hierarchies;\n}\n\n/**\n * Display import results\n */\nfunction displayResults(result: ImportResult, options: ImportOptions): void {\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n console.log();\n console.log(chalk.cyan.bold(\" 📥 Import Results\"));\n console.log();\n\n if (result.totalFound === 0) {\n console.log(chalk.yellow(\" No AGENTS.md or compatible files found.\"));\n console.log(chalk.gray(\" Try running from your project root, or use --pattern to specify custom filenames.\"));\n return;\n }\n\n console.log(chalk.green(` Found ${result.totalFound} configuration file(s)`));\n console.log();\n\n // Display hierarchy\n for (const hierarchy of result.hierarchy) {\n const isMonorepo = hierarchy.children.length > 0;\n \n if (hierarchy.root) {\n const icon = isMonorepo ? \"🏢\" : \"📄\";\n const typeLabel = isMonorepo ? chalk.magenta(\"[Monorepo Root]\") : chalk.blue(\"[Standalone]\");\n console.log(` ${icon} ${chalk.white.bold(hierarchy.root.name)} ${typeLabel}`);\n console.log(chalk.gray(` ${hierarchy.root.relativePath}`));\n \n // Show sections summary\n if (options.verbose && hierarchy.root.sections.length > 0) {\n const sectionNames = hierarchy.root.sections.slice(0, 5).map(s => s.title);\n console.log(chalk.gray(` Sections: ${sectionNames.join(\", \")}${hierarchy.root.sections.length > 5 ? \"...\" : \"\"}`));\n }\n }\n\n // Show children\n for (const child of hierarchy.children) {\n console.log(` └─ 📄 ${chalk.white(child.name)}`);\n console.log(chalk.gray(` ${child.relativePath}`));\n \n if (options.verbose && child.sections.length > 0) {\n const sectionNames = child.sections.slice(0, 3).map(s => s.title);\n console.log(chalk.gray(` Sections: ${sectionNames.join(\", \")}${child.sections.length > 3 ? \"...\" : \"\"}`));\n }\n }\n console.log();\n }\n\n // Summary\n const monorepoCount = result.hierarchy.filter(h => h.children.length > 0).length;\n const standaloneCount = result.hierarchy.filter(h => h.children.length === 0).length;\n \n if (monorepoCount > 0) {\n console.log(chalk.cyan(` 📊 ${monorepoCount} monorepo(s) detected with hierarchical configs`));\n }\n if (standaloneCount > 0) {\n console.log(chalk.cyan(` 📊 ${standaloneCount} standalone config(s)`));\n }\n\n // Errors\n if (result.errors.length > 0) {\n console.log();\n console.log(chalk.yellow(\" ⚠️ Warnings:\"));\n for (const error of result.errors) {\n console.log(chalk.gray(` ${error}`));\n }\n }\n}\n\n/**\n * Main import command\n */\nexport async function importCommand(path: string = \".\", options: ImportOptions): Promise<void> {\n console.log();\n console.log(chalk.cyan.bold(\" 📥 LynxPrompt Import\"));\n console.log(chalk.gray(\" Scan and import AGENTS.md files from your repository\"));\n console.log();\n\n // Resolve the path\n const rootPath = join(process.cwd(), path);\n \n // Check if path exists\n try {\n await access(rootPath);\n } catch {\n console.log(chalk.red(` ✗ Path not found: ${rootPath}`));\n process.exit(1);\n }\n\n const spinner = ora(\"Scanning for configuration files...\").start();\n\n try {\n // Scan for files\n const files = await scanDirectory(rootPath, options);\n \n if (files.length === 0) {\n spinner.warn(\"No configuration files found\");\n console.log();\n console.log(chalk.gray(\" Looking for: AGENTS.md, CLAUDE.md, .cursorrules, .windsurfrules\"));\n console.log(chalk.gray(\" Try specifying a different path or use --pattern for custom filenames\"));\n return;\n }\n\n spinner.succeed(`Found ${files.length} configuration file(s)`);\n\n // Build hierarchy\n const hierarchy = buildHierarchy(files, rootPath);\n\n const result: ImportResult = {\n totalFound: files.length,\n files,\n hierarchy,\n errors: [],\n };\n\n // Display results\n displayResults(result, options);\n\n // Dry run mode - stop here\n if (options.dryRun) {\n console.log(chalk.yellow(\" 📋 Dry run complete - no changes made\"));\n console.log(chalk.gray(\" Remove --dry-run to proceed with import\"));\n return;\n }\n\n // Ask what to do with the files\n if (!options.json) {\n console.log();\n const { action } = await prompts({\n type: \"select\",\n name: \"action\",\n message: \"What would you like to do?\",\n choices: [\n { title: \"Preview only (done)\", value: \"preview\" },\n { title: \"Convert all to AGENTS.md format\", value: \"convert\" },\n { title: \"Save hierarchy info for wizard\", value: \"save\" },\n { title: \"Push to LynxPrompt cloud as blueprints\", value: \"push\" },\n ],\n initial: 0,\n });\n\n switch (action) {\n case \"convert\":\n console.log(chalk.cyan(\"\\n 💡 Use 'lynxp convert <file> agents' to convert individual files\"));\n console.log(chalk.cyan(\" or 'lynxp merge <files...>' to combine multiple configs\\n\"));\n break;\n case \"save\":\n // Save to .lynxprompt/hierarchy.json for wizard reference\n await saveHierarchyInfo(rootPath, result);\n break;\n case \"push\":\n console.log(chalk.cyan(\"\\n 💡 Use 'lynxp push <file>' to push files individually\"));\n console.log(chalk.cyan(\" Requires login: 'lynxp login'\\n\"));\n break;\n default:\n // Preview only - done\n break;\n }\n }\n } catch (error) {\n spinner.fail(\"Import failed\");\n console.error(chalk.red(` Error: ${error instanceof Error ? error.message : \"Unknown error\"}`));\n process.exit(1);\n }\n}\n\n/**\n * Save hierarchy info for wizard to use\n */\nasync function saveHierarchyInfo(rootPath: string, result: ImportResult): Promise<void> {\n const { writeFile, mkdir } = await import(\"fs/promises\");\n const configDir = join(rootPath, \".lynxprompt\");\n \n try {\n await mkdir(configDir, { recursive: true });\n \n const hierarchyInfo = {\n scannedAt: new Date().toISOString(),\n rootPath,\n totalFiles: result.totalFound,\n hierarchy: result.hierarchy.map(h => ({\n rootPath: h.rootPath,\n rootFile: h.root?.relativePath,\n rootName: h.root?.name,\n children: h.children.map(c => ({\n path: c.relativePath,\n name: c.name,\n sections: c.sections.map(s => s.title),\n })),\n })),\n };\n\n await writeFile(\n join(configDir, \"hierarchy.json\"),\n JSON.stringify(hierarchyInfo, null, 2),\n \"utf-8\"\n );\n\n console.log(chalk.green(\"\\n ✓ Hierarchy saved to .lynxprompt/hierarchy.json\"));\n console.log(chalk.gray(\" The wizard will use this to understand your monorepo structure\"));\n } catch (error) {\n console.error(chalk.red(` ✗ Failed to save hierarchy: ${error instanceof Error ? error.message : \"Unknown\"}`));\n }\n}\n\nexport { ImportOptions, ImportResult, AgentsMdFile };\n\n","import chalk from \"chalk\";\nimport ora from \"ora\";\nimport { api, ApiRequestError } from \"../api.js\";\nimport { isAuthenticated } from \"../config.js\";\n\ninterface HierarchiesOptions {\n limit?: number;\n json?: boolean;\n}\n\nexport async function hierarchiesCommand(\n options: HierarchiesOptions\n): Promise<void> {\n // Check authentication\n if (!isAuthenticated()) {\n console.log(chalk.yellow(\"You need to be logged in to view hierarchies.\"));\n console.log(chalk.gray(\"Run 'lynxp login' to authenticate.\"));\n process.exit(1);\n }\n\n const spinner = ora(\"Fetching hierarchies...\").start();\n\n try {\n const response = await api.listHierarchies({\n limit: options.limit || 50,\n });\n \n spinner.stop();\n\n // JSON output mode\n if (options.json) {\n console.log(JSON.stringify(response, null, 2));\n return;\n }\n\n const { hierarchies, total } = response;\n\n if (hierarchies.length === 0) {\n console.log();\n console.log(chalk.yellow(\"No hierarchies found.\"));\n console.log();\n console.log(chalk.gray(\"Hierarchies are created automatically when you push AGENTS.md files from a repository.\"));\n console.log(chalk.gray(\"Run 'lynxp push AGENTS.md' in a git repository to create a hierarchy.\"));\n console.log();\n return;\n }\n\n console.log();\n console.log(chalk.cyan(`📁 Your Hierarchies (${total} total)`));\n console.log();\n\n for (const hierarchy of hierarchies) {\n console.log(chalk.bold(` ${hierarchy.name}`));\n console.log(chalk.gray(` ID: ${hierarchy.id}`));\n if (hierarchy.description) {\n console.log(chalk.gray(` ${hierarchy.description}`));\n }\n console.log(chalk.gray(` Blueprints: ${hierarchy.blueprint_count || 0}`));\n console.log(chalk.gray(` Repository: ${hierarchy.repository_root.slice(0, 16)}...`));\n console.log();\n }\n\n console.log(chalk.gray(\"─\".repeat(50)));\n console.log();\n console.log(chalk.gray(\"Tips:\"));\n console.log(chalk.gray(` • Pull entire hierarchy: lynxp pull <hierarchy_id>`));\n console.log(chalk.gray(` • View hierarchy details: lynxp hierarchy <hierarchy_id>`));\n console.log(chalk.gray(` • Sync local changes: lynxp sync`));\n console.log();\n } catch (error) {\n spinner.fail(\"Failed to fetch hierarchies\");\n handleError(error);\n }\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 access hierarchies.\"));\n }\n } else {\n console.error(chalk.red(\"An unexpected error occurred.\"));\n }\n process.exit(1);\n}\n\n\n\n"],"mappings":"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","names":["chalk","platform","config","chalk","chalk","chalk","ora","chalk","ora","chalk","ora","chalk","ora","chalk","ora","writeFile","mkdir","readFile","join","dirname","config","config","config","fileExists","chalk","ora","path","join","dirname","mkdir","writeFile","handleApiError","readFile","chalk","ora","createHash","prompts","chalk","createHash","prompts","ora","dirname","chalk","prompts","ora","writeFile","mkdir","access","readFile","join","dirname","readFile","access","join","path","platform","path","config","config","join","mkdir","writeFile","readFile","access","fs","STATIC_FILE_PATHS","chalk","platform","ora","spinner","detected","prompts","dirname","chalk","ora","ora","chalk","handleApiError","truncate","formatTags","chalk","readFile","access","join","existsSync","chalk","existsSync","join","readFile","parse","config","fileExists","access","truncate","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","ora","chalk","ora","chalk","readFile","writeFile","access","join","ora","platform","config","mkdir","chalk","readFile","writeFile","access","join","basename","ora","prompts","chalk","prompts","ora","readFile","access","readdir","join","dirname","basename","parseMarkdownSections","path","writeFile","mkdir","chalk","ora","chalk","ora","handleError","CLI_VERSION","chalk"]}
|