lynxprompt 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +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/commands/init.ts","../src/utils/detect.ts","../src/utils/generator.ts","../src/commands/search.ts","../src/commands/status.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 { initCommand } from \"./commands/init.js\";\nimport { searchCommand } from \"./commands/search.js\";\nimport { statusCommand } from \"./commands/status.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"lynxprompt\")\n .description(\"CLI for LynxPrompt - Generate AI IDE configuration files\")\n .version(\"0.1.0\");\n\n// Auth commands\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// Blueprint commands\nprogram\n .command(\"init\")\n .description(\"Interactive wizard to generate AI IDE configuration\")\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(\"-p, --platforms <platforms>\", \"Target platforms (comma-separated)\")\n .option(\"--persona <persona>\", \"AI persona/role\")\n .option(\"--boundaries <level>\", \"Boundary preset (conservative, standard, permissive)\")\n .option(\"--preset <preset>\", \"Use an agent preset (test-agent, docs-agent, etc.)\")\n .option(\"-y, --yes\", \"Skip prompts and use defaults\")\n .action(initCommand);\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 by visibility (PRIVATE, TEAM, PUBLIC, all)\")\n .action(listCommand);\n\nprogram\n .command(\"pull <id>\")\n .description(\"Download a blueprint to the current directory\")\n .option(\"-o, --output <path>\", \"Output directory\", \".\")\n .option(\"-y, --yes\", \"Overwrite existing files without prompting\")\n .action(pullCommand);\n\nprogram\n .command(\"search <query>\")\n .description(\"Search public blueprints\")\n .option(\"-l, --limit <number>\", \"Number of results\", \"20\")\n .action(searchCommand);\n\nprogram\n .command(\"status\")\n .description(\"Show current AI config status in this directory\")\n .action(statusCommand);\n\n// Add some styling to help\nprogram.addHelpText(\n \"beforeAll\",\n `\n${chalk.cyan(\"🐱 LynxPrompt CLI\")}\n${chalk.gray(\"Generate AI IDE configuration files from your terminal\")}\n`\n);\n\nprogram.addHelpText(\n \"after\",\n `\n${chalk.gray(\"Examples:\")}\n ${chalk.cyan(\"$ lynxprompt init\")} ${chalk.gray(\"Start interactive wizard\")}\n ${chalk.cyan(\"$ lynxprompt pull bp_abc123\")} ${chalk.gray(\"Download a blueprint\")}\n ${chalk.cyan(\"$ lynxprompt list\")} ${chalk.gray(\"List your blueprints\")}\n ${chalk.cyan(\"$ lynxprompt search nextjs\")} ${chalk.gray(\"Search public blueprints\")}\n\n${chalk.gray(\"Documentation: https://lynxprompt.com/docs/cli\")}\n`\n);\n\nprogram.parse();\n\n\n","import chalk from \"chalk\";\nimport ora from \"ora\";\nimport { api, ApiRequestError } from \"../api.js\";\nimport { setToken, setUser, isAuthenticated, getApiUrl } from \"../config.js\";\n\nexport async function loginCommand(): Promise<void> {\n if (isAuthenticated()) {\n console.log(\n chalk.yellow(\n \"You are already logged in. Use 'lynxprompt logout' first to switch accounts.\"\n )\n );\n return;\n }\n\n const spinner = ora(\"Initializing authentication...\").start();\n\n try {\n // Initialize CLI session\n const session = await api.initCliSession();\n spinner.stop();\n\n console.log();\n console.log(chalk.cyan(\"🔐 Opening browser to authenticate...\"));\n console.log(chalk.gray(` ${session.auth_url}`));\n console.log();\n\n // Try to open the browser\n const openBrowser = await tryOpenBrowser(session.auth_url);\n if (!openBrowser) {\n console.log(\n chalk.yellow(\"Could not open browser automatically. Please open the URL above manually.\")\n );\n }\n\n // Poll for completion\n const pollSpinner = ora(\"Waiting for authentication...\").start();\n \n const maxWaitTime = 5 * 60 * 1000; // 5 minutes\n const pollInterval = 2000; // 2 seconds\n const startTime = Date.now();\n\n while (Date.now() - startTime < maxWaitTime) {\n await sleep(pollInterval);\n\n try {\n const result = await api.pollCliSession(session.session_id);\n\n if (result.status === \"completed\" && result.token && result.user) {\n pollSpinner.succeed(\"Authentication successful!\");\n \n // Store credentials\n setToken(result.token);\n setUser(result.user);\n\n console.log();\n console.log(chalk.green(`✅ Logged in as ${chalk.bold(result.user.email)}`));\n console.log(chalk.gray(` Plan: ${result.user.plan}`));\n console.log(chalk.gray(` Token stored securely in config`));\n console.log();\n console.log(chalk.cyan(\"You're ready to use LynxPrompt CLI!\"));\n return;\n }\n\n if (result.status === \"expired\") {\n pollSpinner.fail(\"Authentication session expired. Please try again.\");\n return;\n }\n\n // status === \"pending\", continue polling\n } catch (error) {\n // Ignore polling errors, keep trying\n }\n }\n\n pollSpinner.fail(\"Authentication timed out. Please try again.\");\n } catch (error) {\n spinner.fail(\"Failed to initialize authentication\");\n \n if (error instanceof ApiRequestError) {\n console.error(chalk.red(`Error: ${error.message}`));\n if (error.statusCode === 503) {\n console.error(chalk.gray(\"The server may be temporarily unavailable. Please try again later.\"));\n }\n } else {\n console.error(chalk.red(\"An unexpected error occurred.\"));\n console.error(chalk.gray(\"Make sure you have internet connectivity and try again.\"));\n }\n process.exit(1);\n }\n}\n\nasync function tryOpenBrowser(url: string): Promise<boolean> {\n try {\n // Dynamic import for open package\n const { default: open } = await import(\"open\");\n await open(url);\n return true;\n } catch {\n // If open package is not available or fails, try native commands\n const { exec } = await import(\"child_process\");\n const { promisify } = await import(\"util\");\n const execAsync = promisify(exec);\n\n const platform = process.platform;\n let command: string;\n\n if (platform === \"darwin\") {\n command = `open \"${url}\"`;\n } else if (platform === \"win32\") {\n command = `start \"\" \"${url}\"`;\n } else {\n command = `xdg-open \"${url}\"`;\n }\n\n try {\n await execAsync(command);\n return true;\n } catch {\n return false;\n }\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n\n","import Conf from \"conf\";\n\ninterface ConfigSchema {\n token?: string;\n apiUrl: string;\n user?: {\n id: string;\n email: string;\n name: string | null;\n plan: string;\n };\n}\n\nconst config = new Conf<ConfigSchema>({\n projectName: \"lynxprompt\",\n schema: {\n token: {\n type: \"string\",\n },\n apiUrl: {\n type: \"string\",\n default: \"https://lynxprompt.com\",\n },\n user: {\n type: \"object\",\n properties: {\n id: { type: \"string\" },\n email: { type: \"string\" },\n name: { type: [\"string\", \"null\"] },\n plan: { type: \"string\" },\n },\n },\n },\n defaults: {\n apiUrl: \"https://lynxprompt.com\",\n },\n});\n\nexport function getToken(): string | undefined {\n // Environment variable takes precedence\n const envToken = process.env.LYNXPROMPT_TOKEN;\n if (envToken) {\n return envToken;\n }\n return config.get(\"token\");\n}\n\nexport function setToken(token: string): void {\n config.set(\"token\", token);\n}\n\nexport function clearToken(): void {\n config.delete(\"token\");\n config.delete(\"user\");\n}\n\nexport function getApiUrl(): string {\n // Allow override via environment variable\n const envUrl = process.env.LYNXPROMPT_API_URL;\n if (envUrl) {\n return envUrl;\n }\n return config.get(\"apiUrl\");\n}\n\nexport function setApiUrl(url: string): void {\n config.set(\"apiUrl\", url);\n}\n\nexport function getUser(): ConfigSchema[\"user\"] | undefined {\n return config.get(\"user\");\n}\n\nexport function setUser(user: ConfigSchema[\"user\"]): void {\n config.set(\"user\", user);\n}\n\nexport function isAuthenticated(): boolean {\n return !!getToken();\n}\n\nexport function getConfigPath(): string {\n return config.path;\n}\n\n","import { getToken, getApiUrl } from \"./config.js\";\n\nexport interface ApiError {\n error: string;\n message?: string;\n expired_at?: string;\n}\n\nexport interface Blueprint {\n id: string;\n name: string;\n description: string | null;\n type: string;\n tier: string;\n category: string;\n tags: string[];\n visibility: \"PRIVATE\" | \"TEAM\" | \"PUBLIC\";\n downloads: number;\n favorites: number;\n price: number | null;\n currency: string | null;\n created_at: string;\n updated_at: string;\n content?: string;\n}\n\nexport interface BlueprintsResponse {\n blueprints: Blueprint[];\n total: number;\n limit: number;\n offset: number;\n has_more: boolean;\n}\n\nexport interface UserResponse {\n user: {\n id: string;\n email: string;\n name: string | null;\n display_name: string | null;\n persona: string | null;\n skill_level: string | null;\n subscription: {\n plan: string;\n status: string | null;\n interval: string | null;\n current_period_end: string | null;\n };\n stats: {\n blueprints_count: number;\n };\n created_at: string;\n };\n}\n\nexport interface CliSessionResponse {\n session_id: string;\n auth_url: string;\n expires_at: string;\n}\n\nexport interface CliPollResponse {\n status: \"pending\" | \"completed\" | \"expired\";\n token?: string;\n user?: {\n id: string;\n email: string;\n name: string | null;\n plan: string;\n };\n}\n\nexport interface SearchResult {\n id: string;\n name: string;\n description: string;\n author: string;\n authorId?: string;\n downloads: number;\n likes: number;\n tags: string[];\n tier: string;\n category: string;\n isOfficial: boolean;\n aiAssisted: boolean;\n price: number | null;\n discountedPrice: number | null;\n currency: string;\n}\n\nexport interface SearchResponse {\n templates: SearchResult[];\n popularTags: string[];\n total: number;\n hasMore: boolean;\n}\n\nclass ApiClient {\n private getHeaders(): HeadersInit {\n const token = getToken();\n const headers: HeadersInit = {\n \"Content-Type\": \"application/json\",\n };\n if (token) {\n headers[\"Authorization\"] = `Bearer ${token}`;\n }\n return headers;\n }\n\n private async request<T>(\n endpoint: string,\n options: RequestInit = {}\n ): Promise<T> {\n const baseUrl = getApiUrl();\n const url = `${baseUrl}${endpoint}`;\n\n const response = await fetch(url, {\n ...options,\n headers: {\n ...this.getHeaders(),\n ...options.headers,\n },\n });\n\n const data = await response.json();\n\n if (!response.ok) {\n const error = data as ApiError;\n throw new ApiRequestError(\n error.message || error.error || \"Request failed\",\n response.status,\n error\n );\n }\n\n return data as T;\n }\n\n // Auth endpoints\n async initCliSession(): Promise<CliSessionResponse> {\n return this.request<CliSessionResponse>(\"/api/cli-auth/init\", {\n method: \"POST\",\n });\n }\n\n async pollCliSession(sessionId: string): Promise<CliPollResponse> {\n return this.request<CliPollResponse>(\n `/api/cli-auth/poll?session=${sessionId}`\n );\n }\n\n // User endpoints\n async getUser(): Promise<UserResponse> {\n return this.request<UserResponse>(\"/api/v1/user\");\n }\n\n // Blueprint endpoints\n async listBlueprints(options: {\n limit?: number;\n offset?: number;\n visibility?: string;\n } = {}): Promise<BlueprintsResponse> {\n const params = new URLSearchParams();\n if (options.limit) params.set(\"limit\", options.limit.toString());\n if (options.offset) params.set(\"offset\", options.offset.toString());\n if (options.visibility) params.set(\"visibility\", options.visibility);\n\n const query = params.toString();\n return this.request<BlueprintsResponse>(\n `/api/v1/blueprints${query ? `?${query}` : \"\"}`\n );\n }\n\n async getBlueprint(id: string): Promise<{ blueprint: Blueprint }> {\n // Ensure the ID has the bp_ prefix for the API\n const apiId = id.startsWith(\"bp_\") ? id : `bp_${id}`;\n return this.request<{ blueprint: Blueprint }>(`/api/v1/blueprints/${apiId}`);\n }\n\n async searchBlueprints(query: string, limit: number = 20): Promise<SearchResponse> {\n const params = new URLSearchParams({\n q: query,\n limit: limit.toString(),\n });\n return this.request<SearchResponse>(`/api/blueprints?${params}`);\n }\n}\n\nexport class ApiRequestError extends Error {\n constructor(\n message: string,\n public statusCode: number,\n public response: ApiError\n ) {\n super(message);\n this.name = \"ApiRequestError\";\n }\n}\n\nexport const api = new ApiClient();\n\n\n","import chalk from \"chalk\";\nimport { clearToken, isAuthenticated, getUser } from \"../config.js\";\n\nexport async function logoutCommand(): Promise<void> {\n if (!isAuthenticated()) {\n console.log(chalk.yellow(\"You are not currently logged in.\"));\n return;\n }\n\n const user = getUser();\n const email = user?.email || \"unknown\";\n\n clearToken();\n\n console.log(chalk.green(`✓ Logged out from ${chalk.bold(email)}`));\n console.log(chalk.gray(\" Removed stored credentials\"));\n}\n\n\n","import chalk from \"chalk\";\nimport ora from \"ora\";\nimport { api, ApiRequestError } from \"../api.js\";\nimport { isAuthenticated, getUser, setUser } from \"../config.js\";\n\nexport async function whoamiCommand(): Promise<void> {\n if (!isAuthenticated()) {\n console.log(chalk.yellow(\"Not logged in. Run 'lynxprompt login' to authenticate.\"));\n process.exit(1);\n }\n\n const spinner = ora(\"Fetching user info...\").start();\n\n try {\n const { user } = await api.getUser();\n spinner.stop();\n\n // Update cached user info\n setUser({\n id: user.id,\n email: user.email,\n name: user.name,\n plan: user.subscription.plan,\n });\n\n console.log();\n console.log(chalk.cyan(\"🐱 LynxPrompt Account\"));\n console.log();\n console.log(` ${chalk.gray(\"Email:\")} ${chalk.bold(user.email)}`);\n if (user.name) {\n console.log(` ${chalk.gray(\"Name:\")} ${user.name}`);\n }\n if (user.display_name) {\n console.log(` ${chalk.gray(\"Display:\")} ${user.display_name}`);\n }\n console.log(` ${chalk.gray(\"Plan:\")} ${formatPlan(user.subscription.plan)}`);\n if (user.subscription.status) {\n console.log(` ${chalk.gray(\"Status:\")} ${user.subscription.status}`);\n }\n if (user.subscription.current_period_end) {\n const endDate = new Date(user.subscription.current_period_end);\n console.log(` ${chalk.gray(\"Renews:\")} ${endDate.toLocaleDateString()}`);\n }\n console.log();\n console.log(` ${chalk.gray(\"Blueprints:\")} ${user.stats.blueprints_count}`);\n console.log(` ${chalk.gray(\"Member since:\")} ${new Date(user.created_at).toLocaleDateString()}`);\n console.log();\n } catch (error) {\n spinner.fail(\"Failed to fetch user info\");\n\n if (error instanceof ApiRequestError) {\n if (error.statusCode === 401) {\n console.error(chalk.red(\"Your session has expired. Please run 'lynxprompt login' again.\"));\n } else if (error.statusCode === 403) {\n console.error(chalk.red(\"API access requires Pro, Max, or Teams subscription.\"));\n console.error(chalk.gray(\"Upgrade at https://lynxprompt.com/pricing\"));\n } else {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n } else {\n console.error(chalk.red(\"An unexpected error occurred.\"));\n }\n process.exit(1);\n }\n}\n\nfunction formatPlan(plan: string): string {\n const planColors: Record<string, (s: string) => string> = {\n FREE: chalk.gray,\n PRO: chalk.blue,\n MAX: chalk.magenta,\n TEAMS: chalk.cyan,\n };\n \n const colorFn = planColors[plan] || chalk.white;\n return colorFn(plan);\n}\n\n\n","import chalk from \"chalk\";\nimport ora from \"ora\";\nimport { api, ApiRequestError, Blueprint } from \"../api.js\";\nimport { isAuthenticated } from \"../config.js\";\n\ninterface ListOptions {\n limit: string;\n visibility?: string;\n}\n\nexport async function listCommand(options: ListOptions): Promise<void> {\n if (!isAuthenticated()) {\n console.log(chalk.yellow(\"Not logged in. Run 'lynxprompt login' to authenticate.\"));\n process.exit(1);\n }\n\n const spinner = ora(\"Fetching your blueprints...\").start();\n\n try {\n const limit = parseInt(options.limit, 10) || 20;\n const { blueprints, total, has_more } = await api.listBlueprints({\n limit,\n visibility: options.visibility,\n });\n\n spinner.stop();\n\n if (blueprints.length === 0) {\n console.log();\n console.log(chalk.yellow(\"No blueprints found.\"));\n console.log(chalk.gray(\"Create your first blueprint at https://lynxprompt.com/blueprints/create\"));\n console.log(chalk.gray(\"Or run 'lynxprompt init' to generate one from the CLI!\"));\n return;\n }\n\n console.log();\n console.log(chalk.cyan(`🐱 Your Blueprints (${total} total)`));\n console.log();\n\n for (const bp of blueprints) {\n printBlueprint(bp);\n }\n\n if (has_more) {\n console.log(chalk.gray(`Showing ${blueprints.length} of ${total}. Use --limit to see more.`));\n }\n } catch (error) {\n spinner.fail(\"Failed to fetch blueprints\");\n handleApiError(error);\n }\n}\n\nfunction printBlueprint(bp: Blueprint): void {\n const visibilityIcon = {\n PRIVATE: \"🔒\",\n TEAM: \"👥\",\n PUBLIC: \"🌐\",\n }[bp.visibility] || \"📄\";\n\n const tierBadge = {\n SIMPLE: chalk.gray(\"[Basic]\"),\n INTERMEDIATE: chalk.blue(\"[Pro]\"),\n ADVANCED: chalk.magenta(\"[Max]\"),\n }[bp.tier] || \"\";\n\n console.log(` ${visibilityIcon} ${chalk.bold(bp.name)} ${tierBadge}`);\n console.log(` ${chalk.cyan(bp.id)}`);\n if (bp.description) {\n console.log(` ${chalk.gray(truncate(bp.description, 60))}`);\n }\n console.log(` ${chalk.gray(`↓${bp.downloads}`)} ${chalk.gray(`♥${bp.favorites}`)} ${formatTags(bp.tags)}`);\n console.log();\n}\n\nfunction formatTags(tags: string[]): string {\n if (!tags || tags.length === 0) return \"\";\n return tags.slice(0, 3).map((t) => chalk.gray(`#${t}`)).join(\" \");\n}\n\nfunction truncate(str: string, maxLength: number): string {\n if (str.length <= maxLength) return str;\n return str.slice(0, maxLength - 3) + \"...\";\n}\n\nfunction handleApiError(error: unknown): void {\n if (error instanceof ApiRequestError) {\n if (error.statusCode === 401) {\n console.error(chalk.red(\"Your session has expired. Please run 'lynxprompt login' again.\"));\n } else if (error.statusCode === 403) {\n console.error(chalk.red(\"API access requires Pro, Max, or Teams subscription.\"));\n console.error(chalk.gray(\"Upgrade at https://lynxprompt.com/pricing\"));\n } else {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n } else {\n console.error(chalk.red(\"An unexpected error occurred.\"));\n }\n process.exit(1);\n}\n\n\n","import chalk from \"chalk\";\nimport ora from \"ora\";\nimport prompts from \"prompts\";\nimport { api, ApiRequestError } from \"../api.js\";\nimport { isAuthenticated } from \"../config.js\";\nimport { writeFile, access, mkdir } from \"fs/promises\";\nimport { join, dirname } from \"path\";\n\ninterface PullOptions {\n output: string;\n yes?: boolean;\n}\n\n// Mapping of blueprint types to filenames\nconst TYPE_TO_FILENAME: Record<string, string> = {\n AGENTS_MD: \"AGENTS.md\",\n CURSOR_RULES: \".cursorrules\",\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\nexport async function pullCommand(\n id: string,\n options: PullOptions\n): Promise<void> {\n if (!isAuthenticated()) {\n console.log(\n chalk.yellow(\"Not logged in. Run 'lynxprompt login' to authenticate.\")\n );\n process.exit(1);\n }\n\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 // Determine output filename\n const filename = TYPE_TO_FILENAME[blueprint.type] || \"ai-config.md\";\n const outputPath = join(options.output, filename);\n\n // Check if file exists\n let fileExists = false;\n try {\n await access(outputPath);\n fileExists = true;\n } catch {\n // File doesn't exist, that's fine\n }\n\n // Confirm overwrite if file exists and not using --yes\n if (fileExists && !options.yes) {\n const response = await prompts({\n type: \"confirm\",\n name: \"overwrite\",\n message: `File ${chalk.cyan(outputPath)} already exists. Overwrite?`,\n initial: false,\n });\n\n if (!response.overwrite) {\n console.log(chalk.yellow(\"Aborted.\"));\n return;\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 console.log();\n console.log(chalk.green(`✅ Downloaded ${chalk.bold(blueprint.name)}`));\n console.log(` ${chalk.gray(\"File:\")} ${chalk.cyan(outputPath)}`);\n console.log(` ${chalk.gray(\"Type:\")} ${blueprint.type}`);\n console.log(` ${chalk.gray(\"Tier:\")} ${blueprint.tier}`);\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 }\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 'lynxprompt login' again.\")\n );\n } else if (error.statusCode === 403) {\n console.error(\n chalk.red(\"You don't have access to this blueprint.\")\n );\n console.error(\n chalk.gray(\n \"This might be a private blueprint or require a higher subscription tier.\"\n )\n );\n } else if (error.statusCode === 404) {\n console.error(chalk.red(\"Blueprint not found.\"));\n console.error(\n chalk.gray(\n \"Make sure you have the correct blueprint ID. Use 'lynxprompt list' to see your blueprints.\"\n )\n );\n } else {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n } else {\n console.error(chalk.red(\"An unexpected error occurred.\"));\n }\n process.exit(1);\n}\n\n\n","import chalk from \"chalk\";\nimport prompts from \"prompts\";\nimport ora from \"ora\";\nimport { writeFile, mkdir, readFile, access } from \"fs/promises\";\nimport { join, dirname } from \"path\";\nimport { detectProject } from \"../utils/detect.js\";\nimport { generateConfig, GenerateOptions } from \"../utils/generator.js\";\n\ninterface InitOptions {\n name?: string;\n description?: string;\n stack?: string;\n platforms?: string;\n persona?: string;\n boundaries?: string;\n preset?: string;\n yes?: boolean;\n}\n\n// Tech stack options\nconst TECH_STACKS = [\n { title: \"TypeScript\", value: \"typescript\" },\n { title: \"JavaScript\", value: \"javascript\" },\n { title: \"Python\", value: \"python\" },\n { title: \"Go\", value: \"go\" },\n { title: \"Rust\", value: \"rust\" },\n { title: \"Java\", value: \"java\" },\n { title: \"C#/.NET\", value: \"csharp\" },\n { title: \"Ruby\", value: \"ruby\" },\n { title: \"PHP\", value: \"php\" },\n { title: \"Swift\", value: \"swift\" },\n];\n\nconst FRAMEWORKS = [\n { title: \"React\", value: \"react\" },\n { title: \"Next.js\", value: \"nextjs\" },\n { title: \"Vue.js\", value: \"vue\" },\n { title: \"Angular\", value: \"angular\" },\n { title: \"Svelte\", value: \"svelte\" },\n { title: \"Express\", value: \"express\" },\n { title: \"FastAPI\", value: \"fastapi\" },\n { title: \"Django\", value: \"django\" },\n { title: \"Flask\", value: \"flask\" },\n { title: \"Spring Boot\", value: \"spring\" },\n { title: \"Rails\", value: \"rails\" },\n { title: \"Laravel\", value: \"laravel\" },\n];\n\n// Platform options\nconst PLATFORMS = [\n { title: \"Cursor (.cursorrules)\", value: \"cursor\", filename: \".cursorrules\" },\n { title: \"Claude Code (AGENTS.md)\", value: \"claude\", filename: \"AGENTS.md\" },\n { title: \"GitHub Copilot\", value: \"copilot\", filename: \".github/copilot-instructions.md\" },\n { title: \"Windsurf (.windsurfrules)\", value: \"windsurf\", filename: \".windsurfrules\" },\n { title: \"Zed\", value: \"zed\", filename: \".zed/instructions.md\" },\n];\n\n// Persona options\nconst PERSONAS = [\n { title: \"Backend Developer - APIs, databases, microservices\", value: \"backend\" },\n { title: \"Frontend Developer - UI, components, styling\", value: \"frontend\" },\n { title: \"Full-Stack Developer - Complete application setups\", value: \"fullstack\" },\n { title: \"DevOps Engineer - Infrastructure, CI/CD, containers\", value: \"devops\" },\n { title: \"Data Engineer - Pipelines, ETL, databases\", value: \"data\" },\n { title: \"Security Engineer - Secure code, vulnerabilities\", value: \"security\" },\n { title: \"Custom...\", value: \"custom\" },\n];\n\n// Boundary presets\nconst BOUNDARY_PRESETS = [\n {\n title: \"Conservative - Ask before most changes\",\n value: \"conservative\",\n always: [\"Read any file\", \"Run lint/format commands\"],\n askFirst: [\"Modify any file\", \"Add dependencies\", \"Create files\", \"Run tests\"],\n never: [\"Delete files\", \"Modify .env\", \"Push to git\"],\n },\n {\n title: \"Standard - Balance of freedom and safety\",\n value: \"standard\",\n always: [\"Read any file\", \"Modify files in src/\", \"Run build/test/lint\", \"Create test files\"],\n askFirst: [\"Add new dependencies\", \"Modify config files\", \"Create new modules\"],\n never: [\"Delete production data\", \"Modify .env secrets\", \"Force push\"],\n },\n {\n title: \"Permissive - AI can modify freely within src/\",\n value: \"permissive\",\n always: [\"Modify any file in src/\", \"Run any script\", \"Add dependencies\", \"Create files\"],\n askFirst: [\"Modify root configs\", \"Delete directories\"],\n never: [\"Modify .env\", \"Access external APIs without confirmation\"],\n },\n];\n\nexport async function initCommand(options: InitOptions): Promise<void> {\n console.log();\n console.log(chalk.cyan(\"🐱 Welcome to LynxPrompt!\"));\n console.log();\n\n // Try to detect project info\n const detected = await detectProject(process.cwd());\n \n if (detected) {\n console.log(chalk.gray(\"Detected project configuration:\"));\n if (detected.name) console.log(chalk.gray(` Name: ${detected.name}`));\n if (detected.stack.length > 0) console.log(chalk.gray(` Stack: ${detected.stack.join(\", \")}`));\n if (detected.commands.build) console.log(chalk.gray(` Build: ${detected.commands.build}`));\n if (detected.commands.test) console.log(chalk.gray(` Test: ${detected.commands.test}`));\n console.log();\n }\n\n let config: GenerateOptions;\n\n // Non-interactive mode\n if (options.yes) {\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: options.platforms?.split(\",\").map(s => s.trim()) || [\"cursor\", \"claude\"],\n persona: options.persona || \"fullstack\",\n boundaries: options.boundaries as \"conservative\" | \"standard\" | \"permissive\" || \"standard\",\n commands: detected?.commands || {},\n };\n } else {\n // Interactive mode\n config = await runInteractiveWizard(options, detected);\n }\n\n // Generate and write files\n const spinner = ora(\"Generating configuration files...\").start();\n \n try {\n const files = generateConfig(config);\n spinner.stop();\n\n console.log();\n console.log(chalk.green(\"✅ Generated files:\"));\n \n for (const [filename, content] of Object.entries(files)) {\n const outputPath = join(process.cwd(), filename);\n \n // Check if file exists\n let exists = false;\n try {\n await access(outputPath);\n exists = true;\n } catch {\n // File doesn't exist\n }\n\n // Ask to overwrite if exists and not in --yes mode\n if (exists && !options.yes) {\n const response = await prompts({\n type: \"confirm\",\n name: \"overwrite\",\n message: `${filename} already exists. Overwrite?`,\n initial: false,\n });\n \n if (!response.overwrite) {\n console.log(chalk.yellow(` Skipped: ${filename}`));\n continue;\n }\n }\n\n // Create directory if needed\n const dir = dirname(outputPath);\n if (dir !== \".\") {\n await mkdir(dir, { recursive: true });\n }\n\n await writeFile(outputPath, content, \"utf-8\");\n console.log(` ${chalk.cyan(filename)}`);\n }\n\n console.log();\n console.log(chalk.gray(\"Your AI IDE configuration is ready!\"));\n console.log(chalk.gray(\"The AI assistant in your IDE will now follow these instructions.\"));\n console.log();\n } catch (error) {\n spinner.fail(\"Failed to generate files\");\n console.error(chalk.red(\"An error occurred while generating configuration files.\"));\n if (error instanceof Error) {\n console.error(chalk.gray(error.message));\n }\n process.exit(1);\n }\n}\n\nasync function runInteractiveWizard(\n options: InitOptions,\n detected: Awaited<ReturnType<typeof detectProject>> | null\n): Promise<GenerateOptions> {\n const answers: Record<string, unknown> = {};\n\n // Project name\n const nameResponse = await prompts({\n type: \"text\",\n name: \"name\",\n message: \"What's your project name?\",\n initial: options.name || detected?.name || \"my-project\",\n });\n answers.name = nameResponse.name;\n\n // Description\n const descResponse = await prompts({\n type: \"text\",\n name: \"description\",\n message: \"Describe your project in one sentence:\",\n initial: options.description || \"\",\n });\n answers.description = descResponse.description;\n\n // Tech stack\n const allStackOptions = [...TECH_STACKS, ...FRAMEWORKS];\n const stackResponse = await prompts({\n type: \"multiselect\",\n name: \"stack\",\n message: \"Select your tech stack:\",\n choices: allStackOptions,\n hint: \"- Space to select, Enter to confirm\",\n });\n answers.stack = stackResponse.stack || [];\n\n // Platforms\n const platformResponse = await prompts({\n type: \"multiselect\",\n name: \"platforms\",\n message: \"Which AI IDEs do you use?\",\n choices: PLATFORMS,\n hint: \"- Space to select, Enter to confirm\",\n min: 1,\n });\n answers.platforms = platformResponse.platforms || [\"cursor\"];\n\n // Persona\n const personaResponse = await prompts({\n type: \"select\",\n name: \"persona\",\n message: \"What's the AI's persona/role?\",\n choices: PERSONAS,\n initial: 2, // Full-stack by default\n });\n \n if (personaResponse.persona === \"custom\") {\n const customPersona = await prompts({\n type: \"text\",\n name: \"value\",\n message: \"Describe the custom persona:\",\n });\n answers.persona = customPersona.value || \"fullstack\";\n } else {\n answers.persona = personaResponse.persona;\n }\n\n // Show detected commands if available\n if (detected?.commands && Object.keys(detected.commands).length > 0) {\n console.log();\n console.log(chalk.gray(\"Auto-detected commands:\"));\n if (detected.commands.build) console.log(chalk.gray(` Build: ${detected.commands.build}`));\n if (detected.commands.test) console.log(chalk.gray(` Test: ${detected.commands.test}`));\n if (detected.commands.lint) console.log(chalk.gray(` Lint: ${detected.commands.lint}`));\n if (detected.commands.dev) console.log(chalk.gray(` Dev: ${detected.commands.dev}`));\n \n const editCommands = await prompts({\n type: \"confirm\",\n name: \"edit\",\n message: \"Edit these commands?\",\n initial: false,\n });\n\n if (editCommands.edit) {\n const commandsResponse = await prompts([\n { type: \"text\", name: \"build\", message: \"Build command:\", initial: detected.commands.build },\n { type: \"text\", name: \"test\", message: \"Test command:\", initial: detected.commands.test },\n { type: \"text\", name: \"lint\", message: \"Lint command:\", initial: detected.commands.lint },\n { type: \"text\", name: \"dev\", message: \"Dev command:\", initial: detected.commands.dev },\n ]);\n answers.commands = commandsResponse;\n } else {\n answers.commands = detected.commands;\n }\n } else {\n answers.commands = {};\n }\n\n // Boundaries\n const boundaryResponse = await prompts({\n type: \"select\",\n name: \"boundaries\",\n message: \"Select boundary preset:\",\n choices: BOUNDARY_PRESETS.map(b => ({ title: b.title, value: b.value })),\n initial: 1, // Standard by default\n });\n answers.boundaries = boundaryResponse.boundaries || \"standard\";\n\n return {\n name: answers.name as string,\n description: answers.description as string,\n stack: answers.stack as string[],\n platforms: answers.platforms as string[],\n persona: answers.persona as string,\n boundaries: answers.boundaries as \"conservative\" | \"standard\" | \"permissive\",\n commands: answers.commands as Record<string, string>,\n };\n}\n\n","import { readFile, access } from \"fs/promises\";\nimport { join } from \"path\";\n\nexport interface DetectedProject {\n name: string | null;\n stack: string[];\n commands: {\n build?: string;\n test?: string;\n lint?: string;\n dev?: string;\n };\n packageManager: \"npm\" | \"yarn\" | \"pnpm\" | \"bun\" | null;\n}\n\nexport async function detectProject(cwd: string): Promise<DetectedProject | null> {\n const detected: DetectedProject = {\n name: null,\n stack: [],\n commands: {},\n packageManager: null,\n };\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 \n // Detect stack from dependencies\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n \n if (allDeps[\"typescript\"]) detected.stack.push(\"typescript\");\n if (allDeps[\"react\"]) detected.stack.push(\"react\");\n if (allDeps[\"next\"]) detected.stack.push(\"nextjs\");\n if (allDeps[\"vue\"]) detected.stack.push(\"vue\");\n if (allDeps[\"@angular/core\"]) detected.stack.push(\"angular\");\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[\"prisma\"]) detected.stack.push(\"prisma\");\n if (allDeps[\"tailwindcss\"]) detected.stack.push(\"tailwind\");\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;\n detected.commands.dev = pkg.scripts.dev || pkg.scripts.start;\n }\n\n // Detect package manager\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 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 \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\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 \n // Common Python commands\n detected.commands.test = \"pytest\";\n detected.commands.lint = \"ruff check\";\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 \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 \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 \n // Extract project name\n const nameMatch = content.match(/name\\s*=\\s*\"([^\"]+)\"/);\n if (nameMatch) detected.name = nameMatch[1];\n \n detected.commands.build = \"cargo build\";\n detected.commands.test = \"cargo test\";\n detected.commands.lint = \"cargo clippy\";\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 \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 detected.commands.build = \"go build\";\n detected.commands.test = \"go test ./...\";\n detected.commands.lint = \"golangci-lint 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 \n if (Object.keys(detected.commands).length > 0) {\n return detected;\n }\n } catch {\n // Failed to read Makefile\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","export interface GenerateOptions {\n name: string;\n description: string;\n stack: string[];\n platforms: string[];\n persona: string;\n boundaries: \"conservative\" | \"standard\" | \"permissive\";\n commands: {\n build?: string;\n test?: string;\n lint?: string;\n dev?: string;\n };\n}\n\n// Platform to filename mapping\nconst PLATFORM_FILES: Record<string, string> = {\n cursor: \".cursorrules\",\n claude: \"AGENTS.md\",\n copilot: \".github/copilot-instructions.md\",\n windsurf: \".windsurfrules\",\n zed: \".zed/instructions.md\",\n};\n\n// Persona descriptions\nconst PERSONA_DESCRIPTIONS: Record<string, string> = {\n backend: \"a senior backend developer specializing in APIs, databases, and microservices architecture\",\n frontend: \"a senior frontend developer specializing in UI components, styling, and user experience\",\n fullstack: \"a senior full-stack developer capable of working across the entire application stack\",\n devops: \"a DevOps engineer specializing in infrastructure, CI/CD pipelines, and containerization\",\n data: \"a data engineer specializing in data pipelines, ETL processes, and database optimization\",\n security: \"a security engineer focused on secure coding practices and vulnerability prevention\",\n};\n\n// Stack display names\nconst STACK_NAMES: Record<string, string> = {\n typescript: \"TypeScript\",\n javascript: \"JavaScript\",\n python: \"Python\",\n go: \"Go\",\n rust: \"Rust\",\n java: \"Java\",\n csharp: \"C#/.NET\",\n ruby: \"Ruby\",\n php: \"PHP\",\n swift: \"Swift\",\n react: \"React\",\n nextjs: \"Next.js\",\n vue: \"Vue.js\",\n angular: \"Angular\",\n svelte: \"Svelte\",\n express: \"Express.js\",\n fastapi: \"FastAPI\",\n django: \"Django\",\n flask: \"Flask\",\n spring: \"Spring Boot\",\n rails: \"Ruby on Rails\",\n laravel: \"Laravel\",\n prisma: \"Prisma\",\n tailwind: \"Tailwind CSS\",\n fastify: \"Fastify\",\n};\n\n// Boundary presets\nconst BOUNDARIES: Record<string, { always: string[]; askFirst: string[]; never: string[] }> = {\n conservative: {\n always: [\"Read any file in the project\", \"Run lint and format commands\"],\n askFirst: [\n \"Modify any source file\",\n \"Add new dependencies\",\n \"Create new files\",\n \"Run test commands\",\n \"Modify configuration files\",\n ],\n never: [\n \"Delete any files\",\n \"Modify .env or secret files\",\n \"Push to git or make commits\",\n \"Access external APIs or services\",\n ],\n },\n standard: {\n always: [\n \"Read any file in the project\",\n \"Modify files in src/ or lib/\",\n \"Run build, test, and lint commands\",\n \"Create test files\",\n \"Fix linting errors automatically\",\n ],\n askFirst: [\n \"Add new dependencies to package.json\",\n \"Modify configuration files at root level\",\n \"Create new modules or directories\",\n \"Refactor code structure significantly\",\n ],\n never: [\n \"Modify .env files or secrets\",\n \"Delete critical files without backup\",\n \"Force push to git\",\n \"Expose sensitive information in logs\",\n ],\n },\n permissive: {\n always: [\n \"Modify any file in src/ or lib/\",\n \"Run any build, test, or dev scripts\",\n \"Add or update dependencies\",\n \"Create new files and directories\",\n \"Refactor and reorganize code\",\n ],\n askFirst: [\n \"Modify root-level configuration files\",\n \"Delete directories\",\n \"Make breaking changes to public APIs\",\n ],\n never: [\n \"Modify .env files directly\",\n \"Commit secrets or credentials\",\n \"Access production databases\",\n ],\n },\n};\n\nexport function generateConfig(options: GenerateOptions): Record<string, string> {\n const files: Record<string, string> = {};\n\n for (const platform of options.platforms) {\n const filename = PLATFORM_FILES[platform];\n if (filename) {\n files[filename] = generateFileContent(options, platform);\n }\n }\n\n return files;\n}\n\nfunction generateFileContent(options: GenerateOptions, platform: string): string {\n const sections: string[] = [];\n const isMarkdown = platform !== \"cursor\" && platform !== \"windsurf\";\n \n // Header\n if (isMarkdown) {\n sections.push(`# ${options.name} - AI Assistant Configuration`);\n sections.push(\"\");\n }\n\n // Persona section\n const personaDesc = PERSONA_DESCRIPTIONS[options.persona] || options.persona;\n if (isMarkdown) {\n sections.push(\"## Persona\");\n sections.push(\"\");\n sections.push(`You are ${personaDesc}. You assist developers working on ${options.name}.`);\n } else {\n sections.push(`You are ${personaDesc}. You assist developers working on ${options.name}.`);\n }\n \n if (options.description) {\n sections.push(\"\");\n sections.push(`Project description: ${options.description}`);\n }\n sections.push(\"\");\n\n // Tech Stack section\n if (options.stack.length > 0) {\n if (isMarkdown) {\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) {\n for (const tech of stackList) {\n sections.push(`- ${tech}`);\n }\n } else {\n sections.push(stackList.join(\", \"));\n }\n sections.push(\"\");\n }\n\n // Commands section\n const hasCommands = Object.values(options.commands).some(Boolean);\n if (hasCommands) {\n if (isMarkdown) {\n sections.push(\"## Commands\");\n sections.push(\"\");\n sections.push(\"Use these commands for common tasks:\");\n sections.push(\"\");\n sections.push(\"```bash\");\n } else {\n sections.push(\"Commands:\");\n }\n \n if (options.commands.build) {\n sections.push(isMarkdown ? `# Build: ${options.commands.build}` : `- Build: ${options.commands.build}`);\n }\n if (options.commands.test) {\n sections.push(isMarkdown ? `# Test: ${options.commands.test}` : `- Test: ${options.commands.test}`);\n }\n if (options.commands.lint) {\n sections.push(isMarkdown ? `# Lint: ${options.commands.lint}` : `- Lint: ${options.commands.lint}`);\n }\n if (options.commands.dev) {\n sections.push(isMarkdown ? `# Dev: ${options.commands.dev}` : `- Dev: ${options.commands.dev}`);\n }\n \n if (isMarkdown) {\n sections.push(\"```\");\n }\n sections.push(\"\");\n }\n\n // Boundaries section\n const boundaries = BOUNDARIES[options.boundaries];\n if (boundaries) {\n if (isMarkdown) {\n sections.push(\"## Boundaries\");\n sections.push(\"\");\n \n sections.push(\"### ✅ Always (do without asking)\");\n sections.push(\"\");\n for (const item of boundaries.always) {\n sections.push(`- ${item}`);\n }\n sections.push(\"\");\n \n sections.push(\"### ⚠️ Ask First\");\n sections.push(\"\");\n for (const item of boundaries.askFirst) {\n sections.push(`- ${item}`);\n }\n sections.push(\"\");\n \n sections.push(\"### 🚫 Never\");\n sections.push(\"\");\n for (const item of boundaries.never) {\n sections.push(`- ${item}`);\n }\n } else {\n sections.push(\"Boundaries:\");\n sections.push(\"\");\n sections.push(\"ALWAYS (do without asking):\");\n for (const item of boundaries.always) {\n sections.push(`- ${item}`);\n }\n sections.push(\"\");\n sections.push(\"ASK FIRST:\");\n for (const item of boundaries.askFirst) {\n sections.push(`- ${item}`);\n }\n sections.push(\"\");\n sections.push(\"NEVER:\");\n for (const item of boundaries.never) {\n sections.push(`- ${item}`);\n }\n }\n sections.push(\"\");\n }\n\n // Code Style section (basic guidelines based on stack)\n if (isMarkdown) {\n sections.push(\"## Code Style\");\n sections.push(\"\");\n sections.push(\"Follow these conventions:\");\n sections.push(\"\");\n \n if (options.stack.includes(\"typescript\") || options.stack.includes(\"javascript\")) {\n sections.push(\"- Use TypeScript strict mode when available\");\n sections.push(\"- Prefer const over let, avoid var\");\n sections.push(\"- Use async/await over raw promises\");\n sections.push(\"- Use descriptive variable and function names\");\n }\n \n if (options.stack.includes(\"react\") || options.stack.includes(\"nextjs\")) {\n sections.push(\"- Use functional components with hooks\");\n sections.push(\"- Keep components small and focused\");\n sections.push(\"- Colocate related files (component, styles, tests)\");\n }\n \n if (options.stack.includes(\"python\")) {\n sections.push(\"- Follow PEP 8 style guidelines\");\n sections.push(\"- Use type hints for function signatures\");\n sections.push(\"- Prefer f-strings for string formatting\");\n }\n \n if (options.stack.includes(\"go\")) {\n sections.push(\"- Follow Go conventions (gofmt, golint)\");\n sections.push(\"- Use meaningful package names\");\n sections.push(\"- Handle errors explicitly\");\n }\n \n if (options.stack.includes(\"rust\")) {\n sections.push(\"- Follow Rust conventions (clippy)\");\n sections.push(\"- Use idiomatic Rust patterns\");\n sections.push(\"- Prefer Result over panic\");\n }\n\n // Generic guidelines\n sections.push(\"- Write self-documenting code\");\n sections.push(\"- Add comments for complex logic only\");\n sections.push(\"- Keep functions focused and testable\");\n sections.push(\"\");\n }\n\n // Footer\n if (isMarkdown) {\n sections.push(\"---\");\n sections.push(\"\");\n sections.push(`*Generated by [LynxPrompt](https://lynxprompt.com) CLI*`);\n }\n\n return sections.join(\"\\n\");\n}\n\n\n","import chalk from \"chalk\";\nimport ora from \"ora\";\nimport { api, ApiRequestError, SearchResult } from \"../api.js\";\n\ninterface SearchOptions {\n limit: string;\n}\n\nexport async function searchCommand(\n query: string,\n options: SearchOptions\n): Promise<void> {\n const spinner = ora(`Searching for \"${query}\"...`).start();\n\n try {\n const limit = parseInt(options.limit, 10) || 20;\n const { templates, total, hasMore } = await api.searchBlueprints(query, limit);\n spinner.stop();\n\n if (templates.length === 0) {\n console.log();\n console.log(chalk.yellow(`No blueprints found for \"${query}\".`));\n console.log(chalk.gray(\"Try different keywords or browse at https://lynxprompt.com/blueprints\"));\n return;\n }\n\n console.log();\n console.log(chalk.cyan(`🔍 Search Results for \"${query}\" (${total} found)`));\n console.log();\n\n for (const result of templates) {\n printSearchResult(result);\n }\n\n if (hasMore) {\n console.log(chalk.gray(`Showing ${templates.length} of ${total}. Use --limit to see more.`));\n }\n\n console.log();\n console.log(chalk.gray(\"Use 'lynxprompt pull <id>' to download a blueprint.\"));\n } catch (error) {\n spinner.fail(\"Search failed\");\n handleApiError(error);\n }\n}\n\nfunction printSearchResult(result: SearchResult): void {\n const priceInfo = result.price ? chalk.yellow(`€${(result.price / 100).toFixed(2)}`) : chalk.green(\"Free\");\n const officialBadge = result.isOfficial ? chalk.magenta(\" ★ Official\") : \"\";\n \n console.log(` ${chalk.bold(result.name)}${officialBadge}`);\n console.log(` ${chalk.cyan(result.id)} • ${priceInfo}`);\n if (result.description) {\n console.log(` ${chalk.gray(truncate(result.description, 60))}`);\n }\n console.log(` ${chalk.gray(`by ${result.author}`)} • ${chalk.gray(`↓${result.downloads}`)} ${chalk.gray(`♥${result.likes}`)}`);\n if (result.tags && result.tags.length > 0) {\n console.log(` ${formatTags(result.tags)}`);\n }\n console.log();\n}\n\nfunction formatTags(tags: string[]): string {\n return tags.slice(0, 4).map((t) => chalk.gray(`#${t}`)).join(\" \");\n}\n\nfunction truncate(str: string, maxLength: number): string {\n if (str.length <= maxLength) return str;\n return str.slice(0, maxLength - 3) + \"...\";\n}\n\nfunction handleApiError(error: unknown): void {\n if (error instanceof ApiRequestError) {\n console.error(chalk.red(`Error: ${error.message}`));\n } else {\n console.error(chalk.red(\"An unexpected error occurred.\"));\n }\n process.exit(1);\n}\n\n\n","import chalk from \"chalk\";\nimport { access, readFile } from \"fs/promises\";\nimport { join } from \"path\";\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: \".cursorrules\", name: \".cursorrules\", platform: \"Cursor\" },\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];\n\nexport async function statusCommand(): Promise<void> {\n const cwd = process.cwd();\n \n console.log();\n console.log(chalk.cyan(\"🐱 AI Config Status\"));\n console.log(chalk.gray(` Directory: ${cwd}`));\n console.log();\n\n let foundAny = false;\n\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 console.log(` ${chalk.green(\"✓\")} ${chalk.bold(config.name)}`);\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 if (!foundAny) {\n console.log(chalk.yellow(\" No AI configuration files found in this directory.\"));\n console.log();\n console.log(chalk.gray(\" Run 'lynxprompt init' to create a configuration.\"));\n console.log(chalk.gray(\" Or run 'lynxprompt pull <id>' to download an existing blueprint.\"));\n } else {\n console.log(chalk.gray(\"Run 'lynxprompt init' to update or create additional configs.\"));\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 ) {\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\n"],"mappings":";;;AAAA,SAAS,eAAe;AACxB,OAAOA,YAAW;;;ACDlB,OAAO,WAAW;AAClB,OAAO,SAAS;;;ACDhB,OAAO,UAAU;AAajB,IAAM,SAAS,IAAI,KAAmB;AAAA,EACpC,aAAa;AAAA,EACb,QAAQ;AAAA,IACN,OAAO;AAAA,MACL,MAAM;AAAA,IACR;AAAA,IACA,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,YAAY;AAAA,QACV,IAAI,EAAE,MAAM,SAAS;AAAA,QACrB,OAAO,EAAE,MAAM,SAAS;AAAA,QACxB,MAAM,EAAE,MAAM,CAAC,UAAU,MAAM,EAAE;AAAA,QACjC,MAAM,EAAE,MAAM,SAAS;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR,QAAQ;AAAA,EACV;AACF,CAAC;AAEM,SAAS,WAA+B;AAE7C,QAAM,WAAW,QAAQ,IAAI;AAC7B,MAAI,UAAU;AACZ,WAAO;AAAA,EACT;AACA,SAAO,OAAO,IAAI,OAAO;AAC3B;AAEO,SAAS,SAAS,OAAqB;AAC5C,SAAO,IAAI,SAAS,KAAK;AAC3B;AAEO,SAAS,aAAmB;AACjC,SAAO,OAAO,OAAO;AACrB,SAAO,OAAO,MAAM;AACtB;AAEO,SAAS,YAAoB;AAElC,QAAM,SAAS,QAAQ,IAAI;AAC3B,MAAI,QAAQ;AACV,WAAO;AAAA,EACT;AACA,SAAO,OAAO,IAAI,QAAQ;AAC5B;AAMO,SAAS,UAA4C;AAC1D,SAAO,OAAO,IAAI,MAAM;AAC1B;AAEO,SAAS,QAAQ,MAAkC;AACxD,SAAO,IAAI,QAAQ,IAAI;AACzB;AAEO,SAAS,kBAA2B;AACzC,SAAO,CAAC,CAAC,SAAS;AACpB;;;ACkBA,IAAM,YAAN,MAAgB;AAAA,EACN,aAA0B;AAChC,UAAM,QAAQ,SAAS;AACvB,UAAM,UAAuB;AAAA,MAC3B,gBAAgB;AAAA,IAClB;AACA,QAAI,OAAO;AACT,cAAQ,eAAe,IAAI,UAAU,KAAK;AAAA,IAC5C;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,QACZ,UACA,UAAuB,CAAC,GACZ;AACZ,UAAM,UAAU,UAAU;AAC1B,UAAM,MAAM,GAAG,OAAO,GAAG,QAAQ;AAEjC,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAChC,GAAG;AAAA,MACH,SAAS;AAAA,QACP,GAAG,KAAK,WAAW;AAAA,QACnB,GAAG,QAAQ;AAAA,MACb;AAAA,IACF,CAAC;AAED,UAAM,OAAO,MAAM,SAAS,KAAK;AAEjC,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,QAAQ;AACd,YAAM,IAAI;AAAA,QACR,MAAM,WAAW,MAAM,SAAS;AAAA,QAChC,SAAS;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,iBAA8C;AAClD,WAAO,KAAK,QAA4B,sBAAsB;AAAA,MAC5D,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,eAAe,WAA6C;AAChE,WAAO,KAAK;AAAA,MACV,8BAA8B,SAAS;AAAA,IACzC;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,UAAiC;AACrC,WAAO,KAAK,QAAsB,cAAc;AAAA,EAClD;AAAA;AAAA,EAGA,MAAM,eAAe,UAIjB,CAAC,GAAgC;AACnC,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,QAAQ,MAAO,QAAO,IAAI,SAAS,QAAQ,MAAM,SAAS,CAAC;AAC/D,QAAI,QAAQ,OAAQ,QAAO,IAAI,UAAU,QAAQ,OAAO,SAAS,CAAC;AAClE,QAAI,QAAQ,WAAY,QAAO,IAAI,cAAc,QAAQ,UAAU;AAEnE,UAAM,QAAQ,OAAO,SAAS;AAC9B,WAAO,KAAK;AAAA,MACV,qBAAqB,QAAQ,IAAI,KAAK,KAAK,EAAE;AAAA,IAC/C;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,IAA+C;AAEhE,UAAM,QAAQ,GAAG,WAAW,KAAK,IAAI,KAAK,MAAM,EAAE;AAClD,WAAO,KAAK,QAAkC,sBAAsB,KAAK,EAAE;AAAA,EAC7E;AAAA,EAEA,MAAM,iBAAiB,OAAe,QAAgB,IAA6B;AACjF,UAAM,SAAS,IAAI,gBAAgB;AAAA,MACjC,GAAG;AAAA,MACH,OAAO,MAAM,SAAS;AAAA,IACxB,CAAC;AACD,WAAO,KAAK,QAAwB,mBAAmB,MAAM,EAAE;AAAA,EACjE;AACF;AAEO,IAAM,kBAAN,cAA8B,MAAM;AAAA,EACzC,YACE,SACO,YACA,UACP;AACA,UAAM,OAAO;AAHN;AACA;AAGP,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,MAAM,IAAI,UAAU;;;AFlMjC,eAAsB,eAA8B;AAClD,MAAI,gBAAgB,GAAG;AACrB,YAAQ;AAAA,MACN,MAAM;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AACA;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,gCAAgC,EAAE,MAAM;AAE5D,MAAI;AAEF,UAAM,UAAU,MAAM,IAAI,eAAe;AACzC,YAAQ,KAAK;AAEb,YAAQ,IAAI;AACZ,YAAQ,IAAI,MAAM,KAAK,8CAAuC,CAAC;AAC/D,YAAQ,IAAI,MAAM,KAAK,MAAM,QAAQ,QAAQ,EAAE,CAAC;AAChD,YAAQ,IAAI;AAGZ,UAAM,cAAc,MAAM,eAAe,QAAQ,QAAQ;AACzD,QAAI,CAAC,aAAa;AAChB,cAAQ;AAAA,QACN,MAAM,OAAO,2EAA2E;AAAA,MAC1F;AAAA,IACF;AAGA,UAAM,cAAc,IAAI,+BAA+B,EAAE,MAAM;AAE/D,UAAM,cAAc,IAAI,KAAK;AAC7B,UAAM,eAAe;AACrB,UAAM,YAAY,KAAK,IAAI;AAE3B,WAAO,KAAK,IAAI,IAAI,YAAY,aAAa;AAC3C,YAAM,MAAM,YAAY;AAExB,UAAI;AACF,cAAM,SAAS,MAAM,IAAI,eAAe,QAAQ,UAAU;AAE1D,YAAI,OAAO,WAAW,eAAe,OAAO,SAAS,OAAO,MAAM;AAChE,sBAAY,QAAQ,4BAA4B;AAGhD,mBAAS,OAAO,KAAK;AACrB,kBAAQ,OAAO,IAAI;AAEnB,kBAAQ,IAAI;AACZ,kBAAQ,IAAI,MAAM,MAAM,uBAAkB,MAAM,KAAK,OAAO,KAAK,KAAK,CAAC,EAAE,CAAC;AAC1E,kBAAQ,IAAI,MAAM,KAAK,YAAY,OAAO,KAAK,IAAI,EAAE,CAAC;AACtD,kBAAQ,IAAI,MAAM,KAAK,oCAAoC,CAAC;AAC5D,kBAAQ,IAAI;AACZ,kBAAQ,IAAI,MAAM,KAAK,qCAAqC,CAAC;AAC7D;AAAA,QACF;AAEA,YAAI,OAAO,WAAW,WAAW;AAC/B,sBAAY,KAAK,mDAAmD;AACpE;AAAA,QACF;AAAA,MAGF,SAAS,OAAO;AAAA,MAEhB;AAAA,IACF;AAEA,gBAAY,KAAK,6CAA6C;AAAA,EAChE,SAAS,OAAO;AACd,YAAQ,KAAK,qCAAqC;AAElD,QAAI,iBAAiB,iBAAiB;AACpC,cAAQ,MAAM,MAAM,IAAI,UAAU,MAAM,OAAO,EAAE,CAAC;AAClD,UAAI,MAAM,eAAe,KAAK;AAC5B,gBAAQ,MAAM,MAAM,KAAK,oEAAoE,CAAC;AAAA,MAChG;AAAA,IACF,OAAO;AACL,cAAQ,MAAM,MAAM,IAAI,+BAA+B,CAAC;AACxD,cAAQ,MAAM,MAAM,KAAK,yDAAyD,CAAC;AAAA,IACrF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,eAAe,eAAe,KAA+B;AAC3D,MAAI;AAEF,UAAM,EAAE,SAAS,KAAK,IAAI,MAAM,OAAO,MAAM;AAC7C,UAAM,KAAK,GAAG;AACd,WAAO;AAAA,EACT,QAAQ;AAEN,UAAM,EAAE,KAAK,IAAI,MAAM,OAAO,eAAe;AAC7C,UAAM,EAAE,UAAU,IAAI,MAAM,OAAO,MAAM;AACzC,UAAM,YAAY,UAAU,IAAI;AAEhC,UAAM,WAAW,QAAQ;AACzB,QAAI;AAEJ,QAAI,aAAa,UAAU;AACzB,gBAAU,SAAS,GAAG;AAAA,IACxB,WAAW,aAAa,SAAS;AAC/B,gBAAU,aAAa,GAAG;AAAA,IAC5B,OAAO;AACL,gBAAU,aAAa,GAAG;AAAA,IAC5B;AAEA,QAAI;AACF,YAAM,UAAU,OAAO;AACvB,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,SAAS,MAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AACzD;;;AG9HA,OAAOC,YAAW;AAGlB,eAAsB,gBAA+B;AACnD,MAAI,CAAC,gBAAgB,GAAG;AACtB,YAAQ,IAAIC,OAAM,OAAO,kCAAkC,CAAC;AAC5D;AAAA,EACF;AAEA,QAAM,OAAO,QAAQ;AACrB,QAAM,QAAQ,MAAM,SAAS;AAE7B,aAAW;AAEX,UAAQ,IAAIA,OAAM,MAAM,0BAAqBA,OAAM,KAAK,KAAK,CAAC,EAAE,CAAC;AACjE,UAAQ,IAAIA,OAAM,KAAK,8BAA8B,CAAC;AACxD;;;AChBA,OAAOC,YAAW;AAClB,OAAOC,UAAS;AAIhB,eAAsB,gBAA+B;AACnD,MAAI,CAAC,gBAAgB,GAAG;AACtB,YAAQ,IAAIC,OAAM,OAAO,wDAAwD,CAAC;AAClF,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,UAAUC,KAAI,uBAAuB,EAAE,MAAM;AAEnD,MAAI;AACF,UAAM,EAAE,KAAK,IAAI,MAAM,IAAI,QAAQ;AACnC,YAAQ,KAAK;AAGb,YAAQ;AAAA,MACN,IAAI,KAAK;AAAA,MACT,OAAO,KAAK;AAAA,MACZ,MAAM,KAAK;AAAA,MACX,MAAM,KAAK,aAAa;AAAA,IAC1B,CAAC;AAED,YAAQ,IAAI;AACZ,YAAQ,IAAID,OAAM,KAAK,8BAAuB,CAAC;AAC/C,YAAQ,IAAI;AACZ,YAAQ,IAAI,KAAKA,OAAM,KAAK,QAAQ,CAAC,UAAUA,OAAM,KAAK,KAAK,KAAK,CAAC,EAAE;AACvE,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAKA,OAAM,KAAK,OAAO,CAAC,WAAW,KAAK,IAAI,EAAE;AAAA,IAC5D;AACA,QAAI,KAAK,cAAc;AACrB,cAAQ,IAAI,KAAKA,OAAM,KAAK,UAAU,CAAC,QAAQ,KAAK,YAAY,EAAE;AAAA,IACpE;AACA,YAAQ,IAAI,KAAKA,OAAM,KAAK,OAAO,CAAC,WAAW,WAAW,KAAK,aAAa,IAAI,CAAC,EAAE;AACnF,QAAI,KAAK,aAAa,QAAQ;AAC5B,cAAQ,IAAI,KAAKA,OAAM,KAAK,SAAS,CAAC,SAAS,KAAK,aAAa,MAAM,EAAE;AAAA,IAC3E;AACA,QAAI,KAAK,aAAa,oBAAoB;AACxC,YAAM,UAAU,IAAI,KAAK,KAAK,aAAa,kBAAkB;AAC7D,cAAQ,IAAI,KAAKA,OAAM,KAAK,SAAS,CAAC,SAAS,QAAQ,mBAAmB,CAAC,EAAE;AAAA,IAC/E;AACA,YAAQ,IAAI;AACZ,YAAQ,IAAI,KAAKA,OAAM,KAAK,aAAa,CAAC,KAAK,KAAK,MAAM,gBAAgB,EAAE;AAC5E,YAAQ,IAAI,KAAKA,OAAM,KAAK,eAAe,CAAC,IAAI,IAAI,KAAK,KAAK,UAAU,EAAE,mBAAmB,CAAC,EAAE;AAChG,YAAQ,IAAI;AAAA,EACd,SAAS,OAAO;AACd,YAAQ,KAAK,2BAA2B;AAExC,QAAI,iBAAiB,iBAAiB;AACpC,UAAI,MAAM,eAAe,KAAK;AAC5B,gBAAQ,MAAMA,OAAM,IAAI,gEAAgE,CAAC;AAAA,MAC3F,WAAW,MAAM,eAAe,KAAK;AACnC,gBAAQ,MAAMA,OAAM,IAAI,sDAAsD,CAAC;AAC/E,gBAAQ,MAAMA,OAAM,KAAK,2CAA2C,CAAC;AAAA,MACvE,OAAO;AACL,gBAAQ,MAAMA,OAAM,IAAI,UAAU,MAAM,OAAO,EAAE,CAAC;AAAA,MACpD;AAAA,IACF,OAAO;AACL,cAAQ,MAAMA,OAAM,IAAI,+BAA+B,CAAC;AAAA,IAC1D;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,SAAS,WAAW,MAAsB;AACxC,QAAM,aAAoD;AAAA,IACxD,MAAMA,OAAM;AAAA,IACZ,KAAKA,OAAM;AAAA,IACX,KAAKA,OAAM;AAAA,IACX,OAAOA,OAAM;AAAA,EACf;AAEA,QAAM,UAAU,WAAW,IAAI,KAAKA,OAAM;AAC1C,SAAO,QAAQ,IAAI;AACrB;;;AC5EA,OAAOE,YAAW;AAClB,OAAOC,UAAS;AAShB,eAAsB,YAAY,SAAqC;AACrE,MAAI,CAAC,gBAAgB,GAAG;AACtB,YAAQ,IAAIC,OAAM,OAAO,wDAAwD,CAAC;AAClF,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,UAAUC,KAAI,6BAA6B,EAAE,MAAM;AAEzD,MAAI;AACF,UAAM,QAAQ,SAAS,QAAQ,OAAO,EAAE,KAAK;AAC7C,UAAM,EAAE,YAAY,OAAO,SAAS,IAAI,MAAM,IAAI,eAAe;AAAA,MAC/D;AAAA,MACA,YAAY,QAAQ;AAAA,IACtB,CAAC;AAED,YAAQ,KAAK;AAEb,QAAI,WAAW,WAAW,GAAG;AAC3B,cAAQ,IAAI;AACZ,cAAQ,IAAID,OAAM,OAAO,sBAAsB,CAAC;AAChD,cAAQ,IAAIA,OAAM,KAAK,yEAAyE,CAAC;AACjG,cAAQ,IAAIA,OAAM,KAAK,wDAAwD,CAAC;AAChF;AAAA,IACF;AAEA,YAAQ,IAAI;AACZ,YAAQ,IAAIA,OAAM,KAAK,8BAAuB,KAAK,SAAS,CAAC;AAC7D,YAAQ,IAAI;AAEZ,eAAW,MAAM,YAAY;AAC3B,qBAAe,EAAE;AAAA,IACnB;AAEA,QAAI,UAAU;AACZ,cAAQ,IAAIA,OAAM,KAAK,WAAW,WAAW,MAAM,OAAO,KAAK,4BAA4B,CAAC;AAAA,IAC9F;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,KAAK,4BAA4B;AACzC,mBAAe,KAAK;AAAA,EACtB;AACF;AAEA,SAAS,eAAe,IAAqB;AAC3C,QAAM,iBAAiB;AAAA,IACrB,SAAS;AAAA,IACT,MAAM;AAAA,IACN,QAAQ;AAAA,EACV,EAAE,GAAG,UAAU,KAAK;AAEpB,QAAM,YAAY;AAAA,IAChB,QAAQA,OAAM,KAAK,SAAS;AAAA,IAC5B,cAAcA,OAAM,KAAK,OAAO;AAAA,IAChC,UAAUA,OAAM,QAAQ,OAAO;AAAA,EACjC,EAAE,GAAG,IAAI,KAAK;AAEd,UAAQ,IAAI,KAAK,cAAc,IAAIA,OAAM,KAAK,GAAG,IAAI,CAAC,IAAI,SAAS,EAAE;AACrE,UAAQ,IAAI,QAAQA,OAAM,KAAK,GAAG,EAAE,CAAC,EAAE;AACvC,MAAI,GAAG,aAAa;AAClB,YAAQ,IAAI,QAAQA,OAAM,KAAK,SAAS,GAAG,aAAa,EAAE,CAAC,CAAC,EAAE;AAAA,EAChE;AACA,UAAQ,IAAI,QAAQA,OAAM,KAAK,SAAI,GAAG,SAAS,EAAE,CAAC,IAAIA,OAAM,KAAK,SAAI,GAAG,SAAS,EAAE,CAAC,IAAI,WAAW,GAAG,IAAI,CAAC,EAAE;AAC7G,UAAQ,IAAI;AACd;AAEA,SAAS,WAAW,MAAwB;AAC1C,MAAI,CAAC,QAAQ,KAAK,WAAW,EAAG,QAAO;AACvC,SAAO,KAAK,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,MAAMA,OAAM,KAAK,IAAI,CAAC,EAAE,CAAC,EAAE,KAAK,GAAG;AAClE;AAEA,SAAS,SAAS,KAAa,WAA2B;AACxD,MAAI,IAAI,UAAU,UAAW,QAAO;AACpC,SAAO,IAAI,MAAM,GAAG,YAAY,CAAC,IAAI;AACvC;AAEA,SAAS,eAAe,OAAsB;AAC5C,MAAI,iBAAiB,iBAAiB;AACpC,QAAI,MAAM,eAAe,KAAK;AAC5B,cAAQ,MAAMA,OAAM,IAAI,gEAAgE,CAAC;AAAA,IAC3F,WAAW,MAAM,eAAe,KAAK;AACnC,cAAQ,MAAMA,OAAM,IAAI,sDAAsD,CAAC;AAC/E,cAAQ,MAAMA,OAAM,KAAK,2CAA2C,CAAC;AAAA,IACvE,OAAO;AACL,cAAQ,MAAMA,OAAM,IAAI,UAAU,MAAM,OAAO,EAAE,CAAC;AAAA,IACpD;AAAA,EACF,OAAO;AACL,YAAQ,MAAMA,OAAM,IAAI,+BAA+B,CAAC;AAAA,EAC1D;AACA,UAAQ,KAAK,CAAC;AAChB;;;AClGA,OAAOE,YAAW;AAClB,OAAOC,UAAS;AAChB,OAAO,aAAa;AAGpB,SAAS,WAAW,QAAQ,aAAa;AACzC,SAAS,MAAM,eAAe;AAQ9B,IAAM,mBAA2C;AAAA,EAC/C,WAAW;AAAA,EACX,cAAc;AAAA,EACd,sBAAsB;AAAA,EACtB,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,WAAW;AAAA,EACX,SAAS;AACX;AAEA,eAAsB,YACpB,IACA,SACe;AACf,MAAI,CAAC,gBAAgB,GAAG;AACtB,YAAQ;AAAA,MACNC,OAAM,OAAO,wDAAwD;AAAA,IACvE;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,UAAUC,KAAI,sBAAsBD,OAAM,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM;AAErE,MAAI;AACF,UAAM,EAAE,UAAU,IAAI,MAAM,IAAI,aAAa,EAAE;AAC/C,YAAQ,KAAK;AAEb,QAAI,CAAC,UAAU,SAAS;AACtB,cAAQ,MAAMA,OAAM,IAAI,2BAA2B,CAAC;AACpD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,UAAM,WAAW,iBAAiB,UAAU,IAAI,KAAK;AACrD,UAAM,aAAa,KAAK,QAAQ,QAAQ,QAAQ;AAGhD,QAAIE,cAAa;AACjB,QAAI;AACF,YAAM,OAAO,UAAU;AACvB,MAAAA,cAAa;AAAA,IACf,QAAQ;AAAA,IAER;AAGA,QAAIA,eAAc,CAAC,QAAQ,KAAK;AAC9B,YAAM,WAAW,MAAM,QAAQ;AAAA,QAC7B,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,QAAQF,OAAM,KAAK,UAAU,CAAC;AAAA,QACvC,SAAS;AAAA,MACX,CAAC;AAED,UAAI,CAAC,SAAS,WAAW;AACvB,gBAAQ,IAAIA,OAAM,OAAO,UAAU,CAAC;AACpC;AAAA,MACF;AAAA,IACF;AAGA,UAAM,MAAM,QAAQ,UAAU;AAC9B,QAAI,QAAQ,KAAK;AACf,YAAM,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,IACtC;AAGA,UAAM,UAAU,YAAY,UAAU,SAAS,OAAO;AAEtD,YAAQ,IAAI;AACZ,YAAQ,IAAIA,OAAM,MAAM,qBAAgBA,OAAM,KAAK,UAAU,IAAI,CAAC,EAAE,CAAC;AACrE,YAAQ,IAAI,MAAMA,OAAM,KAAK,OAAO,CAAC,IAAIA,OAAM,KAAK,UAAU,CAAC,EAAE;AACjE,YAAQ,IAAI,MAAMA,OAAM,KAAK,OAAO,CAAC,IAAI,UAAU,IAAI,EAAE;AACzD,YAAQ,IAAI,MAAMA,OAAM,KAAK,OAAO,CAAC,IAAI,UAAU,IAAI,EAAE;AACzD,YAAQ,IAAI;AAGZ,UAAM,aAAa,cAAc,UAAU,IAAI;AAC/C,QAAI,YAAY;AACd,cAAQ,IAAIA,OAAM,KAAK,aAAM,UAAU,EAAE,CAAC;AAAA,IAC5C;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,KAAK,0BAA0B;AACvC,IAAAG,gBAAe,KAAK;AAAA,EACtB;AACF;AAEA,SAAS,cAAc,MAA6B;AAClD,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAASA,gBAAe,OAAsB;AAC5C,MAAI,iBAAiB,iBAAiB;AACpC,QAAI,MAAM,eAAe,KAAK;AAC5B,cAAQ;AAAA,QACNH,OAAM,IAAI,gEAAgE;AAAA,MAC5E;AAAA,IACF,WAAW,MAAM,eAAe,KAAK;AACnC,cAAQ;AAAA,QACNA,OAAM,IAAI,0CAA0C;AAAA,MACtD;AACA,cAAQ;AAAA,QACNA,OAAM;AAAA,UACJ;AAAA,QACF;AAAA,MACF;AAAA,IACF,WAAW,MAAM,eAAe,KAAK;AACnC,cAAQ,MAAMA,OAAM,IAAI,sBAAsB,CAAC;AAC/C,cAAQ;AAAA,QACNA,OAAM;AAAA,UACJ;AAAA,QACF;AAAA,MACF;AAAA,IACF,OAAO;AACL,cAAQ,MAAMA,OAAM,IAAI,UAAU,MAAM,OAAO,EAAE,CAAC;AAAA,IACpD;AAAA,EACF,OAAO;AACL,YAAQ,MAAMA,OAAM,IAAI,+BAA+B,CAAC;AAAA,EAC1D;AACA,UAAQ,KAAK,CAAC;AAChB;;;ACrJA,OAAOI,YAAW;AAClB,OAAOC,cAAa;AACpB,OAAOC,UAAS;AAChB,SAAS,aAAAC,YAAW,SAAAC,QAAiB,UAAAC,eAAc;AACnD,SAAS,QAAAC,OAAM,WAAAC,gBAAe;;;ACJ9B,SAAS,UAAU,UAAAC,eAAc;AACjC,SAAS,QAAAC,aAAY;AAcrB,eAAsB,cAAc,KAA8C;AAChF,QAAM,WAA4B;AAAA,IAChC,MAAM;AAAA,IACN,OAAO,CAAC;AAAA,IACR,UAAU,CAAC;AAAA,IACX,gBAAgB;AAAA,EAClB;AAGA,QAAM,kBAAkBA,MAAK,KAAK,cAAc;AAChD,MAAI,MAAM,WAAW,eAAe,GAAG;AACrC,QAAI;AACF,YAAM,UAAU,MAAM,SAAS,iBAAiB,OAAO;AACvD,YAAM,MAAM,KAAK,MAAM,OAAO;AAE9B,eAAS,OAAO,IAAI,QAAQ;AAG5B,YAAM,UAAU,EAAE,GAAG,IAAI,cAAc,GAAG,IAAI,gBAAgB;AAE9D,UAAI,QAAQ,YAAY,EAAG,UAAS,MAAM,KAAK,YAAY;AAC3D,UAAI,QAAQ,OAAO,EAAG,UAAS,MAAM,KAAK,OAAO;AACjD,UAAI,QAAQ,MAAM,EAAG,UAAS,MAAM,KAAK,QAAQ;AACjD,UAAI,QAAQ,KAAK,EAAG,UAAS,MAAM,KAAK,KAAK;AAC7C,UAAI,QAAQ,eAAe,EAAG,UAAS,MAAM,KAAK,SAAS;AAC3D,UAAI,QAAQ,QAAQ,EAAG,UAAS,MAAM,KAAK,QAAQ;AACnD,UAAI,QAAQ,SAAS,EAAG,UAAS,MAAM,KAAK,SAAS;AACrD,UAAI,QAAQ,SAAS,EAAG,UAAS,MAAM,KAAK,SAAS;AACrD,UAAI,QAAQ,QAAQ,EAAG,UAAS,MAAM,KAAK,QAAQ;AACnD,UAAI,QAAQ,aAAa,EAAG,UAAS,MAAM,KAAK,UAAU;AAG1D,UAAI,IAAI,SAAS;AACf,iBAAS,SAAS,QAAQ,IAAI,QAAQ;AACtC,iBAAS,SAAS,OAAO,IAAI,QAAQ;AACrC,iBAAS,SAAS,OAAO,IAAI,QAAQ;AACrC,iBAAS,SAAS,MAAM,IAAI,QAAQ,OAAO,IAAI,QAAQ;AAAA,MACzD;AAGA,UAAI,MAAM,WAAWA,MAAK,KAAK,gBAAgB,CAAC,GAAG;AACjD,iBAAS,iBAAiB;AAAA,MAC5B,WAAW,MAAM,WAAWA,MAAK,KAAK,WAAW,CAAC,GAAG;AACnD,iBAAS,iBAAiB;AAAA,MAC5B,WAAW,MAAM,WAAWA,MAAK,KAAK,WAAW,CAAC,GAAG;AACnD,iBAAS,iBAAiB;AAAA,MAC5B,WAAW,MAAM,WAAWA,MAAK,KAAK,mBAAmB,CAAC,GAAG;AAC3D,iBAAS,iBAAiB;AAAA,MAC5B;AAEA,aAAO;AAAA,IACT,QAAQ;AAAA,IAER;AAAA,EACF;AAGA,QAAM,gBAAgBA,MAAK,KAAK,gBAAgB;AAChD,MAAI,MAAM,WAAW,aAAa,GAAG;AACnC,QAAI;AACF,YAAM,UAAU,MAAM,SAAS,eAAe,OAAO;AAErD,eAAS,MAAM,KAAK,QAAQ;AAG5B,YAAM,YAAY,QAAQ,MAAM,sBAAsB;AACtD,UAAI,UAAW,UAAS,OAAO,UAAU,CAAC;AAG1C,UAAI,QAAQ,SAAS,SAAS,EAAG,UAAS,MAAM,KAAK,SAAS;AAC9D,UAAI,QAAQ,SAAS,QAAQ,EAAG,UAAS,MAAM,KAAK,QAAQ;AAC5D,UAAI,QAAQ,SAAS,OAAO,EAAG,UAAS,MAAM,KAAK,OAAO;AAG1D,eAAS,SAAS,OAAO;AACzB,eAAS,SAAS,OAAO;AAEzB,aAAO;AAAA,IACT,QAAQ;AAAA,IAER;AAAA,EACF;AAGA,QAAM,mBAAmBA,MAAK,KAAK,kBAAkB;AACrD,MAAI,MAAM,WAAW,gBAAgB,GAAG;AACtC,QAAI;AACF,YAAM,UAAU,MAAM,SAAS,kBAAkB,OAAO;AAExD,eAAS,MAAM,KAAK,QAAQ;AAE5B,UAAI,QAAQ,SAAS,SAAS,EAAG,UAAS,MAAM,KAAK,SAAS;AAC9D,UAAI,QAAQ,SAAS,QAAQ,EAAG,UAAS,MAAM,KAAK,QAAQ;AAC5D,UAAI,QAAQ,SAAS,OAAO,EAAG,UAAS,MAAM,KAAK,OAAO;AAE1D,eAAS,SAAS,OAAO;AACzB,eAAS,SAAS,OAAO;AAEzB,aAAO;AAAA,IACT,QAAQ;AAAA,IAER;AAAA,EACF;AAGA,QAAM,YAAYA,MAAK,KAAK,YAAY;AACxC,MAAI,MAAM,WAAW,SAAS,GAAG;AAC/B,QAAI;AACF,YAAM,UAAU,MAAM,SAAS,WAAW,OAAO;AAEjD,eAAS,MAAM,KAAK,MAAM;AAG1B,YAAM,YAAY,QAAQ,MAAM,sBAAsB;AACtD,UAAI,UAAW,UAAS,OAAO,UAAU,CAAC;AAE1C,eAAS,SAAS,QAAQ;AAC1B,eAAS,SAAS,OAAO;AACzB,eAAS,SAAS,OAAO;AAEzB,aAAO;AAAA,IACT,QAAQ;AAAA,IAER;AAAA,EACF;AAGA,QAAM,YAAYA,MAAK,KAAK,QAAQ;AACpC,MAAI,MAAM,WAAW,SAAS,GAAG;AAC/B,QAAI;AACF,YAAM,UAAU,MAAM,SAAS,WAAW,OAAO;AAEjD,eAAS,MAAM,KAAK,IAAI;AAGxB,YAAM,cAAc,QAAQ,MAAM,gBAAgB;AAClD,UAAI,aAAa;AACf,cAAM,QAAQ,YAAY,CAAC,EAAE,MAAM,GAAG;AACtC,iBAAS,OAAO,MAAM,MAAM,SAAS,CAAC;AAAA,MACxC;AAEA,eAAS,SAAS,QAAQ;AAC1B,eAAS,SAAS,OAAO;AACzB,eAAS,SAAS,OAAO;AAEzB,aAAO;AAAA,IACT,QAAQ;AAAA,IAER;AAAA,EACF;AAGA,QAAM,eAAeA,MAAK,KAAK,UAAU;AACzC,MAAI,MAAM,WAAW,YAAY,GAAG;AAClC,QAAI;AACF,YAAM,UAAU,MAAM,SAAS,cAAc,OAAO;AAGpD,UAAI,QAAQ,SAAS,QAAQ,EAAG,UAAS,SAAS,QAAQ;AAC1D,UAAI,QAAQ,SAAS,OAAO,EAAG,UAAS,SAAS,OAAO;AACxD,UAAI,QAAQ,SAAS,OAAO,EAAG,UAAS,SAAS,OAAO;AAExD,UAAI,OAAO,KAAK,SAAS,QAAQ,EAAE,SAAS,GAAG;AAC7C,eAAO;AAAA,MACT;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO,SAAS,MAAM,SAAS,KAAK,SAAS,OAAO,WAAW;AACjE;AAEA,eAAe,WAAW,MAAgC;AACxD,MAAI;AACF,UAAMD,QAAO,IAAI;AACjB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ACnLA,IAAM,iBAAyC;AAAA,EAC7C,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,UAAU;AAAA,EACV,KAAK;AACP;AAGA,IAAM,uBAA+C;AAAA,EACnD,SAAS;AAAA,EACT,UAAU;AAAA,EACV,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,UAAU;AACZ;AAGA,IAAM,cAAsC;AAAA,EAC1C,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,KAAK;AAAA,EACL,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,SAAS;AACX;AAGA,IAAM,aAAwF;AAAA,EAC5F,cAAc;AAAA,IACZ,QAAQ,CAAC,gCAAgC,8BAA8B;AAAA,IACvE,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR,QAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV,QAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,eAAe,SAAkD;AAC/E,QAAM,QAAgC,CAAC;AAEvC,aAAW,YAAY,QAAQ,WAAW;AACxC,UAAM,WAAW,eAAe,QAAQ;AACxC,QAAI,UAAU;AACZ,YAAM,QAAQ,IAAI,oBAAoB,SAAS,QAAQ;AAAA,IACzD;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,oBAAoB,SAA0B,UAA0B;AAC/E,QAAM,WAAqB,CAAC;AAC5B,QAAM,aAAa,aAAa,YAAY,aAAa;AAGzD,MAAI,YAAY;AACd,aAAS,KAAK,KAAK,QAAQ,IAAI,+BAA+B;AAC9D,aAAS,KAAK,EAAE;AAAA,EAClB;AAGA,QAAM,cAAc,qBAAqB,QAAQ,OAAO,KAAK,QAAQ;AACrE,MAAI,YAAY;AACd,aAAS,KAAK,YAAY;AAC1B,aAAS,KAAK,EAAE;AAChB,aAAS,KAAK,WAAW,WAAW,sCAAsC,QAAQ,IAAI,GAAG;AAAA,EAC3F,OAAO;AACL,aAAS,KAAK,WAAW,WAAW,sCAAsC,QAAQ,IAAI,GAAG;AAAA,EAC3F;AAEA,MAAI,QAAQ,aAAa;AACvB,aAAS,KAAK,EAAE;AAChB,aAAS,KAAK,wBAAwB,QAAQ,WAAW,EAAE;AAAA,EAC7D;AACA,WAAS,KAAK,EAAE;AAGhB,MAAI,QAAQ,MAAM,SAAS,GAAG;AAC5B,QAAI,YAAY;AACd,eAAS,KAAK,eAAe;AAC7B,eAAS,KAAK,EAAE;AAAA,IAClB,OAAO;AACL,eAAS,KAAK,aAAa;AAAA,IAC7B;AAEA,UAAM,YAAY,QAAQ,MAAM,IAAI,OAAK,YAAY,CAAC,KAAK,CAAC;AAC5D,QAAI,YAAY;AACd,iBAAW,QAAQ,WAAW;AAC5B,iBAAS,KAAK,KAAK,IAAI,EAAE;AAAA,MAC3B;AAAA,IACF,OAAO;AACL,eAAS,KAAK,UAAU,KAAK,IAAI,CAAC;AAAA,IACpC;AACA,aAAS,KAAK,EAAE;AAAA,EAClB;AAGA,QAAM,cAAc,OAAO,OAAO,QAAQ,QAAQ,EAAE,KAAK,OAAO;AAChE,MAAI,aAAa;AACf,QAAI,YAAY;AACd,eAAS,KAAK,aAAa;AAC3B,eAAS,KAAK,EAAE;AAChB,eAAS,KAAK,sCAAsC;AACpD,eAAS,KAAK,EAAE;AAChB,eAAS,KAAK,SAAS;AAAA,IACzB,OAAO;AACL,eAAS,KAAK,WAAW;AAAA,IAC3B;AAEA,QAAI,QAAQ,SAAS,OAAO;AAC1B,eAAS,KAAK,aAAa,YAAY,QAAQ,SAAS,KAAK,KAAK,YAAY,QAAQ,SAAS,KAAK,EAAE;AAAA,IACxG;AACA,QAAI,QAAQ,SAAS,MAAM;AACzB,eAAS,KAAK,aAAa,WAAW,QAAQ,SAAS,IAAI,KAAK,WAAW,QAAQ,SAAS,IAAI,EAAE;AAAA,IACpG;AACA,QAAI,QAAQ,SAAS,MAAM;AACzB,eAAS,KAAK,aAAa,WAAW,QAAQ,SAAS,IAAI,KAAK,WAAW,QAAQ,SAAS,IAAI,EAAE;AAAA,IACpG;AACA,QAAI,QAAQ,SAAS,KAAK;AACxB,eAAS,KAAK,aAAa,UAAU,QAAQ,SAAS,GAAG,KAAK,UAAU,QAAQ,SAAS,GAAG,EAAE;AAAA,IAChG;AAEA,QAAI,YAAY;AACd,eAAS,KAAK,KAAK;AAAA,IACrB;AACA,aAAS,KAAK,EAAE;AAAA,EAClB;AAGA,QAAM,aAAa,WAAW,QAAQ,UAAU;AAChD,MAAI,YAAY;AACd,QAAI,YAAY;AACd,eAAS,KAAK,eAAe;AAC7B,eAAS,KAAK,EAAE;AAEhB,eAAS,KAAK,uCAAkC;AAChD,eAAS,KAAK,EAAE;AAChB,iBAAW,QAAQ,WAAW,QAAQ;AACpC,iBAAS,KAAK,KAAK,IAAI,EAAE;AAAA,MAC3B;AACA,eAAS,KAAK,EAAE;AAEhB,eAAS,KAAK,4BAAkB;AAChC,eAAS,KAAK,EAAE;AAChB,iBAAW,QAAQ,WAAW,UAAU;AACtC,iBAAS,KAAK,KAAK,IAAI,EAAE;AAAA,MAC3B;AACA,eAAS,KAAK,EAAE;AAEhB,eAAS,KAAK,qBAAc;AAC5B,eAAS,KAAK,EAAE;AAChB,iBAAW,QAAQ,WAAW,OAAO;AACnC,iBAAS,KAAK,KAAK,IAAI,EAAE;AAAA,MAC3B;AAAA,IACF,OAAO;AACL,eAAS,KAAK,aAAa;AAC3B,eAAS,KAAK,EAAE;AAChB,eAAS,KAAK,6BAA6B;AAC3C,iBAAW,QAAQ,WAAW,QAAQ;AACpC,iBAAS,KAAK,KAAK,IAAI,EAAE;AAAA,MAC3B;AACA,eAAS,KAAK,EAAE;AAChB,eAAS,KAAK,YAAY;AAC1B,iBAAW,QAAQ,WAAW,UAAU;AACtC,iBAAS,KAAK,KAAK,IAAI,EAAE;AAAA,MAC3B;AACA,eAAS,KAAK,EAAE;AAChB,eAAS,KAAK,QAAQ;AACtB,iBAAW,QAAQ,WAAW,OAAO;AACnC,iBAAS,KAAK,KAAK,IAAI,EAAE;AAAA,MAC3B;AAAA,IACF;AACA,aAAS,KAAK,EAAE;AAAA,EAClB;AAGA,MAAI,YAAY;AACd,aAAS,KAAK,eAAe;AAC7B,aAAS,KAAK,EAAE;AAChB,aAAS,KAAK,2BAA2B;AACzC,aAAS,KAAK,EAAE;AAEhB,QAAI,QAAQ,MAAM,SAAS,YAAY,KAAK,QAAQ,MAAM,SAAS,YAAY,GAAG;AAChF,eAAS,KAAK,6CAA6C;AAC3D,eAAS,KAAK,oCAAoC;AAClD,eAAS,KAAK,qCAAqC;AACnD,eAAS,KAAK,+CAA+C;AAAA,IAC/D;AAEA,QAAI,QAAQ,MAAM,SAAS,OAAO,KAAK,QAAQ,MAAM,SAAS,QAAQ,GAAG;AACvE,eAAS,KAAK,wCAAwC;AACtD,eAAS,KAAK,qCAAqC;AACnD,eAAS,KAAK,qDAAqD;AAAA,IACrE;AAEA,QAAI,QAAQ,MAAM,SAAS,QAAQ,GAAG;AACpC,eAAS,KAAK,iCAAiC;AAC/C,eAAS,KAAK,0CAA0C;AACxD,eAAS,KAAK,0CAA0C;AAAA,IAC1D;AAEA,QAAI,QAAQ,MAAM,SAAS,IAAI,GAAG;AAChC,eAAS,KAAK,yCAAyC;AACvD,eAAS,KAAK,gCAAgC;AAC9C,eAAS,KAAK,4BAA4B;AAAA,IAC5C;AAEA,QAAI,QAAQ,MAAM,SAAS,MAAM,GAAG;AAClC,eAAS,KAAK,oCAAoC;AAClD,eAAS,KAAK,+BAA+B;AAC7C,eAAS,KAAK,4BAA4B;AAAA,IAC5C;AAGA,aAAS,KAAK,+BAA+B;AAC7C,aAAS,KAAK,uCAAuC;AACrD,aAAS,KAAK,uCAAuC;AACrD,aAAS,KAAK,EAAE;AAAA,EAClB;AAGA,MAAI,YAAY;AACd,aAAS,KAAK,KAAK;AACnB,aAAS,KAAK,EAAE;AAChB,aAAS,KAAK,yDAAyD;AAAA,EACzE;AAEA,SAAO,SAAS,KAAK,IAAI;AAC3B;;;AFtSA,IAAM,cAAc;AAAA,EAClB,EAAE,OAAO,cAAc,OAAO,aAAa;AAAA,EAC3C,EAAE,OAAO,cAAc,OAAO,aAAa;AAAA,EAC3C,EAAE,OAAO,UAAU,OAAO,SAAS;AAAA,EACnC,EAAE,OAAO,MAAM,OAAO,KAAK;AAAA,EAC3B,EAAE,OAAO,QAAQ,OAAO,OAAO;AAAA,EAC/B,EAAE,OAAO,QAAQ,OAAO,OAAO;AAAA,EAC/B,EAAE,OAAO,WAAW,OAAO,SAAS;AAAA,EACpC,EAAE,OAAO,QAAQ,OAAO,OAAO;AAAA,EAC/B,EAAE,OAAO,OAAO,OAAO,MAAM;AAAA,EAC7B,EAAE,OAAO,SAAS,OAAO,QAAQ;AACnC;AAEA,IAAM,aAAa;AAAA,EACjB,EAAE,OAAO,SAAS,OAAO,QAAQ;AAAA,EACjC,EAAE,OAAO,WAAW,OAAO,SAAS;AAAA,EACpC,EAAE,OAAO,UAAU,OAAO,MAAM;AAAA,EAChC,EAAE,OAAO,WAAW,OAAO,UAAU;AAAA,EACrC,EAAE,OAAO,UAAU,OAAO,SAAS;AAAA,EACnC,EAAE,OAAO,WAAW,OAAO,UAAU;AAAA,EACrC,EAAE,OAAO,WAAW,OAAO,UAAU;AAAA,EACrC,EAAE,OAAO,UAAU,OAAO,SAAS;AAAA,EACnC,EAAE,OAAO,SAAS,OAAO,QAAQ;AAAA,EACjC,EAAE,OAAO,eAAe,OAAO,SAAS;AAAA,EACxC,EAAE,OAAO,SAAS,OAAO,QAAQ;AAAA,EACjC,EAAE,OAAO,WAAW,OAAO,UAAU;AACvC;AAGA,IAAM,YAAY;AAAA,EAChB,EAAE,OAAO,yBAAyB,OAAO,UAAU,UAAU,eAAe;AAAA,EAC5E,EAAE,OAAO,2BAA2B,OAAO,UAAU,UAAU,YAAY;AAAA,EAC3E,EAAE,OAAO,kBAAkB,OAAO,WAAW,UAAU,kCAAkC;AAAA,EACzF,EAAE,OAAO,6BAA6B,OAAO,YAAY,UAAU,iBAAiB;AAAA,EACpF,EAAE,OAAO,OAAO,OAAO,OAAO,UAAU,uBAAuB;AACjE;AAGA,IAAM,WAAW;AAAA,EACf,EAAE,OAAO,sDAAsD,OAAO,UAAU;AAAA,EAChF,EAAE,OAAO,gDAAgD,OAAO,WAAW;AAAA,EAC3E,EAAE,OAAO,sDAAsD,OAAO,YAAY;AAAA,EAClF,EAAE,OAAO,uDAAuD,OAAO,SAAS;AAAA,EAChF,EAAE,OAAO,6CAA6C,OAAO,OAAO;AAAA,EACpE,EAAE,OAAO,oDAAoD,OAAO,WAAW;AAAA,EAC/E,EAAE,OAAO,aAAa,OAAO,SAAS;AACxC;AAGA,IAAM,mBAAmB;AAAA,EACvB;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,QAAQ,CAAC,iBAAiB,0BAA0B;AAAA,IACpD,UAAU,CAAC,mBAAmB,oBAAoB,gBAAgB,WAAW;AAAA,IAC7E,OAAO,CAAC,gBAAgB,eAAe,aAAa;AAAA,EACtD;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,QAAQ,CAAC,iBAAiB,wBAAwB,uBAAuB,mBAAmB;AAAA,IAC5F,UAAU,CAAC,wBAAwB,uBAAuB,oBAAoB;AAAA,IAC9E,OAAO,CAAC,0BAA0B,uBAAuB,YAAY;AAAA,EACvE;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,QAAQ,CAAC,2BAA2B,kBAAkB,oBAAoB,cAAc;AAAA,IACxF,UAAU,CAAC,uBAAuB,oBAAoB;AAAA,IACtD,OAAO,CAAC,eAAe,2CAA2C;AAAA,EACpE;AACF;AAEA,eAAsB,YAAY,SAAqC;AACrE,UAAQ,IAAI;AACZ,UAAQ,IAAIE,OAAM,KAAK,kCAA2B,CAAC;AACnD,UAAQ,IAAI;AAGZ,QAAM,WAAW,MAAM,cAAc,QAAQ,IAAI,CAAC;AAElD,MAAI,UAAU;AACZ,YAAQ,IAAIA,OAAM,KAAK,iCAAiC,CAAC;AACzD,QAAI,SAAS,KAAM,SAAQ,IAAIA,OAAM,KAAK,WAAW,SAAS,IAAI,EAAE,CAAC;AACrE,QAAI,SAAS,MAAM,SAAS,EAAG,SAAQ,IAAIA,OAAM,KAAK,YAAY,SAAS,MAAM,KAAK,IAAI,CAAC,EAAE,CAAC;AAC9F,QAAI,SAAS,SAAS,MAAO,SAAQ,IAAIA,OAAM,KAAK,YAAY,SAAS,SAAS,KAAK,EAAE,CAAC;AAC1F,QAAI,SAAS,SAAS,KAAM,SAAQ,IAAIA,OAAM,KAAK,WAAW,SAAS,SAAS,IAAI,EAAE,CAAC;AACvF,YAAQ,IAAI;AAAA,EACd;AAEA,MAAIC;AAGJ,MAAI,QAAQ,KAAK;AACf,IAAAA,UAAS;AAAA,MACP,MAAM,QAAQ,QAAQ,UAAU,QAAQ;AAAA,MACxC,aAAa,QAAQ,eAAe;AAAA,MACpC,OAAO,QAAQ,OAAO,MAAM,GAAG,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC,KAAK,UAAU,SAAS,CAAC;AAAA,MAC3E,WAAW,QAAQ,WAAW,MAAM,GAAG,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC,KAAK,CAAC,UAAU,QAAQ;AAAA,MAClF,SAAS,QAAQ,WAAW;AAAA,MAC5B,YAAY,QAAQ,cAA4D;AAAA,MAChF,UAAU,UAAU,YAAY,CAAC;AAAA,IACnC;AAAA,EACF,OAAO;AAEL,IAAAA,UAAS,MAAM,qBAAqB,SAAS,QAAQ;AAAA,EACvD;AAGA,QAAM,UAAUC,KAAI,mCAAmC,EAAE,MAAM;AAE/D,MAAI;AACF,UAAM,QAAQ,eAAeD,OAAM;AACnC,YAAQ,KAAK;AAEb,YAAQ,IAAI;AACZ,YAAQ,IAAID,OAAM,MAAM,yBAAoB,CAAC;AAE7C,eAAW,CAAC,UAAU,OAAO,KAAK,OAAO,QAAQ,KAAK,GAAG;AACvD,YAAM,aAAaG,MAAK,QAAQ,IAAI,GAAG,QAAQ;AAG/C,UAAI,SAAS;AACb,UAAI;AACF,cAAMC,QAAO,UAAU;AACvB,iBAAS;AAAA,MACX,QAAQ;AAAA,MAER;AAGA,UAAI,UAAU,CAAC,QAAQ,KAAK;AAC1B,cAAM,WAAW,MAAMC,SAAQ;AAAA,UAC7B,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS,GAAG,QAAQ;AAAA,UACpB,SAAS;AAAA,QACX,CAAC;AAED,YAAI,CAAC,SAAS,WAAW;AACvB,kBAAQ,IAAIL,OAAM,OAAO,eAAe,QAAQ,EAAE,CAAC;AACnD;AAAA,QACF;AAAA,MACF;AAGA,YAAM,MAAMM,SAAQ,UAAU;AAC9B,UAAI,QAAQ,KAAK;AACf,cAAMC,OAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,MACtC;AAEA,YAAMC,WAAU,YAAY,SAAS,OAAO;AAC5C,cAAQ,IAAI,MAAMR,OAAM,KAAK,QAAQ,CAAC,EAAE;AAAA,IAC1C;AAEA,YAAQ,IAAI;AACZ,YAAQ,IAAIA,OAAM,KAAK,qCAAqC,CAAC;AAC7D,YAAQ,IAAIA,OAAM,KAAK,kEAAkE,CAAC;AAC1F,YAAQ,IAAI;AAAA,EACd,SAAS,OAAO;AACd,YAAQ,KAAK,0BAA0B;AACvC,YAAQ,MAAMA,OAAM,IAAI,yDAAyD,CAAC;AAClF,QAAI,iBAAiB,OAAO;AAC1B,cAAQ,MAAMA,OAAM,KAAK,MAAM,OAAO,CAAC;AAAA,IACzC;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,eAAe,qBACb,SACA,UAC0B;AAC1B,QAAM,UAAmC,CAAC;AAG1C,QAAM,eAAe,MAAMK,SAAQ;AAAA,IACjC,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS,QAAQ,QAAQ,UAAU,QAAQ;AAAA,EAC7C,CAAC;AACD,UAAQ,OAAO,aAAa;AAG5B,QAAM,eAAe,MAAMA,SAAQ;AAAA,IACjC,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS,QAAQ,eAAe;AAAA,EAClC,CAAC;AACD,UAAQ,cAAc,aAAa;AAGnC,QAAM,kBAAkB,CAAC,GAAG,aAAa,GAAG,UAAU;AACtD,QAAM,gBAAgB,MAAMA,SAAQ;AAAA,IAClC,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,IACT,MAAM;AAAA,EACR,CAAC;AACD,UAAQ,QAAQ,cAAc,SAAS,CAAC;AAGxC,QAAM,mBAAmB,MAAMA,SAAQ;AAAA,IACrC,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,IACT,MAAM;AAAA,IACN,KAAK;AAAA,EACP,CAAC;AACD,UAAQ,YAAY,iBAAiB,aAAa,CAAC,QAAQ;AAG3D,QAAM,kBAAkB,MAAMA,SAAQ;AAAA,IACpC,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA;AAAA,EACX,CAAC;AAED,MAAI,gBAAgB,YAAY,UAAU;AACxC,UAAM,gBAAgB,MAAMA,SAAQ;AAAA,MAClC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AACD,YAAQ,UAAU,cAAc,SAAS;AAAA,EAC3C,OAAO;AACL,YAAQ,UAAU,gBAAgB;AAAA,EACpC;AAGA,MAAI,UAAU,YAAY,OAAO,KAAK,SAAS,QAAQ,EAAE,SAAS,GAAG;AACnE,YAAQ,IAAI;AACZ,YAAQ,IAAIL,OAAM,KAAK,yBAAyB,CAAC;AACjD,QAAI,SAAS,SAAS,MAAO,SAAQ,IAAIA,OAAM,KAAK,YAAY,SAAS,SAAS,KAAK,EAAE,CAAC;AAC1F,QAAI,SAAS,SAAS,KAAM,SAAQ,IAAIA,OAAM,KAAK,WAAW,SAAS,SAAS,IAAI,EAAE,CAAC;AACvF,QAAI,SAAS,SAAS,KAAM,SAAQ,IAAIA,OAAM,KAAK,WAAW,SAAS,SAAS,IAAI,EAAE,CAAC;AACvF,QAAI,SAAS,SAAS,IAAK,SAAQ,IAAIA,OAAM,KAAK,UAAU,SAAS,SAAS,GAAG,EAAE,CAAC;AAEpF,UAAM,eAAe,MAAMK,SAAQ;AAAA,MACjC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAED,QAAI,aAAa,MAAM;AACrB,YAAM,mBAAmB,MAAMA,SAAQ;AAAA,QACrC,EAAE,MAAM,QAAQ,MAAM,SAAS,SAAS,kBAAkB,SAAS,SAAS,SAAS,MAAM;AAAA,QAC3F,EAAE,MAAM,QAAQ,MAAM,QAAQ,SAAS,iBAAiB,SAAS,SAAS,SAAS,KAAK;AAAA,QACxF,EAAE,MAAM,QAAQ,MAAM,QAAQ,SAAS,iBAAiB,SAAS,SAAS,SAAS,KAAK;AAAA,QACxF,EAAE,MAAM,QAAQ,MAAM,OAAO,SAAS,gBAAgB,SAAS,SAAS,SAAS,IAAI;AAAA,MACvF,CAAC;AACD,cAAQ,WAAW;AAAA,IACrB,OAAO;AACL,cAAQ,WAAW,SAAS;AAAA,IAC9B;AAAA,EACF,OAAO;AACL,YAAQ,WAAW,CAAC;AAAA,EACtB;AAGA,QAAM,mBAAmB,MAAMA,SAAQ;AAAA,IACrC,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS,iBAAiB,IAAI,QAAM,EAAE,OAAO,EAAE,OAAO,OAAO,EAAE,MAAM,EAAE;AAAA,IACvE,SAAS;AAAA;AAAA,EACX,CAAC;AACD,UAAQ,aAAa,iBAAiB,cAAc;AAEpD,SAAO;AAAA,IACL,MAAM,QAAQ;AAAA,IACd,aAAa,QAAQ;AAAA,IACrB,OAAO,QAAQ;AAAA,IACf,WAAW,QAAQ;AAAA,IACnB,SAAS,QAAQ;AAAA,IACjB,YAAY,QAAQ;AAAA,IACpB,UAAU,QAAQ;AAAA,EACpB;AACF;;;AGjTA,OAAOI,YAAW;AAClB,OAAOC,UAAS;AAOhB,eAAsB,cACpB,OACA,SACe;AACf,QAAM,UAAUC,KAAI,kBAAkB,KAAK,MAAM,EAAE,MAAM;AAEzD,MAAI;AACF,UAAM,QAAQ,SAAS,QAAQ,OAAO,EAAE,KAAK;AAC7C,UAAM,EAAE,WAAW,OAAO,QAAQ,IAAI,MAAM,IAAI,iBAAiB,OAAO,KAAK;AAC7E,YAAQ,KAAK;AAEb,QAAI,UAAU,WAAW,GAAG;AAC1B,cAAQ,IAAI;AACZ,cAAQ,IAAIC,OAAM,OAAO,4BAA4B,KAAK,IAAI,CAAC;AAC/D,cAAQ,IAAIA,OAAM,KAAK,uEAAuE,CAAC;AAC/F;AAAA,IACF;AAEA,YAAQ,IAAI;AACZ,YAAQ,IAAIA,OAAM,KAAK,iCAA0B,KAAK,MAAM,KAAK,SAAS,CAAC;AAC3E,YAAQ,IAAI;AAEZ,eAAW,UAAU,WAAW;AAC9B,wBAAkB,MAAM;AAAA,IAC1B;AAEA,QAAI,SAAS;AACX,cAAQ,IAAIA,OAAM,KAAK,WAAW,UAAU,MAAM,OAAO,KAAK,4BAA4B,CAAC;AAAA,IAC7F;AAEA,YAAQ,IAAI;AACZ,YAAQ,IAAIA,OAAM,KAAK,qDAAqD,CAAC;AAAA,EAC/E,SAAS,OAAO;AACd,YAAQ,KAAK,eAAe;AAC5B,IAAAC,gBAAe,KAAK;AAAA,EACtB;AACF;AAEA,SAAS,kBAAkB,QAA4B;AACrD,QAAM,YAAY,OAAO,QAAQD,OAAM,OAAO,UAAK,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,EAAE,IAAIA,OAAM,MAAM,MAAM;AACzG,QAAM,gBAAgB,OAAO,aAAaA,OAAM,QAAQ,kBAAa,IAAI;AAEzE,UAAQ,IAAI,KAAKA,OAAM,KAAK,OAAO,IAAI,CAAC,GAAG,aAAa,EAAE;AAC1D,UAAQ,IAAI,QAAQA,OAAM,KAAK,OAAO,EAAE,CAAC,WAAM,SAAS,EAAE;AAC1D,MAAI,OAAO,aAAa;AACtB,YAAQ,IAAI,QAAQA,OAAM,KAAKE,UAAS,OAAO,aAAa,EAAE,CAAC,CAAC,EAAE;AAAA,EACpE;AACA,UAAQ,IAAI,QAAQF,OAAM,KAAK,MAAM,OAAO,MAAM,EAAE,CAAC,WAAMA,OAAM,KAAK,SAAI,OAAO,SAAS,EAAE,CAAC,IAAIA,OAAM,KAAK,SAAI,OAAO,KAAK,EAAE,CAAC,EAAE;AACjI,MAAI,OAAO,QAAQ,OAAO,KAAK,SAAS,GAAG;AACzC,YAAQ,IAAI,QAAQG,YAAW,OAAO,IAAI,CAAC,EAAE;AAAA,EAC/C;AACA,UAAQ,IAAI;AACd;AAEA,SAASA,YAAW,MAAwB;AAC1C,SAAO,KAAK,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,MAAMH,OAAM,KAAK,IAAI,CAAC,EAAE,CAAC,EAAE,KAAK,GAAG;AAClE;AAEA,SAASE,UAAS,KAAa,WAA2B;AACxD,MAAI,IAAI,UAAU,UAAW,QAAO;AACpC,SAAO,IAAI,MAAM,GAAG,YAAY,CAAC,IAAI;AACvC;AAEA,SAASD,gBAAe,OAAsB;AAC5C,MAAI,iBAAiB,iBAAiB;AACpC,YAAQ,MAAMD,OAAM,IAAI,UAAU,MAAM,OAAO,EAAE,CAAC;AAAA,EACpD,OAAO;AACL,YAAQ,MAAMA,OAAM,IAAI,+BAA+B,CAAC;AAAA,EAC1D;AACA,UAAQ,KAAK,CAAC;AAChB;;;AC9EA,OAAOI,YAAW;AAClB,SAAS,UAAAC,SAAQ,YAAAC,iBAAgB;AACjC,SAAS,QAAAC,aAAY;AAGrB,IAAM,eAAe;AAAA,EACnB,EAAE,MAAM,aAAa,MAAM,aAAa,UAAU,iCAAiC;AAAA,EACnF,EAAE,MAAM,aAAa,MAAM,aAAa,UAAU,cAAc;AAAA,EAChE,EAAE,MAAM,gBAAgB,MAAM,gBAAgB,UAAU,SAAS;AAAA,EACjE,EAAE,MAAM,mCAAmC,MAAM,wBAAwB,UAAU,iBAAiB;AAAA,EACpG,EAAE,MAAM,kBAAkB,MAAM,kBAAkB,UAAU,WAAW;AAAA,EACvE,EAAE,MAAM,wBAAwB,MAAM,oBAAoB,UAAU,MAAM;AAC5E;AAEA,eAAsB,gBAA+B;AACnD,QAAM,MAAM,QAAQ,IAAI;AAExB,UAAQ,IAAI;AACZ,UAAQ,IAAIH,OAAM,KAAK,4BAAqB,CAAC;AAC7C,UAAQ,IAAIA,OAAM,KAAK,iBAAiB,GAAG,EAAE,CAAC;AAC9C,UAAQ,IAAI;AAEZ,MAAI,WAAW;AAEf,aAAWI,WAAU,cAAc;AACjC,UAAM,WAAWD,MAAK,KAAKC,QAAO,IAAI;AACtC,QAAI;AACF,YAAMH,QAAO,QAAQ;AACrB,YAAM,UAAU,MAAMC,UAAS,UAAU,OAAO;AAChD,YAAM,QAAQ,QAAQ,MAAM,IAAI,EAAE;AAClC,YAAM,OAAO,YAAY,QAAQ,MAAM;AAEvC,iBAAW;AACX,cAAQ,IAAI,KAAKF,OAAM,MAAM,QAAG,CAAC,IAAIA,OAAM,KAAKI,QAAO,IAAI,CAAC,EAAE;AAC9D,cAAQ,IAAI,QAAQJ,OAAM,KAAK,aAAaI,QAAO,QAAQ,EAAE,CAAC,EAAE;AAChE,cAAQ,IAAI,QAAQJ,OAAM,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,CAAC,EAAE;AAGlE,YAAM,UAAU,WAAW,OAAO;AAClC,UAAI,SAAS;AACX,gBAAQ,IAAI,QAAQA,OAAM,KAAK,YAAY,OAAO,EAAE,CAAC,EAAE;AAAA,MACzD;AACA,cAAQ,IAAI;AAAA,IACd,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,MAAI,CAAC,UAAU;AACb,YAAQ,IAAIA,OAAM,OAAO,sDAAsD,CAAC;AAChF,YAAQ,IAAI;AACZ,YAAQ,IAAIA,OAAM,KAAK,oDAAoD,CAAC;AAC5E,YAAQ,IAAIA,OAAM,KAAK,oEAAoE,CAAC;AAAA,EAC9F,OAAO;AACL,YAAQ,IAAIA,OAAM,KAAK,+DAA+D,CAAC;AAAA,EACzF;AACA,UAAQ,IAAI;AACd;AAEA,SAAS,WAAW,SAAgC;AAClD,QAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,aAAW,QAAQ,OAAO;AACxB,UAAM,UAAU,KAAK,KAAK;AAC1B,QACE,WACA,CAAC,QAAQ,WAAW,GAAG,KACvB,CAAC,QAAQ,WAAW,IAAI,KACxB,CAAC,QAAQ,WAAW,MAAM,GAC1B;AACA,aAAOK,UAAS,SAAS,EAAE;AAAA,IAC7B;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAASA,UAAS,KAAa,WAA2B;AACxD,MAAI,IAAI,UAAU,UAAW,QAAO;AACpC,SAAO,IAAI,MAAM,GAAG,YAAY,CAAC,IAAI;AACvC;AAEA,SAAS,YAAY,OAAuB;AAC1C,MAAI,QAAQ,KAAM,QAAO,GAAG,KAAK;AACjC,MAAI,QAAQ,OAAO,KAAM,QAAO,IAAI,QAAQ,MAAM,QAAQ,CAAC,CAAC;AAC5D,SAAO,IAAI,SAAS,OAAO,OAAO,QAAQ,CAAC,CAAC;AAC9C;;;AZzEA,IAAM,UAAU,IAAI,QAAQ;AAE5B,QACG,KAAK,YAAY,EACjB,YAAY,0DAA0D,EACtE,QAAQ,OAAO;AAGlB,QACG,QAAQ,OAAO,EACf,YAAY,8CAA8C,EAC1D,OAAO,YAAY;AAEtB,QACG,QAAQ,QAAQ,EAChB,YAAY,uCAAuC,EACnD,OAAO,aAAa;AAEvB,QACG,QAAQ,QAAQ,EAChB,YAAY,iCAAiC,EAC7C,OAAO,aAAa;AAGvB,QACG,QAAQ,MAAM,EACd,YAAY,qDAAqD,EACjE,OAAO,qBAAqB,cAAc,EAC1C,OAAO,mCAAmC,qBAAqB,EAC/D,OAAO,uBAAuB,8BAA8B,EAC5D,OAAO,+BAA+B,oCAAoC,EAC1E,OAAO,uBAAuB,iBAAiB,EAC/C,OAAO,wBAAwB,sDAAsD,EACrF,OAAO,qBAAqB,oDAAoD,EAChF,OAAO,aAAa,+BAA+B,EACnD,OAAO,WAAW;AAErB,QACG,QAAQ,MAAM,EACd,YAAY,sBAAsB,EAClC,OAAO,wBAAwB,qBAAqB,IAAI,EACxD,OAAO,iCAAiC,mDAAmD,EAC3F,OAAO,WAAW;AAErB,QACG,QAAQ,WAAW,EACnB,YAAY,+CAA+C,EAC3D,OAAO,uBAAuB,oBAAoB,GAAG,EACrD,OAAO,aAAa,4CAA4C,EAChE,OAAO,WAAW;AAErB,QACG,QAAQ,gBAAgB,EACxB,YAAY,0BAA0B,EACtC,OAAO,wBAAwB,qBAAqB,IAAI,EACxD,OAAO,aAAa;AAEvB,QACG,QAAQ,QAAQ,EAChB,YAAY,iDAAiD,EAC7D,OAAO,aAAa;AAGvB,QAAQ;AAAA,EACN;AAAA,EACA;AAAA,EACAC,OAAM,KAAK,0BAAmB,CAAC;AAAA,EAC/BA,OAAM,KAAK,wDAAwD,CAAC;AAAA;AAEtE;AAEA,QAAQ;AAAA,EACN;AAAA,EACA;AAAA,EACAA,OAAM,KAAK,WAAW,CAAC;AAAA,IACrBA,OAAM,KAAK,mBAAmB,CAAC,iBAAiBA,OAAM,KAAK,0BAA0B,CAAC;AAAA,IACtFA,OAAM,KAAK,6BAA6B,CAAC,OAAOA,OAAM,KAAK,sBAAsB,CAAC;AAAA,IAClFA,OAAM,KAAK,mBAAmB,CAAC,iBAAiBA,OAAM,KAAK,sBAAsB,CAAC;AAAA,IAClFA,OAAM,KAAK,4BAA4B,CAAC,QAAQA,OAAM,KAAK,0BAA0B,CAAC;AAAA;AAAA,EAExFA,OAAM,KAAK,gDAAgD,CAAC;AAAA;AAE9D;AAEA,QAAQ,MAAM;","names":["chalk","chalk","chalk","chalk","ora","chalk","ora","chalk","ora","chalk","ora","chalk","ora","chalk","ora","fileExists","handleApiError","chalk","prompts","ora","writeFile","mkdir","access","join","dirname","access","join","chalk","config","ora","join","access","prompts","dirname","mkdir","writeFile","chalk","ora","ora","chalk","handleApiError","truncate","formatTags","chalk","access","readFile","join","config","truncate","chalk"]}
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "lynxprompt",
3
+ "version": "0.1.0",
4
+ "description": "CLI for LynxPrompt - Generate AI IDE configuration files",
5
+ "author": "LynxPrompt Contributors",
6
+ "license": "SEE LICENSE FILE",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/GeiserX/LynxPrompt.git",
10
+ "directory": "cli"
11
+ },
12
+ "homepage": "https://lynxprompt.com",
13
+ "keywords": [
14
+ "ai",
15
+ "ide",
16
+ "cursor",
17
+ "copilot",
18
+ "claude",
19
+ "windsurf",
20
+ "cursorrules",
21
+ "agents-md",
22
+ "cli"
23
+ ],
24
+ "type": "module",
25
+ "bin": {
26
+ "lynxprompt": "./dist/index.js"
27
+ },
28
+ "main": "./dist/index.js",
29
+ "files": [
30
+ "dist"
31
+ ],
32
+ "scripts": {
33
+ "build": "tsup",
34
+ "dev": "tsup --watch",
35
+ "start": "node dist/index.js",
36
+ "typecheck": "tsc --noEmit",
37
+ "lint": "eslint src",
38
+ "clean": "rm -rf dist"
39
+ },
40
+ "dependencies": {
41
+ "chalk": "^5.4.1",
42
+ "commander": "^13.1.0",
43
+ "conf": "^13.1.0",
44
+ "open": "^10.1.2",
45
+ "ora": "^8.2.0",
46
+ "prompts": "^2.4.2"
47
+ },
48
+ "devDependencies": {
49
+ "@types/node": "^22.10.2",
50
+ "@types/prompts": "^2.4.9",
51
+ "tsup": "^8.4.0",
52
+ "typescript": "^5.9.3"
53
+ },
54
+ "engines": {
55
+ "node": ">=18.0.0"
56
+ }
57
+ }
58
+