teamix-evo 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/logger.ts","../src/utils/fs.ts","../src/index.ts","../src/commands/design/index.ts","../src/commands/design/init.ts","../src/ide/QoderAdapter.ts","../src/ide/index.ts","../src/core/registry-client.ts","../src/core/installer.ts","../src/utils/hash.ts","../src/utils/template.ts","../src/core/state.ts","../src/commands/design/update.ts","../src/core/updater.ts","../src/commands/design/list.ts"],"sourcesContent":["import { red, yellow, cyan, green, gray } from \"kolorist\";\n\nconst isDebug = process.env.TEAMIX_DEBUG === \"1\";\n\nexport const logger = {\n info(msg: string): void {\n console.log(cyan(\"ℹ\"), msg);\n },\n\n warn(msg: string): void {\n console.warn(yellow(\"⚠\"), msg);\n },\n\n error(msg: string): void {\n console.error(red(\"✖\"), msg);\n },\n\n success(msg: string): void {\n console.log(green(\"✔\"), msg);\n },\n\n debug(msg: string): void {\n if (isDebug) {\n console.log(gray(\"⊡\"), gray(msg));\n }\n },\n};\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { logger } from \"./logger.js\";\n\n/**\n * Recursively create a directory (like mkdir -p).\n */\nexport async function ensureDir(dir: string): Promise<void> {\n await fs.mkdir(dir, { recursive: true });\n}\n\n/**\n * Atomic write: write to a .tmp file first, then rename.\n */\nexport async function writeFileSafe(\n filePath: string,\n content: string,\n): Promise<void> {\n const dir = path.dirname(filePath);\n await ensureDir(dir);\n const tmp = filePath + \".tmp\";\n await fs.writeFile(tmp, content, \"utf-8\");\n await fs.rename(tmp, filePath);\n}\n\n/**\n * Read a file or return null if it doesn't exist.\n */\nexport async function readFileOrNull(\n filePath: string,\n): Promise<string | null> {\n try {\n return await fs.readFile(filePath, \"utf-8\");\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") {\n return null;\n }\n throw err;\n }\n}\n\n/**\n * Create a backup of a file under `.teamix-evo/.backups/`.\n */\nexport async function backupFile(\n filePath: string,\n projectRoot: string,\n): Promise<void> {\n const content = await readFileOrNull(filePath);\n if (content === null) {\n logger.debug(`Skip backup: ${filePath} does not exist`);\n return;\n }\n\n const rel = path.relative(projectRoot, filePath);\n const timestamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n const backupPath = path.join(\n projectRoot,\n \".teamix-evo\",\n \".backups\",\n `${rel}.${timestamp}.bak`,\n );\n\n await ensureDir(path.dirname(backupPath));\n await fs.writeFile(backupPath, content, \"utf-8\");\n logger.debug(`Backed up ${rel} → ${path.relative(projectRoot, backupPath)}`);\n}\n\n/**\n * Check whether a file exists.\n */\nexport async function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n","import { Command } from \"commander\";\nimport { designCommand } from \"./commands/design/index.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"teamix-evo\")\n .description(\"Where ideas evolve. — AI Coding 套件\")\n .version(\"0.0.0\");\n\nprogram.addCommand(designCommand);\n\nprogram.parse();\n","import { Command } from \"commander\";\nimport { initCommand } from \"./init.js\";\nimport { updateCommand } from \"./update.js\";\nimport { listCommand } from \"./list.js\";\n\nexport const designCommand = new Command(\"design\")\n .description(\"管理设计体系资源\");\n\ndesignCommand.addCommand(initCommand);\ndesignCommand.addCommand(updateCommand);\ndesignCommand.addCommand(listCommand);\n","import { Command } from \"commander\";\nimport type { ProjectConfig, InstalledManifest } from \"@teamix-evo/registry\";\nimport { detectIde } from \"../../ide/index.js\";\nimport { loadVariantData } from \"../../core/registry-client.js\";\nimport { installResources } from \"../../core/installer.js\";\nimport {\n ensureTeamixDir,\n readProjectConfig,\n writeProjectConfig,\n writeInstalledManifest,\n} from \"../../core/state.js\";\nimport { logger } from \"../../utils/logger.js\";\n\nconst DEFAULT_VARIANT = \"opentrek\";\nconst DESIGN_PACKAGE = \"@teamix-evo/design\";\n\nexport const initCommand = new Command(\"init\")\n .description(\"初始化设计体系资源\")\n .argument(\"[variant]\", \"设计变体名称\", DEFAULT_VARIANT)\n .action(async (variant: string) => {\n try {\n const ide = detectIde();\n const projectRoot = ide.getProjectRoot();\n\n logger.info(`Initializing design system: variant=\"${variant}\"`);\n logger.debug(`Project root: ${projectRoot}`);\n logger.debug(`IDE: ${ide.name}`);\n\n // 1. Ensure .teamix-evo/ directory\n await ensureTeamixDir(projectRoot);\n\n // 2. Check if already initialized\n const existingConfig = await readProjectConfig(projectRoot);\n if (existingConfig?.packages?.design) {\n logger.warn(\n `Design system already initialized (variant: ${existingConfig.packages.design.variant}). ` +\n `Use \"teamix-evo design update\" to update.`,\n );\n return;\n }\n\n // 3. Load variant manifest and data\n logger.info(`Loading variant \"${variant}\" from ${DESIGN_PACKAGE}...`);\n const { manifest, data, variantDir, packageRoot } =\n await loadVariantData(DESIGN_PACKAGE, variant);\n\n logger.debug(\n `Loaded manifest: ${manifest.displayName} v${manifest.version}`,\n );\n logger.debug(`Resources: ${manifest.resources.length}`);\n\n // 4. Install resources\n logger.info(\"Installing resources...\");\n const result = await installResources({\n projectRoot,\n manifest,\n data,\n variantDir,\n packageRoot,\n });\n\n // 5. Write config.json\n const config: ProjectConfig = {\n $schema: \"https://teamix-evo.dev/schema/config/v1.json\",\n schemaVersion: 1,\n ide: ide.name,\n packages: {\n design: {\n variant,\n version: manifest.version,\n },\n },\n };\n await writeProjectConfig(projectRoot, config);\n\n // 6. Write manifest.json\n const installedManifest: InstalledManifest = {\n schemaVersion: 1,\n installed: [\n {\n package: DESIGN_PACKAGE,\n variant,\n version: manifest.version,\n installedAt: new Date().toISOString(),\n resources: result.resources,\n },\n ],\n };\n await writeInstalledManifest(projectRoot, installedManifest);\n\n // 7. Success output\n logger.success(\n `Design system initialized: ${manifest.displayName} v${manifest.version}`,\n );\n logger.info(` Variant: ${variant}`);\n logger.info(` Resources: ${result.count} files installed`);\n logger.info(\"\");\n logger.info('Run \"teamix-evo design update\" to update resources later.');\n } catch (err) {\n logger.error(`Failed to initialize: ${(err as Error).message}`);\n logger.debug((err as Error).stack ?? \"\");\n process.exitCode = 1;\n }\n });\n","import type { IdeAdapter } from \"./IdeAdapter.js\";\n\n/**\n * Qoder IDE adapter — MVP default implementation.\n */\nexport class QoderAdapter implements IdeAdapter {\n name = \"qoder\";\n\n getProjectRoot(): string {\n return process.cwd();\n }\n\n detectIde(): boolean {\n // MVP: default to true. Future: check environment variables\n return true;\n }\n}\n","import type { IdeAdapter } from \"./IdeAdapter.js\";\nimport { QoderAdapter } from \"./QoderAdapter.js\";\n\nexport type { IdeAdapter } from \"./IdeAdapter.js\";\n\n/**\n * Detect the current IDE environment and return the appropriate adapter.\n * MVP: always returns QoderAdapter.\n */\nexport function detectIde(): IdeAdapter {\n return new QoderAdapter();\n}\n","import * as path from \"node:path\";\nimport * as fs from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport type { VariantManifest } from \"@teamix-evo/registry\";\nimport { loadVariantManifest } from \"@teamix-evo/registry\";\nimport { logger } from \"../utils/logger.js\";\n\n/**\n * Resolve the directory path for a variant inside a package.\n * MVP: resolves from local node_modules using require.resolve.\n *\n * @param packageName - e.g. \"@teamix-evo/design\"\n * @param variant - e.g. \"opentrek\"\n * @returns Absolute path to the variant directory (library/<variant>/)\n */\nexport function resolveVariantPackage(\n packageName: string,\n variant: string,\n): string {\n const require = createRequire(import.meta.url);\n // Resolve the package.json of the package to find its root\n const pkgJsonPath = require.resolve(`${packageName}/package.json`);\n const pkgRoot = path.dirname(pkgJsonPath);\n return path.join(pkgRoot, \"library\", variant);\n}\n\n/**\n * Load the variant manifest and _data.json for template rendering.\n *\n * @param packageName - e.g. \"@teamix-evo/design\"\n * @param variant - e.g. \"opentrek\"\n * @returns manifest and data for template rendering\n */\nexport async function loadVariantData(\n packageName: string,\n variant: string,\n): Promise<{\n manifest: VariantManifest;\n data: Record<string, unknown>;\n variantDir: string;\n packageRoot: string;\n}> {\n const variantDir = resolveVariantPackage(packageName, variant);\n const require = createRequire(import.meta.url);\n const pkgJsonPath = require.resolve(`${packageName}/package.json`);\n const packageRoot = path.dirname(pkgJsonPath);\n\n logger.debug(`Resolved variant dir: ${variantDir}`);\n logger.debug(`Package root: ${packageRoot}`);\n\n // Load manifest\n const manifest = await loadVariantManifest(variantDir);\n\n // Load _data.json\n let data: Record<string, unknown> = {};\n const dataPath = path.join(variantDir, \"_data.json\");\n try {\n const raw = await fs.readFile(dataPath, \"utf-8\");\n data = JSON.parse(raw) as Record<string, unknown>;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw err;\n }\n logger.debug(`No _data.json found at ${dataPath}, using empty data`);\n }\n\n return { manifest, data, variantDir, packageRoot };\n}\n","import * as path from \"node:path\";\nimport * as fs from \"node:fs/promises\";\nimport type {\n VariantManifest,\n Resource,\n InstalledResource,\n} from \"@teamix-evo/registry\";\nimport { writeFileSafe, ensureDir } from \"../utils/fs.js\";\nimport { computeHash } from \"../utils/hash.js\";\nimport { renderTemplate, loadTemplateFile } from \"../utils/template.js\";\nimport { logger } from \"../utils/logger.js\";\n\nexport interface InstallOptions {\n /** Project root directory */\n projectRoot: string;\n /** The variant manifest */\n manifest: VariantManifest;\n /** Template data for Handlebars rendering */\n data: Record<string, unknown>;\n /** Absolute path to the variant directory (where source files live) */\n variantDir: string;\n /** Absolute path to the package root (for resolving _template/ sources) */\n packageRoot: string;\n}\n\nexport interface InstallResult {\n /** Successfully installed resource records */\n resources: InstalledResource[];\n /** Number of resources installed */\n count: number;\n}\n\n/**\n * Install resources from a variant manifest into the project.\n */\nexport async function installResources(\n options: InstallOptions,\n): Promise<InstallResult> {\n const { projectRoot, manifest, data, variantDir, packageRoot } = options;\n const installedResources: InstalledResource[] = [];\n\n for (const resource of manifest.resources) {\n logger.debug(`Installing resource: ${resource.id} → ${resource.target}`);\n\n if (resource.recursive) {\n const results = await installRecursiveResource(\n resource,\n projectRoot,\n data,\n variantDir,\n packageRoot,\n );\n installedResources.push(...results);\n } else {\n const result = await installSingleResource(\n resource,\n projectRoot,\n data,\n variantDir,\n packageRoot,\n );\n installedResources.push(result);\n }\n }\n\n return {\n resources: installedResources,\n count: installedResources.length,\n };\n}\n\n/**\n * Install a single (non-recursive) resource.\n */\nasync function installSingleResource(\n resource: Resource,\n projectRoot: string,\n data: Record<string, unknown>,\n variantDir: string,\n packageRoot: string,\n): Promise<InstalledResource> {\n const sourcePath = resolveSourcePath(resource.source, variantDir, packageRoot);\n const targetPath = path.join(projectRoot, resource.target);\n\n let content: string;\n if (resource.template) {\n const templateContent = await loadTemplateFile(sourcePath);\n content = renderTemplate(templateContent, data);\n } else {\n content = await fs.readFile(sourcePath, \"utf-8\");\n }\n\n await writeFileSafe(targetPath, content);\n const hash = computeHash(content);\n\n logger.debug(` Written: ${resource.target} (${resource.updateStrategy})`);\n\n return {\n id: resource.id,\n target: resource.target,\n hash,\n strategy: resource.updateStrategy,\n };\n}\n\n/**\n * Install a recursive resource (directory).\n */\nasync function installRecursiveResource(\n resource: Resource,\n projectRoot: string,\n data: Record<string, unknown>,\n variantDir: string,\n packageRoot: string,\n): Promise<InstalledResource[]> {\n const sourcePath = resolveSourcePath(resource.source, variantDir, packageRoot);\n const targetDir = path.join(projectRoot, resource.target);\n const results: InstalledResource[] = [];\n\n await ensureDir(targetDir);\n\n const entries = await walkDir(sourcePath);\n for (const entry of entries) {\n const relPath = path.relative(sourcePath, entry);\n let targetFile = path.join(targetDir, relPath);\n\n // Strip .hbs extension from target if template\n if (resource.template && targetFile.endsWith(\".hbs\")) {\n targetFile = targetFile.slice(0, -4);\n }\n\n let content: string;\n if (resource.template && entry.endsWith(\".hbs\")) {\n const templateContent = await loadTemplateFile(entry);\n content = renderTemplate(templateContent, data);\n } else {\n content = await fs.readFile(entry, \"utf-8\");\n }\n\n await writeFileSafe(targetFile, content);\n const hash = computeHash(content);\n const targetRel = path.relative(projectRoot, targetFile);\n\n results.push({\n id: `${resource.id}:${relPath}`,\n target: targetRel,\n hash,\n strategy: resource.updateStrategy,\n });\n\n logger.debug(` Written: ${targetRel}`);\n }\n\n return results;\n}\n\n/**\n * Resolve a source path — handles _template/ prefix by resolving from packageRoot.\n */\nfunction resolveSourcePath(\n source: string,\n variantDir: string,\n packageRoot: string,\n): string {\n if (source.startsWith(\"_template/\")) {\n return path.join(packageRoot, source);\n }\n return path.join(variantDir, source);\n}\n\n/**\n * Recursively walk a directory and return all file paths.\n */\nasync function walkDir(dir: string): Promise<string[]> {\n const files: string[] = [];\n const entries = await fs.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n files.push(...(await walkDir(fullPath)));\n } else if (entry.isFile()) {\n files.push(fullPath);\n }\n }\n\n return files;\n}\n","import { createHash } from \"node:crypto\";\n\n/**\n * Compute a SHA-256 hash of the given content.\n * Returns a string in the format \"sha256:<hex>\".\n */\nexport function computeHash(content: string): string {\n const hash = createHash(\"sha256\").update(content, \"utf-8\").digest(\"hex\");\n return `sha256:${hash}`;\n}\n","import Handlebars from \"handlebars\";\nimport * as fs from \"node:fs/promises\";\n\n// Register custom helpers\nHandlebars.registerHelper(\"lowercase\", (str: unknown) => {\n return typeof str === \"string\" ? str.toLowerCase() : String(str ?? \"\").toLowerCase();\n});\n\n/**\n * Render a Handlebars template string with the given data.\n */\nexport function renderTemplate(\n templateContent: string,\n data: Record<string, unknown>,\n): string {\n const compiled = Handlebars.compile(templateContent, { noEscape: true });\n return compiled(data);\n}\n\n/**\n * Load template file content from disk.\n */\nexport async function loadTemplateFile(filePath: string): Promise<string> {\n return fs.readFile(filePath, \"utf-8\");\n}\n","import * as path from \"node:path\";\nimport type { ProjectConfig, InstalledManifest } from \"@teamix-evo/registry\";\nimport { validateConfig, validateInstalled } from \"@teamix-evo/registry\";\nimport { readFileOrNull, writeFileSafe, ensureDir } from \"../utils/fs.js\";\nimport { logger } from \"../utils/logger.js\";\n\nconst TEAMIX_DIR = \".teamix-evo\";\nconst CONFIG_FILE = \"config.json\";\nconst MANIFEST_FILE = \"manifest.json\";\n\n/**\n * Get the .teamix-evo directory path for a project.\n */\nexport function getTeamixDir(projectRoot: string): string {\n return path.join(projectRoot, TEAMIX_DIR);\n}\n\n/**\n * Ensure the .teamix-evo directory exists.\n */\nexport async function ensureTeamixDir(projectRoot: string): Promise<string> {\n const dir = getTeamixDir(projectRoot);\n await ensureDir(dir);\n return dir;\n}\n\n/**\n * Read the project config from .teamix-evo/config.json.\n * Returns null if the file does not exist.\n */\nexport async function readProjectConfig(\n projectRoot: string,\n): Promise<ProjectConfig | null> {\n const configPath = path.join(projectRoot, TEAMIX_DIR, CONFIG_FILE);\n const raw = await readFileOrNull(configPath);\n if (raw === null) return null;\n\n try {\n const data = JSON.parse(raw);\n const result = validateConfig(data);\n if (!result.success) {\n logger.warn(`Invalid config.json: ${result.error}`);\n return null;\n }\n return result.data;\n } catch (err) {\n logger.warn(`Failed to parse config.json: ${(err as Error).message}`);\n return null;\n }\n}\n\n/**\n * Write the project config to .teamix-evo/config.json.\n */\nexport async function writeProjectConfig(\n projectRoot: string,\n config: ProjectConfig,\n): Promise<void> {\n const configPath = path.join(projectRoot, TEAMIX_DIR, CONFIG_FILE);\n await writeFileSafe(configPath, JSON.stringify(config, null, 2) + \"\\n\");\n logger.debug(`Wrote config → ${configPath}`);\n}\n\n/**\n * Read the installed manifest from .teamix-evo/manifest.json.\n * Returns null if the file does not exist.\n */\nexport async function readInstalledManifest(\n projectRoot: string,\n): Promise<InstalledManifest | null> {\n const manifestPath = path.join(projectRoot, TEAMIX_DIR, MANIFEST_FILE);\n const raw = await readFileOrNull(manifestPath);\n if (raw === null) return null;\n\n try {\n const data = JSON.parse(raw);\n const result = validateInstalled(data);\n if (!result.success) {\n logger.warn(`Invalid manifest.json: ${result.error}`);\n return null;\n }\n return result.data;\n } catch (err) {\n logger.warn(`Failed to parse manifest.json: ${(err as Error).message}`);\n return null;\n }\n}\n\n/**\n * Write the installed manifest to .teamix-evo/manifest.json.\n */\nexport async function writeInstalledManifest(\n projectRoot: string,\n manifest: InstalledManifest,\n): Promise<void> {\n const manifestPath = path.join(projectRoot, TEAMIX_DIR, MANIFEST_FILE);\n await writeFileSafe(manifestPath, JSON.stringify(manifest, null, 2) + \"\\n\");\n logger.debug(`Wrote manifest → ${manifestPath}`);\n}\n","import { Command } from \"commander\";\nimport { detectIde } from \"../../ide/index.js\";\nimport { loadVariantData } from \"../../core/registry-client.js\";\nimport { updateResources } from \"../../core/updater.js\";\nimport {\n readProjectConfig,\n readInstalledManifest,\n writeProjectConfig,\n writeInstalledManifest,\n} from \"../../core/state.js\";\nimport { logger } from \"../../utils/logger.js\";\n\nconst DESIGN_PACKAGE = \"@teamix-evo/design\";\n\nexport const updateCommand = new Command(\"update\")\n .description(\"更新设计体系资源\")\n .action(async () => {\n try {\n const ide = detectIde();\n const projectRoot = ide.getProjectRoot();\n\n logger.info(\"Updating design system resources...\");\n\n // 1. Read existing config\n const config = await readProjectConfig(projectRoot);\n if (!config?.packages?.design) {\n logger.error(\n 'Design system not initialized. Run \"teamix-evo design init\" first.',\n );\n process.exitCode = 1;\n return;\n }\n\n const { variant, version: currentVersion } = config.packages.design;\n\n // 2. Read installed manifest\n const installedManifest = await readInstalledManifest(projectRoot);\n if (!installedManifest) {\n logger.error(\n \"No installed manifest found. Try re-initializing with \" +\n '\"teamix-evo design init\".',\n );\n process.exitCode = 1;\n return;\n }\n\n // 3. Load latest variant data\n logger.info(`Loading variant \"${variant}\" from ${DESIGN_PACKAGE}...`);\n const { manifest, data, variantDir, packageRoot } =\n await loadVariantData(DESIGN_PACKAGE, variant);\n\n logger.info(\n `Current: v${currentVersion} → Available: v${manifest.version}`,\n );\n\n // 4. Update resources\n const result = await updateResources({\n projectRoot,\n manifest,\n data,\n variantDir,\n packageRoot,\n installedManifest,\n packageName: DESIGN_PACKAGE,\n });\n\n // 5. Update config version\n config.packages.design.version = manifest.version;\n await writeProjectConfig(projectRoot, config);\n\n // 6. Update installed manifest\n const updatedManifest = { ...installedManifest };\n const pkgIdx = updatedManifest.installed.findIndex(\n (p) => p.package === DESIGN_PACKAGE && p.variant === variant,\n );\n const pkgEntry = {\n package: DESIGN_PACKAGE,\n variant,\n version: manifest.version,\n installedAt: new Date().toISOString(),\n resources: result.resources,\n };\n if (pkgIdx >= 0) {\n updatedManifest.installed[pkgIdx] = pkgEntry;\n } else {\n updatedManifest.installed.push(pkgEntry);\n }\n await writeInstalledManifest(projectRoot, updatedManifest);\n\n // 7. Output summary\n const { summary } = result;\n logger.success(\n `Design system updated to v${manifest.version}`,\n );\n logger.info(` Created: ${summary.created}`);\n logger.info(` Overwritten: ${summary.overwritten}`);\n logger.info(` Managed: ${summary.managed}`);\n logger.info(` Skipped: ${summary.skipped}`);\n } catch (err) {\n logger.error(`Failed to update: ${(err as Error).message}`);\n logger.debug((err as Error).stack ?? \"\");\n process.exitCode = 1;\n }\n });\n","import * as path from \"node:path\";\nimport * as fs from \"node:fs/promises\";\nimport type {\n VariantManifest,\n Resource,\n InstalledResource,\n InstalledManifest,\n} from \"@teamix-evo/registry\";\nimport {\n getUpdateAction,\n replaceManagedRegion,\n} from \"@teamix-evo/registry\";\nimport {\n writeFileSafe,\n readFileOrNull,\n fileExists,\n backupFile,\n} from \"../utils/fs.js\";\nimport { computeHash } from \"../utils/hash.js\";\nimport { renderTemplate, loadTemplateFile } from \"../utils/template.js\";\nimport { logger } from \"../utils/logger.js\";\n\nexport interface UpdateOptions {\n /** Project root directory */\n projectRoot: string;\n /** The new variant manifest */\n manifest: VariantManifest;\n /** Template data for Handlebars rendering */\n data: Record<string, unknown>;\n /** Absolute path to the variant directory */\n variantDir: string;\n /** Absolute path to the package root */\n packageRoot: string;\n /** Previously installed manifest */\n installedManifest: InstalledManifest;\n /** Full package name e.g. \"@teamix-evo/design\" */\n packageName: string;\n}\n\nexport interface UpdateResult {\n /** Updated resource records */\n resources: InstalledResource[];\n /** Summary of actions taken */\n summary: {\n overwritten: number;\n managed: number;\n skipped: number;\n created: number;\n };\n}\n\n/**\n * Update resources based on their update strategy.\n */\nexport async function updateResources(\n options: UpdateOptions,\n): Promise<UpdateResult> {\n const {\n projectRoot,\n manifest,\n data,\n variantDir,\n packageRoot,\n installedManifest,\n packageName,\n } = options;\n\n const updatedResources: InstalledResource[] = [];\n const summary = { overwritten: 0, managed: 0, skipped: 0, created: 0 };\n\n // Build a lookup of currently installed resources\n const installedPkg = installedManifest.installed.find(\n (p) => p.package === packageName && p.variant === manifest.variant,\n );\n const installedMap = new Map<string, InstalledResource>();\n if (installedPkg) {\n for (const res of installedPkg.resources) {\n installedMap.set(res.id, res);\n }\n }\n\n for (const resource of manifest.resources) {\n if (resource.recursive) {\n // For recursive resources, just regenerate fully\n const results = await updateRecursiveResource(\n resource,\n projectRoot,\n data,\n variantDir,\n packageRoot,\n installedMap,\n summary,\n );\n updatedResources.push(...results);\n } else {\n const result = await updateSingleResource(\n resource,\n projectRoot,\n data,\n variantDir,\n packageRoot,\n installedMap,\n summary,\n );\n updatedResources.push(result);\n }\n }\n\n return { resources: updatedResources, summary };\n}\n\nasync function updateSingleResource(\n resource: Resource,\n projectRoot: string,\n data: Record<string, unknown>,\n variantDir: string,\n packageRoot: string,\n installedMap: Map<string, InstalledResource>,\n summary: UpdateResult[\"summary\"],\n): Promise<InstalledResource> {\n const targetPath = path.join(projectRoot, resource.target);\n const exists = await fileExists(targetPath);\n const installed = installedMap.get(resource.id);\n\n // Render new content\n const sourcePath = resolveSourcePath(resource.source, variantDir, packageRoot);\n let newContent: string;\n if (resource.template) {\n const templateContent = await loadTemplateFile(sourcePath);\n newContent = renderTemplate(templateContent, data);\n } else {\n newContent = await fs.readFile(sourcePath, \"utf-8\");\n }\n\n const newHash = computeHash(newContent);\n\n const action = getUpdateAction(resource.updateStrategy, {\n exists,\n hash: newHash,\n currentHash: installed?.hash,\n });\n\n switch (action) {\n case \"skip\": {\n logger.debug(` Skip: ${resource.target} (${resource.updateStrategy})`);\n summary.skipped++;\n return installed ?? {\n id: resource.id,\n target: resource.target,\n hash: newHash,\n strategy: resource.updateStrategy,\n };\n }\n\n case \"overwrite\": {\n if (exists) {\n await backupFile(targetPath, projectRoot);\n summary.overwritten++;\n } else {\n summary.created++;\n }\n await writeFileSafe(targetPath, newContent);\n logger.debug(` ${exists ? \"Overwrite\" : \"Create\"}: ${resource.target}`);\n return {\n id: resource.id,\n target: resource.target,\n hash: newHash,\n strategy: resource.updateStrategy,\n };\n }\n\n case \"managed-update\": {\n const currentContent = await readFileOrNull(targetPath);\n if (currentContent === null) {\n // File was deleted by user — recreate\n await writeFileSafe(targetPath, newContent);\n summary.created++;\n return {\n id: resource.id,\n target: resource.target,\n hash: computeHash(newContent),\n strategy: resource.updateStrategy,\n };\n }\n\n // Replace managed regions from new content into current content\n let updatedContent = currentContent;\n const regionIds = resource.managedRegions ?? [];\n\n for (const regionId of regionIds) {\n // Extract managed region content from the new rendered content\n const regionPattern = new RegExp(\n `<!-- teamix-evo:managed:start id=\"${escapeRegExp(regionId)}\" -->([\\\\s\\\\S]*?)<!-- teamix-evo:managed:end id=\"${escapeRegExp(regionId)}\" -->`,\n );\n const match = newContent.match(regionPattern);\n if (match) {\n const regionContent = match[1].replace(/^\\n/, \"\").replace(/\\n$/, \"\");\n try {\n updatedContent = replaceManagedRegion(\n updatedContent,\n regionId,\n regionContent,\n );\n } catch {\n logger.warn(\n `Managed region \"${regionId}\" not found in ${resource.target}. Skipping region.`,\n );\n }\n }\n }\n\n await backupFile(targetPath, projectRoot);\n await writeFileSafe(targetPath, updatedContent);\n summary.managed++;\n\n return {\n id: resource.id,\n target: resource.target,\n hash: computeHash(updatedContent),\n strategy: resource.updateStrategy,\n };\n }\n\n default:\n summary.skipped++;\n return installed ?? {\n id: resource.id,\n target: resource.target,\n hash: newHash,\n strategy: resource.updateStrategy,\n };\n }\n}\n\nasync function updateRecursiveResource(\n resource: Resource,\n projectRoot: string,\n data: Record<string, unknown>,\n variantDir: string,\n packageRoot: string,\n installedMap: Map<string, InstalledResource>,\n summary: UpdateResult[\"summary\"],\n): Promise<InstalledResource[]> {\n const sourcePath = resolveSourcePath(resource.source, variantDir, packageRoot);\n const targetDir = path.join(projectRoot, resource.target);\n const results: InstalledResource[] = [];\n\n // For frozen recursive resources, skip entirely if already installed\n if (resource.updateStrategy === \"frozen\") {\n const anyInstalled = [...installedMap.keys()].some((k) =>\n k.startsWith(`${resource.id}:`),\n );\n if (anyInstalled) {\n summary.skipped++;\n // Return existing installed entries\n for (const [id, res] of installedMap) {\n if (id.startsWith(`${resource.id}:`)) {\n results.push(res);\n }\n }\n return results;\n }\n }\n\n const { ensureDir } = await import(\"../utils/fs.js\");\n await ensureDir(targetDir);\n\n const entries = await walkDir(sourcePath);\n for (const entry of entries) {\n const relPath = path.relative(sourcePath, entry);\n let targetFile = path.join(targetDir, relPath);\n\n if (resource.template && targetFile.endsWith(\".hbs\")) {\n targetFile = targetFile.slice(0, -4);\n }\n\n let content: string;\n if (resource.template && entry.endsWith(\".hbs\")) {\n const templateContent = await loadTemplateFile(entry);\n content = renderTemplate(templateContent, data);\n } else {\n content = await fs.readFile(entry, \"utf-8\");\n }\n\n await writeFileSafe(targetFile, content);\n const hash = computeHash(content);\n const targetRel = path.relative(projectRoot, targetFile);\n\n results.push({\n id: `${resource.id}:${relPath}`,\n target: targetRel,\n hash,\n strategy: resource.updateStrategy,\n });\n\n summary.overwritten++;\n }\n\n return results;\n}\n\nfunction resolveSourcePath(\n source: string,\n variantDir: string,\n packageRoot: string,\n): string {\n if (source.startsWith(\"_template/\")) {\n return path.join(packageRoot, source);\n }\n return path.join(variantDir, source);\n}\n\nasync function walkDir(dir: string): Promise<string[]> {\n const files: string[] = [];\n const entries = await fs.readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n files.push(...(await walkDir(fullPath)));\n } else if (entry.isFile()) {\n files.push(fullPath);\n }\n }\n return files;\n}\n\nfunction escapeRegExp(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n","import { Command } from \"commander\";\nimport { detectIde } from \"../../ide/index.js\";\nimport { readProjectConfig, readInstalledManifest } from \"../../core/state.js\";\nimport { logger } from \"../../utils/logger.js\";\n\nexport const listCommand = new Command(\"list\")\n .description(\"列出已安装的设计变体\")\n .action(async () => {\n try {\n const ide = detectIde();\n const projectRoot = ide.getProjectRoot();\n\n const config = await readProjectConfig(projectRoot);\n if (!config?.packages?.design) {\n logger.info(\"No design system installed.\");\n logger.info('Run \"teamix-evo design init [variant]\" to get started.');\n return;\n }\n\n const { variant, version } = config.packages.design;\n\n logger.info(\"Installed design system:\");\n logger.info(` Package: @teamix-evo/design`);\n logger.info(` Variant: ${variant}`);\n logger.info(` Version: ${version}`);\n logger.info(` IDE: ${config.ide}`);\n\n // Show resource count from installed manifest\n const manifest = await readInstalledManifest(projectRoot);\n if (manifest) {\n const pkg = manifest.installed.find(\n (p) => p.package === \"@teamix-evo/design\" && p.variant === variant,\n );\n if (pkg) {\n logger.info(` Resources: ${pkg.resources.length} files`);\n logger.info(\n ` Installed: ${new Date(pkg.installedAt).toLocaleString()}`,\n );\n }\n }\n } catch (err) {\n logger.error(`Failed to list: ${(err as Error).message}`);\n process.exitCode = 1;\n }\n });\n"],"mappings":"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","names":["fs","path","Command","Command","require","path","fs","fs","path","Command","path","fs","resolveSourcePath","ensureDir","walkDir","DESIGN_PACKAGE","Command","Command","Command","Command","Command"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/design/index.ts","../src/commands/design/init.ts","../src/ide/QoderAdapter.ts","../src/ide/ClaudeAdapter.ts","../src/ide/index.ts","../src/core/registry-client.ts","../src/utils/logger.ts","../src/core/installer.ts","../src/utils/fs.ts","../src/utils/hash.ts","../src/utils/template.ts","../src/utils/path.ts","../src/core/state.ts","../src/core/design-init.ts","../src/commands/design/update.ts","../src/core/updater.ts","../src/commands/design/list.ts","../src/commands/design/uninstall.ts","../src/commands/skills/index.ts","../src/commands/skills/add.ts","../src/core/skills-client.ts","../src/core/skills-installer.ts","../src/core/skills-add.ts","../src/commands/skills/list.ts","../src/commands/skills/update.ts","../src/commands/skills/uninstall.ts","../src/commands/ui/index.ts","../src/commands/ui/init.ts","../src/core/ui-init.ts","../src/commands/ui/add.ts","../src/core/ui-client.ts","../src/core/ui-installer.ts","../src/utils/transform-imports.ts","../src/core/ui-add.ts","../src/commands/ui/list.ts","../src/core/ui-list.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { createRequire } from 'node:module';\nimport { designCommand } from './commands/design/index.js';\nimport { skillsCommand } from './commands/skills/index.js';\nimport { uiCommand } from './commands/ui/index.js';\n\nconst require = createRequire(import.meta.url);\nconst { version } = require('../package.json') as { version: string };\n\nconst program = new Command();\n\nprogram\n .name('teamix-evo')\n .description('Where ideas evolve. — AI Coding 套件')\n .version(version);\n\nprogram.addCommand(designCommand);\nprogram.addCommand(skillsCommand);\nprogram.addCommand(uiCommand);\n\nprogram.parse();\n","import { Command } from 'commander';\nimport { initCommand } from './init.js';\nimport { updateCommand } from './update.js';\nimport { listCommand } from './list.js';\nimport { uninstallCommand } from './uninstall.js';\n\nexport const designCommand = new Command('design').description(\n '管理设计体系资源',\n);\n\ndesignCommand.addCommand(initCommand);\ndesignCommand.addCommand(updateCommand);\ndesignCommand.addCommand(listCommand);\ndesignCommand.addCommand(uninstallCommand);\n","import { Command } from 'commander';\nimport type { TailwindVersion } from '@teamix-evo/registry';\nimport { detectIde } from '../../ide/index.js';\nimport { runDesignInit } from '../../core/design-init.js';\nimport { logger } from '../../utils/logger.js';\n\nconst DEFAULT_VARIANT = 'opentrek';\nconst DEFAULT_TAILWIND: TailwindVersion = 'v4';\n\nfunction normalizeTailwind(input: string | undefined): TailwindVersion {\n if (input === undefined) return DEFAULT_TAILWIND;\n const lower = input.toLowerCase();\n if (lower === 'v3' || lower === '3') return 'v3';\n if (lower === 'v4' || lower === '4') return 'v4';\n throw new Error(\n `Invalid --tailwind value: \"${input}\". Expected \"v3\" or \"v4\".`,\n );\n}\n\nexport const initCommand = new Command('init')\n .description('初始化设计体系资源')\n .argument('[variant]', '设计变体名称', DEFAULT_VARIANT)\n .option(\n '--tailwind <version>',\n '项目使用的 Tailwind CSS 主版本(v3 | v4)',\n DEFAULT_TAILWIND,\n )\n .action(async (variant: string, opts: { tailwind?: string }) => {\n try {\n const tailwind = normalizeTailwind(opts.tailwind);\n const ide = detectIde();\n const projectRoot = ide.getProjectRoot();\n\n logger.info(\n `Initializing design system: variant=\"${variant}\", tailwind=\"${tailwind}\"`,\n );\n logger.debug(`Project root: ${projectRoot}`);\n logger.debug(`IDE: ${ide.name}`);\n\n logger.info(`Loading variant \"${variant}\"...`);\n logger.info('Installing resources...');\n\n const result = await runDesignInit({\n projectRoot,\n variant,\n tailwind,\n ide: ide.name,\n });\n\n if (result.status === 'already-initialized') {\n logger.warn(\n `Design system already initialized (variant: ${result.existingVariant}). ` +\n `Use \"teamix-evo design update\" to update.`,\n );\n return;\n }\n\n logger.success(\n `Design system initialized: ${result.packageName} v${result.version}`,\n );\n logger.info(` Variant: ${result.variant}`);\n logger.info(` Tailwind: ${result.tailwind}`);\n logger.info(` Resources: ${result.count} files installed`);\n logger.info('');\n logger.info('Run \"teamix-evo design update\" to update resources later.');\n } catch (err) {\n logger.error(`Failed to initialize: ${(err as Error).message}`);\n logger.debug((err as Error).stack ?? '');\n process.exitCode = 1;\n }\n });\n","import * as os from 'node:os';\nimport * as path from 'node:path';\nimport type { SkillScope } from '@teamix-evo/registry';\nimport type { IdeAdapter } from './IdeAdapter.js';\n\n/**\n * Qoder IDE adapter.\n * Skill paths:\n * - project: <projectRoot>/.qoder/skills/<name>/\n * - global: ~/.qoder/skills/<name>/\n */\nexport class QoderAdapter implements IdeAdapter {\n readonly kind = 'qoder' as const;\n readonly name = 'qoder';\n\n getProjectRoot(): string {\n return process.cwd();\n }\n\n detectIde(): boolean {\n // MVP: default to true. Future: check environment variables\n return true;\n }\n\n getSkillTargetDir(\n skillName: string,\n scope: SkillScope,\n projectRoot?: string,\n ): string {\n const base =\n scope === 'global'\n ? path.join(os.homedir(), '.qoder')\n : path.join(projectRoot ?? this.getProjectRoot(), '.qoder');\n return path.join(base, 'skills', skillName);\n }\n}\n","import * as os from 'node:os';\nimport * as path from 'node:path';\nimport type { SkillScope } from '@teamix-evo/registry';\nimport type { IdeAdapter } from './IdeAdapter.js';\n\n/**\n * Claude Code IDE adapter.\n * Skill paths:\n * - project: <projectRoot>/.claude/skills/<name>/\n * - global: ~/.claude/skills/<name>/\n */\nexport class ClaudeAdapter implements IdeAdapter {\n readonly kind = 'claude' as const;\n readonly name = 'claude';\n\n getProjectRoot(): string {\n return process.cwd();\n }\n\n detectIde(): boolean {\n // Best-effort: presence of .claude/ in cwd or CLAUDECODE env var.\n return Boolean(process.env.CLAUDECODE);\n }\n\n getSkillTargetDir(\n skillName: string,\n scope: SkillScope,\n projectRoot?: string,\n ): string {\n const base =\n scope === 'global'\n ? path.join(os.homedir(), '.claude')\n : path.join(projectRoot ?? this.getProjectRoot(), '.claude');\n return path.join(base, 'skills', skillName);\n }\n}\n","import type { SkillIde } from '@teamix-evo/registry';\nimport type { IdeAdapter } from './IdeAdapter.js';\nimport { QoderAdapter } from './QoderAdapter.js';\nimport { ClaudeAdapter } from './ClaudeAdapter.js';\n\nexport type { IdeAdapter } from './IdeAdapter.js';\nexport { QoderAdapter } from './QoderAdapter.js';\nexport { ClaudeAdapter } from './ClaudeAdapter.js';\n\n/** All supported IDE kinds (also default selection set for skills) */\nexport const ALL_IDE_KINDS: readonly SkillIde[] = ['qoder', 'claude'] as const;\n\n/**\n * Get the adapter for a specific IDE kind.\n */\nexport function getAdapter(kind: SkillIde): IdeAdapter {\n switch (kind) {\n case 'qoder':\n return new QoderAdapter();\n case 'claude':\n return new ClaudeAdapter();\n default: {\n const _exhaustive: never = kind;\n throw new Error(`Unsupported IDE kind: ${_exhaustive as string}`);\n }\n }\n}\n\n/**\n * Detect the current IDE environment and return the appropriate adapter.\n * MVP: prefers Qoder; falls back to Claude if CLAUDECODE env is set.\n */\nexport function detectIde(): IdeAdapter {\n const claude = new ClaudeAdapter();\n if (claude.detectIde()) return claude;\n return new QoderAdapter();\n}\n","import * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport { createRequire } from 'node:module';\nimport type { VariantManifest } from '@teamix-evo/registry';\nimport { loadVariantManifest } from '@teamix-evo/registry';\nimport { logger } from '../utils/logger.js';\n\nconst require = createRequire(import.meta.url);\n\n/**\n * Resolve the package root directory for a design package.\n */\nfunction resolvePackageRoot(packageName: string): string {\n const pkgJsonPath = require.resolve(`${packageName}/package.json`);\n return path.dirname(pkgJsonPath);\n}\n\n/**\n * Resolve the directory path for a variant inside a package.\n * MVP: resolves from local node_modules using require.resolve.\n *\n * @param packageName - e.g. \"@teamix-evo/design\"\n * @param variant - e.g. \"opentrek\"\n * @returns Absolute path to the variant directory (library/<variant>/)\n */\nexport function resolveVariantPackage(\n packageName: string,\n variant: string,\n): string {\n const pkgRoot = resolvePackageRoot(packageName);\n return path.join(pkgRoot, 'library', variant);\n}\n\n/**\n * Load the variant manifest and _data.json for template rendering.\n *\n * @param packageName - e.g. \"@teamix-evo/design\"\n * @param variant - e.g. \"opentrek\"\n * @returns manifest and data for template rendering\n */\nexport async function loadVariantData(\n packageName: string,\n variant: string,\n): Promise<{\n manifest: VariantManifest;\n data: Record<string, unknown>;\n variantDir: string;\n packageRoot: string;\n}> {\n const packageRoot = resolvePackageRoot(packageName);\n const variantDir = path.join(packageRoot, 'library', variant);\n\n logger.debug(`Resolved variant dir: ${variantDir}`);\n logger.debug(`Package root: ${packageRoot}`);\n\n // Load manifest\n const manifest = await loadVariantManifest(variantDir);\n\n // Load _data.json\n let data: Record<string, unknown> = {};\n const dataPath = path.join(variantDir, '_data.json');\n try {\n const raw = await fs.readFile(dataPath, 'utf-8');\n data = JSON.parse(raw) as Record<string, unknown>;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw err;\n }\n logger.debug(`No _data.json found at ${dataPath}, using empty data`);\n }\n\n return { manifest, data, variantDir, packageRoot };\n}\n","import { red, yellow, cyan, green, gray } from \"kolorist\";\n\nconst isDebug = process.env.TEAMIX_DEBUG === \"1\";\n\nexport const logger = {\n info(msg: string): void {\n console.log(cyan(\"ℹ\"), msg);\n },\n\n warn(msg: string): void {\n console.warn(yellow(\"⚠\"), msg);\n },\n\n error(msg: string): void {\n console.error(red(\"✖\"), msg);\n },\n\n success(msg: string): void {\n console.log(green(\"✔\"), msg);\n },\n\n debug(msg: string): void {\n if (isDebug) {\n console.log(gray(\"⊡\"), gray(msg));\n }\n },\n};\n","import * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport type {\n VariantManifest,\n Resource,\n InstalledResource,\n} from '@teamix-evo/registry';\nimport { writeFileSafe, ensureDir } from '../utils/fs.js';\nimport { computeHash } from '../utils/hash.js';\nimport { renderTemplate, loadTemplateFile } from '../utils/template.js';\nimport { logger } from '../utils/logger.js';\nimport { resolveSourcePath, walkDir } from '../utils/path.js';\n\nexport interface InstallOptions {\n /** Project root directory */\n projectRoot: string;\n /** The variant manifest */\n manifest: VariantManifest;\n /** Template data for Handlebars rendering */\n data: Record<string, unknown>;\n /** Absolute path to the variant directory (where source files live) */\n variantDir: string;\n /** Absolute path to the package root (for resolving _template/ sources) */\n packageRoot: string;\n}\n\nexport interface InstallResult {\n /** Successfully installed resource records */\n resources: InstalledResource[];\n /** Number of resources installed */\n count: number;\n}\n\n/**\n * Install resources from a variant manifest into the project.\n */\nexport async function installResources(\n options: InstallOptions,\n): Promise<InstallResult> {\n const { projectRoot, manifest, data, variantDir, packageRoot } = options;\n const installedResources: InstalledResource[] = [];\n\n for (const resource of manifest.resources) {\n logger.debug(`Installing resource: ${resource.id} → ${resource.target}`);\n\n if (resource.recursive) {\n const results = await installRecursiveResource(\n resource,\n projectRoot,\n data,\n variantDir,\n packageRoot,\n );\n installedResources.push(...results);\n } else {\n const result = await installSingleResource(\n resource,\n projectRoot,\n data,\n variantDir,\n packageRoot,\n );\n installedResources.push(result);\n }\n }\n\n return {\n resources: installedResources,\n count: installedResources.length,\n };\n}\n\n/**\n * Install a single (non-recursive) resource.\n */\nasync function installSingleResource(\n resource: Resource,\n projectRoot: string,\n data: Record<string, unknown>,\n variantDir: string,\n packageRoot: string,\n): Promise<InstalledResource> {\n const sourcePath = resolveSourcePath(\n resource.source,\n variantDir,\n packageRoot,\n );\n const targetPath = path.join(projectRoot, resource.target);\n\n let content: string;\n if (resource.template) {\n const templateContent = await loadTemplateFile(sourcePath);\n content = renderTemplate(templateContent, data);\n } else {\n content = await fs.readFile(sourcePath, 'utf-8');\n }\n\n await writeFileSafe(targetPath, content);\n const hash = computeHash(content);\n\n logger.debug(` Written: ${resource.target} (${resource.updateStrategy})`);\n\n return {\n id: resource.id,\n target: resource.target,\n hash,\n strategy: resource.updateStrategy,\n };\n}\n\n/**\n * Install a recursive resource (directory).\n */\nasync function installRecursiveResource(\n resource: Resource,\n projectRoot: string,\n data: Record<string, unknown>,\n variantDir: string,\n packageRoot: string,\n): Promise<InstalledResource[]> {\n const sourcePath = resolveSourcePath(\n resource.source,\n variantDir,\n packageRoot,\n );\n const targetDir = path.join(projectRoot, resource.target);\n const results: InstalledResource[] = [];\n\n await ensureDir(targetDir);\n\n const entries = await walkDir(sourcePath);\n for (const entry of entries) {\n const relPath = path.relative(sourcePath, entry);\n let targetFile = path.join(targetDir, relPath);\n\n // Strip .hbs extension from target if template\n if (resource.template && targetFile.endsWith('.hbs')) {\n targetFile = targetFile.slice(0, -4);\n }\n\n let content: string;\n if (resource.template && entry.endsWith('.hbs')) {\n const templateContent = await loadTemplateFile(entry);\n content = renderTemplate(templateContent, data);\n } else {\n content = await fs.readFile(entry, 'utf-8');\n }\n\n await writeFileSafe(targetFile, content);\n const hash = computeHash(content);\n const targetRel = path.relative(projectRoot, targetFile);\n\n results.push({\n id: `${resource.id}:${relPath}`,\n target: targetRel,\n hash,\n strategy: resource.updateStrategy,\n });\n\n logger.debug(` Written: ${targetRel}`);\n }\n\n return results;\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { logger } from \"./logger.js\";\n\n/**\n * Recursively create a directory (like mkdir -p).\n */\nexport async function ensureDir(dir: string): Promise<void> {\n await fs.mkdir(dir, { recursive: true });\n}\n\n/**\n * Atomic write: write to a .tmp file first, then rename.\n */\nexport async function writeFileSafe(\n filePath: string,\n content: string,\n): Promise<void> {\n const dir = path.dirname(filePath);\n await ensureDir(dir);\n const tmp = filePath + \".tmp\";\n await fs.writeFile(tmp, content, \"utf-8\");\n await fs.rename(tmp, filePath);\n}\n\n/**\n * Read a file or return null if it doesn't exist.\n */\nexport async function readFileOrNull(\n filePath: string,\n): Promise<string | null> {\n try {\n return await fs.readFile(filePath, \"utf-8\");\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") {\n return null;\n }\n throw err;\n }\n}\n\n/**\n * Create a backup of a file under `.teamix-evo/.backups/`.\n */\nexport async function backupFile(\n filePath: string,\n projectRoot: string,\n): Promise<void> {\n const content = await readFileOrNull(filePath);\n if (content === null) {\n logger.debug(`Skip backup: ${filePath} does not exist`);\n return;\n }\n\n const rel = path.relative(projectRoot, filePath);\n const timestamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n const backupPath = path.join(\n projectRoot,\n \".teamix-evo\",\n \".backups\",\n `${rel}.${timestamp}.bak`,\n );\n\n await ensureDir(path.dirname(backupPath));\n await fs.writeFile(backupPath, content, \"utf-8\");\n logger.debug(`Backed up ${rel} → ${path.relative(projectRoot, backupPath)}`);\n}\n\n/**\n * Check whether a file exists.\n */\nexport async function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n","import { createHash } from \"node:crypto\";\n\n/**\n * Compute a SHA-256 hash of the given content.\n * Returns a string in the format \"sha256:<hex>\".\n */\nexport function computeHash(content: string): string {\n const hash = createHash(\"sha256\").update(content, \"utf-8\").digest(\"hex\");\n return `sha256:${hash}`;\n}\n","import Handlebars from 'handlebars';\nimport * as fs from 'node:fs/promises';\n\n// Register custom helpers\nHandlebars.registerHelper('lowercase', (str: unknown) => {\n return typeof str === 'string'\n ? str.toLowerCase()\n : String(str ?? '').toLowerCase();\n});\n\n/** LRU-style compilation cache to avoid recompiling the same template */\nconst compiledCache = new Map<string, HandlebarsTemplateDelegate>();\nconst MAX_CACHE_SIZE = 64;\n\nfunction getCompiledTemplate(\n templateContent: string,\n): HandlebarsTemplateDelegate {\n let compiled = compiledCache.get(templateContent);\n if (!compiled) {\n if (compiledCache.size >= MAX_CACHE_SIZE) {\n // Evict oldest entry\n const firstKey = compiledCache.keys().next().value!;\n compiledCache.delete(firstKey);\n }\n compiled = Handlebars.compile(templateContent, { noEscape: true });\n compiledCache.set(templateContent, compiled);\n }\n return compiled;\n}\n\n/**\n * Render a Handlebars template string with the given data.\n */\nexport function renderTemplate(\n templateContent: string,\n data: Record<string, unknown>,\n): string {\n const compiled = getCompiledTemplate(templateContent);\n return compiled(data);\n}\n\n/**\n * Load template file content from disk.\n */\nexport async function loadTemplateFile(filePath: string): Promise<string> {\n return fs.readFile(filePath, 'utf-8');\n}\n","import * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\n\n/**\n * Resolve a source path — handles _template/ prefix by resolving from packageRoot.\n */\nexport function resolveSourcePath(\n source: string,\n variantDir: string,\n packageRoot: string,\n): string {\n if (source.startsWith('_template/')) {\n return path.join(packageRoot, source);\n }\n return path.join(variantDir, source);\n}\n\n/**\n * Recursively walk a directory and return all file paths.\n */\nexport async function walkDir(dir: string): Promise<string[]> {\n const files: string[] = [];\n const entries = await fs.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n files.push(...(await walkDir(fullPath)));\n } else if (entry.isFile()) {\n files.push(fullPath);\n }\n }\n\n return files;\n}\n","import * as path from \"node:path\";\nimport type { ProjectConfig, InstalledManifest } from \"@teamix-evo/registry\";\nimport { validateConfig, validateInstalled } from \"@teamix-evo/registry\";\nimport { readFileOrNull, writeFileSafe, ensureDir } from \"../utils/fs.js\";\nimport { logger } from \"../utils/logger.js\";\n\nconst TEAMIX_DIR = \".teamix-evo\";\nconst CONFIG_FILE = \"config.json\";\nconst MANIFEST_FILE = \"manifest.json\";\n\n/**\n * Get the .teamix-evo directory path for a project.\n */\nexport function getTeamixDir(projectRoot: string): string {\n return path.join(projectRoot, TEAMIX_DIR);\n}\n\n/**\n * Ensure the .teamix-evo directory exists.\n */\nexport async function ensureTeamixDir(projectRoot: string): Promise<string> {\n const dir = getTeamixDir(projectRoot);\n await ensureDir(dir);\n return dir;\n}\n\n/**\n * Read the project config from .teamix-evo/config.json.\n * Returns null if the file does not exist.\n */\nexport async function readProjectConfig(\n projectRoot: string,\n): Promise<ProjectConfig | null> {\n const configPath = path.join(projectRoot, TEAMIX_DIR, CONFIG_FILE);\n const raw = await readFileOrNull(configPath);\n if (raw === null) return null;\n\n try {\n const data = JSON.parse(raw);\n const result = validateConfig(data);\n if (!result.success) {\n logger.warn(`Invalid config.json: ${result.error}`);\n return null;\n }\n return result.data;\n } catch (err) {\n logger.warn(`Failed to parse config.json: ${(err as Error).message}`);\n return null;\n }\n}\n\n/**\n * Write the project config to .teamix-evo/config.json.\n */\nexport async function writeProjectConfig(\n projectRoot: string,\n config: ProjectConfig,\n): Promise<void> {\n const configPath = path.join(projectRoot, TEAMIX_DIR, CONFIG_FILE);\n await writeFileSafe(configPath, JSON.stringify(config, null, 2) + \"\\n\");\n logger.debug(`Wrote config → ${configPath}`);\n}\n\n/**\n * Read the installed manifest from .teamix-evo/manifest.json.\n * Returns null if the file does not exist.\n */\nexport async function readInstalledManifest(\n projectRoot: string,\n): Promise<InstalledManifest | null> {\n const manifestPath = path.join(projectRoot, TEAMIX_DIR, MANIFEST_FILE);\n const raw = await readFileOrNull(manifestPath);\n if (raw === null) return null;\n\n try {\n const data = JSON.parse(raw);\n const result = validateInstalled(data);\n if (!result.success) {\n logger.warn(`Invalid manifest.json: ${result.error}`);\n return null;\n }\n return result.data;\n } catch (err) {\n logger.warn(`Failed to parse manifest.json: ${(err as Error).message}`);\n return null;\n }\n}\n\n/**\n * Write the installed manifest to .teamix-evo/manifest.json.\n */\nexport async function writeInstalledManifest(\n projectRoot: string,\n manifest: InstalledManifest,\n): Promise<void> {\n const manifestPath = path.join(projectRoot, TEAMIX_DIR, MANIFEST_FILE);\n await writeFileSafe(manifestPath, JSON.stringify(manifest, null, 2) + \"\\n\");\n logger.debug(`Wrote manifest → ${manifestPath}`);\n}\n","import type {\n ProjectConfig,\n InstalledManifest,\n InstalledResource,\n TailwindVersion,\n} from '@teamix-evo/registry';\nimport { loadVariantData } from './registry-client.js';\nimport { installResources } from './installer.js';\nimport {\n ensureTeamixDir,\n readProjectConfig,\n writeProjectConfig,\n writeInstalledManifest,\n} from './state.js';\n\nconst DEFAULT_DESIGN_PACKAGE = '@teamix-evo/design';\n\nexport interface RunDesignInitOptions {\n /** Absolute project root directory. */\n projectRoot: string;\n /** Design variant id, e.g. \"opentrek\". */\n variant: string;\n /** Tailwind major version of the consuming project. */\n tailwind: TailwindVersion;\n /** IDE identifier written into config.json (e.g. \"qoder\", \"claude\"). */\n ide: string;\n /** Override the design package name (defaults to \"@teamix-evo/design\"). */\n packageName?: string;\n}\n\nexport type RunDesignInitResult =\n | {\n status: 'installed';\n packageName: string;\n variant: string;\n version: string;\n tailwind: TailwindVersion;\n count: number;\n resources: InstalledResource[];\n }\n | {\n status: 'already-initialized';\n existingVariant: string;\n };\n\n/**\n * Programmatic equivalent of `teamix-evo design init <variant>`.\n *\n * Side effects:\n * - Creates `<projectRoot>/.teamix-evo/`\n * - Writes `config.json` and `manifest.json`\n * - Installs design resources from the variant manifest into the project\n *\n * No interactive prompts, no `process.exit`. Throws on hard failure.\n */\nexport async function runDesignInit(\n options: RunDesignInitOptions,\n): Promise<RunDesignInitResult> {\n const { projectRoot, variant, tailwind, ide } = options;\n const packageName = options.packageName ?? DEFAULT_DESIGN_PACKAGE;\n\n await ensureTeamixDir(projectRoot);\n\n const existingConfig = await readProjectConfig(projectRoot);\n if (existingConfig?.packages?.design) {\n return {\n status: 'already-initialized',\n existingVariant: existingConfig.packages.design.variant,\n };\n }\n\n const { manifest, data, variantDir, packageRoot } = await loadVariantData(\n packageName,\n variant,\n );\n\n const result = await installResources({\n projectRoot,\n manifest,\n data,\n variantDir,\n packageRoot,\n });\n\n const config: ProjectConfig = {\n $schema: 'https://teamix-evo.dev/schema/config/v1.json',\n schemaVersion: 1,\n ide,\n packages: {\n design: {\n variant,\n version: manifest.version,\n tailwind,\n },\n },\n };\n await writeProjectConfig(projectRoot, config);\n\n const installedManifest: InstalledManifest = {\n schemaVersion: 1,\n installed: [\n {\n package: packageName,\n variant,\n version: manifest.version,\n installedAt: new Date().toISOString(),\n resources: result.resources,\n },\n ],\n };\n await writeInstalledManifest(projectRoot, installedManifest);\n\n return {\n status: 'installed',\n packageName,\n variant,\n version: manifest.version,\n tailwind,\n count: result.count,\n resources: result.resources,\n };\n}\n","import { Command } from \"commander\";\nimport { detectIde } from \"../../ide/index.js\";\nimport { loadVariantData } from \"../../core/registry-client.js\";\nimport { updateResources } from \"../../core/updater.js\";\nimport {\n readProjectConfig,\n readInstalledManifest,\n writeProjectConfig,\n writeInstalledManifest,\n} from \"../../core/state.js\";\nimport { logger } from \"../../utils/logger.js\";\n\nconst DESIGN_PACKAGE = \"@teamix-evo/design\";\n\nexport const updateCommand = new Command(\"update\")\n .description(\"更新设计体系资源\")\n .action(async () => {\n try {\n const ide = detectIde();\n const projectRoot = ide.getProjectRoot();\n\n logger.info(\"Updating design system resources...\");\n\n // 1. Read existing config\n const config = await readProjectConfig(projectRoot);\n if (!config?.packages?.design) {\n logger.error(\n 'Design system not initialized. Run \"teamix-evo design init\" first.',\n );\n process.exitCode = 1;\n return;\n }\n\n const { variant, version: currentVersion } = config.packages.design;\n\n // 2. Read installed manifest\n const installedManifest = await readInstalledManifest(projectRoot);\n if (!installedManifest) {\n logger.error(\n \"No installed manifest found. Try re-initializing with \" +\n '\"teamix-evo design init\".',\n );\n process.exitCode = 1;\n return;\n }\n\n // 3. Load latest variant data\n logger.info(`Loading variant \"${variant}\" from ${DESIGN_PACKAGE}...`);\n const { manifest, data, variantDir, packageRoot } =\n await loadVariantData(DESIGN_PACKAGE, variant);\n\n logger.info(\n `Current: v${currentVersion} → Available: v${manifest.version}`,\n );\n\n // 4. Update resources\n const result = await updateResources({\n projectRoot,\n manifest,\n data,\n variantDir,\n packageRoot,\n installedManifest,\n packageName: DESIGN_PACKAGE,\n });\n\n // 5. Update config version\n config.packages.design.version = manifest.version;\n await writeProjectConfig(projectRoot, config);\n\n // 6. Update installed manifest\n const updatedManifest = { ...installedManifest };\n const pkgIdx = updatedManifest.installed.findIndex(\n (p) => p.package === DESIGN_PACKAGE && p.variant === variant,\n );\n const pkgEntry = {\n package: DESIGN_PACKAGE,\n variant,\n version: manifest.version,\n installedAt: new Date().toISOString(),\n resources: result.resources,\n };\n if (pkgIdx >= 0) {\n updatedManifest.installed[pkgIdx] = pkgEntry;\n } else {\n updatedManifest.installed.push(pkgEntry);\n }\n await writeInstalledManifest(projectRoot, updatedManifest);\n\n // 7. Output summary\n const { summary } = result;\n logger.success(\n `Design system updated to v${manifest.version}`,\n );\n logger.info(` Created: ${summary.created}`);\n logger.info(` Overwritten: ${summary.overwritten}`);\n logger.info(` Managed: ${summary.managed}`);\n logger.info(` Skipped: ${summary.skipped}`);\n } catch (err) {\n logger.error(`Failed to update: ${(err as Error).message}`);\n logger.debug((err as Error).stack ?? \"\");\n process.exitCode = 1;\n }\n });\n","import * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport type {\n VariantManifest,\n Resource,\n InstalledResource,\n InstalledManifest,\n} from '@teamix-evo/registry';\nimport { getUpdateAction, replaceManagedRegion } from '@teamix-evo/registry';\nimport {\n writeFileSafe,\n readFileOrNull,\n fileExists,\n backupFile,\n ensureDir,\n} from '../utils/fs.js';\nimport { computeHash } from '../utils/hash.js';\nimport { renderTemplate, loadTemplateFile } from '../utils/template.js';\nimport { logger } from '../utils/logger.js';\nimport { resolveSourcePath, walkDir } from '../utils/path.js';\n\nexport interface UpdateOptions {\n /** Project root directory */\n projectRoot: string;\n /** The new variant manifest */\n manifest: VariantManifest;\n /** Template data for Handlebars rendering */\n data: Record<string, unknown>;\n /** Absolute path to the variant directory */\n variantDir: string;\n /** Absolute path to the package root */\n packageRoot: string;\n /** Previously installed manifest */\n installedManifest: InstalledManifest;\n /** Full package name e.g. \"@teamix-evo/design\" */\n packageName: string;\n}\n\nexport interface UpdateResult {\n /** Updated resource records */\n resources: InstalledResource[];\n /** Summary of actions taken */\n summary: {\n overwritten: number;\n managed: number;\n skipped: number;\n created: number;\n };\n}\n\n/**\n * Update resources based on their update strategy.\n */\nexport async function updateResources(\n options: UpdateOptions,\n): Promise<UpdateResult> {\n const {\n projectRoot,\n manifest,\n data,\n variantDir,\n packageRoot,\n installedManifest,\n packageName,\n } = options;\n\n const updatedResources: InstalledResource[] = [];\n const summary = { overwritten: 0, managed: 0, skipped: 0, created: 0 };\n\n // Build a lookup of currently installed resources\n const installedPkg = installedManifest.installed.find(\n (p) => p.package === packageName && p.variant === manifest.variant,\n );\n const installedMap = new Map<string, InstalledResource>();\n if (installedPkg) {\n for (const res of installedPkg.resources) {\n installedMap.set(res.id, res);\n }\n }\n\n for (const resource of manifest.resources) {\n if (resource.recursive) {\n // For recursive resources, just regenerate fully\n const results = await updateRecursiveResource(\n resource,\n projectRoot,\n data,\n variantDir,\n packageRoot,\n installedMap,\n summary,\n );\n updatedResources.push(...results);\n } else {\n const result = await updateSingleResource(\n resource,\n projectRoot,\n data,\n variantDir,\n packageRoot,\n installedMap,\n summary,\n );\n updatedResources.push(result);\n }\n }\n\n return { resources: updatedResources, summary };\n}\n\nasync function updateSingleResource(\n resource: Resource,\n projectRoot: string,\n data: Record<string, unknown>,\n variantDir: string,\n packageRoot: string,\n installedMap: Map<string, InstalledResource>,\n summary: UpdateResult['summary'],\n): Promise<InstalledResource> {\n const targetPath = path.join(projectRoot, resource.target);\n const exists = await fileExists(targetPath);\n const installed = installedMap.get(resource.id);\n\n // Render new content\n const sourcePath = resolveSourcePath(\n resource.source,\n variantDir,\n packageRoot,\n );\n let newContent: string;\n if (resource.template) {\n const templateContent = await loadTemplateFile(sourcePath);\n newContent = renderTemplate(templateContent, data);\n } else {\n newContent = await fs.readFile(sourcePath, 'utf-8');\n }\n\n const newHash = computeHash(newContent);\n\n const action = getUpdateAction(resource.updateStrategy, {\n exists,\n hash: newHash,\n currentHash: installed?.hash,\n });\n\n switch (action) {\n case 'skip': {\n logger.debug(` Skip: ${resource.target} (${resource.updateStrategy})`);\n summary.skipped++;\n return (\n installed ?? {\n id: resource.id,\n target: resource.target,\n hash: newHash,\n strategy: resource.updateStrategy,\n }\n );\n }\n\n case 'overwrite': {\n if (exists) {\n await backupFile(targetPath, projectRoot);\n summary.overwritten++;\n } else {\n summary.created++;\n }\n await writeFileSafe(targetPath, newContent);\n logger.debug(` ${exists ? 'Overwrite' : 'Create'}: ${resource.target}`);\n return {\n id: resource.id,\n target: resource.target,\n hash: newHash,\n strategy: resource.updateStrategy,\n };\n }\n\n case 'managed-update': {\n const currentContent = await readFileOrNull(targetPath);\n if (currentContent === null) {\n // File was deleted by user — recreate\n await writeFileSafe(targetPath, newContent);\n summary.created++;\n return {\n id: resource.id,\n target: resource.target,\n hash: computeHash(newContent),\n strategy: resource.updateStrategy,\n };\n }\n\n // Replace managed regions from new content into current content\n let updatedContent = currentContent;\n const regionIds = resource.managedRegions ?? [];\n\n for (const regionId of regionIds) {\n // Extract managed region content from the new rendered content\n const regionPattern = new RegExp(\n `<!-- teamix-evo:managed:start id=\"${escapeRegExp(\n regionId,\n )}\" -->([\\\\s\\\\S]*?)<!-- teamix-evo:managed:end id=\"${escapeRegExp(\n regionId,\n )}\" -->`,\n );\n const match = newContent.match(regionPattern);\n if (match) {\n const regionContent = match[1].replace(/^\\n/, '').replace(/\\n$/, '');\n try {\n updatedContent = replaceManagedRegion(\n updatedContent,\n regionId,\n regionContent,\n );\n } catch {\n logger.warn(\n `Managed region \"${regionId}\" not found in ${resource.target}. Skipping region.`,\n );\n }\n }\n }\n\n await backupFile(targetPath, projectRoot);\n await writeFileSafe(targetPath, updatedContent);\n summary.managed++;\n\n return {\n id: resource.id,\n target: resource.target,\n hash: computeHash(updatedContent),\n strategy: resource.updateStrategy,\n };\n }\n\n default:\n summary.skipped++;\n return (\n installed ?? {\n id: resource.id,\n target: resource.target,\n hash: newHash,\n strategy: resource.updateStrategy,\n }\n );\n }\n}\n\nasync function updateRecursiveResource(\n resource: Resource,\n projectRoot: string,\n data: Record<string, unknown>,\n variantDir: string,\n packageRoot: string,\n installedMap: Map<string, InstalledResource>,\n summary: UpdateResult['summary'],\n): Promise<InstalledResource[]> {\n const sourcePath = resolveSourcePath(\n resource.source,\n variantDir,\n packageRoot,\n );\n const targetDir = path.join(projectRoot, resource.target);\n const results: InstalledResource[] = [];\n\n // For frozen recursive resources, skip entirely if already installed\n if (resource.updateStrategy === 'frozen') {\n const anyInstalled = [...installedMap.keys()].some((k) =>\n k.startsWith(`${resource.id}:`),\n );\n if (anyInstalled) {\n summary.skipped++;\n // Return existing installed entries\n for (const [id, res] of installedMap) {\n if (id.startsWith(`${resource.id}:`)) {\n results.push(res);\n }\n }\n return results;\n }\n }\n\n await ensureDir(targetDir);\n\n const entries = await walkDir(sourcePath);\n for (const entry of entries) {\n const relPath = path.relative(sourcePath, entry);\n let targetFile = path.join(targetDir, relPath);\n\n if (resource.template && targetFile.endsWith('.hbs')) {\n targetFile = targetFile.slice(0, -4);\n }\n\n let content: string;\n if (resource.template && entry.endsWith('.hbs')) {\n const templateContent = await loadTemplateFile(entry);\n content = renderTemplate(templateContent, data);\n } else {\n content = await fs.readFile(entry, 'utf-8');\n }\n\n await writeFileSafe(targetFile, content);\n const hash = computeHash(content);\n const targetRel = path.relative(projectRoot, targetFile);\n\n results.push({\n id: `${resource.id}:${relPath}`,\n target: targetRel,\n hash,\n strategy: resource.updateStrategy,\n });\n\n summary.overwritten++;\n }\n\n return results;\n}\n\nfunction escapeRegExp(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n","import { Command } from \"commander\";\nimport { detectIde } from \"../../ide/index.js\";\nimport { readProjectConfig, readInstalledManifest } from \"../../core/state.js\";\nimport { logger } from \"../../utils/logger.js\";\n\nexport const listCommand = new Command(\"list\")\n .description(\"列出已安装的设计变体\")\n .action(async () => {\n try {\n const ide = detectIde();\n const projectRoot = ide.getProjectRoot();\n\n const config = await readProjectConfig(projectRoot);\n if (!config?.packages?.design) {\n logger.info(\"No design system installed.\");\n logger.info('Run \"teamix-evo design init [variant]\" to get started.');\n return;\n }\n\n const { variant, version } = config.packages.design;\n\n logger.info(\"Installed design system:\");\n logger.info(` Package: @teamix-evo/design`);\n logger.info(` Variant: ${variant}`);\n logger.info(` Version: ${version}`);\n logger.info(` IDE: ${config.ide}`);\n\n // Show resource count from installed manifest\n const manifest = await readInstalledManifest(projectRoot);\n if (manifest) {\n const pkg = manifest.installed.find(\n (p) => p.package === \"@teamix-evo/design\" && p.variant === variant,\n );\n if (pkg) {\n logger.info(` Resources: ${pkg.resources.length} files`);\n logger.info(\n ` Installed: ${new Date(pkg.installedAt).toLocaleString()}`,\n );\n }\n }\n } catch (err) {\n logger.error(`Failed to list: ${(err as Error).message}`);\n process.exitCode = 1;\n }\n });\n","import { Command } from 'commander';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport * as prompts from '@clack/prompts';\nimport { detectIde } from '../../ide/index.js';\nimport {\n readProjectConfig,\n readInstalledManifest,\n writeProjectConfig,\n writeInstalledManifest,\n} from '../../core/state.js';\nimport { logger } from '../../utils/logger.js';\n\nconst DESIGN_PACKAGE = '@teamix-evo/design';\n\ninterface UninstallOptions {\n yes?: boolean;\n keepFiles?: boolean;\n}\n\nexport const uninstallCommand = new Command('uninstall')\n .description('卸载设计体系资源(默认会删除 frozen / regenerable 资源文件)')\n .option('-y, --yes', '跳过确认')\n .option(\n '--keep-files',\n '仅清理 .teamix-evo 中的记账信息,不删除已落地资源文件',\n )\n .action(async (opts: UninstallOptions) => {\n try {\n const ide = detectIde();\n const projectRoot = ide.getProjectRoot();\n\n const config = await readProjectConfig(projectRoot);\n if (!config?.packages?.design) {\n logger.info('Design system is not installed. Nothing to do.');\n return;\n }\n\n const installedManifest = await readInstalledManifest(projectRoot);\n const pkg = installedManifest?.installed.find(\n (p) => p.package === DESIGN_PACKAGE,\n );\n const resources = pkg?.resources ?? [];\n\n // managed 文件不删除(用户可能在其中混入了自定义内容);frozen/regenerable 删\n const removable = opts.keepFiles\n ? []\n : resources.filter((r) => r.strategy !== 'managed');\n const kept = resources.length - removable.length;\n\n logger.info(\n `Will remove ${removable.length} file(s); keep ${kept} managed file(s).`,\n );\n\n if (!opts.yes) {\n const confirm = await prompts.confirm({\n message: '确认卸载设计体系?',\n initialValue: false,\n });\n if (prompts.isCancel(confirm) || !confirm) {\n logger.info('Cancelled.');\n return;\n }\n }\n\n // 1. Remove files\n let removed = 0;\n for (const r of removable) {\n const target = path.isAbsolute(r.target)\n ? r.target\n : path.join(projectRoot, r.target);\n try {\n await fs.unlink(target);\n removed++;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') {\n logger.warn(\n `Failed to remove ${target}: ${(err as Error).message}`,\n );\n }\n }\n }\n\n // 2. Update installed manifest\n if (installedManifest) {\n installedManifest.installed = installedManifest.installed.filter(\n (p) => p.package !== DESIGN_PACKAGE,\n );\n await writeInstalledManifest(projectRoot, installedManifest);\n }\n\n // 3. Update config\n delete config.packages.design;\n await writeProjectConfig(projectRoot, config);\n\n logger.success(`Uninstalled ${DESIGN_PACKAGE}`);\n logger.info(` Removed: ${removed} files`);\n if (kept > 0) {\n logger.info(\n ` Kept: ${kept} managed files (you may delete manually)`,\n );\n }\n } catch (err) {\n logger.error(`Failed to uninstall: ${(err as Error).message}`);\n logger.debug((err as Error).stack ?? '');\n process.exitCode = 1;\n }\n });\n","import { Command } from 'commander';\nimport { addCommand } from './add.js';\nimport { listCommand } from './list.js';\nimport { updateCommand } from './update.js';\nimport { uninstallCommand } from './uninstall.js';\n\nexport const skillsCommand = new Command('skills').description(\n '管理 teamix-evo skills(向 AI IDE 注入技能)',\n);\n\nskillsCommand.addCommand(addCommand);\nskillsCommand.addCommand(listCommand);\nskillsCommand.addCommand(updateCommand);\nskillsCommand.addCommand(uninstallCommand);\n","import { Command } from 'commander';\nimport * as prompts from '@clack/prompts';\nimport type { SkillIde, SkillScope } from '@teamix-evo/registry';\nimport { detectIde, ALL_IDE_KINDS } from '../../ide/index.js';\nimport { runSkillsAdd } from '../../core/skills-add.js';\nimport { readProjectConfig } from '../../core/state.js';\nimport { logger } from '../../utils/logger.js';\n\ninterface AddOptions {\n ide?: string;\n scope?: string;\n yes?: boolean;\n}\n\nexport const addCommand = new Command('add')\n .description(\n '向项目(或全局 IDE 配置)添加 teamix-evo skills;不传 names 则添加 manifest 内全部 skill',\n )\n .argument(\n '[names...]',\n '可选:仅添加指定 skill id(增量模式);省略则添加全部',\n )\n .option('--ide <list>', '逗号分隔的 IDE 列表,如 \"qoder,claude\"')\n .option(\n '--scope <scope>',\n 'project | global(默认 project;增量模式下默认复用已有配置)',\n )\n .option('-y, --yes', '使用默认值,跳过交互')\n .action(async (names: string[], opts: AddOptions) => {\n try {\n const ide = detectIde();\n const projectRoot = ide.getProjectRoot();\n const isIncremental = names.length > 0;\n\n const { ides, scope } = await resolveIdesAndScope({\n opts,\n projectRoot,\n isIncremental,\n });\n\n logger.info(\n isIncremental\n ? `Adding skills [${names.join(',')}]: ides=[${ides.join(\n ',',\n )}], scope=\"${scope}\"`\n : `Adding skills (all): ides=[${ides.join(',')}], scope=\"${scope}\"`,\n );\n logger.debug(`Project root: ${projectRoot}`);\n\n const result = await runSkillsAdd({\n projectRoot,\n ides,\n scope,\n ide: ide.name,\n names: isIncremental ? names : undefined,\n });\n\n if (result.status === 'already-added') {\n logger.warn(\n `Skills already added. Use \"teamix-evo skills add <name>\" to add specific skills, ` +\n `\"teamix-evo skills update\" to refresh, or \"teamix-evo skills uninstall\" to remove.`,\n );\n return;\n }\n\n if (\n result.addedSkillIds.length === 0 &&\n result.skippedSkillIds.length > 0\n ) {\n logger.warn(\n `已存在,无需添加:${result.skippedSkillIds.join(\n ', ',\n )}。如需刷新内容请运行 \"teamix-evo skills update\"。`,\n );\n return;\n }\n\n logger.success(`Skills added: ${result.skillCount} skill(s)`);\n logger.info(` IDEs: ${result.ides.join(', ')}`);\n logger.info(` Scope: ${result.scope}`);\n if (result.addedSkillIds.length > 0) {\n logger.info(` Added: ${result.addedSkillIds.join(', ')}`);\n }\n if (result.skippedSkillIds.length > 0) {\n logger.info(\n ` Skipped: ${result.skippedSkillIds.join(', ')} (already added)`,\n );\n }\n logger.info(` Files: ${result.fileCount}`);\n logger.info('');\n logger.info('Run \"teamix-evo skills list\" to see installed skills.');\n } catch (err) {\n logger.error(`Failed to add skills: ${(err as Error).message}`);\n logger.debug((err as Error).stack ?? '');\n process.exitCode = 1;\n }\n });\n\nasync function resolveIdesAndScope(args: {\n opts: AddOptions;\n projectRoot: string;\n isIncremental: boolean;\n}): Promise<{ ides: SkillIde[]; scope: SkillScope }> {\n const { opts, projectRoot, isIncremental } = args;\n\n // Incremental + previous install + no overrides → silently reuse config.\n if (isIncremental && !opts.ide && !opts.scope && !opts.yes) {\n const existing = await readProjectConfig(projectRoot);\n const cfg = existing?.packages?.skills;\n if (cfg && cfg.ides && cfg.ides.length > 0 && cfg.scope) {\n logger.debug(\n `Reusing existing skills config: ides=[${cfg.ides.join(',')}], scope=\"${\n cfg.scope\n }\"`,\n );\n return {\n ides: [...cfg.ides] as SkillIde[],\n scope: cfg.scope as SkillScope,\n };\n }\n }\n\n // From CLI flags\n if (opts.ide || opts.yes) {\n const ides = opts.ide\n ? parseIdeList(opts.ide)\n : ([...ALL_IDE_KINDS] as SkillIde[]);\n const scope = parseScope(opts.scope);\n if (ides.length === 0) {\n throw new Error('At least one IDE must be selected.');\n }\n return { ides, scope };\n }\n\n // Interactive\n const idesAns = await prompts.multiselect<SkillIde>({\n message: '选择要注入技能的 AI IDE(至少一个)',\n options: ALL_IDE_KINDS.map((k) => ({\n value: k,\n label: k === 'qoder' ? 'Qoder' : 'Claude Code',\n })),\n initialValues: [...ALL_IDE_KINDS] as SkillIde[],\n required: true,\n });\n if (prompts.isCancel(idesAns)) {\n throw new Error('Cancelled by user.');\n }\n\n const scopeAns = await prompts.select<SkillScope>({\n message: '安装范围?',\n options: [\n { value: 'project', label: '项目级(.qoder/.claude 在当前项目)' },\n { value: 'global', label: '全局(~/.qoder/~/.claude)' },\n ],\n initialValue: 'project',\n });\n if (prompts.isCancel(scopeAns)) {\n throw new Error('Cancelled by user.');\n }\n\n return { ides: idesAns as SkillIde[], scope: scopeAns as SkillScope };\n}\n\nfunction parseIdeList(input: string): SkillIde[] {\n const parts = input\n .split(',')\n .map((s) => s.trim().toLowerCase())\n .filter(Boolean);\n const result: SkillIde[] = [];\n for (const p of parts) {\n if (p === 'qoder' || p === 'claude') {\n if (!result.includes(p)) result.push(p);\n } else {\n throw new Error(`Unknown IDE: \"${p}\". Expected qoder | claude.`);\n }\n }\n return result;\n}\n\nfunction parseScope(input: string | undefined): SkillScope {\n const v = (input ?? 'project').toLowerCase();\n if (v === 'project' || v === 'global') return v;\n throw new Error(`Invalid --scope: \"${input}\". Expected project | global.`);\n}\n","import * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport { createRequire } from 'node:module';\nimport type { SkillsPackageManifest } from '@teamix-evo/registry';\nimport { loadSkillsPackageManifest } from '@teamix-evo/registry';\nimport { logger } from '../utils/logger.js';\n\nconst require = createRequire(import.meta.url);\n\n/**\n * Resolve the package root directory for the skills package.\n */\nfunction resolvePackageRoot(packageName: string): string {\n const pkgJsonPath = require.resolve(`${packageName}/package.json`);\n return path.dirname(pkgJsonPath);\n}\n\n/**\n * Load the skills package manifest and optional shared `_data.json`.\n *\n * @param packageName - e.g. \"@teamix-evo/skills\"\n */\nexport async function loadSkillsData(packageName: string): Promise<{\n manifest: SkillsPackageManifest;\n data: Record<string, unknown>;\n packageRoot: string;\n}> {\n const packageRoot = resolvePackageRoot(packageName);\n\n logger.debug(`Resolved skills package root: ${packageRoot}`);\n\n const manifest = await loadSkillsPackageManifest(packageRoot);\n\n let data: Record<string, unknown> = {};\n const dataPath = path.join(packageRoot, '_data.json');\n try {\n const raw = await fs.readFile(dataPath, 'utf-8');\n data = JSON.parse(raw) as Record<string, unknown>;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw err;\n }\n logger.debug(`No _data.json found at ${dataPath}, using empty data`);\n }\n\n return { manifest, data, packageRoot };\n}\n","import * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport type {\n SkillEntry,\n SkillsPackageManifest,\n InstalledResource,\n SkillIde,\n SkillScope,\n} from '@teamix-evo/registry';\nimport { replaceManagedRegion } from '@teamix-evo/registry';\nimport { getAdapter } from '../ide/index.js';\nimport {\n writeFileSafe,\n readFileOrNull,\n fileExists,\n ensureDir,\n backupFile,\n} from '../utils/fs.js';\nimport { computeHash } from '../utils/hash.js';\nimport { renderTemplate, loadTemplateFile } from '../utils/template.js';\nimport { logger } from '../utils/logger.js';\nimport { walkDir } from '../utils/path.js';\n\nexport interface SkillInstallOptions {\n /** Project root directory */\n projectRoot: string;\n /** Skills package manifest */\n manifest: SkillsPackageManifest;\n /** Template data */\n data: Record<string, unknown>;\n /** Absolute skills package root */\n packageRoot: string;\n /** IDE kinds to install for (intersection with skill.ides is computed) */\n ides: readonly SkillIde[];\n /** Install scope */\n scope: SkillScope;\n /** Optional: limit to specific skill ids */\n onlyIds?: string[];\n}\n\nexport interface SkillInstallResult {\n resources: InstalledResource[];\n count: number;\n}\n\n/**\n * Install (or reinstall) all skills declared in the manifest, fanning out to the\n * intersection of requested IDEs and each skill's declared `ides`.\n */\nexport async function installSkills(\n options: SkillInstallOptions,\n): Promise<SkillInstallResult> {\n const { manifest, ides, scope, onlyIds } = options;\n const installed: InstalledResource[] = [];\n\n const targets = manifest.skills.filter(\n (s) => !onlyIds || onlyIds.includes(s.id),\n );\n\n for (const skill of targets) {\n const skillIdes = skill.ides.filter((i) => ides.includes(i));\n if (skillIdes.length === 0) {\n logger.warn(\n `Skill \"${skill.name}\" supports [${skill.ides.join(\n ',',\n )}], no overlap with [${ides.join(',')}]; skipped.`,\n );\n continue;\n }\n\n for (const ide of skillIdes) {\n const result = await installSkillForIde(skill, ide, scope, options);\n installed.push(...result);\n }\n }\n\n return { resources: installed, count: installed.length };\n}\n\nasync function installSkillForIde(\n skill: SkillEntry,\n ide: SkillIde,\n scope: SkillScope,\n options: SkillInstallOptions,\n): Promise<InstalledResource[]> {\n const { data, packageRoot, projectRoot } = options;\n const adapter = getAdapter(ide);\n const targetDir = adapter.getSkillTargetDir(skill.name, scope, projectRoot);\n const sourceAbs = path.resolve(packageRoot, skill.source);\n\n const stat = await fs.stat(sourceAbs);\n const results: InstalledResource[] = [];\n\n if (stat.isFile()) {\n const targetFile = path.join(targetDir, 'SKILL.md');\n const content = await renderSkillContent(sourceAbs, skill, data);\n await writeFileSafe(targetFile, content);\n results.push(makeInstalledRecord(skill, targetFile, content, ide, scope));\n logger.debug(` Wrote ${ide}:${scope}: ${targetFile}`);\n return results;\n }\n\n // Directory source: walk and mirror\n await ensureDir(targetDir);\n const entries = await walkDir(sourceAbs);\n for (const entry of entries) {\n const rel = path.relative(sourceAbs, entry);\n let targetFile = path.join(targetDir, rel);\n if (skill.template && targetFile.endsWith('.hbs')) {\n targetFile = targetFile.slice(0, -4);\n }\n\n let content: string;\n if (skill.template && entry.endsWith('.hbs')) {\n const tpl = await loadTemplateFile(entry);\n content = renderTemplate(tpl, { ...data, skill });\n } else {\n content = await fs.readFile(entry, 'utf-8');\n }\n await writeFileSafe(targetFile, content);\n results.push(\n makeInstalledRecord(skill, targetFile, content, ide, scope, rel),\n );\n logger.debug(` Wrote ${ide}:${scope}: ${targetFile}`);\n }\n\n return results;\n}\n\nasync function renderSkillContent(\n sourceAbs: string,\n skill: SkillEntry,\n data: Record<string, unknown>,\n): Promise<string> {\n if (skill.template ?? sourceAbs.endsWith('.hbs')) {\n const tpl = await loadTemplateFile(sourceAbs);\n return renderTemplate(tpl, { ...data, skill });\n }\n return fs.readFile(sourceAbs, 'utf-8');\n}\n\nfunction makeInstalledRecord(\n skill: SkillEntry,\n targetAbs: string,\n content: string,\n ide: SkillIde,\n scope: SkillScope,\n rel?: string,\n): InstalledResource {\n const id = rel ? `${skill.id}:${rel}` : skill.id;\n return {\n id,\n target: targetAbs,\n hash: computeHash(content),\n strategy: skill.updateStrategy,\n ide,\n scope,\n };\n}\n\nexport interface SkillUpdateOptions extends SkillInstallOptions {\n /** Existing installed records for the skills package */\n installed: InstalledResource[];\n}\n\nexport interface SkillUpdateResult {\n resources: InstalledResource[];\n summary: {\n overwritten: number;\n managed: number;\n skipped: number;\n created: number;\n };\n}\n\n/**\n * Update skills according to their updateStrategy.\n */\nexport async function updateSkills(\n options: SkillUpdateOptions,\n): Promise<SkillUpdateResult> {\n const { manifest, ides, scope, installed, projectRoot, data, packageRoot } =\n options;\n const summary = { overwritten: 0, managed: 0, skipped: 0, created: 0 };\n const updated: InstalledResource[] = [];\n\n const installedMap = new Map<string, InstalledResource>();\n for (const r of installed) {\n installedMap.set(installedKey(r), r);\n }\n\n for (const skill of manifest.skills) {\n const skillIdes = skill.ides.filter((i) => ides.includes(i));\n for (const ide of skillIdes) {\n const records = await updateSkillForIde(\n skill,\n ide,\n scope,\n data,\n packageRoot,\n projectRoot,\n installedMap,\n summary,\n );\n updated.push(...records);\n }\n }\n\n return { resources: updated, summary };\n}\n\nasync function updateSkillForIde(\n skill: SkillEntry,\n ide: SkillIde,\n scope: SkillScope,\n data: Record<string, unknown>,\n packageRoot: string,\n projectRoot: string,\n installedMap: Map<string, InstalledResource>,\n summary: SkillUpdateResult['summary'],\n): Promise<InstalledResource[]> {\n const adapter = getAdapter(ide);\n const targetDir = adapter.getSkillTargetDir(skill.name, scope, projectRoot);\n const sourceAbs = path.resolve(packageRoot, skill.source);\n const stat = await fs.stat(sourceAbs);\n const records: InstalledResource[] = [];\n\n if (!stat.isFile()) {\n // Directory updates always overwrite (recursive). Re-render and write.\n const entries = await walkDir(sourceAbs);\n await ensureDir(targetDir);\n for (const entry of entries) {\n const rel = path.relative(sourceAbs, entry);\n let targetFile = path.join(targetDir, rel);\n if (skill.template && targetFile.endsWith('.hbs')) {\n targetFile = targetFile.slice(0, -4);\n }\n let content: string;\n if (skill.template && entry.endsWith('.hbs')) {\n content = renderTemplate(await loadTemplateFile(entry), {\n ...data,\n skill,\n });\n } else {\n content = await fs.readFile(entry, 'utf-8');\n }\n const exists = await fileExists(targetFile);\n if (exists) {\n await backupFile(targetFile, projectRoot);\n summary.overwritten++;\n } else {\n summary.created++;\n }\n await writeFileSafe(targetFile, content);\n records.push(\n makeInstalledRecord(skill, targetFile, content, ide, scope, rel),\n );\n }\n return records;\n }\n\n // Single-file skill\n const targetFile = path.join(targetDir, 'SKILL.md');\n const newContent = await renderSkillContent(sourceAbs, skill, data);\n const exists = await fileExists(targetFile);\n const installedKeyStr = `${skill.id}|${ide}|${scope}`;\n const prior = installedMap.get(installedKeyStr);\n\n if (skill.updateStrategy === 'frozen') {\n if (exists) {\n summary.skipped++;\n return [\n prior ?? makeInstalledRecord(skill, targetFile, newContent, ide, scope),\n ];\n }\n await writeFileSafe(targetFile, newContent);\n summary.created++;\n records.push(\n makeInstalledRecord(skill, targetFile, newContent, ide, scope),\n );\n return records;\n }\n\n if (skill.updateStrategy === 'regenerable' || !exists) {\n if (exists) {\n await backupFile(targetFile, projectRoot);\n summary.overwritten++;\n } else {\n summary.created++;\n }\n await writeFileSafe(targetFile, newContent);\n records.push(\n makeInstalledRecord(skill, targetFile, newContent, ide, scope),\n );\n return records;\n }\n\n // managed\n const current = await readFileOrNull(targetFile);\n let updated = current ?? newContent;\n const regionIds = skill.managedRegions ?? [];\n for (const regionId of regionIds) {\n const re = new RegExp(\n `<!-- teamix-evo:managed:start id=\"${escapeRegExp(\n regionId,\n )}\" -->([\\\\s\\\\S]*?)<!-- teamix-evo:managed:end id=\"${escapeRegExp(\n regionId,\n )}\" -->`,\n );\n const match = newContent.match(re);\n if (match) {\n const region = match[1].replace(/^\\n/, '').replace(/\\n$/, '');\n try {\n updated = replaceManagedRegion(updated, regionId, region);\n } catch {\n logger.warn(\n `Managed region \"${regionId}\" not found in ${targetFile}. Skipped.`,\n );\n }\n }\n }\n await backupFile(targetFile, projectRoot);\n await writeFileSafe(targetFile, updated);\n summary.managed++;\n records.push(makeInstalledRecord(skill, targetFile, updated, ide, scope));\n return records;\n}\n\nfunction installedKey(r: InstalledResource): string {\n return `${r.id}|${r.ide ?? ''}|${r.scope ?? ''}`;\n}\n\nfunction escapeRegExp(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Remove all installed skill files. Returns the absolute paths removed.\n */\nexport async function removeSkillFiles(\n records: InstalledResource[],\n): Promise<string[]> {\n const removed: string[] = [];\n for (const r of records) {\n try {\n await fs.unlink(r.target);\n removed.push(r.target);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') {\n logger.warn(`Failed to remove ${r.target}: ${(err as Error).message}`);\n }\n }\n }\n // Best-effort: prune empty parent skill dirs\n const parents = new Set(records.map((r) => path.dirname(r.target)));\n for (const dir of parents) {\n try {\n const entries = await fs.readdir(dir);\n if (entries.length === 0) await fs.rmdir(dir);\n } catch {\n /* ignore */\n }\n }\n return removed;\n}\n","import type {\n ProjectConfig,\n InstalledManifest,\n InstalledResource,\n SkillIde,\n SkillScope,\n} from '@teamix-evo/registry';\nimport { loadSkillsData } from './skills-client.js';\nimport { installSkills } from './skills-installer.js';\nimport {\n ensureTeamixDir,\n readProjectConfig,\n writeProjectConfig,\n readInstalledManifest,\n writeInstalledManifest,\n} from './state.js';\n\nconst DEFAULT_SKILLS_PACKAGE = '@teamix-evo/skills';\nconst FLAT_VARIANT = '_flat';\n\nexport interface RunSkillsAddOptions {\n /** Absolute project root directory. */\n projectRoot: string;\n /**\n * Target IDEs to inject skills into. Optional in incremental mode (i.e. when\n * `names` is provided) — falls back to the previously installed config.\n * Required for the bulk path.\n */\n ides?: readonly SkillIde[];\n /**\n * Install scope. Optional in incremental mode (falls back to existing\n * config). Required for the bulk path.\n */\n scope?: SkillScope;\n /** IDE identifier written into config.ide when bootstrapping a fresh config (defaults to \"qoder\"). */\n ide?: string;\n /** Override the skills package name (defaults to \"@teamix-evo/skills\"). */\n packageName?: string;\n /**\n * Optional skill ids to add. When omitted, all skills declared in the\n * manifest are installed (bulk mode). When provided, only the listed skills\n * are added (incremental mode); skills that are already installed are\n * silently skipped and reported via `skippedSkillIds`.\n */\n names?: readonly string[];\n}\n\nexport type RunSkillsAddResult =\n | {\n status: 'installed';\n packageName: string;\n version: string;\n ides: SkillIde[];\n scope: SkillScope;\n /** Number of skills that were freshly added in this call. */\n skillCount: number;\n /** Number of files written by `installSkills` for the freshly added skills. */\n fileCount: number;\n /** InstalledResource records for the freshly added skills only. */\n resources: InstalledResource[];\n /** Skill ids that were freshly added in this call. */\n addedSkillIds: string[];\n /** Skill ids that were requested but already installed; skipped. */\n skippedSkillIds: string[];\n }\n | {\n /** Returned only from bulk mode when a skills package is already installed. */\n status: 'already-added';\n };\n\n/**\n * Programmatic equivalent of `teamix-evo skills add`.\n *\n * - Bulk mode (`names` omitted): install every skill in the manifest. Re-run\n * on a project that already has `packages.skills` returns `'already-added'`.\n * - Incremental mode (`names` provided): install only the listed skills. Skills\n * already present are skipped (use `skills update` to refresh). `ides`/`scope`\n * may be omitted — they fall back to the previously installed config.\n */\nexport async function runSkillsAdd(\n options: RunSkillsAddOptions,\n): Promise<RunSkillsAddResult> {\n const { projectRoot, names: requestedNames } = options;\n const packageName = options.packageName ?? DEFAULT_SKILLS_PACKAGE;\n const ideIdent = options.ide ?? 'qoder';\n const isIncremental = !!requestedNames && requestedNames.length > 0;\n\n await ensureTeamixDir(projectRoot);\n\n const existingConfig = await readProjectConfig(projectRoot);\n const existingSkillsCfg = existingConfig?.packages?.skills;\n\n // Bulk mode + already added → block (preserve historical behavior).\n if (!isIncremental && existingSkillsCfg) {\n return { status: 'already-added' };\n }\n\n // Resolve ides/scope: explicit option wins, else fall back to existing config.\n const ides = (\n options.ides && options.ides.length > 0\n ? [...options.ides]\n : existingSkillsCfg?.ides\n ? [...existingSkillsCfg.ides]\n : []\n ) as SkillIde[];\n const scope = (options.scope ?? existingSkillsCfg?.scope) as\n | SkillScope\n | undefined;\n if (ides.length === 0) {\n throw new Error('At least one IDE must be selected.');\n }\n if (!scope) {\n throw new Error('Scope must be specified (project | global).');\n }\n\n const { manifest, data, packageRoot } = await loadSkillsData(packageName);\n\n // Validate requested names against manifest.\n if (isIncremental) {\n const known = new Set(manifest.skills.map((s) => s.id));\n const unknown = requestedNames!.filter((n) => !known.has(n));\n if (unknown.length > 0) {\n const available = [...known].join(', ');\n throw new Error(\n `Unknown skill id(s): ${unknown.join(', ')}. Available: ${\n available || '(none)'\n }.`,\n );\n }\n }\n\n const existingInstalled = await readInstalledManifest(projectRoot);\n const existingPkg = existingInstalled?.installed.find(\n (p) => p.package === packageName,\n );\n const existingSkillIds = new Set(\n (existingPkg?.resources ?? []).map((r) => r.id.split(':')[0]),\n );\n\n // Compute which skill ids to install on this call.\n let onlyIds: string[];\n let skippedSkillIds: string[];\n if (isIncremental) {\n skippedSkillIds = requestedNames!.filter((n) => existingSkillIds.has(n));\n onlyIds = requestedNames!.filter((n) => !existingSkillIds.has(n));\n } else {\n skippedSkillIds = [];\n onlyIds = manifest.skills.map((s) => s.id);\n }\n\n // Incremental fast path: nothing new to install.\n if (isIncremental && onlyIds.length === 0) {\n return {\n status: 'installed',\n packageName,\n version: existingSkillsCfg?.version ?? manifest.version,\n ides,\n scope,\n skillCount: 0,\n fileCount: 0,\n resources: [],\n addedSkillIds: [],\n skippedSkillIds,\n };\n }\n\n const result = await installSkills({\n projectRoot,\n manifest,\n data,\n packageRoot,\n ides,\n scope,\n onlyIds,\n });\n\n const config: ProjectConfig = existingConfig ?? {\n $schema: 'https://teamix-evo.dev/schema/config/v1.json',\n schemaVersion: 1,\n ide: ideIdent,\n packages: {},\n };\n config.packages.skills = {\n variant: FLAT_VARIANT,\n version: manifest.version,\n ides,\n scope,\n };\n await writeProjectConfig(projectRoot, config);\n\n const installedManifest: InstalledManifest = existingInstalled ?? {\n schemaVersion: 1,\n installed: [],\n };\n const idx = installedManifest.installed.findIndex(\n (p) => p.package === packageName,\n );\n const mergedResources = mergeInstalledResources(\n existingPkg?.resources ?? [],\n result.resources,\n );\n const entry = {\n package: packageName,\n variant: FLAT_VARIANT,\n version: manifest.version,\n installedAt: new Date().toISOString(),\n resources: mergedResources,\n };\n if (idx >= 0) installedManifest.installed[idx] = entry;\n else installedManifest.installed.push(entry);\n await writeInstalledManifest(projectRoot, installedManifest);\n\n return {\n status: 'installed',\n packageName,\n version: manifest.version,\n ides,\n scope,\n skillCount: onlyIds.length,\n fileCount: result.count,\n resources: result.resources,\n addedSkillIds: onlyIds,\n skippedSkillIds,\n };\n}\n\nfunction mergeInstalledResources(\n existing: InstalledResource[],\n next: InstalledResource[],\n): InstalledResource[] {\n const map = new Map<string, InstalledResource>();\n const key = (r: InstalledResource): string =>\n `${r.id}|${r.ide ?? ''}|${r.scope ?? ''}`;\n for (const r of existing) map.set(key(r), r);\n for (const r of next) map.set(key(r), r);\n return [...map.values()];\n}\n","import { Command } from 'commander';\nimport { detectIde } from '../../ide/index.js';\nimport { readProjectConfig, readInstalledManifest } from '../../core/state.js';\nimport { loadSkillsData } from '../../core/skills-client.js';\nimport { logger } from '../../utils/logger.js';\n\nconst SKILLS_PACKAGE = '@teamix-evo/skills';\n\ninterface ListOptions {\n installed?: boolean;\n}\n\nexport const listCommand = new Command('list')\n .alias('ls')\n .description(\n '列出 teamix-evo skills(默认展示全部 skill 并标注已装/未装;--installed 仅看已装)',\n )\n .option('--installed', '仅展示已安装的 skill(隐藏未安装项)')\n .action(async (opts: ListOptions) => {\n try {\n const ide = detectIde();\n const projectRoot = ide.getProjectRoot();\n\n const config = await readProjectConfig(projectRoot);\n const installedManifest = await readInstalledManifest(projectRoot);\n const pkg = installedManifest?.installed.find(\n (p) => p.package === SKILLS_PACKAGE,\n );\n\n // Group installed resources by skill id (resource id is \"<skillId>\" or \"<skillId>:<rel>\")\n const installedBySkill = new Map<string, number>();\n for (const r of pkg?.resources ?? []) {\n const skillId = r.id.split(':')[0];\n installedBySkill.set(skillId, (installedBySkill.get(skillId) ?? 0) + 1);\n }\n\n // --installed: legacy behavior, only show installed skills.\n if (opts.installed) {\n if (!config?.packages?.skills || !pkg) {\n logger.info('No skills installed.');\n logger.info('Run \"teamix-evo skills add\" to get started.');\n return;\n }\n printInstalledHeader(config.packages.skills, pkg.installedAt);\n logger.info('');\n logger.info('Installed skills:');\n for (const [skillId, count] of installedBySkill) {\n logger.info(` ✓ ${skillId} (${count} file${count > 1 ? 's' : ''})`);\n }\n logger.info('');\n logger.info(\n ` Total: ${pkg.resources.length} files (${installedBySkill.size} skills × ides × scope)`,\n );\n return;\n }\n\n // Default: list all available skills from the manifest, mark installed/not.\n const { manifest } = await loadSkillsData(SKILLS_PACKAGE);\n const skills = [...manifest.skills].sort((a, b) =>\n a.id.localeCompare(b.id),\n );\n const isInstalled = !!config?.packages?.skills && !!pkg;\n\n if (isInstalled) {\n printInstalledHeader(config!.packages!.skills!, pkg!.installedAt);\n } else {\n logger.info('Skills package not yet added.');\n logger.info(\n 'Run \"teamix-evo skills add\" to add all, or \"teamix-evo skills add <id>\" for specific skills.',\n );\n }\n logger.info('');\n logger.info(`Available skills (${SKILLS_PACKAGE}@${manifest.version}):`);\n let installedCount = 0;\n for (const s of skills) {\n const fileCount = installedBySkill.get(s.id);\n const installed = fileCount !== undefined;\n if (installed) installedCount++;\n const mark = installed ? '✓' : '○';\n const tail = installed\n ? `[installed, ${fileCount} file${fileCount > 1 ? 's' : ''}]`\n : `[not installed — run \"teamix-evo skills add ${s.id}\"]`;\n logger.info(` ${mark} ${s.id}@${s.version} ${tail}`);\n if (s.description) {\n logger.info(` ${s.description}`);\n }\n }\n logger.info('');\n logger.info(\n ` Total: ${skills.length} skill(s) — ${installedCount} installed, ${\n skills.length - installedCount\n } available`,\n );\n } catch (err) {\n logger.error(`Failed to list: ${(err as Error).message}`);\n process.exitCode = 1;\n }\n });\n\nfunction printInstalledHeader(\n cfg: { version?: string; ides?: readonly string[]; scope?: string },\n installedAt: string,\n): void {\n logger.info('Installed skills package:');\n logger.info(` Package: ${SKILLS_PACKAGE}`);\n logger.info(` Version: ${cfg.version ?? '(unknown)'}`);\n logger.info(` IDEs: ${(cfg.ides ?? []).join(', ') || '(unknown)'}`);\n logger.info(` Scope: ${cfg.scope ?? '(unknown)'}`);\n logger.info(` Installed: ${new Date(installedAt).toLocaleString()}`);\n}\n","import { Command } from 'commander';\nimport type { SkillIde, SkillScope } from '@teamix-evo/registry';\nimport { detectIde } from '../../ide/index.js';\nimport { loadSkillsData } from '../../core/skills-client.js';\nimport { updateSkills } from '../../core/skills-installer.js';\nimport {\n readProjectConfig,\n readInstalledManifest,\n writeProjectConfig,\n writeInstalledManifest,\n} from '../../core/state.js';\nimport { logger } from '../../utils/logger.js';\n\nconst SKILLS_PACKAGE = '@teamix-evo/skills';\nconst FLAT_VARIANT = '_flat';\n\nexport const updateCommand = new Command('update')\n .description('更新已安装的 teamix-evo skills')\n .action(async () => {\n try {\n const ide = detectIde();\n const projectRoot = ide.getProjectRoot();\n\n const config = await readProjectConfig(projectRoot);\n if (!config?.packages?.skills) {\n logger.error('Skills not added. Run \"teamix-evo skills add\" first.');\n process.exitCode = 1;\n return;\n }\n\n const installedManifest = await readInstalledManifest(projectRoot);\n if (!installedManifest) {\n logger.error('No installed manifest found.');\n process.exitCode = 1;\n return;\n }\n\n const skillsEntry = config.packages.skills;\n const ides: SkillIde[] = (skillsEntry.ides ?? [\n 'qoder',\n 'claude',\n ]) as SkillIde[];\n const scope: SkillScope = (skillsEntry.scope ?? 'project') as SkillScope;\n\n logger.info(`Updating skills (ides=[${ides.join(',')}], scope=${scope})`);\n\n const { manifest, data, packageRoot } = await loadSkillsData(\n SKILLS_PACKAGE,\n );\n\n const pkgInstalled = installedManifest.installed.find(\n (p) => p.package === SKILLS_PACKAGE,\n );\n const installedResources = pkgInstalled?.resources ?? [];\n\n logger.info(\n `Current: v${skillsEntry.version} → Available: v${manifest.version}`,\n );\n\n const result = await updateSkills({\n projectRoot,\n manifest,\n data,\n packageRoot,\n ides,\n scope,\n installed: installedResources,\n });\n\n // Update config version\n config.packages.skills.version = manifest.version;\n await writeProjectConfig(projectRoot, config);\n\n // Update installed manifest\n const idx = installedManifest.installed.findIndex(\n (p) => p.package === SKILLS_PACKAGE,\n );\n const entry = {\n package: SKILLS_PACKAGE,\n variant: FLAT_VARIANT,\n version: manifest.version,\n installedAt: new Date().toISOString(),\n resources: result.resources,\n };\n if (idx >= 0) installedManifest.installed[idx] = entry;\n else installedManifest.installed.push(entry);\n await writeInstalledManifest(projectRoot, installedManifest);\n\n const { summary } = result;\n logger.success(`Skills updated to v${manifest.version}`);\n logger.info(` Created: ${summary.created}`);\n logger.info(` Overwritten: ${summary.overwritten}`);\n logger.info(` Managed: ${summary.managed}`);\n logger.info(` Skipped: ${summary.skipped}`);\n } catch (err) {\n logger.error(`Failed to update skills: ${(err as Error).message}`);\n logger.debug((err as Error).stack ?? '');\n process.exitCode = 1;\n }\n });\n","import { Command } from 'commander';\nimport * as prompts from '@clack/prompts';\nimport { detectIde } from '../../ide/index.js';\nimport { removeSkillFiles } from '../../core/skills-installer.js';\nimport {\n readProjectConfig,\n readInstalledManifest,\n writeProjectConfig,\n writeInstalledManifest,\n} from '../../core/state.js';\nimport { logger } from '../../utils/logger.js';\n\nconst SKILLS_PACKAGE = '@teamix-evo/skills';\n\ninterface UninstallOptions {\n yes?: boolean;\n}\n\nexport const uninstallCommand = new Command('uninstall')\n .description('卸载已安装的 teamix-evo skills(删除注入到 IDE 的技能文件)')\n .option('-y, --yes', '跳过确认')\n .action(async (opts: UninstallOptions) => {\n try {\n const ide = detectIde();\n const projectRoot = ide.getProjectRoot();\n\n const config = await readProjectConfig(projectRoot);\n if (!config?.packages?.skills) {\n logger.info('Skills are not installed. Nothing to do.');\n return;\n }\n\n const installedManifest = await readInstalledManifest(projectRoot);\n const pkg = installedManifest?.installed.find(\n (p) => p.package === SKILLS_PACKAGE,\n );\n const resources = pkg?.resources ?? [];\n\n logger.info(\n `Will remove ${resources.length} skill file(s) installed by ${SKILLS_PACKAGE}.`,\n );\n\n if (!opts.yes) {\n const confirm = await prompts.confirm({\n message: '确认卸载?此操作会删除上述文件。',\n initialValue: false,\n });\n if (prompts.isCancel(confirm) || !confirm) {\n logger.info('Cancelled.');\n return;\n }\n }\n\n // 1. Remove physical files\n const removed = await removeSkillFiles(resources);\n logger.debug(`Removed ${removed.length} files`);\n\n // 2. Update installed manifest (drop the entry)\n if (installedManifest && pkg) {\n installedManifest.installed = installedManifest.installed.filter(\n (p) => p.package !== SKILLS_PACKAGE,\n );\n await writeInstalledManifest(projectRoot, installedManifest);\n }\n\n // 3. Update config (drop the entry)\n delete config.packages.skills;\n await writeProjectConfig(projectRoot, config);\n\n logger.success(`Uninstalled ${SKILLS_PACKAGE}`);\n logger.info(` Removed: ${removed.length} files`);\n } catch (err) {\n logger.error(`Failed to uninstall: ${(err as Error).message}`);\n logger.debug((err as Error).stack ?? '');\n process.exitCode = 1;\n }\n });\n","import { Command } from 'commander';\nimport { initCommand } from './init.js';\nimport { addCommand } from './add.js';\nimport { listCommand } from './list.js';\n\nexport const uiCommand = new Command('ui').description(\n '管理 teamix-evo ui 组件(源码注入式安装,shadcn 风格)',\n);\n\nuiCommand.addCommand(initCommand);\nuiCommand.addCommand(addCommand);\nuiCommand.addCommand(listCommand);\n","import { Command } from 'commander';\nimport * as prompts from '@clack/prompts';\nimport type { UiAliases } from '@teamix-evo/registry';\nimport { detectIde } from '../../ide/index.js';\nimport { runUiInit, DEFAULT_UI_ALIASES } from '../../core/ui-init.js';\nimport { logger } from '../../utils/logger.js';\n\ninterface InitOptions {\n yes?: boolean;\n components?: string;\n hooks?: string;\n utils?: string;\n lib?: string;\n iconLibrary?: string;\n tsx?: boolean;\n rsc?: boolean;\n}\n\nexport const initCommand = new Command('init')\n .description(\n '初始化 teamix-evo ui 配置(询问 aliases / iconLibrary / tsx / rsc)',\n )\n .option('-y, --yes', '使用默认值,跳过交互')\n .option(\n '--components <path>',\n '组件 alias 路径',\n DEFAULT_UI_ALIASES.components,\n )\n .option('--hooks <path>', 'hooks alias 路径', DEFAULT_UI_ALIASES.hooks)\n .option('--utils <path>', 'utils alias 路径', DEFAULT_UI_ALIASES.utils)\n .option('--lib <path>', 'lib alias 路径', DEFAULT_UI_ALIASES.lib)\n .option('--icon-library <name>', '默认 icon 库(声明性)', 'lucide')\n .option('--tsx', '使用 TSX', true)\n .option('--rsc', '使用 React Server Components')\n .action(async (opts: InitOptions) => {\n try {\n const ide = detectIde();\n const projectRoot = ide.getProjectRoot();\n\n const cfg = await resolveConfig(opts);\n\n const result = await runUiInit({\n projectRoot,\n aliases: cfg.aliases,\n iconLibrary: cfg.iconLibrary,\n tsx: cfg.tsx,\n rsc: cfg.rsc,\n ide: ide.name,\n });\n\n if (result.status === 'already-initialized') {\n logger.warn(\n 'UI already initialized. Edit `.teamix-evo/config.json` directly to change aliases, or run `teamix-evo ui list`.',\n );\n return;\n }\n\n logger.success('UI initialized.');\n logger.info(` components: ${result.aliases.components}`);\n logger.info(` hooks: ${result.aliases.hooks}`);\n logger.info(` utils: ${result.aliases.utils}`);\n logger.info(` lib: ${result.aliases.lib}`);\n logger.info(` iconLibrary: ${result.iconLibrary}`);\n logger.info(` tsx: ${result.tsx}, rsc: ${result.rsc}`);\n logger.info('');\n logger.info('Next: `npx teamix-evo ui add button`');\n } catch (err) {\n logger.error(`Failed to initialize ui: ${(err as Error).message}`);\n logger.debug((err as Error).stack ?? '');\n process.exitCode = 1;\n }\n });\n\ninterface ResolvedUiInit {\n aliases: UiAliases;\n iconLibrary: string;\n tsx: boolean;\n rsc: boolean;\n}\n\nasync function resolveConfig(opts: InitOptions): Promise<ResolvedUiInit> {\n if (opts.yes) {\n return {\n aliases: {\n components: opts.components ?? DEFAULT_UI_ALIASES.components,\n hooks: opts.hooks ?? DEFAULT_UI_ALIASES.hooks,\n utils: opts.utils ?? DEFAULT_UI_ALIASES.utils,\n lib: opts.lib ?? DEFAULT_UI_ALIASES.lib,\n },\n iconLibrary: opts.iconLibrary ?? 'lucide',\n tsx: opts.tsx ?? true,\n rsc: opts.rsc ?? false,\n };\n }\n\n const components = await prompts.text({\n message: 'components 路径(注入按钮等组件源码的目录)',\n initialValue: opts.components ?? DEFAULT_UI_ALIASES.components,\n });\n if (prompts.isCancel(components)) throw new Error('Cancelled by user.');\n\n const hooks = await prompts.text({\n message: 'hooks 路径',\n initialValue: opts.hooks ?? DEFAULT_UI_ALIASES.hooks,\n });\n if (prompts.isCancel(hooks)) throw new Error('Cancelled by user.');\n\n const utils = await prompts.text({\n message: 'utils 路径(cn 等工具)',\n initialValue: opts.utils ?? DEFAULT_UI_ALIASES.utils,\n });\n if (prompts.isCancel(utils)) throw new Error('Cancelled by user.');\n\n const lib = await prompts.text({\n message: 'lib 路径(共享代码根)',\n initialValue: opts.lib ?? DEFAULT_UI_ALIASES.lib,\n });\n if (prompts.isCancel(lib)) throw new Error('Cancelled by user.');\n\n const iconLibrary = await prompts.text({\n message: 'icon 库(声明性,组件源码已 hardcode lucide-react)',\n initialValue: opts.iconLibrary ?? 'lucide',\n });\n if (prompts.isCancel(iconLibrary)) throw new Error('Cancelled by user.');\n\n const tsxAns = await prompts.confirm({\n message: '使用 TSX?',\n initialValue: opts.tsx ?? true,\n });\n if (prompts.isCancel(tsxAns)) throw new Error('Cancelled by user.');\n\n const rscAns = await prompts.confirm({\n message: '使用 React Server Components?',\n initialValue: opts.rsc ?? false,\n });\n if (prompts.isCancel(rscAns)) throw new Error('Cancelled by user.');\n\n return {\n aliases: { components, hooks, utils, lib },\n iconLibrary,\n tsx: tsxAns,\n rsc: rscAns,\n };\n}\n","import type { ProjectConfig, UiAliases } from '@teamix-evo/registry';\nimport {\n ensureTeamixDir,\n readProjectConfig,\n writeProjectConfig,\n} from './state.js';\n\nexport const DEFAULT_UI_ALIASES: UiAliases = {\n components: 'src/components/ui',\n hooks: 'src/hooks',\n utils: 'src/lib/utils',\n lib: 'src/lib',\n};\n\nexport const DEFAULT_UI_ICON_LIBRARY = 'lucide';\n\nexport interface RunUiInitOptions {\n /** Absolute project root directory. */\n projectRoot: string;\n /** Component aliases. Falls back to {@link DEFAULT_UI_ALIASES}. */\n aliases?: Partial<UiAliases>;\n /** Declared icon library (does not trigger code rewrite). Defaults to \"lucide\". */\n iconLibrary?: string;\n /** Whether the project uses TSX (true) or JSX (false). Defaults to true. */\n tsx?: boolean;\n /** Whether the project emits React Server Components markers. Defaults to false. */\n rsc?: boolean;\n /** IDE identifier written into config.ide when bootstrapping a fresh config (defaults to \"qoder\"). */\n ide?: string;\n}\n\nexport type RunUiInitResult =\n | {\n status: 'installed';\n aliases: UiAliases;\n iconLibrary: string;\n tsx: boolean;\n rsc: boolean;\n }\n | {\n status: 'already-initialized';\n };\n\n/**\n * Programmatic equivalent of `teamix-evo ui init`.\n *\n * Writes `packages.ui` into `.teamix-evo/config.json` only — no resource files\n * are touched. Use {@link runUiAdd} afterwards to install component sources.\n */\nexport async function runUiInit(\n options: RunUiInitOptions,\n): Promise<RunUiInitResult> {\n const { projectRoot } = options;\n const ideIdent = options.ide ?? 'qoder';\n\n await ensureTeamixDir(projectRoot);\n\n const existingConfig = await readProjectConfig(projectRoot);\n if (existingConfig?.packages?.ui) {\n return { status: 'already-initialized' };\n }\n\n const aliases: UiAliases = {\n components: options.aliases?.components ?? DEFAULT_UI_ALIASES.components,\n hooks: options.aliases?.hooks ?? DEFAULT_UI_ALIASES.hooks,\n utils: options.aliases?.utils ?? DEFAULT_UI_ALIASES.utils,\n lib: options.aliases?.lib ?? DEFAULT_UI_ALIASES.lib,\n };\n const iconLibrary = options.iconLibrary ?? DEFAULT_UI_ICON_LIBRARY;\n const tsx = options.tsx ?? true;\n const rsc = options.rsc ?? false;\n\n const config: ProjectConfig = existingConfig ?? {\n $schema: 'https://teamix-evo.dev/schema/config/v1.json',\n schemaVersion: 1,\n ide: ideIdent,\n packages: {},\n };\n config.packages.ui = {\n variant: '_flat',\n version: '0.0.0',\n aliases,\n iconLibrary,\n tsx,\n rsc,\n };\n await writeProjectConfig(projectRoot, config);\n\n return {\n status: 'installed',\n aliases,\n iconLibrary,\n tsx,\n rsc,\n };\n}\n","import { Command } from 'commander';\nimport { detectIde } from '../../ide/index.js';\nimport { runUiAdd } from '../../core/ui-add.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const addCommand = new Command('add')\n .description(\n '安装一个或多个 ui entry(按 id,自动展开 registryDependencies)',\n )\n .argument('<ids...>', 'entry id 列表,如 \"button\" \"dialog\"')\n .option('--overwrite', '即使目标文件已存在也覆盖(绕过 frozen 跳过)')\n .action(async (ids: string[], opts: { overwrite?: boolean }) => {\n try {\n const ide = detectIde();\n const projectRoot = ide.getProjectRoot();\n\n logger.info(`Installing entries: ${ids.join(', ')}`);\n\n const result = await runUiAdd({\n projectRoot,\n ids,\n overwrite: opts.overwrite,\n });\n\n logger.success(\n `UI add complete: ${result.written} written, ${result.skipped} skipped, ${result.metaFiles.length} meta.`,\n );\n logger.info('');\n logger.info(`Resolved order: ${result.orderedIds.join(' → ')}`);\n\n const npmDeps = Object.entries(result.npmDependencies);\n if (npmDeps.length > 0) {\n logger.info('');\n logger.info('Install npm dependencies in your project:');\n const installCmd = npmDeps\n .map(([name, range]) => `${name}@${range}`)\n .join(' ');\n logger.info(` pnpm add ${installCmd}`);\n logger.info(` # or: npm install ${installCmd}`);\n }\n\n if (result.metaFiles.length > 0) {\n logger.info('');\n logger.info(\n 'Component meta dropped under .teamix-evo/design/components/ (AI-readable).',\n );\n }\n } catch (err) {\n const message = (err as Error).message;\n // Preserve the friendlier wording from the previous CLI for the\n // \"ui not initialized\" case.\n if (message.startsWith('UI not initialized')) {\n logger.error('UI not initialized. Run `npx teamix-evo ui init` first.');\n } else {\n logger.error(`Failed to add ui entries: ${message}`);\n }\n logger.debug((err as Error).stack ?? '');\n process.exitCode = 1;\n }\n });\n","import * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport { createRequire } from 'node:module';\nimport type { UiPackageManifest } from '@teamix-evo/registry';\nimport { loadUiPackageManifest } from '@teamix-evo/registry';\nimport { logger } from '../utils/logger.js';\n\nconst require = createRequire(import.meta.url);\n\nfunction resolvePackageRoot(packageName: string): string {\n const pkgJsonPath = require.resolve(`${packageName}/package.json`);\n return path.dirname(pkgJsonPath);\n}\n\n/**\n * Load the ui package manifest and optional shared `_data.json`.\n *\n * @param packageName - e.g. \"@teamix-evo/ui\"\n */\nexport async function loadUiData(packageName: string): Promise<{\n manifest: UiPackageManifest;\n data: Record<string, unknown>;\n packageRoot: string;\n}> {\n const packageRoot = resolvePackageRoot(packageName);\n\n logger.debug(`Resolved ui package root: ${packageRoot}`);\n\n const manifest = await loadUiPackageManifest(packageRoot);\n\n let data: Record<string, unknown> = {};\n const dataPath = path.join(packageRoot, '_data.json');\n try {\n const raw = await fs.readFile(dataPath, 'utf-8');\n data = JSON.parse(raw) as Record<string, unknown>;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw err;\n }\n logger.debug(`No _data.json found at ${dataPath}, using empty data`);\n }\n\n return { manifest, data, packageRoot };\n}\n","import * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport type {\n UiEntry,\n UiPackageManifest,\n UiAliases,\n InstalledResource,\n} from '@teamix-evo/registry';\nimport { resolveUiEntryOrder } from '@teamix-evo/registry';\nimport { writeFileSafe, fileExists } from '../utils/fs.js';\nimport { computeHash } from '../utils/hash.js';\nimport { rewriteImports } from '../utils/transform-imports.js';\nimport { logger } from '../utils/logger.js';\n\nexport interface UiInstallOptions {\n /** Project root directory */\n projectRoot: string;\n /** UI package manifest */\n manifest: UiPackageManifest;\n /** Absolute ui package root (used to resolve entry source paths) */\n packageRoot: string;\n /** Aliases configured in `packages.ui.aliases` */\n aliases: UiAliases;\n /** Entry ids the user explicitly requested to add */\n requested: string[];\n /** When true, skip writing entries whose target file already exists (frozen-on-add). */\n skipExisting?: boolean;\n}\n\nexport interface UiInstallResult {\n /** Ordered list of entry ids that were processed (deps + requested) */\n orderedIds: string[];\n /** Per-file install records (for InstalledManifest) */\n resources: InstalledResource[];\n /** Aggregate npm dependencies across the installed entries */\n npmDependencies: Record<string, string>;\n /** Number of files written */\n written: number;\n /** Number of files skipped because they already exist (frozen) */\n skipped: number;\n /** Meta files dropped under .teamix-evo/design/components/ */\n metaFiles: string[];\n}\n\nconst DESIGN_COMPONENTS_DIR = '.teamix-evo/design/components';\n\n/**\n * Install the requested ui entries (transitively resolving registryDependencies).\n * For frozen entries that already exist on disk, the write is skipped — shadcn-style.\n */\nexport async function installUiEntries(\n options: UiInstallOptions,\n): Promise<UiInstallResult> {\n const {\n projectRoot,\n manifest,\n packageRoot,\n aliases,\n requested,\n skipExisting = true,\n } = options;\n\n const orderedIds = resolveUiEntryOrder(manifest.entries, requested);\n const idToEntry = new Map(manifest.entries.map((e) => [e.id, e]));\n\n const resources: InstalledResource[] = [];\n const npmDeps: Record<string, string> = {};\n const metaFiles: string[] = [];\n let written = 0;\n let skipped = 0;\n\n for (const id of orderedIds) {\n const entry = idToEntry.get(id);\n if (!entry) continue;\n\n // Aggregate npm deps regardless of whether files were written — the user\n // may have manually deleted node_modules; we want to surface the full set.\n if (entry.dependencies) {\n for (const [name, range] of Object.entries(entry.dependencies)) {\n npmDeps[name] = range;\n }\n }\n\n for (const file of entry.files) {\n const targetAbs = resolveTargetPath(projectRoot, aliases, entry, file);\n const exists = await fileExists(targetAbs);\n\n if (\n exists &&\n skipExisting &&\n (entry.updateStrategy ?? 'frozen') === 'frozen'\n ) {\n logger.info(` skip (frozen, exists): ${rel(projectRoot, targetAbs)}`);\n skipped++;\n continue;\n }\n\n const sourceAbs = path.resolve(packageRoot, file.source);\n const raw = await fs.readFile(sourceAbs, 'utf-8');\n const transformed = rewriteImports(raw, aliases);\n await writeFileSafe(targetAbs, transformed);\n written++;\n logger.info(` write: ${rel(projectRoot, targetAbs)}`);\n\n resources.push({\n id: `${entry.id}:${file.targetName}`,\n target: targetAbs,\n hash: computeHash(transformed),\n strategy: entry.updateStrategy ?? 'frozen',\n });\n }\n\n // Drop the meta file under .teamix-evo/design/components/ if declared.\n if (entry.meta) {\n const metaSourceAbs = path.resolve(packageRoot, entry.meta);\n const metaContent = await fs.readFile(metaSourceAbs, 'utf-8');\n const metaTargetAbs = path.join(\n projectRoot,\n DESIGN_COMPONENTS_DIR,\n `${entry.id}.meta.md`,\n );\n await writeFileSafe(metaTargetAbs, metaContent);\n metaFiles.push(metaTargetAbs);\n resources.push({\n id: `${entry.id}:meta`,\n target: metaTargetAbs,\n hash: computeHash(metaContent),\n strategy: 'regenerable',\n });\n logger.info(` meta: ${rel(projectRoot, metaTargetAbs)}`);\n }\n }\n\n return {\n orderedIds,\n resources,\n npmDependencies: npmDeps,\n written,\n skipped,\n metaFiles,\n };\n}\n\nfunction resolveTargetPath(\n projectRoot: string,\n aliases: UiAliases,\n entry: UiEntry,\n file: { targetAlias: string; targetName: string },\n): string {\n const aliasDir = aliases[file.targetAlias as keyof UiAliases];\n if (!aliasDir) {\n throw new Error(\n `Entry \"${entry.id}\" requires alias \"${file.targetAlias}\" but it is not configured.`,\n );\n }\n return path.join(projectRoot, aliasDir, file.targetName);\n}\n\nfunction rel(projectRoot: string, abs: string): string {\n return path.relative(projectRoot, abs);\n}\n\n/**\n * Remove all installed ui resource files and prune empty parent directories.\n */\nexport async function removeUiFiles(\n records: InstalledResource[],\n): Promise<string[]> {\n const removed: string[] = [];\n for (const r of records) {\n try {\n await fs.unlink(r.target);\n removed.push(r.target);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') {\n logger.warn(`Failed to remove ${r.target}: ${(err as Error).message}`);\n }\n }\n }\n const parents = new Set(records.map((r) => path.dirname(r.target)));\n for (const dir of parents) {\n try {\n const entries = await fs.readdir(dir);\n if (entries.length === 0) await fs.rmdir(dir);\n } catch {\n /* ignore */\n }\n }\n return removed;\n}\n","import type { UiAliases } from '@teamix-evo/registry';\n\n/**\n * Map between the ui package's \"developer-time\" import roots and the user's\n * configured aliases. The keys are the source roots used inside ui source\n * files (e.g. `@/utils/cn` references `src/utils/`).\n */\nconst SOURCE_ROOT_TO_ALIAS_KEY: Record<string, keyof UiAliases> = {\n components: 'components',\n hooks: 'hooks',\n utils: 'utils',\n lib: 'lib',\n};\n\n/**\n * Rewrite import specifiers in a UI source file so that the developer-time\n * placeholders (e.g. `@/utils/cn`) resolve to the user's configured aliases\n * (e.g. `@/lib/utils/cn` when `aliases.utils === \"src/lib/utils\"`).\n *\n * Matches both static imports and dynamic imports of the form `@/<root>/<rest>`.\n * Bare `@/` (no segment) and unknown segments are left untouched.\n *\n * The rewrite uses each user alias verbatim. If the user alias begins with\n * `src/`, that prefix is stripped because TypeScript-style `@/*` → `src/*`\n * mappings expect paths relative to `src`.\n */\nexport function rewriteImports(source: string, aliases: UiAliases): string {\n return source.replace(\n /(['\"])@\\/([a-z][a-z0-9-]*)(\\/[^'\"]*)?\\1/g,\n (full, quote: string, root: string, rest: string | undefined) => {\n const aliasKey = SOURCE_ROOT_TO_ALIAS_KEY[root];\n if (!aliasKey) return full;\n const alias = aliases[aliasKey];\n const normalized = aliasToImportPath(alias);\n return `${quote}${normalized}${rest ?? ''}${quote}`;\n },\n );\n}\n\n/**\n * Convert an alias path (relative to the project root, e.g. `src/lib/utils`)\n * into an import-path prefix (`@/lib/utils`).\n *\n * Strips a leading `src/` so the path matches the convention of a `@/*` →\n * `src/*` tsconfig mapping. If the alias has a different prefix (for projects\n * that don't put code under `src/`), we keep it verbatim with `@/` prepended.\n */\nfunction aliasToImportPath(alias: string): string {\n const trimmed = alias.replace(/^\\.\\//, '').replace(/\\/$/, '');\n if (trimmed.startsWith('src/')) {\n return `@/${trimmed.slice('src/'.length)}`;\n }\n return `@/${trimmed}`;\n}\n","import type {\n InstalledManifest,\n InstalledResource,\n} from '@teamix-evo/registry';\nimport { loadUiData } from './ui-client.js';\nimport { installUiEntries } from './ui-installer.js';\nimport {\n readProjectConfig,\n writeProjectConfig,\n readInstalledManifest,\n writeInstalledManifest,\n} from './state.js';\n\nconst DEFAULT_UI_PACKAGE = '@teamix-evo/ui';\n\nexport interface RunUiAddOptions {\n /** Absolute project root directory. */\n projectRoot: string;\n /** Entry ids to install (registry dependencies are resolved transitively). */\n ids: string[];\n /** When true, overwrite frozen entries that already exist on disk. */\n overwrite?: boolean;\n /** Override the ui package name (defaults to \"@teamix-evo/ui\"). */\n packageName?: string;\n}\n\nexport interface RunUiAddResult {\n packageName: string;\n /** Registered ids in install order (deps + requested). */\n orderedIds: string[];\n /** Number of files written. */\n written: number;\n /** Number of files skipped due to frozen + exists. */\n skipped: number;\n /** Meta files dropped under .teamix-evo/design/components/. */\n metaFiles: string[];\n /** Aggregate npm dependencies of the installed entries. */\n npmDependencies: Record<string, string>;\n /** Per-file install records merged into the installed manifest. */\n resources: InstalledResource[];\n}\n\n/**\n * Programmatic equivalent of `teamix-evo ui add <ids...>`.\n *\n * Requires `packages.ui` to already exist in `.teamix-evo/config.json`\n * (i.e. {@link runUiInit} was called earlier).\n */\nexport async function runUiAdd(\n options: RunUiAddOptions,\n): Promise<RunUiAddResult> {\n const { projectRoot, ids, overwrite } = options;\n const packageName = options.packageName ?? DEFAULT_UI_PACKAGE;\n\n if (ids.length === 0) {\n throw new Error('At least one entry id must be provided.');\n }\n\n const config = await readProjectConfig(projectRoot);\n const uiCfg = config?.packages?.ui;\n if (!config || !uiCfg?.aliases) {\n throw new Error(\n 'UI not initialized. Run `runUiInit` (or `teamix-evo ui init`) first.',\n );\n }\n\n const { manifest, packageRoot } = await loadUiData(packageName);\n\n const knownIds = new Set(manifest.entries.map((e) => e.id));\n const unknown = ids.filter((id) => !knownIds.has(id));\n if (unknown.length > 0) {\n throw new Error(\n `Unknown entry id(s): ${unknown\n .map((s) => `\"${s}\"`)\n .join(', ')}. Run \\`teamix-evo ui list\\` to see options.`,\n );\n }\n\n const result = await installUiEntries({\n projectRoot,\n manifest,\n packageRoot,\n aliases: uiCfg.aliases,\n requested: ids,\n skipExisting: !overwrite,\n });\n\n const installed: InstalledManifest = (await readInstalledManifest(\n projectRoot,\n )) ?? { schemaVersion: 1, installed: [] };\n\n const idx = installed.installed.findIndex((p) => p.package === packageName);\n const prior = idx >= 0 ? installed.installed[idx] : null;\n const mergedResources = mergeResources(\n prior?.resources ?? [],\n result.resources,\n );\n\n const entry = {\n package: packageName,\n variant: '_flat',\n version: manifest.version,\n installedAt: new Date().toISOString(),\n resources: mergedResources,\n };\n if (idx >= 0) installed.installed[idx] = entry;\n else installed.installed.push(entry);\n await writeInstalledManifest(projectRoot, installed);\n\n if (uiCfg.version !== manifest.version) {\n uiCfg.version = manifest.version;\n await writeProjectConfig(projectRoot, config);\n }\n\n return {\n packageName,\n orderedIds: result.orderedIds,\n written: result.written,\n skipped: result.skipped,\n metaFiles: result.metaFiles,\n npmDependencies: result.npmDependencies,\n resources: result.resources,\n };\n}\n\nfunction mergeResources<T extends { id: string }>(prior: T[], next: T[]): T[] {\n const merged = new Map<string, T>();\n for (const r of prior) merged.set(r.id, r);\n for (const r of next) merged.set(r.id, r);\n return Array.from(merged.values());\n}\n","import { Command } from 'commander';\nimport { detectIde } from '../../ide/index.js';\nimport { runUiList } from '../../core/ui-list.js';\nimport { logger } from '../../utils/logger.js';\n\nexport const listCommand = new Command('list')\n .description('列出 @teamix-evo/ui 的所有 entry 及已安装状态')\n .option('--installed', '仅展示已安装的 entry')\n .action(async (opts: { installed?: boolean }) => {\n try {\n const ide = detectIde();\n const projectRoot = ide.getProjectRoot();\n\n const { entries, total, installedCount } = await runUiList({\n projectRoot,\n installedOnly: opts.installed,\n });\n\n if (entries.length === 0) {\n logger.info(\n opts.installed\n ? 'No ui entries installed.'\n : 'No ui entries available.',\n );\n return;\n }\n\n const idWidth = Math.max(...entries.map((e) => e.id.length), 4);\n const typeWidth = Math.max(...entries.map((e) => e.type.length), 4);\n\n logger.info(\n `${'ID'.padEnd(idWidth)} ${'TYPE'.padEnd(\n typeWidth,\n )} STATUS DESCRIPTION`,\n );\n logger.info(\n `${'─'.repeat(idWidth)} ${'─'.repeat(\n typeWidth,\n )} ─────── ───────────`,\n );\n\n for (const e of entries) {\n const status = e.installed ? 'INSTALLED' : '–';\n logger.info(\n `${e.id.padEnd(idWidth)} ${e.type.padEnd(\n typeWidth,\n )} ${status.padEnd(7)} ${e.description}`,\n );\n }\n\n logger.info('');\n logger.info(\n `Total: ${total} entr${\n total === 1 ? 'y' : 'ies'\n }, ${installedCount} installed.`,\n );\n } catch (err) {\n logger.error(`Failed to list ui entries: ${(err as Error).message}`);\n logger.debug((err as Error).stack ?? '');\n process.exitCode = 1;\n }\n });\n","import type { UiEntry } from '@teamix-evo/registry';\nimport { loadUiData } from './ui-client.js';\nimport { readInstalledManifest } from './state.js';\n\nconst DEFAULT_UI_PACKAGE = '@teamix-evo/ui';\n\nexport interface RunUiListOptions {\n /** Absolute project root directory. */\n projectRoot: string;\n /** When true, only return entries that are already installed. */\n installedOnly?: boolean;\n /** Override the ui package name (defaults to \"@teamix-evo/ui\"). */\n packageName?: string;\n}\n\nexport interface UiEntryListItem {\n id: string;\n type: UiEntry['type'];\n description: string;\n installed: boolean;\n}\n\nexport interface RunUiListResult {\n packageName: string;\n /** Total number of entries declared by the package manifest. */\n total: number;\n /** Number of installed entries (based on the project's installed manifest). */\n installedCount: number;\n /** Filtered + decorated entries. */\n entries: UiEntryListItem[];\n}\n\n/**\n * Programmatic equivalent of `teamix-evo ui list`.\n *\n * Returns structured data; the CLI command formats it for terminal output.\n */\nexport async function runUiList(\n options: RunUiListOptions,\n): Promise<RunUiListResult> {\n const { projectRoot, installedOnly } = options;\n const packageName = options.packageName ?? DEFAULT_UI_PACKAGE;\n\n const { manifest } = await loadUiData(packageName);\n const installedManifest = await readInstalledManifest(projectRoot);\n\n const installedIds = new Set<string>();\n const uiPkg = installedManifest?.installed.find(\n (p) => p.package === packageName,\n );\n for (const r of uiPkg?.resources ?? []) {\n const colon = r.id.indexOf(':');\n installedIds.add(colon >= 0 ? r.id.slice(0, colon) : r.id);\n }\n\n const entries: UiEntryListItem[] = manifest.entries\n .filter((e) => !installedOnly || installedIds.has(e.id))\n .map((e) => ({\n id: e.id,\n type: e.type,\n description: e.description,\n installed: installedIds.has(e.id),\n }));\n\n return {\n packageName,\n total: manifest.entries.length,\n installedCount: installedIds.size,\n entries,\n };\n}\n"],"mappings":";;;AAAA,SAAS,WAAAA,iBAAe;AACxB,SAAS,iBAAAC,sBAAqB;;;ACD9B,SAAS,WAAAC,gBAAe;;;ACAxB,SAAS,eAAe;;;ACAxB,YAAY,QAAQ;AACpB,YAAY,UAAU;AAUf,IAAM,eAAN,MAAyC;AAAA,EACrC,OAAO;AAAA,EACP,OAAO;AAAA,EAEhB,iBAAyB;AACvB,WAAO,QAAQ,IAAI;AAAA,EACrB;AAAA,EAEA,YAAqB;AAEnB,WAAO;AAAA,EACT;AAAA,EAEA,kBACE,WACA,OACA,aACQ;AACR,UAAM,OACJ,UAAU,WACD,UAAQ,WAAQ,GAAG,QAAQ,IAC3B,UAAK,eAAe,KAAK,eAAe,GAAG,QAAQ;AAC9D,WAAY,UAAK,MAAM,UAAU,SAAS;AAAA,EAC5C;AACF;;;ACnCA,YAAYC,SAAQ;AACpB,YAAYC,WAAU;AAUf,IAAM,gBAAN,MAA0C;AAAA,EACtC,OAAO;AAAA,EACP,OAAO;AAAA,EAEhB,iBAAyB;AACvB,WAAO,QAAQ,IAAI;AAAA,EACrB;AAAA,EAEA,YAAqB;AAEnB,WAAO,QAAQ,QAAQ,IAAI,UAAU;AAAA,EACvC;AAAA,EAEA,kBACE,WACA,OACA,aACQ;AACR,UAAM,OACJ,UAAU,WACD,WAAQ,YAAQ,GAAG,SAAS,IAC5B,WAAK,eAAe,KAAK,eAAe,GAAG,SAAS;AAC/D,WAAY,WAAK,MAAM,UAAU,SAAS;AAAA,EAC5C;AACF;;;ACzBO,IAAM,gBAAqC,CAAC,SAAS,QAAQ;AAK7D,SAAS,WAAW,MAA4B;AACrD,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,IAAI,aAAa;AAAA,IAC1B,KAAK;AACH,aAAO,IAAI,cAAc;AAAA,IAC3B,SAAS;AACP,YAAM,cAAqB;AAC3B,YAAM,IAAI,MAAM,yBAAyB,WAAqB,EAAE;AAAA,IAClE;AAAA,EACF;AACF;AAMO,SAAS,YAAwB;AACtC,QAAM,SAAS,IAAI,cAAc;AACjC,MAAI,OAAO,UAAU,EAAG,QAAO;AAC/B,SAAO,IAAI,aAAa;AAC1B;;;ACpCA,YAAYC,WAAU;AACtB,YAAY,QAAQ;AACpB,SAAS,qBAAqB;AAE9B,SAAS,2BAA2B;;;ACJpC,SAAS,KAAK,QAAQ,MAAM,OAAO,YAAY;AAE/C,IAAM,UAAU,QAAQ,IAAI,iBAAiB;AAEtC,IAAM,SAAS;AAAA,EACpB,KAAK,KAAmB;AACtB,YAAQ,IAAI,KAAK,QAAG,GAAG,GAAG;AAAA,EAC5B;AAAA,EAEA,KAAK,KAAmB;AACtB,YAAQ,KAAK,OAAO,QAAG,GAAG,GAAG;AAAA,EAC/B;AAAA,EAEA,MAAM,KAAmB;AACvB,YAAQ,MAAM,IAAI,QAAG,GAAG,GAAG;AAAA,EAC7B;AAAA,EAEA,QAAQ,KAAmB;AACzB,YAAQ,IAAI,MAAM,QAAG,GAAG,GAAG;AAAA,EAC7B;AAAA,EAEA,MAAM,KAAmB;AACvB,QAAI,SAAS;AACX,cAAQ,IAAI,KAAK,QAAG,GAAG,KAAK,GAAG,CAAC;AAAA,IAClC;AAAA,EACF;AACF;;;ADnBA,IAAMC,WAAU,cAAc,YAAY,GAAG;AAK7C,SAAS,mBAAmB,aAA6B;AACvD,QAAM,cAAcA,SAAQ,QAAQ,GAAG,WAAW,eAAe;AACjE,SAAY,cAAQ,WAAW;AACjC;AAyBA,eAAsB,gBACpB,aACA,SAMC;AACD,QAAM,cAAc,mBAAmB,WAAW;AAClD,QAAM,aAAkB,WAAK,aAAa,WAAW,OAAO;AAE5D,SAAO,MAAM,yBAAyB,UAAU,EAAE;AAClD,SAAO,MAAM,iBAAiB,WAAW,EAAE;AAG3C,QAAM,WAAW,MAAM,oBAAoB,UAAU;AAGrD,MAAI,OAAgC,CAAC;AACrC,QAAM,WAAgB,WAAK,YAAY,YAAY;AACnD,MAAI;AACF,UAAM,MAAM,MAAS,YAAS,UAAU,OAAO;AAC/C,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,SAAS,KAAK;AACZ,QAAK,IAA8B,SAAS,UAAU;AACpD,YAAM;AAAA,IACR;AACA,WAAO,MAAM,0BAA0B,QAAQ,oBAAoB;AAAA,EACrE;AAEA,SAAO,EAAE,UAAU,MAAM,YAAY,YAAY;AACnD;;;AExEA,YAAYC,WAAU;AACtB,YAAYC,SAAQ;;;ACDpB,YAAYC,SAAQ;AACpB,YAAYC,WAAU;AAMtB,eAAsB,UAAU,KAA4B;AAC1D,QAAS,UAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AACzC;AAKA,eAAsB,cACpB,UACA,SACe;AACf,QAAM,MAAW,cAAQ,QAAQ;AACjC,QAAM,UAAU,GAAG;AACnB,QAAM,MAAM,WAAW;AACvB,QAAS,cAAU,KAAK,SAAS,OAAO;AACxC,QAAS,WAAO,KAAK,QAAQ;AAC/B;AAKA,eAAsB,eACpB,UACwB;AACxB,MAAI;AACF,WAAO,MAAS,aAAS,UAAU,OAAO;AAAA,EAC5C,SAAS,KAAK;AACZ,QAAK,IAA8B,SAAS,UAAU;AACpD,aAAO;AAAA,IACT;AACA,UAAM;AAAA,EACR;AACF;AAKA,eAAsB,WACpB,UACA,aACe;AACf,QAAM,UAAU,MAAM,eAAe,QAAQ;AAC7C,MAAI,YAAY,MAAM;AACpB,WAAO,MAAM,gBAAgB,QAAQ,iBAAiB;AACtD;AAAA,EACF;AAEA,QAAMC,OAAW,eAAS,aAAa,QAAQ;AAC/C,QAAM,aAAY,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,SAAS,GAAG;AAC/D,QAAM,aAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAGA,IAAG,IAAI,SAAS;AAAA,EACrB;AAEA,QAAM,UAAe,cAAQ,UAAU,CAAC;AACxC,QAAS,cAAU,YAAY,SAAS,OAAO;AAC/C,SAAO,MAAM,aAAaA,IAAG,WAAW,eAAS,aAAa,UAAU,CAAC,EAAE;AAC7E;AAKA,eAAsB,WAAW,UAAoC;AACnE,MAAI;AACF,UAAS,WAAO,QAAQ;AACxB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AC9EA,SAAS,kBAAkB;AAMpB,SAAS,YAAY,SAAyB;AACnD,QAAM,OAAO,WAAW,QAAQ,EAAE,OAAO,SAAS,OAAO,EAAE,OAAO,KAAK;AACvE,SAAO,UAAU,IAAI;AACvB;;;ACTA,OAAO,gBAAgB;AACvB,YAAYC,SAAQ;AAGpB,WAAW,eAAe,aAAa,CAAC,QAAiB;AACvD,SAAO,OAAO,QAAQ,WAClB,IAAI,YAAY,IAChB,OAAO,OAAO,EAAE,EAAE,YAAY;AACpC,CAAC;AAGD,IAAM,gBAAgB,oBAAI,IAAwC;AAClE,IAAM,iBAAiB;AAEvB,SAAS,oBACP,iBAC4B;AAC5B,MAAI,WAAW,cAAc,IAAI,eAAe;AAChD,MAAI,CAAC,UAAU;AACb,QAAI,cAAc,QAAQ,gBAAgB;AAExC,YAAM,WAAW,cAAc,KAAK,EAAE,KAAK,EAAE;AAC7C,oBAAc,OAAO,QAAQ;AAAA,IAC/B;AACA,eAAW,WAAW,QAAQ,iBAAiB,EAAE,UAAU,KAAK,CAAC;AACjE,kBAAc,IAAI,iBAAiB,QAAQ;AAAA,EAC7C;AACA,SAAO;AACT;AAKO,SAAS,eACd,iBACA,MACQ;AACR,QAAM,WAAW,oBAAoB,eAAe;AACpD,SAAO,SAAS,IAAI;AACtB;AAKA,eAAsB,iBAAiB,UAAmC;AACxE,SAAU,aAAS,UAAU,OAAO;AACtC;;;AC9CA,YAAYC,WAAU;AACtB,YAAYC,SAAQ;AAKb,SAAS,kBACd,QACA,YACA,aACQ;AACR,MAAI,OAAO,WAAW,YAAY,GAAG;AACnC,WAAY,WAAK,aAAa,MAAM;AAAA,EACtC;AACA,SAAY,WAAK,YAAY,MAAM;AACrC;AAKA,eAAsB,QAAQ,KAAgC;AAC5D,QAAM,QAAkB,CAAC;AACzB,QAAM,UAAU,MAAS,YAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAE7D,aAAW,SAAS,SAAS;AAC3B,UAAM,WAAgB,WAAK,KAAK,MAAM,IAAI;AAC1C,QAAI,MAAM,YAAY,GAAG;AACvB,YAAM,KAAK,GAAI,MAAM,QAAQ,QAAQ,CAAE;AAAA,IACzC,WAAW,MAAM,OAAO,GAAG;AACzB,YAAM,KAAK,QAAQ;AAAA,IACrB;AAAA,EACF;AAEA,SAAO;AACT;;;AJEA,eAAsB,iBACpB,SACwB;AACxB,QAAM,EAAE,aAAa,UAAU,MAAM,YAAY,YAAY,IAAI;AACjE,QAAM,qBAA0C,CAAC;AAEjD,aAAW,YAAY,SAAS,WAAW;AACzC,WAAO,MAAM,wBAAwB,SAAS,EAAE,WAAM,SAAS,MAAM,EAAE;AAEvE,QAAI,SAAS,WAAW;AACtB,YAAM,UAAU,MAAM;AAAA,QACpB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,yBAAmB,KAAK,GAAG,OAAO;AAAA,IACpC,OAAO;AACL,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,yBAAmB,KAAK,MAAM;AAAA,IAChC;AAAA,EACF;AAEA,SAAO;AAAA,IACL,WAAW;AAAA,IACX,OAAO,mBAAmB;AAAA,EAC5B;AACF;AAKA,eAAe,sBACb,UACA,aACA,MACA,YACA,aAC4B;AAC5B,QAAM,aAAa;AAAA,IACjB,SAAS;AAAA,IACT;AAAA,IACA;AAAA,EACF;AACA,QAAM,aAAkB,WAAK,aAAa,SAAS,MAAM;AAEzD,MAAI;AACJ,MAAI,SAAS,UAAU;AACrB,UAAM,kBAAkB,MAAM,iBAAiB,UAAU;AACzD,cAAU,eAAe,iBAAiB,IAAI;AAAA,EAChD,OAAO;AACL,cAAU,MAAS,aAAS,YAAY,OAAO;AAAA,EACjD;AAEA,QAAM,cAAc,YAAY,OAAO;AACvC,QAAM,OAAO,YAAY,OAAO;AAEhC,SAAO,MAAM,cAAc,SAAS,MAAM,KAAK,SAAS,cAAc,GAAG;AAEzE,SAAO;AAAA,IACL,IAAI,SAAS;AAAA,IACb,QAAQ,SAAS;AAAA,IACjB;AAAA,IACA,UAAU,SAAS;AAAA,EACrB;AACF;AAKA,eAAe,yBACb,UACA,aACA,MACA,YACA,aAC8B;AAC9B,QAAM,aAAa;AAAA,IACjB,SAAS;AAAA,IACT;AAAA,IACA;AAAA,EACF;AACA,QAAM,YAAiB,WAAK,aAAa,SAAS,MAAM;AACxD,QAAM,UAA+B,CAAC;AAEtC,QAAM,UAAU,SAAS;AAEzB,QAAM,UAAU,MAAM,QAAQ,UAAU;AACxC,aAAW,SAAS,SAAS;AAC3B,UAAM,UAAe,eAAS,YAAY,KAAK;AAC/C,QAAI,aAAkB,WAAK,WAAW,OAAO;AAG7C,QAAI,SAAS,YAAY,WAAW,SAAS,MAAM,GAAG;AACpD,mBAAa,WAAW,MAAM,GAAG,EAAE;AAAA,IACrC;AAEA,QAAI;AACJ,QAAI,SAAS,YAAY,MAAM,SAAS,MAAM,GAAG;AAC/C,YAAM,kBAAkB,MAAM,iBAAiB,KAAK;AACpD,gBAAU,eAAe,iBAAiB,IAAI;AAAA,IAChD,OAAO;AACL,gBAAU,MAAS,aAAS,OAAO,OAAO;AAAA,IAC5C;AAEA,UAAM,cAAc,YAAY,OAAO;AACvC,UAAM,OAAO,YAAY,OAAO;AAChC,UAAM,YAAiB,eAAS,aAAa,UAAU;AAEvD,YAAQ,KAAK;AAAA,MACX,IAAI,GAAG,SAAS,EAAE,IAAI,OAAO;AAAA,MAC7B,QAAQ;AAAA,MACR;AAAA,MACA,UAAU,SAAS;AAAA,IACrB,CAAC;AAED,WAAO,MAAM,cAAc,SAAS,EAAE;AAAA,EACxC;AAEA,SAAO;AACT;;;AKnKA,YAAYC,WAAU;AAEtB,SAAS,gBAAgB,yBAAyB;AAIlD,IAAM,aAAa;AACnB,IAAM,cAAc;AACpB,IAAM,gBAAgB;AAKf,SAAS,aAAa,aAA6B;AACxD,SAAY,WAAK,aAAa,UAAU;AAC1C;AAKA,eAAsB,gBAAgB,aAAsC;AAC1E,QAAM,MAAM,aAAa,WAAW;AACpC,QAAM,UAAU,GAAG;AACnB,SAAO;AACT;AAMA,eAAsB,kBACpB,aAC+B;AAC/B,QAAM,aAAkB,WAAK,aAAa,YAAY,WAAW;AACjE,QAAM,MAAM,MAAM,eAAe,UAAU;AAC3C,MAAI,QAAQ,KAAM,QAAO;AAEzB,MAAI;AACF,UAAM,OAAO,KAAK,MAAM,GAAG;AAC3B,UAAM,SAAS,eAAe,IAAI;AAClC,QAAI,CAAC,OAAO,SAAS;AACnB,aAAO,KAAK,wBAAwB,OAAO,KAAK,EAAE;AAClD,aAAO;AAAA,IACT;AACA,WAAO,OAAO;AAAA,EAChB,SAAS,KAAK;AACZ,WAAO,KAAK,gCAAiC,IAAc,OAAO,EAAE;AACpE,WAAO;AAAA,EACT;AACF;AAKA,eAAsB,mBACpB,aACA,QACe;AACf,QAAM,aAAkB,WAAK,aAAa,YAAY,WAAW;AACjE,QAAM,cAAc,YAAY,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAI,IAAI;AACtE,SAAO,MAAM,uBAAkB,UAAU,EAAE;AAC7C;AAMA,eAAsB,sBACpB,aACmC;AACnC,QAAM,eAAoB,WAAK,aAAa,YAAY,aAAa;AACrE,QAAM,MAAM,MAAM,eAAe,YAAY;AAC7C,MAAI,QAAQ,KAAM,QAAO;AAEzB,MAAI;AACF,UAAM,OAAO,KAAK,MAAM,GAAG;AAC3B,UAAM,SAAS,kBAAkB,IAAI;AACrC,QAAI,CAAC,OAAO,SAAS;AACnB,aAAO,KAAK,0BAA0B,OAAO,KAAK,EAAE;AACpD,aAAO;AAAA,IACT;AACA,WAAO,OAAO;AAAA,EAChB,SAAS,KAAK;AACZ,WAAO,KAAK,kCAAmC,IAAc,OAAO,EAAE;AACtE,WAAO;AAAA,EACT;AACF;AAKA,eAAsB,uBACpB,aACA,UACe;AACf,QAAM,eAAoB,WAAK,aAAa,YAAY,aAAa;AACrE,QAAM,cAAc,cAAc,KAAK,UAAU,UAAU,MAAM,CAAC,IAAI,IAAI;AAC1E,SAAO,MAAM,yBAAoB,YAAY,EAAE;AACjD;;;ACnFA,IAAM,yBAAyB;AAwC/B,eAAsB,cACpB,SAC8B;AAC9B,QAAM,EAAE,aAAa,SAAS,UAAU,IAAI,IAAI;AAChD,QAAM,cAAc,QAAQ,eAAe;AAE3C,QAAM,gBAAgB,WAAW;AAEjC,QAAM,iBAAiB,MAAM,kBAAkB,WAAW;AAC1D,MAAI,gBAAgB,UAAU,QAAQ;AACpC,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,iBAAiB,eAAe,SAAS,OAAO;AAAA,IAClD;AAAA,EACF;AAEA,QAAM,EAAE,UAAU,MAAM,YAAY,YAAY,IAAI,MAAM;AAAA,IACxD;AAAA,IACA;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,iBAAiB;AAAA,IACpC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,SAAwB;AAAA,IAC5B,SAAS;AAAA,IACT,eAAe;AAAA,IACf;AAAA,IACA,UAAU;AAAA,MACR,QAAQ;AAAA,QACN;AAAA,QACA,SAAS,SAAS;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,QAAM,mBAAmB,aAAa,MAAM;AAE5C,QAAM,oBAAuC;AAAA,IAC3C,eAAe;AAAA,IACf,WAAW;AAAA,MACT;AAAA,QACE,SAAS;AAAA,QACT;AAAA,QACA,SAAS,SAAS;AAAA,QAClB,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,QACpC,WAAW,OAAO;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AACA,QAAM,uBAAuB,aAAa,iBAAiB;AAE3D,SAAO;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,SAAS,SAAS;AAAA,IAClB;AAAA,IACA,OAAO,OAAO;AAAA,IACd,WAAW,OAAO;AAAA,EACpB;AACF;;;AZnHA,IAAM,kBAAkB;AACxB,IAAM,mBAAoC;AAE1C,SAAS,kBAAkB,OAA4C;AACrE,MAAI,UAAU,OAAW,QAAO;AAChC,QAAM,QAAQ,MAAM,YAAY;AAChC,MAAI,UAAU,QAAQ,UAAU,IAAK,QAAO;AAC5C,MAAI,UAAU,QAAQ,UAAU,IAAK,QAAO;AAC5C,QAAM,IAAI;AAAA,IACR,8BAA8B,KAAK;AAAA,EACrC;AACF;AAEO,IAAM,cAAc,IAAI,QAAQ,MAAM,EAC1C,YAAY,wDAAW,EACvB,SAAS,aAAa,wCAAU,eAAe,EAC/C;AAAA,EACC;AAAA,EACA;AAAA,EACA;AACF,EACC,OAAO,OAAO,SAAiB,SAAgC;AAC9D,MAAI;AACF,UAAM,WAAW,kBAAkB,KAAK,QAAQ;AAChD,UAAM,MAAM,UAAU;AACtB,UAAM,cAAc,IAAI,eAAe;AAEvC,WAAO;AAAA,MACL,wCAAwC,OAAO,gBAAgB,QAAQ;AAAA,IACzE;AACA,WAAO,MAAM,iBAAiB,WAAW,EAAE;AAC3C,WAAO,MAAM,QAAQ,IAAI,IAAI,EAAE;AAE/B,WAAO,KAAK,oBAAoB,OAAO,MAAM;AAC7C,WAAO,KAAK,yBAAyB;AAErC,UAAM,SAAS,MAAM,cAAc;AAAA,MACjC;AAAA,MACA;AAAA,MACA;AAAA,MACA,KAAK,IAAI;AAAA,IACX,CAAC;AAED,QAAI,OAAO,WAAW,uBAAuB;AAC3C,aAAO;AAAA,QACL,+CAA+C,OAAO,eAAe;AAAA,MAEvE;AACA;AAAA,IACF;AAEA,WAAO;AAAA,MACL,8BAA8B,OAAO,WAAW,KAAK,OAAO,OAAO;AAAA,IACrE;AACA,WAAO,KAAK,eAAe,OAAO,OAAO,EAAE;AAC3C,WAAO,KAAK,eAAe,OAAO,QAAQ,EAAE;AAC5C,WAAO,KAAK,gBAAgB,OAAO,KAAK,kBAAkB;AAC1D,WAAO,KAAK,EAAE;AACd,WAAO,KAAK,2DAA2D;AAAA,EACzE,SAAS,KAAK;AACZ,WAAO,MAAM,yBAA0B,IAAc,OAAO,EAAE;AAC9D,WAAO,MAAO,IAAc,SAAS,EAAE;AACvC,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;;;AatEH,SAAS,WAAAC,gBAAe;;;ACAxB,YAAYC,WAAU;AACtB,YAAYC,SAAQ;AAOpB,SAAS,iBAAiB,4BAA4B;AA6CtD,eAAsB,gBACpB,SACuB;AACvB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,mBAAwC,CAAC;AAC/C,QAAM,UAAU,EAAE,aAAa,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,EAAE;AAGrE,QAAM,eAAe,kBAAkB,UAAU;AAAA,IAC/C,CAAC,MAAM,EAAE,YAAY,eAAe,EAAE,YAAY,SAAS;AAAA,EAC7D;AACA,QAAM,eAAe,oBAAI,IAA+B;AACxD,MAAI,cAAc;AAChB,eAAW,OAAO,aAAa,WAAW;AACxC,mBAAa,IAAI,IAAI,IAAI,GAAG;AAAA,IAC9B;AAAA,EACF;AAEA,aAAW,YAAY,SAAS,WAAW;AACzC,QAAI,SAAS,WAAW;AAEtB,YAAM,UAAU,MAAM;AAAA,QACpB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,uBAAiB,KAAK,GAAG,OAAO;AAAA,IAClC,OAAO;AACL,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,uBAAiB,KAAK,MAAM;AAAA,IAC9B;AAAA,EACF;AAEA,SAAO,EAAE,WAAW,kBAAkB,QAAQ;AAChD;AAEA,eAAe,qBACb,UACA,aACA,MACA,YACA,aACA,cACA,SAC4B;AAC5B,QAAM,aAAkB,WAAK,aAAa,SAAS,MAAM;AACzD,QAAM,SAAS,MAAM,WAAW,UAAU;AAC1C,QAAM,YAAY,aAAa,IAAI,SAAS,EAAE;AAG9C,QAAM,aAAa;AAAA,IACjB,SAAS;AAAA,IACT;AAAA,IACA;AAAA,EACF;AACA,MAAI;AACJ,MAAI,SAAS,UAAU;AACrB,UAAM,kBAAkB,MAAM,iBAAiB,UAAU;AACzD,iBAAa,eAAe,iBAAiB,IAAI;AAAA,EACnD,OAAO;AACL,iBAAa,MAAS,aAAS,YAAY,OAAO;AAAA,EACpD;AAEA,QAAM,UAAU,YAAY,UAAU;AAEtC,QAAM,SAAS,gBAAgB,SAAS,gBAAgB;AAAA,IACtD;AAAA,IACA,MAAM;AAAA,IACN,aAAa,WAAW;AAAA,EAC1B,CAAC;AAED,UAAQ,QAAQ;AAAA,IACd,KAAK,QAAQ;AACX,aAAO,MAAM,WAAW,SAAS,MAAM,KAAK,SAAS,cAAc,GAAG;AACtE,cAAQ;AACR,aACE,aAAa;AAAA,QACX,IAAI,SAAS;AAAA,QACb,QAAQ,SAAS;AAAA,QACjB,MAAM;AAAA,QACN,UAAU,SAAS;AAAA,MACrB;AAAA,IAEJ;AAAA,IAEA,KAAK,aAAa;AAChB,UAAI,QAAQ;AACV,cAAM,WAAW,YAAY,WAAW;AACxC,gBAAQ;AAAA,MACV,OAAO;AACL,gBAAQ;AAAA,MACV;AACA,YAAM,cAAc,YAAY,UAAU;AAC1C,aAAO,MAAM,KAAK,SAAS,cAAc,QAAQ,KAAK,SAAS,MAAM,EAAE;AACvE,aAAO;AAAA,QACL,IAAI,SAAS;AAAA,QACb,QAAQ,SAAS;AAAA,QACjB,MAAM;AAAA,QACN,UAAU,SAAS;AAAA,MACrB;AAAA,IACF;AAAA,IAEA,KAAK,kBAAkB;AACrB,YAAM,iBAAiB,MAAM,eAAe,UAAU;AACtD,UAAI,mBAAmB,MAAM;AAE3B,cAAM,cAAc,YAAY,UAAU;AAC1C,gBAAQ;AACR,eAAO;AAAA,UACL,IAAI,SAAS;AAAA,UACb,QAAQ,SAAS;AAAA,UACjB,MAAM,YAAY,UAAU;AAAA,UAC5B,UAAU,SAAS;AAAA,QACrB;AAAA,MACF;AAGA,UAAI,iBAAiB;AACrB,YAAM,YAAY,SAAS,kBAAkB,CAAC;AAE9C,iBAAW,YAAY,WAAW;AAEhC,cAAM,gBAAgB,IAAI;AAAA,UACxB,qCAAqC;AAAA,YACnC;AAAA,UACF,CAAC,oDAAoD;AAAA,YACnD;AAAA,UACF,CAAC;AAAA,QACH;AACA,cAAM,QAAQ,WAAW,MAAM,aAAa;AAC5C,YAAI,OAAO;AACT,gBAAM,gBAAgB,MAAM,CAAC,EAAE,QAAQ,OAAO,EAAE,EAAE,QAAQ,OAAO,EAAE;AACnE,cAAI;AACF,6BAAiB;AAAA,cACf;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF,QAAQ;AACN,mBAAO;AAAA,cACL,mBAAmB,QAAQ,kBAAkB,SAAS,MAAM;AAAA,YAC9D;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,YAAM,WAAW,YAAY,WAAW;AACxC,YAAM,cAAc,YAAY,cAAc;AAC9C,cAAQ;AAER,aAAO;AAAA,QACL,IAAI,SAAS;AAAA,QACb,QAAQ,SAAS;AAAA,QACjB,MAAM,YAAY,cAAc;AAAA,QAChC,UAAU,SAAS;AAAA,MACrB;AAAA,IACF;AAAA,IAEA;AACE,cAAQ;AACR,aACE,aAAa;AAAA,QACX,IAAI,SAAS;AAAA,QACb,QAAQ,SAAS;AAAA,QACjB,MAAM;AAAA,QACN,UAAU,SAAS;AAAA,MACrB;AAAA,EAEN;AACF;AAEA,eAAe,wBACb,UACA,aACA,MACA,YACA,aACA,cACA,SAC8B;AAC9B,QAAM,aAAa;AAAA,IACjB,SAAS;AAAA,IACT;AAAA,IACA;AAAA,EACF;AACA,QAAM,YAAiB,WAAK,aAAa,SAAS,MAAM;AACxD,QAAM,UAA+B,CAAC;AAGtC,MAAI,SAAS,mBAAmB,UAAU;AACxC,UAAM,eAAe,CAAC,GAAG,aAAa,KAAK,CAAC,EAAE;AAAA,MAAK,CAAC,MAClD,EAAE,WAAW,GAAG,SAAS,EAAE,GAAG;AAAA,IAChC;AACA,QAAI,cAAc;AAChB,cAAQ;AAER,iBAAW,CAAC,IAAI,GAAG,KAAK,cAAc;AACpC,YAAI,GAAG,WAAW,GAAG,SAAS,EAAE,GAAG,GAAG;AACpC,kBAAQ,KAAK,GAAG;AAAA,QAClB;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,UAAU,SAAS;AAEzB,QAAM,UAAU,MAAM,QAAQ,UAAU;AACxC,aAAW,SAAS,SAAS;AAC3B,UAAM,UAAe,eAAS,YAAY,KAAK;AAC/C,QAAI,aAAkB,WAAK,WAAW,OAAO;AAE7C,QAAI,SAAS,YAAY,WAAW,SAAS,MAAM,GAAG;AACpD,mBAAa,WAAW,MAAM,GAAG,EAAE;AAAA,IACrC;AAEA,QAAI;AACJ,QAAI,SAAS,YAAY,MAAM,SAAS,MAAM,GAAG;AAC/C,YAAM,kBAAkB,MAAM,iBAAiB,KAAK;AACpD,gBAAU,eAAe,iBAAiB,IAAI;AAAA,IAChD,OAAO;AACL,gBAAU,MAAS,aAAS,OAAO,OAAO;AAAA,IAC5C;AAEA,UAAM,cAAc,YAAY,OAAO;AACvC,UAAM,OAAO,YAAY,OAAO;AAChC,UAAM,YAAiB,eAAS,aAAa,UAAU;AAEvD,YAAQ,KAAK;AAAA,MACX,IAAI,GAAG,SAAS,EAAE,IAAI,OAAO;AAAA,MAC7B,QAAQ;AAAA,MACR;AAAA,MACA,UAAU,SAAS;AAAA,IACrB,CAAC;AAED,YAAQ;AAAA,EACV;AAEA,SAAO;AACT;AAEA,SAAS,aAAa,KAAqB;AACzC,SAAO,IAAI,QAAQ,uBAAuB,MAAM;AAClD;;;ADjTA,IAAM,iBAAiB;AAEhB,IAAM,gBAAgB,IAAIC,SAAQ,QAAQ,EAC9C,YAAY,kDAAU,EACtB,OAAO,YAAY;AAClB,MAAI;AACF,UAAM,MAAM,UAAU;AACtB,UAAM,cAAc,IAAI,eAAe;AAEvC,WAAO,KAAK,qCAAqC;AAGjD,UAAM,SAAS,MAAM,kBAAkB,WAAW;AAClD,QAAI,CAAC,QAAQ,UAAU,QAAQ;AAC7B,aAAO;AAAA,QACL;AAAA,MACF;AACA,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,UAAM,EAAE,SAAS,SAAS,eAAe,IAAI,OAAO,SAAS;AAG7D,UAAM,oBAAoB,MAAM,sBAAsB,WAAW;AACjE,QAAI,CAAC,mBAAmB;AACtB,aAAO;AAAA,QACL;AAAA,MAEF;AACA,cAAQ,WAAW;AACnB;AAAA,IACF;AAGA,WAAO,KAAK,oBAAoB,OAAO,UAAU,cAAc,KAAK;AACpE,UAAM,EAAE,UAAU,MAAM,YAAY,YAAY,IAC9C,MAAM,gBAAgB,gBAAgB,OAAO;AAE/C,WAAO;AAAA,MACL,aAAa,cAAc,uBAAkB,SAAS,OAAO;AAAA,IAC/D;AAGA,UAAM,SAAS,MAAM,gBAAgB;AAAA,MACnC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa;AAAA,IACf,CAAC;AAGD,WAAO,SAAS,OAAO,UAAU,SAAS;AAC1C,UAAM,mBAAmB,aAAa,MAAM;AAG5C,UAAM,kBAAkB,EAAE,GAAG,kBAAkB;AAC/C,UAAM,SAAS,gBAAgB,UAAU;AAAA,MACvC,CAAC,MAAM,EAAE,YAAY,kBAAkB,EAAE,YAAY;AAAA,IACvD;AACA,UAAM,WAAW;AAAA,MACf,SAAS;AAAA,MACT;AAAA,MACA,SAAS,SAAS;AAAA,MAClB,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,WAAW,OAAO;AAAA,IACpB;AACA,QAAI,UAAU,GAAG;AACf,sBAAgB,UAAU,MAAM,IAAI;AAAA,IACtC,OAAO;AACL,sBAAgB,UAAU,KAAK,QAAQ;AAAA,IACzC;AACA,UAAM,uBAAuB,aAAa,eAAe;AAGzD,UAAM,EAAE,QAAQ,IAAI;AACpB,WAAO;AAAA,MACL,6BAA6B,SAAS,OAAO;AAAA,IAC/C;AACA,WAAO,KAAK,kBAAkB,QAAQ,OAAO,EAAE;AAC/C,WAAO,KAAK,kBAAkB,QAAQ,WAAW,EAAE;AACnD,WAAO,KAAK,kBAAkB,QAAQ,OAAO,EAAE;AAC/C,WAAO,KAAK,kBAAkB,QAAQ,OAAO,EAAE;AAAA,EACjD,SAAS,KAAK;AACZ,WAAO,MAAM,qBAAsB,IAAc,OAAO,EAAE;AAC1D,WAAO,MAAO,IAAc,SAAS,EAAE;AACvC,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;;;AEvGH,SAAS,WAAAC,gBAAe;AAKjB,IAAM,cAAc,IAAIC,SAAQ,MAAM,EAC1C,YAAY,8DAAY,EACxB,OAAO,YAAY;AAClB,MAAI;AACF,UAAM,MAAM,UAAU;AACtB,UAAM,cAAc,IAAI,eAAe;AAEvC,UAAM,SAAS,MAAM,kBAAkB,WAAW;AAClD,QAAI,CAAC,QAAQ,UAAU,QAAQ;AAC7B,aAAO,KAAK,6BAA6B;AACzC,aAAO,KAAK,wDAAwD;AACpE;AAAA,IACF;AAEA,UAAM,EAAE,SAAS,SAAAC,SAAQ,IAAI,OAAO,SAAS;AAE7C,WAAO,KAAK,0BAA0B;AACtC,WAAO,KAAK,gCAAgC;AAC5C,WAAO,KAAK,eAAe,OAAO,EAAE;AACpC,WAAO,KAAK,eAAeA,QAAO,EAAE;AACpC,WAAO,KAAK,eAAe,OAAO,GAAG,EAAE;AAGvC,UAAM,WAAW,MAAM,sBAAsB,WAAW;AACxD,QAAI,UAAU;AACZ,YAAM,MAAM,SAAS,UAAU;AAAA,QAC7B,CAAC,MAAM,EAAE,YAAY,wBAAwB,EAAE,YAAY;AAAA,MAC7D;AACA,UAAI,KAAK;AACP,eAAO,KAAK,gBAAgB,IAAI,UAAU,MAAM,QAAQ;AACxD,eAAO;AAAA,UACL,gBAAgB,IAAI,KAAK,IAAI,WAAW,EAAE,eAAe,CAAC;AAAA,QAC5D;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,MAAM,mBAAoB,IAAc,OAAO,EAAE;AACxD,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;;;AC5CH,SAAS,WAAAC,gBAAe;AACxB,YAAYC,SAAQ;AACpB,YAAYC,WAAU;AACtB,YAAY,aAAa;AAUzB,IAAMC,kBAAiB;AAOhB,IAAM,mBAAmB,IAAIC,SAAQ,WAAW,EACpD,YAAY,0IAA2C,EACvD,OAAO,aAAa,0BAAM,EAC1B;AAAA,EACC;AAAA,EACA;AACF,EACC,OAAO,OAAO,SAA2B;AACxC,MAAI;AACF,UAAM,MAAM,UAAU;AACtB,UAAM,cAAc,IAAI,eAAe;AAEvC,UAAM,SAAS,MAAM,kBAAkB,WAAW;AAClD,QAAI,CAAC,QAAQ,UAAU,QAAQ;AAC7B,aAAO,KAAK,gDAAgD;AAC5D;AAAA,IACF;AAEA,UAAM,oBAAoB,MAAM,sBAAsB,WAAW;AACjE,UAAM,MAAM,mBAAmB,UAAU;AAAA,MACvC,CAAC,MAAM,EAAE,YAAYD;AAAA,IACvB;AACA,UAAM,YAAY,KAAK,aAAa,CAAC;AAGrC,UAAM,YAAY,KAAK,YACnB,CAAC,IACD,UAAU,OAAO,CAAC,MAAM,EAAE,aAAa,SAAS;AACpD,UAAM,OAAO,UAAU,SAAS,UAAU;AAE1C,WAAO;AAAA,MACL,eAAe,UAAU,MAAM,kBAAkB,IAAI;AAAA,IACvD;AAEA,QAAI,CAAC,KAAK,KAAK;AACb,YAAME,WAAU,MAAc,gBAAQ;AAAA,QACpC,SAAS;AAAA,QACT,cAAc;AAAA,MAChB,CAAC;AACD,UAAY,iBAASA,QAAO,KAAK,CAACA,UAAS;AACzC,eAAO,KAAK,YAAY;AACxB;AAAA,MACF;AAAA,IACF;AAGA,QAAI,UAAU;AACd,eAAW,KAAK,WAAW;AACzB,YAAM,SAAc,iBAAW,EAAE,MAAM,IACnC,EAAE,SACG,WAAK,aAAa,EAAE,MAAM;AACnC,UAAI;AACF,cAAS,WAAO,MAAM;AACtB;AAAA,MACF,SAAS,KAAK;AACZ,YAAK,IAA8B,SAAS,UAAU;AACpD,iBAAO;AAAA,YACL,oBAAoB,MAAM,KAAM,IAAc,OAAO;AAAA,UACvD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,QAAI,mBAAmB;AACrB,wBAAkB,YAAY,kBAAkB,UAAU;AAAA,QACxD,CAAC,MAAM,EAAE,YAAYF;AAAA,MACvB;AACA,YAAM,uBAAuB,aAAa,iBAAiB;AAAA,IAC7D;AAGA,WAAO,OAAO,SAAS;AACvB,UAAM,mBAAmB,aAAa,MAAM;AAE5C,WAAO,QAAQ,eAAeA,eAAc,EAAE;AAC9C,WAAO,KAAK,cAAc,OAAO,QAAQ;AACzC,QAAI,OAAO,GAAG;AACZ,aAAO;AAAA,QACL,cAAc,IAAI;AAAA,MACpB;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,MAAM,wBAAyB,IAAc,OAAO,EAAE;AAC7D,WAAO,MAAO,IAAc,SAAS,EAAE;AACvC,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;;;AjBrGI,IAAM,gBAAgB,IAAIG,SAAQ,QAAQ,EAAE;AAAA,EACjD;AACF;AAEA,cAAc,WAAW,WAAW;AACpC,cAAc,WAAW,aAAa;AACtC,cAAc,WAAW,WAAW;AACpC,cAAc,WAAW,gBAAgB;;;AkBbzC,SAAS,WAAAC,iBAAe;;;ACAxB,SAAS,WAAAC,gBAAe;AACxB,YAAYC,cAAa;;;ACDzB,YAAYC,YAAU;AACtB,YAAYC,SAAQ;AACpB,SAAS,iBAAAC,sBAAqB;AAE9B,SAAS,iCAAiC;AAG1C,IAAMC,WAAUC,eAAc,YAAY,GAAG;AAK7C,SAASC,oBAAmB,aAA6B;AACvD,QAAM,cAAcF,SAAQ,QAAQ,GAAG,WAAW,eAAe;AACjE,SAAY,eAAQ,WAAW;AACjC;AAOA,eAAsB,eAAe,aAIlC;AACD,QAAM,cAAcE,oBAAmB,WAAW;AAElD,SAAO,MAAM,iCAAiC,WAAW,EAAE;AAE3D,QAAM,WAAW,MAAM,0BAA0B,WAAW;AAE5D,MAAI,OAAgC,CAAC;AACrC,QAAM,WAAgB,YAAK,aAAa,YAAY;AACpD,MAAI;AACF,UAAM,MAAM,MAAS,aAAS,UAAU,OAAO;AAC/C,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,SAAS,KAAK;AACZ,QAAK,IAA8B,SAAS,UAAU;AACpD,YAAM;AAAA,IACR;AACA,WAAO,MAAM,0BAA0B,QAAQ,oBAAoB;AAAA,EACrE;AAEA,SAAO,EAAE,UAAU,MAAM,YAAY;AACvC;;;AC9CA,YAAYC,YAAU;AACtB,YAAYC,SAAQ;AAQpB,SAAS,wBAAAC,6BAA4B;AAwCrC,eAAsB,cACpB,SAC6B;AAC7B,QAAM,EAAE,UAAU,MAAM,OAAO,QAAQ,IAAI;AAC3C,QAAM,YAAiC,CAAC;AAExC,QAAM,UAAU,SAAS,OAAO;AAAA,IAC9B,CAAC,MAAM,CAAC,WAAW,QAAQ,SAAS,EAAE,EAAE;AAAA,EAC1C;AAEA,aAAW,SAAS,SAAS;AAC3B,UAAM,YAAY,MAAM,KAAK,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;AAC3D,QAAI,UAAU,WAAW,GAAG;AAC1B,aAAO;AAAA,QACL,UAAU,MAAM,IAAI,eAAe,MAAM,KAAK;AAAA,UAC5C;AAAA,QACF,CAAC,uBAAuB,KAAK,KAAK,GAAG,CAAC;AAAA,MACxC;AACA;AAAA,IACF;AAEA,eAAW,OAAO,WAAW;AAC3B,YAAM,SAAS,MAAM,mBAAmB,OAAO,KAAK,OAAO,OAAO;AAClE,gBAAU,KAAK,GAAG,MAAM;AAAA,IAC1B;AAAA,EACF;AAEA,SAAO,EAAE,WAAW,WAAW,OAAO,UAAU,OAAO;AACzD;AAEA,eAAe,mBACb,OACA,KACA,OACA,SAC8B;AAC9B,QAAM,EAAE,MAAM,aAAa,YAAY,IAAI;AAC3C,QAAM,UAAU,WAAW,GAAG;AAC9B,QAAM,YAAY,QAAQ,kBAAkB,MAAM,MAAM,OAAO,WAAW;AAC1E,QAAM,YAAiB,eAAQ,aAAa,MAAM,MAAM;AAExD,QAAMC,QAAO,MAAS,SAAK,SAAS;AACpC,QAAM,UAA+B,CAAC;AAEtC,MAAIA,MAAK,OAAO,GAAG;AACjB,UAAM,aAAkB,YAAK,WAAW,UAAU;AAClD,UAAM,UAAU,MAAM,mBAAmB,WAAW,OAAO,IAAI;AAC/D,UAAM,cAAc,YAAY,OAAO;AACvC,YAAQ,KAAK,oBAAoB,OAAO,YAAY,SAAS,KAAK,KAAK,CAAC;AACxE,WAAO,MAAM,WAAW,GAAG,IAAI,KAAK,KAAK,UAAU,EAAE;AACrD,WAAO;AAAA,EACT;AAGA,QAAM,UAAU,SAAS;AACzB,QAAM,UAAU,MAAM,QAAQ,SAAS;AACvC,aAAW,SAAS,SAAS;AAC3B,UAAMC,OAAW,gBAAS,WAAW,KAAK;AAC1C,QAAI,aAAkB,YAAK,WAAWA,IAAG;AACzC,QAAI,MAAM,YAAY,WAAW,SAAS,MAAM,GAAG;AACjD,mBAAa,WAAW,MAAM,GAAG,EAAE;AAAA,IACrC;AAEA,QAAI;AACJ,QAAI,MAAM,YAAY,MAAM,SAAS,MAAM,GAAG;AAC5C,YAAM,MAAM,MAAM,iBAAiB,KAAK;AACxC,gBAAU,eAAe,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC;AAAA,IAClD,OAAO;AACL,gBAAU,MAAS,aAAS,OAAO,OAAO;AAAA,IAC5C;AACA,UAAM,cAAc,YAAY,OAAO;AACvC,YAAQ;AAAA,MACN,oBAAoB,OAAO,YAAY,SAAS,KAAK,OAAOA,IAAG;AAAA,IACjE;AACA,WAAO,MAAM,WAAW,GAAG,IAAI,KAAK,KAAK,UAAU,EAAE;AAAA,EACvD;AAEA,SAAO;AACT;AAEA,eAAe,mBACb,WACA,OACA,MACiB;AACjB,MAAI,MAAM,YAAY,UAAU,SAAS,MAAM,GAAG;AAChD,UAAM,MAAM,MAAM,iBAAiB,SAAS;AAC5C,WAAO,eAAe,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC;AAAA,EAC/C;AACA,SAAU,aAAS,WAAW,OAAO;AACvC;AAEA,SAAS,oBACP,OACA,WACA,SACA,KACA,OACAA,MACmB;AACnB,QAAM,KAAKA,OAAM,GAAG,MAAM,EAAE,IAAIA,IAAG,KAAK,MAAM;AAC9C,SAAO;AAAA,IACL;AAAA,IACA,QAAQ;AAAA,IACR,MAAM,YAAY,OAAO;AAAA,IACzB,UAAU,MAAM;AAAA,IAChB;AAAA,IACA;AAAA,EACF;AACF;AAoBA,eAAsB,aACpB,SAC4B;AAC5B,QAAM,EAAE,UAAU,MAAM,OAAO,WAAW,aAAa,MAAM,YAAY,IACvE;AACF,QAAM,UAAU,EAAE,aAAa,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,EAAE;AACrE,QAAM,UAA+B,CAAC;AAEtC,QAAM,eAAe,oBAAI,IAA+B;AACxD,aAAW,KAAK,WAAW;AACzB,iBAAa,IAAI,aAAa,CAAC,GAAG,CAAC;AAAA,EACrC;AAEA,aAAW,SAAS,SAAS,QAAQ;AACnC,UAAM,YAAY,MAAM,KAAK,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;AAC3D,eAAW,OAAO,WAAW;AAC3B,YAAM,UAAU,MAAM;AAAA,QACpB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,cAAQ,KAAK,GAAG,OAAO;AAAA,IACzB;AAAA,EACF;AAEA,SAAO,EAAE,WAAW,SAAS,QAAQ;AACvC;AAEA,eAAe,kBACb,OACA,KACA,OACA,MACA,aACA,aACA,cACA,SAC8B;AAC9B,QAAM,UAAU,WAAW,GAAG;AAC9B,QAAM,YAAY,QAAQ,kBAAkB,MAAM,MAAM,OAAO,WAAW;AAC1E,QAAM,YAAiB,eAAQ,aAAa,MAAM,MAAM;AACxD,QAAMD,QAAO,MAAS,SAAK,SAAS;AACpC,QAAM,UAA+B,CAAC;AAEtC,MAAI,CAACA,MAAK,OAAO,GAAG;AAElB,UAAM,UAAU,MAAM,QAAQ,SAAS;AACvC,UAAM,UAAU,SAAS;AACzB,eAAW,SAAS,SAAS;AAC3B,YAAMC,OAAW,gBAAS,WAAW,KAAK;AAC1C,UAAIC,cAAkB,YAAK,WAAWD,IAAG;AACzC,UAAI,MAAM,YAAYC,YAAW,SAAS,MAAM,GAAG;AACjD,QAAAA,cAAaA,YAAW,MAAM,GAAG,EAAE;AAAA,MACrC;AACA,UAAI;AACJ,UAAI,MAAM,YAAY,MAAM,SAAS,MAAM,GAAG;AAC5C,kBAAU,eAAe,MAAM,iBAAiB,KAAK,GAAG;AAAA,UACtD,GAAG;AAAA,UACH;AAAA,QACF,CAAC;AAAA,MACH,OAAO;AACL,kBAAU,MAAS,aAAS,OAAO,OAAO;AAAA,MAC5C;AACA,YAAMC,UAAS,MAAM,WAAWD,WAAU;AAC1C,UAAIC,SAAQ;AACV,cAAM,WAAWD,aAAY,WAAW;AACxC,gBAAQ;AAAA,MACV,OAAO;AACL,gBAAQ;AAAA,MACV;AACA,YAAM,cAAcA,aAAY,OAAO;AACvC,cAAQ;AAAA,QACN,oBAAoB,OAAOA,aAAY,SAAS,KAAK,OAAOD,IAAG;AAAA,MACjE;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAGA,QAAM,aAAkB,YAAK,WAAW,UAAU;AAClD,QAAM,aAAa,MAAM,mBAAmB,WAAW,OAAO,IAAI;AAClE,QAAM,SAAS,MAAM,WAAW,UAAU;AAC1C,QAAM,kBAAkB,GAAG,MAAM,EAAE,IAAI,GAAG,IAAI,KAAK;AACnD,QAAM,QAAQ,aAAa,IAAI,eAAe;AAE9C,MAAI,MAAM,mBAAmB,UAAU;AACrC,QAAI,QAAQ;AACV,cAAQ;AACR,aAAO;AAAA,QACL,SAAS,oBAAoB,OAAO,YAAY,YAAY,KAAK,KAAK;AAAA,MACxE;AAAA,IACF;AACA,UAAM,cAAc,YAAY,UAAU;AAC1C,YAAQ;AACR,YAAQ;AAAA,MACN,oBAAoB,OAAO,YAAY,YAAY,KAAK,KAAK;AAAA,IAC/D;AACA,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,mBAAmB,iBAAiB,CAAC,QAAQ;AACrD,QAAI,QAAQ;AACV,YAAM,WAAW,YAAY,WAAW;AACxC,cAAQ;AAAA,IACV,OAAO;AACL,cAAQ;AAAA,IACV;AACA,UAAM,cAAc,YAAY,UAAU;AAC1C,YAAQ;AAAA,MACN,oBAAoB,OAAO,YAAY,YAAY,KAAK,KAAK;AAAA,IAC/D;AACA,WAAO;AAAA,EACT;AAGA,QAAM,UAAU,MAAM,eAAe,UAAU;AAC/C,MAAI,UAAU,WAAW;AACzB,QAAM,YAAY,MAAM,kBAAkB,CAAC;AAC3C,aAAW,YAAY,WAAW;AAChC,UAAM,KAAK,IAAI;AAAA,MACb,qCAAqCG;AAAA,QACnC;AAAA,MACF,CAAC,oDAAoDA;AAAA,QACnD;AAAA,MACF,CAAC;AAAA,IACH;AACA,UAAM,QAAQ,WAAW,MAAM,EAAE;AACjC,QAAI,OAAO;AACT,YAAM,SAAS,MAAM,CAAC,EAAE,QAAQ,OAAO,EAAE,EAAE,QAAQ,OAAO,EAAE;AAC5D,UAAI;AACF,kBAAUC,sBAAqB,SAAS,UAAU,MAAM;AAAA,MAC1D,QAAQ;AACN,eAAO;AAAA,UACL,mBAAmB,QAAQ,kBAAkB,UAAU;AAAA,QACzD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,QAAM,WAAW,YAAY,WAAW;AACxC,QAAM,cAAc,YAAY,OAAO;AACvC,UAAQ;AACR,UAAQ,KAAK,oBAAoB,OAAO,YAAY,SAAS,KAAK,KAAK,CAAC;AACxE,SAAO;AACT;AAEA,SAAS,aAAa,GAA8B;AAClD,SAAO,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE;AAChD;AAEA,SAASD,cAAa,KAAqB;AACzC,SAAO,IAAI,QAAQ,uBAAuB,MAAM;AAClD;AAKA,eAAsB,iBACpB,SACmB;AACnB,QAAM,UAAoB,CAAC;AAC3B,aAAW,KAAK,SAAS;AACvB,QAAI;AACF,YAAS,WAAO,EAAE,MAAM;AACxB,cAAQ,KAAK,EAAE,MAAM;AAAA,IACvB,SAAS,KAAK;AACZ,UAAK,IAA8B,SAAS,UAAU;AACpD,eAAO,KAAK,oBAAoB,EAAE,MAAM,KAAM,IAAc,OAAO,EAAE;AAAA,MACvE;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,IAAI,QAAQ,IAAI,CAAC,MAAW,eAAQ,EAAE,MAAM,CAAC,CAAC;AAClE,aAAW,OAAO,SAAS;AACzB,QAAI;AACF,YAAM,UAAU,MAAS,YAAQ,GAAG;AACpC,UAAI,QAAQ,WAAW,EAAG,OAAS,UAAM,GAAG;AAAA,IAC9C,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;;;AC3VA,IAAM,yBAAyB;AAC/B,IAAM,eAAe;AA6DrB,eAAsB,aACpB,SAC6B;AAC7B,QAAM,EAAE,aAAa,OAAO,eAAe,IAAI;AAC/C,QAAM,cAAc,QAAQ,eAAe;AAC3C,QAAM,WAAW,QAAQ,OAAO;AAChC,QAAM,gBAAgB,CAAC,CAAC,kBAAkB,eAAe,SAAS;AAElE,QAAM,gBAAgB,WAAW;AAEjC,QAAM,iBAAiB,MAAM,kBAAkB,WAAW;AAC1D,QAAM,oBAAoB,gBAAgB,UAAU;AAGpD,MAAI,CAAC,iBAAiB,mBAAmB;AACvC,WAAO,EAAE,QAAQ,gBAAgB;AAAA,EACnC;AAGA,QAAM,OACJ,QAAQ,QAAQ,QAAQ,KAAK,SAAS,IAClC,CAAC,GAAG,QAAQ,IAAI,IAChB,mBAAmB,OACnB,CAAC,GAAG,kBAAkB,IAAI,IAC1B,CAAC;AAEP,QAAM,QAAS,QAAQ,SAAS,mBAAmB;AAGnD,MAAI,KAAK,WAAW,GAAG;AACrB,UAAM,IAAI,MAAM,oCAAoC;AAAA,EACtD;AACA,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,6CAA6C;AAAA,EAC/D;AAEA,QAAM,EAAE,UAAU,MAAM,YAAY,IAAI,MAAM,eAAe,WAAW;AAGxE,MAAI,eAAe;AACjB,UAAM,QAAQ,IAAI,IAAI,SAAS,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AACtD,UAAM,UAAU,eAAgB,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;AAC3D,QAAI,QAAQ,SAAS,GAAG;AACtB,YAAM,YAAY,CAAC,GAAG,KAAK,EAAE,KAAK,IAAI;AACtC,YAAM,IAAI;AAAA,QACR,wBAAwB,QAAQ,KAAK,IAAI,CAAC,gBACxC,aAAa,QACf;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,oBAAoB,MAAM,sBAAsB,WAAW;AACjE,QAAM,cAAc,mBAAmB,UAAU;AAAA,IAC/C,CAAC,MAAM,EAAE,YAAY;AAAA,EACvB;AACA,QAAM,mBAAmB,IAAI;AAAA,KAC1B,aAAa,aAAa,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,GAAG,EAAE,CAAC,CAAC;AAAA,EAC9D;AAGA,MAAI;AACJ,MAAI;AACJ,MAAI,eAAe;AACjB,sBAAkB,eAAgB,OAAO,CAAC,MAAM,iBAAiB,IAAI,CAAC,CAAC;AACvE,cAAU,eAAgB,OAAO,CAAC,MAAM,CAAC,iBAAiB,IAAI,CAAC,CAAC;AAAA,EAClE,OAAO;AACL,sBAAkB,CAAC;AACnB,cAAU,SAAS,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,EAC3C;AAGA,MAAI,iBAAiB,QAAQ,WAAW,GAAG;AACzC,WAAO;AAAA,MACL,QAAQ;AAAA,MACR;AAAA,MACA,SAAS,mBAAmB,WAAW,SAAS;AAAA,MAChD;AAAA,MACA;AAAA,MACA,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,WAAW,CAAC;AAAA,MACZ,eAAe,CAAC;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,cAAc;AAAA,IACjC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,SAAwB,kBAAkB;AAAA,IAC9C,SAAS;AAAA,IACT,eAAe;AAAA,IACf,KAAK;AAAA,IACL,UAAU,CAAC;AAAA,EACb;AACA,SAAO,SAAS,SAAS;AAAA,IACvB,SAAS;AAAA,IACT,SAAS,SAAS;AAAA,IAClB;AAAA,IACA;AAAA,EACF;AACA,QAAM,mBAAmB,aAAa,MAAM;AAE5C,QAAM,oBAAuC,qBAAqB;AAAA,IAChE,eAAe;AAAA,IACf,WAAW,CAAC;AAAA,EACd;AACA,QAAM,MAAM,kBAAkB,UAAU;AAAA,IACtC,CAAC,MAAM,EAAE,YAAY;AAAA,EACvB;AACA,QAAM,kBAAkB;AAAA,IACtB,aAAa,aAAa,CAAC;AAAA,IAC3B,OAAO;AAAA,EACT;AACA,QAAM,QAAQ;AAAA,IACZ,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS,SAAS;AAAA,IAClB,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,WAAW;AAAA,EACb;AACA,MAAI,OAAO,EAAG,mBAAkB,UAAU,GAAG,IAAI;AAAA,MAC5C,mBAAkB,UAAU,KAAK,KAAK;AAC3C,QAAM,uBAAuB,aAAa,iBAAiB;AAE3D,SAAO;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,IACA,SAAS,SAAS;AAAA,IAClB;AAAA,IACA;AAAA,IACA,YAAY,QAAQ;AAAA,IACpB,WAAW,OAAO;AAAA,IAClB,WAAW,OAAO;AAAA,IAClB,eAAe;AAAA,IACf;AAAA,EACF;AACF;AAEA,SAAS,wBACP,UACA,MACqB;AACrB,QAAM,MAAM,oBAAI,IAA+B;AAC/C,QAAM,MAAM,CAAC,MACX,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE;AACzC,aAAW,KAAK,SAAU,KAAI,IAAI,IAAI,CAAC,GAAG,CAAC;AAC3C,aAAW,KAAK,KAAM,KAAI,IAAI,IAAI,CAAC,GAAG,CAAC;AACvC,SAAO,CAAC,GAAG,IAAI,OAAO,CAAC;AACzB;;;AH9NO,IAAM,aAAa,IAAIE,SAAQ,KAAK,EACxC;AAAA,EACC;AACF,EACC;AAAA,EACC;AAAA,EACA;AACF,EACC,OAAO,gBAAgB,4EAA+B,EACtD;AAAA,EACC;AAAA,EACA;AACF,EACC,OAAO,aAAa,8DAAY,EAChC,OAAO,OAAO,OAAiB,SAAqB;AACnD,MAAI;AACF,UAAM,MAAM,UAAU;AACtB,UAAM,cAAc,IAAI,eAAe;AACvC,UAAM,gBAAgB,MAAM,SAAS;AAErC,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,oBAAoB;AAAA,MAChD;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,WAAO;AAAA,MACL,gBACI,kBAAkB,MAAM,KAAK,GAAG,CAAC,YAAY,KAAK;AAAA,QAChD;AAAA,MACF,CAAC,aAAa,KAAK,MACnB,8BAA8B,KAAK,KAAK,GAAG,CAAC,aAAa,KAAK;AAAA,IACpE;AACA,WAAO,MAAM,iBAAiB,WAAW,EAAE;AAE3C,UAAM,SAAS,MAAM,aAAa;AAAA,MAChC;AAAA,MACA;AAAA,MACA;AAAA,MACA,KAAK,IAAI;AAAA,MACT,OAAO,gBAAgB,QAAQ;AAAA,IACjC,CAAC;AAED,QAAI,OAAO,WAAW,iBAAiB;AACrC,aAAO;AAAA,QACL;AAAA,MAEF;AACA;AAAA,IACF;AAEA,QACE,OAAO,cAAc,WAAW,KAChC,OAAO,gBAAgB,SAAS,GAChC;AACA,aAAO;AAAA,QACL,yDAAY,OAAO,gBAAgB;AAAA,UACjC;AAAA,QACF,CAAC;AAAA,MACH;AACA;AAAA,IACF;AAEA,WAAO,QAAQ,iBAAiB,OAAO,UAAU,WAAW;AAC5D,WAAO,KAAK,cAAc,OAAO,KAAK,KAAK,IAAI,CAAC,EAAE;AAClD,WAAO,KAAK,cAAc,OAAO,KAAK,EAAE;AACxC,QAAI,OAAO,cAAc,SAAS,GAAG;AACnC,aAAO,KAAK,cAAc,OAAO,cAAc,KAAK,IAAI,CAAC,EAAE;AAAA,IAC7D;AACA,QAAI,OAAO,gBAAgB,SAAS,GAAG;AACrC,aAAO;AAAA,QACL,cAAc,OAAO,gBAAgB,KAAK,IAAI,CAAC;AAAA,MACjD;AAAA,IACF;AACA,WAAO,KAAK,cAAc,OAAO,SAAS,EAAE;AAC5C,WAAO,KAAK,EAAE;AACd,WAAO,KAAK,uDAAuD;AAAA,EACrE,SAAS,KAAK;AACZ,WAAO,MAAM,yBAA0B,IAAc,OAAO,EAAE;AAC9D,WAAO,MAAO,IAAc,SAAS,EAAE;AACvC,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;AAEH,eAAe,oBAAoB,MAIkB;AACnD,QAAM,EAAE,MAAM,aAAa,cAAc,IAAI;AAG7C,MAAI,iBAAiB,CAAC,KAAK,OAAO,CAAC,KAAK,SAAS,CAAC,KAAK,KAAK;AAC1D,UAAM,WAAW,MAAM,kBAAkB,WAAW;AACpD,UAAM,MAAM,UAAU,UAAU;AAChC,QAAI,OAAO,IAAI,QAAQ,IAAI,KAAK,SAAS,KAAK,IAAI,OAAO;AACvD,aAAO;AAAA,QACL,yCAAyC,IAAI,KAAK,KAAK,GAAG,CAAC,aACzD,IAAI,KACN;AAAA,MACF;AACA,aAAO;AAAA,QACL,MAAM,CAAC,GAAG,IAAI,IAAI;AAAA,QAClB,OAAO,IAAI;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAGA,MAAI,KAAK,OAAO,KAAK,KAAK;AACxB,UAAM,OAAO,KAAK,MACd,aAAa,KAAK,GAAG,IACpB,CAAC,GAAG,aAAa;AACtB,UAAM,QAAQ,WAAW,KAAK,KAAK;AACnC,QAAI,KAAK,WAAW,GAAG;AACrB,YAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AACA,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAGA,QAAM,UAAU,MAAc,qBAAsB;AAAA,IAClD,SAAS;AAAA,IACT,SAAS,cAAc,IAAI,CAAC,OAAO;AAAA,MACjC,OAAO;AAAA,MACP,OAAO,MAAM,UAAU,UAAU;AAAA,IACnC,EAAE;AAAA,IACF,eAAe,CAAC,GAAG,aAAa;AAAA,IAChC,UAAU;AAAA,EACZ,CAAC;AACD,MAAY,kBAAS,OAAO,GAAG;AAC7B,UAAM,IAAI,MAAM,oBAAoB;AAAA,EACtC;AAEA,QAAM,WAAW,MAAc,gBAAmB;AAAA,IAChD,SAAS;AAAA,IACT,SAAS;AAAA,MACP,EAAE,OAAO,WAAW,OAAO,8EAA4B;AAAA,MACvD,EAAE,OAAO,UAAU,OAAO,6CAAyB;AAAA,IACrD;AAAA,IACA,cAAc;AAAA,EAChB,CAAC;AACD,MAAY,kBAAS,QAAQ,GAAG;AAC9B,UAAM,IAAI,MAAM,oBAAoB;AAAA,EACtC;AAEA,SAAO,EAAE,MAAM,SAAuB,OAAO,SAAuB;AACtE;AAEA,SAAS,aAAa,OAA2B;AAC/C,QAAM,QAAQ,MACX,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,EACjC,OAAO,OAAO;AACjB,QAAM,SAAqB,CAAC;AAC5B,aAAW,KAAK,OAAO;AACrB,QAAI,MAAM,WAAW,MAAM,UAAU;AACnC,UAAI,CAAC,OAAO,SAAS,CAAC,EAAG,QAAO,KAAK,CAAC;AAAA,IACxC,OAAO;AACL,YAAM,IAAI,MAAM,iBAAiB,CAAC,6BAA6B;AAAA,IACjE;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,WAAW,OAAuC;AACzD,QAAM,KAAK,SAAS,WAAW,YAAY;AAC3C,MAAI,MAAM,aAAa,MAAM,SAAU,QAAO;AAC9C,QAAM,IAAI,MAAM,qBAAqB,KAAK,+BAA+B;AAC3E;;;AIvLA,SAAS,WAAAC,gBAAe;AAMxB,IAAM,iBAAiB;AAMhB,IAAMC,eAAc,IAAIC,SAAQ,MAAM,EAC1C,MAAM,IAAI,EACV;AAAA,EACC;AACF,EACC,OAAO,eAAe,kGAAuB,EAC7C,OAAO,OAAO,SAAsB;AACnC,MAAI;AACF,UAAM,MAAM,UAAU;AACtB,UAAM,cAAc,IAAI,eAAe;AAEvC,UAAM,SAAS,MAAM,kBAAkB,WAAW;AAClD,UAAM,oBAAoB,MAAM,sBAAsB,WAAW;AACjE,UAAM,MAAM,mBAAmB,UAAU;AAAA,MACvC,CAAC,MAAM,EAAE,YAAY;AAAA,IACvB;AAGA,UAAM,mBAAmB,oBAAI,IAAoB;AACjD,eAAW,KAAK,KAAK,aAAa,CAAC,GAAG;AACpC,YAAM,UAAU,EAAE,GAAG,MAAM,GAAG,EAAE,CAAC;AACjC,uBAAiB,IAAI,UAAU,iBAAiB,IAAI,OAAO,KAAK,KAAK,CAAC;AAAA,IACxE;AAGA,QAAI,KAAK,WAAW;AAClB,UAAI,CAAC,QAAQ,UAAU,UAAU,CAAC,KAAK;AACrC,eAAO,KAAK,sBAAsB;AAClC,eAAO,KAAK,6CAA6C;AACzD;AAAA,MACF;AACA,2BAAqB,OAAO,SAAS,QAAQ,IAAI,WAAW;AAC5D,aAAO,KAAK,EAAE;AACd,aAAO,KAAK,mBAAmB;AAC/B,iBAAW,CAAC,SAAS,KAAK,KAAK,kBAAkB;AAC/C,eAAO,KAAK,YAAO,OAAO,MAAM,KAAK,QAAQ,QAAQ,IAAI,MAAM,EAAE,GAAG;AAAA,MACtE;AACA,aAAO,KAAK,EAAE;AACd,aAAO;AAAA,QACL,YAAY,IAAI,UAAU,MAAM,WAAW,iBAAiB,IAAI;AAAA,MAClE;AACA;AAAA,IACF;AAGA,UAAM,EAAE,SAAS,IAAI,MAAM,eAAe,cAAc;AACxD,UAAM,SAAS,CAAC,GAAG,SAAS,MAAM,EAAE;AAAA,MAAK,CAAC,GAAG,MAC3C,EAAE,GAAG,cAAc,EAAE,EAAE;AAAA,IACzB;AACA,UAAM,cAAc,CAAC,CAAC,QAAQ,UAAU,UAAU,CAAC,CAAC;AAEpD,QAAI,aAAa;AACf,2BAAqB,OAAQ,SAAU,QAAS,IAAK,WAAW;AAAA,IAClE,OAAO;AACL,aAAO,KAAK,+BAA+B;AAC3C,aAAO;AAAA,QACL;AAAA,MACF;AAAA,IACF;AACA,WAAO,KAAK,EAAE;AACd,WAAO,KAAK,qBAAqB,cAAc,IAAI,SAAS,OAAO,IAAI;AACvE,QAAI,iBAAiB;AACrB,eAAW,KAAK,QAAQ;AACtB,YAAM,YAAY,iBAAiB,IAAI,EAAE,EAAE;AAC3C,YAAM,YAAY,cAAc;AAChC,UAAI,UAAW;AACf,YAAM,OAAO,YAAY,WAAM;AAC/B,YAAM,OAAO,YACT,eAAe,SAAS,QAAQ,YAAY,IAAI,MAAM,EAAE,MACxD,oDAA+C,EAAE,EAAE;AACvD,aAAO,KAAK,KAAK,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,EAAE;AACrD,UAAI,EAAE,aAAa;AACjB,eAAO,KAAK,SAAS,EAAE,WAAW,EAAE;AAAA,MACtC;AAAA,IACF;AACA,WAAO,KAAK,EAAE;AACd,WAAO;AAAA,MACL,YAAY,OAAO,MAAM,oBAAe,cAAc,eACpD,OAAO,SAAS,cAClB;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,MAAM,mBAAoB,IAAc,OAAO,EAAE;AACxD,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;AAEH,SAAS,qBACP,KACA,aACM;AACN,SAAO,KAAK,2BAA2B;AACvC,SAAO,KAAK,iBAAiB,cAAc,EAAE;AAC7C,SAAO,KAAK,iBAAiB,IAAI,WAAW,WAAW,EAAE;AACzD,SAAO,KAAK,kBAAkB,IAAI,QAAQ,CAAC,GAAG,KAAK,IAAI,KAAK,WAAW,EAAE;AACzE,SAAO,KAAK,iBAAiB,IAAI,SAAS,WAAW,EAAE;AACvD,SAAO,KAAK,iBAAiB,IAAI,KAAK,WAAW,EAAE,eAAe,CAAC,EAAE;AACvE;;;AC7GA,SAAS,WAAAC,gBAAe;AAaxB,IAAMC,kBAAiB;AACvB,IAAMC,gBAAe;AAEd,IAAMC,iBAAgB,IAAIC,SAAQ,QAAQ,EAC9C,YAAY,wDAA0B,EACtC,OAAO,YAAY;AAClB,MAAI;AACF,UAAM,MAAM,UAAU;AACtB,UAAM,cAAc,IAAI,eAAe;AAEvC,UAAM,SAAS,MAAM,kBAAkB,WAAW;AAClD,QAAI,CAAC,QAAQ,UAAU,QAAQ;AAC7B,aAAO,MAAM,sDAAsD;AACnE,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,UAAM,oBAAoB,MAAM,sBAAsB,WAAW;AACjE,QAAI,CAAC,mBAAmB;AACtB,aAAO,MAAM,8BAA8B;AAC3C,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,UAAM,cAAc,OAAO,SAAS;AACpC,UAAM,OAAoB,YAAY,QAAQ;AAAA,MAC5C;AAAA,MACA;AAAA,IACF;AACA,UAAM,QAAqB,YAAY,SAAS;AAEhD,WAAO,KAAK,0BAA0B,KAAK,KAAK,GAAG,CAAC,YAAY,KAAK,GAAG;AAExE,UAAM,EAAE,UAAU,MAAM,YAAY,IAAI,MAAM;AAAA,MAC5CH;AAAA,IACF;AAEA,UAAM,eAAe,kBAAkB,UAAU;AAAA,MAC/C,CAAC,MAAM,EAAE,YAAYA;AAAA,IACvB;AACA,UAAM,qBAAqB,cAAc,aAAa,CAAC;AAEvD,WAAO;AAAA,MACL,aAAa,YAAY,OAAO,uBAAkB,SAAS,OAAO;AAAA,IACpE;AAEA,UAAM,SAAS,MAAM,aAAa;AAAA,MAChC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW;AAAA,IACb,CAAC;AAGD,WAAO,SAAS,OAAO,UAAU,SAAS;AAC1C,UAAM,mBAAmB,aAAa,MAAM;AAG5C,UAAM,MAAM,kBAAkB,UAAU;AAAA,MACtC,CAAC,MAAM,EAAE,YAAYA;AAAA,IACvB;AACA,UAAM,QAAQ;AAAA,MACZ,SAASA;AAAA,MACT,SAASC;AAAA,MACT,SAAS,SAAS;AAAA,MAClB,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,WAAW,OAAO;AAAA,IACpB;AACA,QAAI,OAAO,EAAG,mBAAkB,UAAU,GAAG,IAAI;AAAA,QAC5C,mBAAkB,UAAU,KAAK,KAAK;AAC3C,UAAM,uBAAuB,aAAa,iBAAiB;AAE3D,UAAM,EAAE,QAAQ,IAAI;AACpB,WAAO,QAAQ,sBAAsB,SAAS,OAAO,EAAE;AACvD,WAAO,KAAK,kBAAkB,QAAQ,OAAO,EAAE;AAC/C,WAAO,KAAK,kBAAkB,QAAQ,WAAW,EAAE;AACnD,WAAO,KAAK,kBAAkB,QAAQ,OAAO,EAAE;AAC/C,WAAO,KAAK,kBAAkB,QAAQ,OAAO,EAAE;AAAA,EACjD,SAAS,KAAK;AACZ,WAAO,MAAM,4BAA6B,IAAc,OAAO,EAAE;AACjE,WAAO,MAAO,IAAc,SAAS,EAAE;AACvC,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;;;ACnGH,SAAS,WAAAG,gBAAe;AACxB,YAAYC,cAAa;AAWzB,IAAMC,kBAAiB;AAMhB,IAAMC,oBAAmB,IAAIC,SAAQ,WAAW,EACpD,YAAY,qIAA2C,EACvD,OAAO,aAAa,0BAAM,EAC1B,OAAO,OAAO,SAA2B;AACxC,MAAI;AACF,UAAM,MAAM,UAAU;AACtB,UAAM,cAAc,IAAI,eAAe;AAEvC,UAAM,SAAS,MAAM,kBAAkB,WAAW;AAClD,QAAI,CAAC,QAAQ,UAAU,QAAQ;AAC7B,aAAO,KAAK,0CAA0C;AACtD;AAAA,IACF;AAEA,UAAM,oBAAoB,MAAM,sBAAsB,WAAW;AACjE,UAAM,MAAM,mBAAmB,UAAU;AAAA,MACvC,CAAC,MAAM,EAAE,YAAYF;AAAA,IACvB;AACA,UAAM,YAAY,KAAK,aAAa,CAAC;AAErC,WAAO;AAAA,MACL,eAAe,UAAU,MAAM,+BAA+BA,eAAc;AAAA,IAC9E;AAEA,QAAI,CAAC,KAAK,KAAK;AACb,YAAMG,WAAU,MAAc,iBAAQ;AAAA,QACpC,SAAS;AAAA,QACT,cAAc;AAAA,MAChB,CAAC;AACD,UAAY,kBAASA,QAAO,KAAK,CAACA,UAAS;AACzC,eAAO,KAAK,YAAY;AACxB;AAAA,MACF;AAAA,IACF;AAGA,UAAM,UAAU,MAAM,iBAAiB,SAAS;AAChD,WAAO,MAAM,WAAW,QAAQ,MAAM,QAAQ;AAG9C,QAAI,qBAAqB,KAAK;AAC5B,wBAAkB,YAAY,kBAAkB,UAAU;AAAA,QACxD,CAAC,MAAM,EAAE,YAAYH;AAAA,MACvB;AACA,YAAM,uBAAuB,aAAa,iBAAiB;AAAA,IAC7D;AAGA,WAAO,OAAO,SAAS;AACvB,UAAM,mBAAmB,aAAa,MAAM;AAE5C,WAAO,QAAQ,eAAeA,eAAc,EAAE;AAC9C,WAAO,KAAK,cAAc,QAAQ,MAAM,QAAQ;AAAA,EAClD,SAAS,KAAK;AACZ,WAAO,MAAM,wBAAyB,IAAc,OAAO,EAAE;AAC7D,WAAO,MAAO,IAAc,SAAS,EAAE;AACvC,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;;;APtEI,IAAM,gBAAgB,IAAII,UAAQ,QAAQ,EAAE;AAAA,EACjD;AACF;AAEA,cAAc,WAAW,UAAU;AACnC,cAAc,WAAWC,YAAW;AACpC,cAAc,WAAWC,cAAa;AACtC,cAAc,WAAWC,iBAAgB;;;AQbzC,SAAS,WAAAC,iBAAe;;;ACAxB,SAAS,WAAAC,iBAAe;AACxB,YAAYC,cAAa;;;ACMlB,IAAM,qBAAgC;AAAA,EAC3C,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,OAAO;AAAA,EACP,KAAK;AACP;AAEO,IAAM,0BAA0B;AAmCvC,eAAsB,UACpB,SAC0B;AAC1B,QAAM,EAAE,YAAY,IAAI;AACxB,QAAM,WAAW,QAAQ,OAAO;AAEhC,QAAM,gBAAgB,WAAW;AAEjC,QAAM,iBAAiB,MAAM,kBAAkB,WAAW;AAC1D,MAAI,gBAAgB,UAAU,IAAI;AAChC,WAAO,EAAE,QAAQ,sBAAsB;AAAA,EACzC;AAEA,QAAM,UAAqB;AAAA,IACzB,YAAY,QAAQ,SAAS,cAAc,mBAAmB;AAAA,IAC9D,OAAO,QAAQ,SAAS,SAAS,mBAAmB;AAAA,IACpD,OAAO,QAAQ,SAAS,SAAS,mBAAmB;AAAA,IACpD,KAAK,QAAQ,SAAS,OAAO,mBAAmB;AAAA,EAClD;AACA,QAAM,cAAc,QAAQ,eAAe;AAC3C,QAAM,MAAM,QAAQ,OAAO;AAC3B,QAAM,MAAM,QAAQ,OAAO;AAE3B,QAAM,SAAwB,kBAAkB;AAAA,IAC9C,SAAS;AAAA,IACT,eAAe;AAAA,IACf,KAAK;AAAA,IACL,UAAU,CAAC;AAAA,EACb;AACA,SAAO,SAAS,KAAK;AAAA,IACnB,SAAS;AAAA,IACT,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,mBAAmB,aAAa,MAAM;AAE5C,SAAO;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AD7EO,IAAMC,eAAc,IAAIC,UAAQ,MAAM,EAC1C;AAAA,EACC;AACF,EACC,OAAO,aAAa,8DAAY,EAChC;AAAA,EACC;AAAA,EACA;AAAA,EACA,mBAAmB;AACrB,EACC,OAAO,kBAAkB,4BAAkB,mBAAmB,KAAK,EACnE,OAAO,kBAAkB,4BAAkB,mBAAmB,KAAK,EACnE,OAAO,gBAAgB,0BAAgB,mBAAmB,GAAG,EAC7D,OAAO,yBAAyB,0DAAkB,QAAQ,EAC1D,OAAO,SAAS,oBAAU,IAAI,EAC9B,OAAO,SAAS,sCAA4B,EAC5C,OAAO,OAAO,SAAsB;AACnC,MAAI;AACF,UAAM,MAAM,UAAU;AACtB,UAAM,cAAc,IAAI,eAAe;AAEvC,UAAM,MAAM,MAAM,cAAc,IAAI;AAEpC,UAAM,SAAS,MAAM,UAAU;AAAA,MAC7B;AAAA,MACA,SAAS,IAAI;AAAA,MACb,aAAa,IAAI;AAAA,MACjB,KAAK,IAAI;AAAA,MACT,KAAK,IAAI;AAAA,MACT,KAAK,IAAI;AAAA,IACX,CAAC;AAED,QAAI,OAAO,WAAW,uBAAuB;AAC3C,aAAO;AAAA,QACL;AAAA,MACF;AACA;AAAA,IACF;AAEA,WAAO,QAAQ,iBAAiB;AAChC,WAAO,KAAK,iBAAiB,OAAO,QAAQ,UAAU,EAAE;AACxD,WAAO,KAAK,iBAAiB,OAAO,QAAQ,KAAK,EAAE;AACnD,WAAO,KAAK,iBAAiB,OAAO,QAAQ,KAAK,EAAE;AACnD,WAAO,KAAK,iBAAiB,OAAO,QAAQ,GAAG,EAAE;AACjD,WAAO,KAAK,kBAAkB,OAAO,WAAW,EAAE;AAClD,WAAO,KAAK,UAAU,OAAO,GAAG,UAAU,OAAO,GAAG,EAAE;AACtD,WAAO,KAAK,EAAE;AACd,WAAO,KAAK,sCAAsC;AAAA,EACpD,SAAS,KAAK;AACZ,WAAO,MAAM,4BAA6B,IAAc,OAAO,EAAE;AACjE,WAAO,MAAO,IAAc,SAAS,EAAE;AACvC,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;AASH,eAAe,cAAc,MAA4C;AACvE,MAAI,KAAK,KAAK;AACZ,WAAO;AAAA,MACL,SAAS;AAAA,QACP,YAAY,KAAK,cAAc,mBAAmB;AAAA,QAClD,OAAO,KAAK,SAAS,mBAAmB;AAAA,QACxC,OAAO,KAAK,SAAS,mBAAmB;AAAA,QACxC,KAAK,KAAK,OAAO,mBAAmB;AAAA,MACtC;AAAA,MACA,aAAa,KAAK,eAAe;AAAA,MACjC,KAAK,KAAK,OAAO;AAAA,MACjB,KAAK,KAAK,OAAO;AAAA,IACnB;AAAA,EACF;AAEA,QAAM,aAAa,MAAc,cAAK;AAAA,IACpC,SAAS;AAAA,IACT,cAAc,KAAK,cAAc,mBAAmB;AAAA,EACtD,CAAC;AACD,MAAY,kBAAS,UAAU,EAAG,OAAM,IAAI,MAAM,oBAAoB;AAEtE,QAAM,QAAQ,MAAc,cAAK;AAAA,IAC/B,SAAS;AAAA,IACT,cAAc,KAAK,SAAS,mBAAmB;AAAA,EACjD,CAAC;AACD,MAAY,kBAAS,KAAK,EAAG,OAAM,IAAI,MAAM,oBAAoB;AAEjE,QAAM,QAAQ,MAAc,cAAK;AAAA,IAC/B,SAAS;AAAA,IACT,cAAc,KAAK,SAAS,mBAAmB;AAAA,EACjD,CAAC;AACD,MAAY,kBAAS,KAAK,EAAG,OAAM,IAAI,MAAM,oBAAoB;AAEjE,QAAM,MAAM,MAAc,cAAK;AAAA,IAC7B,SAAS;AAAA,IACT,cAAc,KAAK,OAAO,mBAAmB;AAAA,EAC/C,CAAC;AACD,MAAY,kBAAS,GAAG,EAAG,OAAM,IAAI,MAAM,oBAAoB;AAE/D,QAAM,cAAc,MAAc,cAAK;AAAA,IACrC,SAAS;AAAA,IACT,cAAc,KAAK,eAAe;AAAA,EACpC,CAAC;AACD,MAAY,kBAAS,WAAW,EAAG,OAAM,IAAI,MAAM,oBAAoB;AAEvE,QAAM,SAAS,MAAc,iBAAQ;AAAA,IACnC,SAAS;AAAA,IACT,cAAc,KAAK,OAAO;AAAA,EAC5B,CAAC;AACD,MAAY,kBAAS,MAAM,EAAG,OAAM,IAAI,MAAM,oBAAoB;AAElE,QAAM,SAAS,MAAc,iBAAQ;AAAA,IACnC,SAAS;AAAA,IACT,cAAc,KAAK,OAAO;AAAA,EAC5B,CAAC;AACD,MAAY,kBAAS,MAAM,EAAG,OAAM,IAAI,MAAM,oBAAoB;AAElE,SAAO;AAAA,IACL,SAAS,EAAE,YAAY,OAAO,OAAO,IAAI;AAAA,IACzC;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AAAA,EACP;AACF;;;AE/IA,SAAS,WAAAC,iBAAe;;;ACAxB,YAAYC,YAAU;AACtB,YAAYC,UAAQ;AACpB,SAAS,iBAAAC,sBAAqB;AAE9B,SAAS,6BAA6B;AAGtC,IAAMC,WAAUC,eAAc,YAAY,GAAG;AAE7C,SAASC,oBAAmB,aAA6B;AACvD,QAAM,cAAcF,SAAQ,QAAQ,GAAG,WAAW,eAAe;AACjE,SAAY,eAAQ,WAAW;AACjC;AAOA,eAAsB,WAAW,aAI9B;AACD,QAAM,cAAcE,oBAAmB,WAAW;AAElD,SAAO,MAAM,6BAA6B,WAAW,EAAE;AAEvD,QAAM,WAAW,MAAM,sBAAsB,WAAW;AAExD,MAAI,OAAgC,CAAC;AACrC,QAAM,WAAgB,YAAK,aAAa,YAAY;AACpD,MAAI;AACF,UAAM,MAAM,MAAS,cAAS,UAAU,OAAO;AAC/C,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,SAAS,KAAK;AACZ,QAAK,IAA8B,SAAS,UAAU;AACpD,YAAM;AAAA,IACR;AACA,WAAO,MAAM,0BAA0B,QAAQ,oBAAoB;AAAA,EACrE;AAEA,SAAO,EAAE,UAAU,MAAM,YAAY;AACvC;;;AC3CA,YAAYC,YAAU;AACtB,YAAYC,UAAQ;AAOpB,SAAS,2BAA2B;;;ACDpC,IAAM,2BAA4D;AAAA,EAChE,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,OAAO;AAAA,EACP,KAAK;AACP;AAcO,SAAS,eAAe,QAAgB,SAA4B;AACzE,SAAO,OAAO;AAAA,IACZ;AAAA,IACA,CAAC,MAAM,OAAe,MAAc,SAA6B;AAC/D,YAAM,WAAW,yBAAyB,IAAI;AAC9C,UAAI,CAAC,SAAU,QAAO;AACtB,YAAM,QAAQ,QAAQ,QAAQ;AAC9B,YAAM,aAAa,kBAAkB,KAAK;AAC1C,aAAO,GAAG,KAAK,GAAG,UAAU,GAAG,QAAQ,EAAE,GAAG,KAAK;AAAA,IACnD;AAAA,EACF;AACF;AAUA,SAAS,kBAAkB,OAAuB;AAChD,QAAM,UAAU,MAAM,QAAQ,SAAS,EAAE,EAAE,QAAQ,OAAO,EAAE;AAC5D,MAAI,QAAQ,WAAW,MAAM,GAAG;AAC9B,WAAO,KAAK,QAAQ,MAAM,OAAO,MAAM,CAAC;AAAA,EAC1C;AACA,SAAO,KAAK,OAAO;AACrB;;;ADTA,IAAM,wBAAwB;AAM9B,eAAsB,iBACpB,SAC0B;AAC1B,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe;AAAA,EACjB,IAAI;AAEJ,QAAM,aAAa,oBAAoB,SAAS,SAAS,SAAS;AAClE,QAAM,YAAY,IAAI,IAAI,SAAS,QAAQ,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAEhE,QAAM,YAAiC,CAAC;AACxC,QAAM,UAAkC,CAAC;AACzC,QAAM,YAAsB,CAAC;AAC7B,MAAI,UAAU;AACd,MAAI,UAAU;AAEd,aAAW,MAAM,YAAY;AAC3B,UAAM,QAAQ,UAAU,IAAI,EAAE;AAC9B,QAAI,CAAC,MAAO;AAIZ,QAAI,MAAM,cAAc;AACtB,iBAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,MAAM,YAAY,GAAG;AAC9D,gBAAQ,IAAI,IAAI;AAAA,MAClB;AAAA,IACF;AAEA,eAAW,QAAQ,MAAM,OAAO;AAC9B,YAAM,YAAY,kBAAkB,aAAa,SAAS,OAAO,IAAI;AACrE,YAAM,SAAS,MAAM,WAAW,SAAS;AAEzC,UACE,UACA,iBACC,MAAM,kBAAkB,cAAc,UACvC;AACA,eAAO,KAAK,4BAA4B,IAAI,aAAa,SAAS,CAAC,EAAE;AACrE;AACA;AAAA,MACF;AAEA,YAAM,YAAiB,eAAQ,aAAa,KAAK,MAAM;AACvD,YAAM,MAAM,MAAS,cAAS,WAAW,OAAO;AAChD,YAAM,cAAc,eAAe,KAAK,OAAO;AAC/C,YAAM,cAAc,WAAW,WAAW;AAC1C;AACA,aAAO,KAAK,YAAY,IAAI,aAAa,SAAS,CAAC,EAAE;AAErD,gBAAU,KAAK;AAAA,QACb,IAAI,GAAG,MAAM,EAAE,IAAI,KAAK,UAAU;AAAA,QAClC,QAAQ;AAAA,QACR,MAAM,YAAY,WAAW;AAAA,QAC7B,UAAU,MAAM,kBAAkB;AAAA,MACpC,CAAC;AAAA,IACH;AAGA,QAAI,MAAM,MAAM;AACd,YAAM,gBAAqB,eAAQ,aAAa,MAAM,IAAI;AAC1D,YAAM,cAAc,MAAS,cAAS,eAAe,OAAO;AAC5D,YAAM,gBAAqB;AAAA,QACzB;AAAA,QACA;AAAA,QACA,GAAG,MAAM,EAAE;AAAA,MACb;AACA,YAAM,cAAc,eAAe,WAAW;AAC9C,gBAAU,KAAK,aAAa;AAC5B,gBAAU,KAAK;AAAA,QACb,IAAI,GAAG,MAAM,EAAE;AAAA,QACf,QAAQ;AAAA,QACR,MAAM,YAAY,WAAW;AAAA,QAC7B,UAAU;AAAA,MACZ,CAAC;AACD,aAAO,KAAK,YAAY,IAAI,aAAa,aAAa,CAAC,EAAE;AAAA,IAC3D;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,iBAAiB;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,kBACP,aACA,SACA,OACA,MACQ;AACR,QAAM,WAAW,QAAQ,KAAK,WAA8B;AAC5D,MAAI,CAAC,UAAU;AACb,UAAM,IAAI;AAAA,MACR,UAAU,MAAM,EAAE,qBAAqB,KAAK,WAAW;AAAA,IACzD;AAAA,EACF;AACA,SAAY,YAAK,aAAa,UAAU,KAAK,UAAU;AACzD;AAEA,SAAS,IAAI,aAAqB,KAAqB;AACrD,SAAY,gBAAS,aAAa,GAAG;AACvC;;;AEnJA,IAAM,qBAAqB;AAmC3B,eAAsB,SACpB,SACyB;AACzB,QAAM,EAAE,aAAa,KAAK,UAAU,IAAI;AACxC,QAAM,cAAc,QAAQ,eAAe;AAE3C,MAAI,IAAI,WAAW,GAAG;AACpB,UAAM,IAAI,MAAM,yCAAyC;AAAA,EAC3D;AAEA,QAAM,SAAS,MAAM,kBAAkB,WAAW;AAClD,QAAM,QAAQ,QAAQ,UAAU;AAChC,MAAI,CAAC,UAAU,CAAC,OAAO,SAAS;AAC9B,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,EAAE,UAAU,YAAY,IAAI,MAAM,WAAW,WAAW;AAE9D,QAAM,WAAW,IAAI,IAAI,SAAS,QAAQ,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAC1D,QAAM,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;AACpD,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,IAAI;AAAA,MACR,wBAAwB,QACrB,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EACnB,KAAK,IAAI,CAAC;AAAA,IACf;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,iBAAiB;AAAA,IACpC;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,MAAM;AAAA,IACf,WAAW;AAAA,IACX,cAAc,CAAC;AAAA,EACjB,CAAC;AAED,QAAM,YAAgC,MAAM;AAAA,IAC1C;AAAA,EACF,KAAM,EAAE,eAAe,GAAG,WAAW,CAAC,EAAE;AAExC,QAAM,MAAM,UAAU,UAAU,UAAU,CAAC,MAAM,EAAE,YAAY,WAAW;AAC1E,QAAM,QAAQ,OAAO,IAAI,UAAU,UAAU,GAAG,IAAI;AACpD,QAAM,kBAAkB;AAAA,IACtB,OAAO,aAAa,CAAC;AAAA,IACrB,OAAO;AAAA,EACT;AAEA,QAAM,QAAQ;AAAA,IACZ,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS,SAAS;AAAA,IAClB,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,WAAW;AAAA,EACb;AACA,MAAI,OAAO,EAAG,WAAU,UAAU,GAAG,IAAI;AAAA,MACpC,WAAU,UAAU,KAAK,KAAK;AACnC,QAAM,uBAAuB,aAAa,SAAS;AAEnD,MAAI,MAAM,YAAY,SAAS,SAAS;AACtC,UAAM,UAAU,SAAS;AACzB,UAAM,mBAAmB,aAAa,MAAM;AAAA,EAC9C;AAEA,SAAO;AAAA,IACL;AAAA,IACA,YAAY,OAAO;AAAA,IACnB,SAAS,OAAO;AAAA,IAChB,SAAS,OAAO;AAAA,IAChB,WAAW,OAAO;AAAA,IAClB,iBAAiB,OAAO;AAAA,IACxB,WAAW,OAAO;AAAA,EACpB;AACF;AAEA,SAAS,eAAyC,OAAY,MAAgB;AAC5E,QAAM,SAAS,oBAAI,IAAe;AAClC,aAAW,KAAK,MAAO,QAAO,IAAI,EAAE,IAAI,CAAC;AACzC,aAAW,KAAK,KAAM,QAAO,IAAI,EAAE,IAAI,CAAC;AACxC,SAAO,MAAM,KAAK,OAAO,OAAO,CAAC;AACnC;;;AJ7HO,IAAMC,cAAa,IAAIC,UAAQ,KAAK,EACxC;AAAA,EACC;AACF,EACC,SAAS,YAAY,qDAAiC,EACtD,OAAO,eAAe,sHAA4B,EAClD,OAAO,OAAO,KAAe,SAAkC;AAC9D,MAAI;AACF,UAAM,MAAM,UAAU;AACtB,UAAM,cAAc,IAAI,eAAe;AAEvC,WAAO,KAAK,uBAAuB,IAAI,KAAK,IAAI,CAAC,EAAE;AAEnD,UAAM,SAAS,MAAM,SAAS;AAAA,MAC5B;AAAA,MACA;AAAA,MACA,WAAW,KAAK;AAAA,IAClB,CAAC;AAED,WAAO;AAAA,MACL,oBAAoB,OAAO,OAAO,aAAa,OAAO,OAAO,aAAa,OAAO,UAAU,MAAM;AAAA,IACnG;AACA,WAAO,KAAK,EAAE;AACd,WAAO,KAAK,mBAAmB,OAAO,WAAW,KAAK,UAAK,CAAC,EAAE;AAE9D,UAAM,UAAU,OAAO,QAAQ,OAAO,eAAe;AACrD,QAAI,QAAQ,SAAS,GAAG;AACtB,aAAO,KAAK,EAAE;AACd,aAAO,KAAK,2CAA2C;AACvD,YAAM,aAAa,QAChB,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,GAAG,IAAI,IAAI,KAAK,EAAE,EACzC,KAAK,GAAG;AACX,aAAO,KAAK,cAAc,UAAU,EAAE;AACtC,aAAO,KAAK,uBAAuB,UAAU,EAAE;AAAA,IACjD;AAEA,QAAI,OAAO,UAAU,SAAS,GAAG;AAC/B,aAAO,KAAK,EAAE;AACd,aAAO;AAAA,QACL;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,UAAM,UAAW,IAAc;AAG/B,QAAI,QAAQ,WAAW,oBAAoB,GAAG;AAC5C,aAAO,MAAM,yDAAyD;AAAA,IACxE,OAAO;AACL,aAAO,MAAM,6BAA6B,OAAO,EAAE;AAAA,IACrD;AACA,WAAO,MAAO,IAAc,SAAS,EAAE;AACvC,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;;;AK3DH,SAAS,WAAAC,iBAAe;;;ACIxB,IAAMC,sBAAqB;AAiC3B,eAAsB,UACpB,SAC0B;AAC1B,QAAM,EAAE,aAAa,cAAc,IAAI;AACvC,QAAM,cAAc,QAAQ,eAAeA;AAE3C,QAAM,EAAE,SAAS,IAAI,MAAM,WAAW,WAAW;AACjD,QAAM,oBAAoB,MAAM,sBAAsB,WAAW;AAEjE,QAAM,eAAe,oBAAI,IAAY;AACrC,QAAM,QAAQ,mBAAmB,UAAU;AAAA,IACzC,CAAC,MAAM,EAAE,YAAY;AAAA,EACvB;AACA,aAAW,KAAK,OAAO,aAAa,CAAC,GAAG;AACtC,UAAM,QAAQ,EAAE,GAAG,QAAQ,GAAG;AAC9B,iBAAa,IAAI,SAAS,IAAI,EAAE,GAAG,MAAM,GAAG,KAAK,IAAI,EAAE,EAAE;AAAA,EAC3D;AAEA,QAAM,UAA6B,SAAS,QACzC,OAAO,CAAC,MAAM,CAAC,iBAAiB,aAAa,IAAI,EAAE,EAAE,CAAC,EACtD,IAAI,CAAC,OAAO;AAAA,IACX,IAAI,EAAE;AAAA,IACN,MAAM,EAAE;AAAA,IACR,aAAa,EAAE;AAAA,IACf,WAAW,aAAa,IAAI,EAAE,EAAE;AAAA,EAClC,EAAE;AAEJ,SAAO;AAAA,IACL;AAAA,IACA,OAAO,SAAS,QAAQ;AAAA,IACxB,gBAAgB,aAAa;AAAA,IAC7B;AAAA,EACF;AACF;;;ADjEO,IAAMC,eAAc,IAAIC,UAAQ,MAAM,EAC1C,YAAY,2FAAoC,EAChD,OAAO,eAAe,kDAAe,EACrC,OAAO,OAAO,SAAkC;AAC/C,MAAI;AACF,UAAM,MAAM,UAAU;AACtB,UAAM,cAAc,IAAI,eAAe;AAEvC,UAAM,EAAE,SAAS,OAAO,eAAe,IAAI,MAAM,UAAU;AAAA,MACzD;AAAA,MACA,eAAe,KAAK;AAAA,IACtB,CAAC;AAED,QAAI,QAAQ,WAAW,GAAG;AACxB,aAAO;AAAA,QACL,KAAK,YACD,6BACA;AAAA,MACN;AACA;AAAA,IACF;AAEA,UAAM,UAAU,KAAK,IAAI,GAAG,QAAQ,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC;AAC9D,UAAM,YAAY,KAAK,IAAI,GAAG,QAAQ,IAAI,CAAC,MAAM,EAAE,KAAK,MAAM,GAAG,CAAC;AAElE,WAAO;AAAA,MACL,GAAG,KAAK,OAAO,OAAO,CAAC,KAAK,OAAO;AAAA,QACjC;AAAA,MACF,CAAC;AAAA,IACH;AACA,WAAO;AAAA,MACL,GAAG,SAAI,OAAO,OAAO,CAAC,KAAK,SAAI;AAAA,QAC7B;AAAA,MACF,CAAC;AAAA,IACH;AAEA,eAAW,KAAK,SAAS;AACvB,YAAM,SAAS,EAAE,YAAY,cAAc;AAC3C,aAAO;AAAA,QACL,GAAG,EAAE,GAAG,OAAO,OAAO,CAAC,KAAK,EAAE,KAAK;AAAA,UACjC;AAAA,QACF,CAAC,KAAK,OAAO,OAAO,CAAC,CAAC,KAAK,EAAE,WAAW;AAAA,MAC1C;AAAA,IACF;AAEA,WAAO,KAAK,EAAE;AACd,WAAO;AAAA,MACL,UAAU,KAAK,QACb,UAAU,IAAI,MAAM,KACtB,KAAK,cAAc;AAAA,IACrB;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,MAAM,8BAA+B,IAAc,OAAO,EAAE;AACnE,WAAO,MAAO,IAAc,SAAS,EAAE;AACvC,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;;;ARxDI,IAAM,YAAY,IAAIC,UAAQ,IAAI,EAAE;AAAA,EACzC;AACF;AAEA,UAAU,WAAWC,YAAW;AAChC,UAAU,WAAWC,WAAU;AAC/B,UAAU,WAAWC,YAAW;;;A3BLhC,IAAMC,WAAUC,eAAc,YAAY,GAAG;AAC7C,IAAM,EAAE,QAAQ,IAAID,SAAQ,iBAAiB;AAE7C,IAAM,UAAU,IAAIE,UAAQ;AAE5B,QACG,KAAK,YAAY,EACjB,YAAY,mDAAoC,EAChD,QAAQ,OAAO;AAElB,QAAQ,WAAW,aAAa;AAChC,QAAQ,WAAW,aAAa;AAChC,QAAQ,WAAW,SAAS;AAE5B,QAAQ,MAAM;","names":["Command","createRequire","Command","os","path","path","require","path","fs","fs","path","rel","fs","path","fs","path","Command","path","fs","Command","Command","Command","version","Command","fs","path","DESIGN_PACKAGE","Command","confirm","Command","Command","Command","prompts","path","fs","createRequire","require","createRequire","resolvePackageRoot","path","fs","replaceManagedRegion","stat","rel","targetFile","exists","escapeRegExp","replaceManagedRegion","Command","Command","listCommand","Command","Command","SKILLS_PACKAGE","FLAT_VARIANT","updateCommand","Command","Command","prompts","SKILLS_PACKAGE","uninstallCommand","Command","confirm","Command","listCommand","updateCommand","uninstallCommand","Command","Command","prompts","initCommand","Command","Command","path","fs","createRequire","require","createRequire","resolvePackageRoot","path","fs","addCommand","Command","Command","DEFAULT_UI_PACKAGE","listCommand","Command","Command","initCommand","addCommand","listCommand","require","createRequire","Command"]}
package/package.json CHANGED
@@ -1,34 +1,49 @@
1
1
  {
2
2
  "name": "teamix-evo",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "AI Coding toolkit for product development - CLI entry point",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "teamix-evo": "./dist/index.js"
8
8
  },
9
+ "main": "./dist/core/index.js",
10
+ "types": "./dist/core/index.d.ts",
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/core/index.d.ts",
14
+ "import": "./dist/core/index.js"
15
+ },
16
+ "./core": {
17
+ "types": "./dist/core/index.d.ts",
18
+ "import": "./dist/core/index.js"
19
+ },
20
+ "./package.json": "./package.json"
21
+ },
9
22
  "files": [
10
23
  "dist"
11
24
  ],
12
- "scripts": {
13
- "build": "tsup",
14
- "dev": "tsup --watch",
15
- "test": "vitest run",
16
- "test:watch": "vitest",
17
- "typecheck": "tsc --noEmit",
18
- "lint": "tsc --noEmit"
19
- },
20
25
  "dependencies": {
21
- "@teamix-evo/design": "workspace:*",
22
- "@teamix-evo/registry": "workspace:*",
23
26
  "commander": "^12.0.0",
24
27
  "@clack/prompts": "^0.8.0",
25
28
  "handlebars": "^4.7.0",
26
- "kolorist": "^1.8.0"
29
+ "kolorist": "^1.8.0",
30
+ "@teamix-evo/registry": "0.2.0",
31
+ "@teamix-evo/design": "0.2.0",
32
+ "@teamix-evo/ui": "0.1.1",
33
+ "@teamix-evo/skills": "0.2.0"
27
34
  },
28
35
  "devDependencies": {
29
36
  "@types/node": "^20.0.0",
30
37
  "tsup": "^8.0.0",
31
38
  "typescript": "^5.5.0",
32
39
  "vitest": "^2.0.0"
40
+ },
41
+ "scripts": {
42
+ "build": "tsup",
43
+ "dev": "tsup --watch",
44
+ "test": "vitest run",
45
+ "test:watch": "vitest",
46
+ "typecheck": "tsc --noEmit",
47
+ "lint": "tsc --noEmit"
33
48
  }
34
- }
49
+ }